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 なソレを仕切っているのは誰だ。もうそろそろ限界。