summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbrooks <brooks@FreeBSD.org>2005-11-14 23:34:50 +0000
committerbrooks <brooks@FreeBSD.org>2005-11-14 23:34:50 +0000
commit267072f91c36769a3994a91f21382a9acc77974b (patch)
treef08460df623c0fe4e9db71dff9c7e9dec4e7944f
parentf30753dc685cc64419b3334ab1b9a49db265f00f (diff)
downloadFreeBSD-src-267072f91c36769a3994a91f21382a9acc77974b.zip
FreeBSD-src-267072f91c36769a3994a91f21382a9acc77974b.tar.gz
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>
-rw-r--r--etc/defaults/rc.conf1
-rw-r--r--etc/network.subr58
-rw-r--r--etc/rc.d/netif4
-rw-r--r--share/man/man5/rc.conf.526
4 files changed, 84 insertions, 5 deletions
diff --git a/etc/defaults/rc.conf b/etc/defaults/rc.conf
index 3d543ac..3cce26b 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 d5a1703..5eccd53 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 b692ee3..e76b967 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
diff --git a/share/man/man5/rc.conf.5 b/share/man/man5/rc.conf.5
index 2e743fb..5076dc4 100644
--- a/share/man/man5/rc.conf.5
+++ b/share/man/man5/rc.conf.5
@@ -946,9 +946,26 @@ Such keywords are removed before passing the value to
.Xr ifconfig 8
while the order of the other arguments is preserved.
.Pp
-It is also possible to add IP alias entries here in cases where
-multiple IP addresses registered against a single interface
-are desired.
+One can configure more than one IPv4 address with the
+.Va ipv4_addrs_ Ns Aq Ar interface
+variable.
+One or more IP addresses must be provided in Classless Inter-Domain
+Routing (CIDR) address notation, whose last byte can be a range like
+192.168.0.5-23/24.
+In this case the address 192.168.0.5 will be configured with the
+netmask /24 and the addresses 192.168.0.6 to 192.168.0.23 with
+the non-conflicting netmask /32 as explained in the ifconfig(8)
+alias section.
+With the interface in question being
+.Li ed0,
+an example could look like:
+.Bd -literal
+ipv4_addrs_ed0="192.168.0.1/24 192.168.1.1-5/28"
+.Ed
+.Pp
+It is also possible to add IP alias entries using
+.Xr ifconfig 8
+syntax.
Assuming that the interface in question was
.Li ed0 ,
it might look
@@ -979,6 +996,9 @@ be added since the search would
stop with the missing
.Dq Li alias3
entry.
+Due to this difficult to manage behavior, the
+.Va ifconfig_ Ns Ao Ar interface Ac Ns Va _alias Ns Aq Ar n
+form is deprecated.
.Pp
If the
.Pa /etc/start_if. Ns Aq Ar interface
OpenPOWER on IntegriCloud