#!/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 } } } } _create_interface() { local _masterifname config_get _ifname "$1" name # Convert from old config without name defined [ -z "$_ifname" ] && { uci batch <<-EOF set macvlan.$1.name=$1 commit macvlan EOF _ifname=$1 } config_get _masterifname "$1" ifname uci batch <<-EOF set network.$_ifname=interface set network.$_ifname.type=macvlan set network.$_ifname.proto=static set network.$_ifname.masterintf=$_masterifname EOF } # 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 local _type config_get _type "$1" type [ "$_type" = "macvlan" ] && [ "$(uci -q get macvlan.$1)" = "" ] && { uci -q batch <<-EOF delete network.$1 delete network.$1_dev commit network EOF return } [ "$(echo $1 | grep _dev)" != "" ] && { local _intfdev=$(sed 's/_dev//' $1) uci -q get "network.$_intfdev.ifname" >/dev/null || { logger -t "macvlan" "Remove network.$1" uci -q batch <<-EOF delete network.$1 commit network delete macvlan.$1 commit macvlan EOF } return } #_type="$(uci -q get network.$1.type) if [ "$(uci -q get macvlan.$1)" != "" ]; then _type="macvlan" fi uci -q get "network.$1_dev.ifname" >/dev/null && { uci -q set network.$1_dev.mtu=$(uci -q get network.$1.mtu) [ -n "$(uci -q get macvlan.$1.ifname)" ] && uci -q set network.$1_dev.ifname=$(uci -q get macvlan.$1.ifname) [ -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" ] || { logger -t "macvlan" "Remove network.$1_dev" uci -q batch <<-EOF delete network.$1_dev set network.$1.ifname=$(uci -q get network.$1.masterintf) delete network.$1.masterintf EOF } [ "$_type" = "macvlan" ] && { local interface config_get _interface "$1" interface [ -n "$_interface" ] && { logger -t "macvlan" "Remove network.$1_dev" uci -q batch <<-EOF delete network.$1 set network.$1_dev.ifname=$_interface EOF } } uci -q commit network return 0 } [ "$_type" = "macvlan" ] || return 0 [ -z "$_ifname" ] && _ifname=$(uci -q get macvlan.$1.ifname) 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 macvlan config_foreach _create_interface macvlan 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 macvlan }