系列文章目录
第一章 国内下载AOSP最新源码的方法
第二章 下载AOSP WiFi相关的代码
第三章 将源码导入Android Studio(无需编译idegen)
前言
在STA跟AP完成四次握手后,数据链路层成功建立了连接,但是网络OSI七层模型中应用层访问网络还必须得有ip地址才行,DHCP就是从AP的DHCP服务获取IP的过程。
一、DHCP是什么?
DHCP(动态主机配置协议)是一个局域网的网络协议。指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。默认情况下,DHCP作为Windows Server的一个服务组件不会被系统自动安装,还需要管理员手动安装并进行必要的配置。
二、DHCP的过程
1. DHCP正常流程
ClientModeImpl$ObtainingIpState:
enter()
startIpClient()
sendNetworkChangeBroadcast(DetailedState.OBTAINING_IPADDR)
stopDhcpSetup()
mIpClient.startProvisioning(prov.build()) <= IpClientManager
NetworkStack:
IpClient:
// CHECKSTYLE:OFF IndentationCheck
addState(mStoppedState);
addState(mStartedState);
addState(mPreconnectingState, mStartedState);
addState(mClearingIpAddressesState, mStartedState);
addState(mRunningState, mStartedState);
addState(mStoppingState);
// CHECKSTYLE:ON IndentationCheck
setInitialState(mStoppedState);
IpClient.startProvisioning()
sendMessage(CMD_START, new android.net.shared.ProvisioningConfiguration(req))
IpClient$StoppedState:
enter()
stopAllIP()
resetLinkProperties()
CMD_START
transitionTo(mClearingIpAddressesState)
IpClient$ClearingIpAddressesState:
enter()
deferMessage(obtainMessage(CMD_ADDRESSES_CLEARED))
CMD_ADDRESSES_CLEARED
transitionTo(mRunningState)
IpClient$RunningState:
enter()
mPacketTracker = createPacketTracker()
mPacketTracker.start(mConfiguration.mDisplayName)
startIPv6()
startIPv4()
applyInitialConfig(config)
startIpReachabilityMonitor()
IpClient.startIPv4():
startDhcpClient() // Start DHCPv4
mDhcpClient = mDependencies.makeDhcpClient(mContext, IpClient.this, mInterfaceParams,mDependencies.getDhcpClientDependencies(mIpMemoryStore, mIpProvisioningMetrics))
mDhcpClient.registerForPreDhcpNotification()
mDhcpClient.sendMessage(DhcpClient.CMD_START_DHCP, new DhcpClient.Configuration(mL2Key, isUsingPreconnection()))
DhcpClient:
// CHECKSTYLE:OFF IndentationCheck
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(mDhcpHaveLeaseState, mDhcpState);
addState(mConfiguringInterfaceState, mDhcpHaveLeaseState);
addState(mDhcpBoundState, mDhcpHaveLeaseState);
addState(mWaitBeforeRenewalState, mDhcpHaveLeaseState);
addState(mDhcpRenewingState, mDhcpHaveLeaseState);
addState(mDhcpRebindingState, mDhcpHaveLeaseState);
addState(mDhcpDecliningState, mDhcpHaveLeaseState);
addState(mDhcpInitRebootState, mDhcpState);
addState(mDhcpRebootingState, mDhcpState);
// CHECKSTYLE:ON IndentationCheck
DhcpClient$StoppedState:
CMD_START_DHCP
startInitRebootOrInit()
preDhcpTransitionTo(mWaitBeforeStartState, mDhcpInitState)
transitionTo(mWaitBeforeStartState)
DhcpState.enter()
clearDhcpState()
initInterface() && initUdpSocket()
mDhcpPacketHandler = new DhcpPacketHandler(getHandler())
mDhcpPacketHandler.start()
WaitBeforeOtherState.enter()
mController.sendMessage(CMD_PRE_DHCP_ACTION) => IpClient => ClientModeImpl$IpClientCallbacksImpl
transitionTo(mDhcpInitState)
DhcpInitState.enter()
PacketRetransmittingState.enter()
sendMessage(CMD_KICK)
CMD_KICK
DhcpInitState.sendPacket()
sendDiscoverPacket()
transmitPacket(packet, "DHCPDISCOVER", DhcpPacket.ENCAP_L2, INADDR_BROADCAST)
scheduleKick()
startNewTransaction()
mDhcpPacketHandler.transmitPacket(buf, mInterfaceBroadcastAddr)
DhcpPacketHandler.handlePacket() <= receive packet
sendMessage(CMD_RECEIVED_PACKET, packet)
PacketRetransmittingState.CMD_RECEIVED_PACKET
DhcpInitState.receivePacket(packet)
receiveOfferOrAckPacket(packet, isDhcpRapidCommitEnabled())
packet instanceof DhcpOfferPacket
transitionTo(mDhcpRequestingState)
PacketRetransmittingState.enter()
sendMessage(CMD_KICK)
CMD_KICK
DhcpRequestingState.sendPacket()
sendRequestPacket()
packet instanceof DhcpAckPacket
confirmDhcpLease(packet, results)
transitionTo(isDhcpIpConflictDetectEnabled() ? mIpAddressConflictDetectingState : mConfiguringInterfaceState)
transitionTo(mConfiguringInterfaceState)
ConfiguringInterfaceState.enter()
notifySuccess()
mController.sendMessage(CMD_CONFIGURE_LINKADDRESS, mDhcpLease.ipAddress) => IpClient$RunningState
mInterfaceCtrl.setIPv4Address(ipAddress)
mDhcpClient.sendMessage(DhcpClient.EVENT_LINKADDRESS_CONFIGURED)
ConfiguringInterfaceState.EVENT_LINKADDRESS_CONFIGURED
transitionTo(mDhcpBoundState)
DhcpBoundState.enter()
connectUdpSock(mDhcpLease.serverAddress)
scheduleLeaseTimers()
logTimeToBoundState()
InterfaceController.setIPv4Address(ipAddress)
setInterfaceConfiguration(address, null)
mNetd.interfaceSetCfg(ifConfig)
这里简单记录一下Wi-Fi DHCP过程,后面有空再扩展。
# 总结 以上就是今天要讲的内容,本文仅仅简单介绍了Wi-Fi DHCP的过程。