1. 程式人生 > >openwrt 之dhcp客戶端呼叫分析

openwrt 之dhcp客戶端呼叫分析

客戶端程式

[email protected]:/proc/1679# ps -w | grep udh
 1679 root      1484 S    udhcpc -p /var/run/udhcpc-eth0.2.pid -s /lib/netifd/dhcp.script -f -t 0 -i eth0.2 -V 3830d84fd8bc77bf -C

其父程序為 netifd

[email protected]:/proc/1679# cat stat
1679 (udhcpc) S 1593 0 0 0 -1 4194560 167 1266 0 0 0 3 8 6 20 0 1 0 3924 1519616 110 2147483647 4194304 4613096 2146095136 2146093040 1997973920 0 0 4100 114688 2149225712 0 0 18 0 0 0 0 0 0 4678632 4679983 10878976 2146098997 2146099102 2146099102 2146099183 0

[email protected]:/proc/1679# ps | grep netif
 1593 root      1552 S    /sbin/netifd

下面來看udhcpc這個程式是如何被執行的:

首先來看下面的dhcp.sh檔案

[email protected]:/lib/netifd/proto# ls
3g.sh    dhcp.sh  ppp.sh   qmi.sh

找到下面的程式碼

	proto_run_command "$config" udhcpc \
		-p /var/run/udhcpc-$iface.pid \
		-s /lib/netifd/dhcp.script \
		-f -t 0 -i "$iface" \
		${ipaddr:+-r $ipaddr} \
		${hostname:+-H $hostname} \
		${vendorid:+-V $vendorid} \
		$clientid $broadcast $dhcpopts

dhcp客戶端就是通過上面的指令碼呼叫執行的

proto_run_command函式在netifd-proto.sh中有定義
函式的最後一句是:

_proto_notify "$interface"
_proto_notify() {
	local interface="$1"
	local options="$2"
	json_add_string "interface" "$interface"
	ubus $options call network.interface notify_proto "$(json_dump)"
}
最終呼叫的是ubus命令,通知notify_proto。

接下來進入netifd的原始碼裡,在ubus.c檔案中

static struct ubus_method iface_object_methods[] = {
	{ .name = "lds", .handler = netifd_handle_down },
	{ .name = "up", .handler = netifd_handle_up },
	{ .name = "down", .handler = netifd_handle_down },
	{ .name = "status", .handler = netifd_handle_status },
	{ .name = "prepare", .handler = netifd_handle_iface_prepare },
	{ .name = "dump", .handler = netifd_handle_dump },
	UBUS_METHOD("add_device", netifd_iface_handle_device, dev_link_policy ),
	UBUS_METHOD("remove_device", netifd_iface_handle_device, dev_link_policy ),
	{ .name = "notify_proto", .handler = netifd_iface_notify_proto },
	{ .name = "remove", .handler = netifd_iface_remove },
	{ .name = "set_data", .handler = netifd_handle_set_data },
};

notify_proto進入的是netifd_iface_notify_proto函式,執行iface->proto->notify(iface->proto, msg);最終呼叫的是

proto_shell_notify函式->proto_shell_run_command->netifd_start_process->建立子程序並執行

還有個問題沒有解決是,最開始的dhcp.sh是如何被執行的?

該指令碼執行有兩個入口點,第一處在netifd初始化過程中

