Android DHCP 启动分析【2】
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】相关推荐
- Android 设置向导启动分析
一.Android 系统启动流程 Bootloader 系统引导 启动 Linux 内核 启动 init 进程 启动 Zygote 进程 启动 SystemServer 进程 启动 Binder 线程 ...
- Android KK(4.4) 以太网和DHCP启动过程介绍
Android KK(4.4) 以太网和DHCP启动过程介绍 1. ethernet启动流程 2. DHCP启动过程 2.1 JNI层接口 2.2 DHCP客户端(libnetutils) 2.3 D ...
- android挂载usb设备,android usb挂载分析---MountService启动
在android usb挂载分析----vold启动,我们的vold模块已经启动了,通信的机制也已经建立起来了,接下来我们分析一下MountService的启动,也就是我们FrameWork层的启动, ...
- 【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 | ActivityThread 后续分析 | Application 替换位置 )
文章目录 一.ActivityThread 后续分析 二.ActivityThread 相关源码 三.Application 替换位置 dex 解密时 , 需要将 代理 Application 替换为 ...
- 【Android 性能优化】应用启动优化 ( 安卓应用启动分析 | Launcher 应用启用普通安卓应用 | 应用进程分析 )
文章目录 一. Launcher 应用 startActivitySafely 方法分析 二. Launcher 中的 startActivity(View v, Intent intent, Obj ...
- Android 启动分析 1
1.概述 Android虽然被称作一种操作系统,其实它仍然使用的Linux的kernel.所以本质上可以说,Android是一个适用于移动设备的Linux发行版.也就是说,之前的分析Linux内核的经 ...
- 图解Android - Zygote, System Server 启动分析
Init 是所有Linux程序的起点,而Zygote于Android,正如它的英文意思,是所有java程序的'孵化池'(玩过星际虫族的兄弟都晓得的).用ps 输出可以看到 >adb shell ...
- 分析启动耗时 android,Android app启动耗时分析
首先编译你的程序,打开Android Studio里面的Android Monitor,找到下图的按钮 <img src="//bbsm ...
- android usb挂载分析---MountService启动
在android usb挂载分析----vold启动,我们的vold模块已经启动了,通信的机制也已经建立起来了,接下来我们分析一下MountService的启动,也就是我们FrameWork层的启动, ...
最新文章
- 实现一个完美符合Promise/A+规范的Promise
- 《评人工智能如何走向新阶段》后记(再续25)
- Tkinter模块常用参数(python3)
- 博后招募 | 西湖大学工学院蓝振忠深度学习实验室招募博士后
- java dom xml 换行,dom4j解析xml文件_用DOM解析XML文件,怎么才能让解析出来的文本不用换行_dom解析xml文件...
- 在IIS中部署Asp.net Mvc
- 漫画:如何给女朋友解释为什么200M宽带,打王者荣耀还是会有460的延迟?
- 判断一个字符串的字符是不是唯一
- URAL K-based Numbers(1-3)
- MySQL中的show variables like xxx 详解
- svpwm的matlab模型,SVPWM的matlab仿真实现
- 秒懂!何凯明的深度残差网络PPT是这样的|ICML2016 tutorial
- 思科模拟器 交换机链路聚合(二层、三层)
- pdfFactory Pro的打印首选项设置
- l298n电机哪一端为正_L298N电机驱动模块的使用方法(干货)
- RSS推送技术——打造自己的今日头条
- js中Object.defineProperty()方法的解释
- 汉语未来或将成为最易掌握的语言
- 宅男福利!爬虫实战,爬取原神真人c图片并保存,谁的老婆快抱走
- 嵌入式linux培训教程,嵌入式Linux开发学习之Linux文件系统学习