13 netifd


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方法

netifdubus中注冊了三種對象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
    設置自動啟動標示變量為autostartfalse
  • 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

ifupifdown實際上是東一個文件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      : 指定空閑時間之后將連接關閉


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM