Commit ee91501f authored by Herbert Xu's avatar Herbert Xu Committed by David S. Miller

[IPSEC]: Get rid of dst_pmtu/ext2_header_len

Here is a patch that replaces all occurrences of dst_pmtu in the TCP
stack.  As a result we no longer need ext2_header_len.

This has a nice synergetic effect with Arnaldo's latest change to
linux/tcp.h :)

I'll be removing other users of dst->path/dst_pmtu next.
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b62c32db
...@@ -284,10 +284,13 @@ struct tcp_sock { ...@@ -284,10 +284,13 @@ struct tcp_sock {
__u32 mss_cache; /* Cached effective mss, not including SACKS */ __u32 mss_cache; /* Cached effective mss, not including SACKS */
__u16 mss_cache_std; /* Like mss_cache, but without TSO */ __u16 mss_cache_std; /* Like mss_cache, but without TSO */
__u16 ext_header_len; /* Network protocol overhead (IP/IPv6 options) */ __u16 ext_header_len; /* Network protocol overhead (IP/IPv6 options) */
__u16 ext2_header_len;/* Options depending on route */
__u8 ca_state; /* State of fast-retransmit machine */ __u8 ca_state; /* State of fast-retransmit machine */
__u8 retransmits; /* Number of unrecovered RTO timeouts. */ __u8 retransmits; /* Number of unrecovered RTO timeouts. */
__u16 advmss; /* Advertised MSS */
__u32 window_clamp; /* Maximal window to advertise */
__u32 rcv_ssthresh; /* Current window clamp */
__u32 frto_highmark; /* snd_nxt when RTO occurred */ __u32 frto_highmark; /* snd_nxt when RTO occurred */
__u8 reordering; /* Packet reordering metric. */ __u8 reordering; /* Packet reordering metric. */
__u8 frto_counter; /* Number of new acks after RTO */ __u8 frto_counter; /* Number of new acks after RTO */
...@@ -345,14 +348,9 @@ struct tcp_sock { ...@@ -345,14 +348,9 @@ struct tcp_sock {
struct tcp_sack_block duplicate_sack[1]; /* D-SACK block */ struct tcp_sack_block duplicate_sack[1]; /* D-SACK block */
struct tcp_sack_block selective_acks[4]; /* The SACKS themselves*/ struct tcp_sack_block selective_acks[4]; /* The SACKS themselves*/
__u32 window_clamp; /* Maximal window to advertise */
__u32 rcv_ssthresh; /* Current window clamp */
__u16 advmss; /* Advertised MSS */
__u8 syn_retries; /* num of allowed syn retries */ __u8 syn_retries; /* num of allowed syn retries */
__u8 ecn_flags; /* ECN status bits. */ __u8 ecn_flags; /* ECN status bits. */
__u16 prior_ssthresh; /* ssthresh saved at recovery start */ __u16 prior_ssthresh; /* ssthresh saved at recovery start */
__u16 __pad1;
__u32 lost_out; /* Lost packets */ __u32 lost_out; /* Lost packets */
__u32 sacked_out; /* SACK'd packets */ __u32 sacked_out; /* SACK'd packets */
__u32 fackets_out; /* FACK'd packets */ __u32 fackets_out; /* FACK'd packets */
......
...@@ -831,7 +831,6 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) ...@@ -831,7 +831,6 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
/* OK, now commit destination to socket. */ /* OK, now commit destination to socket. */
__sk_dst_set(sk, &rt->u.dst); __sk_dst_set(sk, &rt->u.dst);
tcp_v4_setup_caps(sk, &rt->u.dst); tcp_v4_setup_caps(sk, &rt->u.dst);
tp->ext2_header_len = rt->u.dst.header_len;
if (!tp->write_seq) if (!tp->write_seq)
tp->write_seq = secure_tcp_sequence_number(inet->saddr, tp->write_seq = secure_tcp_sequence_number(inet->saddr,
...@@ -941,10 +940,10 @@ static inline void do_pmtu_discovery(struct sock *sk, struct iphdr *iph, ...@@ -941,10 +940,10 @@ static inline void do_pmtu_discovery(struct sock *sk, struct iphdr *iph,
/* Something is about to be wrong... Remember soft error /* Something is about to be wrong... Remember soft error
* for the case, if this connection will not able to recover. * for the case, if this connection will not able to recover.
*/ */
if (mtu < dst_pmtu(dst) && ip_dont_fragment(sk, dst)) if (mtu < dst_mtu(dst) && ip_dont_fragment(sk, dst))
sk->sk_err_soft = EMSGSIZE; sk->sk_err_soft = EMSGSIZE;
mtu = dst_pmtu(dst); mtu = dst_mtu(dst);
if (inet->pmtudisc != IP_PMTUDISC_DONT && if (inet->pmtudisc != IP_PMTUDISC_DONT &&
tp->pmtu_cookie > mtu) { tp->pmtu_cookie > mtu) {
...@@ -1578,10 +1577,9 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb, ...@@ -1578,10 +1577,9 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
newtp->ext_header_len = 0; newtp->ext_header_len = 0;
if (newinet->opt) if (newinet->opt)
newtp->ext_header_len = newinet->opt->optlen; newtp->ext_header_len = newinet->opt->optlen;
newtp->ext2_header_len = dst->header_len;
newinet->id = newtp->write_seq ^ jiffies; newinet->id = newtp->write_seq ^ jiffies;
tcp_sync_mss(newsk, dst_pmtu(dst)); tcp_sync_mss(newsk, dst_mtu(dst));
newtp->advmss = dst_metric(dst, RTAX_ADVMSS); newtp->advmss = dst_metric(dst, RTAX_ADVMSS);
tcp_initialize_rcv_mss(newsk); tcp_initialize_rcv_mss(newsk);
...@@ -1877,7 +1875,6 @@ static int tcp_v4_reselect_saddr(struct sock *sk) ...@@ -1877,7 +1875,6 @@ static int tcp_v4_reselect_saddr(struct sock *sk)
__sk_dst_set(sk, &rt->u.dst); __sk_dst_set(sk, &rt->u.dst);
tcp_v4_setup_caps(sk, &rt->u.dst); tcp_v4_setup_caps(sk, &rt->u.dst);
tcp_sk(sk)->ext2_header_len = rt->u.dst.header_len;
new_saddr = rt->rt_src; new_saddr = rt->rt_src;
...@@ -1937,7 +1934,6 @@ int tcp_v4_rebuild_header(struct sock *sk) ...@@ -1937,7 +1934,6 @@ int tcp_v4_rebuild_header(struct sock *sk)
if (!err) { if (!err) {
__sk_dst_set(sk, &rt->u.dst); __sk_dst_set(sk, &rt->u.dst);
tcp_v4_setup_caps(sk, &rt->u.dst); tcp_v4_setup_caps(sk, &rt->u.dst);
tcp_sk(sk)->ext2_header_len = rt->u.dst.header_len;
return 0; return 0;
} }
......
...@@ -632,12 +632,8 @@ int tcp_trim_head(struct sock *sk, struct sk_buff *skb, u32 len) ...@@ -632,12 +632,8 @@ int tcp_trim_head(struct sock *sk, struct sk_buff *skb, u32 len)
unsigned int tcp_sync_mss(struct sock *sk, u32 pmtu) unsigned int tcp_sync_mss(struct sock *sk, u32 pmtu)
{ {
struct tcp_sock *tp = tcp_sk(sk); struct tcp_sock *tp = tcp_sk(sk);
struct dst_entry *dst = __sk_dst_get(sk);
int mss_now; int mss_now;
if (dst && dst->ops->get_mss)
pmtu = dst->ops->get_mss(dst, pmtu);
/* Calculate base mss without TCP options: /* Calculate base mss without TCP options:
It is MMS_S - sizeof(tcphdr) of rfc1122 It is MMS_S - sizeof(tcphdr) of rfc1122
*/ */
...@@ -648,7 +644,7 @@ unsigned int tcp_sync_mss(struct sock *sk, u32 pmtu) ...@@ -648,7 +644,7 @@ unsigned int tcp_sync_mss(struct sock *sk, u32 pmtu)
mss_now = tp->rx_opt.mss_clamp; mss_now = tp->rx_opt.mss_clamp;
/* Now subtract optional transport overhead */ /* Now subtract optional transport overhead */
mss_now -= tp->ext_header_len + tp->ext2_header_len; mss_now -= tp->ext_header_len;
/* Then reserve room for full set of TCP options and 8 bytes of data */ /* Then reserve room for full set of TCP options and 8 bytes of data */
if (mss_now < 48) if (mss_now < 48)
...@@ -684,9 +680,8 @@ unsigned int tcp_current_mss(struct sock *sk, int large) ...@@ -684,9 +680,8 @@ unsigned int tcp_current_mss(struct sock *sk, int large)
mss_now = tp->mss_cache_std; mss_now = tp->mss_cache_std;
if (dst) { if (dst) {
u32 mtu = dst_pmtu(dst); u32 mtu = dst_mtu(dst);
if (mtu != tp->pmtu_cookie || if (mtu != tp->pmtu_cookie)
tp->ext2_header_len != dst->header_len)
mss_now = tcp_sync_mss(sk, mtu); mss_now = tcp_sync_mss(sk, mtu);
} }
...@@ -698,8 +693,7 @@ unsigned int tcp_current_mss(struct sock *sk, int large) ...@@ -698,8 +693,7 @@ unsigned int tcp_current_mss(struct sock *sk, int large)
unsigned int large_mss, factor, limit; unsigned int large_mss, factor, limit;
large_mss = 65535 - tp->af_specific->net_header_len - large_mss = 65535 - tp->af_specific->net_header_len -
tp->ext_header_len - tp->ext2_header_len - tp->ext_header_len - tp->tcp_header_len;
tp->tcp_header_len;
if (tp->max_window && large_mss > (tp->max_window>>1)) if (tp->max_window && large_mss > (tp->max_window>>1))
large_mss = max((tp->max_window>>1), large_mss = max((tp->max_window>>1),
...@@ -1444,7 +1438,7 @@ static inline void tcp_connect_init(struct sock *sk) ...@@ -1444,7 +1438,7 @@ static inline void tcp_connect_init(struct sock *sk)
if (tp->rx_opt.user_mss) if (tp->rx_opt.user_mss)
tp->rx_opt.mss_clamp = tp->rx_opt.user_mss; tp->rx_opt.mss_clamp = tp->rx_opt.user_mss;
tp->max_window = 0; tp->max_window = 0;
tcp_sync_mss(sk, dst_pmtu(dst)); tcp_sync_mss(sk, dst_mtu(dst));
if (!tp->window_clamp) if (!tp->window_clamp)
tp->window_clamp = dst_metric(dst, RTAX_WINDOW); tp->window_clamp = dst_metric(dst, RTAX_WINDOW);
......
...@@ -782,7 +782,6 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr, ...@@ -782,7 +782,6 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
tp->ext_header_len = 0; tp->ext_header_len = 0;
if (np->opt) if (np->opt)
tp->ext_header_len = np->opt->opt_flen + np->opt->opt_nflen; tp->ext_header_len = np->opt->opt_flen + np->opt->opt_nflen;
tp->ext2_header_len = dst->header_len;
tp->rx_opt.mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) - sizeof(struct ipv6hdr); tp->rx_opt.mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) - sizeof(struct ipv6hdr);
...@@ -894,8 +893,8 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, ...@@ -894,8 +893,8 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
} else } else
dst_hold(dst); dst_hold(dst);
if (tp->pmtu_cookie > dst_pmtu(dst)) { if (tp->pmtu_cookie > dst_mtu(dst)) {
tcp_sync_mss(sk, dst_pmtu(dst)); tcp_sync_mss(sk, dst_mtu(dst));
tcp_simple_retransmit(sk); tcp_simple_retransmit(sk);
} /* else let the usual retransmit timer handle it */ } /* else let the usual retransmit timer handle it */
dst_release(dst); dst_release(dst);
...@@ -1524,9 +1523,8 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, ...@@ -1524,9 +1523,8 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
if (newnp->opt) if (newnp->opt)
newtp->ext_header_len = newnp->opt->opt_nflen + newtp->ext_header_len = newnp->opt->opt_nflen +
newnp->opt->opt_flen; newnp->opt->opt_flen;
newtp->ext2_header_len = dst->header_len;
tcp_sync_mss(newsk, dst_pmtu(dst)); tcp_sync_mss(newsk, dst_mtu(dst));
newtp->advmss = dst_metric(dst, RTAX_ADVMSS); newtp->advmss = dst_metric(dst, RTAX_ADVMSS);
tcp_initialize_rcv_mss(newsk); tcp_initialize_rcv_mss(newsk);
...@@ -1873,7 +1871,6 @@ static int tcp_v6_rebuild_header(struct sock *sk) ...@@ -1873,7 +1871,6 @@ static int tcp_v6_rebuild_header(struct sock *sk)
ip6_dst_store(sk, dst, NULL); ip6_dst_store(sk, dst, NULL);
sk->sk_route_caps = dst->dev->features & sk->sk_route_caps = dst->dev->features &
~(NETIF_F_IP_CSUM | NETIF_F_TSO); ~(NETIF_F_IP_CSUM | NETIF_F_TSO);
tcp_sk(sk)->ext2_header_len = dst->header_len;
} }
return 0; return 0;
...@@ -1927,7 +1924,6 @@ static int tcp_v6_xmit(struct sk_buff *skb, int ipfragok) ...@@ -1927,7 +1924,6 @@ static int tcp_v6_xmit(struct sk_buff *skb, int ipfragok)
ip6_dst_store(sk, dst, NULL); ip6_dst_store(sk, dst, NULL);
sk->sk_route_caps = dst->dev->features & sk->sk_route_caps = dst->dev->features &
~(NETIF_F_IP_CSUM | NETIF_F_TSO); ~(NETIF_F_IP_CSUM | NETIF_F_TSO);
tcp_sk(sk)->ext2_header_len = dst->header_len;
} }
skb->dst = dst_clone(dst); skb->dst = dst_clone(dst);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment