[Network] DHCP 协议 DORA 过程 以及 超时处理

在某个环境中,BIOS进行无线连接,经常无法从路由器上获取IP地址。
根据路由器的LOG分析,DHCP DISCOVER,OFFER后即无响应,DORA过程不全。
通过增加重试以及修复超时时间,可以从路由器获取IP地址。

DHCP DORA 过程

DHCP DORA Process

1. DHCP Discover Message

    Source IP: 0.0.0.0
    Destination IP: 255.255.255.255
    Source MAC: DHCP Client Machine MAC Address
    Destination MAC: FF:FF:FF:FF:FF:FF

2. DHCP Offer Message

    Source IP: DHCP Server IP Address
    Destination IP: 255.255.255.255
    Source MAC: DHCP Server Machine MAC Address
    Destination MAC: DHCP client MAC Address

3. DHCP Request Message

    Source IP: 0.0.0.0
    Destination IP: 255.255.255.255
    Source MAC: DHCP Client Machine MAC Address
    Destination MAC: DHCP Server MAC Address

4. DHCP Acknowledge Message

    Source IP: DHCP Server IP Address
    Destination IP: 255.255.255.255
    Source MAC: DHCP Server Machine MAC Address
    Destination MAC: DHCP client MAC Address

UEFI中的相关代码

//edk2-vUDK2018MdeModulePkgUniversalNetworkDhcp4DxeDhcp4Io.c
VOID
EFIAPI
DhcpOnTimerTick (
  IN EFI_EVENT              Event,
  IN VOID                   *Context
  )
{

...

  //
  // Check the retransmit timer
  //
  if ((DhcpSb->PacketToLive > 0) && (--DhcpSb->PacketToLive == 0)) {

    //
    // Select offer at each timeout if any offer received.
    //
    if (DhcpSb->DhcpState == Dhcp4Selecting && DhcpSb->LastOffer != NULL) {

      Status = DhcpChooseOffer (DhcpSb);

      if (EFI_ERROR(Status)) {
        if (DhcpSb->LastOffer != NULL) {
          FreePool (DhcpSb->LastOffer);
          DhcpSb->LastOffer = NULL;
        }
      } else {
        goto ON_EXIT;
      }
    }
    
    if (++DhcpSb->CurRetry < DhcpSb->MaxRetries) {
      //
      // Still has another try
      //
      DhcpRetransmit (DhcpSb);
      DhcpSetTransmitTimer (DhcpSb);

    } else if (DHCP_CONNECTED (DhcpSb->DhcpState)) {

      //
      // Retransmission failed, if the DHCP request is initiated by
      // user, adjust the current state according to the lease life.
      // Otherwise do nothing to wait the lease to timeout
      //
      if (DhcpSb->ExtraRefresh != 0) {
        Status = EFI_SUCCESS;

        if (DhcpSb->LeaseLife < DhcpSb->T1) {
          Status = DhcpSetState (DhcpSb, Dhcp4Bound, FALSE);

        } else if (DhcpSb->LeaseLife < DhcpSb->T2) {
          Status = DhcpSetState (DhcpSb, Dhcp4Renewing, FALSE);

        } else if (DhcpSb->LeaseLife < DhcpSb->Lease) {
          Status = DhcpSetState (DhcpSb, Dhcp4Rebinding, FALSE);

        } else {
          goto END_SESSION;

        }

        DhcpSb->IoStatus = EFI_TIMEOUT;
        DhcpNotifyUser (DhcpSb, DHCP_NOTIFY_RENEWREBIND);
      }
    } else {
      goto END_SESSION;
    }
  }

...
}

路由器 OK, NG时的Log.

<OK>
 *DHCP Socket Task:  13:58:47.145: 0c:7a:15:45:64:33 DHCP processing DHCP DISCOVER (1)
 *DHCP Socket Task:  13:58:47.145: 0c:7a:15:45:64:33 DHCP   xid: 0xXXXXXXX1, secs: 0, flags: 80
 *DHCP Socket Task:  13:58:47.145: 0c:7a:15:45:64:33 DHCP successfully bridged packet to DS
 *DHCP Socket Task:  13:58:47.147: 0c:7a:15:45:64:33 DHCP processing DHCP OFFER (2)
 *DHCP Socket Task:  13:58:47.147: 0c:7a:15:45:64:33 DHCP   xid: 0xXXXXXXX1, secs: 0, flags: 80
 *DHCP Socket Task:  13:58:47.147: 0c:7a:15:45:64:33 DHCP successfully bridged packet to STA
 *DHCP Socket Task:  13:58:48.017: 0c:7a:15:45:64:33 DHCP processing DHCP REQUEST (3)
 *DHCP Socket Task:  13:58:48.017: 0c:7a:15:45:64:33 DHCP   xid: 0xXXXXXXX1, secs: 0, flags: 80
 *DHCP Socket Task:  13:58:48.017: 0c:7a:15:45:64:33 DHCP successfully bridged packet to DS
 *DHCP Socket Task:  13:58:48.060: 0c:7a:15:45:64:33 DHCP processing DHCP ACK (5)
 *DHCP Socket Task:  13:58:48.060: 0c:7a:15:45:64:33 DHCP   xid: 0xXXXXXXX1, secs: 0, flags: 80
 *DHCP Socket Task:  13:58:48.060: 0c:7a:15:45:64:33 DHCP successfully bridged packet to STA

