天天看點

wificond 啟動hostapd,wpa_supplicant以及掃描1、main啟動建立各種執行個體2 service與wificond互動類圖3、wificond内部互動類圖4、enableSupplicant時序5、掃描類互動圖

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

wificond 啟動hostapd,wpa_supplicant以及掃描1、main啟動建立各種執行個體2 service與wificond互動類圖3、wificond内部互動類圖4、enableSupplicant時序5、掃描類互動圖

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)

wificond 啟動hostapd,wpa_supplicant以及掃描1、main啟動建立各種執行個體2 service與wificond互動類圖3、wificond内部互動類圖4、enableSupplicant時序5、掃描類互動圖

3、wificond内部互動類圖

對應的類:SupplicantManager strat或者stop supplicant。

HostapdManager start或者stop hostapd。

NetlinkManager:通過socket向驅動n80211發送消息并接受驅動回複的狀态資料。

wificond 啟動hostapd,wpa_supplicant以及掃描1、main啟動建立各種執行個體2 service與wificond互動類圖3、wificond内部互動類圖4、enableSupplicant時序5、掃描類互動圖

4、enableSupplicant時序

wificond 啟動hostapd,wpa_supplicant以及掃描1、main啟動建立各種執行個體2 service與wificond互動類圖3、wificond内部互動類圖4、enableSupplicant時序5、掃描類互動圖

5、掃描類互動圖

wificond 啟動hostapd,wpa_supplicant以及掃描1、main啟動建立各種執行個體2 service與wificond互動類圖3、wificond内部互動類圖4、enableSupplicant時序5、掃描類互動圖

繼續閱讀