Current status
Features
- Automatic link-local addresses
- Manual addresses
- Automatic global address
- Gateway/DNS for other hosts (IPv4 only)
Feature dependencies
- IPv6: Automatic global address needs link-local address
- Gateway needs a manual address (at least a default one), conflicts with dynamic address
IPv4/IPv6 methods broken down to features
Method | Protocol | Link-local | Manual | Automatic | Gateway |
---|---|---|---|---|---|
disabled | IPv4 | none | forbidden | none | none |
ignore | IPv6 | kernel | forbidden | kernel | none |
link-local | IPv4 | userspace | forbidden | none | none |
link-local | IPv6 | kernel | forbidden | none | none |
manual | IPv4 | none | required | none | none |
manual | IPv6 | kernel | required | none | none |
auto | IPv4 | none | allowed | dhcp | none |
auto | IPv6 | kernel | allowed | ra+dhcp | none |
dhcp | IPv6 | kernel | allowed | dhcp | none |
shared | IPv4 | none | forbidden | none | dhcp+dns+NAT |
Notes
- Even when IPv4 is in the disabled state, the network interface communicates on the L2 level.
- There's no disable method for IPv6 and its semantics is unclear (whether disable means the same as link-local, or it also applies to the link-local address which is unaffected in all other methods).
- The usage of IPv4 and IPv6 link-local addresses substatially differs. While IPv6 uses link-local addresses for *all* methods, IPv4 only uses it for the special link-local method.
- The IPv4 disable and IPv4/manual methods only differ in the number of addresses (0 versus >=1), therefore one of them is redundant.
- The IPv6 link-local and IPv6/manual methods only differ in the number of addresses (0 versus >=1), therefore one of them is redundant.
- The IPv6 dhcp method is currently defunct.
- There's no IPv6 shared method, yet.
All possible feature combinations
L | M | A | G | IPv4 | IPv6 | notes |
---|---|---|---|---|---|---|
no | no | no | no | method=disabled | unsupported | kernel's disable_ipv6 buggy |
no | no | no | yes | invalid | invalid | missing manual address |
no | no | yes | no | method=auto | invalid | missing IPv6 link-local address |
no | no | yes | yes | invalid | invalid | missing manual address |
no | yes | no | no | method=manual | unsupported | missing kernel feature |
no | yes | no | yes | method=shared | unsupported | missing kernel feature |
no | yes | yes | no | method=auto | unsupported | missing kernel feature |
no | yes | yes | yes | invalid | invalid | both sides of dynamic configuration |
yes | no | no | no | method=link-local | method=link-local | |
yes | no | no | yes | invalid | invalid | missing manual address |
yes | no | yes | no | unsupported | method=auto | |
yes | no | yes | yes | invalid | invalid | missing manual address |
yes | yes | no | no | unsupported | method=manual | |
yes | yes | no | yes | method=shared | unsupported | IPv6 connection sharing is not implemented |
yes | yes | yes | no | unsupported | method=auto | |
yes | yes | yes | yes | invalid | invalid | both sides of dynamic configuration |
- L: Automatic link-local addresses
- M: Manual addresses
- A: Automatic global address
- G: Gateway/DNS for other hosts
Notes
- There's a bug in the kernel (found by Dan Winship) that once setting IFF_UP with disable_ipv6=1 affects future state. But we shouldn't need disable_ipv6 just as we don't need disable_ipv4, see the next note.
- Kernel doesn't support turning link-local addressing on/off (without affecting other features). Some people may view it as a good thing, others as an undue limitation.
Proposal
Use one configuration directives per feature whenever possible, use multiple configuration directives per feature where further tweaking is needed.
Configuration directives
name | value | proposed meaning |
---|---|---|
link-local | enabled | configure LL address as soon as possible |
fallback | configure a LL address when other configuration methods failed | |
disabled | default for IPv4 | |
undefined | default for IPv6, use system default | |
rdisc | enabled | default |
disabled | skip directly to DHCP (if enabled) | |
ignored | a compatibility option to implement current method=ignore | |
dhcp | enabled | default |
disabled | don't use DHCP | |
router | enabled | provide connection sharing facilities |
disabled | default |
Notes
- Manual address configuration would be turned on by configuring at least one manual address.
Consequences on IPv6 configuration
LL | RD | DHCP | current status | notes |
---|---|---|---|---|
no | no | no | unsupported | |
no | no | yes | invalid | |
no | yes | no | invalid | |
no | yes | yes | invalid | |
yes | no | no | method=link-local/manual | link-local |
yes | no | yes | broken | link-local and DHCPv6 (without rdisc) |
yes | yes | no | unsupported | link-local and rdisc only |
yes | yes | yes | method=auto | link-local and rdisc, DHCPv6 if requested by router |
Notes
- For any valid combination of the above directives, you can optionally add one or more manually specified addresses.
- The DHCP only method is not properly implemented and it never worked.
Consequences on IPv4 configuration
LL | RD | DHCP | notes |
---|---|---|---|
no | no | method=disabled/manual | |
no | yes | method=auto | classic DHCP configuration |
yes | no | unsupported | link-local method doesn't allow manual addresses |
yes | yes | unsupported | immediate link-local, follow-up DHCP |
fallback | no | method=manual/link-local | not useful |
fallback | yes | unsupported | DHCP with fallback to link-local} |
DISCONNECTED state considerations
Interpretations of the DISCONNECTED state
No communication
The strictest and most secure interpretation of DISCONNECTED state would require the device to behave as if there was no physical connection, i.e. as if the cable was unplugged. That would mean *no* communication on the wire at all. Simplest way to implement it is to unset IFF_UP.
Problems:
- We can't wait for link carrier as that requires L1 communication, at the least.
- It would break non-IP protocols and IPv6 zeroconf networking
No IPv4/IPv6 communication
A hybrid interpretation of DISCONNECTED state is that L1 and L2 communication is allowed but the IP layer must be turned off.
Problems:
- It would break IPv6 zeroconf networking
No IPv4/IPv6 configuration except kernel-created link-local addresses
A relaxed interpretation that integrates well with zeroconf configuration. A kernel IPv6 link-local address is never removed unless a connection is activated whose configuration explicitly requests that.
Possible solutions
No size fits all. The best way to choose between those policies whould IMO be a sysctl used for turning link-local addresses on/off. That's not implemented in the kernel. Reversed value of disable_ipv6 could be theoretically used instead, as we don't expect any other configuration during the DISCONNECTED phase but it would have to be fixed in the kernel.
An alternative would be to add a global configuration directive to NetworkManager but that sounds redundant to me as people already use sysctls for stuff like that.
Zeroconf-friendly workflow example
1) The administrator allows IPv6 link-local addresses for all interfaces in /etc/sysctl.conf
and ensures the file is committed into kernel's runtime configuration. Currently he doesn't have to do anything as link-local addresses are enabled by default and there's no separate directive for link-local addresses.
2) Optional: Some of the wired interfaces are set up to be available using zeroconf. The kernel assings link-local IPv6 addresses to them.
3) NetworkManager is started and wants to manage an interface. It sets its IFF_UP flag if necessary. It sees that link-local addresses are enabled on the interface (from sysctl) and it doesn't perform any action that would result in removing the link-local address.