Re: [Freeciv-Dev] (PR#40296) [Patch] IPv6

2008-07-24 Thread Marko Lindqvist

URL: http://bugs.freeciv.org/Ticket/Display.html?id=40296 

 - Updated against svn
 - Crude dual-stack implementation (improvements to that will be left
to future tickets)

 I'm still going to commit some parts of this separately as they get
cleaned up enough.


 - ML

diff -Nurd -X.diff_ignore freeciv/client/clinet.c freeciv/client/clinet.c
--- freeciv/client/clinet.c 2008-07-25 00:22:34.0 +0300
+++ freeciv/client/clinet.c 2008-07-25 00:22:41.0 +0300
@@ -167,8 +167,13 @@
 port = DEFAULT_SOCK_PORT;
 
   /* use name to find TCP/IP address of server */
-  if (!hostname)
+  if (!hostname) {
+#ifdef IPV6_USED
+hostname = ip6-localhost;
+#else  /* IPV6 used */
 hostname = localhost;
+#endif /* IPV6 used */
+  }
 
   if (!net_lookup_service(hostname, port, server_addr)) {
 (void) mystrlcpy(errbuf, _(Failed looking up host.), errbufsize);
@@ -198,7 +203,7 @@
 (void) mystrlcpy(errbuf, _(Connection in progress.), errbufsize);
 return -1;
   }
-  
+
   if ((client.conn.sock = socket(server_addr.saddr.sa_family,
  SOCK_STREAM, 0)) == -1) {
 (void) mystrlcpy(errbuf, mystrerror(), errbufsize);
diff -Nurd -X.diff_ignore freeciv/client/connectdlg_common.c 
freeciv/client/connectdlg_common.c
--- freeciv/client/connectdlg_common.c  2008-07-14 21:49:09.0 +0300
+++ freeciv/client/connectdlg_common.c  2008-07-25 00:22:41.0 +0300
@@ -206,7 +206,13 @@
   append_output_window(_(Starting server...));
 
   /* find a free port */ 
-  internal_server_port = find_next_free_port(DEFAULT_SOCK_PORT);
+  internal_server_port = find_next_free_port(DEFAULT_SOCK_PORT,
+#ifdef IPV6_USED
+  TRUE
+#else  /* IPv6 used */
+  FALSE
+#endif /* IPv6 used */
+  );
 
 # ifdef HAVE_WORKING_FORK
   server_pid = fork();
@@ -258,7 +264,7 @@
   fchmod(1, 0644);
 }
 
-/* If it's still attatched to our terminal, things get messed up, 
+/* If it's still attached to our terminal, things get messed up, 
   but civserver needs *something* */ 
 fclose(stdin);
 fd = open(/dev/null, O_RDONLY);
diff -Nurd -X.diff_ignore freeciv/client/servers.c freeciv/client/servers.c
--- freeciv/client/servers.c2008-07-25 00:22:34.0 +0300
+++ freeciv/client/servers.c2008-07-25 00:22:41.0 +0300
@@ -413,14 +413,14 @@
 (scan-error_func)(scan, _(Failed looking up metaserver's host));
 return FALSE;
   }
-  
+
   if ((s = socket(addr.saddr.sa_family, SOCK_STREAM, 0)) == -1) {
 (scan-error_func)(scan, mystrerror());
 return FALSE;
   }
 
   my_nonblock(s);
-  
+
   if (my_connect(s, addr.saddr, sockaddr_size(addr)) == -1) {
 if (errno == EINPROGRESS) {
   /* With non-blocking sockets this is the expected result. */
@@ -538,15 +538,27 @@
 #else  /* HAVE_WINSOCK */
   char buffer[MAX_LEN_PACKET];
 #endif /* HAVE_WINSOCK */
-  struct ip_mreq mreq;
+  struct ip_mreq mreq4;
   const char *group;
   size_t size;
+  int family;
+
+#ifdef IPV6_SUPPORT
+  struct ipv6_mreq mreq6;
+#endif
+
 #ifndef HAVE_WINSOCK
   unsigned char ttl;
-#endif
+#endif /* WINSOCK */
+
+#ifdef IPV6_USED
+  family = AF_INET6;
+#else  /* IPv6 used */
+  family = AF_INET;
+#endif /* IPv6 used */
 
   /* Create a socket for broadcasting to servers. */
-  if ((sock = socket(AF_INET, SOCK_DGRAM, 0))  0) {
+  if ((sock = socket(family, SOCK_DGRAM, 0))  0) {
 freelog(LOG_ERROR, socket failed: %s, mystrerror());
 return FALSE;
   }
@@ -559,9 +571,20 @@
   /* Set the UDP Multicast group IP address. */
   group = get_multicast_group();
   memset(addr, 0, sizeof(addr));
-  addr.saddr_in4.sin_family = AF_INET;
-  addr.saddr_in4.sin_addr.s_addr = inet_addr(get_multicast_group());
-  addr.saddr_in4.sin_port = htons(SERVER_LAN_PORT);
+#ifndef IPV6_SUPPORT
+  {
+inet_aton(group, addr.saddr_in4.sin_addr);
+#else  /* IPv6 support */
+  if (family == AF_INET6) {
+addr.saddr.sa_family = AF_INET6;
+inet_pton(AF_INET6, group, addr.saddr_in6.sin6_addr);
+addr.saddr_in6.sin6_port = htons(SERVER_LAN_PORT);
+  } else {
+inet_pton(AF_INET, group, addr.saddr_in4.sin_addr);
+#endif /* IPv6 support */
+addr.saddr.sa_family = AF_INET;
+addr.saddr_in4.sin_port = htons(SERVER_LAN_PORT);
+  }
 
 /* this setsockopt call fails on Windows 98, so we stick with the default
  * value of 1 on Windows, which should be fine in most cases */
@@ -573,7 +596,7 @@
 freelog(LOG_ERROR, setsockopt failed: %s, mystrerror());
 return FALSE;
   }
-#endif
+#endif /* HAVE_WINSOCK */
 
   if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (const char*)opt, 
  sizeof(opt))) {
@@ -587,7 +610,7 @@
  
 
   if (sendto(sock, buffer, size, 0, addr.saddr,
-  sockaddr_size(addr))  0) {
+ sockaddr_size(addr))  0) {
 /* This can happen when there's no network connection - it should
  * give an in-game message. */
 freelog(LOG_ERROR, lanserver scan sendto failed: %s, mystrerror());
@@ -599,7 +622,7 @@
   my_closesocket(sock);
 

Re: [Freeciv-Dev] (PR#40296) [Patch] IPv6

2008-07-06 Thread Marko Lindqvist

URL: http://bugs.freeciv.org/Ticket/Display.html?id=40296 

 - A lot of cleanup
 - IPv6 multicast works


 I've already started splitting ready parts of this in to separate
patches ready for commit.


 - ML



IPv6_40296-3.diff.bz2
Description: BZip2 compressed data
___
Freeciv-dev mailing list
Freeciv-dev@gna.org
https://mail.gna.org/listinfo/freeciv-dev


Re: [Freeciv-Dev] (PR#40296) [Patch] IPv6

2008-07-03 Thread Marko Lindqvist

URL: http://bugs.freeciv.org/Ticket/Display.html?id=40296 

2008/6/20 Marko Lindqvist:

  This is my take of IPv6 support.

 Mostly rewritten for this second version...

 - Cleanup
 - Fourth configuration value for --enable-ipv6; support. Like
test, except will fail if IPv6 support cannot be built in
 - Default configuration is now to use IPv4 with old functions. No
problems of the new implementation should affect default build
 - Metaserver connections work with support and test configurations


 TODO:
 - IPv6 lan broadcast
 - Runtime support for simultaneous IPv4 and IPv6 connections
(connection to metaserver might be different from client connections)
 - More cleanup


 - ML



IPv6_40296-2.diff.bz2
Description: BZip2 compressed data
___
Freeciv-dev mailing list
Freeciv-dev@gna.org
https://mail.gna.org/listinfo/freeciv-dev


[Freeciv-Dev] (PR#40296) [Patch] IPv6

2008-06-20 Thread Marko Lindqvist

URL: http://bugs.freeciv.org/Ticket/Display.html?id=40296 

 This is my take of IPv6 support.

 As you probably already know, there is currently two sets of
networking functions in the Linux-world. Legacy ones work only with
IPv4, new ones can handle both IPv4 and IPv6.

 Configure option --enable-ipv6 can have three values:
 --disable-ipv6 - use old functions. Works in ancient systems, but has
no IPv6 support at all
 --enable-ipv6=test [default] - Test if system has required IPv6
compatible functions available and if it does, use them. Even though
functions capable of IPv6 support are used, this
still uses IPv4 address family
 --enable-ipv6 - Use new functions and IPv6 address family


 Currently two things are not exactly according to division above. 1)
Server binds to IPv6 address even when --enable-ipv6=test is used. OS
maps incoming IPv4 requests so that this is not causing any trouble.
2) Lan broadcast is not yet implemented using IPv6 address family.


 Bugs:
 - Send to metaserver is not working when new functions are used. It
works fine when ipv6 support completely disabled.


 - ML

diff -Nurd -X.diff_ignore freeciv/client/clinet.c freeciv/client/clinet.c
--- freeciv/client/clinet.c	2008-03-08 16:13:03.0 +0200
+++ freeciv/client/clinet.c	2008-06-20 02:39:03.0 +0300
@@ -198,13 +198,13 @@
 (void) mystrlcpy(errbuf, _(Connection in progress.), errbufsize);
 return -1;
   }
-  
-  if ((client.conn.sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
+
+  if ((client.conn.sock = socket(FC_AF_FAMILY, SOCK_STREAM, 0)) == -1) {
 (void) mystrlcpy(errbuf, mystrerror(), errbufsize);
 return -1;
   }
 
-  if (my_connect(client.conn.sock, server_addr.sockaddr,
+  if (my_connect(client.conn.sock, server_addr.addr,
   sizeof(server_addr)) == -1) {
 (void) mystrlcpy(errbuf, mystrerror(), errbufsize);
 my_closesocket(client.conn.sock);
diff -Nurd -X.diff_ignore freeciv/client/servers.c freeciv/client/servers.c
--- freeciv/client/servers.c	2007-08-20 00:55:46.0 +0300
+++ freeciv/client/servers.c	2008-06-20 06:02:43.0 +0300
@@ -413,15 +413,15 @@
 (scan-error_func)(scan, _(Failed looking up metaserver's host));
 return FALSE;
   }
-  
-  if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
+
+  if ((s = socket(FC_AF_FAMILY, SOCK_STREAM, 0)) == -1) {
 (scan-error_func)(scan, mystrerror());
 return FALSE;
   }
 
   my_nonblock(s);
-  
-  if (my_connect(s, (struct sockaddr *) addr.sockaddr, sizeof(addr)) == -1) {
+
+  if (my_connect(s, addr.addr, sizeof(addr.addr_in)) == -1) {
 if (errno == EINPROGRESS) {
   /* With non-blocking sockets this is the expected result. */
   scan-meta.state = META_CONNECTING;
@@ -540,9 +540,14 @@
 #ifndef HAVE_WINSOCK
   unsigned char ttl;
 #endif
+#ifdef HAVE_INET_PTON
+  char dst[FC_ADDR_SIZE];
+#else
+  in_addr_t dst;
+#endif
 
   /* Create a socket for broadcasting to servers. */
-  if ((sock = socket(AF_INET, SOCK_DGRAM, 0))  0) {
+  if ((sock = socket(FC_AF_FAMILY, SOCK_DGRAM, 0))  0) {
 freelog(LOG_ERROR, socket failed: %s, mystrerror());
 return FALSE;
   }
@@ -554,10 +559,15 @@
 
   /* Set the UDP Multicast group IP address. */
   group = get_multicast_group();
+#ifdef HAVE_INET_PTON
+  inet_pton(FC_AF_FAMILY, group, dst);
+#else
+  dst = inet_addr(group);
+#endif
   memset(addr, 0, sizeof(addr));
-  addr.sockaddr_in.sin_family = AF_INET;
-  addr.sockaddr_in.sin_addr.s_addr = inet_addr(get_multicast_group());
-  addr.sockaddr_in.sin_port = htons(SERVER_LAN_PORT);
+  addr.addr_in.FC_SIN_FAMILY = FC_AF_FAMILY;
+  FC_SET_ADDR(addr.addr_in, dst, sizeof(dst));
+  addr.addr_in.FC_SIN_PORT = htons(SERVER_LAN_PORT);
 
 /* this setsockopt call fails on Windows 98, so we stick with the default
  * value of 1 on Windows, which should be fine in most cases */
@@ -582,7 +592,7 @@
   size = dio_output_used(dout);
  
 
-  if (sendto(sock, buffer, size, 0, addr.sockaddr,
+  if (sendto(sock, buffer, size, 0, addr.addr,
   sizeof(addr))  0) {
 /* This can happen when there's no network connection - it should
  * give an in-game message. */
@@ -595,7 +605,7 @@
   my_closesocket(sock);
 
   /* Create a socket for listening for server packets. */
-  if ((scan-sock = socket(AF_INET, SOCK_DGRAM, 0))  0) {
+  if ((scan-sock = socket(FC_AF_FAMILY, SOCK_DGRAM, 0))  0) {
 (scan-error_func)(scan, mystrerror());
 return FALSE;
   }
@@ -608,15 +618,17 @@
   }

   memset(addr, 0, sizeof(addr));
-  addr.sockaddr_in.sin_family = AF_INET;
-  addr.sockaddr_in.sin_addr.s_addr = htonl(INADDR_ANY); 
-  addr.sockaddr_in.sin_port = htons(SERVER_LAN_PORT + 1);
+  addr.addr_in.FC_SIN_FAMILY = FC_AF_FAMILY;
+  FC_SET_SIN_LEN(addr.addr_in, sizeof(addr.addr_in));
+  FC_SET_ADDR_ANY(addr.addr_in);
+  addr.addr_in.FC_SIN_PORT = htons(SERVER_LAN_PORT + 1);
 
-  if (bind(scan-sock, addr.sockaddr, sizeof(addr))  0) {
+  if (bind(scan-sock,