Skip to content

Commit bb74036

Browse files
Leone Fernandodavem330
authored andcommitted
ipmr: support IP_PKTINFO on cache report IGMP msg
In order to support IP_PKTINFO on those packets, we need to call ipv4_pktinfo_prepare. When sending mrouted/pimd daemons a cache report IGMP msg, it is unnecessary to set dst on the newly created skb. It used to be necessary on older versions until commit d826eb1 ("ipv4: PKTINFO doesnt need dst reference") which changed the way IP_PKTINFO struct is been retrieved. Changes from v1: 1. Undo changes in ipv4_pktinfo_prepare function. use it directly and copy the control block. Fixes: d826eb1 ("ipv4: PKTINFO doesnt need dst reference") Signed-off-by: Leone Fernando <[email protected]> Reviewed-by: Eric Dumazet <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 02fed6d commit bb74036

File tree

1 file changed

+6
-7
lines changed

1 file changed

+6
-7
lines changed

net/ipv4/ipmr.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1025,6 +1025,10 @@ static int ipmr_cache_report(const struct mr_table *mrt,
10251025
struct sk_buff *skb;
10261026
int ret;
10271027

1028+
mroute_sk = rcu_dereference(mrt->mroute_sk);
1029+
if (!mroute_sk)
1030+
return -EINVAL;
1031+
10281032
if (assert == IGMPMSG_WHOLEPKT || assert == IGMPMSG_WRVIFWHOLE)
10291033
skb = skb_realloc_headroom(pkt, sizeof(struct iphdr));
10301034
else
@@ -1069,7 +1073,8 @@ static int ipmr_cache_report(const struct mr_table *mrt,
10691073
msg = (struct igmpmsg *)skb_network_header(skb);
10701074
msg->im_vif = vifi;
10711075
msg->im_vif_hi = vifi >> 8;
1072-
skb_dst_set(skb, dst_clone(skb_dst(pkt)));
1076+
ipv4_pktinfo_prepare(mroute_sk, pkt);
1077+
memcpy(skb->cb, pkt->cb, sizeof(skb->cb));
10731078
/* Add our header */
10741079
igmp = skb_put(skb, sizeof(struct igmphdr));
10751080
igmp->type = assert;
@@ -1079,12 +1084,6 @@ static int ipmr_cache_report(const struct mr_table *mrt,
10791084
skb->transport_header = skb->network_header;
10801085
}
10811086

1082-
mroute_sk = rcu_dereference(mrt->mroute_sk);
1083-
if (!mroute_sk) {
1084-
kfree_skb(skb);
1085-
return -EINVAL;
1086-
}
1087-
10881087
igmpmsg_netlink_event(mrt, skb);
10891088

10901089
/* Deliver to mrouted */

0 commit comments

Comments
 (0)