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 --- |