aboutsummaryrefslogtreecommitdiff
path: root/etc
diff options
context:
space:
mode:
authorBrooks Davis <brooks@FreeBSD.org>2005-11-14 23:34:50 +0000
committerBrooks Davis <brooks@FreeBSD.org>2005-11-14 23:34:50 +0000
commitcda39c01939cfb9dab1f5cc9cda31db776d9cc9e (patch)
treef08460df623c0fe4e9db71dff9c7e9dec4e7944f /etc
parent4b01ab171d7762f7d7ef1a5a83fae13a66d244b7 (diff)
downloadsrc-cda39c01939cfb9dab1f5cc9cda31db776d9cc9e.tar.gz
src-cda39c01939cfb9dab1f5cc9cda31db776d9cc9e.zip
Add a new configuration variable, ipv4_addrs_<ifn>, which adds one or
more IPv4 address from a ranged list in CIRD notation: ipv4_addrs_ed0="192.168.0.1/24 192.168.1.1-5/28" In the process move alias processing into new ipv4_up/down functions to more toward a less IPv4 centric world. Submitted by: Philipp Wuensche <cryx dash freebsd at h3q dot com>
Notes
Notes: svn path=/head/; revision=152441
Diffstat (limited to 'etc')
-rw-r--r--etc/defaults/rc.conf1
-rw-r--r--etc/network.subr58
-rw-r--r--etc/rc.d/netif4
3 files changed, 61 insertions, 2 deletions
diff --git a/etc/defaults/rc.conf b/etc/defaults/rc.conf
index 3d543ac83827..3cce26baf794 100644
--- a/etc/defaults/rc.conf
+++ b/etc/defaults/rc.conf
@@ -154,6 +154,7 @@ ifconfig_lo0="inet 127.0.0.1" # default loopback device configuration.
#ifconfig_lo0_alias0="inet 127.0.0.254 netmask 0xffffffff" # Sample alias entry.
#ifconfig_ed0_ipx="ipx 0x00010010" # Sample IPX address family entry.
#ifconfig_fxp0_name="net0" # Change interface name from fxp0 to net0.
+#ipv4_addrs_fxp0="192.168.0.1/24 192.168.1.1-5/28" # example IPv4 address entry.
#
# If you have any sppp(4) interfaces above, you might also want to set
# the following parameters. Refer to spppcontrol(8) for their meaning.
diff --git a/etc/network.subr b/etc/network.subr
index d5a1703670e5..5eccd53234ef 100644
--- a/etc/network.subr
+++ b/etc/network.subr
@@ -198,6 +198,64 @@ wpaif()
return 1
}
+# ipv4_up if
+# add IPv4 addresses to the interface $if
+ipv4_up()
+{
+ _if=$1
+ ifalias_up ${_if}
+ ipv4_addrs_common ${_if} alias
+}
+
+# ipv4_down if
+# remove IPv4 addresses from the interface $if
+ipv4_down()
+{
+ _if=$1
+ ifalias_down ${_if}
+ ipv4_addrs_common ${_if} -alias
+}
+
+# ipv4_addrs_common if action
+# Evaluate the ifconfig_if_ipv4 arguments for interface $if
+# and use $action to add or remove IPv4 addresses from $if.
+ipv4_addrs_common()
+{
+ _ret=1
+ _if=$1
+ _action=$2
+
+ # get ipv4-addresses
+ eval cidr_addr=\${ipv4_addrs_${_if}}
+
+ for _cidr in ${cidr_addr}; do
+ _ipaddr=${_cidr%%/*}
+ _netmask="/"${_cidr##*/}
+ _range=${_ipaddr##*.}
+ _ipnet=${_ipaddr%.*}
+ _iplow=${_range%-*}
+ _iphigh=${_range#*-}
+
+ # clear netmask when removing aliases
+ if [ "${_action}" = "-alias" ]; then
+ _netmask=""
+ fi
+
+ _ipcount=${_iplow}
+ while [ "${_ipcount}" -le "${_iphigh}" ]; do
+ eval "ifconfig ${_if} ${_action} ${_ipnet}.${_ipcount}${_netmask}"
+ _ipcount=$((${_ipcount}+1))
+ _ret=0
+
+ # only the first ipaddr in a subnet need the real netmask
+ if [ "${_action}" != "-alias" ]; then
+ _netmask="/32"
+ fi
+ done
+ done
+ return $_ret
+}
+
# ifalias_up if
# Configure aliases for network interface $if.
# It returns 0 if at least one alias was configured or
diff --git a/etc/rc.d/netif b/etc/rc.d/netif
index b692ee3e7fc5..e76b9671b797 100644
--- a/etc/rc.d/netif
+++ b/etc/rc.d/netif
@@ -150,7 +150,7 @@ ifn_start()
ifscript_up ${ifn} && cfg=0
ifconfig_up ${ifn} && cfg=0
- ifalias_up ${ifn} && cfg=0
+ ipv4_up ${ifn} && cfg=0
ipx_up ${ifn} && cfg=0
return $cfg
@@ -165,7 +165,7 @@ ifn_stop()
[ -z "$ifn" ] && return 1
ipx_down ${ifn} && cfg=0
- ifalias_down ${ifn} && cfg=0
+ ipv4_down ${ifn} && cfg=0
ifconfig_down ${ifn} && cfg=0
ifscript_down ${ifn} && cfg=0