wifi.c とその周辺について
定義されている手続きの呼び出し元をリバースしてみる事に。定義されている手続きは以下。
- static int insmod(const char *, const char *)
- static int rmmod(const char *)
- int do_dhcp_request(int *, int *, int *, int *, int *, int *, int *)
- const char *get_dhcp_error_string(void)
- static int check_driver_loaded(void)
- int wifi_load_driver(void)
- int wifi_unload_driver(void)
- int ensure_config_file_exists(void)
- int wifi_start_supplicant(void)
- int wifi_stop_supplicant(void)
- int wifi_connect_to_supplicant(void)
- int wifi_send_command(struct wpa_ctrl *, const char *, char *, size_t *)
- int wifi_wait_for_event(char *, size_t)
- void wifi_close_supplicant_connection(void)
- int wifi_command(const char *, char *, size_t *)
static なソレはスルーで find |grep してみます。
do_dhcp_request 手続き
プロトタイプは
- int do_dhcp_request(int *, int *, int *, int *, int *, int *, int *)
となってます。
$ find frameworks/ |xargs grep do_dhcp_request frameworks//base/core/jni/android_net_wifi_Wifi.cpp: jboolean succeeded = ((jboolean)::do_dhcp_request(&ipaddr, &gateway, &mask, $
早速中身を見てみます。呼び出しているのは android_net_wifi_doDhcpRequest 手続き。
static jboolean android_net_wifi_doDhcpRequest(JNIEnv* env, jobject clazz, jobject info) { jint ipaddr, gateway, mask, dns1, dns2, server, lease; jboolean succeeded = ((jboolean)::do_dhcp_request(&ipaddr, &gateway, &mask, &dns1, &dns2, &server, &lease) == 0); if (succeeded && dhcpInfoFieldIds.dhcpInfoClass != NULL) { env->SetIntField(info, dhcpInfoFieldIds.ipaddress, ipaddr); env->SetIntField(info, dhcpInfoFieldIds.gateway, gateway); env->SetIntField(info, dhcpInfoFieldIds.netmask, mask); env->SetIntField(info, dhcpInfoFieldIds.dns1, dns1); env->SetIntField(info, dhcpInfoFieldIds.dns2, dns2); env->SetIntField(info, dhcpInfoFieldIds.serverAddress, server); env->SetIntField(info, dhcpInfoFieldIds.leaseDuration, lease); } return succeeded; }
static で定義されてますが、手続きが何かに登録されて jni 経由で呼び出されているはず。一番下の JNI registration のあたりになるのか。以下な記述がありました。
{ "doDhcpRequest", "(Landroid/net/DhcpInfo;)Z", (void*) android_net_wifi_doDhcpRequest },
doDhcpRequest で find|grep してみる。
$ find frameworks/ |xargs grep doDhcpRequest frameworks//base/core/jni/android_net_wifi_Wifi.cpp:static jboolean android_net_wifi_doDhcpRequest(JNIEnv* env, jobject clazz, jobject info) frameworks//base/core/jni/android_net_wifi_Wifi.cpp: { "doDhcpRequest", "(Landroid/net/DhcpInfo;)Z", (void*) android_net_wifi_doDhcpRequest }, frameworks//base/wifi/java/android/net/wifi/WifiNative.java: public native static boolean doDhcpRequest(DhcpInfo results); $
WifiNative.java と出ました。しかしこのクラスはある意味 i/f になってるだけなんだよな。framework の中から呼び出されてないのであれば他所からか、って事で external 配下を find|grep してみたんですが、どえらい時間がかかるわ端末重いわで大変でした。
結果はヒット無し。hardware 配下にも無い。覚悟をキメて全体を find|grep してみます。
とほほ
今、loadavg が 9.47 です。端末も心なしかアツい。しかも見つからん、呼び出し元が。これは java 側からの呼び出され、は無いって事なのかな。i/f のみ用意してあるって事?
てーか、dpcp なソレを仕切っているのは誰だ。もうそろそろ限界。