summaryrefslogtreecommitdiffstats
path: root/core/rootfs/rootfs-stage31/data/inc/setup_network
blob: 4f4c8a02a7f0f33efc4b7c204b1fab9912ca220a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/bin/ash

echo "Setting up network..."

echo "Main MAC address is '$MAC'"

# setup network
source /inc/network.functions

# set up loopback networking
echo "Setting up loopback"
ip link set dev lo up 2>/dev/null
ip addr add 127.0.0.1/8 dev lo 2>/dev/null

echo "Setting up bridge"
BRIDGE="br0"

# Following was supposed to prevent scripts from getting confused by multiple interfaces with same MAC - does not work though
## Flip mac address of original interface - this var is not local so init sees the changes too
#MAC="$(echo "$MAC" | awk -F ':' '{printf $1 ":" $2 ":" $5 ":" $3 ":" $6 ":" $4}')"
#ip link set addr "$MAC" "$SLAVE"

mkdir -p "${FUTURE_ROOT}/etc/udev/rules.d"

for i in 1 1 END; do
	IP_OUT="$( ip a | grep -B 1 "/ether" | sed -r '/^--$/d;$!N;s#^[0-9]+: ([a-z0-9\.:]+): .*?/ether ([0-9a-fA-Z:]+) .*$#\1==\2#' )"
	echo "$IP_OUT" | grep -q -F -- "$MAC" && break
	[ "x$i" = "xEND" ] && break
	sleep "$i"
done

if ! echo "$IP_OUT" | grep -q -F -- "$MAC"; then
	drop_shell "---
$(ip a)
---
$IP_OUT
---

Boot interface $MAC not found in interface list. NIC driver missing?
Check output of dmesg for missing firmware (dmesg | more)"
	:
fi

ADD_NIC=1
for LINE in $IP_OUT; do
	IFACE="${LINE%==*}"
	IFMAC="$( echo "${LINE#*==}" | tr 'A-Z' 'a-z' )" # udev requires mac addesses to be lowercase (a-f), see http://www.debianhelp.co.uk/udev.htm
	echo "${IFACE} = ${IFMAC}"

	if [ "x$IFMAC" == "x$MAC" ]; then
		brctl addbr "$BRIDGE" || drop_shell "Could not create bridge $BRIDGE"
		brctl stp "$BRIDGE" 0
		brctl setfd "$BRIDGE" 0.000000000001
		ip link set addr "$IFMAC" "$BRIDGE" || drop_shell "Could not set mac of $BRIDGE"
		ip link set dev "$IFACE" up
		wait_for_iface "$IFACE" 8
		brctl addif "$BRIDGE" "$IFACE" || drop_shell "Could not add $IFACE to $BRIDGE"

		# save our variables for retry on fail
		echo "IFACE=$IFACE" > /run/network.conf

		# analyze ip information from the kernel command line and put parts
		# of it into several variables
		if [ -n "$CLIENTIP" ] ; then
			# set static ip address
			ip link set dev "$BRIDGE" up
			ip addr add "$CLIENTIP/$(ipcalc -s -p "$CLIENTIP" "$SUBNET_MASK" | sed "s/.*=//")" broadcast "$BROADCAST_ADDRESS" dev "$BRIDGE"
			[ -n "$GATEWAY" ] && ip route add default via "$GATEWAY" dev "$BRIDGE"
		else
			ip link set dev "$BRIDGE" up
		fi
		# Ignore this device later on when systemd handles network interfaces (see hacked 99-systemd.rules in systemd data dir)
		echo "SUBSYSTEM==\"net\", ACTION==\"add\", KERNEL==\"eth*\", ATTR{address}==\"$IFMAC\", TAG+=\"openslxignore\"" >> "${FUTURE_ROOT}/etc/udev/rules.d/01-ignore-boot-interface.rules"
	else
		# Additional NIC - prepare bridge in case we want to add these to a VM or do other fancy things
		ADD_BR="br-nic-$ADD_NIC"
		brctl addbr "$ADD_BR"
		brctl stp "$ADD_BR" 0
		ip link set addr "$IFMAC" "$ADD_BR"
		ip link set dev "$IFACE" up
		brctl addif "$ADD_BR" "$IFACE"
		ip link set dev "$ADD_BR" up
		ADD_NIC=$(( ADD_NIC + 1 ))
	fi
	# youdev
	echo "SUBSYSTEM==\"net\", ACTION==\"add\", DRIVERS==\"?*\", ATTR{address}==\"$IFMAC\", ATTR{dev_id}==\"0x0\", ATTR{type}==\"1\", KERNEL==\"eth*\", NAME=\"$IFACE\"" >> "${FUTURE_ROOT}/etc/udev/rules.d/70-net-boot-nic-name.rules"
	# continue...
	IFACE=""
done

wait_for_iface "$BRIDGE" 5

# udhcpc
PARAM=
if [ -n "$CLIENTIP" ]; then
	PARAM="-r $CLIENTIP"
	echo -n "$CLIENTIP" > "/run/firstip"
fi
if [ -n "$GATEWAY" ]; then
	echo -n "$GATEWAY" > "/run/firstgw"
fi

if [ "$USE_DHCP_UUID" = "yes" ]; then
	UID=$(dmidecode -s system-uuid | sed -r 's/^(..)(..)(..)(..)-(..)(..)-(..)(..)-(....)-/00\4\3\2\1\6\5\8\7\9/')
	if [ "${#UID}" = 34 ]; then
		echo "Using SMBIOS UID for DHCP"
		PARAM="$PARAM -x 0x3d:$UID"
	fi
fi

# save our variables for retry on fail ff.
echo "CLIENTIP=$CLIENTIP" >> /run/network.conf
echo "GATEWAY=$GATEWAY" >> /run/network.conf
echo "BRIDGE=$BRIDGE" >> /run/network.conf
echo "UID=$UID" >> /run/network.conf

udhcpc $PARAM -O ntpsrv -O domain -O search -t 5 -T 3 -A 4 -s "/inc/udhcpc-trigger" -f -n -q -i "$BRIDGE"
URET=$?
# if these were empty before, udhcpc might have filled them in
[ -z "$CLIENTIP" ] && CLIENTIP=$(cat /run/firstip)
[ -z "$GATEWAY" ] && GATEWAY=$(cat /run/firstgw)
# udhcpc return value will be return value of this script
return $URET