OpenWrt netifd学习笔记

Netifd简介

Netifd是OpenWrt中用于进行网络配置的守护进程,基本上所有网络接口设置以及内核的netlink事件都可以由netifd来处理完成。
在启动netifd之前用户需要将所需的配置写入uci配置文件/etc/config/network中,以告知netifd如何设置这些网络接口,如IP地址、上网类型等。如果在netifd运行过程中需要修改配置,则只需更新并保存/etc/config/network,执行/etc/init.d/network reload,netifd便可根据配置文件差异快速地完成网络接口的更新。

Netifd基本框架

我们配置一个网络接口通常都要完成下面三类工作:
1. MAC地址、设备MTU、协商速率等L2属性,这些都是直接操作实际网络设备的。
2. IP地址、路由(包括应用层的DNS)等L3属性。
3. 设置特定接入方式,如静态IP、DHCP、PPPoE等。设置完成后可能需要更新L3的属性。
我们可以通过上述思路来理解netifd的设计:
Netifd设计框架
拿我们最常用的路由器来讲,作为路由器的使用者我们只关心要配置interface层的哪个接口(LAN口、WAN口?),以及配置成怎样的上网方式。使用netifd配置网络,也是以interface为中心:创建一个interface并指明其依赖的实际网络设备(device),及其绑定的上网方式(proto handler),就完成了一个网络接口的配置并可使其开始工作。当网络状态发生变化时,这三者之间也能相互通知(事件通知或引用计数)以完成自身状态的转换。
例如,在/etc/config/network中对WAN口的配置如下 :

config interface 'wan'
    option ifname 'eth0'
    option proto 'static'
    option mtu '1500'
    option auto '1'
    option netmask '255.255.255.0'
    option ipaddr '192.168.1.100'   
    option gateway '192.168.1.1'
    option dns '8.8.8.8'

Netifd通过读取上述配置,来创建出一个名为”WAN”的interface实例并将其中与interface相关的配置项应用到这个新创建的实例中。同时,如果其指定依赖的设备(ifname)不存在,就通过配置中与device相关的配置项创建一个新的device,并确定二者的依赖(引用)关系。由于proto handler中每一种proto的工作方式是确定的,不依赖于任何配置,因此在netifd启动时就会初始化好所有的proto handler,因而要求配置中的proto一项必须是在netifd中已存在的proto handler的名字。
也可以单独用一个uci section来保存device的配置信息,让netifd先把device创建好。

设备层(Device)

Device是指链路层的设备,在netifd中就特指链路层的网络设备。Netifd中每个设备都用一个struct device结构的实例来表示,例如典型的物理设备、bridge(一个网桥设备实际是对应一个struct bridge_state实例,但和通用设备相关的属性仍放在其dev成员中)、VLAN设备等。
创建好一个设备后,如果要引用

  • 9
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值