Unmap v4mapped sockaddrs.
authorGuus Sliepen <guus@tinc-vpn.org>
Sun, 17 Mar 2002 15:59:29 +0000 (15:59 +0000)
committerGuus Sliepen <guus@tinc-vpn.org>
Sun, 17 Mar 2002 15:59:29 +0000 (15:59 +0000)
src/net_packet.c
src/net_socket.c
src/netutl.c
src/netutl.h

index 981ad186e613aeeccc0c78f992bc885dbab58c62..61ec20457812837ceed63e52b50d949dfc652cf5 100644 (file)
@@ -17,7 +17,7 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id: net_packet.c,v 1.1.2.9 2002/03/12 14:19:51 guus Exp $
+    $Id: net_packet.c,v 1.1.2.10 2002/03/17 15:59:29 guus Exp $
 */
 
 #include "config.h"
@@ -393,6 +393,8 @@ cp
       return;
     }
 
+  sockaddrunmap(&from);  /* Some braindead IPv6 implementations do stupid things. */
+
   n = lookup_node_udp(&from);
 
   if(!n)
index cc799264b4d5d6bd55977db6c0ab8723eaaa6371..277b9b0922df8e910f4a8059d88803ac06573513 100644 (file)
@@ -17,7 +17,7 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id: net_socket.c,v 1.1.2.8 2002/03/01 15:14:29 guus Exp $
+    $Id: net_socket.c,v 1.1.2.9 2002/03/17 15:59:29 guus Exp $
 */
 
 #include "config.h"
@@ -438,6 +438,8 @@ cp
       return -1;
     }
 
+  sockaddrunmap(&sa);
+
   c = new_connection();
   c->outcipher = myself->connection->outcipher;
   c->outdigest = myself->connection->outdigest;
index a5886fc16ec04f077ed164baa59545574ab7b395..95a168cacfb5054df8b94429280e4f929d1bbc5c 100644 (file)
@@ -17,7 +17,7 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id: netutl.c,v 1.12.4.28 2002/02/26 22:47:51 guus Exp $
+    $Id: netutl.c,v 1.12.4.29 2002/03/17 15:59:29 guus Exp $
 */
 
 #include "config.h"
@@ -171,6 +171,15 @@ cp
 cp
 }
 
+void sockaddrunmap(sockaddr_t *sa)
+{
+  if(IN6_IS_ADDR_V4MAPPED(&sa->in6.sin6_addr))
+    {
+      sa->in.sin_addr.s_addr = sa->in6.sin6_addr.s6_addr32[3];
+      sa->in.sin_family = AF_INET;
+    }
+}
+
 /* Subnet mask handling */
 
 int maskcmp(char *a, char *b, int masklen, int len)
index 6207fd188d4b279df1a2f36aca5f4a36a7a97f4a..654d7ad4ba160c829c74311153e12fa92c546f6c 100644 (file)
@@ -17,7 +17,7 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id: netutl.h,v 1.2.4.10 2002/02/18 16:25:16 guus Exp $
+    $Id: netutl.h,v 1.2.4.11 2002/03/17 15:59:29 guus Exp $
 */
 
 #ifndef __TINC_NETUTL_H__
@@ -37,6 +37,7 @@ extern sockaddr_t str2sockaddr(char *, char *);
 extern void sockaddr2str(sockaddr_t *, char **, char **);
 extern char *sockaddr2hostname(sockaddr_t *);
 extern int sockaddrcmp(sockaddr_t *, sockaddr_t *);
+extern void sockaddrunmap(sockaddr_t *);
 extern int maskcmp(char *, char *, int, int);
 extern void maskcpy(char *, char *, int, int);
 extern void mask(char *, int, int);