ipmr: Add high byte of VIF ID to igmpmsg
Use the unused3 byte in struct igmpmsg to hold the high 8 bits of the VIF ID. If using more than 255 IPv4 multicast interfaces it is necessary to have access to a VIF ID for cache reports that is wider than 8 bits, the VIF ID present in the igmpmsg reports sent to mroute_sk was only 8 bits wide in the igmpmsg header. Adding the high 8 bits of the 16 bit VIF ID in the unused byte allows use of more than 255 IPv4 multicast interfaces. Signed-off-by: Paul Davey <paul.davey@alliedtelesis.co.nz> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
501cb00890
commit
c8715a8e9f
|
@ -113,8 +113,8 @@ struct igmpmsg {
|
|||
__u32 unused1,unused2;
|
||||
unsigned char im_msgtype; /* What is this */
|
||||
unsigned char im_mbz; /* Must be zero */
|
||||
unsigned char im_vif; /* Interface (this ought to be a vifi_t!) */
|
||||
unsigned char unused3;
|
||||
unsigned char im_vif; /* Low 8 bits of Interface */
|
||||
unsigned char im_vif_hi; /* High 8 bits of Interface */
|
||||
struct in_addr im_src,im_dst;
|
||||
};
|
||||
|
||||
|
|
|
@ -1038,10 +1038,13 @@ static int ipmr_cache_report(struct mr_table *mrt,
|
|||
memcpy(msg, skb_network_header(pkt), sizeof(struct iphdr));
|
||||
msg->im_msgtype = assert;
|
||||
msg->im_mbz = 0;
|
||||
if (assert == IGMPMSG_WRVIFWHOLE)
|
||||
if (assert == IGMPMSG_WRVIFWHOLE) {
|
||||
msg->im_vif = vifi;
|
||||
else
|
||||
msg->im_vif_hi = vifi >> 8;
|
||||
} else {
|
||||
msg->im_vif = mrt->mroute_reg_vif_num;
|
||||
msg->im_vif_hi = mrt->mroute_reg_vif_num >> 8;
|
||||
}
|
||||
ip_hdr(skb)->ihl = sizeof(struct iphdr) >> 2;
|
||||
ip_hdr(skb)->tot_len = htons(ntohs(ip_hdr(pkt)->tot_len) +
|
||||
sizeof(struct iphdr));
|
||||
|
@ -1054,6 +1057,7 @@ static int ipmr_cache_report(struct mr_table *mrt,
|
|||
ip_hdr(skb)->protocol = 0;
|
||||
msg = (struct igmpmsg *)skb_network_header(skb);
|
||||
msg->im_vif = vifi;
|
||||
msg->im_vif_hi = vifi >> 8;
|
||||
skb_dst_set(skb, dst_clone(skb_dst(pkt)));
|
||||
/* Add our header */
|
||||
igmp = skb_put(skb, sizeof(struct igmphdr));
|
||||
|
|
Loading…
Reference in New Issue