wpa_supplicant

とりあえずログを採取したので自宅で見てます。

今日

とりあえず色々ヤッてたんですが、/data/system/wpa_supplicant/ra0 のパーミッションを事前に変更しても駄目でした。init.armadillo500fx.rc の

chmod 0771 /data/system/wpa_supplicant

な記述を

chmod 0771 /data/system/wpa_supplicant wifi wifi

にしたりしてたんですが、駄目。たしか /data/system/wpa_supplicant って一番最初は無いはずなので、って事で再度 tarball から解凍しなおして chroot してみたら、しばらくして突然ファイルが出来ていた。
このあたり、動作の根拠を読めてないので非常に微妙。
ただ、一応 wifi.c の

    ctrl_conn = wpa_ctrl_open(ifname);
    if (ctrl_conn == NULL) {
        LOGE("Unable to open connection to supplicant on \"%s\": %s",
             ifname, strerror(errno));
        return -1;
    }

なメセジはログ出力されなくなっている模様。ただ、wpa_supplicant が正常動作 (?) してない模様。設定がおかしいのかどうかも不明。
ちなみに自宅環境の wpa な設定が以下で

# home
network={
       ssid="MyPlace"
       psk="fuga"
       key_mgmt=WPA-PSK
       proto=WPA
}

接続時の出力が以下 (一部伏せ字)。

CTRL-EVENT-SCAN-RESULTS
Trying to associate with **:**:**:**:**:** (SSID='MyPlace' freq=2412 MHz)
ioctl[SIOCSIWFREQ]: Operation not permitted
Association request to the driver failed
Associated with **:**:**:**:**:**
CTRL-EVENT-SCAN-RESULTS
WPA: Key negotiation completed with **:**:**:**:**:** [PTK=TKIP GTK=TKIP]
CTRL-EVENT-CONNECTED - Connection to **:**:**:**:**:** completed (auth) [id=0 id_str=]

とりあえず

以下なあたりをまず掘削してみます。

03-12 23:49:03.083: DEBUG/wpa_supplicant(4877): Starting AP scan (broadcast SSID)
03-12 23:49:03.083: DEBUG/wpa_supplicant(4877): Scan requested (ret=0) - scan timeout 5 seconds
03-12 23:49:04.103: DEBUG/wpa_supplicant(4877): Setting scan request: 0 sec 0 usec
03-12 23:49:04.103: DEBUG/wpa_supplicant(4877): Starting AP scan (broadcast SSID)
03-12 23:49:04.103: DEBUG/wpa_supplicant(4877): Scan requested (ret=0) - scan timeout 5 seconds
03-12 23:49:09.113: DEBUG/wpa_supplicant(4877): Scan timeout - try to get results
03-12 23:49:09.113: DEBUG/wpa_supplicant(4877): Received 0 bytes of scan results (0 BSSes)
03-12 23:49:09.113: DEBUG/wpa_supplicant(4877): Scan results: 0

最初のログは wpa_supplicant.c にある wpa_supplicant_scan 手続きなんですが、手続き定義が以下なので

static void wpa_supplicant_scan(void *eloop_ctx, void *timeout_ctx)

同じファイルで云々されてるか、関数ポインタな構造体使って export かな、と思ったら両方らしい。とりあえず当たりと思われる手続きが wpa_supplicant_req_scan 手続きでコメントが以下。

/**
 * wpa_supplicant_req_scan - Schedule a scan for neighboring access points
 * @wpa_s: Pointer to wpa_supplicant data
 * @sec: Number of seconds after which to scan
 * @usec: Number of microseconds after which to scan
 *
 * This function is used to schedule a scan for neighboring access points after
 * the specified time.
 */

ふむ。なんとなくですが、これは読み始めな位置を誤ったような気がします。とりあえず方針転換。

最初から

まず以下が出力されている。

03-12 23:48:01.283: DEBUG/wpa_supplicant(4877): Initializing interface 'ra0' conf '/system/etc/wifi/wpa_supplicant.conf' driver 'wext' ctrl_interface 'N/A' bridge 'N/A'

このメセジは wpa_supplicant.c の wpa_supplicant_init_iface という手続きの冒頭で出力されております。微妙に気になるのは ctrl_interface が N/A で出力されているという事。
これは別途で設定される、のがビンゴなのかな。
次に出力されるのが以下か。

03-12 23:48:01.283: DEBUG/wpa_supplicant(4877): Configuration file '/system/etc/wifi/wpa_supplicant.conf' -> '/system/etc/wifi/wpa_supplicant.conf'

同じ手続きにて以下なあたりか。

#ifdef CONFIG_BACKEND_FILE
		wpa_s->confname = os_rel2abs_path(iface->confname);
		if (wpa_s->confname == NULL) {
			wpa_printf(MSG_ERROR, "Failed to get absolute path "
				   "for configuration file '%s'.",
				   iface->confname);
			return -1;
		}
		wpa_printf(MSG_DEBUG, "Configuration file '%s' -> '%s'",
			   iface->confname, wpa_s->confname);
#else /* CONFIG_BACKEND_FILE */
		wpa_s->confname = os_strdup(iface->confname);
#endif /* CONFIG_BACKEND_FILE */
		wpa_s->conf = wpa_config_read(wpa_s->confname);

いっちゃん末端の wpa_config_read 手続きは config_file.c にて定義されている模様。あ、ここでもデバッグプリント出力してますな。

03-12 23:48:01.283: DEBUG/wpa_supplicant(4877): Reading configuration file '/system/etc/wifi/wpa_supplicant.conf'

この手続き、以下な定義の通り

struct wpa_config * wpa_config_read(const char *name)

設定ファイルから読み込んで wpa_config 構造体なメンバに設定エントリな値をセットして構造体のアドレスを戻しております。このあたりはトバすべきだな。次に気になるのは以下な出力。

03-12 23:48:01.583: DEBUG/wpa_supplicant(4877): Initializing interface (2) 'ra0'

これも wpa_supplicant.c に定義されている手続きな模様。

static int wpa_supplicant_init_iface2(struct wpa_supplicant *wpa_s,
				      int wait_for_interface)

この手続きを呼び出しているのは wpa_supplicant_add_iface 手続きなんですが、呼び出し部分が以下。

struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
						 struct wpa_interface *iface)
{
	struct wpa_supplicant *wpa_s;

	if (global == NULL || iface == NULL)
		return NULL;

	wpa_s = wpa_supplicant_alloc();
	if (wpa_s == NULL)
		return NULL;

	if (wpa_supplicant_init_iface(wpa_s, iface) ||
	    wpa_supplicant_init_iface2(wpa_s,
				       global->params.wait_for_interface)) {
		wpa_printf(MSG_DEBUG, "Failed to add interface %s",
			   iface->ifname);
		wpa_supplicant_deinit_iface(wpa_s);
		os_free(wpa_s);
		return NULL;
	}

む、iface2 が呼び出されている、という事は iface な手続きは 0 を戻しているのかな。正常終了であれば 0 が戻るので iface2 も呼び出されるという事か。

なんとなく限界なので

明日引きこもりと化してがっつり読みます。第六感がキいてない感じ。