• [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
    
    
    
  • 相关阅读:
    Spring 中的邮件任务
    Spring 定时任务
    java中同步交互 与 异步交互
    Springboot 版本包冲突
    Derby 配置环境变量
    Springboot中的Web服务Tomcat改为Jetty
    二叉树中和为某一值的路径
    0-Java中this和super的用法总结
    树9:二叉搜索树的后序遍历
    位运算-输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
  • 原文地址:https://www.cnblogs.com/herryzz/p/13475197.html
Copyright © 2020-2023  润新知