]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/ipv6/ip6_output.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[karo-tx-linux.git] / net / ipv6 / ip6_output.c
index 1699acb2fa2c835cb9fb18cee9148f2732878c5d..5f2657d98e82a792e02ba9b372790e13e2d4c947 100644 (file)
@@ -67,9 +67,6 @@ static int ip6_finish_output2(struct net *net, struct sock *sk, struct sk_buff *
        struct in6_addr *nexthop;
        int ret;
 
-       skb->protocol = htons(ETH_P_IPV6);
-       skb->dev = dev;
-
        if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr)) {
                struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb));
 
@@ -154,6 +151,9 @@ int ip6_output(struct net *net, struct sock *sk, struct sk_buff *skb)
        struct net_device *dev = skb_dst(skb)->dev;
        struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb));
 
+       skb->protocol = htons(ETH_P_IPV6);
+       skb->dev = dev;
+
        if (unlikely(idev->cnf.disable_ipv6)) {
                IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS);
                kfree_skb(skb);
@@ -682,7 +682,7 @@ int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
                skb_frag_list_init(skb);
 
                __skb_pull(skb, hlen);
-               fh = (struct frag_hdr *)__skb_push(skb, sizeof(struct frag_hdr));
+               fh = __skb_push(skb, sizeof(struct frag_hdr));
                __skb_push(skb, hlen);
                skb_reset_network_header(skb);
                memcpy(skb_network_header(skb), tmp_hdr, hlen);
@@ -698,15 +698,13 @@ int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
                ipv6_hdr(skb)->payload_len = htons(first_len -
                                                   sizeof(struct ipv6hdr));
 
-               dst_hold(&rt->dst);
-
                for (;;) {
                        /* Prepare header of the next frame,
                         * before previous one went down. */
                        if (frag) {
                                frag->ip_summed = CHECKSUM_NONE;
                                skb_reset_transport_header(frag);
-                               fh = (struct frag_hdr *)__skb_push(frag, sizeof(struct frag_hdr));
+                               fh = __skb_push(frag, sizeof(struct frag_hdr));
                                __skb_push(frag, hlen);
                                skb_reset_network_header(frag);
                                memcpy(skb_network_header(frag), tmp_hdr,
@@ -742,7 +740,6 @@ int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
                if (err == 0) {
                        IP6_INC_STATS(net, ip6_dst_idev(&rt->dst),
                                      IPSTATS_MIB_FRAGOKS);
-                       ip6_rt_put(rt);
                        return 0;
                }
 
@@ -750,7 +747,6 @@ int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
 
                IP6_INC_STATS(net, ip6_dst_idev(&rt->dst),
                              IPSTATS_MIB_FRAGFAILS);
-               ip6_rt_put(rt);
                return err;
 
 slow_path_clean:
@@ -869,7 +865,6 @@ fail_toobig:
        if (skb->sk && dst_allfrag(skb_dst(skb)))
                sk_nocaps_add(skb->sk, NETIF_F_GSO_MASK);
 
-       skb->dev = skb_dst(skb)->dev;
        icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
        err = -EMSGSIZE;