Merge branch 'stable/for-linus-5.11' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / net / ipv4 / xfrm4_output.c
index 30ddb9d..3cff51b 100644 (file)
 #include <net/xfrm.h>
 #include <net/icmp.h>
 
-static int xfrm4_tunnel_check_size(struct sk_buff *skb)
-{
-       int mtu, ret = 0;
-
-       if (IPCB(skb)->flags & IPSKB_XFRM_TUNNEL_SIZE)
-               goto out;
-
-       if (!(ip_hdr(skb)->frag_off & htons(IP_DF)) || skb->ignore_df)
-               goto out;
-
-       mtu = dst_mtu(skb_dst(skb));
-       if ((!skb_is_gso(skb) && skb->len > mtu) ||
-           (skb_is_gso(skb) &&
-            !skb_gso_validate_network_len(skb, ip_skb_dst_mtu(skb->sk, skb)))) {
-               skb->protocol = htons(ETH_P_IP);
-
-               if (skb->sk)
-                       xfrm_local_error(skb, mtu);
-               else
-                       icmp_send(skb, ICMP_DEST_UNREACH,
-                                 ICMP_FRAG_NEEDED, htonl(mtu));
-               ret = -EMSGSIZE;
-       }
-out:
-       return ret;
-}
-
-int xfrm4_extract_output(struct xfrm_state *x, struct sk_buff *skb)
-{
-       int err;
-
-       err = xfrm4_tunnel_check_size(skb);
-       if (err)
-               return err;
-
-       XFRM_MODE_SKB_CB(skb)->protocol = ip_hdr(skb)->protocol;
-
-       return xfrm4_extract_header(skb);
-}
-
-int xfrm4_output_finish(struct sock *sk, struct sk_buff *skb)
-{
-       memset(IPCB(skb), 0, sizeof(*IPCB(skb)));
-
-       IPCB(skb)->flags |= IPSKB_XFRM_TRANSFORMED;
-
-       return xfrm_output(sk, skb);
-}
-
 static int __xfrm4_output(struct net *net, struct sock *sk, struct sk_buff *skb)
 {
+#ifdef CONFIG_NETFILTER
        struct xfrm_state *x = skb_dst(skb)->xfrm;
-       const struct xfrm_state_afinfo *afinfo;
-       int ret = -EAFNOSUPPORT;
 
-#ifdef CONFIG_NETFILTER
        if (!x) {
                IPCB(skb)->flags |= IPSKB_REROUTED;
                return dst_output(net, sk, skb);
        }
 #endif
 
-       rcu_read_lock();
-       afinfo = xfrm_state_afinfo_get_rcu(x->outer_mode.family);
-       if (likely(afinfo))
-               ret = afinfo->output_finish(sk, skb);
-       else
-               kfree_skb(skb);
-       rcu_read_unlock();
-
-       return ret;
+       return xfrm_output(sk, skb);
 }
 
 int xfrm4_output(struct net *net, struct sock *sk, struct sk_buff *skb)