转:http://blog.youkuaiyun.com/stevenliyong/archive/2010/04/23/5520320.aspx
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"
;;
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:
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)
{
}
external/dhcpcd/dhcpcd.h
#define DEFAULT_TIMEOUT 30
Android framework 在30s超时后会强制断开wifi 连接,而dhcpcd只有在30s超时后才会作IPV4LL地址分配,
所以默认情况下永远也不会作IPV4LL.
2. dhcpcd 收到IPV4LL 时会设置Android dhcp失败
综上,如果要使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)
#EXPIRE|FAIL|IPV4LL|STOP)
EXPIRE|FAIL|STOP)