Skip to content

Commit 59d3efd

Browse files
martinwillikuba-moo
authored andcommitted
rtnetlink: Restore RTM_NEW/DELLINK notification behavior
The commits referenced below allows userspace to use the NLM_F_ECHO flag for RTM_NEW/DELLINK operations to receive unicast notifications for the affected link. Prior to these changes, applications may have relied on multicast notifications to learn the same information without specifying the NLM_F_ECHO flag. For such applications, the mentioned commits changed the behavior for requests not using NLM_F_ECHO. Multicast notifications are still received, but now use the portid of the requester and the sequence number of the request instead of zero values used previously. For the application, this message may be unexpected and likely handled as a response to the NLM_F_ACKed request, especially if it uses the same socket to handle requests and notifications. To fix existing applications relying on the old notification behavior, set the portid and sequence number in the notification only if the request included the NLM_F_ECHO flag. This restores the old behavior for applications not using it, but allows unicasted notifications for others. Fixes: f3a63cc ("rtnetlink: Honour NLM_F_ECHO flag in rtnl_delete_link") Fixes: d88e136 ("rtnetlink: Honour NLM_F_ECHO flag in rtnl_newlink_create") Signed-off-by: Martin Willi <martin@strongswan.org> Acked-by: Guillaume Nault <gnault@redhat.com> Acked-by: Hangbin Liu <liuhangbin@gmail.com> Link: https://lore.kernel.org/r/20230411074319.24133-1-martin@strongswan.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent 136f36c commit 59d3efd

3 files changed

Lines changed: 12 additions & 4 deletions

File tree

include/linux/rtnetlink.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ void rtmsg_ifinfo_newnet(int type, struct net_device *dev, unsigned int change,
2525
struct sk_buff *rtmsg_ifinfo_build_skb(int type, struct net_device *dev,
2626
unsigned change, u32 event,
2727
gfp_t flags, int *new_nsid,
28-
int new_ifindex, u32 portid, u32 seq);
28+
int new_ifindex, u32 portid,
29+
const struct nlmsghdr *nlh);
2930
void rtmsg_ifinfo_send(struct sk_buff *skb, struct net_device *dev,
3031
gfp_t flags, u32 portid, const struct nlmsghdr *nlh);
3132

net/core/dev.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10847,7 +10847,7 @@ void unregister_netdevice_many_notify(struct list_head *head,
1084710847
dev->rtnl_link_state == RTNL_LINK_INITIALIZED)
1084810848
skb = rtmsg_ifinfo_build_skb(RTM_DELLINK, dev, ~0U, 0,
1084910849
GFP_KERNEL, NULL, 0,
10850-
portid, nlmsg_seq(nlh));
10850+
portid, nlh);
1085110851

1085210852
/*
1085310853
* Flush the unicast and multicast chains

net/core/rtnetlink.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3972,16 +3972,23 @@ static int rtnl_dump_all(struct sk_buff *skb, struct netlink_callback *cb)
39723972
struct sk_buff *rtmsg_ifinfo_build_skb(int type, struct net_device *dev,
39733973
unsigned int change,
39743974
u32 event, gfp_t flags, int *new_nsid,
3975-
int new_ifindex, u32 portid, u32 seq)
3975+
int new_ifindex, u32 portid,
3976+
const struct nlmsghdr *nlh)
39763977
{
39773978
struct net *net = dev_net(dev);
39783979
struct sk_buff *skb;
39793980
int err = -ENOBUFS;
3981+
u32 seq = 0;
39803982

39813983
skb = nlmsg_new(if_nlmsg_size(dev, 0), flags);
39823984
if (skb == NULL)
39833985
goto errout;
39843986

3987+
if (nlmsg_report(nlh))
3988+
seq = nlmsg_seq(nlh);
3989+
else
3990+
portid = 0;
3991+
39853992
err = rtnl_fill_ifinfo(skb, dev, dev_net(dev),
39863993
type, portid, seq, change, 0, 0, event,
39873994
new_nsid, new_ifindex, -1, flags);
@@ -4017,7 +4024,7 @@ static void rtmsg_ifinfo_event(int type, struct net_device *dev,
40174024
return;
40184025

40194026
skb = rtmsg_ifinfo_build_skb(type, dev, change, event, flags, new_nsid,
4020-
new_ifindex, portid, nlmsg_seq(nlh));
4027+
new_ifindex, portid, nlh);
40214028
if (skb)
40224029
rtmsg_ifinfo_send(skb, dev, flags, portid, nlh);
40234030
}

0 commit comments

Comments
 (0)