diff options
| -rw-r--r-- | include/net/xfrm.h | 4 | ||||
| -rw-r--r-- | net/xfrm/xfrm_output.c | 10 |
2 files changed, 11 insertions, 3 deletions
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index b41d2d10ff0e..ac5b02515355 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
| @@ -1728,9 +1728,9 @@ static inline int xfrm_skb_dst_mtu(struct sk_buff *skb) | |||
| 1728 | { | 1728 | { |
| 1729 | struct sock *sk = skb->sk; | 1729 | struct sock *sk = skb->sk; |
| 1730 | 1730 | ||
| 1731 | if (sk && sk->sk_family == AF_INET6) | 1731 | if (sk && skb->protocol == htons(ETH_P_IPV6)) |
| 1732 | return ip6_skb_dst_mtu(skb); | 1732 | return ip6_skb_dst_mtu(skb); |
| 1733 | else if (sk && sk->sk_family == AF_INET) | 1733 | else if (sk && skb->protocol == htons(ETH_P_IP)) |
| 1734 | return ip_skb_dst_mtu(skb); | 1734 | return ip_skb_dst_mtu(skb); |
| 1735 | return dst_mtu(skb_dst(skb)); | 1735 | return dst_mtu(skb_dst(skb)); |
| 1736 | } | 1736 | } |
diff --git a/net/xfrm/xfrm_output.c b/net/xfrm/xfrm_output.c index 6f5fc612b162..3bb2cdc13b46 100644 --- a/net/xfrm/xfrm_output.c +++ b/net/xfrm/xfrm_output.c | |||
| @@ -216,9 +216,17 @@ int xfrm_inner_extract_output(struct xfrm_state *x, struct sk_buff *skb) | |||
| 216 | 216 | ||
| 217 | void xfrm_local_error(struct sk_buff *skb, int mtu) | 217 | void xfrm_local_error(struct sk_buff *skb, int mtu) |
| 218 | { | 218 | { |
| 219 | unsigned int proto; | ||
| 219 | struct xfrm_state_afinfo *afinfo; | 220 | struct xfrm_state_afinfo *afinfo; |
| 220 | 221 | ||
| 221 | afinfo = xfrm_state_get_afinfo(skb->sk->sk_family); | 222 | if (skb->protocol == htons(ETH_P_IP)) |
| 223 | proto = AF_INET; | ||
| 224 | else if (skb->protocol == htons(ETH_P_IPV6)) | ||
| 225 | proto = AF_INET6; | ||
| 226 | else | ||
| 227 | return; | ||
| 228 | |||
| 229 | afinfo = xfrm_state_get_afinfo(proto); | ||
| 222 | if (!afinfo) | 230 | if (!afinfo) |
| 223 | return; | 231 | return; |
| 224 | 232 | ||
