chiark / gitweb /
polypath: Ignore IPv6 Unique Local unicast addresses.
[secnet.git] / polypath.c
index 48d06a1308ef3924771285163c45922678a3c666..273849a141d1cd3280b5639b71a4a17596a17726 100644 (file)
@@ -225,6 +225,7 @@ static void polypath_process_monitor_line(struct polypath *st, char *orgl,
            DONT("IPv6 address is " m)
         DONTMASK( 100,   0,  8, "Discard-Only (RFC6666)");
        DONTMASK(2001,   0, 23, "in IETF protocol block (RFC2928)");
+       DONTMASK(fc00,   0,  7, "Uniqe Local unicast (RFC4193)");
 #undef DONTMASK
        break;
     }
@@ -321,8 +322,8 @@ static void polypath_record_ifaddr(struct polypath *st,
     interf->socks.n_socks=0;
     FILLZERO(interf->experienced_xmit_noaf);
     LIST_INSERT_HEAD(&st->interfs,interf,entry);
-    udp_socks_register(&st->uc,&interf->socks);
     interf->name=strdup(ifname);
+    udp_socks_register(&st->uc,&interf->socks,interf->name);
     if (!interf->name) BADE("strdup interface name",errno);
  found_interf:
 
@@ -336,21 +337,23 @@ static void polypath_record_ifaddr(struct polypath *st,
            bool_t ok=polypath_make_socket(st,bad,badctx, us,ifname);
            if (!ok) goto out;
        } else {
-           FILLZERO(us->experienced);
-           us->fd=fd;
+           bool_t ok=udp_import_socket(uc,us,M_WARNING,fd);
+           if (!ok) goto out;
            fd=-1;
        }
        interf->socks.n_socks++;
+       lg_perror(LG,M_INFO,0,"using %s %s",ifname,
+                 iaddr_to_string(&us->addr));
        us=0; /* do not destroy this socket during `out' */
-       lg_perror(LG,M_INFO,0,"using %s %s",ifname,ifaddr);
     } else {
        int i;
        for (i=0; i<interf->socks.n_socks; i++)
-           if (!memcmp(&interf->socks.socks[i].addr,ia,sizeof(*ia)))
+           if (iaddr_equal(&interf->socks.socks[i].addr,ia,True))
                goto address_remove_found;
        BAD("address to remove not found");
     address_remove_found:
-       lg_perror(LG,M_INFO,0,"removed %s %s",ifname,ifaddr);
+       lg_perror(LG,M_INFO,0,"removed %s %s",ifname,
+                 iaddr_to_string(&interf->socks.socks[i].addr));
        udp_destroy_socket(&st->uc,&interf->socks.socks[i]);
        interf->socks.socks[i]=
            interf->socks.socks[--interf->socks.n_socks];
@@ -437,8 +440,8 @@ static bool_t polypath_sendmsg(void *commst, struct buffer_if *buf,
            attempted=True;
            int r=sendto(us->fd,buf->start,buf->size,
                         0,&dest->ia.sa,iaddr_socklen(&dest->ia));
-           udp_sock_experienced(0,&st->uc, interf->name,us,
-                                1,af, r,errno);
+           udp_sock_experienced(0,&st->uc,&interf->socks,us,
+                                &dest->ia,af, r,errno);
            if (r>=0) {
                reasonable=True;
                break;