source: trunk/package/base-files/files/lib/network/config.sh @ 9634

Last change on this file since 9634 was 9634, checked in by nbd, 9 years ago

fix ppp issues (thanks to Fatus for debugging this)

  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 6.1 KB
Line 
1#!/bin/sh
2# Copyright (C) 2006 OpenWrt.org
3
4# DEBUG="echo"
5
6find_config() {
7        local iftype device iface ifaces ifn
8        for ifn in $interfaces; do
9                config_get iftype "$ifn" type
10                config_get iface "$ifn" ifname
11                case "$iftype" in
12                        bridge) config_get ifaces "$ifn" ifnames;;
13                esac
14                config_get device "$ifn" device
15                for ifc in $device $iface $ifaces; do
16                        [ ."$ifc" = ."$1" ] && {
17                                echo "$ifn"
18                                return 0
19                        }
20                done
21        done
22
23        return 1;
24}
25
26scan_interfaces() {
27        local cfgfile="$1"
28        local mode iftype iface ifname device
29        interfaces=
30        config_cb() {
31                case "$1" in
32                        interface)
33                                config_set "$2" auto 1
34                        ;;
35                esac
36                config_get iftype "$CONFIG_SECTION" TYPE
37                case "$iftype" in
38                        interface)
39                                config_get proto "$CONFIG_SECTION" proto
40                                append interfaces "$CONFIG_SECTION"
41                                config_get iftype "$CONFIG_SECTION" type
42                                config_get ifname "$CONFIG_SECTION" ifname
43                                config_set "$CONFIG_SECTION" device "$ifname"
44                                case "$iftype" in
45                                        bridge)
46                                                config_set "$CONFIG_SECTION" ifnames "$ifname"
47                                                config_set "$CONFIG_SECTION" ifname br-"$CONFIG_SECTION"
48                                        ;;
49                                esac
50                                ( type "scan_$proto" ) >/dev/null 2>/dev/null && eval "scan_$proto '$CONFIG_SECTION'"
51                        ;;
52                esac
53        }
54        config_load "${cfgfile:-network}"
55}
56
57add_vlan() {
58        local vif="${1%\.*}"
59       
60        [ "$1" = "$vif" ] || ifconfig "$1" >/dev/null 2>/dev/null || {
61                ifconfig "$vif" up 2>/dev/null >/dev/null || add_vlan "$vif"
62                $DEBUG vconfig add "$vif" "${1##*\.}"
63        }
64}
65
66# Create the interface, if necessary.
67# Return status 0 indicates that the setup_interface() call should continue
68# Return status 1 means that everything is set up already.
69
70prepare_interface() {
71        local iface="$1"
72        local config="$2"
73
74        # if we're called for the bridge interface itself, don't bother trying
75        # to create any interfaces here. The scripts have already done that, otherwise
76        # the bridge interface wouldn't exist.
77        [ "br-$config" = "$iface" -o -e "$iface" ] && return 0;
78       
79        ifconfig "$iface" 2>/dev/null >/dev/null && {
80                # make sure the interface is removed from any existing bridge and brought down
81                ifconfig "$iface" down
82                unbridge "$iface"
83        }
84
85        # Setup VLAN interfaces
86        add_vlan "$iface"
87        ifconfig "$iface" 2>/dev/null >/dev/null || return 0
88
89        # Setup bridging
90        config_get iftype "$config" type
91        config_get stp "$config" stp
92        case "$iftype" in
93                bridge)
94                        [ -x /usr/sbin/brctl ] && {
95                                ifconfig "br-$config" 2>/dev/null >/dev/null && {
96                                        $DEBUG brctl addif "br-$config" "$iface"
97                                        # Bridge existed already. No further processing necesary
98                                } || {
99                                        $DEBUG brctl addbr "br-$config"
100                                        $DEBUG brctl setfd "br-$config" 0
101                                        $DEBUG ifconfig "br-$config" up
102                                        $DEBUG brctl addif "br-$config" "$iface"
103                                        $DEBUG brctl stp "br-$config" ${stp:-off}
104                                        # Creating the bridge here will have triggered a hotplug event, which will
105                                        # result in another setup_interface() call, so we simply stop processing
106                                        # the current event at this point.
107                                }
108                                ifconfig "$iface" up 2>/dev/null >/dev/null
109                                return 1
110                        }
111                ;;
112        esac
113        return 0
114}
115
116setup_interface() {
117        local iface="$1"
118        local config="$2"
119        local proto
120        local macaddr
121
122        [ -n "$config" ] || {
123                config=$(find_config "$iface")
124                [ "$?" = 0 ] || return 1
125        }
126        proto="${3:-$(config_get "$config" proto)}"
127       
128        prepare_interface "$iface" "$config" || return 0
129       
130        [ "$iface" = "br-$config" ] && {
131                # need to bring up the bridge and wait a second for
132                # it to switch to the 'forwarding' state, otherwise
133                # it will lose its routes...
134                ifconfig "$iface" up
135                sleep 1
136        }
137       
138        # Interface settings
139        config_get mtu "$config" mtu
140        config_get macaddr "$config" macaddr
141        grep "$iface:" /proc/net/dev > /dev/null && \
142                $DEBUG ifconfig "$iface" ${macaddr:+hw ether "$macaddr"} ${mtu:+mtu $mtu} up
143        uci set "/var/state/network.$config.ifname=$iface"
144
145        pidfile="/var/run/$iface.pid"
146        case "$proto" in
147                static)
148                        config_get ipaddr "$config" ipaddr
149                        config_get netmask "$config" netmask
150                        config_get ip6addr "$config" ip6addr
151                        [ -z "$ipaddr" -o -z "$netmask" ] && [ -z "$ip6addr" ] && return 1
152                       
153                        config_get gateway "$config" gateway
154                        config_get ip6gw "$config" ip6gw
155                        config_get dns "$config" dns
156                        config_get bcast "$config" broadcast
157                       
158                        [ -z "$ipaddr" ] || $DEBUG ifconfig "$iface" "$ipaddr" netmask "$netmask" broadcast "${bcast:-+}"
159                        [ -z "$ip6addr" ] || $DEBUG ifconfig "$iface" add "$ip6addr"
160                        [ -z "$gateway" ] || $DEBUG route add default gw "$gateway"
161                        [ -z "$ip6gw" ] || $DEBUG route -A inet6 add default gw "$ip6gw"
162                        [ -z "$dns" ] || {
163                                for ns in $dns; do
164                                        grep "$ns" /tmp/resolv.conf.auto 2>/dev/null >/dev/null || {
165                                                echo "nameserver $ns" >> /tmp/resolv.conf.auto
166                                        }
167                                done
168                        }
169
170                        env -i ACTION="ifup" INTERFACE="$config" DEVICE="$iface" PROTO=static /sbin/hotplug-call "iface" &
171                ;;
172                dhcp)
173                        # prevent udhcpc from starting more than once
174                        lock "/var/lock/dhcp-$iface"
175                        pid="$(cat "$pidfile" 2>/dev/null)"
176                        [ -d "/proc/$pid" ] && grep udhcpc "/proc/${pid}/cmdline" >/dev/null 2>/dev/null && {
177                                lock -u "/var/lock/dhcp-$iface"
178                                return 0
179                        }
180
181                        config_get ipaddr "$config" ipaddr
182                        config_get netmask "$config" netmask
183                        config_get hostname "$config" hostname
184                        config_get proto1 "$config" proto
185                        config_get clientid "$config" clientid
186
187                        [ -z "$ipaddr" ] || \
188                                $DEBUG ifconfig "$iface" "$ipaddr" ${netmask:+netmask "$netmask"}
189
190                        # don't stay running in background if dhcp is not the main proto on the interface (e.g. when using pptp)
191                        [ ."$proto1" != ."$proto" ] && dhcpopts="-n -q"
192                        $DEBUG eval udhcpc -t 0 -i "$iface" ${ipaddr:+-r $ipaddr} ${hostname:+-H $hostname} ${clientid:+-c $clientid} -b -p "$pidfile" ${dhcpopts:- -R &}
193                        lock -u "/var/lock/dhcp-$iface"
194                ;;
195                *)
196                        if ( eval "type setup_interface_$proto" ) >/dev/null 2>/dev/null; then
197                                eval "setup_interface_$proto '$iface' '$config' '$proto'" 
198                        else
199                                echo "Interface type $proto not supported."
200                                return 1
201                        fi
202                ;;
203        esac
204}
205
206unbridge() {
207        local dev="$1"
208        local brdev
209       
210        [ -x /usr/sbin/brctl ] || return 0
211        brctl show | grep "$dev" >/dev/null && {
212                # interface is still part of a bridge, correct that
213
214                for brdev in $(brctl show | awk '$2 ~ /^[0-9].*\./ { print $1 }'); do
215                        brctl delif "$brdev" "$dev" 2>/dev/null >/dev/null
216                done
217        }
218}
Note: See TracBrowser for help on using the repository browser.