]> git.ipfire.org Git - ipfire-2.x.git/blob - config/udev/network-hotplug-bridges
Use MAC addresses to define a slave
[ipfire-2.x.git] / config / udev / network-hotplug-bridges
1 #!/bin/bash
2 ############################################################################
3 # #
4 # This file is part of the IPFire Firewall. #
5 # #
6 # IPFire is free software; you can redistribute it and/or modify #
7 # it under the terms of the GNU General Public License as published by #
8 # the Free Software Foundation; either version 2 of the License, or #
9 # (at your option) any later version. #
10 # #
11 # IPFire is distributed in the hope that it will be useful, #
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
14 # GNU General Public License for more details. #
15 # #
16 # You should have received a copy of the GNU General Public License #
17 # along with IPFire; if not, write to the Free Software #
18 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #
19 # #
20 # Copyright (C) 2016 IPFire Team <info@ipfire.org> #
21 # #
22 ############################################################################
23
24 [ -n "${INTERFACE}" ] || exit 2
25
26 eval $(/usr/local/bin/readhash /var/ipfire/ethernet/settings)
27
28 detect_zone() {
29 local intf="${INTERFACE%0*}"
30 intf="${intf^^}"
31
32 local zone
33 for zone in GREEN BLUE ORANGE RED; do
34 # Try to find if INTERFACE is the *phys version of a zone
35 if [ "${intf}" = "${zone}" ]; then
36 echo "${zone}"
37 return 0
38 fi
39
40 # Try to find out if this INTERFACE is a slave of a zone
41 local slave
42 for slave in $(get_value "${zone}_SLAVES"); do
43
44 #Compare if the mac address matches or if the name matches
45 if ([ "$(</sys/class/net/${INTERFACE}/address)" = "${slave}" ] || [ "${INTERFACE}" = "${slave}" ]); then
46 echo "${zone}"
47 return 0
48 fi
49 done
50 done
51
52 return 1
53 }
54
55 get_value() {
56 echo "${!1}"
57 }
58
59 random_mac_address() {
60 local address="02"
61
62 for i in $(seq 5); do
63 printf -v address "${address}:%02x" "$(( RANDOM % 256 ))"
64 done
65
66 echo "${address}"
67 }
68
69 # Try to detect which zone we are operating on
70 ZONE=$(detect_zone)
71
72 # Cannot proceed if we could not find a zone
73 if [ -z "${ZONE}" ]; then
74 exit 0
75 fi
76
77 # Determine the mode of this zone
78 MODE="$(get_value "${ZONE}_MODE")"
79
80 # The name of the virtual bridge
81 BRIDGE="$(get_value "${ZONE}_DEV")"
82
83 case "${MODE}" in
84 bridge)
85 ADDRESS="$(get_value "${ZONE}_MACADDR")"
86 [ -n "${ADDRESS}" ] || ADDRESS="$(random_mac_address)"
87
88 # We need to create the bridge if it doesn't exist, yet
89 if [ ! -d "/sys/class/net/${BRIDGE}" ]; then
90 ip link add "${BRIDGE}" address "${ADDRESS}" type bridge
91 #ip link set "${BRIDGE}" up
92 fi
93
94 # Attach the physical device
95 ip link set dev "${INTERFACE}" master "${BRIDGE}"
96 ip link set dev "${INTERFACE}" up
97 ;;
98
99 macvtap)
100 ADDRESS="$(</sys/class/net/${INTERFACE}/address)"
101 GENERATED_ADDRESS=$(random_mac_address)
102
103 ip link add link "${INTERFACE}" "${BRIDGE}" address "${ADDRESS}" type macvlan mode bridge
104 ip link set "${INTERFACE}" address "${GENERATED_ADDRESS}"
105 ip link set "${INTERFACE}" up
106 ;;
107
108 "")
109 exit 0
110 ;;
111
112 *)
113 logger -t "network" "Unhandled mode '${MODE}' for '${ZONE}' (${INTERFACE})"
114 exit 1
115 ;;
116 esac