2019独角兽企业重金招聘Python工程师标准>>>

一、DHCP client 和 dhcpcd server直接的信息交互:

Client 和server 通过property_get/set 共享内存来共享信息。

property_get/set(key,value),保存在共享内存中,系统中的各个进程可以通过property_service访问。

二、DHCP 客户端:

启动dhcp 请求:

源码:Gingerbread/System/core/libnetutils/dhcp_utils.c

int dhcp_do_request(const char *interface, in_addr_t *ipaddr, in_addr_t *gateway, in_addr_t *mask, in_addr_t *dns1, in_addr_t *dns2, in_addr_t *server, uint32_t  *lease)

{

property_set(“dhcp_eth0.result”, "");

property_set("ctl.start", "dhcpcd_eth0");

wait_for_property(“init.svc.dhcpcd_eth0”,” running”, 10);

wait_for_property(“dhcp_eth0.result”, NULL, 30);

property_get(“dhcp_eth0.result”, prop_value, NULL));

if (strcmp(prop_value, "ok") == 0) {

fill_ip_info(interface, ipaddr, gateway, mask, dns1, dns2, server, lease);

return 0;

} else {

snprintf(errmsg, sizeof(errmsg), "DHCP result was %s", prop_value);

return -1;

}

}

static void fill_ip_info(const char *interface, in_addr_t *ipaddr, in_addr_t *gateway, in_addr_t *mask, in_addr_t *dns1, in_addr_t *dns2, in_addr_t *server, uint32_t  *lease)

{

property_get(“dhcp.eth0. ipaddress”, prop_value,NULL);

property_get(“dhcp.eth0. gateway”, prop_value,NULL);

property_get(“dhcp.eth0. mask”, prop_value,NULL);

property_get(“dhcp.eth0. dns1”, prop_value,NULL);

property_get(“dhcp.eth0. dns2”, prop_value,NULL);

property_get(“dhcp.eth0. server”, prop_value,NULL);

property_get(“dhcp.eth0. leasetime”, prop_value,NULL);

}

三、Dchpcd 服务端进程:

源码:Gingerbread/external/dhcpcd/dhcpcd.c

Main()

{

dhcp_run(options, &pid_fd);

}

dhcp_run()

{

client_setup(state, options);

for (;;) {

if (r == 0)

r = handle_timeout(state, options); /client状态机处理,发送dhcp 请求/

else if (r > 0) {

handle_dhcp_packet(state, options);

}

handle_timeout(struct if_state *state, const struct options *options)

{

switch(state->state) {

case STATE_RENEW_REQUESTED:

state->state = STATE_REBINDING;

case STATE_INIT:

state->state = STATE_REQUESTING;

}

switch (state->state) {

case STATE_DISCOVERING:

send_message(state, DHCP_DISCOVER, options);

break;

case STATE_REQUESTING:

if (state->options & DHCPCD_INFORM) {

send_message(state, DHCP_INFORM, options);

break;

}

case STATE_RENEWING:

case STATE_REBINDING:

if (iface->raw_fd == -1)

do_socket(state, SOCKET_OPEN);

send_message(state, DHCP_REQUEST, options);

break;

}}

handle_dhcp_packet()àhandle_dhcp()àbind_dhcp()àconfigure()àrun_script()

执行脚本文件/system/etc/dhcpcd/dhcpcd-run-hooks,脚本文件调用setprop命令设置dhcp相关参数,并设置dhcp result.

case "${reason}" in

BOUND|INFORM|REBIND|REBOOT|RENEW|TIMEOUT)

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)

setprop dhcp.${interface}.result "failed"

;;

RELEASE)

setprop dhcp.${interface}.result "released"

;;

转载于:https://my.oschina.net/u/994235/blog/136215