static void
netifd_parse_script_handler(const char *name, script_dump_cb cb)
{
	struct json_tokener *tok = NULL;
	json_object *obj;
	static char buf[512];
	char *start, *cmd;
	FILE *f;
	int len;

#define DUMP_SUFFIX	" '' dump"

	cmd = alloca(strlen(name) + 1 + sizeof(DUMP_SUFFIX));
	sprintf(cmd, "%s" DUMP_SUFFIX, name);

	f = popen(cmd, "r");
	if (!f)
		return;
...
其執行了dhcp.sh '' dump,通過popen執行並返回json結果

第二處為proto_shell_handler->netifd_start_process->分配子程序執行

以上內容僅供參考

相關推薦

openwrt dhcp客戶呼叫分析

客戶端程式 [email protected]:/proc/1679# ps -w | grep udh  1679 root      1484 S    udhcpc -p /var/run/udhcpc-eth0.2.pid -s /lib/netifd/d

SpringCloud微服務搭建fegin客戶遠端服務呼叫

什麼是Feign Feign是一個宣告式的偽Http客戶端,它使得寫Http客戶端變得更簡單。使用Feign,只需要建立一個介面並註解。它具有可插拔的註解特性,可使用Feign 註解和JAX-RS註解。Feign支援可插拔的編碼器和解碼器。Feign預設集成了Ribbon,並和Eureka結合,預設實現了負

RabbitMQ客戶原始碼分析BlockingCell.md

RabbitMQ-java-client版本 com.rabbitmq:amqp-client:4.3.0 RabbitMQ版本宣告: 3.6.15 BlockingCell BlockingCell,程式碼文件註釋描述為”簡單的一次性IPC機制“,

RabbitMQ客戶原始碼分析(三)Command

RabbitMQ-java-client版本 com.rabbitmq:amqp-client:4.3.0 RabbitMQ版本宣告: 3.6.15 Command Command介面是AMQP方法-引數的容器介面,帶有可選的內容頭(content

RabbitMQ客戶原始碼分析(五)ConsumerWorkSerivce與WorkPool

RabbitMQ-java-client版本 com.rabbitmq:amqp-client:4.3.0 RabbitMQ版本宣告: 3.6.15 WorkPool WorkPool可以認

RabbitMQ客戶原始碼分析(六)IntAllocator

RabbitMQ-java-client版本 com.rabbitmq:amqp-client:4.3.0 RabbitMQ版本宣告: 3.6.15 IntAllocator 用於分配給定範

RabbitMQ客戶原始碼分析(七)Channel與ChannelManager

RabbitMQ-java-client版本 com.rabbitmq:amqp-client:4.3.0 RabbitMQ版本宣告: 3.6.15 Channel uml圖 tran

RabbitMQ客戶原始碼分析(九)RPC請求響應

宣告 Queue宣告、exchange宣告、bind等,這些都是通過同步RPC呼叫 channel.queueDeclare(queueName, durable

zookeeper原始碼分析客戶啟動

ZooKeeper Client Library提供了豐富直觀的API供使用者程式使用,下面是一些常用的API: create(path, data, flags): 建立一個ZNode, path是其路徑,data是要儲存在該ZNode上的資料,flags常用的有: PERSISTEN, PERSIS

WebService學習旅(六)使用Apache Axis2實現WebService客戶呼叫

上節介紹瞭如何使用Axis2 釋出一個WebService,Axis2除了為我們編寫WebService應用帶來了便利,也同樣簡化的客戶端呼叫的過程,本節在上節的基礎上使用Axis2自帶的工具生成客戶端呼叫輔助類,並實現客戶端呼叫程式碼的編寫。 1.將前面下載

ArcGIS網路分析Silverlight客戶最近設施點分析(二)

在上一篇中說了如何實現最近路徑分析,本篇將討論如何實現最近設施點分析。 最近設施點分析實際上和路徑分析有些相識,實現的過程基本一致,不同的是引數的設定,選用的分析圖層為最近設施點網路分析圖層,一般形式為: http://<伺服器名或ip地址>/ArcGIS/re

axis2客戶呼叫免費的webservice服務的例項三axis2使用RPC方式呼叫網上免費WebService

前面兩節我們分別說了呼叫webservice的兩種方式: 下面我們介紹一下第三種方式:axis2使用RPC方式呼叫網上免費WebService  這種方式類似第二種方式,只是用到的類不同,但是這種方式感覺容易出問題。不多說,直接上程式碼 <span style=

Spring CloudFeign客戶

電子商務 springcloud spring cloud springcloud微服務 微服務雲架構 Feign是一個聲明式的Web服務客戶端。這使得Web服務客戶端的寫入更加方便 要使用Feign創建一個界面並對其進行註釋。它具有可插入註釋支持,包括Feign註釋和JAX-RS註釋。F

流媒體協議RTSP客戶的實現20171014

叠代 jrtplib 訪問 pac .cpp 服務端 blog 文件 僅支持 RtspClient是基於jrtplib實現的,目前僅支持h264格式,後續將不斷叠代優化,加入對其他格式的支持,並且將實現RTSP的服務端。 RtspClient的功能是接收服務端過來流,然後寫

SCOM 2016 發現客戶

scom2016 發現客戶端 operations manager 前面的三篇文章向大家詳細介紹了SCOM2016 的部署過程,今天就來和大家分享一下 SCOM 2016的一些基礎功能操作步驟,希望對大家有幫助。關於SCOM 2016的功能,我們的第一篇部署文章已經說了,其實SCOM就是一個管理和

虛擬機dhcp客戶不能連接獲取ip

dhclinet linux dhcp 今天在一臺虛擬機上安裝了dhcp服務,但是另一臺機器始終不能獲取ip地址,配置也大致上沒錯,解決辦法如下:運行命令:dhclient ens33主動獲取ip地址即可。dhclient -r並沒有真正釋放IP,下一次執行dhclient eth1時,沒有dis

SteeltoeConfig客戶

cloud 雲應用 com fig 可擴展 介紹 pps 模式 ons Steeltoe是一款開源項目,其目標是選取源自Netflix及其它公司的工具,使它們能夠運用於.NET社區。它不僅可以在.NET Core上,也可以在.NET Framework 4.X以上使用。此外

webservice服務釋出和客戶呼叫

1.服務端和客戶端增加Maven依賴包,如下 <!-- cxf方式webservice服務 --> <dependency>             <group

憑什麼說AMQP比JMS優秀啊?JMS才是真正實現了一個客戶呼叫多種產品的訊息中介軟體啊

一、AMQP 歷史​ 訊息佇列(Message Queue)起源於一位來自 MIT 的硬體設計教育工作者 Vivek Ranadivé 設想了一種通用軟體匯流排,就像主機板上的匯流排那樣,供其他應用程式接入。Vivek在1983年成立了 Teknekron,高盛等公司作為第一批使用者再金融交易中採用了 Tek

啟動Spring cloud eureka客戶呼叫方 報錯start bean 'eurekaAutoServiceRegistration' NullPointerException

原文地址:https://blog.csdn.net/action_to_success/article/details/79744263 org.springframework.context.ApplicationContextException: Failed to start bean 'e