Allow DHCP NAKs to be delayed
authorAlan T. DeKok <aland@freeradius.org>
Fri, 11 Apr 2014 18:19:22 +0000 (14:19 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Fri, 11 Apr 2014 18:19:22 +0000 (14:19 -0400)
via response:FreeRADIUS-Response-Delay

share/dictionary.freeradius.internal
src/include/radius.h
src/modules/proto_dhcp/dhcpd.c

index 9b1203b..37b8926 100644 (file)
@@ -247,6 +247,10 @@ ATTRIBUTE  EAP-Session-Id                          1146    octets
 ATTRIBUTE      Acct-Input-Octets64                     1148    integer64
 ATTRIBUTE      Acct-Output-Octets64                    1149    integer64
 
+# 1150 and 1151 are defined above, as FreeRADIUS-Client-...
+
+ATTRIBUTE      FreeRADIUS-Response-Delay               1152    integer
+
 #
 #      Range:  1200-1279
 #              EAP-SIM (and other EAP type) weirdness.
index f36713f..44a18d7 100644 (file)
@@ -259,6 +259,8 @@ typedef enum {
 #define PW_OTP_CHALLENGE               1145
 #define PW_EAP_SESSION_ID              1146
 
+#define PW_FREERADIUS_RESPONSE_DELAY   1152
+
 /*
  *     Integer Translations
  */
index 7b08ceb..861718a 100644 (file)
@@ -418,6 +418,20 @@ static int dhcp_process(REQUEST *request)
        vp->vp_integer = 2; /* BOOTREPLY */
 
        /*
+        *      Allow NAKs to be delayed for a short period of time.
+        */
+       if (request->reply->code == PW_DHCP_NAK) {
+               vp = pairfind(request->reply->vps, PW_FREERADIUS_RESPONSE_DELAY, 0, TAG_ANY);
+               if (vp) {
+                       if (vp->vp_integer <= 10) {
+                               request->response_delay = vp->vp_integer;
+                       } else {
+                               request->response_delay = 10;
+                       }
+               }
+       }
+
+       /*
         *      Prepare the reply packet for sending through dhcp_socket_send()
         */
        request->reply->dst_ipaddr.af = AF_INET;