multicast IP datagram forwarding bug and fix (fwd)
From: Pekka Savola <hidden>
Date: 2003-08-04 06:06:04
I didn't see followups to this, so I'm re-sending to the list just in case it got dropped in the cracks.. -- Pekka Savola "You each name yourselves king, yet the Netcore Oy kingdom bleeds." Systems. Networks. Security. -- George R.R. Martin: A Clash of Kings ---------- Forwarded message ---------- Date: Mon, 28 Jul 2003 13:20:31 -0400 From: "Weng, Wending" <redacted> To: netdev@oss.sgi.com Subject: multicast IP datagram forwarding bug and fix
Hi,
LINUX doesn't forward multicast IP datagram if it has option(s), there is is a bug in the module ipmr.c, function
ipmr_forward_finish, below is the current version of this function:
static inline int ipmr_forward_finish(struct sk_buff *skb)
{
struct dst_entry *dst = skb->dst;
if (skb->len <= dst->pmtu)
return dst->output(skb);
else
return ip_fragment(skb, dst->output);
}
it forgets to recalculate the checksum in case the option is modified.
The following code works properly:
static inline int ipmr_forward_finish(struct sk_buff *skb)
{
struct dst_entry *dst = skb->dst;
ip_forward_options (skb); /* this line recalculates checksum if needed. */
if (skb->len <= dst->pmtu)
return dst->output(skb);
else
return ip_fragment(skb, dst->output);
}
Wending Weng