android ethernet DHCP小记(接上篇)

在上一篇中有提到是java层EthernetStateTaracker接受到消息EVENT_DHCP_START,会调用NetworkUtils.runDhcp(mInterfaceName, mDhcpInfo),这个接口在android_net_NetUtils.cpp中有实现,通过jni调用。

static jboolean android_net_utils_runDhcp(JNIEnv* env, jobject clazz, jstring ifname, jobject info)
{
    int result;
    in_addr_t ipaddr, gateway, mask, dns1, dns2, server;
    uint32_t lease;

    const char *nameStr = env->GetStringUTFChars(ifname, NULL);
    result = ::dhcp_do_request(nameStr, &ipaddr, &gateway, &mask,
                                        &dns1, &dns2, &server, &lease); //在system/core/libnetutils/dhcp_utils.c中实现
    env->ReleaseStringUTFChars(ifname, nameStr);
    if (result == 0 && dhcpInfoFieldIds.dhcpInfoClass != NULL) {
        env->SetIntField(info, dhcpInfoFieldIds.ipaddress, ipaddr);
        env->SetIntField(info, dhcpInfoFieldIds.gateway, gateway);
        env->SetIntField(info, dhcpInfoFieldIds.netmask, mask);
        env->SetIntField(info, dhcpInfoFieldIds.dns1, dns1);
        env->SetIntField(info, dhcpInfoFieldIds.dns2, dns2);
        env->SetIntField(info, dhcpInfoFieldIds.serverAddress, server);
        env->SetIntField(info, dhcpInfoFieldIds.leaseDuration, lease);
    }
    return (jboolean)(result == 0);

其中dhcp_do_request里有调用do_dhcp申请ip地址,并get_dhcp_info( ipaddr,  gateway, mask,  dns1,  dns2,  server, lease)获取ip地址信息,并通过上面rundhcp接口

env->SetIntField(info, dhcpInfoFieldIds.ipaddress, ipaddr);
...
设置信息到mDhcpInfo对象中。


1.下面这层都在/system/core/libnetutils/下,编译之后生成一个so库文件,这是真正实现请求并分配ip地址的模块。
do_dhcp在dhcpclient.c中实现,并调用dhcp_init_ifc(iname),iname是网卡名字。

int do_dhcp(char *iname)
{
 #if 0 
    g_dhcp_mode++;
    LOGI("do_dhcp g_dhcp_mode = %d",g_dhcp_mode);
	LOGI("get iname = %s",iname);
	if(memcmp(iname,"eth1",strlen("eth1")) == 0){	
		iname="eth0";
		dhcp_flag=1;
	}else{
		dhcp_flag=0;
	}
#endif 	
    if (ifc_set_addr(iname, 0)) {
        printerr("failed to set ip addr for %s to 0.0.0.0: %s\n", iname, strerror(errno));
        return -1;
    }

    if (ifc_up(iname)) {
        printerr("failed to bring up interface %s: %s\n", iname, strerror(errno));
        return -1;
    }
	sleep(2);
    return dhcp_init_ifc(iname);
}


2.接下来是真正dhcp原理的东东,这里有很详细的介绍http://download.csdn.net/detail/new_abc/4520361(还好是免费的资源O(∩_∩)O)
主要有5消息,其中第4个和第7个我没怎么见过╮(╯▽╰)╭,大家看上面那个dhcp.ppt吧:
    Value=1,标示DHCP Discover
    Value=2,标示DHCP Offer
    Value=3,标示DHCP Request
    Value=4,标示DHCP Decline(略)
    Value=5,标示DHCP ACK(请求到有效地址)
    Value=6,标示DHCP NAK (无效地址)
    Value=7,标示DHCP Release(略)


这里有个介绍dhcp几种状态非常详细的地址:http://wenku.baidu.com/view/dcbd91395727a5e9856a61fd.html


 以下内容一起研究补充。。。。。。。。。。


http://blog.csdn.net/new_abc/article/details/7898543


转载于:https://my.oschina.net/blackylin/blog/91054

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值