Openwrt netifd ubus解析(二)_bingyu9875的博客-程序员秘密

技术标签: Openwrt  openwrt  ubus  

Openwrt netifd ubus解析

原文地址: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” role=”presentation” style=”position: relative;”>interfaceinterfacemode
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

[email protected]:/# 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。

分类: openwrt
标签: ubus netifd
0
0
« 上一篇: <转>如何调试makefile
» 下一篇: 突发奇想20150126

posted on 2015-01-23 17:16 古木清风 阅读(1622) 评论(0) 编辑 收藏

</div>
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/bingyu9875/article/details/62047646

智能推荐

聊聊hystrix的fallback_weixin_33676492的博客-程序员秘密

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

补充设定 timer1 定时器和 timer2 定时器定时做多件事_蔚蓝慕的博客-程序员秘密_timer1

7. 补充设定 timer1 定时器和 timer2 定时器定时做多件事(教程)原文地址:https://www.arduino.cn/thread-12452-1-1.html下面仅仅是将原文给编辑一下,原文阅读有困难,看原文时一定看看下面的评论。前面跟大家分享了如何自己设定Arduino内部定时器定时做事,我把在以下两篇中对于暂停/继续 timer1 和 timer2 的 CTC 中断之...

python 读取文件读出来是什么格式-Python文件读写机制_weixin_37988176的博客-程序员秘密

Python提供了必要的函数和方法进行默认情况下的文件基本操作文件打开方式:open(name[,mode[buf]])name:文件路径mode:打开方式buf:缓冲buffering大小文件读取方式:read([size]):读取文件(读取size字节,默认读取全部)readline([size]):读取一行readline([size]) :读取缓冲buf(io.DEFAULT_SET_BU...

java实现滑动验证码_selenium(java)实现滑动图片验证码_产品小龙哥的博客-程序员秘密

/**** 搜索图片位子* @param 二值化之后的背景图* @param 二值化之后的校验图* @return* @throws IOException*/public int searchLocation(File bgImgBinaryFile,File verifyBinaryImgFile) throws IOException {BufferedImage bgImg = Image...

一刷网络投票的小程序_WTK870424的博客-程序员秘密

最近看到网上一投票。下载了个抓包工具简单的抓了下数据包。。。内容如下POST /Vote_doIP.asp HTTP/1.1Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-applicati

Python解析url、提取url参数、提取url数据(Python2、Python3、提取url、端口、协议、路径)_墨痕诉清风的博客-程序员秘密_python获取url参数的type值

Python3from urllib.parse import urlparseurl = 'http://192.168.8.24:8161/11/12.htm'_url = urlparse(url)hostname = _url.hostnameport = _url.porturl_port = _url.netlocurl_path = _url.pathurl_protocol = _url.schemeprint(f'域名:{hostname}\n端口:{port}\n

随便推点

H5 vue 移动端px自动转换rem_时光机上敲代码的博客-程序员秘密_vue h5 px转rem

环境:webpack:3.0+; vue:2.0+方法:使用 postcss-pxtorem插件步骤一:npm i postcss-pxtorem -D 步骤二:在package.json文件中postcss添加配置 "postcss": { "plugins": { "autoprefixer": {}, "postcss-pxtorem": { "rootValue": 37.5, "propList": [..

STM32F103xx(CMSIS)_clkbit的博客-程序员秘密_stm32f103 cmsis 中文

                                                          STM32F103 开发(CMSIS General)--2018-12-13ARM公司通过CMSIS定义了统一的软件标准接口,让软件驱动和中间层接口标准化,软件结构实现统一。芯片供应商在此基础上进一步实现外设访问接口函数,并且提供了大量的实例工程。这样让Cotex-M系统的微控...

Android 实现adb手机投屏_林清溯的博客-程序员秘密_adb投屏

一、接下来讲解一下adb手机投屏这样就不需要每次运行都去手机上看效果了。二、可以看到这个效果图,这个效果就是手机上的效果一目了然,跟使模拟器一样非常的方便,当然也可以使用手机跟电脑在同一WiFI下的话,直接adb连接告别数据线. 这边附上官方地址,如果理解能力强的话可以看看官方文档. 支持各个系统Mac 、Windows、Linux.三、安装流程,接着看图.四、因为Github 不稳定有时候可能会进不去,这边附上命令@"%SystemRoot%\System32\Wi.

R.java常见问题解决方案_kuaidi8的博客-程序员秘密

======================================================注:重要!程序员如何有效的放松身心!下班后做什么?======================================================1. the type r is already defined.(很多时候我们在导入其他人的程序的时候,会遇到这

复现 DLink DIR-859 RCE 漏洞(CVE-2019–20215)_dydymm的博客-程序员秘密

复现 DLink DIR-859 RCE 漏洞(CVE-2019–20215)漏洞介绍漏洞影响漏洞等级环境搭建模拟攻击漏洞原理解决方案漏洞介绍该漏洞允许远程攻击者通过 urn 执行任意操作系统命令:到 /htdocs/cgibin 中 ssdpcgi()中的 M-SEARCH 方法,因为 REMOTE_PORT 处理不当。urn: service/device 的值使用 strstr 函数进行检查,该函数允许攻击者连接由 shell 元字符分隔的任意命令。漏洞影响D-Link DIR-859 1.0

嵌入式Linux第一周作业_tmrzc的博客-程序员秘密_嵌入式系统综合作业

#CPU体系结构的种类特点及应用场合一、ARMARM架构,过去称作进阶精简指令集机器(Advanced RISC Machine,更早称作:Acorn RISC Machine),是一个32位精简指令集(RISC)处理器架构,其广泛地使用在许多嵌入式系统设计。特点:体积小、低功耗、低成本、高性能;支持 Thumb ( 16 位) /ARM ( 32 位)双指令集,能很好的兼容 8 位 /1...

推荐文章

热门文章

相关标签