| From foo@baz Thu Apr 10 22:03:04 PDT 2014 |
| From: Nicolas Dichtel <nicolas.dichtel@6wind.com> |
| Date: Wed, 19 Mar 2014 17:47:51 +0100 |
| Subject: ip6mr: fix mfc notification flags |
| |
| From: Nicolas Dichtel <nicolas.dichtel@6wind.com> |
| |
| [ Upstream commit f518338b16038beeb73e155e60d0f70beb9379f4 ] |
| |
| Commit 812e44dd1829 ("ip6mr: advertise new mfc entries via rtnl") reuses the |
| function ip6mr_fill_mroute() to notify mfc events. |
| But this function was used only for dump and thus was always setting the |
| flag NLM_F_MULTI, which is wrong in case of a single notification. |
| |
| Libraries like libnl will wait forever for NLMSG_DONE. |
| |
| CC: Thomas Graf <tgraf@suug.ch> |
| Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com> |
| Acked-by: Thomas Graf <tgraf@suug.ch> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/ipv6/ip6mr.c | 13 ++++++++----- |
| 1 file changed, 8 insertions(+), 5 deletions(-) |
| |
| --- a/net/ipv6/ip6mr.c |
| +++ b/net/ipv6/ip6mr.c |
| @@ -2349,13 +2349,14 @@ int ip6mr_get_route(struct net *net, |
| } |
| |
| static int ip6mr_fill_mroute(struct mr6_table *mrt, struct sk_buff *skb, |
| - u32 portid, u32 seq, struct mfc6_cache *c, int cmd) |
| + u32 portid, u32 seq, struct mfc6_cache *c, int cmd, |
| + int flags) |
| { |
| struct nlmsghdr *nlh; |
| struct rtmsg *rtm; |
| int err; |
| |
| - nlh = nlmsg_put(skb, portid, seq, cmd, sizeof(*rtm), NLM_F_MULTI); |
| + nlh = nlmsg_put(skb, portid, seq, cmd, sizeof(*rtm), flags); |
| if (nlh == NULL) |
| return -EMSGSIZE; |
| |
| @@ -2423,7 +2424,7 @@ static void mr6_netlink_event(struct mr6 |
| if (skb == NULL) |
| goto errout; |
| |
| - err = ip6mr_fill_mroute(mrt, skb, 0, 0, mfc, cmd); |
| + err = ip6mr_fill_mroute(mrt, skb, 0, 0, mfc, cmd, 0); |
| if (err < 0) |
| goto errout; |
| |
| @@ -2462,7 +2463,8 @@ static int ip6mr_rtm_dumproute(struct sk |
| if (ip6mr_fill_mroute(mrt, skb, |
| NETLINK_CB(cb->skb).portid, |
| cb->nlh->nlmsg_seq, |
| - mfc, RTM_NEWROUTE) < 0) |
| + mfc, RTM_NEWROUTE, |
| + NLM_F_MULTI) < 0) |
| goto done; |
| next_entry: |
| e++; |
| @@ -2476,7 +2478,8 @@ next_entry: |
| if (ip6mr_fill_mroute(mrt, skb, |
| NETLINK_CB(cb->skb).portid, |
| cb->nlh->nlmsg_seq, |
| - mfc, RTM_NEWROUTE) < 0) { |
| + mfc, RTM_NEWROUTE, |
| + NLM_F_MULTI) < 0) { |
| spin_unlock_bh(&mfc_unres_lock); |
| goto done; |
| } |