Android DHCP 启动分析【2】相关推荐

  1. Android 设置向导启动分析

    一.Android 系统启动流程 Bootloader 系统引导 启动 Linux 内核 启动 init 进程 启动 Zygote 进程 启动 SystemServer 进程 启动 Binder 线程 ...

  2. Android KK(4.4) 以太网和DHCP启动过程介绍

    Android KK(4.4) 以太网和DHCP启动过程介绍 1. ethernet启动流程 2. DHCP启动过程 2.1 JNI层接口 2.2 DHCP客户端(libnetutils) 2.3 D ...

  3. android挂载usb设备,android usb挂载分析---MountService启动

    在android usb挂载分析----vold启动,我们的vold模块已经启动了,通信的机制也已经建立起来了,接下来我们分析一下MountService的启动,也就是我们FrameWork层的启动, ...

  4. 【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 | ActivityThread 后续分析 | Application 替换位置 )

    文章目录 一.ActivityThread 后续分析 二.ActivityThread 相关源码 三.Application 替换位置 dex 解密时 , 需要将 代理 Application 替换为 ...

  5. 【Android 性能优化】应用启动优化 ( 安卓应用启动分析 | Launcher 应用启用普通安卓应用 | 应用进程分析 )

    文章目录 一. Launcher 应用 startActivitySafely 方法分析 二. Launcher 中的 startActivity(View v, Intent intent, Obj ...

  6. Android 启动分析 1

    1.概述 Android虽然被称作一种操作系统,其实它仍然使用的Linux的kernel.所以本质上可以说,Android是一个适用于移动设备的Linux发行版.也就是说,之前的分析Linux内核的经 ...

  7. 图解Android - Zygote, System Server 启动分析

    Init 是所有Linux程序的起点,而Zygote于Android,正如它的英文意思,是所有java程序的'孵化池'(玩过星际虫族的兄弟都晓得的).用ps 输出可以看到 >adb shell ...

  8. 分析启动耗时 android,Android app启动耗时分析

    首先编译你的程序,打开Android Studio里面的Android Monitor,找到下图的按钮 <img src="//bbsm ...

  9. android usb挂载分析---MountService启动

    在android usb挂载分析----vold启动,我们的vold模块已经启动了,通信的机制也已经建立起来了,接下来我们分析一下MountService的启动,也就是我们FrameWork层的启动, ...

最新文章

  1. 实现一个完美符合Promise/A+规范的Promise
  2. 《评人工智能如何走向新阶段》后记(再续25)
  3. Tkinter模块常用参数(python3)
  4. 博后招募 | 西湖大学工学院蓝振忠深度学习实验室招募博士后
  5. java dom xml 换行,dom4j解析xml文件_用DOM解析XML文件,怎么才能让解析出来的文本不用换行_dom解析xml文件...
  6. 在IIS中部署Asp.net Mvc
  7. 漫画:如何给女朋友解释为什么200M宽带,打王者荣耀还是会有460的延迟?
  8. 判断一个字符串的字符是不是唯一
  9. URAL K-based Numbers(1-3)
  10. MySQL中的show variables like xxx 详解
  11. svpwm的matlab模型,SVPWM的matlab仿真实现
  12. 秒懂!何凯明的深度残差网络PPT是这样的|ICML2016 tutorial
  13. 思科模拟器 交换机链路聚合(二层、三层)
  14. pdfFactory Pro的打印首选项设置
  15. l298n电机哪一端为正_L298N电机驱动模块的使用方法(干货)
  16. RSS推送技术——打造自己的今日头条
  17. js中Object.defineProperty()方法的解释
  18. 汉语未来或将成为最易掌握的语言
  19. 宅男福利!爬虫实战,爬取原神真人c图片并保存,谁的老婆快抱走
  20. 嵌入式linux培训教程,嵌入式Linux开发学习之Linux文件系统学习

热门文章

  1. 分布式并行计算MapReduce
  2. 解压Ubuntu的initrd.img的方法
  3. R语言学习笔记(十一):广义线性模型
  4. CSS内置的几个标准的伪类和伪对象
  5. java中 抽象类+接口
  6. javascript回车完美实现tab切换功能
  7. Flex使用cookie保存登状态
  8. JQuery EasyUI datagrid 复杂表头处理
  9. SPSiteDataQuery
  10. window系统安装hexo