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