]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[dhcp] Continue transmitting DHCPDISCOVER while link is blocked
authorMichael Brown <mcb30@ipxe.org>
Tue, 19 Jan 2021 12:21:28 +0000 (12:21 +0000)
committerMichael Brown <mcb30@ipxe.org>
Tue, 19 Jan 2021 12:21:28 +0000 (12:21 +0000)
Continue to transmit DHCPDISCOVER while waiting for a blocked link, in
order to support mechanisms such as Cisco MAC Authentication Bypass
that require repeated transmission attempts in order to trigger the
action that will result in the link becoming unblocked.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/net/udp/dhcp.c

index 3a3666c9a628ef7ba1ce43436f38c98864e7d233..4ebd38bbbbc587cc42a8dcbff46489edc0b7b720 100644 (file)
@@ -451,17 +451,6 @@ static void dhcp_discovery_rx ( struct dhcp_session *dhcp,
 static void dhcp_discovery_expired ( struct dhcp_session *dhcp ) {
        unsigned long elapsed = ( currticks() - dhcp->start );
 
-       /* If link is blocked, defer DHCP discovery (and reset timeout) */
-       if ( netdev_link_blocked ( dhcp->netdev ) &&
-            ( dhcp->count <= DHCP_DISC_MAX_DEFERRALS ) ) {
-               DBGC ( dhcp, "DHCP %p deferring discovery\n", dhcp );
-               dhcp->start = currticks();
-               start_timer_fixed ( &dhcp->timer,
-                                   ( DHCP_DISC_START_TIMEOUT_SEC *
-                                     TICKS_PER_SEC ) );
-               return;
-       }
-
        /* Give up waiting for ProxyDHCP before we reach the failure point */
        if ( dhcp->offer.s_addr &&
             ( elapsed > DHCP_DISC_PROXY_TIMEOUT_SEC * TICKS_PER_SEC ) ) {
@@ -469,8 +458,18 @@ static void dhcp_discovery_expired ( struct dhcp_session *dhcp ) {
                return;
        }
 
-       /* Otherwise, retransmit current packet */
+       /* Retransmit current packet */
        dhcp_tx ( dhcp );
+
+       /* If link is blocked, defer DHCP discovery timeout */
+       if ( netdev_link_blocked ( dhcp->netdev ) &&
+            ( dhcp->count <= DHCP_DISC_MAX_DEFERRALS ) ) {
+               DBGC ( dhcp, "DHCP %p deferring discovery timeout\n", dhcp );
+               dhcp->start = currticks();
+               start_timer_fixed ( &dhcp->timer,
+                                   ( DHCP_DISC_START_TIMEOUT_SEC *
+                                     TICKS_PER_SEC ) );
+       }
 }
 
 /** DHCP discovery state operations */