]> jfr.im git - irc/quakenet/newserv.git/commitdiff
Map Teredo addresses to IPv4 addresses.
authorGunnar Beutner <redacted>
Mon, 17 Jun 2013 14:07:34 +0000 (16:07 +0200)
committerGunnar Beutner <redacted>
Mon, 17 Jun 2013 14:07:34 +0000 (16:07 +0200)
--HG--
branch : shroudtrusts

lib/irc_ipv6.c
lib/irc_ipv6.h
nick/nickhandlers.c
trusts/events.c

index d9052d3ea0b46d1870bea6340846fd1ff786c7f0..cd7d9b89929672634fa25ee65168eeec5c50497e 100644 (file)
@@ -486,19 +486,25 @@ int ipmask_check(const struct irc_in_addr *addr, const struct irc_in_addr *mask,
   return -1;
 }
 
-/** Convert IP addresses to canonical form for comparison.  6to4 addresses
+/** Convert IP addresses to canonical form for comparison.  6to4 and Teredo addresses
  * are converted to IPv4 addresses. All other addresses are left alone.
  * @param[out] out Receives canonical format for address.
  * @param[in] in IP address to canonicalize.
  */
-void ip_canonicalize_6to4(struct irc_in_addr *out, const struct irc_in_addr *in)
+void ip_canonicalize_tunnel(struct irc_in_addr *out, const struct irc_in_addr *in)
 {
-    if (in->in6_16[0] == htons(0x2002)) {
+    if (in->in6_16[0] == htons(0x2002)) { /* 6to4 */
         out->in6_16[0] = out->in6_16[1] = out->in6_16[2] = 0;
         out->in6_16[3] = out->in6_16[4] = 0;
         out->in6_16[5] = 0xffff;
         out->in6_16[6] = in->in6_16[1];
         out->in6_16[7] = in->in6_16[2];
+    } else if(in->in6_16[0] == htons(0x2001) && in->in6_16[1] == 0) { /* Teredo */
+        out->in6_16[0]  = out->in6_16[1] = out->in6_16[2] = 0;
+        out->in6_16[3] = out->in6_16[4] = 0;
+        out->in6_16[5] = 0xffff;
+        out->in6_16[6] = ~(in->in6_16[6]);
+        out->in6_16[7] = ~(in->in6_16[7]);
     } else
         memcpy(out, in, sizeof(*out));
 }
index 4bec9085494d8d28417c57c4fc569dac7ceb4e9b..66b10cbcb13515cc6df6b7a4de5de069f85806a9 100644 (file)
@@ -63,7 +63,7 @@ extern const char* ircd_ntoa_r(char* buf, const struct irc_in_addr* addr);
 #define ircd_aton(ADDR, STR) ipmask_parse((STR), (ADDR), NULL)
 extern int ipmask_parse(const char *in, struct irc_in_addr *mask, unsigned char *bits_ptr);
 extern int ipmask_check(const struct irc_in_addr *, const struct irc_in_addr *, unsigned char);
-void ip_canonicalize_6to4(struct irc_in_addr *out, const struct irc_in_addr *in);
+void ip_canonicalize_tunnel(struct irc_in_addr *out, const struct irc_in_addr *in);
 
 #define IPtostr(ipaddr) ircd_ntoa(&(ipaddr))
 #define irc_in_addr_v4_to_int(ADDR) ((ntohs((ADDR)->in6_16[6]) << 16) | ntohs((ADDR)->in6_16[7]))
index 7965680411a3d771c123ea0bfd0f029e95148d19..42fb62753e044f945d3cd5afbf32cf82f430f86d 100644 (file)
@@ -150,7 +150,7 @@ int handlenickmsg(void *source, int cargc, char **cargv) {
 
     memcpy(&(np->ipaddress), &ipaddress, sizeof(ipaddress));
 
-    ip_canonicalize_6to4(&ipaddress_canonical, &ipaddress);
+    ip_canonicalize_tunnel(&ipaddress_canonical, &ipaddress);
     np->ipnode = refnode(iptree, &ipaddress_canonical, irc_in_addr_is_ipv4(&ipaddress) ? 128 : 64);
     node_increment_usercount(np->ipnode);
 
index 07e9a851a8d4fa67aa1490bd8a1b019708243aeb..d60d2a227c3f96763a586754f5718741e2c267ea 100644 (file)
@@ -8,7 +8,7 @@ void trusts_newnick(nick *sender, int moving) {
   void *arg[2];
   struct irc_in_addr ipaddress;
 
-  ip_canonicalize_6to4(&ipaddress, &sender->p_ipaddr);
+  ip_canonicalize_tunnel(&ipaddress, &sender->p_ipaddr);
 
   th = th_getbyhost(&ipaddress);