Re: [Freeciv-Dev] (PR#40296) [Patch] IPv6
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
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
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
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,