From 6355efa37996f9238abcd0196727682c5eef4660619acdc89624bf0ec9dbe420 Mon Sep 17 00:00:00 2001 From: ADAM David Alan Martin Date: Sat, 5 Sep 2026 18:41:30 -0400 Subject: [PATCH] Automatically compute vlans for base card. --- defaults/rc.conf | 3 +++ rc.subr | 66 +++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 66 insertions(+), 3 deletions(-) diff --git a/defaults/rc.conf b/defaults/rc.conf index 984de26..6dc5717 100644 --- a/defaults/rc.conf +++ b/defaults/rc.conf @@ -53,6 +53,9 @@ rc_router_ula_prefix_size="48" fib_setup_enable="YES" rc_router_fibs="1" +# The SLA and v4 net addresses for cards start here, incrementing as seen. +# This actual value is incremented during the execution of the user directives. +rc_router_card_base="0" route_policy_enable="YES" route_policy_file="${rc_router_gen_dir}/pf.route-policies.conf" diff --git a/rc.subr b/rc.subr index 5320363..391ea04 100755 --- a/rc.subr +++ b/rc.subr @@ -299,12 +299,25 @@ _emit_dhcpv6_for_isp() do _iface=`echo ${_iface_desc} | sed -e 's;/.*$;;'` _sla=`echo ${_iface_desc} | sed -e 's;^.*/;;'` + + # Raw cards use a special rule. + if [ -z "${_sla}" ] + then + eval "_sla=\${vlan_for_card_base_${_iface_desc}}" + fi _emit_dhcpv6_for_iface ${_iface} ${_sla} done for _iface in ${_isp_list} do _vlan=`echo ${_iface} | sed -e 's/^.*\.//'` - _num=`echo ${_vlan} | sed -e 's/\([0-9]\)0\([0-9]\)/\1\2/'` + if [ "${_vlan}" = "${_iface}" ] + then + _compute_card_base ${_iface} + _num=${_vlan} + else + _num=`echo ${_vlan} | sed -e 's/\([0-9]\)0\([0-9]\)/\1\2/'` + fi + _vlan_sla=`printf "%d" 0x${_num}` _emit_dhcpv6_for_iface ${_iface} ${_vlan_sla} done @@ -463,22 +476,49 @@ _emit_dhcpv4() do _iface_root=$( echo ${_iface} | sed -e 's/\.[0-9][0-9]*//' ) _vlan=$( echo ${_iface} | sed -e 's/[a-z][a-z]*[0-9][0-9]*\.//' ) + _echo "In building for _iface_root:<${_iface_root}> we first found _vlan:<${_vlan}>" + if [ "${_vlan}" = "${_iface_root}" ] + then + _compute_card_base ${_iface_root} + fi + + _echo "Emitting _iface_root:<${_iface_root}> and _vlan:<${_vlan}>" + + _emit_dhcpv4_for_iface ${_iface_root} ${_vlan} >> ${_dhcp_file} done } +_compute_card_base() +{ + _echo "Compute card base called with <${*}>" + _compute_card_base_for_card="${1}" + eval _local_vlan="\${vlan_for_card_base_${_compute_card_base_for_card}}" + _echo "First read for <${_compute_card_base_for_card}> found <${_local_vlan}>" + if [ -z "${_local_vlan}" ] + then + _echo "Override of <${_local_vlan}> ${_compute_card_base_for_card} to <${rc_router_card_base}>" + _local_vlan="${rc_router_card_base}" + rc_router_card_base=$(( ${rc_router_card_base} + 1 )) + eval vlan_for_card_base_${_compute_card_base_for_card}="${_local_vlan}" + fi + _vlan=${_local_vlan} +} + add_v4_net() { _compute_nets $* _card_and_vlan="${_card}_${_vlan}" _card_dot_vlan="${_card}.${_vlan}" _echo "In v4 net for ${_card_and_vlan} with ${_card_dot_vlan}" + _vlan_arg="${_vlan}" if [ ${_vlan} -ne 0 ] then add_vlan $_card $_vlan else _card_and_vlan="${_card}" _card_dot_vlan="${_card}" + _compute_card_base ${_card} fi _class_group="" @@ -486,7 +526,19 @@ add_v4_net() then _class_group="group ${_class}" fi - eval ifconfig_${_card_and_vlan}=\"$(compute_v4_net ${_card} ${_vlan}) group internal ${_class_group}\" + + _extra_opts="" + if [ "${_vlan_arg}" = "0" ] + then + eval _extra_opts="\${${_card}_extra_opts}" + fi + + if [ -z "${_extra_address}" ] + then + eval ifconfig_${_card_and_vlan}=\"$(compute_v4_net ${_card} ${_vlan}) group internal ${_class_group} ${_extra_opts}\" + else + eval ifconfig_${_card_and_vlan}=\"${_extra_address} group internal ${_class_group} ${_extra_opts}\" + fi eval dhcpd_ifaces=\"${dhcpd_ifaces} ${_card_dot_vlan}\" } @@ -509,12 +561,14 @@ add_v6_net() _compute_nets $* _card_and_vlan="${_card}_${_vlan}" _card_dot_vlan="${_card}.${_vlan}" + _vlan_arg="${_vlan}" if [ ${_vlan} -ne 0 ] then add_vlan $_card $_vlan else _card_and_vlan="${_card}" _card_dot_vlan="${_card}" + _compute_card_base ${_card} fi add_rtadv ${_card_dot_vlan} @@ -526,7 +580,13 @@ add_v6_net() _class_group="group ${_class}" fi - eval ifconfig_${_card_and_vlan}_ipv6=\"inet6 fe80::1/64 group internal ${_class_group}\" + _extra_opts="" + if [ "${_vlan_arg}" = "0" ] + then + eval _extra_opts="\${${_card}_extra_opts}" + fi + + eval ifconfig_${_card_and_vlan}_ipv6=\"inet6 fe80::1/64 group internal ${_class_group} ${_extra_opts}\" _next_alias=0