tcp_ipv6.c (9a64e8e0ace51b309fdcff4b4754b3649250382a) tcp_ipv6.c (81aded24675ebda5de8a68843250ad15584ac38a)
1/*
2 * TCP over IPv6
3 * Linux INET6 implementation
4 *
5 * Authors:
6 * Pedro Roque <roque@di.fc.ul.pt>
7 *
8 * Based on:

--- 401 unchanged lines hidden (view full) ---

410 if (IS_ERR(dst)) {
411 sk->sk_err_soft = -PTR_ERR(dst);
412 goto out;
413 }
414
415 } else
416 dst_hold(dst);
417
1/*
2 * TCP over IPv6
3 * Linux INET6 implementation
4 *
5 * Authors:
6 * Pedro Roque <roque@di.fc.ul.pt>
7 *
8 * Based on:

--- 401 unchanged lines hidden (view full) ---

410 if (IS_ERR(dst)) {
411 sk->sk_err_soft = -PTR_ERR(dst);
412 goto out;
413 }
414
415 } else
416 dst_hold(dst);
417
418 dst->ops->update_pmtu(dst, ntohl(info));
419
418 if (inet_csk(sk)->icsk_pmtu_cookie > dst_mtu(dst)) {
419 tcp_sync_mss(sk, dst_mtu(dst));
420 tcp_simple_retransmit(sk);
421 } /* else let the usual retransmit timer handle it */
422 dst_release(dst);
423 goto out;
424 }
425

--- 91 unchanged lines hidden (view full) ---

517 skb_set_queue_mapping(skb, queue_mapping);
518 err = ip6_xmit(sk, skb, &fl6, opt, np->tclass);
519 err = net_xmit_eval(err);
520 }
521
522done:
523 if (opt && opt != np->opt)
524 sock_kfree_s(sk, opt, opt->tot_len);
420 if (inet_csk(sk)->icsk_pmtu_cookie > dst_mtu(dst)) {
421 tcp_sync_mss(sk, dst_mtu(dst));
422 tcp_simple_retransmit(sk);
423 } /* else let the usual retransmit timer handle it */
424 dst_release(dst);
425 goto out;
426 }
427

--- 91 unchanged lines hidden (view full) ---

519 skb_set_queue_mapping(skb, queue_mapping);
520 err = ip6_xmit(sk, skb, &fl6, opt, np->tclass);
521 err = net_xmit_eval(err);
522 }
523
524done:
525 if (opt && opt != np->opt)
526 sock_kfree_s(sk, opt, opt->tot_len);
525 dst_release(dst);
526 return err;
527}
528
529static int tcp_v6_rtx_synack(struct sock *sk, struct request_sock *req,
530 struct request_values *rvp)
531{
532 TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_RETRANSSEGS);
533 return tcp_v6_send_synack(sk, req, rvp, 0);

--- 1194 unchanged lines hidden (view full) ---

1728 break;
1729 case TCP_TW_RST:
1730 goto no_tcp_socket;
1731 case TCP_TW_SUCCESS:;
1732 }
1733 goto discard_it;
1734}
1735
527 return err;
528}
529
530static int tcp_v6_rtx_synack(struct sock *sk, struct request_sock *req,
531 struct request_values *rvp)
532{
533 TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_RETRANSSEGS);
534 return tcp_v6_send_synack(sk, req, rvp, 0);

--- 1194 unchanged lines hidden (view full) ---

1729 break;
1730 case TCP_TW_RST:
1731 goto no_tcp_socket;
1732 case TCP_TW_SUCCESS:;
1733 }
1734 goto discard_it;
1735}
1736
1736static struct inet_peer *tcp_v6_get_peer(struct sock *sk, bool *release_it)
1737static struct inet_peer *tcp_v6_get_peer(struct sock *sk)
1737{
1738 struct rt6_info *rt = (struct rt6_info *) __sk_dst_get(sk);
1739 struct ipv6_pinfo *np = inet6_sk(sk);
1738{
1739 struct rt6_info *rt = (struct rt6_info *) __sk_dst_get(sk);
1740 struct ipv6_pinfo *np = inet6_sk(sk);
1740 struct inet_peer *peer;
1741
1741
1742 if (!rt ||
1743 !ipv6_addr_equal(&np->daddr, &rt->rt6i_dst.addr)) {
1744 peer = inet_getpeer_v6(&np->daddr, 1);
1745 *release_it = true;
1746 } else {
1747 if (!rt->rt6i_peer)
1748 rt6_bind_peer(rt, 1);
1749 peer = rt->rt6i_peer;
1750 *release_it = false;
1751 }
1752
1753 return peer;
1742 /* If we don't have a valid cached route, or we're doing IP
1743 * options which make the IPv6 header destination address
1744 * different from our peer's, do not bother with this.
1745 */
1746 if (!rt || !ipv6_addr_equal(&np->daddr, &rt->rt6i_dst.addr))
1747 return NULL;
1748 return rt6_get_peer_create(rt);
1754}
1755
1749}
1750
1756static void *tcp_v6_tw_get_peer(struct sock *sk)
1757{
1758 const struct inet6_timewait_sock *tw6 = inet6_twsk(sk);
1759 const struct inet_timewait_sock *tw = inet_twsk(sk);
1760
1761 if (tw->tw_family == AF_INET)
1762 return tcp_v4_tw_get_peer(sk);
1763
1764 return inet_getpeer_v6(&tw6->tw_v6_daddr, 1);
1765}
1766
1767static struct timewait_sock_ops tcp6_timewait_sock_ops = {
1768 .twsk_obj_size = sizeof(struct tcp6_timewait_sock),
1769 .twsk_unique = tcp_twsk_unique,
1770 .twsk_destructor= tcp_twsk_destructor,
1751static struct timewait_sock_ops tcp6_timewait_sock_ops = {
1752 .twsk_obj_size = sizeof(struct tcp6_timewait_sock),
1753 .twsk_unique = tcp_twsk_unique,
1754 .twsk_destructor= tcp_twsk_destructor,
1771 .twsk_getpeer = tcp_v6_tw_get_peer,
1772};
1773
1774static const struct inet_connection_sock_af_ops ipv6_specific = {
1775 .queue_xmit = inet6_csk_xmit,
1776 .send_check = tcp_v6_send_check,
1777 .rebuild_header = inet6_sk_rebuild_header,
1778 .conn_request = tcp_v6_conn_request,
1779 .syn_recv_sock = tcp_v6_syn_recv_sock,

--- 371 unchanged lines hidden ---
1755};
1756
1757static const struct inet_connection_sock_af_ops ipv6_specific = {
1758 .queue_xmit = inet6_csk_xmit,
1759 .send_check = tcp_v6_send_check,
1760 .rebuild_header = inet6_sk_rebuild_header,
1761 .conn_request = tcp_v6_conn_request,
1762 .syn_recv_sock = tcp_v6_syn_recv_sock,

--- 371 unchanged lines hidden ---