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 $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

[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。

时间: 2024-08-01 14:52:13

Openwrt netifd ubus解析的相关文章

openwrt netifd 生成resolv.conf.auto

[转载请注明出处:钱国正专栏 http://blog.csdn.net/qianguozheng/article/details/37666829] 起因 为了解决客户反映的openwrt系统上不了网的问题,我们对其进行了远程协助,发现ip可以访问,只是域名访问不了,这就帮助我们定位了问题---DNS. 网上搜寻 找到了个有同样的问题,说是域名服务器不能用,同样是20M光纤拨号,真是巧合啊,到网上搜了这个哥们的网名,找到不少,但是最近发表的不多哦,无果,自己看代码查查. 代码分析 从拨号进行找了

openwrt-rpcd服务ACL配置错误风险分析

前言 openwrt 是一个用于的 路由器 的开源系统. 其他类似的路由器系统相比它的更新速度非常的快,可以看看 github 的更新速度 https://github.com/openwrt/openwrt 感觉以后用到 openwrt 的路由器会越来越多,而且 openwrt 可以直接用 vmware 来运行,也减少了学习的成本. 本文介绍一下 openwrt 的 ubus 机制 以及怎么利用 rpcd 通过 http 来访问 openwrt 里面的 ubus. 最后以一个 cve 为例介绍

openwrt ubus (OpenWrt micro bus 架构)

为了在OpenWrt中提供守护进程和应用程序间的通讯,开发了ubus项目工程.它包含了守护进程.库以及一些额外的帮助程序. 核心部分是ubusd守护进程,它提供了其他守护进程将自己注册以及发送消息的接口.因为这个,接口通过使用Unix socket来实现,并使用TLV(type-length-value)消息. 为了简化软件的开发,可以使用已有的libubus库来使用ubus(连接ubus). 每个守护进程在自己的名称空间中注册自有的路径.每个路径可以提供多个带有不定数量参数的方法,方法可以通过

openwrt ubus简介以及libubus开发说明

简介 ubus是新openwrt引入的一个消息总线,主要作用是实现不同应用程序之间的信息交互. ubus启动后会在后台运行ubusd进程,该进程监听一个unix套接字用于与其他应用程序通信.其他应用程序可基于libubox提供的接口(或自己实现)与其通信. 使用ubus的方式主要有:1.向其注册消息或控制接口.2.向其调用其他应用程序的消息或控制接口.3.向其注册关心的事件. ubus命令使用说明 ubus命令用于控制调试相关ubus接口,主要命令说明如下: - list [<path>]  

openwrt 的/etc/config/wireless 文件解析

原文:http://blog.csdn.net/hui523hui523hui523/article/details/38493725 1.2.2 无线网络Wireless WiFi设置储存在/etc/config/wireless中(目前支持Broadcom, Atheros 和mac80211).当第一次启动路由器时,将会自动检测你的卡并且创建简单的配置文件.默认情况下 'option network lan' 是被注释掉的.它提供了一个非安全的无线网络共享. The WiFi settin

Openwrt 初探

最近想研究一下Openwrt,于是开始搭建openwrt环境,虽然现在没有现成的板子,但是 可以先编译起来. 看了别人的帖子,都推荐使用svn从官网下载源码, svn co svn://svn.openwrt.org/openwrt/trunk/ 但是实际测试发现它的速度太慢了,为了得到官方的源码,从github上找到了它: https://github.com/openwrt-mirror/openwrt 将它下载下来之后,要安装一些必要的包来编译它,我使用的是ubuntu12.04. sud

OpenWrt 上搭建代理服务器squid

想上网,且不受外部限制方法很多,VPN, DNS Proxy, 这次给大家介绍一下Web Proxy.我选的是Squid代理服务器,这款之前就有想研究的冲动, 苦于一直没有时间. 准备: OpenWrt上编译 #make menuconfig ->Network->Web Proxy->Squid. #make 烧写固件 网络拓扑图如下 一切都进展的很顺利. 到了下面就是特别苦恼的事情了,你会遇到千奇百怪的问题,全因一纸squid.conf, 这个配置文件整对了,你离成功也就不远了. 文

嵌入式Linux下开源路由器OpenWRT编译与下载

*************************************************************************************************************************** 作者:EasyWave                                                                   时间:2014.10.26 类别:Linux应用-开源路由器OpenWRT的编译与下载    

编译Openwrt的log

Openwrt配置: Target System (Ralink RT288x/RT3xxx) ---> Subtarget (MT7688 based boards) ---> Target Profile (LinkIt7688) ---> ---------------------------------------------------------------------------------------------------------------------------