diff options
Diffstat (limited to 'net/ipv4/xfrm4_output.c')
-rw-r--r-- | net/ipv4/xfrm4_output.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/net/ipv4/xfrm4_output.c b/net/ipv4/xfrm4_output.c index 327a617d594c..7a5491ffa4de 100644 --- a/net/ipv4/xfrm4_output.c +++ b/net/ipv4/xfrm4_output.c | |||
@@ -33,8 +33,7 @@ static int xfrm4_tunnel_check_size(struct sk_buff *skb) | |||
33 | mtu = dst_mtu(dst); | 33 | mtu = dst_mtu(dst); |
34 | if (skb->len > mtu) { | 34 | if (skb->len > mtu) { |
35 | if (skb->sk) | 35 | if (skb->sk) |
36 | ip_local_error(skb->sk, EMSGSIZE, ip_hdr(skb)->daddr, | 36 | xfrm_local_error(skb, mtu); |
37 | inet_sk(skb->sk)->inet_dport, mtu); | ||
38 | else | 37 | else |
39 | icmp_send(skb, ICMP_DEST_UNREACH, | 38 | icmp_send(skb, ICMP_DEST_UNREACH, |
40 | ICMP_FRAG_NEEDED, htonl(mtu)); | 39 | ICMP_FRAG_NEEDED, htonl(mtu)); |
@@ -99,3 +98,12 @@ int xfrm4_output(struct sk_buff *skb) | |||
99 | x->outer_mode->afinfo->output_finish, | 98 | x->outer_mode->afinfo->output_finish, |
100 | !(IPCB(skb)->flags & IPSKB_REROUTED)); | 99 | !(IPCB(skb)->flags & IPSKB_REROUTED)); |
101 | } | 100 | } |
101 | |||
102 | void xfrm4_local_error(struct sk_buff *skb, u32 mtu) | ||
103 | { | ||
104 | struct iphdr *hdr; | ||
105 | |||
106 | hdr = skb->encapsulation ? inner_ip_hdr(skb) : ip_hdr(skb); | ||
107 | ip_local_error(skb->sk, EMSGSIZE, hdr->daddr, | ||
108 | inet_sk(skb->sk)->inet_dport, mtu); | ||
109 | } | ||