#!/bin/sh /etc/rc.common START=4 USE_PROCD=1 _setup_macaddr() { uci -q get "network.$1_dev.macaddr" >/dev/null && return uci -q set "network.$1_dev.macaddr=$2" } _save_macaddr() { local _ifname local _macaddr uci -q get "network.$1_dev.ifname" >/dev/null && { _ifname=$(uci -q get "network.$1.ifname") if [ -n "$(uci -q get network.$1.macaddr)" ] && [ "$(uci -q get network.$1.macaddr)" != "$(uci -q get network.$1_dev.macaddr)" ]; then uci -q set network.$1_dev.macaddr="$(uci -q get network.$1.macaddr)" else _macaddr=$(ip link show dev $_ifname 2>/dev/null | grep link | awk '{print $2}') [ -n "$_macaddr" ] && { uci -q set network.$1_dev.macaddr=$_macaddr uci -q set network.$1.macaddr=$_macaddr } fi } [ -z "$(uci -q get network.$1.macaddr)" ] && { _ifname=$(uci -q get "network.$1.ifname") [ -n "$_ifname" ] && { _macaddr=$(ip link show dev $_ifname 2>/dev/null | grep link | awk '{print $2}') [ -n "$_macaddr" ] && { uci -q set network.$1.macaddr=$_macaddr } } } } # Configuration by interface _setup_interface() { local _ifname config_get _ifname "$1" ifname [ -z "$_ifname" ] && config_get _ifname "$1" ifname # do not create macvlan for vlan #case "$_ifname" in # eth*.*) return ;; #esac [ "$(echo $1 | grep _dev)" != "" ] && { local _intfdev=$(sed 's/_dev//' $1) uci -q get "network.$_intfdev.ifname" >/dev/null || { uci -q batch <<-EOF delete network.$1 commit network EOF } return } local _type config_get _type "$1" type uci -q get "network.$1_dev.ifname" >/dev/null && { uci -q set network.$1_dev.mtu=$(uci -q get network.$1.mtu) [ -z "$(uci -q get network.$1.masterintf)" ] && uci -q set network.$1.masterintf=$(uci -q get network.$1_dev.ifname) [ -n "$(uci -q get network.$1.masterintf)" ] && uci -q set network.$1_dev.ifname=$(uci -q get network.$1.masterintf) [ -z "$(uci -q get network.$1.macaddr)" ] && uci -q set network.$1_dev.macaddr=$(uci -q get network.$1.macaddr) [ "$_type" = "macvlan" ] || { uci -q batch <<-EOF delete network.$1_dev EOF } [ "$_type" = "macvlan" ] && { local interface config_get _interface "$1" interface [ -n "$_interface" ] && { uci -q batch <<-EOF delete network.$1.interface set network.$1_dev.ifname=$_interface EOF } } uci -q commit network return 0 } [ "$_type" = "macvlan" ] || return 0 uci -q batch <<-EOF set network.$1_dev=device set network.$1_dev.name=$1 set network.$1_dev.type=macvlan set network.$1_dev.ifname=$_ifname set network.$1.ifname=$1 set network.$1.masterintf=$_ifname set network.$1.type=macvlan set network.$1.defaultroute=0 EOF _macaddr=$(uci -q get "network.$1.macaddr") _setup_macaddr "$1" "${_macaddr:-auto$(date +%s)}" uci -q set network.$1_dev.mtu=$(uci -q get network.$1.mtu) uci -q commit network } start_service() { . /lib/functions.sh config_load network config_foreach _setup_interface interface config_foreach _save_macaddr interface uci -q commit network } reload_service() { start } service_triggers() { procd_add_reload_trigger network }