1. 程式人生 > >Android Wi-Fi原始碼分析之wpa_supplicant初始化(四):wpa_supplicant_init_iface函式分析

Android Wi-Fi原始碼分析之wpa_supplicant初始化(四):wpa_supplicant_init_iface函式分析

wpa_config_read分析

路徑為:external\wpa_supplicant_8\wpa_supplicant\config_file.c

struct wpa_config * wpa_config_read(const char *name, struct wpa_config *cfgp)
{
    FILE *f;
    char buf[512], *pos;
    int errors = 0, line = 0;
    struct wpa_ssid *ssid, *tail = NULL, *head = NULL;
    struct wpa_cred *cred, *cred_tail = NULL
, *cred_head = NULL; struct wpa_config *config;/*配置檔案在程式碼中對應的資料結構*/ int id = 0; int cred_id = 0; if (name == NULL) return NULL; if (cfgp) config = cfgp; else config = wpa_config_alloc_empty(NULL, NULL); if (config == NULL) { wpa_printf(MSG_ERROR, "Failed to allocate config file "
"structure"); return NULL; } head = config->ssid; cred_head = config->cred; wpa_printf(MSG_DEBUG, "Reading configuration file '%s'", name); f = fopen(name, "r"); if (f == NULL) { wpa_printf(MSG_ERROR, "Failed to open config file '%s', " "error: %s"
, name, strerror(errno)); os_free(config); return NULL; } while (wpa_config_get_line(buf, sizeof(buf), f, &line, &pos)) { if (os_strcmp(pos, "network={") == 0) { /*讀取配置檔案中的network項, 並將其轉化成一個wpa_ssid型別的物件*/ ssid = wpa_config_read_network(f, &line, id++); if (ssid == NULL) { wpa_printf(MSG_ERROR, "Line %d: failed to " "parse network block.", line); errors++; continue; } if (head == NULL) {/*wpa_ssid通過next成員變數構成了一個單項鍊表*/ head = tail = ssid; } else { tail->next = ssid; tail = ssid; } /*network項屬於配置檔案的一部分, 故wpa_ssid物件也包含在wpa_config物件中*/ if (wpa_config_add_prio_network(config, ssid)) { wpa_printf(MSG_ERROR, "Line %d: failed to add " "network block to priority list.", line); errors++; continue; } } else if (os_strcmp(pos, "cred={") == 0) { cred = wpa_config_read_cred(f, &line, cred_id++); if (cred == NULL) { wpa_printf(MSG_ERROR, "Line %d: failed to " "parse cred block.", line); errors++; continue; } if (cred_head == NULL) { cred_head = cred_tail = cred; } else { cred_tail->next = cred; cred_tail = cred; } #ifndef CONFIG_NO_CONFIG_BLOBS } else if (os_strncmp(pos, "blob-base64-", 12) == 0) { if (wpa_config_process_blob(config, f, &line, pos + 12) < 0) { wpa_printf(MSG_ERROR, "Line %d: failed to " "process blob.", line); errors++; continue; } #endif /* CONFIG_NO_CONFIG_BLOBS */ } else if (wpa_config_process_global(config, pos, line) < 0) { wpa_printf(MSG_ERROR, "Line %d: Invalid configuration " "line '%s'.", line, pos); errors++; continue; } } fclose(f); config->ssid = head; wpa_config_debug_dump_networks(config); config->cred = cred_head; #ifndef WPA_IGNORE_CONFIG_ERRORS if (errors) { wpa_config_free(config); config = NULL; head = NULL; } #endif /* WPA_IGNORE_CONFIG_ERRORS */ return config; }


wpa_config和wpa_ssid這兩個資料結構都是配置檔案中的資訊在程式碼中的反映. 可以檢視wpa_suppilcant.conf配置模板檔案來了解各個配置項的含義.

wpa_supplicant_init_iface分析

static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
                     struct wpa_interface *iface)
{
...
    /*將wpa_interface中的ifname複製到wpa_supplicant的ifname變數中*/
    os_strlcpy(wpa_s->ifname, iface->ifname, sizeof(wpa_s->ifname));
...
    /* 下面這兩個函式和EAPOL狀態機相關 RSNA Supplicant Key Management - INITIALIZE */
    eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
    eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
...
}


wpa_supplicant_set_driver會根據driver(wlan驅動)名找到wpa_drivers陣列中的nl80211指定的wpa_supplicant中driver的物件wpa_driver_nl80211_ops,然後呼叫它的global_init函式.

路徑:external\wpa_supplicant_8\src\drivers\driver_nl80211.c

相關推薦

Android Wi-Fi原始碼分析wpa_supplicant初始():wpa_supplicant_init_iface函式分析

wpa_config_read分析 路徑為:external\wpa_supplicant_8\wpa_supplicant\config_file.c struct wpa_config * wpa_config_read(const char *na

Android Wi-Fi原始碼分析wpa_supplicant初始(三):wpa_supplicant_add_iface函式分析

路徑為:external\wpa_supplicant_8\wpa_supplicant\wpa_supplicant.c /** * wpa_supplicant_add_iface - Add a new network interface * @

Android Wi-Fi原始碼分析wpa_supplicant初始(一)

一. wpa_supplicant配置編譯 將對應的平臺的wpa_supplicant包解壓改名為wpa_supplicant_8替換掉external下的wpa_supplicant_8目錄 執行: source build/envsetup.sh

Android4.4 wpa_supplicant深入分析wpa_supplicant初始流程

Android系統中,wpa_supplicant啟動是通過“setprop ctrl.start wpa_supplicant”來觸發init程序去fork一個子程序來完成的。wpa_supplicant在init配置檔案中被定義為一個service。

Android Wi-Fi原始碼分析WifiService操作Wi-Fi(一):分析Wifi.c中的wifi_load_driver()函式

Wi-Fi原始碼分析之WifiService操作Wi-Fi(一) 分析Wifi.c中的wifi_load_driver()函式 int wifi_load_driver() { AL

Android Wi-Fi原始碼分析WifiService操作Wi-Fi(二):WifiStateMachine.java中的SUP_CONNECTION_EVENT分析

Wi-Fi原始碼分析之WifiService操作Wi-Fi(二) 一. SupplicantStartingState中的的processMessage方法分析 public boolean processMessage(Messag

Spring Security4.0.3原始碼分析FilterChainProxy初始

最近在學習安全框架Spring Security,想弄清楚其中實現的具體步驟,於是下定決心,研究一下Spring Security原始碼,這篇部落格的目的是想把學習過程記錄下來。學習過程中主要參考了http://dead-knight.iteye.com/blo

玩轉「Wi-Fi」系列wpa_supplicant 介紹(七)

簡介 wpa_supplicant是Linux BSD, Mac OSX和Windows的WPA的服務,支援WPA和WPA2(IEEE 802.11i/RSN),它適用於桌上型電腦/筆記本和嵌入式系統,Supplicant是在客戶端站中使用的IEEE 802.1

玩轉「Wi-Fi」系列wpa_supplicant

命令啟動 wpa_supplicnt 一般通過如下引數進行啟動: wpa_supplicant -Dnl80211 -iwlan0 -c/etc/wpa_supplicant.conf 其中比較主要的是-c引數, 指定啟動配置檔案。配置檔案的模板

Spring MVC原始碼分析DispatcherServlet初始過程

DispatcherServelt本質是也是Servlet,由Servlet容器進行載入。 1.Servlet介面提供了Servlet的初始化方法:init(ServletConfig config)。 2.GenericServlet實現了方法init(S

Spring原始碼分析容器初始

AnnotationConfigApplicationContext 核心類,BeanDefinition註冊器,所有的BeanD

第3階段——內核啟動分析start_kernel初始函數(5)

本質 aware 字符 信息 異常 性能 ack ifdef 取數 內核啟動分析之start_kernel初始化函數(init/main.c) stext函數啟動內核後,就開始進入start_kernel初始化各個函數, 下面只是淺嘗輒止的描述一下函數的功能,很多函數真正理

Mybatis原始碼解析Mybatis初始過程

一、搭建一個簡單的Mybatis工程 為了瞭解Mybatis的初始化過程,這裡需要搭建一個簡單的Mybatis工程操作資料庫,工程結構如下: 一個UserBean.java private int id; private String user

Dubbo原始碼解析consumer初始

閱讀須知 dubbo版本:2.6.0 spring版本:4.3.8 文章中使用/* */註釋的方法會做深入分析 正文 dubbo的consumer由ReferenceBean初始化,我們先來看一下這個類的層次結構: 我們看到ReferenceBean實現了

指紋識別分析framework初始流程

1、概述   在系統開機的時候,會建立systemserver程序,該程序會啟動framework層的各種後臺服務,其中包括FingerprintService、fingerprintd等服務。初始化流程時序如下: 2、SystemServer.java

python資料分析numpy初始(一)

以下都用numpy的標準“import numpy as np” 1.numpy是同構資料多維容器,同構即資料型別相同 2.初始化: 2.1np.arange([start,] end [, step

Linux核心原始碼分析--系統時間初始(kernel_mktime()函式

        從boot檔案中的幾個彙編程式執行後跳轉到init檔案中的main.c程式開始繼續執行,該main.c函式式為系統執行的環境進行初始化的。首先來看系統時間的初始化(因為系統時間的初始化開始程式就在init檔案中),其中主要還是由kernel中的mktime.

springboot原始碼解析SpringApplication初始、啟動

開發十年,就只剩下這套架構體系了! >>>   

flask基礎app初始()

templates 定靜 縮小 path 通訊協議 handle before rom fir 前言 flask的核心對象是Flask,它定義了flask框架對於http請求的整個處理邏輯。隨著服務器被啟動,app被創建並初始化,那麽具體的過程是這樣的呢? 系列文章 fl

Android wpa_supplicant原始碼分析--啟動全域性初始

1. wpa_supplicant簡介 wpa_supplicant是用來用來支援無線中各種加密方式的,包括WEP、WPA/WPA2和WAPI(中國特有)、EAP(8021x)。wpa_s通過socket與上層(framework)和底層(driver)通訊,向上接收命令和傳