can: j1939: j1939_sk_bind(): return failure if netdev is down
[linux-2.6-microblaze.git] / net / ipv6 / xfrm6_output.c
index e34167f..8b84d53 100644 (file)
@@ -23,24 +23,7 @@ int xfrm6_find_1stfragopt(struct xfrm_state *x, struct sk_buff *skb,
 }
 EXPORT_SYMBOL(xfrm6_find_1stfragopt);
 
-static int xfrm6_local_dontfrag(struct sk_buff *skb)
-{
-       int proto;
-       struct sock *sk = skb->sk;
-
-       if (sk) {
-               if (sk->sk_family != AF_INET6)
-                       return 0;
-
-               proto = sk->sk_protocol;
-               if (proto == IPPROTO_UDP || proto == IPPROTO_RAW)
-                       return inet6_sk(sk)->dontfrag;
-       }
-
-       return 0;
-}
-
-static void xfrm6_local_rxpmtu(struct sk_buff *skb, u32 mtu)
+void xfrm6_local_rxpmtu(struct sk_buff *skb, u32 mtu)
 {
        struct flowi6 fl6;
        struct sock *sk = skb->sk;
@@ -64,80 +47,9 @@ void xfrm6_local_error(struct sk_buff *skb, u32 mtu)
        ipv6_local_error(sk, EMSGSIZE, &fl6, mtu);
 }
 
-static int xfrm6_tunnel_check_size(struct sk_buff *skb)
-{
-       int mtu, ret = 0;
-       struct dst_entry *dst = skb_dst(skb);
-
-       if (skb->ignore_df)
-               goto out;
-
-       mtu = dst_mtu(dst);
-       if (mtu < IPV6_MIN_MTU)
-               mtu = IPV6_MIN_MTU;
-
-       if ((!skb_is_gso(skb) && skb->len > mtu) ||
-           (skb_is_gso(skb) &&
-            !skb_gso_validate_network_len(skb, ip6_skb_dst_mtu(skb)))) {
-               skb->dev = dst->dev;
-               skb->protocol = htons(ETH_P_IPV6);
-
-               if (xfrm6_local_dontfrag(skb))
-                       xfrm6_local_rxpmtu(skb, mtu);
-               else if (skb->sk)
-                       xfrm_local_error(skb, mtu);
-               else
-                       icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
-               ret = -EMSGSIZE;
-       }
-out:
-       return ret;
-}
-
-int xfrm6_extract_output(struct xfrm_state *x, struct sk_buff *skb)
-{
-       int err;
-
-       err = xfrm6_tunnel_check_size(skb);
-       if (err)
-               return err;
-
-       XFRM_MODE_SKB_CB(skb)->protocol = ipv6_hdr(skb)->nexthdr;
-
-       return xfrm6_extract_header(skb);
-}
-
-int xfrm6_output_finish(struct sock *sk, struct sk_buff *skb)
-{
-       memset(IP6CB(skb), 0, sizeof(*IP6CB(skb)));
-
-       IP6CB(skb)->flags |= IP6SKB_XFRM_TRANSFORMED;
-
-       return xfrm_output(sk, skb);
-}
-
-static int __xfrm6_output_state_finish(struct xfrm_state *x, struct sock *sk,
-                                      struct sk_buff *skb)
-{
-       const struct xfrm_state_afinfo *afinfo;
-       int ret = -EAFNOSUPPORT;
-
-       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;
-}
-
 static int __xfrm6_output_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
 {
-       struct xfrm_state *x = skb_dst(skb)->xfrm;
-
-       return __xfrm6_output_state_finish(x, sk, skb);
+       return xfrm_output(sk, skb);
 }
 
 static int __xfrm6_output(struct net *net, struct sock *sk, struct sk_buff *skb)
@@ -164,7 +76,7 @@ static int __xfrm6_output(struct net *net, struct sock *sk, struct sk_buff *skb)
 
        toobig = skb->len > mtu && !skb_is_gso(skb);
 
-       if (toobig && xfrm6_local_dontfrag(skb)) {
+       if (toobig && xfrm6_local_dontfrag(skb->sk)) {
                xfrm6_local_rxpmtu(skb, mtu);
                kfree_skb(skb);
                return -EMSGSIZE;
@@ -179,7 +91,7 @@ static int __xfrm6_output(struct net *net, struct sock *sk, struct sk_buff *skb)
                                    __xfrm6_output_finish);
 
 skip_frag:
-       return __xfrm6_output_state_finish(x, sk, skb);
+       return xfrm_output(sk, skb);
 }
 
 int xfrm6_output(struct net *net, struct sock *sk, struct sk_buff *skb)