Skip to content

Commit ece4d90

Browse files
author
Aritra Basu
committed
Add udev ID_NET_NAME_* property restoration for VPP interfaces
Capture ID_NET_NAME_* properties before VPP takes over the interface and restore them via udev rules after VPP creates host-facing tap/tun interface. This is needed for IAID generation by DHCPv6 client in systemd-networkd to be consistent across VPP lifecycle on the node. - Store ID_NET_NAME_* values and MAC address before VPP runs - Create udev rules for the interface to restore ID_NET_NAME_* values after VPP runs - Cleanup udev rules on VPP shutdown - BEFORE_VPP_RUN → capture, VPP_RUNNING → create rules, VPP_DONE_OK/ERRORED → cleanup Signed-off-by: Aritra Basu <[email protected]>
1 parent 6e59606 commit ece4d90

File tree

2 files changed

+107
-1
lines changed

2 files changed

+107
-1
lines changed

config/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ func RunHook(hookScript *string, hookName string, params *VppManagerParams, log
164164
return
165165
}
166166

167-
cmd := exec.Command("/bin/bash", "-c", template, hookName)
167+
cmd := exec.Command("/bin/bash", "-c", template, hookName, params.UplinksSpecs[0].InterfaceName)
168168
cmd.Stdout = os.Stdout
169169
cmd.Stderr = os.Stderr
170170
err = cmd.Run()

config/default_hook.sh

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#!/bin/sh
22

