diff options
author | brooks <brooks@FreeBSD.org> | 2005-11-14 23:34:50 +0000 |
---|---|---|
committer | brooks <brooks@FreeBSD.org> | 2005-11-14 23:34:50 +0000 |
commit | 267072f91c36769a3994a91f21382a9acc77974b (patch) | |
tree | f08460df623c0fe4e9db71dff9c7e9dec4e7944f /etc/network.subr | |
parent | f30753dc685cc64419b3334ab1b9a49db265f00f (diff) | |
download | FreeBSD-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>
Diffstat (limited to 'etc/network.subr')
-rw-r--r-- | etc/network.subr | 58 |
1 files changed, 58 insertions, 0 deletions
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 |