151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*
251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it
651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as
751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation.  Oracle designates this
851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided
951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code.
1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT
1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that
1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code).
1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version
1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation,
1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any
2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions.
2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#ifndef NET_UTILS_H
2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#define NET_UTILS_H
2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include "jvm.h"
3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include "jni_util.h"
3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include "net_util_md.h"
3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/************************************************************************
3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Macros and misc constants
3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#define MAX_PACKET_LEN 65536
3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3938015e84ecc9ce8b0e0014276c6eb04c7d756c44Przemyslaw Szczepaniak#define IPv4 AF_INET
4038015e84ecc9ce8b0e0014276c6eb04c7d756c44Przemyslaw Szczepaniak#define IPv6 AF_INET6
4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#define NET_ERROR(env, ex, msg) \
43e573e88e89daf5efb323719c54117c5a423eb245Yi Kong{ if (!(*env)->ExceptionOccurred(env)) JNU_ThrowByName(env, ex, msg); }
4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/************************************************************************
4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Cached field IDs
4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The naming convention for field IDs is
4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *      <class abbrv>_<fieldName>ID
5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * i.e. psi_timeoutID is PlainSocketImpl's timeout field's ID.
5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jclass ia_class;
5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jfieldID iac_addressID;
5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jfieldID iac_familyID;
5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jfieldID iac_hostNameID;
5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jfieldID ia_preferIPv6AddressID;
5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
5862e0b4793b755083e94aac458111ca347314adddYi Kong/** (Inet6Address accessors)
5962e0b4793b755083e94aac458111ca347314adddYi Kong * set_ methods return JNI_TRUE on success JNI_FALSE on error
6062e0b4793b755083e94aac458111ca347314adddYi Kong * get_ methods that return int/boolean, return -1 on error
6162e0b4793b755083e94aac458111ca347314adddYi Kong * get_ methods that return objects return NULL on error.
6262e0b4793b755083e94aac458111ca347314adddYi Kong */
6362e0b4793b755083e94aac458111ca347314adddYi Kongextern jobject getInet6Address_scopeifname(JNIEnv *env, jobject ia6Obj);
6462e0b4793b755083e94aac458111ca347314adddYi Kongextern int setInet6Address_scopeifname(JNIEnv *env, jobject ia6Obj, jobject scopeifname);
6562e0b4793b755083e94aac458111ca347314adddYi Kongextern int getInet6Address_scopeid_set(JNIEnv *env, jobject ia6Obj);
6662e0b4793b755083e94aac458111ca347314adddYi Kongextern int getInet6Address_scopeid(JNIEnv *env, jobject ia6Obj);
6762e0b4793b755083e94aac458111ca347314adddYi Kongextern int setInet6Address_scopeid(JNIEnv *env, jobject ia6Obj, int scopeid);
6862e0b4793b755083e94aac458111ca347314adddYi Kongextern int getInet6Address_ipaddress(JNIEnv *env, jobject ia6Obj, char *dest);
6962e0b4793b755083e94aac458111ca347314adddYi Kongextern int setInet6Address_ipaddress(JNIEnv *env, jobject ia6Obj, char *address);
7062e0b4793b755083e94aac458111ca347314adddYi Kong
7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern void setInetAddress_addr(JNIEnv *env, jobject iaObj, int address);
7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern void setInetAddress_family(JNIEnv *env, jobject iaObj, int family);
7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern void setInetAddress_hostName(JNIEnv *env, jobject iaObj, jobject h);
7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern int getInetAddress_addr(JNIEnv *env, jobject iaObj);
7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern int getInetAddress_family(JNIEnv *env, jobject iaObj);
7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jobject getInetAddress_hostName(JNIEnv *env, jobject iaObj);
7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jclass ia4_class;
7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jmethodID ia4_ctrID;
8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* NetworkInterface fields */
8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jclass ni_class;
8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jfieldID ni_nameID;
8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jfieldID ni_indexID;
8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jfieldID ni_addrsID;
8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jfieldID ni_descID;
8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jmethodID ni_ctrID;
8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* PlainSocketImpl fields */
9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jfieldID psi_timeoutID;
9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jfieldID psi_fdID;
9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jfieldID psi_addressID;
9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jfieldID psi_portID;
9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jfieldID psi_localportID;
9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
96ba17b532f644b7caed6d08671d492edfee8b6f37Yi Kong/* Android-removed: DatagramSocket moved away from JNI */
97ba17b532f644b7caed6d08671d492edfee8b6f37Yi Kong#if 0
9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* DatagramPacket fields */
9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jfieldID dp_addressID;
10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jfieldID dp_portID;
10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jfieldID dp_bufID;
10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jfieldID dp_offsetID;
10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jfieldID dp_lengthID;
10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jfieldID dp_bufLengthID;
105ba17b532f644b7caed6d08671d492edfee8b6f37Yi Kong#endif
10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* Inet6Address fields */
10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jclass ia6_class;
10962e0b4793b755083e94aac458111ca347314adddYi Kongextern jfieldID ia6_holder6ID;
11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jfieldID ia6_ipaddressID;
11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jfieldID ia6_scopeidID;
11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jfieldID ia6_scopeidsetID;
11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jfieldID ia6_scopeifnameID;
11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiextern jmethodID ia6_ctrID;
11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/************************************************************************
11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *  Utilities
11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiJNIEXPORT void JNICALL NET_ThrowNew(JNIEnv *env, int errorNum, char *msg);
12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiint NET_GetError();
12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskivoid NET_ThrowCurrent(JNIEnv *env, char *msg);
12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskijfieldID NET_GetFileDescriptorID(JNIEnv *env);
12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiJNIEXPORT jint JNICALL ipv6_available();
12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskivoid
13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiNET_AllocSockaddr(struct sockaddr **him, int *len);
13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiJNIEXPORT int JNICALL
13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiNET_InetAddressToSockaddr(JNIEnv *env, jobject iaObj, int port, struct sockaddr *him, int *len, jboolean v4MappedAddress);
13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiJNIEXPORT jobject JNICALL
13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiNET_SockaddrToInetAddress(JNIEnv *env, struct sockaddr *him, int *port);
13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskivoid initLocalAddrTable ();
13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskivoid parseExclusiveBindProperty(JNIEnv *env);
14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskivoid
14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiNET_SetTrafficClass(struct sockaddr *him, int trafficClass);
14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiJNIEXPORT jint JNICALL
14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiNET_GetPortFromSockaddr(struct sockaddr *him);
14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiJNIEXPORT jint JNICALL
14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiNET_SockaddrEqualsInetAddress(JNIEnv *env,struct sockaddr *him, jobject iaObj);
14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiint
15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiNET_IsIPv4Mapped(jbyte* caddr);
15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiint
15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiNET_IPv4MappedToIPv4(jbyte* caddr);
15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiint
15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiNET_IsEqual(jbyte* caddr1, jbyte* caddr2);
15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiint
16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiNET_IsZeroAddr(jbyte* caddr);
16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* Socket operations
16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * These work just like the JVM_* procedures, except that they may do some
16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * platform-specific pre/post processing of the arguments and/or results.
16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiJNIEXPORT int JNICALL
16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiNET_GetSockOpt(int fd, int level, int opt, void *result, int *len);
17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiJNIEXPORT int JNICALL
17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiNET_SetSockOpt(int fd, int level, int opt, const void *arg, int len);
17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiJNIEXPORT int JNICALL
17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiNET_Bind(int fd, struct sockaddr *him, int len);
17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiJNIEXPORT int JNICALL
17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiNET_MapSocketOption(jint cmd, int *level, int *optname);
17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiJNIEXPORT int JNICALL
18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiNET_MapSocketOptionV6(jint cmd, int *level, int *optname);
18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiint getScopeID (struct sockaddr *);
18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiint cmpScopeID (unsigned int, struct sockaddr *);
18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiunsigned short in_cksum(unsigned short *addr, int len);
18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#endif /* NET_UTILS_H */
189