Addressing APIPA/IPv4LL issues with uamanyip

Gunther Mayer gunther.mayer at googlemail.com
Sat May 3 19:24:20 UTC 2008


Hi guys,

In my quest to test and improve uamanyip even more I discovered another 
quirk: Clients who are using APIPA/IPv4LL addresses (in 169.254.0.0/16) 
such as all MAC's, Windows PC's, ubuntu etc. who were forced to use one 
through some sort of temporary LAN/WLAN failure or nas reboot, will not 
be able to connect at all through chilli.

Reason: such clients typically have no default gateway set (if their 
IPv4LL implementation is rfc 3927 compliant, Windows XP at least is) 
which would render uamanyip useless. Even worse, when they do request a 
dynamic ip via dhcp which they do periodically in the background, chilli 
would just reassign them the same defunct IPv4LL address that they had 
before until chilli restarts or the nas reboots.

I've addressed this with a very simple patch below that refuses all 
"dhcp" requests in the 196.254.0.0/16 subnet. I have tested it and it 
does work (no connections allocated for such a client, subsequent dhcp 
request works properly), however I thought I'd run it by this list first.

Gunther

P.S.: There's also an unrelated bit in there addressing the logging of 
macallowlocal clients which I think improves record keeping

Index: chilli.c
===================================================================
--- chilli.c    (revision 168)
+++ chilli.c    (working copy)
@@ -49,6 +49,10 @@
 /*static int do_timeouts = 1;*/
 static int do_sighup = 0;

+/* some IPv4LL/APIPA(rfc 3927) specific stuff for uamanyip */
+struct in_addr ipv4ll_ip;
+struct in_addr ipv4ll_mask;
+
 /* Forward declarations */
 static int acct_req(struct app_conn_t *conn, uint8_t status_type);

@@ -2573,6 +2577,16 @@
     return -1;
   }

+  /* if uamanyip is on we have to filter out which ip's are allowed */
+  if (options.uamanyip && addr && addr->s_addr) {
+    if ((addr->s_addr & ipv4ll_mask.s_addr) == ipv4ll_ip.s_addr) {
+      /* clients with an IPv4LL ip normally have no default gw 
assigned, rendering uamanyip useless
+      They must rather get a proper dynamic ip via dhcp */
+      log_dbg("IPv4LL/APIPA address requested, ignoring");
+      return -1;
+    }
+  }
+
   appconn->reqip.s_addr = addr->s_addr; /* Save for MAC auth later */

   /* If IP address is allready allocated: Fill it in */
@@ -2598,6 +2612,11 @@
     if (options.macallowlocal) {
       upprot_getip(appconn, &appconn->reqip, 0);/**/
       dnprot_accept(appconn);
+      log_info("Granted MAC=%.2X-%.2X-%.2X-%.2X-%.2X-%.2X with IP=%s 
access without radius auth" ,
+                    conn->hismac[0], conn->hismac[1],
+                    conn->hismac[2], conn->hismac[3],
+                    conn->hismac[4], conn->hismac[5],
+                    inet_ntoa(appconn->hisip));
     } else {
       macauth_radius(appconn, dhcp_pkt, dhcp_len);
     }
@@ -3521,6 +3540,10 @@
   }
   */

+  /* setup IPv4LL/APIPA network ip and mask for uamanyip exception */
+  inet_aton("169.254.0.0", &ipv4ll_ip);
+  inet_aton("255.255.0.0", &ipv4ll_mask);
+
   if (options.debug)
     log_dbg("Waiting for client request...");




More information about the Chilli mailing list