Message ID | 20191007115835.17882-1-nicolas.dichtel@6wind.com |
---|---|
State | Changes Requested |
Delegated to: | David Miller |
Headers | show |
Series | [net] netns: fix NLM_F_ECHO mechanism for RTM_NEWNSID | expand |
On Mon, Oct 07, 2019 at 01:58:35PM +0200, Nicolas Dichtel wrote: > The flag NLM_F_ECHO aims to reply to the user the message notified to all > listeners. > It was not the case with the command RTM_NEWNSID, let's fix this. > > Fixes: 0c7aecd4bde4 ("netns: add rtnl cmd to add and get peer netns ids") > Reported-by: Guillaume Nault <gnault@redhat.com> > Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com> > --- > net/core/net_namespace.c | 15 +++++++++------ > 1 file changed, 9 insertions(+), 6 deletions(-) > > diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c > index a0e0d298c991..f496ce0e8da8 100644 > --- a/net/core/net_namespace.c > +++ b/net/core/net_namespace.c > -static void rtnl_net_notifyid(struct net *net, int cmd, int id) > +static void rtnl_net_notifyid(struct net *net, int cmd, int id, u32 portid, > + struct nlmsghdr *nlh) > { > struct net_fill_args fillargs = { > .cmd = cmd, We also need to set .portid and .seq otherwise rtnl_net_fill() builds a netlink message with invalid port id and sequence number (as you noted in your previous message).
Le 09/10/2019 à 01:10, Guillaume Nault a écrit : [snip] > We also need to set .portid and .seq otherwise rtnl_net_fill() builds > a netlink message with invalid port id and sequence number (as you > noted in your previous message). > Yes you're right. I don't know why, I had in mind that nl msg sent by the kernel should have the portid and seq number set to 0. Will send a v2. Thank you, Nicolas
On Wed, Oct 09, 2019 at 10:07:56AM +0200, Nicolas Dichtel wrote: > Le 09/10/2019 à 01:10, Guillaume Nault a écrit : > [snip] > > We also need to set .portid and .seq otherwise rtnl_net_fill() builds > > a netlink message with invalid port id and sequence number (as you > > noted in your previous message). > > > Yes you're right. I don't know why, I had in mind that nl msg sent by the kernel > should have the portid and seq number set to 0. > Will send a v2. > I guess this idea comes from the fact that portid and seq don't carry any meaningful information when the message is sent to a multicast group.
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index a0e0d298c991..f496ce0e8da8 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c @@ -245,7 +245,8 @@ static int __peernet2id(struct net *net, struct net *peer) return __peernet2id_alloc(net, peer, &no); } -static void rtnl_net_notifyid(struct net *net, int cmd, int id); +static void rtnl_net_notifyid(struct net *net, int cmd, int id, u32 portid, + struct nlmsghdr *nlh); /* This function returns the id of a peer netns. If no id is assigned, one will * be allocated and returned. */ @@ -268,7 +269,7 @@ int peernet2id_alloc(struct net *net, struct net *peer) id = __peernet2id_alloc(net, peer, &alloc); spin_unlock_bh(&net->nsid_lock); if (alloc && id >= 0) - rtnl_net_notifyid(net, RTM_NEWNSID, id); + rtnl_net_notifyid(net, RTM_NEWNSID, id, 0, NULL); if (alive) put_net(peer); return id; @@ -532,7 +533,7 @@ static void unhash_nsid(struct net *net, struct net *last) idr_remove(&tmp->netns_ids, id); spin_unlock_bh(&tmp->nsid_lock); if (id >= 0) - rtnl_net_notifyid(tmp, RTM_DELNSID, id); + rtnl_net_notifyid(tmp, RTM_DELNSID, id, 0, NULL); if (tmp == last) break; } @@ -764,7 +765,8 @@ static int rtnl_net_newid(struct sk_buff *skb, struct nlmsghdr *nlh, err = alloc_netid(net, peer, nsid); spin_unlock_bh(&net->nsid_lock); if (err >= 0) { - rtnl_net_notifyid(net, RTM_NEWNSID, err); + rtnl_net_notifyid(net, RTM_NEWNSID, err, NETLINK_CB(skb).portid, + nlh); err = 0; } else if (err == -ENOSPC && nsid >= 0) { err = -EEXIST; @@ -1051,7 +1053,8 @@ static int rtnl_net_dumpid(struct sk_buff *skb, struct netlink_callback *cb) return err < 0 ? err : skb->len; } -static void rtnl_net_notifyid(struct net *net, int cmd, int id) +static void rtnl_net_notifyid(struct net *net, int cmd, int id, u32 portid, + struct nlmsghdr *nlh) { struct net_fill_args fillargs = { .cmd = cmd, @@ -1068,7 +1071,7 @@ static void rtnl_net_notifyid(struct net *net, int cmd, int id) if (err < 0) goto err_out; - rtnl_notify(msg, net, 0, RTNLGRP_NSID, NULL, 0); + rtnl_notify(msg, net, portid, RTNLGRP_NSID, nlh, 0); return; err_out:
The flag NLM_F_ECHO aims to reply to the user the message notified to all listeners. It was not the case with the command RTM_NEWNSID, let's fix this. Fixes: 0c7aecd4bde4 ("netns: add rtnl cmd to add and get peer netns ids") Reported-by: Guillaume Nault <gnault@redhat.com> Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com> --- net/core/net_namespace.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)