转:http://blog.csdn.net/stevenliyong/archive/2010/04/23/5520320.aspx


Link-local IPv4 addresses

There are some implementations available:

  • Windows and Mac OS have both supported link-local addresses since 1998. Apple released its open-source implementation in the Darwin bootp package.
  • Avahi contains an implementation of IPv4LL in the avahi-autoipd tool.
  • zcip (Zero-Conf IP)
  • BusyBox can embed a simple IPv4LL implementation
  • Stablebox, a fork from Busybox, offers a slightly modified IPv4LL implementation named llad.
  • zeroconf, a package based on Simple IPv4LL, a shorter implementation by Arthur van Hoff.[15]

The above implementations are all stand-alone daemons or plugins for DHCP clients that only deal with link-local IP addresses. Another approach is to include support in new or existing DHCP clients:




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, jobjectclazz, 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失败
setpropdhcp.${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)
setpropdhcp.${interface}.ipaddress"${new_ip_address}"
setpropdhcp.${interface}.gateway "${new_routers%% *}"
setpropdhcp.${interface}.mask "${new_subnet_mask}"
setpropdhcp.${interface}.leasetime"${new_dhcp_lease_time}"
setpropdhcp.${interface}.server "${new_dhcp_server_identifier}"

setpropdhcp.${interface}.result "ok"
;;

#EXPIRE|FAIL|IPV4LL|STOP)
EXPIRE|FAIL|STOP)
setpropdhcp.${interface}.result "failed"
;;

更多相关文章

  1. 让Android设备永不锁屏
  2. android usb主从设备模式解析,网络连接调试方法
  3. Android联网方式判断
  4. 解决AndroidStudio编译报错:org.gradle.api.internal.artifacts.i
  5. PC通过WIFI连接Android设备,使用ADB
  6. android 修改AVD的存放位置
  7. 【聊天室】android 简单的聊天室
  8. 手机或android设备连接电脑,但是adb devices找不到设备。
  9. Android系统固件包解包、修改(涉及root提权)、打包

随机推荐

  1. Android(安卓)NDK配、编译、调试
  2. Android中AutoCompleteTextView完整示例(
  3. 控制来电显示的Android
  4. android 点击效果动画增强
  5. java---避免空指针
  6. Android(安卓)- 事件模型
  7. Android(安卓)小游戏 2048
  8. 基于ActionbarActivity中Actionbar自定义
  9. Android常用动画Animation的使用
  10. Android数据库设计