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

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

但是AndroidWifi 连接的时候还是不能获到 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

Androidframework 在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" ;;

更多相关文章

  1. 修改Android手机的“虚拟机堆大小”和android:largeHeap来防止AP
  2. Android(安卓)Wifi几点
  3. Android(安卓)网络通信——HttpURLConnection
  4. Android图片圆角转换 RoundedImageView开源项目 小记
  5. 修改Android(安卓)程序的icon快捷方式图标和名称
  6. android通过chmod命令实现文件权限修改
  7. Android蓝牙操作
  8. Android修改和添加APN网络
  9. Android库. 1 WIFI相关

随机推荐

  1. 直播技术(从服务端到客户端)一
  2. Android TagFlowLayout完全解析 一款针对
  3. Android Scroller类详解--实现View内容弹
  4. Mix-Editor图文编辑器----Android图文编
  5. Android自定义控件--ProgressButton
  6. Android事件分发机制(下)
  7. 关于利用android-serialport-api实现在安
  8. Android官方文档-App Widgets
  9. App在自己界面奔溃回到首页,状态栏沉浸式
  10. android版本与linux内核版本对应关系