Fix several logic bugs in the previous IPv6 variable change and

re-add $ipv6_enable support for backward compatibility.  From
UPDATING:

 1. To use IPv6, simply define $ifconfig_IF_ipv6 like $ifconfig_IF
    for IPv4.  For aliases, $ifconfig_IF_aliasN should be used.
    Note that both variables need the "inet6" keyword at the head.

    Do not set $ipv6_network_interfaces manually if you do not
    understand what you are doing.  It is not needed in most cases.

    $ipv6_ifconfig_IF and $ipv6_ifconfig_IF_aliasN still work, but
    they are obsolete.

 2. $ipv6_enable is obsolete.  Use $ipv6_prefer and/or
    "inet6 accept_rtadv" keyword in ifconfig(8) instead.

    If you define $ipv6_enable=YES, it means $ipv6_prefer=YES and
    all configured interfaces have "inet6 accept_rtadv" in the
    $ifconfig_IF_ipv6.  These are for backward compatibility.

 3. A new variable $ipv6_prefer has been added.  If NO, IPv6
    functionality of interfaces with no corresponding
    $ifconfig_IF_ipv6 is disabled by using "inet6 ifdisabled" flag,
    and the default address selection policy of ip6addrctl(8)
    is the IPv4-preferred one (see rc.d/ip6addrctl for more details).
    Note that if you want to configure IPv6 functionality on the
    disabled interfaces after boot, first you need to clear the flag by
    using ifconfig(8) like:

         ifconfig em0 inet6 -ifdisabled

    If YES, the default address selection policy is set as
    IPv6-preferred.

    The default value of $ipv6_prefer is NO.

 4. If your system need to receive Router Advertisement messages,
    define "inet6 accept_rtadv" in $ifconfig_IF_ipv6.  The rc(8)
    scripts automatically invoke rtsol(8) when the interface becomes
    UP.  The Router Advertisement messages are used for SLAAC
    (State-Less Address AutoConfiguration).
This commit is contained in:
Hiroki Sato 2009-09-26 18:59:00 +00:00
parent 5ff124a953
commit 2e77c5abfb
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=197526
6 changed files with 193 additions and 31 deletions

View file

@ -22,10 +22,61 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 9.x IS SLOW:
machines to maximize performance. (To disable malloc debugging, run
ln -s aj /etc/malloc.conf.)
20090926:
The rc.d/network_ipv6, IPv6 configuration script has been integrated
into rc.d/netif. The changes are the following:
1. To use IPv6, simply define $ifconfig_IF_ipv6 like $ifconfig_IF
for IPv4. For aliases, $ifconfig_IF_aliasN should be used.
Note that both variables need the "inet6" keyword at the head.
Do not set $ipv6_network_interfaces manually if you do not
understand what you are doing. It is not needed in most cases.
$ipv6_ifconfig_IF and $ipv6_ifconfig_IF_aliasN still work, but
they are obsolete.
2. $ipv6_enable is obsolete. Use $ipv6_prefer and
"inet6 accept_rtadv" keyword in ifconfig(8) instead.
If you define $ipv6_enable=YES, it means $ipv6_prefer=YES and
all configured interfaces have "inet6 accept_rtadv" in the
$ifconfig_IF_ipv6. These are for backward compatibility.
3. A new variable $ipv6_prefer has been added. If NO, IPv6
functionality of interfaces with no corresponding
$ifconfig_IF_ipv6 is disabled by using "inet6 ifdisabled" flag,
and the default address selection policy of ip6addrctl(8)
is the IPv4-preferred one (see rc.d/ip6addrctl for more details).
Note that if you want to configure IPv6 functionality on the
disabled interfaces after boot, first you need to clear the flag by
using ifconfig(8) like:
ifconfig em0 inet6 -ifdisabled
If YES, the default address selection policy is set as
IPv6-preferred.
The default value of $ipv6_prefer is NO.
4. If your system need to receive Router Advertisement messages,
define "inet6 accept_rtadv" in $ifconfig_IF_ipv6. The rc(8)
scripts automatically invoke rtsol(8) when the interface becomes
UP. The Router Advertisement messages are used for SLAAC
(State-Less Address AutoConfiguration).
20090922:
802.11s D3.03 support was committed. This is incompatible with the
previous code, which was based on D3.0.
20090912:
A sysctl variable net.inet6.ip6.accept_rtadv now sets the default value
of a per-interface flag ND6_IFF_ACCEPT_RTADV, not a global knob to
control whether accepting Router Advertisement messages or not.
Also, a per-interface flag ND6_IFF_AUTO_LINKLOCAL has been added and
a sysctl variable net.inet6.ip6.auto_linklocal is its default value.
The ifconfig(8) utility now supports these flags.
20090910:
ZFS snapshots are now mounted with MNT_IGNORE flag. Use -v option for
mount(8) and -a option for df(1) to see them.

View file

@ -97,15 +97,26 @@ ifconfig_up()
if afexists inet6; then
if ipv6if $1; then
if checkyesno ipv6_gateway_enable; then
_ipv6_opts="-accept_rtadv auto_linklocal"
else
_ipv6_opts="auto_linklocal"
_ipv6_opts="-accept_rtadv"
fi
else
_ipv6_opts="-auto_linklocal ifdisabled"
if checkyesno ipv6_prefer; then
_ipv6_opts="-ifdisabled"
else
_ipv6_opts="ifdisabled"
fi
# backward compatibility: $ipv6_enable
case $ipv6_enable in
[Yy][Ee][Ss])
_ipv6_opts="${_ipv6_opts} accept_rtadv"
;;
esac
fi
ifconfig $1 inet6 ${_ipv6_opts}
if [ -n "${_ipv6_opts}" ]; then
ifconfig $1 inet6 ${_ipv6_opts}
fi
# ifconfig_IF_ipv6
ifconfig_args=`ifconfig_getargs $1 ipv6`
@ -382,7 +393,7 @@ noafif()
# 1 otherwise.
ipv6if()
{
local _if i
local _if _tmpargs i
_if=$1
if ! afexists inet6; then
@ -396,6 +407,18 @@ ipv6if()
;;
esac
# True if $ifconfig_IF_ipv6 is defined.
_tmpargs=`_ifconfig_getargs $_if ipv6`
if [ -n "${_tmpargs}" ]; then
return 0
fi
# backward compatibility: True if $ipv6_ifconfig_IF is defined.
_tmpargs=`get_if_var $_if ipv6_ifconfig_IF`
if [ -n "${_tmpargs}" ]; then
return 0
fi
case "${ipv6_network_interfaces}" in
[Aa][Uu][Tt][Oo])
return 0
@ -431,17 +454,30 @@ ipv6_autoconfif()
if checkyesno ipv6_gateway_enable; then
return 1
fi
_tmpargs=`get_if_var $_if ipv6_prefix_IF`
if [ -n "${_tmpargs}" ]; then
return 1
fi
case $_if in
lo0|\
stf[0-9]*|\
faith[0-9]*|\
lp[0-9]*|\
sl[0-9]*)
sl[0-9]*|\
pflog[0-9]*|\
pfsync[0-9]*)
return 1
;;
esac
# backward compatibility: $ipv6_enable
case $ipv6_enable in
[Yy][Ee][Ss])
return 0
;;
esac
_tmpargs=`_ifconfig_getargs $_if ipv6`
for _arg in $_tmpargs; do
case $_arg in
@ -451,6 +487,16 @@ ipv6_autoconfif()
esac
done
# backward compatibility: $ipv6_ifconfig_IF
_tmpargs=`get_if_var $_if ipv6_ifconfig_IF`
for _arg in $_tmpargs; do
case $_arg in
accept_rtadv)
return 0
;;
esac
done
return 1
}
@ -691,7 +737,7 @@ ifalias_ipv6_up()
;;
*)
ifconfig $1 inet6 ${ifconfig_args} alias && _ret=0
warn "\$ipv6_ifconfig_$1_alias${alias} is obsolete."
warn "\$ipv6_ifconfig_$1_alias${alias} is obsolete." \
" Use ifconfig_$1_aliasN instead."
;;
esac
@ -773,6 +819,7 @@ ifalias_ipv6_down()
done
# backward compatibility: ipv6_ifconfig_IF_aliasN.
alias=0
while : ; do
ifconfig_args=`get_if_var $1 ipv6_ifconfig_IF_alias${alias}`
case "${ifconfig_args}" in
@ -780,13 +827,12 @@ ifalias_ipv6_down()
break
;;
*)
ifconfig $1 inet6 ${ifconfig_args} -alias
alias=$((${alias} + 1))
warn "\$ipv6_ifconfig_$1_alias${alias} is obsolete."
ifconfig $1 inet6 ${ifconfig_args} -alias && _ret=0
warn "\$ipv6_ifconfig_$1_alias${alias} is obsolete." \
" Use ifconfig_$1_aliasN instead."
_ret=0
;;
esac
alias=$((${alias} + 1))
done
return $_ret

View file

