Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/ipv6/src/external/enet/patches/0003-using-address-family-in-functions.patch @ 7390

Last change on this file since 7390 was 7390, checked in by adrfried, 15 years ago

IPv6 for Windows

I have not tested this, please test this and report issues to me.

File size: 11.8 KB
RevLine 
[7390]1From b26e4ef3fa9c0139fc2ec086d2243b809365d683 Mon Sep 17 00:00:00 2001
[7378]2From: Adrian Friedli <adi@koalatux.ch>
3Date: Mon, 6 Sep 2010 14:58:50 +0200
[7390]4Subject: [PATCH 3/5] using address family in functions
[7378]5
6---
7 host.c              |    4 +-
8 include/enet/enet.h |   22 +++++++++---
9 protocol.c          |    5 ++-
[7390]10 unix.c              |   86 ++++++++++++++++++++++++++++++++------------------
11 4 files changed, 76 insertions(+), 41 deletions(-)
[7378]12
13diff --git a/host.c b/host.c
14index 8bb2433..9ccf894 100644
15--- a/host.c
16+++ b/host.c
17@@ -48,8 +48,8 @@ enet_host_create (const ENetAddress * address, size_t peerCount, size_t channelL
18     }
19     memset (host -> peers, 0, peerCount * sizeof (ENetPeer));
20 
21-    host -> socket = enet_socket_create (ENET_SOCKET_TYPE_DATAGRAM);
22-    if (host -> socket == ENET_SOCKET_NULL || (address != NULL && enet_socket_bind (host -> socket, address) < 0))
23+    host -> socket = enet_socket_create (ENET_SOCKET_TYPE_DATAGRAM, ENET_IPV6);
24+    if (host -> socket == ENET_SOCKET_NULL || (address != NULL && enet_socket_bind (host -> socket, address, ENET_IPV6) < 0))
25     {
26        if (host -> socket != ENET_SOCKET_NULL)
27          enet_socket_destroy (host -> socket);
28diff --git a/include/enet/enet.h b/include/enet/enet.h
[7389]29index d3ca971..7f5876f 100644
[7378]30--- a/include/enet/enet.h
31+++ b/include/enet/enet.h
32@@ -82,6 +82,16 @@ typedef struct _ENetAddress
33 } ENetAddress;
34 
35 /**
36+ * The address family type.
37+ */
38+typedef enum _ENetAddressFamily
39+{
40+    ENET_NO_ADDRESS_FAMILY = 0,
[7389]41+    ENET_IPV4 = (1 << 0),
42+    ENET_IPV6 = (1 << 1)
[7378]43+} ENetAddressFamily;
44+
45+/**
46  * Packet flag bit constants.
47  *
48  * The host must be specified in network byte-order, and the port must be in
49@@ -445,13 +455,13 @@ ENET_API void enet_time_set (enet_uint32);
50 /** @defgroup socket ENet socket functions
51     @{
52 */
53-ENET_API ENetSocket enet_socket_create (ENetSocketType);
54-ENET_API int        enet_socket_bind (ENetSocket, const ENetAddress *);
55+ENET_API ENetSocket enet_socket_create (ENetSocketType, ENetAddressFamily);
56+ENET_API int        enet_socket_bind (ENetSocket, const ENetAddress *, ENetAddressFamily);
57 ENET_API int        enet_socket_listen (ENetSocket, int);
58-ENET_API ENetSocket enet_socket_accept (ENetSocket, ENetAddress *);
59-ENET_API int        enet_socket_connect (ENetSocket, const ENetAddress *);
60-ENET_API int        enet_socket_send (ENetSocket, const ENetAddress *, const ENetBuffer *, size_t);
61-ENET_API int        enet_socket_receive (ENetSocket, ENetAddress *, ENetBuffer *, size_t);
62+ENET_API ENetSocket enet_socket_accept (ENetSocket, ENetAddress *, ENetAddressFamily);
63+ENET_API int        enet_socket_connect (ENetSocket, const ENetAddress *, ENetAddressFamily);
64+ENET_API int        enet_socket_send (ENetSocket, const ENetAddress *, const ENetBuffer *, size_t, ENetAddressFamily);
65+ENET_API int        enet_socket_receive (ENetSocket, ENetAddress *, ENetBuffer *, size_t, ENetAddressFamily);
66 ENET_API int        enet_socket_wait (ENetSocket, enet_uint32 *, enet_uint32);
67 ENET_API int        enet_socket_set_option (ENetSocket, ENetSocketOption, int);
68 ENET_API void       enet_socket_destroy (ENetSocket);
69diff --git a/protocol.c b/protocol.c
70index 930835e..4c4850a 100644
71--- a/protocol.c
72+++ b/protocol.c
73@@ -1046,7 +1046,8 @@ enet_protocol_receive_incoming_commands (ENetHost * host, ENetEvent * event)
74        receivedLength = enet_socket_receive (host -> socket,
75                                              & host -> receivedAddress,
76                                              & buffer,
77-                                             1);
78+                                             1,
79+                                             ENET_IPV6);
80 
81        if (receivedLength < 0)
82          return -1;
83@@ -1509,7 +1510,7 @@ enet_protocol_send_outgoing_commands (ENetHost * host, ENetEvent * event, int ch
84 
85         currentPeer -> lastSendTime = host -> serviceTime;
86 
87-        sentLength = enet_socket_send (host -> socket, & currentPeer -> address, host -> buffers, host -> bufferCount);
88+        sentLength = enet_socket_send (host -> socket, & currentPeer -> address, host -> buffers, host -> bufferCount, ENET_IPV6);
89 
90         enet_protocol_remove_sent_unreliable_commands (currentPeer);
91 
92diff --git a/unix.c b/unix.c
[7390]93index de032bb..475c6e3 100644
[7378]94--- a/unix.c
95+++ b/unix.c
[7390]96@@ -71,7 +71,27 @@ enet_time_set (enet_uint32 newTimeBase)
[7378]97     timeBase = timeVal.tv_sec * 1000 + timeVal.tv_usec / 1000 - newTimeBase;
98 }
99 
100-static int
101+static enet_uint16
102+enet_af (ENetAddressFamily family)
103+{
104+    if (family == ENET_IPV4)
105+        return AF_INET;
106+    if (family == ENET_IPV6)
107+        return AF_INET6;
108+    return 0;
109+}
110+
111+static socklen_t
112+enet_sa_size (ENetAddressFamily family)
113+{
114+    if (family == ENET_IPV4)
115+        return sizeof (struct sockaddr_in);
116+    if (family == ENET_IPV6)
117+        return sizeof (struct sockaddr_in6);
118+    return 0;
119+}
120+
121+static ENetAddressFamily
122 enet_address_set_address (ENetAddress * address, const struct sockaddr * sin)
123 {
124     memset (address, 0, sizeof (ENetAddress));
[7390]125@@ -80,32 +100,31 @@ enet_address_set_address (ENetAddress * address, const struct sockaddr * sin)
[7378]126         address -> host = enet_address_map4 ((((struct sockaddr_in *) sin) -> sin_addr.s_addr));
127         //address -> scopeID = 0;
128         address -> port = ENET_NET_TO_HOST_16 (((struct sockaddr_in *) sin) -> sin_port);
129-        return 0;
130+        return ENET_IPV4;
131     }
132     if (sin -> sa_family == AF_INET6)
133     {
134         address -> host = * (ENetHostAddress *) & ((struct sockaddr_in6 *) sin) -> sin6_addr;
135         address -> scopeID = ((struct sockaddr_in6 *) sin) -> sin6_scope_id;
136         address -> port = ENET_NET_TO_HOST_16 (((struct sockaddr_in6 *) sin) -> sin6_port);
137-        return 0;
138+        return ENET_IPV6;
139     }
140-    return -1;
141+    return ENET_NO_ADDRESS_FAMILY;
142 }
143 
144 static int
145-enet_address_set_sin (struct sockaddr * sin, const ENetAddress * address, sa_family_t family)
146+enet_address_set_sin (struct sockaddr * sin, const ENetAddress * address, ENetAddressFamily family)
147 {
148-    if (family == AF_INET)
149+    memset (sin, 0, enet_sa_size(family));
150+    if (family == ENET_IPV4)
151     {
152-        memset (sin, 0, sizeof (struct sockaddr_in));
153         ((struct sockaddr_in *) sin) -> sin_family = AF_INET;
154         ((struct sockaddr_in *) sin) -> sin_addr = * (struct in_addr *) & address -> host.addr[12];
155         ((struct sockaddr_in *) sin) -> sin_port = ENET_HOST_TO_NET_16 (address -> port);
156         return 0;
157     }
158-    else if (family == AF_INET6)
159+    else if (family == ENET_IPV6)
160     {
161-        memset (sin, 0, sizeof (struct sockaddr_in6));
162         ((struct sockaddr_in6 *) sin) -> sin6_family = AF_INET6;
163         ((struct sockaddr_in6 *) sin) -> sin6_addr = * (struct in6_addr *) & address -> host;
164         ((struct sockaddr_in6 *) sin) -> sin6_scope_id = address -> scopeID;
[7390]165@@ -132,7 +151,7 @@ enet_address_set_host (ENetAddress * address, const char * name)
[7378]166 
167     for (res = result; res != NULL; res = res -> ai_next)
168     {
169-        if ( !enet_address_set_address(address, res -> ai_addr) )
170+        if ( enet_address_set_address(address, res -> ai_addr) != ENET_NO_ADDRESS_FAMILY )
171             break;
172     }
173 
[7390]174@@ -147,9 +166,9 @@ static int
[7378]175 enet_address_get_host_x (const ENetAddress * address, char * name, size_t nameLength, int flags)
176 {
177     struct sockaddr_storage sin;
178-    enet_address_set_sin((struct sockaddr *) & sin, address, AF_INET6);
179+    enet_address_set_sin((struct sockaddr *) & sin, address, ENET_IPV6);
180 
181-    if ( getnameinfo((struct sockaddr *) & sin, sizeof(struct sockaddr_in6), name, nameLength, NULL, 0, flags))
182+    if ( getnameinfo((struct sockaddr *) & sin, enet_sa_size (ENET_IPV6), name, nameLength, NULL, 0, flags))
183         return -1;
184 
185     return 0;
[7390]186@@ -168,21 +187,21 @@ enet_address_get_host (const ENetAddress * address, char * name, size_t nameLeng
[7378]187 }
188 
189 int
190-enet_socket_bind (ENetSocket socket, const ENetAddress * address)
191+enet_socket_bind (ENetSocket socket, const ENetAddress * address, ENetAddressFamily family)
192 {
193     struct sockaddr_storage sin;
194 
195     if (address != NULL)
196     {
197-        enet_address_set_sin((struct sockaddr *) & sin, address, AF_INET6);
198+        enet_address_set_sin((struct sockaddr *) & sin, address, family);
199     }
200     else
201     {
202         ENetAddress address_ = { ENET_HOST_ANY, 0, 0 };
203-        enet_address_set_sin((struct sockaddr *) & sin, & address_, AF_INET6);
204+        enet_address_set_sin((struct sockaddr *) & sin, & address_, family);
205     }
206 
207-    return bind (socket, (struct sockaddr *) & sin, sizeof (struct sockaddr_in6));
208+    return bind (socket, (struct sockaddr *) & sin, enet_sa_size(family));
209 }
210 
211 int
[7390]212@@ -192,13 +211,16 @@ enet_socket_listen (ENetSocket socket, int backlog)
[7378]213 }
214 
215 ENetSocket
216-enet_socket_create (ENetSocketType type)
217+enet_socket_create (ENetSocketType type, ENetAddressFamily family)
218 {
219-    ENetSocket sock = socket (AF_INET6, type == ENET_SOCKET_TYPE_DATAGRAM ? SOCK_DGRAM : SOCK_STREAM, 0);
220+    ENetSocket sock = socket (enet_af (family), type == ENET_SOCKET_TYPE_DATAGRAM ? SOCK_DGRAM : SOCK_STREAM, 0);
221 
222 #ifdef IPV6_V6ONLY
223-    int value = 0;
224-    setsockopt (sock, IPPROTO_IPV6, IPV6_V6ONLY, & value, sizeof (int));
225+    if (family == ENET_IPV6)
226+    {
227+        int value = 0;
228+        setsockopt (sock, IPPROTO_IPV6, IPV6_V6ONLY, & value, sizeof (int));
229+    }
230 #endif // IPV6_V6ONLY
231 
232     return sock;
[7390]233@@ -241,25 +263,25 @@ enet_socket_set_option (ENetSocket socket, ENetSocketOption option, int value)
[7378]234 }
235 
236 int
237-enet_socket_connect (ENetSocket socket, const ENetAddress * address)
238+enet_socket_connect (ENetSocket socket, const ENetAddress * address, ENetAddressFamily family)
239 {
240     struct sockaddr_storage sin;
241-    enet_address_set_sin((struct sockaddr *) & sin, address, AF_INET6);
242+    enet_address_set_sin((struct sockaddr *) & sin, address, family);
243 
244-    return connect (socket, (struct sockaddr *) & sin, sizeof (struct sockaddr_in6));
245+    return connect (socket, (struct sockaddr *) & sin, enet_sa_size (family));
246 }
247 
248 ENetSocket
249-enet_socket_accept (ENetSocket socket, ENetAddress * address)
250+enet_socket_accept (ENetSocket socket, ENetAddress * address, ENetAddressFamily family)
251 {
252     int result;
253     struct sockaddr_storage sin;
254-    socklen_t sinLength = sizeof (struct sockaddr_in6);
255+    socklen_t sinLength = enet_sa_size (family);
256 
257     result = accept (socket,
258                      address != NULL ? (struct sockaddr *) & sin : NULL,
259                      address != NULL ? & sinLength : NULL);
260-   
261+
262     if (result == -1)
263       return ENET_SOCKET_NULL;
264 
[7390]265@@ -281,7 +303,8 @@ int
[7378]266 enet_socket_send (ENetSocket socket,
267                   const ENetAddress * address,
268                   const ENetBuffer * buffers,
269-                  size_t bufferCount)
270+                  size_t bufferCount,
271+                  ENetAddressFamily family)
272 {
273     struct msghdr msgHdr;
274     struct sockaddr_storage sin;
[7390]275@@ -291,9 +314,9 @@ enet_socket_send (ENetSocket socket,
[7378]276 
277     if (address != NULL)
278     {
279-        enet_address_set_sin((struct sockaddr *) & sin, address, AF_INET6);
280+        enet_address_set_sin((struct sockaddr *) & sin, address, family);
281         msgHdr.msg_name = & sin;
282-        msgHdr.msg_namelen = sizeof (struct sockaddr_in6);
283+        msgHdr.msg_namelen = enet_sa_size (family);
284     }
285 
286     msgHdr.msg_iov = (struct iovec *) buffers;
[7390]287@@ -316,7 +339,8 @@ int
[7378]288 enet_socket_receive (ENetSocket socket,
289                      ENetAddress * address,
290                      ENetBuffer * buffers,
291-                     size_t bufferCount)
292+                     size_t bufferCount,
293+                     ENetAddressFamily family)
294 {
295     struct msghdr msgHdr;
296     struct sockaddr_storage sin;
[7390]297@@ -327,7 +351,7 @@ enet_socket_receive (ENetSocket socket,
[7378]298     if (address != NULL)
299     {
300         msgHdr.msg_name = & sin;
301-        msgHdr.msg_namelen = sizeof (struct sockaddr_in6);
302+        msgHdr.msg_namelen = enet_sa_size (family);
303     }
304 
305     msgHdr.msg_iov = (struct iovec *) buffers;
306--
3071.7.1
308
Note: See TracBrowser for help on using the repository browser.