转: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(安卓)WebView的加载超时处理
  3. android的一个编译问题
  4. android Error inflating class com.google.android.material.ch
  5. Android中Broadcast的Intent大全
  6. Android(安卓)头像修改
  7. Android(安卓)studio 3.0和unity交互 Manifest文件修改后正确的
  8. 修改标题栏的高度
  9. android中判断网络是否连接

随机推荐

  1. Android(安卓)SD卡简单的文件读写操作
  2. 零打碎敲学Android(二)—做个拼图游戏吧
  3. Android日志系统Logcat源代码简要分析
  4. android 触摸事件、点击事件的区别
  5. 谈谈Android的一些UI设计
  6. Android切近实战(一)
  7. Android特色开发之传感器和语音识别
  8. Android实现进程之间通信
  9. Android之UI学习篇六:ImageView实现图片旋
  10. Android(安卓)XML属性介绍