@ -19,6 +19,8 @@ status_cmd="ip6addrctl"
prefer_ipv6_cmd="ip6addrctl_prefer_ipv6"
prefer_ipv4_cmd="ip6addrctl_prefer_ipv4"
set_rcvar_obsolete ipv6_enable ipv6_prefer
ip6addrctl_prefer_ipv6()
{
ip6addrctl flush >/dev/null 2>&1

View file

@ -41,7 +41,7 @@ clonedown_cmd="clone_down"
extra_commands="cloneup clonedown"
cmdifn=
set_rcvar_obsolete ipv6_enable
set_rcvar_obsolete ipv6_enable ipv6_prefer
network_start()
{

View file

@ -28,7 +28,7 @@
.\" From: @(#)ifconfig.8 8.3 (Berkeley) 1/5/94
.\" $FreeBSD$
.\"
.Dd September 2, 2009
.Dd September 23, 2009
.Dt IFCONFIG 8
.Os
.Sh NAME
@ -598,7 +598,10 @@ If the interface was reset when previously marked down,
the hardware will be re-initialized.
.El
.Pp
The following parameters are for ICMPv6 Neightbor Discovery Protocol:
The following parameters are for ICMPv6 Neightbor Discovery Protocol.
Note that the address family keyword
.Dq Li inet6
is needed for them:
.Bl -tag -width indent
.It Cm accept_rtadv
Set a flag to enable accepting ICMPv6 Router Advertisement messages.
@ -619,7 +622,10 @@ Clear a flag
.Cm defaultif .
.It Cm ifdisabled
Set a flag to disable all of IPv6 network communications on the
specified interface.
specified interface. Note that if there are already configured IPv6
addresses on that interface, all of them are marked as
.Dq tentative
and DAD will be performed when this flag is cleared.
.It Cm -ifdisabled
Clear a flag
.Cm ifdisabled .

View file

@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd September 17, 2009
.Dd September 23, 2009
.Dt RC.CONF 5
.Os
.Sh NAME
@ -1246,28 +1246,85 @@ It is also possible to rename interface by doing:
ifconfig_ed0_name="net0"
ifconfig_net0="inet 192.0.2.1 netmask 0xffffff00"
.Ed
.It Va ipv6_enable
.Pq Vt bool
If the variable is
.Dq Li YES ,
.Dq Li inet6 accept_rtadv
is added to all of
.Va ifconfig_ Ns Ao Ar interface Ac Ns _ipv6
and the
.Va ipv6_prefer
is defined as
.Dq Li YES .
.Pp
This variable is deprecated. Use
.Va ipv6_prefer
and
.Va ifconfig_ Ns Ao Ar interface Ac Ns _ipv6 .
.It Va ipv6_prefer
.Pq Vt bool
This variable does the following:
.Pp
If the variable is
.Dq Li YES ,
the default policy of the source address selection set by
.Xr ip6addrctl 8
will be IPv6-preferred.
.Pp
If the variable is
.Dq Li NO ,
the default policy of the source address selection set by
.Xr ip6addrctl 8
will be IPv4-preferred, and all of interfaces which does not have the
corrsponding
.Va ifconfig_ Ns Ao Ar interface Ac Ns _ipv6
variable will be marked as
.Dq Li IFDISABLED .
This means only IPv6 functionality on that interface is completely
disabled. For more details of
.Dq Li IFDISABLED
flag and keywords
.Dq Li inet6 ifdisabled ,
see
.Xr ifconfig 8 .
.Pp
.It Va ipv6_network_interfaces
.Pq Vt str
This is the IPv6 equivalent of
.Va network_interfaces .
Instead of setting the ifconfig variables as
.Va ifconfig_ Ns Aq Ar interface
they should be set as
.Va ifconfig_ Ns Ao Ar interface Ac Ns _ipv6.
Aliases should be set as
.Va ifconfig_ Ns Ao Ar interface Ac Ns Va _alias Ns Aq Ar n .
.Va ipv6_prefix_ Ns Aq Ar interface
does something.
Interfaces that have a
.Fl accept_rtadv
flag in
Normally manual configuration of this variable is not needed.
.Pp
IPv6 functionality on an interface should be configured by
.Va ifconfig_ Ns Ao Ar interface Ac Ns _ipv6 ,
instead of setting ifconfig parameters in
.Va ifconfig_ Ns Aq Ar interface .
Aliases should be set by
.Va ifconfig_ Ns Ao Ar interface Ac Ns Va _alias Ns Aq Ar n
with
.Dq Li inet6
keyword. For example:
.Bd -literal
ifconfig_ed0_ipv6="inet6 2001:db8:1::1 prefixlen 64"
ifconfig_ed0_alias0="inet6 2001:db8:2::1 prefixlen 64"
.Ed
.Pp
Interfaces that have an
.Dq Li inet6 accept_rtadv
keyword in
.Va ifconfig_ Ns Ao Ar interface Ac Ns _ipv6
setting will be automatically configured by
.Xr rtsol 8
if the
.Xr rtsol 8 .
Note that this automatic configuration is disabled if the
.Va ipv6_gateway_enable
is set to
.Dq Li NO .
.Dq Li YES .
.It Va ipv6_prefix_ Ns Aq Ar interface
.Pq Vt str
If one or more prefixes are defined in
.Va ipv6_prefix_ Ns Aq Ar interface
addresses based on each prefix and the EUI-64 interface index will be
configured on that interface.
.It Va ipv6_default_interface
.Pq Vt str
If not set to