add cname section
[openwrt/svn-archive/archive.git] / package / base-files / files / lib / network / config.sh
index 03d7ca1f7a523925a59039268176533e23d51b0d..29d021af92c1ce92a5a891ec421ac25e0bfbd001 100755 (executable)
@@ -9,6 +9,23 @@ do_sysctl() {
                sysctl -n -e "$1"
 }
 
+map_sysctls() {
+       local cfg="$1"
+       local ifn="$2"
+
+       local fam
+       for fam in ipv4 ipv6; do
+               if [ -d /proc/sys/net/$fam ]; then
+                       local key
+                       for key in /proc/sys/net/$fam/*/$ifn/*; do
+                               local val
+                               config_get val "$cfg" "${fam}_${key##*/}"
+                               [ -n "$val" ] && echo -n "$val" > "$key"
+                       done
+               fi
+       done
+}
+
 find_config() {
        local iftype device iface ifaces ifn
        for ifn in $interfaces; do
@@ -89,7 +106,7 @@ add_dns() {
        local dns
        local add
        for dns in "$@"; do
-               grep -qsF "nameserver $dns" /tmp/resolv.conf.auto || {
+               grep -qsE "^nameserver ${dns//./\\.}$" /tmp/resolv.conf.auto || {
                        add="${add:+$add }$dns"
                        echo "nameserver $dns" >> /tmp/resolv.conf.auto
                }
@@ -109,7 +126,7 @@ remove_dns() {
                [ -f /tmp/resolv.conf.auto ] && {
                        local dns=$(uci_get_state network "$cfg" resolv_dns)
                        for dns in $dns; do
-                               sed -i -e "/^nameserver $dns$/d" /tmp/resolv.conf.auto
+                               sed -i -e "/^nameserver ${dns//./\\.}$/d" /tmp/resolv.conf.auto
                        done
                }
 
@@ -135,7 +152,7 @@ sort_list() {
 prepare_interface() {
        local iface="$1"
        local config="$2"
-       local vifmac="$3"
+       local macaddr="$3"
 
        # if we're called for the bridge interface itself, don't bother trying
        # to create any interfaces here. The scripts have already done that, otherwise
@@ -149,13 +166,18 @@ prepare_interface() {
                # make sure the interface is removed from any existing bridge and deconfigured,
                # (deconfigured only if the interface is not set to proto=none)
                unbridge "$iface"
+
+               local mtu macaddr txqueuelen
+               config_get mtu "$config" mtu
+               [ -n "$macaddr" ] || config_get macaddr "$config" macaddr
+               config_get txqueuelen "$config" txqueuelen
+               [ -n "$macaddr" ] && $DEBUG ifconfig "$iface" down
+               $DEBUG ifconfig "$iface" ${macaddr:+hw ether "$macaddr"} ${mtu:+mtu $mtu} ${txqueuelen:+txqueuelen $txqueuelen} up
+
                [ "$proto" = none ] || ifconfig "$iface" 0.0.0.0
 
-               # Change interface MAC address if requested
-               [ -n "$vifmac" ] && {
-                       ifconfig "$iface" down
-                       ifconfig "$iface" hw ether "$vifmac" up
-               }
+               # Apply sysctl settings
+               map_sysctls "$config" "$iface"
        }
 
        # Setup VLAN interfaces
@@ -182,8 +204,9 @@ prepare_interface() {
                                        $DEBUG brctl addif "br-$config" "$iface"
                                        # Bridge existed already. No further processing necesary
                                } || {
-                                       local stp
+                                       local stp igmp_snooping
                                        config_get_bool stp "$config" stp 0
+                                       config_get_bool igmp_snooping "$config" igmp_snooping 1
                                        $DEBUG brctl addbr "br-$config"
                                        $DEBUG brctl setfd "br-$config" 0
                                        $DEBUG ifconfig "$iface" 0.0.0.0
@@ -191,6 +214,7 @@ prepare_interface() {
                                        $DEBUG brctl addif "br-$config" "$iface"
                                        $DEBUG brctl stp "br-$config" $stp
                                        [ -z "$macaddr" ] && macaddr="$(cat /sys/class/net/$iface/address)"
+                                       echo $igmp_snooping > /sys/devices/virtual/net/br-$config/bridge/multicast_snooping 2>/dev/null
                                        $DEBUG ifconfig "br-$config" hw ether $macaddr up
                                        # Creating the bridge here will have triggered a hotplug event, which will
                                        # result in another setup_interface() call, so we simply stop processing
@@ -241,9 +265,9 @@ setup_interface_static() {
        esac
 
        [ -z "$ipaddr" ] || $DEBUG ifconfig "$iface" "$ipaddr" netmask "$netmask" broadcast "${bcast:-+}"
-       [ -z "$ip6addr" ] || $DEBUG ifconfig "$iface" add "$ip6addr"
+       [ -z "$ip6addr" ] || $DEBUG ifconfig "${iface%:*}" add "$ip6addr"
        [ -z "$gateway" ] || $DEBUG route add default gw "$gateway" ${metric:+metric $metric} dev "$iface"
-       [ -z "$ip6gw" ] || $DEBUG route -A inet6 add default gw "$ip6gw" ${metric:+metric $metric} dev "$iface"
+       [ -z "$ip6gw" ] || $DEBUG route -A inet6 add default gw "$ip6gw" ${metric:+metric $metric} dev "${iface%:*}"
        [ -z "$dns" ] || add_dns "$config" $dns
 
        config_get type "$config" TYPE
@@ -330,14 +354,6 @@ setup_interface() {
        }
 
        # Interface settings
-       grep -qE "^ *$iface:" /proc/net/dev && {
-               local mtu macaddr txqueuelen
-               config_get mtu "$config" mtu
-               config_get macaddr "$config" macaddr
-               config_get txqueuelen "$config" txqueuelen
-               [ -n "$macaddr" ] && $DEBUG ifconfig "$iface" down
-               $DEBUG ifconfig "$iface" ${macaddr:+hw ether "$macaddr"} ${mtu:+mtu $mtu} ${txqueuelen:+txqueuelen $txqueuelen} up
-       }
        set_interface_ifname "$config" "$iface"
 
        [ -n "$proto" ] || config_get proto "$config" proto