Support nexthop_gateway in IPv6

Re-add support for nexthop_gateway in IPv6 configurations in Debian.

Ensure the translated nexthop_gateway boot parameter is applied to IPv6
network configurations.

These changes are applied to both the pre-ostree-pull network
configuration (via 'ip' command), and the /etc/network/interfaces.d
ifupdown interface configuration.

Test Plan
PASS:
- Test IPv6 install using only nexthop_gateway value
    - With and without bootstrap_vlan
    - Ensure that the default route is created, via the given
      nexthop_gateway
    - Validate successful ostree repo pull
    - Ensure that the default route is created via the
    - /etc/network/interfaces.d upon reboot into the ostree repo
    - Validate that communications are established to subcloud, ready
      for ansible bootstrap
- Test IPv6 install using no nexthop_gateway value
    - With and without bootstrap_vlan
    - Verify that default route is created, with no gateway
- Test IPv4 install using only nexthop_gateway value
    - With and without bootstrap_vlan
    - Ensure that the default route is created, via the given
      nexthop_gateway
    - Full install plus bootstrap, as above
    - Tested in libvirt
- Test IPv4 install using no nexthop_gateway value
    - With and without bootstrap_vlan
    - Verify that default route is created, with no gateway
    - Full install plus bootstrap, as above
    - Tested in libvirt

Closes-Bug: 2017007

Signed-off-by: Kyle MacLeod <kyle.macleod@windriver.com>
Change-Id: Iee71f753983fa77ad396a6a90e2f6cec189cbaa8
Signed-off-by: Kyle MacLeod <kyle.macleod@windriver.com>
This commit is contained in:
Kyle MacLeod 2023-04-16 22:52:21 -04:00
parent f7e1be7d78
commit 8be0edb971
1 changed files with 115 additions and 102 deletions

View File

