Android Auto IP Support.

 

Android 自带的dhcpcd 本身是支持IPv4LL AutoIP 功能。

http://roy.marples.name/projects/dhcpcd/

 

但是Android Wifi 连接的时候还是不能获到 IPv4LL 定义的 AutoIP。

 

有两个原因导致Android Wifi 连接不能获得 IPv4LL 定义的 AutoIP。

 

1. Android framework 中 dhcp 的超时时间是30s 而 dhcpcd 默认的超时时间也是30s

frameworks/base/core/jni/android_net_NetUtils.cpp static jboolean android_net_utils_runDhcp(JNIEnv* env, jobject clazz, jstring ifname, jobject info) { return (jboolean)(run_dhcp(env, 30, ifname, info)); }   

external/dhcpcd/dhcpcd.h #define DEFAULT_TIMEOUT 30

 

Android framework 在30s超时后会强制断开wifi 连接,而dhcpcd 只有在30s超时后才会作IPV4LL地址分配,

所以默认情况下永远也不会作IPV4LL.

 

2. dhcpcd 收到IPV4LL 时会设置Android dhcp失败
   setprop dhcp.${interface}.result "failed"

 

 

综上,如果要使Android 支持 AutoIP 功能。 需要作如下两个修改。

 

1. 修改

external/dhcpcd/dhcpcd.h #define DEFAULT_TIMEOUT 10   

这样dhcpcd 10s 超时候继续有机会作IPv4LL 地址分配

 

2. 修改

/system/etc/dhcpcd/dhcpcd-hooks/95-configured

 

使得Android framework 认为IPV4LL 的结果作为dhcp 成功了。

#BOUND|INFORM|REBIND|REBOOT|RENEW|TIMEOUT) BOUND|INFORM|REBIND|REBOOT|RENEW|TIMEOUT|IPV4LL) setprop dhcp.${interface}.ipaddress "${new_ip_address}" setprop dhcp.${interface}.gateway "${new_routers%% *}" setprop dhcp.${interface}.mask "${new_subnet_mask}" setprop dhcp.${interface}.leasetime "${new_dhcp_lease_time}" setprop dhcp.${interface}.server "${new_dhcp_server_identifier}" setprop dhcp.${interface}.result "ok" ;; #EXPIRE|FAIL|IPV4LL|STOP) EXPIRE|FAIL|STOP) setprop dhcp.${interface}.result "failed" ;;

你可能感兴趣的:(android,server,interface)