Openwrt的ifup和ifdown分析

来源:互联网 发布:c罗 知乎 精华 编辑:程序博客网 时间:2024/05/23 13:40

/sbin/ifup脚本源码:

#!/bin/sh                                                                             ifup_all=                                                                             setup_wifi= if_call() {                           local interface="$1"                                                                  for mode in $modes; do                                                                        ubus call network.interface $mode "{ \"interface\" : \"$interface\" }"        done                   }                                      case "$0" in                                   *ifdown) modes=down;;          *ifup)                                 modes="down up"                setup_wifi=1                   ;;                                     *) echo "Invalid command: $0";;esac                         while :; do                                case "$1" in                               -a)                                       ifup_all=1                        shift                ;;                                 -w)                                        setup_wifi=                        shift                                       ;;                                                  *)                                                                       break                                                    ;;                                                       esac                                              done                                                [ "$modes" = "down up" ] && ubus call network reload             if [ -n "$ifup_all" ]; then                                              for interface in `ubus -S list 'network.interface.*'`; do                if_call "${interface##network.interface.}"        done                                         [ -n "$setup_wifi" ] && /sbin/wifi up        exit                                                else                                                                         ubus -S list "network.interface.$1" > /dev/null || {                         echo "Interface $1 not found"                                        exit                   }                              if_call "$1"                       fi                                                                   if [ -n "$setup_wifi" ] && grep -sq config /etc/config/wireless; then        . /lib/functions.sh                          find_related_radios() {                                                       local wdev wnet                                                       config_get wdev "$1" device                                           config_get wnet "$1" network                if [ -n "$wdev" ]; then                                                  for wnet in $wnet; do                                                         if [ "$wnet" = "$network" ]; then                                             append radio_devs "$wdev" "$N"                                fi                                           done                                         fi                                           }                                                     local radio_devs                                      local network="$1"         config_load wireless                                                  config_foreach find_related_radios wifi-iface        local dev                                            for dev in $(echo "$radio_devs" | sort -u); do                /sbin/wifi up "$dev"                          done                                          fi                                     

ifup和ifdown的脚本一模一样,shell代码中做了一下case选择。
如果执行ifup wan , 则关闭wan口,分析一下如何实现
ifup wan之后,进入case选择ifup
设定两个标志位
modes=”down up”
setup_wifi=1
进入while循环

while :; do        case "$1" in                -a)                        ifup_all=1                        shift                ;;                -w)                        setup_wifi=                        shift                ;;                *)                        break                ;;        esacdone

这里解析了ifup -a 和 ifup -w命令

ifup_all 调用了ubus -S list ‘network.interface.*’
然后wifi up

setup_wifi
执行 wifi up

后面的为修改/etc/config/wireless的配置

0 0