src/java.base/share/classes/sun/nio/ch/NativeSocketAddress.java
author alanb
Sat, 30 Nov 2019 16:21:19 +0000
changeset 59329 289000934908
permissions -rw-r--r--
8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation Reviewed-by: dfuchs, chegar
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
59329
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
     1
/*
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
     2
 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
     4
 *
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    10
 *
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    15
 * accompanied this code).
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    16
 *
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    20
 *
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    23
 * questions.
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    24
 */
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    25
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    26
package sun.nio.ch;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    27
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    28
import java.net.Inet6Address;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    29
import java.net.InetAddress;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    30
import java.net.InetSocketAddress;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    31
import java.net.SocketException;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    32
import java.net.UnknownHostException;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    33
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    34
import jdk.internal.misc.Unsafe;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    35
import jdk.internal.util.ArraysSupport;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    36
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    37
/**
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    38
 * A native socket address that is the union of struct sockaddr, struct sockaddr_in,
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    39
 * and struct sockaddr_in6.
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    40
 *
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    41
 * This class is not thread safe.
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    42
 */
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    43
class NativeSocketAddress {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    44
    private static final Unsafe UNSAFE = Unsafe.getUnsafe();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    45
    private static final long ARRAY_BASE_OFFSET = UNSAFE.arrayBaseOffset(byte[].class);
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    46
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    47
    private static final int AF_INET  = AFINET();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    48
    private static final int AF_INET6 = AFINET6();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    49
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    50
    private static final int SIZEOF_SOCKETADDRESS = sizeofSOCKETADDRESS();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    51
    private static final int SIZEOF_FAMILY        = sizeofFamily();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    52
    private static final int OFFSET_FAMILY        = offsetFamily();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    53
    private static final int OFFSET_SIN4_PORT     = offsetSin4Port();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    54
    private static final int OFFSET_SIN4_ADDR     = offsetSin4Addr();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    55
    private static final int OFFSET_SIN6_PORT     = offsetSin6Port();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    56
    private static final int OFFSET_SIN6_ADDR     = offsetSin6Addr();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    57
    private static final int OFFSET_SIN6_SCOPE_ID = offsetSin6ScopeId();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    58
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    59
    // SOCKETADDRESS
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    60
    private final long address;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    61
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    62
    // cached copy of SOCKETADDRESS and the corresponding InetSocketAddress
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    63
    private final long cachedSocketAddress;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    64
    private InetSocketAddress cachedInetSocketAddress;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    65
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    66
    NativeSocketAddress() {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    67
        // allocate 2 * SOCKETADDRESS
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    68
        int size = SIZEOF_SOCKETADDRESS << 1;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    69
        long base = UNSAFE.allocateMemory(size);
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    70
        UNSAFE.setMemory(base, size, (byte) 0);
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    71
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    72
        this.address = base;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    73
        this.cachedSocketAddress = base + SIZEOF_SOCKETADDRESS;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    74
    }
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    75
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    76
    long address() {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    77
        return address;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    78
    }
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    79
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    80
    void free() {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    81
        UNSAFE.freeMemory(address);
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    82
    }
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    83
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    84
    /**
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    85
     * Return an InetSocketAddress to represent the socket address in this buffer.
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    86
     * @throws SocketException if the socket address is not AF_INET or AF_INET6
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    87
     */
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    88
    InetSocketAddress toInetSocketAddress() throws SocketException {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    89
        // return cached InetSocketAddress if the SOCKETADDRESS bytes match
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    90
        if (cachedInetSocketAddress != null && mismatch() < 0) {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    91
            return cachedInetSocketAddress;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    92
        }
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    93
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    94
        // decode SOCKETADDRESS to InetSocketAddress
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    95
        int family = family();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    96
        if (family != AF_INET && family != AF_INET6)
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    97
            throw new SocketException("Socket family not recognized");
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    98
        var isa = new InetSocketAddress(address(family), port(family));
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
    99
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   100
        // copy SOCKETADDRESS and InetSocketAddress
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   101
        UNSAFE.copyMemory(null, address, null, cachedSocketAddress, SIZEOF_SOCKETADDRESS);
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   102
        this.cachedInetSocketAddress = isa;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   103
        return isa;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   104
    }
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   105
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   106
    /**
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   107
     * Find a mismatch between the SOCKETADDRESS structures stored at address
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   108
     * and cachedSocketAddress.
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   109
     * @return the byte offset of the first mismatch or -1 if no mismatch
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   110
     */
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   111
    private int mismatch() {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   112
        int i = ArraysSupport.vectorizedMismatch(null,
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   113
                address,
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   114
                null,
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   115
                cachedSocketAddress,
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   116
                SIZEOF_SOCKETADDRESS,
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   117
                ArraysSupport.LOG2_ARRAY_BYTE_INDEX_SCALE);
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   118
        if (i >= 0)
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   119
            return i;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   120
        i = SIZEOF_SOCKETADDRESS - ~i;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   121
        for (; i < SIZEOF_SOCKETADDRESS; i++) {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   122
            if (UNSAFE.getByte(address + i) != UNSAFE.getByte(cachedSocketAddress + i)) {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   123
                return i;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   124
            }
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   125
        }
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   126
        return -1;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   127
    }
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   128
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   129
    @Override
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   130
    public String toString() {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   131
        int family = family();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   132
        if (family == AF_INET || family == AF_INET6) {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   133
            return ((family == AF_INET) ? "AF_INET" : "AF_INET6")
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   134
                    + ", address=" + address(family) + ", port=" + port(family);
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   135
        } else {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   136
            return "<unknown>";
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   137
        }
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   138
    }
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   139
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   140
    /**
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   141
     * Return the value of the sa_family field.
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   142
     */
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   143
    private int family() {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   144
        if (SIZEOF_FAMILY == 1) {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   145
            return UNSAFE.getByte(address + OFFSET_FAMILY);
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   146
        } else if (SIZEOF_FAMILY == 2) {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   147
            return UNSAFE.getShort(address + OFFSET_FAMILY);
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   148
        } else {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   149
            throw new InternalError();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   150
        }
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   151
    }
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   152
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   153
    /**
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   154
     * Return the value of the sin4_port or sin6_port field. These fields are
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   155
     * stored in network order.
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   156
     */
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   157
    private int port(int family) {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   158
        byte b1, b2;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   159
        if (family == AF_INET) {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   160
            b1 = UNSAFE.getByte(address + OFFSET_SIN4_PORT);
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   161
            b2 = UNSAFE.getByte(address + OFFSET_SIN4_PORT + 1);
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   162
        } else {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   163
            b1 = UNSAFE.getByte(address + OFFSET_SIN6_PORT);
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   164
            b2 = UNSAFE.getByte(address + OFFSET_SIN6_PORT + 1);
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   165
        }
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   166
        return (Byte.toUnsignedInt(b1) << 8) + Byte.toUnsignedInt(b2);
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   167
    }
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   168
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   169
    /**
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   170
     * Return an InetAddress to represent the value of the address in the
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   171
     * sin4_addr or sin6_addr fields.
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   172
     */
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   173
    private InetAddress address(int family) {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   174
        int len;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   175
        int offset;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   176
        int scope_id;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   177
        if (family == AF_INET) {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   178
            len = 4;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   179
            offset = OFFSET_SIN4_ADDR;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   180
            scope_id = 0;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   181
        } else {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   182
            len = 16;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   183
            offset = OFFSET_SIN6_ADDR;
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   184
            scope_id = UNSAFE.getInt(address + OFFSET_SIN6_SCOPE_ID);
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   185
        }
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   186
        byte[] bytes = new byte[len];
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   187
        UNSAFE.copyMemory(null, address + offset, bytes, ARRAY_BASE_OFFSET, len);
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   188
        try {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   189
            if (scope_id == 0) {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   190
                return InetAddress.getByAddress(bytes);
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   191
            } else {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   192
                return Inet6Address.getByAddress(null, bytes, scope_id);
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   193
            }
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   194
        } catch (UnknownHostException e) {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   195
            throw new InternalError(e);
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   196
        }
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   197
    }
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   198
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   199
    private static native int AFINET();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   200
    private static native int AFINET6();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   201
    private static native int sizeofSOCKETADDRESS();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   202
    private static native int sizeofFamily();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   203
    private static native int offsetFamily();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   204
    private static native int offsetSin4Port();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   205
    private static native int offsetSin4Addr();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   206
    private static native int offsetSin6Port();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   207
    private static native int offsetSin6Addr();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   208
    private static native int offsetSin6ScopeId();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   209
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   210
    static {
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   211
        IOUtil.load();
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   212
    }
289000934908 8234805: (dc) Remove JNI upcall from DatagramChannel.receive implementation
alanb
parents:
diff changeset
   213
}