Ignore:
Timestamp:
Apr 16, 2017, 3:07:01 PM (6 weeks ago)
Author:
brainslayer
Message:

update

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/linux/universal/linux-3.18/net/ipv6/tcp_ipv6.c

    r30256 r31869  
    394394
    395395        if (type == NDISC_REDIRECT) {
    396                 struct dst_entry *dst = __sk_dst_check(sk, np->dst_cookie);
    397 
    398                 if (dst)
    399                         dst->ops->redirect(dst, sk, skb);
     396                if (!sock_owned_by_user(sk)) {
     397                        struct dst_entry *dst = __sk_dst_check(sk, np->dst_cookie);
     398
     399                        if (dst)
     400                                dst->ops->redirect(dst, sk, skb);
     401                }
    400402                goto out;
    401403        }
     
    10541056}
    10551057
     1058static void tcp_v6_restore_cb(struct sk_buff *skb)
     1059{
     1060        /* We need to move header back to the beginning if xfrm6_policy_check()
     1061         * and tcp_v6_fill_cb() are going to be called again.
     1062         * ip6_datagram_recv_specific_ctl() also expects IP6CB to be there.
     1063         */
     1064        memmove(IP6CB(skb), &TCP_SKB_CB(skb)->header.h6,
     1065                sizeof(struct inet6_skb_parm));
     1066}
     1067
    10561068static struct sock *tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
    10571069                                         struct request_sock *req,
     
    11851197                consume_skb(ireq->pktopts);
    11861198                ireq->pktopts = NULL;
    1187                 if (newnp->pktoptions)
     1199                if (newnp->pktoptions) {
     1200                        tcp_v6_restore_cb(newnp->pktoptions);
    11881201                        skb_set_owner_r(newnp->pktoptions, newsk);
     1202                }
    11891203        }
    11901204        newnp->opt        = NULL;
     
    13861400                if (ipv6_opt_accepted(sk, opt_skb, &TCP_SKB_CB(opt_skb)->header.h6)) {
    13871401                        skb_set_owner_r(opt_skb, sk);
     1402                        tcp_v6_restore_cb(opt_skb);
    13881403                        opt_skb = xchg(&np->pktoptions, opt_skb);
    13891404                } else {
     
    14171432        TCP_SKB_CB(skb)->ip_dsfield = ipv6_get_dsfield(hdr);
    14181433        TCP_SKB_CB(skb)->sacked = 0;
    1419 }
    1420 
    1421 static void tcp_v6_restore_cb(struct sk_buff *skb)
    1422 {
    1423         /* We need to move header back to the beginning if xfrm6_policy_check()
    1424          * and tcp_v6_fill_cb() are going to be called again.
    1425          */
    1426         memmove(IP6CB(skb), &TCP_SKB_CB(skb)->header.h6,
    1427                 sizeof(struct inet6_skb_parm));
    14281434}
    14291435
Note: See TracChangeset for help on using the changeset viewer.