一,注册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列表如下:
name | handler |
reset | netifd_handle_restart |
reload | netifd_handle_reload |
add_host_route | netifd_add_host_route |
get_proto_handlers | netifd_get_proto_handlers |
add_dynamic | netifd_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列表如下:
name | handler |
status | netifd_dev_status |
set_alias | netifd_handle_alias |
set_state | netifd_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列表如下:
name | handler |
up | netifd_handle_wdev_up |
down | netifd_handle_wdev_down |
status | netifd_handle_wdev_status |
notify | netifd_handle_wdev_notify |
get_validate | netifd_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列表如下:
name | handler |
up | netifd_handle_up |
down | netifd_handle_down |
status | netifd_handle_status |
prepare | netifd_handle_iface_prepare |
dump | netifd_handle_dump |
add_device | netifd_iface_handle_device |
remove_device | netifd_iface_handle_device |
notify_proto | netifd_iface_notify_proto |
remove | netifd_iface_remove |
set_data | netifd_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