Android WiFi 获取 IP 过程

FdEventsReader 类

在其 start 接口中调用了 createAndRegisterFd(),调用了 createFd 接口创建了 mFd 对象,并将对应的对象通过 MessageQueue() 的 addOnFileDescriptorEventListener 方法加入到监听队列中;

其中要求 Subclasses 必须实现 createFd 接口并且重载 handlePacket 方法;

PacketReader 类继承 FdEventsReader 类

它作为抽象类需要子类作为实现类实现具体的方法;

DhcpPacketHandler 继承 PacketReader

packages/modules/NetworkStack/src/android/net/dhcp/DhcpClient.java 中的 DhcpPacketHandler 继承  PacketReader 作为内部类实现了 DhcpClient 类中各种报文的发送和接收操作;

DhcpDiscover 报文的发送过程

1. 在 DhcpInitState,其继承关系为 DhcpInitState -> PacketRetransmittingState -> TimeoutState -> LoggingState -> State;

2. 在 DhcpInitState 的 enter 接口中调用了父类的 enter,在 PacketRetransmittingState 的 enter 中调用了 sendPacket,实际上为虚函数,在 DhcpInitState 实现

3. 在 DhcpInitState 的 sendPacket 接口调用了 DhcpClient 中的 sendDiscoverPacket;

4. 进而调用了 DhcpPacket 类的 buildDiscoverPacket 构建报文,调用了 transmitPacket 进行发送;

5. transmitPacket 调用了 DhcpPacketHandler 的 transmitPacket 发给报文,所用的 socket 为其从 FdEventsReader 中继承而来的 fd,其中实现了 createFd 和 handlePacket 的重载,通过 Os 类的 socket 和 send 等方法实现;

进入 DhcpInitState 状态

1. 在 ObtainingConfigurationState 收到 EVENT_CONFIGURATION_INVALID 或 EVENT_CONFIGURATION_TIMEOUT 消息时;

2. startInitRebootOrInit 接口中通过 preDhcpTransitionTo 进入,需要 mWaitBeforeStartState 为 false;

首先来看整体的状态关系:

        addState(mStoppedState);
        addState(mDhcpState);
            addState(mDhcpInitState, mDhcpState);
            addState(mWaitBeforeStartState, mDhcpState);
            addState(mWaitBeforeObtainingConfigurationState, mDhcpState);
            addState(mDhcpPreconnectingState, mDhcpState);
            addState(mObtainingConfigurationState, mDhcpState);
            addState(mDhcpSelectingState, mDhcpState);
            addState(mDhcpRequestingState, mDhcpState);
            addState(mIpAddressConflictDetectingState, mDhcpState);
            addState(mIpv6OnlyWaitState, mDhcpState);
        
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值