diff options
author | John Heffner <jheffner@psc.edu> | 2007-03-25 23:32:29 -0700 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-04-25 22:28:07 -0700 |
commit | 9af3912ec9e30509b76cb376abb65a4d8af27df3 (patch) | |
tree | d640cf87254d86ed6f0a862460d85029573763a5 /net/ipv4/ip_forward.c | |
parent | b3da2cf37c5c6e47698957a25ab43a7223dbb90f (diff) | |
download | op-kernel-dev-9af3912ec9e30509b76cb376abb65a4d8af27df3.zip op-kernel-dev-9af3912ec9e30509b76cb376abb65a4d8af27df3.tar.gz |
[NET] Move DF check to ip_forward
Do fragmentation check in ip_forward, similar to ipv6 forwarding.
Signed-off-by: John Heffner <jheffner@psc.edu>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/ip_forward.c')
-rw-r--r-- | net/ipv4/ip_forward.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/net/ipv4/ip_forward.c b/net/ipv4/ip_forward.c index 467ebed..61b30d1 100644 --- a/net/ipv4/ip_forward.c +++ b/net/ipv4/ip_forward.c @@ -85,6 +85,14 @@ int ip_forward(struct sk_buff *skb) if (opt->is_strictroute && rt->rt_dst != rt->rt_gateway) goto sr_failed; + if (unlikely(skb->len > dst_mtu(&rt->u.dst) && + (ip_hdr(skb)->frag_off & htons(IP_DF))) && !skb->local_df) { + IP_INC_STATS(IPSTATS_MIB_FRAGFAILS); + icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, + htonl(dst_mtu(&rt->u.dst))); + goto drop; + } + /* We are about to mangle packet. Copy it! */ if (skb_cow(skb, LL_RESERVED_SPACE(rt->u.dst.dev)+rt->u.dst.header_len)) goto drop; |