Skip to content

Commit

Permalink
ipv6: send netlink notifications for manually configured addresses
Browse files Browse the repository at this point in the history
Send a netlink notification when userspace adds a manually configured
address if DAD is enabled and optimistic flag isn't set.
Moreover send RTM_DELADDR notifications for tentative addresses.

Some userspace applications (e.g. NetworkManager) are interested in
addr netlink events albeit the address is still in tentative state,
however events are not sent if DAD process is not completed.
If the address is added and immediately removed userspace listeners
are not notified. This behaviour can be easily reproduced by using
veth interfaces:

$ ip -b - <<EOF
> link add dev vm1 type veth peer name vm2
> link set dev vm1 up
> link set dev vm2 up
> addr add 2001:db8:a:b:1:2:3:4/64 dev vm1
> addr del 2001:db8:a:b:1:2:3:4/64 dev vm1
EOF

This patch reverts the behaviour introduced by the commit f784ad3
("ipv6: do not send RTM_DELADDR for tentative addresses")

Suggested-by: Thomas Haller <thaller@redhat.com>
Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
LorenzoBianconi authored and davem330 committed Apr 17, 2018
1 parent a64dcdd commit a2d481b
Showing 1 changed file with 5 additions and 8 deletions.
13 changes: 5 additions & 8 deletions net/ipv6/addrconf.c
Original file line number Diff line number Diff line change
Expand Up @@ -2901,6 +2901,11 @@ static int inet6_addr_add(struct net *net, int ifindex,
expires, flags);
}

/* Send a netlink notification if DAD is enabled and
* optimistic flag is not set
*/
if (!(ifp->flags & (IFA_F_OPTIMISTIC | IFA_F_NODAD)))
ipv6_ifa_notify(0, ifp);
/*
* Note that section 3.1 of RFC 4429 indicates
* that the Optimistic flag should not be set for
Expand Down Expand Up @@ -5028,14 +5033,6 @@ static void inet6_ifa_notify(int event, struct inet6_ifaddr *ifa)
struct net *net = dev_net(ifa->idev->dev);
int err = -ENOBUFS;

/* Don't send DELADDR notification for TENTATIVE address,
* since NEWADDR notification is sent only after removing
* TENTATIVE flag, if DAD has not failed.
*/
if (ifa->flags & IFA_F_TENTATIVE && !(ifa->flags & IFA_F_DADFAILED) &&
event == RTM_DELADDR)
return;

skb = nlmsg_new(inet6_ifaddr_msgsize(), GFP_ATOMIC);
if (!skb)
goto errout;
Expand Down

0 comments on commit a2d481b

Please sign in to comment.