1、main啟動建立各種執行個體

NetlinkManager::Start()
bool NetlinkManager::Start() {
if (started_) {
LOG(DEBUG) << "NetlinkManager is already started";
return true;
}
bool setup_rt = SetupSocket(&sync_netlink_fd_);//建立同步socket
if (!setup_rt) {
LOG(ERROR) << "Failed to setup synchronous netlink socket";
return false;
}
setup_rt = SetupSocket(&async_netlink_fd_);//建立異步socket
if (!setup_rt) {
LOG(ERROR) << "Failed to setup asynchronous netlink socket";
return false;
}
// Request family id for nl80211 messages.
if (!DiscoverFamilyId()) {
return false;
}
// Watch socket.
if (!WatchSocket(&async_netlink_fd_)) {//監聽socket
return false;
}
// Subscribe kernel NL80211 broadcast of regulatory changes.
if (!SubscribeToEvents(NL80211_MULTICAST_GROUP_REG)) {
return false;
}
// Subscribe kernel NL80211 broadcast of scanning events.
if (!SubscribeToEvents(NL80211_MULTICAST_GROUP_SCAN)) {
return false;
}
// Subscribe kernel NL80211 broadcast of MLME events.
if (!SubscribeToEvents(NL80211_MULTICAST_GROUP_MLME)) {
return false;
}
started_ = true;
return true;
}
SetupSocket: 建立一個socket并bind一個位址
bool NetlinkManager::SetupSocket(unique_fd* netlink_fd) {
struct sockaddr_nl nladdr;
memset(&nladdr, 0, sizeof(nladdr));
nladdr.nl_family = AF_NETLINK;
netlink_fd->reset(
socket(PF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC, NETLINK_GENERIC));
if (netlink_fd->get() < 0) {
LOG(ERROR) << "Failed to create netlink socket: " << strerror(errno);
return false;
}
// Set maximum receive buffer size.
// Datagram which is larger than this size will be discarded.
if (setsockopt(netlink_fd->get(),
SOL_SOCKET,
SO_RCVBUFFORCE,
&kReceiveBufferSize,
sizeof(kReceiveBufferSize)) < 0) {
LOG(ERROR) << "Failed to set uevent socket SO_RCVBUFFORCE option: " << strerror(errno);
return false;
}
if (bind(netlink_fd->get(),
reinterpret_cast<struct sockaddr*>(&nladdr),
sizeof(nladdr)) < 0) {
LOG(ERROR) << "Failed to bind netlink socket: " << strerror(errno);
return false;
}
return true;
}
2 service與wificond互動類圖
wificond程序 主要管理三大功能:啟動關閉wpa_supplicant, 啟動關閉hostapd, 向驅動發起掃描并擷取掃描資訊。
1、在WifiService(java程序):中通過IWificond.Stub.asInterface(binder)擷取wificond的用戶端binder對象
2、wificond程序:編譯IWifiCond AIDL檔案,生成服務的的BnBinder. 服務端的Service類繼承BnWificond類
實作服務端的binder通信。
3、wificond程序通過socket和系統屬性的propertys 與驅動互動 (比如enableSupplicant)
3、wificond内部互動類圖
對應的類:SupplicantManager strat或者stop supplicant。
HostapdManager start或者stop hostapd。
NetlinkManager:通過socket向驅動n80211發送消息并接受驅動回複的狀态資料。