> 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
|