原文地址:http://xinliang.me/blog/?p=149

Openwrt为网络接口管理和配置创建了一个单独的project,netifd。不同于其他发行版上针对同样问题领域采用的方案,netifd的目标是更适合在嵌入式的home-gateway上使用,因此也具有一些特点。

Package组成

netifd包含下面这些组件:

  1. Shell脚本:/sbin/ifup, /sbin/ifdown(link to ifup), /sbin/ifstatus, /sbin/devstatus
  2. init.d脚本:/etc/init.d/network
  3. hotplug2脚本:/etc/hotplug.d/iface/00-netstate, /etc/hotplug.d/iface/10-sysctl
  4. udhcpc脚本:/usr/share/udhcpc/default.script
  5. netifd守护进程binary: /sbin/netifd

下面对这些组件,逐一进行分析,以期理解netifd的基本工作机制.

Shell脚本

/sbin/ifup

如前所述,ifdown实际上是指向ifup的符号链接,因此这两个脚本由同一个文件ifup实现。下面是其语法:

1
2
3
4

syntax: /sbin/{ifup|ifdown} [-a] [-w] [interface]
-a选项指明对所有接口均执行相同的操作,此时interface被忽略.此参数默认为false
-w选项指定是否执行wifi up操作。如果此参数被指定,则wifi up操作不会被执行。如果未指定,则在ifup的时候,wifi up会被执行
interface指定down/up操作的目标接口

ifup的脚本里面,关于wifi的操作是通过/sbin/wifi脚本执行的,所以在这里暂时不讨论。关于normal的if down/up操作,这个脚本是通过ubus命令来实现的。下面是一个if_call() function:

1
2
3
4
5
6

if_call() {
local interface="$1"
for mode in $modes; do
ubus call $interface $mode
done
}

可以看到这个function有一个参数,是interface,然后还使用了一个全局参数, modes, 在ifup脚本里面被定义,如下:

1
2
3
4
5
6
7
8

case "$0" in
*ifdown) modes=down;;
*ifup)
modes="down up"
setup_wifi=1
;;
*) echo "Invalid command: $0";;
esac

所以当执行ifdown lan时,对应的ubus命令为”ubus call network.interface.lan down”;执行ifup lan时,ubus命令为两条,先执行”ubus call network.interface.lan down”,然后是”ubus call network.interface.lan up”.

ubus & ubusd

Openwrt提供了一个ubus系统,它类似于桌面linux系统的dbus,目标也是提供系统级的IPC和RPC。ubus在设计理念上与dbus基本保持一致,区别在于简化的API和简练的模型,以适应于embedded router的特殊环境。
基本上来说, openwrt的ubus由下面几个组件组成:

  1. ubusd,这个是ubus系统的后台进程,负责注册unix domain socket,分派ubus消息和事件等;
  2. ubus,这是一个CLI utility,可以通过它访问ubus系统. ubus的帮助信息如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    Usage: ubus [options] <command></command> [arguments...]
    Options:
    -s : Set the unix domain socket to connect to
    -t : Set the timeout (in seconds) for a command to complete
    -S: Use simplified output (for scripts)
    -v: More verbose output
    Commands:
    - list [] List objects
    - call [] Call an object method
    - listen [...] Listen for events
    - send [] Send an event

    ubus提供的command有4种: list, call, listen & send, 通过这四种command,可以访问注册到ubus系统的服务

  3. 最后是使用ubus的各个应用程序。这些应用程序可以在ubus系统中注册RPC接口,提供相应的服务。而其他程序可以使用这些接口,来访问这些服务。

netifd的ubus RPC接口

netifd在ubus系统中注册了的object如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

root@OpenWrt:/# ubus list -v
'network' @25a06dad
"restart": { }
"reload": { }
"add_host_route": { "target": "String", "v6": "Boolean" }
"get_proto_handlers": { }
'network.device' @9d97d655
"status": { "name": "String" }
"set_alias": { "alias": "(unknown)", "device": "String" }
"set_state": { "name": "String", "defer": "Boolean" }
'network.interface.lan' @f9e7258b
"up": { }
"down": { }
"status": { }
"prepare": { }
"add_device": { "name": "String" }
"remove_device": { "name": "String" }
"notify_proto": { }
"remove": { }
"set_data": { }
'network.interface.loopback' @6d026db0
"up": { }
"down": { }
"status": { }
"prepare": { }
"add_device": { "name": "String" }
"remove_device": { "name": "String" }
"notify_proto": { }
"remove": { }
"set_data": { }
'network.interface.wan' @ade92c65
"up": { }
"down": { }
"status": { }
"prepare": { }
"add_device": { "name": "String" }
"remove_device": { "name": "String" }
"notify_proto": { }
"remove": { }
"set_data": { }

每个object所提供的RPC接口名称,以及接口参数类型都可以通过ubus得到

netifd interface RPC

netifd为每个interface object注册了一组相同的methods,如下:

static struct ubus_method iface_object_methods[] = { { .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 }, UBUS_METHOD("add_device", netifd_iface_handle_device, dev_policy ), UBUS_METHOD("remove_device", netifd_iface_handle_device, dev_policy ), { .name = "notify_proto", .handler = netifd_iface_notify_proto }, { .name = "remove", .handler = netifd_iface_remove }, { .name = "set_data", .handler = netifd_handle_set_data }, };
1
2
3
4
5
6
7
8
9
10
11