<NG>
 *DHCP Socket Task:  14:03:14.128: 0c:7a:15:45:64:33 DHCP processing DHCP DISCOVER (1)
 *DHCP Socket Task:  14:03:14.128: 0c:7a:15:45:64:33 DHCP   xid: 0xXXXXXXX2, secs: 0, flags: 80
 *DHCP Socket Task:  14:03:14.128: 0c:7a:15:45:64:33 DHCP successfully bridged packet to DS
 *DHCP Socket Task:  14:03:14.269: 0c:7a:15:45:64:33 DHCP processing DHCP OFFER (2)
 *DHCP Socket Task:  14:03:14.269: 0c:7a:15:45:64:33 DHCP   xid: 0xXXXXXXX2, secs: 0, flags: 80
 *DHCP Socket Task:  14:03:14.269: 0c:7a:15:45:64:33 DHCP successfully bridged packet to STA

<NG>
 *DHCP Socket Task:  14:06:15.477: 0c:7a:15:45:64:33 DHCP processing DHCP DISCOVER (1)
 *DHCP Socket Task:  14:06:15.477: 0c:7a:15:45:64:33 DHCP   xid: 0xXXXXXXX3, secs: 0, flags: 80
 *DHCP Socket Task:  14:06:15.477: 0c:7a:15:45:64:33 DHCP successfully bridged packet to DS
 *DHCP Socket Task:  14:06:15.546: 0c:7a:15:45:64:33 DHCP processing DHCP OFFER (2)
 *DHCP Socket Task:  14:06:15.546: 0c:7a:15:45:64:33 DHCP   xid: 0xXXXXXXX3, secs: 0, flags: 80
 *DHCP Socket Task:  14:06:15.546: 0c:7a:15:45:64:33 DHCP successfully bridged packet to STA

<NG>
 *DHCP Socket Task:  14:10:16.014: 0c:7a:15:45:64:33 DHCP processing DHCP DISCOVER (1)
 *DHCP Socket Task:  14:10:16.014: 0c:7a:15:45:64:33 DHCP   xid: 0xXXXXXXX4, secs: 0, flags: 80
 *DHCP Socket Task:  14:10:16.014: 0c:7a:15:45:64:33 DHCP successfully bridged packet to DS
 *DHCP Socket Task:  14:10:16.174: 0c:7a:15:45:64:33 DHCP processing DHCP OFFER (2)
 *DHCP Socket Task:  14:10:16.174: 0c:7a:15:45:64:33 DHCP   xid: 0xXXXXXXX4, secs: 0, flags: 80


<OK>
 *DHCP Socket Task:  14:15:30.652: 0c:7a:15:45:64:33 DHCP processing DHCP DISCOVER (1)
 *DHCP Socket Task:  14:15:30.652: 0c:7a:15:45:64:33 DHCP   xid: 0xXXXXXXX5, secs: 0, flags: 80
 *DHCP Socket Task:  14:15:30.652: 0c:7a:15:45:64:33 DHCP successfully bridged packet to DS
 *DHCP Socket Task:  14:15:30.654: 0c:7a:15:45:64:33 DHCP processing DHCP OFFER (2)
 *DHCP Socket Task:  14:15:30.654: 0c:7a:15:45:64:33 DHCP   xid: 0xXXXXXXX5, secs: 0, flags: 80
 *DHCP Socket Task:  14:15:30.654: 0c:7a:15:45:64:33 DHCP successfully bridged packet to STA
 *DHCP Socket Task:  14:15:31.535: 0c:7a:15:45:64:33 DHCP processing DHCP REQUEST (3)
 *DHCP Socket Task:  14:15:31.535: 0c:7a:15:45:64:33 DHCP   xid: 0xXXXXXXX5, secs: 0, flags: 80
 *DHCP Socket Task:  14:15:31.535: 0c:7a:15:45:64:33 DHCP successfully bridged packet to DS
 *DHCP Socket Task:  14:15:31.538: 0c:7a:15:45:64:33 DHCP processing DHCP ACK (5)
 *DHCP Socket Task:  14:15:31.538: 0c:7a:15:45:64:33 DHCP   xid: 0xXXXXXXX5, secs: 0, flags: 80
 *DHCP Socket Task:  14:15:31.538: 0c:7a:15:45:64:33 DHCP successfully bridged packet to STA


原文地址:https://www.cnblogs.com/herryzz/p/13475197.html