1 簡介
netifd
管理網絡接口和路由的后台進程。它與內核通信采用Netlink
接口操作。
Netlink
是內核空間和用戶空間的通信機制
netifd
主要包含設備和接口對象。設備代表linux
物理接口或者一個虛擬鏈路接口。例:eth0 ppp
等。
設備類型
simple_device_type : 簡單設備
bridge_device_type : 網橋設備
tunnel_device_type : 隧道設備
macvlan_device_type : 在物理網卡上創建另外一個虛擬網卡
vlandev_device_type : 物理網卡通過vlanid划分為多個網卡
2 netifd
方法
netifd
在ubus
中注冊了三種對象network network.device network.interface
2.1 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
獲取系統支持的協議處理函數
2.2 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
設置狀態
2.3 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"
}
2.4 netifd
文件
:~# /sbin/if
ifconfig ifdown ifstatus ifup
ifup
和ifdown
實際上是東一個文件ifdown
是指向ifup
的軟鏈接。在執行時會判斷執行的文件名稱。然后傳遞相應的參數
這些命令的實質是調用ubus
來實現的
2.5 網絡配置
配置文件在/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 : 指定空閑時間之后將連接關閉