@ -673,26 +673,30 @@ function parse_miniboot_network_params()
{
BOOTPARAM_MGMT_ADDRESS_FAMILY=
BOOTPARAM_IP_ADDR=
BOOTPARAM_VLAN=0
BOOTPARAM_VLAN=
BOOTPARAM_GW=
BOOTPARAM_PREFIX_LEN=
BOOTPARAM_IFNAME=
BOOTPARAM_IP_VER=
BOOTPARAM_ROUTE_OPTIONS=
BOOTPARAM_METRIC=
BOOTPARAM_DNS=
# Pull out the ip= line from /proc/cmdline:
local ipstring
# Parse values from /proc/cmdline
local ipstring=
local vlan=
for arg in \$(cat /proc/cmdline); do
case "\$arg" in
case "\${arg}" in
ip=*)
ipstring=\${arg:3}
ilog "Using ip=\$ipstring"
break
;;
vlan=*)
vlan=\${arg:5}
ilog "Using vlan=\${vlan}"
;;
esac
done
ilog "Parsing boot ipstring=\$ipstring"
# Now we have a string like:
@ -704,7 +708,7 @@ function parse_miniboot_network_params()
# [2620:10a:a001:d41::212],,,64,subcloud3,ens1f0.401,none (for ipv6)
BOOTPARAM_IP_ADDR=\$(echo \$ipstring | awk -F',' '{print \$1}' | tr -d '\[\]')
BOOTPARAM_GW=\$(echo \$ipstring | awk -F',' '{print \$3}')
BOOTPARAM_GW=\$(echo \$ipstring | awk -F',' '{print \$3}' | tr -d '\[\]')
BOOTPARAM_PREFIX_LEN=\$(echo \$ipstring | awk -F',' '{print \$4}')
hostname=\$(echo \$ipstring | awk -F',' '{print \$5}')
BOOTPARAM_IFNAME=\$(echo \$ipstring | awk -F',' '{print \$6}')
@ -720,22 +724,9 @@ function parse_miniboot_network_params()
;;
*)
BOOTPARAM_MGMT_ADDRESS_FAMILY="inet"
BOOTPARAM_ROUTE_OPTIONS="via \$BOOTPARAM_GW"
;;
esac
# Parse the vlan= line from /proc/cmdline (if it exists):
local vlan=
for arg in \$(cat /proc/cmdline); do
case "\${arg}" in
vlan=*)
vlan=\${arg:5}
ilog "Parsing vlan=\${vlan}"
break
;;
esac
done
if [ -n "\${vlan}" ]; then
# Parameter format: "bootstrap_interface.bootstrap_vlan:bootstrap_interface"
dlog "Parsing vlan from \${vlan}"
@ -746,11 +737,14 @@ function parse_miniboot_network_params()
fi
logmsg="Using IP values: ip:\$BOOTPARAM_IP_ADDR, family: \$BOOTPARAM_MGMT_ADDRESS_FAMILY"
if [ "\$BOOTPARAM_VLAN" -ne 0 ]; then
if [ -n "\$BOOTPARAM_VLAN" ]; then
logmsg="\$logmsg vlan: \$BOOTPARAM_VLAN, "
fi
logmsg="\$logmsg prefix:\$BOOTPARAM_PREFIX_LEN, gw:\$BOOTPARAM_GW, ifname: \$BOOTPARAM_IFNAME, "
logmsg="\$logmsg route options: \$BOOTPARAM_ROUTE_OPTIONS, metric: \$BOOTPARAM_METRIC, dns: \$BOOTPARAM_DNS"
logmsg="\$logmsg prefix:\$BOOTPARAM_PREFIX_LEN, ifname: \$BOOTPARAM_IFNAME, "
if [ -n "\${BOOTPARAM_GW}" ]; then
logmsg="\$logmsg gw:\$BOOTPARAM_GW, "
fi
logmsg="\$logmsg metric: \$BOOTPARAM_METRIC, dns: \$BOOTPARAM_DNS"
ilog "\$logmsg"
export BOOTPARAM_MGMT_ADDRESS_FAMILY
@ -760,7 +754,6 @@ function parse_miniboot_network_params()
export BOOTPARAM_PREFIX_LEN
export BOOTPARAM_IFNAME
export BOOTPARAM_IP_VER
export BOOTPARAM_ROUTE_OPTIONS
export BOOTPARAM_METRIC
export BOOTPARAM_DNS
}
@ -1543,8 +1536,8 @@ mgmt_dev=${BOOTPARAM_IFNAME}
mgmt_vlan=${BOOTPARAM_VLAN}
mgmt_address_family=${BOOTPARAM_MGMT_ADDRESS_FAMILY}
if [ $mgmt_vlan -eq 0 ] ; then
if [ -z "${mgmt_vlan}" ] ; then
# NO VLAN
if [ "$mgmt_address_family" = "inet" ]; then
ilog "ip ${BOOTPARAM_IP_VER} address add ${BOOTPARAM_IP_ADDR}/${BOOTPARAM_PREFIX_LEN} dev ${mgmt_dev}"
ip ${BOOTPARAM_IP_VER} address add ${BOOTPARAM_IP_ADDR}/${BOOTPARAM_PREFIX_LEN} dev ${mgmt_dev}
@ -1554,8 +1547,16 @@ if [ $mgmt_vlan -eq 0 ] ; then
fi
ilog "ip ${BOOTPARAM_IP_VER} link set dev ${mgmt_dev} up"
ip ${BOOTPARAM_IP_VER} link set dev ${mgmt_dev} up
ilog "ip ${BOOTPARAM_IP_VER} route add default ${BOOTPARAM_ROUTE_OPTIONS} dev ${mgmt_dev} ${BOOTPARAM_METRIC}"
ip ${BOOTPARAM_IP_VER} route add default ${BOOTPARAM_ROUTE_OPTIONS} dev ${mgmt_dev} ${BOOTPARAM_METRIC}
if [ -z "${BOOTPARAM_GW}" ]; then
# No gateway
ilog "ip ${BOOTPARAM_IP_VER} route add default dev ${mgmt_dev} ${BOOTPARAM_METRIC}"
ip ${BOOTPARAM_IP_VER} route add default dev ${mgmt_dev} ${BOOTPARAM_METRIC}
else
ilog "Setting up default route:"
ilog "ip ${BOOTPARAM_IP_VER} route add default via ${BOOTPARAM_GW} dev ${mgmt_dev} ${BOOTPARAM_METRIC}"
ip ${BOOTPARAM_IP_VER} route add default via ${BOOTPARAM_GW} dev ${mgmt_dev} ${BOOTPARAM_METRIC}
fi
wait_for_interface ${mgmt_dev} 60
ilog "ip addr:"
ip addr show
@ -1563,6 +1564,7 @@ if [ $mgmt_vlan -eq 0 ] ; then
ip ${BOOTPARAM_IP_VER} route show
else
# VLAN CONFIG
mgmt_iface=vlan${mgmt_vlan}
ilog "mgmt_dev=${mgmt_dev}"
ilog "mgmt_iface=vlan${mgmt_vlan}"
@ -1580,19 +1582,30 @@ else
fi
ilog "ip ${BOOTPARAM_IP_VER} link set up dev ${mgmt_dev}"
ip ${BOOTPARAM_IP_VER} link set up dev ${mgmt_dev}
# TODO(kmacleod) change to wait_for_interface 60:
sleep 15
ilog "ip ${BOOTPARAM_IP_VER} link set up dev ${mgmt_iface}"
ip ${BOOTPARAM_IP_VER} link set up dev ${mgmt_iface}
# TODO(kmacleod) change to wait_for_interface 60:
ilog "Wait 10s to settle interface..."
sleep 10
ilog "ip ${BOOTPARAM_IP_VER} route add default ${BOOTPARAM_ROUTE_OPTIONS} dev ${mgmt_iface} ${BOOTPARAM_METRIC}"
ip ${BOOTPARAM_IP_VER} route add default ${BOOTPARAM_ROUTE_OPTIONS} dev ${mgmt_iface} ${BOOTPARAM_METRIC}
if [ -z "${BOOTPARAM_GW}" ]; then
# No gateway
ilog "ip ${BOOTPARAM_IP_VER} route add default dev ${mgmt_iface} ${BOOTPARAM_METRIC}"
ip ${BOOTPARAM_IP_VER} route add default dev ${mgmt_iface} ${BOOTPARAM_METRIC}
else
ilog "Setting up default route:"
ilog "ip ${BOOTPARAM_IP_VER} route add default via ${BOOTPARAM_GW} dev ${mgmt_iface} ${BOOTPARAM_METRIC}"
ip ${BOOTPARAM_IP_VER} route add default via ${BOOTPARAM_GW} dev ${mgmt_iface} ${BOOTPARAM_METRIC}
fi
ilog "ip ${BOOTPARAM_IP_VER} addr:"
ip ${BOOTPARAM_IP_VER} addr show
ilog "ip ${BOOTPARAM_IP_VER} route:"
ip ${BOOTPARAM_IP_VER} route show
fi
# get the nameserver
local dns="none"
for e in \${dns}; do
@ -2646,84 +2659,82 @@ fi
ilog "Setup network scripts"
if [ $mgmt_vlan -eq 0 ] ; then
function create_network_interface_file()
{
local ifname=${1}
local address_family=${2}
local vlan=${3:-}
# Persist the boot device to the platform configuration. This will get
# overwritten later if the management_interface is on a bonded interface.
update_platform_conf "management_interface=$mgmt_dev"
local ipversion=ipv4
local ip_cmd_flag="-4"
if [ "${address_family}" == "inet6" ]; then
local ipversion=ipv6
local ip_cmd_flag="-6"
fi
local ifname_vlan="vlan${vlan}"
# Build networking scripts
cat << EOF > ${IMAGE_ROOTFS}/etc/network/interfaces.d/ifcfg-lo
auto lo
iface lo inet loopback
EOF
local logstr="Creating ${IMAGE_ROOTFS}/etc/network/interfaces.d/ifcfg-${ifname}, ${ipversion}"
[ -n "${vlan}" ] && logstr="${logstr}, vlan interface: ${ifname_vlan}"
[ -n "${BOOTPARAM_GW}" ] && logstr="${logstr}, gw: ${BOOTPARAM_GW}"
ilog "${logstr}"
if [ $mgmt_dev != "lo" ]; then
ilog "Creating ${IMAGE_ROOTFS}/etc/network/interfaces.d/ifcfg-$mgmt_dev"
if [ "${mgmt_address_family}" == "inet" ]; then
cat << EOF > ${IMAGE_ROOTFS}/etc/network/interfaces.d/ifcfg-$mgmt_dev
auto $mgmt_dev
iface $mgmt_dev inet static
address $BOOTPARAM_IP_ADDR/$BOOTPARAM_PREFIX_LEN
gateway $BOOTPARAM_GW
mtu 1500
EOF
else # inet6
cat << EOF > ${IMAGE_ROOTFS}/etc/network/interfaces.d/ifcfg-$mgmt_dev
auto $mgmt_dev
iface $mgmt_dev inet6 static
address $BOOTPARAM_IP_ADDR/$BOOTPARAM_PREFIX_LEN
mtu 1500
post-up echo 0 > /proc/sys/net/ipv6/conf/lo/autoconf; echo 0 > /proc/sys/net/ipv6/conf/lo/accept_ra; echo 0 > /proc/sys/net/ipv6/conf/lo/accept_redirects
EOF
local output
if [ -z "${vlan}" ]; then
# Persist the boot device to the platform configuration
# overwritten later if the management_interface is on a bonded interface.
update_platform_conf "management_interface=${ifname}"
# NO VLAN
output="auto ${ifname}\n"
output="${output}iface ${ifname} ${address_family} static\n"
output="${output} address ${BOOTPARAM_IP_ADDR}/$BOOTPARAM_PREFIX_LEN\n"
if [ -n "${BOOTPARAM_GW}" ]; then
output="${output} gateway $BOOTPARAM_GW\n"
fi
output="${output} mtu 1500\n"
output="${output} post-up echo 0 > /proc/sys/net/${ipversion}/conf/lo/autoconf\n"
output="${output} post-up echo 0 > /proc/sys/net/${ipversion}/conf/lo/accept_ra\n"
output="${output} post-up echo 0 > /proc/sys/net/${ipversion}/conf/lo/accept_redirects\n"
echo -e "${output}" > "${IMAGE_ROOTFS}/etc/network/interfaces.d/ifcfg-${ifname}"
else
# CONFIGURE FOR VLAN
# Persist the boot device to the platform configuration. This will get
# overwritten later if the management_interface is on a bonded interface.
update_platform_conf "management_interface=${ifname_vlan}"
# 1. Configure device interface:
output="auto ${ifname}\n"
output="${output}iface ${ifname} ${address_family} manual\n"
output="${output} post-up echo 0 > /proc/sys/net/${ipversion}/conf/${ifname}/autoconf\n"
output="${output} post-up echo 0 > /proc/sys/net/${ipversion}/conf/${ifname}/accept_ra\n"
output="${output} post-up echo 0 > /proc/sys/net/${ipversion}/conf/${ifname}/accept_redirects\n"
echo -e "${output}" > "${IMAGE_ROOTFS}/etc/network/interfaces.d/ifcfg-${ifname}"
# 2. Configure VLAN interface:
output="auto ${ifname_vlan}\n"
output="${output}iface ${ifname_vlan} ${address_family} static\n"
output="${output} vlan-raw-device ${ifname}\n"
output="${output} address ${BOOTPARAM_IP_ADDR}/${BOOTPARAM_PREFIX_LEN}\n"
if [ -n "${BOOTPARAM_GW}" ]; then
output="${output} gateway ${BOOTPARAM_GW}\n"
fi
output="${output} mtu 1500\n"
output="${output} post-up echo 0 > /proc/sys/net/${ipversion}/conf/${ifname_vlan}/autoconf\n"
output="${output} post-up echo 0 > /proc/sys/net/${ipversion}/conf/${ifname_vlan}/accept_ra\n"
output="${output} post-up echo 0 > /proc/sys/net/${ipversion}/conf/${ifname_vlan}/accept_redirects\n"
echo -e "${output}" > "${IMAGE_ROOTFS}/etc/network/interfaces.d/ifcfg-${ifname_vlan}"
fi
}
else # vlan
ilog "Configuring vlan: mgmt_iface=vlan${mgmt_vlan}"
# Build networking scripts
# Persist the boot device to the platform configuration. This will get
# overwritten later if the management_interface is on a bonded interface.
update_platform_conf "management_interface=vlan${mgmt_vlan}"
# Loopback file
lo_file="${IMAGE_ROOTFS}/etc/network/interfaces.d/ifcfg-lo"
echo "auto lo" > "${lo_file}"
echo "iface lo ${mgmt_address_family} loopback" >> "${lo_file}"
# Build networking scripts
cat << EOF > ${IMAGE_ROOTFS}/etc/network/interfaces.d/ifcfg-lo
auto lo
iface lo ${mgmt_address_family} loopback
EOF
if [ "${mgmt_address_family}" == "inet" ]; then
cat << EOF > ${IMAGE_ROOTFS}/etc/network/interfaces.d/ifcfg-$mgmt_dev
auto ${mgmt_dev}
iface ${mgmt_dev} inet manual
post-up echo 0 > /proc/sys/net/ipv4/conf/${mgmt_dev}/autoconf; echo 0 > /proc/sys/net/ipv4/conf/${mgmt_dev}/accept_ra; echo 0 > /proc/sys/net/ipv4/conf/${mgmt_dev}/accept_redirects
EOF
cat << EOF > ${IMAGE_ROOTFS}/etc/network/interfaces.d/ifcfg-vlan${mgmt_vlan}
auto vlan${mgmt_vlan}
iface vlan${mgmt_vlan} inet static
vlan-raw-device ${mgmt_dev}
address ${BOOTPARAM_IP_ADDR}/${BOOTPARAM_PREFIX_LEN}
gateway ${BOOTPARAM_GW}
mtu 1500
post-up echo 0 > /proc/sys/net/ipv4/conf/vlan${mgmt_vlan}/autoconf; echo 0 > /proc/sys/net/ipv4/conf/vlan${mgmt_vlan}/accept_ra; echo 0 > /proc/sys/net/ipv4/conf/vlan${mgmt_vlan}/accept_redirects
EOF
else # inet6
cat << EOF > ${IMAGE_ROOTFS}/etc/network/interfaces.d/ifcfg-${mgmt_dev}
auto ${mgmt_dev}
iface ${mgmt_dev} inet6 manual
post-up echo 0 > /proc/sys/net/ipv6/conf/${mgmt_dev}/autoconf; echo 0 > /proc/sys/net/ipv6/conf/${mgmt_dev}/accept_ra; echo 0 > /proc/sys/net/ipv6/conf/${mgmt_dev}/accept_redirects
EOF
cat << EOF > ${IMAGE_ROOTFS}/etc/network/interfaces.d/ifcfg-vlan${mgmt_vlan}
auto vlan${mgmt_vlan}
iface vlan${mgmt_vlan} inet6 static
vlan-raw-device ${mgmt_dev}
address ${BOOTPARAM_IP_ADDR}/${BOOTPARAM_PREFIX_LEN}
mtu 1500
post-up echo 0 > /proc/sys/net/ipv6/conf/vlan${mgmt_vlan}/autoconf; echo 0 > /proc/sys/net/ipv6/conf/vlan${mgmt_vlan}/accept_ra; echo 0 > /proc/sys/net/ipv6/conf/vlan${mgmt_vlan}/accept_redirects
EOF
fi
if [ "${mgmt_dev}" != "lo" ]; then
create_network_interface_file "${mgmt_dev}" "${mgmt_address_family}" "${mgmt_vlan}"
fi
ilog "Contents of ${IMAGE_ROOTFS}/etc/network/interfaces.d/ifcfg-lo:"
@ -2733,8 +2744,8 @@ ilog "Contents of ${IMAGE_ROOTFS}/etc/network/interfaces.d/ifcfg-${mgmt_dev}:"
ilog "$(cat "${IMAGE_ROOTFS}/etc/network/interfaces.d/ifcfg-${mgmt_dev}")"
if [ -f "${IMAGE_ROOTFS}/etc/network/interfaces.d/ifcfg-vlan${mgmt_vlan}" ]; then
ilog "Contents of ${IMAGE_ROOTFS}/etc/network/interfaces.d/ifcfg-vlan${mgmt_vlan}:"
ilog "$(cat "${IMAGE_ROOTFS}/etc/network/interfaces.d/ifcfg-vlan${mgmt_vlan}")"
ilog "Contents of ${IMAGE_ROOTFS}/etc/network/interfaces.d/ifcfg-vlan${mgmt_vlan}:"
ilog "$(cat "${IMAGE_ROOTFS}/etc/network/interfaces.d/ifcfg-vlan${mgmt_vlan}")"
fi
true
@ -3065,3 +3076,5 @@ fi
true
%end
# vim: filetype=sh