zoukankan      html  css  js  c++  java
  • [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
    
    
    
  • 相关阅读:
    J2EE规范标准
    怎样用Google APIs和Google的应用系统进行集成(4)----获得Access Token以通过一些Google APIs的OAuth2认证
    [BestCoder Round #3] hdu 4908 BestCoder Sequence (计数)
    大数据存储之分布式文件系统(一)
    List与array的相互转换
    TRIZ系列-创新原理-31-多孔材料原理
    关于app.FragmentManager和v4包的FragmentPagerAdapter冲突
    POJ 1163 The Triangle
    ChinaVis2015 第一天会议
    JSON初入门
  • 原文地址:https://www.cnblogs.com/herryzz/p/13475197.html
Copyright © 2011-2022 走看看