Subject: Re: [Bugme-new] [Bug 8755] New: "ip -6 route change " behaves like "ip -6 route add"

From: Patrick McHardy <[email-masked]>
Date: Mon, 16 Jul 2007 15:01:49 +0200

Simon Arlott wrote:
> On 15/07/07 16:07, Patrick McHardy wrote:
> 
>>>>Changing an existing route:
>>>># ip -6 r show 2002::/16
>>>>2002::/16 dev sit0  metric 1024  expires 4482618sec mtu 1480 advmss 7140
>>>>hoplimit 4294967295
>>>># ip -6 r change 2002::/16 dev sit0 mtu 1280
>>>>RTNETLINK answers: File exists
> 
> ^ This is clearly a bug, since I'm trying to change an existing route
> and it gives an error as if it tried to add it.

Agreed.

>>>>Adding a route using "change":
>>>># ip -6 r change 2002::/17 dev sit0 mtu 1280
>>>># ip -6 r show 2002::/17
>>>>2002::/17 dev sit0  metric 1024  expires 21334368sec mtu 1280 advmss 1220
>>>>hoplimit 4294967295
> 
> ^ This shouldn't be possible!

That one will probably be impossible to fix since IPv6 has never checked
for NLM_F_EXCL, doing to now might break things.

>>There is a difference between "add" and "change". "add" will only add a
>>new address if there isn't already one with the same identity, "change"
>>will allow to change attributes of an existing address, like flags,
>>lifetime, ..., or behave similar to "add" in case the address doesn't
>>already exist.
>>
>>What kind of behaviour are you expecting?
> 
> 
> That "change" would actually change not simply add. It won't let me
> change anything and in fact can only add instead.

The code looks like it would support it properly. Please add a
few printks to inet6_rtm_newaddr to find out what goes wrong.

> Compare it to ipv4 where "change" never adds - "replace" is "change, or
> add". (Also, "replace" doesn't work for v6 either).

IPv4 doesn't check any netlink flags, so I don't think that is correct.