Catch IPv6-mapped IPv4 address.
authoraland <aland>
Thu, 21 Apr 2005 16:54:07 +0000 (16:54 +0000)
committeraland <aland>
Thu, 21 Apr 2005 16:54:07 +0000 (16:54 +0000)
The server can now listen on IPv6 address ::1 (localhost), and
packets sent to 127.0.0.1 will be mapped into the IPv6 address
space, and the server should recognize them, even if only the
IPv4 address is listed in clients.conf

src/main/client.c

index 0596699..5bc8f3f 100644 (file)
@@ -217,12 +217,27 @@ RADCLIENT *client_find(const lrad_ipaddr_t *ipaddr)
        RADCLIENT *cl;
        RADCLIENT *match = NULL;
 
-       if (ipaddr->af != AF_INET) return NULL; /* FIXME! */
-
        for (cl = mainconfig.clients; cl; cl = cl->next) {
+               /*
+                *      Catch IPv6-mapped IPv4 addresses.
+                */
+               if ((cl->ipaddr.af == AF_INET) &&
+                   (ipaddr->af == AF_INET6) &&
+                   IN6_IS_ADDR_V4MAPPED(&ipaddr->ipaddr.ip6addr) &&
+                   (((const uint32_t *) &cl->ipaddr.ipaddr.ip4addr)[0] ==
+                    ((const uint32_t *) &ipaddr->ipaddr.ip6addr)[3]) &&
+                   ((((const uint32_t *) &ipaddr->ipaddr.ip6addr)[3] & cl->netmask) == cl->ipaddr.ipaddr.ip4addr.s_addr)) {
+                       if ((!match) ||
+                           (ntohl(cl->netmask) > ntohl(match->netmask))) {
+                               match = cl;
+                       }
+                       
+               }
+
                if (cl->ipaddr.af != ipaddr->af) continue;
 
-               if ((ipaddr->ipaddr.ip4addr.s_addr & cl->netmask) == cl->ipaddr.ipaddr.ip4addr.s_addr) {
+               if ((ipaddr->af == AF_INET) &&
+                   ((ipaddr->ipaddr.ip4addr.s_addr & cl->netmask) == cl->ipaddr.ipaddr.ip4addr.s_addr)) {
                        if ((!match) ||
                            (ntohl(cl->netmask) > ntohl(match->netmask))) {
                                match = cl;
@@ -243,8 +258,6 @@ const char *client_name(const lrad_ipaddr_t *ipaddr)
        RADCLIENT *cl;
        char host_ipaddr[128];
 
-       if (ipaddr->af != AF_INET) rad_assert(0 == 1);
-
        if ((cl = client_find(ipaddr)) != NULL) {
                if (cl->shortname[0])
                        return cl->shortname;