netifd
管理网络接口和路由的后台进程。它与内核通信采用Netlink
接口操作。
Netlink
是内核空间和用户空间的通信机制
netifd
主要包含设备和接口对象。设备代表linux
物理接口或者一个虚拟链路接口。例:eth0 ppp
等。
simple_device_type : 简单设备 bridge_device_type : 网桥设备 tunnel_device_type : 隧道设备 macvlan_device_type : 在物理网卡上创建另外一个虚拟网卡 vlandev_device_type : 物理网卡通过vlanid划分为多个网卡
netifd
方法netifd
在ubus
中注册了三种对象network network.device network.interface
network
的对象方法restart : netifd_handle_restart 重启 reload : netifd_handle_load 重新读取配置来初始化网络设备 add_host_route : netifd_add_host_route 增加静态主机路由 ubus call network add_host_route '{"target":"192.168.1.20","v6":"false"}' get_proto_handlers : netifd_get_proto_handlers 获取系统支持的协议处理函数
network.device
对象方法network.device
是一个二层设备接口
status : netifd_dev_status 获取物理网卡的状态 ubus call network.device status '{"name":"eth0"}' set_alias : netifd_handle_alias 设置alias set_state : netifd_handle_set_state 设置状态
network.intface
对象方法network.intface
是一个三层接口,可以包含多个二层网卡设备
up : netifd_handle_up 启动接口 down : netifd_handle_down 关闭接口 status : netifd_handle_status 查看接口状态 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 设置额外的存储数据 ubus call network.interface.lan status
notify_proto
注册的shell
命令proto_init_update
proto_run_command
IP
地址命令proto_kill_command
proto_notify_error
proto_block_restart
autostart
为false
proto_set_available
available
proto_add_host_dependency
IP
地址的路由proto_setup_failed
编号为netifd
进程和shell
脚本。预先在netifd-proto.sh
中设置好的。
DHCP
处理过程中首先会调用proto_init_uodate
函数来初始化设备。初始化完成之后通过proto_run_command
命令来启动udhcp
进程获取IP
地址信息。
每一种的协议处理的脚本都放在/lib/netifd/proto
目录下。文件名通常和网络配置文件network
中的协议选项关联起来。
:~# cat /lib/netifd/proto/dhcp.sh #!/bin/sh . /lib/functions.sh #导入通用shell脚本 . ../netifd-proto.sh #导入通用shell脚本 init_proto "$@" ### 协议配置初始化,让netifd知道这个协议所拥有的参数,存储在/etc/config/network配置文件中 proto_dhcp_init_config() { renew_handler=1 proto_config_add_string 'ipaddr:ipaddr' proto_config_add_string 'hostname:hostname' proto_config_add_string clientid proto_config_add_string vendorid proto_config_add_boolean 'broadcast:bool' proto_config_add_string 'reqopts:list(string)' proto_config_add_string iface6rd proto_config_add_string sendopts proto_config_add_boolean delegate proto_config_add_string zone6rd proto_config_add_string zone proto_config_add_string mtu6rd proto_config_add_string customroutes } ### 协议的设置和接口启动。入参:配置节名称,接口名称。 ### 作用:读取配置文件中的参数,然后将参数传递给netifd proto_dhcp_setup() { local config="$1" local iface="$2" local ipaddr hostname clientid vendorid broadcast reqopts iface6rd sendopts delegate zone6rd zone mtu6rd customroutes netmask json_get_vars ipaddr hostname clientid vendorid broadcast reqopts iface6rd sendopts delegate zone6rd zone mtu6rd customroutes netmask local opt dhcpopts for opt in $reqopts; do append dhcpopts "-O $opt" done for opt in $sendopts; do append dhcpopts "-x $opt" done [ "$broadcast" = 1 -o -z "$broadcast" ] && broadcast="-B" || broadcast= [ -n "$clientid" ] && clientid="-x 0x3d:${clientid//:/}" || clientid="-C" [ -n "$iface6rd" ] && proto_export "IFACE6RD=$iface6rd" [ "$iface6rd" != 0 -a -f /lib/netifd/proto/6rd.sh ] && append dhcpopts "-O 212" [ -n "$zone6rd" ] && proto_export "ZONE6RD=$zone6rd" [ -n "$zone" ] && proto_export "ZONE=$zone" [ -n "$mtu6rd" ] && proto_export "MTU6RD=$mtu6rd" [ -n "$customroutes" ] && proto_export "CUSTOMROUTES=$customroutes" [ "$delegate" = "0" ] && proto_export "IFACE6RD_DELEGATE=0" [ -z "$hostname" ] && hostname=$(uci get system.@system[0].hostname) proto_export "INTERFACE=$config" proto_run_command "$config" udhcpc \ -p /var/run/udhcpc-$iface.pid \ -s /lib/netifd/dhcp.script \ -f -t 0 -i "$iface" \ ${ipaddr:+-r $ipaddr} \ ${hostname:+-H $hostname} \ ${vendorid:+-V $vendorid} \ $clientid $broadcast $dhcpopts #set fallback ip ifconfig $iface $ipaddr netmask $netmask } proto_dhcp_renew() { local interface="$1" # SIGUSR1 forces udhcpc to renew its lease local sigusr1="$(kill -l SIGUSR1)" [ -n "$sigusr1" ] && proto_kill_command "$interface" $sigusr1 } ### 接口关闭。入参为uci配置节名称 proto_dhcp_teardown() { local interface="$1" proto_kill_command "$interface" }
netifd
文件:~# /sbin/if ifconfig ifdown ifstatus ifup
ifup
和ifdown
实际上是东一个文件ifdown
是指向ifup
的软链接。在执行时会判断执行的文件名称。然后传递相应的参数
这些命令的实质是调用ubus
来实现的
配置文件在/etc/config/network
中。配置文件定义了二层网络设备和网络接口,路由和策略等。
interface
静态配置选项ifname : 物理网卡接口名称 type :网络类型:如bridge proto :协议配置:static ipaddr :ip地址 netmask :网络掩码 dns :域名服务器地址:如8.8.8.8 mtu :设置接口的mtu地址
interface DHCP
常见配置选项ifname : 设备接口名称。eth0 proto : 协议类型为DHCP hostname : DHCP请求中的主机名,可以不用设置 vendorid : DHCP请求中的厂商ID,可以不用设置 ipaddr : 建议ip地址,可以不用设置
pppoe
使用用户名和,密码进行宽带拨号上网ifname : pppoe使用物理网卡接口名称 proto : 协议为pppoe,采用点对点拨号连接 username : PAP或CHAP认证用户名 password : PAP或CHAP认证密码 demand : 指定空闲时间之后将连接关闭