static struct ubus_method iface_object_methods[] = {
{ .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 },
UBUS_METHOD("add_device", netifd_iface_handle_device, dev_policy ),
UBUS_METHOD("remove_device", netifd_iface_handle_device, dev_policy ),
{ .name = "notify_proto", .handler = netifd_iface_notify_proto },
{ .name = "remove", .handler = netifd_iface_remove },
{ .name = "set_data", .handler = netifd_handle_set_data },
};

然后可以发现,netifd里面还有一个protocol handler的概念,也就是对不同的interface protocol,可以提供不同的handler,来响应各种可能的事件。最常见的static类型的protocol,内置在netifd中。而dhcp,pppoe等类型的协议,则以shell script的形式提供。

netifd protocol handler插件

netifd的protocol handler插件位于/lib/netifd/proto/目录下,名称统一为*.sh。

转载于:https://www.cnblogs.com/issuelinux/p/4244681.html

Openwrt netifd ubus解析相关推荐

  1. [openwrt] 使用ubus实现

    [openwrt] 使用ubus实现 ubus为openwrt平台开发中的进程间通信提供了一个通用的框架.它让进程间通信的实现变得非常简单,并且ubus具有很强的可移植性,可以很方便的移植到其他lin ...

  2. OpenWRT 跨网段解析 mDNS 域名

    OpenWRT 跨网段解析 mDNS 域名 在局域网中,由于 IP 地址都是动态分配的,很难确定每一台电脑的 IP 地址.此时使用 mDNS 使用局域网域名解析就非常方便. 对于 windows10 ...

  3. ubus c语言例子,openwrt之ubus例子

    好一个ic root@LEDE:/#   ubus call test_ubus helloworld '{"id":1,"msg":"hi" ...

  4. OpenWrt 软路由解析公网IPV6域名访问家庭NAS的问题答疑

    1.非要使用 Padavan 或者 OpenWrt固件的软路由才能IPV6公网访问吗? 答:这个并不是这样的,一般家用路由器都无法放行防火墙规则,这种情况当然无法实现IPV6公网访问,但是少部分路由器 ...

  5. openwrt学习指南

    路由器的硬件构成 路由器的软件构成 路由器固件开发的一般流程 Openwrt常用命令 1.文件.目录类命令:cd cat rm touch mkdir Is mv grep 2.文本编辑器命令:ⅵ 3 ...

  6. openwrt校园网无法登录(登录网页打不开)

    问题描述: 自己淘工控板折腾了软路由,刷上openwrt发现联网不弹校园网登录网页,手动打开也不行. 解决方法: 先说解决方法.进入openwrt后台管理,然后菜单栏找网络→DHCP/DNS,把服务器 ...

  7. 免费内网穿透方案——ZeroTier+OpenWRT

    关于免费内网穿透方案的研究 一直以来在研究一些关于内网穿透的方案,都是一些很不靠谱的营销文章.索性很长一段时间就没了兴趣做这件事情,偶然的机会听到了ZeroTier,居然让我有种发现新大陆的喜悦.可能 ...

  8. OpenWRT基本知识整理

    转载自:http://www.liwangmeng.com/openwrt%E5%9F%BA%E6%9C%AC%E7%9F%A5%E8%AF%86%E5%BD%92%E7%BA%B3/ 目录: 1.O ...

  9. 一点一滴分析LinkIt™ Smart 7688 webUI

    LinkIt 7688提供了一个友好的登录界面,源代码可以在下面的连接下载到: https://github.com/MediaTek-Labs/linkit-smart-7688-webUI 翻译文 ...

  10. 极简主义_网页设计中功能极简主义的真实性要少得多

    极简主义 Written by Jessica Bennett 由杰西卡·贝内特 ( Jessica Bennett)撰写 介绍 (Introduction) "Less is more&q ...

最新文章

  1. flutter离线源码安装包最新版本下载地址
  2. stm32串口通信(初学者对于串口通信的理解)
  3. 绝了!Pandas绘图功能
  4. [Postgres]Postgres复制表
  5. 【CentOS】Tomcat的安装
  6. eweishop 人人商城区别_微擎开发之人人商城添加第三方支付系列
  7. ps缩略图补丁 安装一次之后 失效,卸载重新安装提示这个,是什么原因
  8. 计算机联锁系统组成及工作原理,计算机联锁系统的组成
  9. RPLIDAR A1 slam建图
  10. Adobe Flash Player 不是最新版本
  11. 24节气—霜降文案、海报 , 秋将去,降初霜。
  12. Stm32F4XX开启FPU浮点运算
  13. Pandas中透视表和交叉表
  14. 一位台湾学校校长的演讲
  15. 2023 gitlab添加ssh key
  16. 一文总结 Google I/O 2023
  17. html5制作当当图书榜页面,HTML 网页设计指南
  18. 汽车环境与耐久性测试
  19. 论文阅读:MNC:Instance-aware Semantic Segmentation via Multi-task Network Cascades
  20. 2022-2028中国药物依从性包装系统市场现状研究分析与发展前景预测报告

热门文章

  1. 我的日常Vim使用--凌波微步
  2. Google 出售 Performics
  3. shell脚本批量删除几天前的文件
  4. 树莓派配置RTC时钟(DS3231,I2C接口)
  5. WinForm sender初级应用
  6. editGrid自定义列自定义F7
  7. php字符编码转换问题
  8. 如何着手分析一个行业?
  9. 数据之路 - Python爬虫 - Scrapy框架
  10. iOS开发类似于刮刮卡效果,手指划过的区域形成画笔。适用于取出部分图片(截图),如截取出图片中带文字的区域部分。...