1 /* 2 * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 #ifndef NET_UTILS_MD_H 27 #define NET_UTILS_MD_H 28 29 #include <sys/socket.h> 30 #include <sys/types.h> 31 #include <netdb.h> 32 #include <netinet/in.h> 33 #include <unistd.h> 34 35 #ifndef USE_SELECT 36 #include <sys/poll.h> 37 #endif 38 39 40 /* 41 AIX needs a workaround for I/O cancellation, see: 42 http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/close.htm 43 ... 44 The close subroutine is blocked until all subroutines which use the file 45 descriptor return to usr space. For example, when a thread is calling close 46 and another thread is calling select with the same file descriptor, the 47 close subroutine does not return until the select call returns. 48 ... 49 */ 50 #if !defined(__solaris__) 51 extern int NET_Timeout(int s, long timeout); 52 extern int NET_Timeout0(int s, long timeout, long currentTime); 53 extern int NET_Read(int s, void* buf, size_t len); 54 extern int NET_NonBlockingRead(int s, void* buf, size_t len); 55 extern int NET_TimeoutWithCurrentTime(int s, long timeout, long currentTime); 56 extern long NET_GetCurrentTime(); 57 extern int NET_RecvFrom(int s, void *buf, int len, unsigned int flags, 58 struct sockaddr *from, int *fromlen); 59 extern int NET_ReadV(int s, const struct iovec * vector, int count); 60 extern int NET_Send(int s, void *msg, int len, unsigned int flags); 61 extern int NET_SendTo(int s, const void *msg, int len, unsigned int 62 flags, const struct sockaddr *to, int tolen); 63 extern int NET_Writev(int s, const struct iovec * vector, int count); 64 extern int NET_Connect(int s, struct sockaddr *addr, int addrlen); 65 extern int NET_Accept(int s, struct sockaddr *addr, int *addrlen); 66 extern int NET_SocketClose(int s); 67 extern int NET_Dup2(int oldfd, int newfd); 68 69 #ifdef USE_SELECT 70 extern int NET_Select(int s, fd_set *readfds, fd_set *writefds, 71 fd_set *exceptfds, struct timeval *timeout); 72 #else 73 extern int NET_Poll(struct pollfd *ufds, unsigned int nfds, int timeout); 74 #endif 75 76 #else 77 78 #define NET_Timeout JVM_Timeout 79 #define NET_Read JVM_Read 80 #define NET_RecvFrom JVM_RecvFrom 81 #define NET_ReadV readv 82 #define NET_Send JVM_Send 83 #define NET_SendTo JVM_SendTo 84 #define NET_WriteV writev 85 #define NET_Connect JVM_Connect 86 #define NET_Accept JVM_Accept 87 #define NET_SocketClose JVM_SocketClose 88 #define NET_Dup2 dup2 89 #define NET_Select select 90 #define NET_Poll poll 91 92 #endif 93 94 #if defined(__linux__) && defined(AF_INET6) 95 int getDefaultIPv6Interface(struct in6_addr *target_addr); 96 #endif 97 98 #ifdef __solaris__ 99 extern int net_getParam(char *driver, char *param); 100 101 #ifndef SO_FLOW_SLA 102 #define SO_FLOW_SLA 0x1018 103 104 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 105 #pragma pack(4) 106 #endif 107 108 /* 109 * Used with the setsockopt(SO_FLOW_SLA, ...) call to set 110 * per socket service level properties. 111 * When the application uses per-socket API, we will enforce the properties 112 * on both outbound and inbound packets. 113 * 114 * For now, only priority and maxbw are supported in SOCK_FLOW_PROP_VERSION1. 115 */ 116 typedef struct sock_flow_props_s { 117 int sfp_version; 118 uint32_t sfp_mask; 119 int sfp_priority; /* flow priority */ 120 uint64_t sfp_maxbw; /* bandwidth limit in bps */ 121 int sfp_status; /* flow create status for getsockopt */ 122 } sock_flow_props_t; 123 124 #define SOCK_FLOW_PROP_VERSION1 1 125 126 /* bit mask values for sfp_mask */ 127 #define SFP_MAXBW 0x00000001 /* Flow Bandwidth Limit */ 128 #define SFP_PRIORITY 0x00000008 /* Flow priority */ 129 130 /* possible values for sfp_priority */ 131 #define SFP_PRIO_NORMAL 1 132 #define SFP_PRIO_HIGH 2 133 134 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 135 #pragma pack() 136 #endif /* _LONG_LONG_ALIGNMENT */ 137 138 #endif /* SO_FLOW_SLA */ 139 #endif /* __solaris__ */ 140 141 void ThrowUnknownHostExceptionWithGaiError(JNIEnv *env, 142 const char* hostname, 143 int gai_error); 144 145 #define NET_WAIT_READ 0x01 146 #define NET_WAIT_WRITE 0x02 147 #define NET_WAIT_CONNECT 0x04 148 149 extern jint NET_Wait(JNIEnv *env, jint fd, jint flags, jint timeout); 150 151 /************************************************************************ 152 * Macros and constants 153 */ 154 155 /* 156 * On 64-bit JDKs we use a much larger stack and heap buffer. 157 */ 158 #ifdef _LP64 159 #define MAX_BUFFER_LEN 65536 160 #define MAX_HEAP_BUFFER_LEN 131072 161 #else 162 #define MAX_BUFFER_LEN 8192 163 #define MAX_HEAP_BUFFER_LEN 65536 164 #endif 165 166 #ifdef AF_INET6 167 168 #define SOCKADDR union { \ 169 struct sockaddr_in him4; \ 170 struct sockaddr_in6 him6; \ 171 } 172 173 #define SOCKADDR_LEN (ipv6_available() ? sizeof(SOCKADDR) : \ 174 sizeof(struct sockaddr_in)) 175 176 #else 177 178 #define SOCKADDR union { struct sockaddr_in him4; } 179 #define SOCKADDR_LEN sizeof(SOCKADDR) 180 181 #endif 182 183 /************************************************************************ 184 * Utilities 185 */ 186 #ifdef __linux__ 187 extern int kernelIsV24(); 188 #endif 189 190 void NET_ThrowByNameWithLastError(JNIEnv *env, const char *name, 191 const char *defaultDetail); 192 193 194 #endif /* NET_UTILS_MD_H */ 195