It is much cleaner to store the key-pointer in tcp_out_options. It
allows to remove some MD5-specific code out of the function-arguments
and paves the way to adopting the TCP-option framework with TCP-MD5.

Cc: Ivan Delalande <col...@arista.com>
Signed-off-by: Christoph Paasch <cpaa...@apple.com>
Reviewed-by: Mat Martineau <mathew.j.martin...@linux.intel.com>
---
 include/linux/tcp.h   |  1 +
 net/ipv4/tcp_output.c | 46 +++++++++++++++++++---------------------------
 2 files changed, 20 insertions(+), 27 deletions(-)

diff --git a/include/linux/tcp.h b/include/linux/tcp.h
index 0958b3760cfc..ef0279194ef9 100644
--- a/include/linux/tcp.h
+++ b/include/linux/tcp.h
@@ -131,6 +131,7 @@ struct tcp_out_options {
        __u8 *hash_location;    /* temporary pointer, overloaded */
        __u32 tsval, tsecr;     /* need to include OPTION_TS */
        struct tcp_fastopen_cookie *fastopen_cookie;    /* Fast open cookie */
+       struct tcp_md5sig_key *md5; /* TCP_MD5 signature key */
 };
 
 /* This is the max number of SACKS that we'll generate and process. It's safe
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index 549e33a30b41..facbdf4fe9be 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -520,21 +520,18 @@ static void tcp_options_write(__be32 *ptr, struct sk_buff 
*skb, struct sock *sk,
  * network wire format yet.
  */
 static unsigned int tcp_syn_options(struct sock *sk, struct sk_buff *skb,
-                               struct tcp_out_options *opts,
-                               struct tcp_md5sig_key **md5)
+                               struct tcp_out_options *opts)
 {
        struct tcp_sock *tp = tcp_sk(sk);
        unsigned int remaining = MAX_TCP_OPTION_SPACE;
        struct tcp_fastopen_request *fastopen = tp->fastopen_req;
 
 #ifdef CONFIG_TCP_MD5SIG
-       *md5 = tp->af_specific->md5_lookup(sk, sk);
-       if (*md5) {
+       opts->md5 = tp->af_specific->md5_lookup(sk, sk);
+       if (opts->md5) {
                opts->options |= OPTION_MD5;
                remaining -= TCPOLEN_MD5SIG_ALIGNED;
        }
-#else
-       *md5 = NULL;
 #endif
 
        /* We always get an MSS option.  The option bytes which will be seen in
@@ -549,7 +546,7 @@ static unsigned int tcp_syn_options(struct sock *sk, struct 
sk_buff *skb,
        opts->mss = tcp_advertise_mss(sk);
        remaining -= TCPOLEN_MSS_ALIGNED;
 
-       if (likely(sock_net(sk)->ipv4.sysctl_tcp_timestamps && !*md5)) {
+       if (likely(sock_net(sk)->ipv4.sysctl_tcp_timestamps && !opts->md5)) {
                opts->options |= OPTION_TS;
                opts->tsval = tcp_skb_timestamp(skb) + tp->tsoffset;
                opts->tsecr = tp->rx_opt.ts_recent;
@@ -593,14 +590,13 @@ static unsigned int tcp_synack_options(const struct sock 
*sk,
                                       struct request_sock *req,
                                       unsigned int mss, struct sk_buff *skb,
                                       struct tcp_out_options *opts,
-                                      const struct tcp_md5sig_key *md5,
                                       struct tcp_fastopen_cookie *foc)
 {
        struct inet_request_sock *ireq = inet_rsk(req);
        unsigned int remaining = MAX_TCP_OPTION_SPACE;
 
 #ifdef CONFIG_TCP_MD5SIG
-       if (md5) {
+       if (opts->md5) {
                opts->options |= OPTION_MD5;
                remaining -= TCPOLEN_MD5SIG_ALIGNED;
 
@@ -658,8 +654,7 @@ static unsigned int tcp_synack_options(const struct sock 
*sk,
  * final wire format yet.
  */
 static unsigned int tcp_established_options(struct sock *sk, struct sk_buff 
*skb,
-                                       struct tcp_out_options *opts,
-                                       struct tcp_md5sig_key **md5)
+                                       struct tcp_out_options *opts)
 {
        struct tcp_sock *tp = tcp_sk(sk);
        unsigned int size = 0;
@@ -668,13 +663,13 @@ static unsigned int tcp_established_options(struct sock 
*sk, struct sk_buff *skb
        opts->options = 0;
 
 #ifdef CONFIG_TCP_MD5SIG
-       *md5 = tp->af_specific->md5_lookup(sk, sk);
-       if (unlikely(*md5)) {
+       opts->md5 = tp->af_specific->md5_lookup(sk, sk);
+       if (unlikely(opts->md5)) {
                opts->options |= OPTION_MD5;
                size += TCPOLEN_MD5SIG_ALIGNED;
        }
 #else
-       *md5 = NULL;
+       opts->md5 = NULL;
 #endif
 
        if (likely(tp->rx_opt.tstamp_ok)) {
@@ -992,7 +987,6 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff 
*skb, int clone_it,
        struct tcp_out_options opts;
        unsigned int tcp_options_size, tcp_header_size;
        struct sk_buff *oskb = NULL;
-       struct tcp_md5sig_key *md5;
        struct tcphdr *th;
        int err;
 
@@ -1021,10 +1015,9 @@ static int tcp_transmit_skb(struct sock *sk, struct 
sk_buff *skb, int clone_it,
        memset(&opts, 0, sizeof(opts));
 
        if (unlikely(tcb->tcp_flags & TCPHDR_SYN))
-               tcp_options_size = tcp_syn_options(sk, skb, &opts, &md5);
+               tcp_options_size = tcp_syn_options(sk, skb, &opts);
        else
-               tcp_options_size = tcp_established_options(sk, skb, &opts,
-                                                          &md5);
+               tcp_options_size = tcp_established_options(sk, skb, &opts);
        tcp_header_size = tcp_options_size + sizeof(struct tcphdr);
 
        /* if no packet is in qdisc/device queue, then allow XPS to select
@@ -1090,10 +1083,10 @@ static int tcp_transmit_skb(struct sock *sk, struct 
sk_buff *skb, int clone_it,
        tcp_options_write((__be32 *)(th + 1), skb, sk, &opts);
 #ifdef CONFIG_TCP_MD5SIG
        /* Calculate the MD5 hash, as we have all we need now */
-       if (md5) {
+       if (opts.md5) {
                sk_nocaps_add(sk, NETIF_F_GSO_MASK);
                tp->af_specific->calc_md5_hash(opts.hash_location,
-                                              md5, sk, skb);
+                                              opts.md5, sk, skb);
        }
 #endif
 
@@ -1537,7 +1530,6 @@ unsigned int tcp_current_mss(struct sock *sk)
        u32 mss_now;
        unsigned int header_len;
        struct tcp_out_options opts;
-       struct tcp_md5sig_key *md5;
 
        mss_now = tp->mss_cache;
 
@@ -1547,7 +1539,7 @@ unsigned int tcp_current_mss(struct sock *sk)
                        mss_now = tcp_sync_mss(sk, mtu);
        }
 
-       header_len = tcp_established_options(sk, NULL, &opts, &md5) +
+       header_len = tcp_established_options(sk, NULL, &opts) +
                     sizeof(struct tcphdr);
        /* The mss_cache is sized based on tp->tcp_header_len, which assumes
         * some common options. If this is an odd packet (because we have SACK
@@ -3128,7 +3120,6 @@ struct sk_buff *tcp_make_synack(const struct sock *sk, 
struct dst_entry *dst,
 {
        struct inet_request_sock *ireq = inet_rsk(req);
        const struct tcp_sock *tp = tcp_sk(sk);
-       struct tcp_md5sig_key *md5 = NULL;
        struct tcp_out_options opts;
        struct sk_buff *skb;
        int tcp_header_size;
@@ -3174,10 +3165,10 @@ struct sk_buff *tcp_make_synack(const struct sock *sk, 
struct dst_entry *dst,
 
 #ifdef CONFIG_TCP_MD5SIG
        rcu_read_lock();
-       md5 = tcp_rsk(req)->af_specific->req_md5_lookup(sk, req_to_sk(req));
+       opts.md5 = tcp_rsk(req)->af_specific->req_md5_lookup(sk, 
req_to_sk(req));
 #endif
        skb_set_hash(skb, tcp_rsk(req)->txhash, PKT_HASH_TYPE_L4);
-       tcp_header_size = tcp_synack_options(sk, req, mss, skb, &opts, md5,
+       tcp_header_size = tcp_synack_options(sk, req, mss, skb, &opts,
                                             foc) + sizeof(*th);
 
        skb_push(skb, tcp_header_size);
@@ -3204,9 +3195,10 @@ struct sk_buff *tcp_make_synack(const struct sock *sk, 
struct dst_entry *dst,
 
 #ifdef CONFIG_TCP_MD5SIG
        /* Okay, we have all we need - do the md5 hash if needed */
-       if (md5)
+       if (opts.md5)
                tcp_rsk(req)->af_specific->calc_md5_hash(opts.hash_location,
-                                              md5, req_to_sk(req), skb);
+                                                        opts.md5,
+                                                        req_to_sk(req), skb);
        rcu_read_unlock();
 #endif
 
-- 
2.16.1

Reply via email to