openwrt源码分析之netifd

一,注册ubus方法

netifd初始化时会向ubusd(ubus服务端)注册一系列的object与method,

method的添加:在netifd_ubus_init中添加object:main_object,dev_object,wireless_object,iface_object;

method的使用:一些脚本(比如 ifup devstatus等)通过ubus call来执行netifd的method。

int netifd_ubus_init(const char *path)
{
	uloop_init();
	ubus_path = path;

	ubus_ctx = ubus_connect(path);
	if (!ubus_ctx)
		return -EIO;

	DPRINTF("connected as %08x\n", ubus_ctx->local_id);
	ubus_ctx->connection_lost = netifd_ubus_connection_lost;
	netifd_ubus_add_fd();

	netifd_add_object(&main_object);
	netifd_add_object(&dev_object);
	netifd_add_object(&wireless_object);
	netifd_add_iface_object();

	return 0;
}

二,main_object

object name为“network”,method列表如下:

namehandler
resetnetifd_handle_restart
reloadnetifd_handle_reload
add_host_routenetifd_add_host_route
get_proto_handlersnetifd_get_proto_handlers
add_dynamicnetifd_add_dynamic
root@OpenWrt:/# ubus -v list network
'network' @90c358a9
        "restart":{}
        "reload":{}
        "add_host_route":{"target":"String","v6":"Boolean","interface":"String"}
        "get_proto_handlers":{}
        "add_dynamic":{"name":"String"}

三,dev_object

object name为”network.device”,method列表如下:

namehandler
statusnetifd_dev_status
set_aliasnetifd_handle_alias
set_statenetifd_handle_set_state
root@OpenWrt:/# ubus -v list network.device
'network.device' @9fa99d73
        "status":{"name":"String"}
        "set_alias":{"alias":"Array","device":"String"}
        "set_state":{"name":"String","defer":"Boolean"}

四,wireless_object

object name为”network.wireless”,method列表如下:

namehandler
upnetifd_handle_wdev_up
downnetifd_handle_wdev_down
statusnetifd_handle_wdev_status
notifynetifd_handle_wdev_notify
get_validatenetifd_handle_wdev_get_validate
root@OpenWrt:/# ubus -v list network.wireless
'network.wireless' @4cb96ce9
        "up":{}
        "down":{}
        "status":{}
        "notify":{}
        "get_validate":{}

五,face_object

object name为”network.interface”,method列表如下:

namehandler
upnetifd_handle_up
downnetifd_handle_down
statusnetifd_handle_status
preparenetifd_handle_iface_prepare
dumpnetifd_handle_dump
add_devicenetifd_iface_handle_device
remove_devicenetifd_iface_handle_device
notify_protonetifd_iface_notify_proto
removenetifd_iface_remove
set_datanetifd_handle_set_data
root@OpenWrt:/# ubus -v list network.interface
'network.interface' @1193bd55
        "up":{}
        "down":{}
        "status":{}
        "prepare":{}
        "dump":{}
        "add_device":{"name":"String","link-ext":"Boolean"}
        "remove_device":{"name":"String","link-ext":"Boolean"}
        "notify_proto":{}
        "remove":{}
        "set_data":{}

六,init device & interface

netifd中的device代表物理设备,例如eth0

如果需要管理device的状态,则注册一个device_user,device_user绑定到对应的device上,而且包含device event事件的回调函数,如果device的device_user计数为0则device结构体会被自动释放掉。

bridge或vlan是特殊的device,它们可以引用其他device

device的up/down状态由device_user计数决定,claim_device增加device_user计数,则bring up,release_device减少device_user计数,当计数减为0时,则bring down

 

OpenWrt是一个开源的嵌入式操作系统,主要用于路由器和其他网络设备。通过分析OpenWrt源码,我们可以了解其编译过程和目录结构。 OpenWrt源码包括多个子目录,其中最重要的是根目录下的Makefile文件。这个Makefile文件是执行make命令时的入口。在Makefile中,可以定义编译选项、目标和依赖关系。 在Makefile中,有一个名为"world"的目标,它是整个编译过程的入口。在这个目标中,根据是否定义了"OPENWRT_BUILD"变量,会执行不同的逻辑。如果"OPENWRT_BUILD"变量未定义,会执行第一个逻辑;如果定义了,会执行第二个逻辑。 整个编译过程涉及到多个子目录的目标生成。每个子目录都有自己的Makefile文件,用于定义该子目录下的编译选项、目标和依赖关系。通过递归调用子目录的Makefile,可以完成整个OpenWrt的编译过程。 在编译过程中,还包括了内核的编译过程、固件的生成过程和软件包的编译过程。这些过程都在相应的子目录中完成。 总结来说,通过分析OpenWrt源码,我们可以了解其编译过程和目录结构。Makefile文件是整个编译过程的入口,通过递归调用子目录的Makefile,完成各个子目录的目标生成。同时,还包括了内核的编译过程、固件的生成过程和软件包的编译过程。 #### 引用[.reference_title] - *1* *2* *3* [openwrt源码框架解析](https://blog.csdn.net/daidi1989/article/details/53336845)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值