33
HOOK="$0"
4+
INTERFACE_NAME="$1"
45
chroot /host /bin/sh <<EOSCRIPT
56
67
fix_dns () {
@@ -39,6 +40,107 @@ restart_network () {
3940
fi
4041
}
4142
43+
capture_udev_net_name_properties () {
44+
echo "default_hook: Capturing udev net name properties for $INTERFACE_NAME..."
45+
UDEV_INFO=$(udevadm info /sys/class/net/$INTERFACE_NAME 2>/dev/null)
46+
if [ -z "$UDEV_INFO" ]; then
47+
echo "default_hook: Failed to get udevadm info for $INTERFACE_NAME"
48+
return
49+
fi
50+
51+
# Extract ID_NET_NAME_* properties
52+
ID_NET_NAME_ONBOARD=$(echo "$UDEV_INFO" | grep "ID_NET_NAME_ONBOARD=" | sed 's/.*ID_NET_NAME_ONBOARD=//')
53+
ID_NET_NAME_SLOT=$(echo "$UDEV_INFO" | grep "ID_NET_NAME_SLOT=" | sed 's/.*ID_NET_NAME_SLOT=//')
54+
ID_NET_NAME_PATH=$(echo "$UDEV_INFO" | grep "ID_NET_NAME_PATH=" | sed 's/.*ID_NET_NAME_PATH=//')
55+
ID_NET_NAME_MAC=$(echo "$UDEV_INFO" | grep "ID_NET_NAME_MAC=" | sed 's/.*ID_NET_NAME_MAC=//')
56+
57+
# Check if we have any properties to save
58+
if [ -z "$ID_NET_NAME_ONBOARD" ] && [ -z "$ID_NET_NAME_SLOT" ] && [ -z "$ID_NET_NAME_PATH" ] && [ -z "$ID_NET_NAME_MAC" ]; then
59+
echo "default_hook: No udev net name properties found for $INTERFACE_NAME"
60+
return
61+
fi
62+
63+
# Get MAC address
64+
MAC_ADDRESS=$(cat /sys/class/net/$INTERFACE_NAME/address 2>/dev/null)
65+
if [ -z "$MAC_ADDRESS" ]; then
66+
echo "default_hook: Failed to get MAC address for $INTERFACE_NAME"
67+
return
68+
fi
69+
70+
# Save properties to temp file for later use
71+
mkdir -p /var/run/vpp
72+
echo "MAC_ADDRESS=$MAC_ADDRESS" > /var/run/vpp/udev_props_$INTERFACE_NAME
73+
[ -n "$ID_NET_NAME_ONBOARD" ] && echo "ID_NET_NAME_ONBOARD=$ID_NET_NAME_ONBOARD" >> /var/run/vpp/udev_props_$INTERFACE_NAME
74+
[ -n "$ID_NET_NAME_SLOT" ] && echo "ID_NET_NAME_SLOT=$ID_NET_NAME_SLOT" >> /var/run/vpp/udev_props_$INTERFACE_NAME
75+
[ -n "$ID_NET_NAME_PATH" ] && echo "ID_NET_NAME_PATH=$ID_NET_NAME_PATH" >> /var/run/vpp/udev_props_$INTERFACE_NAME
76+
[ -n "$ID_NET_NAME_MAC" ] && echo "ID_NET_NAME_MAC=$ID_NET_NAME_MAC" >> /var/run/vpp/udev_props_$INTERFACE_NAME
77+
78+
echo "default_hook: Captured udev properties for $INTERFACE_NAME (MAC: $MAC_ADDRESS)"
79+
[ -n "$ID_NET_NAME_ONBOARD" ] && echo "default_hook: ID_NET_NAME_ONBOARD=$ID_NET_NAME_ONBOARD"
80+
[ -n "$ID_NET_NAME_SLOT" ] && echo "default_hook: ID_NET_NAME_SLOT=$ID_NET_NAME_SLOT"
81+
[ -n "$ID_NET_NAME_PATH" ] && echo "default_hook: ID_NET_NAME_PATH=$ID_NET_NAME_PATH"
82+
[ -n "$ID_NET_NAME_MAC" ] && echo "default_hook: ID_NET_NAME_MAC=$ID_NET_NAME_MAC"
83+
}
84+
85+
create_udev_net_name_rule () {
86+
PROPS_FILE="/var/run/vpp/udev_props_$INTERFACE_NAME"
87+
if [ ! -f "$PROPS_FILE" ]; then
88+
echo "default_hook: No udev properties captured for $INTERFACE_NAME, skipping rule creation"
89+
return
90+
fi
91+
92+
# Source the properties file
93+
. "$PROPS_FILE"
94+
95+
if [ -z "$MAC_ADDRESS" ]; then
96+
echo "default_hook: No MAC address captured for $INTERFACE_NAME, skipping rule creation"
97+
return
98+
fi
99+
100+
echo "default_hook: Creating udev rule for $INTERFACE_NAME with MAC $MAC_ADDRESS..."
101+
102+
# Build the udev rule
103+
RULE_FILE="/etc/udev/rules.d/99-vpp-restore-id_net_name.rules"
104+
echo "# Re-apply ID_NET_NAME_* properties after Calico VPP creates the host-facing tap/tun netdev." > "$RULE_FILE"
105+
printf 'ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="%s"' "$MAC_ADDRESS" >> "$RULE_FILE"
106+
107+
[ -n "$ID_NET_NAME_ONBOARD" ] && printf ', ENV{ID_NET_NAME_ONBOARD}:="%s"' "$ID_NET_NAME_ONBOARD" >> "$RULE_FILE"
108+
[ -n "$ID_NET_NAME_SLOT" ] && printf ', ENV{ID_NET_NAME_SLOT}:="%s"' "$ID_NET_NAME_SLOT" >> "$RULE_FILE"
109+
[ -n "$ID_NET_NAME_PATH" ] && printf ', ENV{ID_NET_NAME_PATH}:="%s"' "$ID_NET_NAME_PATH" >> "$RULE_FILE"
110+
[ -n "$ID_NET_NAME_MAC" ] && printf ', ENV{ID_NET_NAME_MAC}:="%s"' "$ID_NET_NAME_MAC" >> "$RULE_FILE"
111+
112+
echo "" >> "$RULE_FILE"
113+
114+
echo "default_hook: Created udev rule file at $RULE_FILE"
115+
116+
# Reload udev rules
117+
udevadm control --reload-rules
118+
119+
# Trigger udev for net subsystem to apply the stored ID_NET_NAME_* properties
120+
udevadm trigger --subsystem-match=net --action=add
121+
echo "default_hook: Triggered udev to apply the stored ID_NET_NAME_* properties"
122+
}
123+
124+
remove_udev_net_name_rule () {
125+
RULE_FILE="/etc/udev/rules.d/99-vpp-restore-id_net_name.rules"
126+
PROPS_FILE="/var/run/vpp/udev_props_$INTERFACE_NAME"
127+
128+
if [ -f "$RULE_FILE" ]; then
129+
echo "default_hook: Removing udev rule file $RULE_FILE..."
130+
rm -f "$RULE_FILE"
131+
udevadm control --reload-rules
132+
133+
# Trigger udev for net subsystem to remove the stored ID_NET_NAME_* properties
134+
udevadm trigger --subsystem-match=net --action=change
135+
echo "default_hook: Triggered udev to remove the stored ID_NET_NAME_* properties"
136+
fi
137+
138+
if [ -f "$PROPS_FILE" ]; then
139+
rm -f "$PROPS_FILE"
140+
fi
141+
}
142+
143+
echo "default_hook: Uplink interface name=$INTERFACE_NAME"
42144
if which systemctl > /dev/null; then
43145
echo "default_hook: using systemctl..."
44146
else
@@ -48,13 +150,17 @@ fi
48150
49151
if [ "$HOOK" = "BEFORE_VPP_RUN" ]; then
50152
fix_dns
153+
capture_udev_net_name_properties
51154
elif [ "$HOOK" = "VPP_RUNNING" ]; then
155+
create_udev_net_name_rule
52156
restart_network
53157
elif [ "$HOOK" = "VPP_DONE_OK" ]; then
54158
undo_dns_fix
159+
remove_udev_net_name_rule
55160
restart_network
56161
elif [ "$HOOK" = "VPP_ERRORED" ]; then
57162
undo_dns_fix
163+
remove_udev_net_name_rule
58164
restart_network
59165
fi
60166

0 commit comments

Comments
 (0)