mptcp: annotate access for msk keys
authorPaolo Abeni <pabeni@redhat.com>
Fri, 2 Feb 2024 11:40:07 +0000 (12:40 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 5 Feb 2024 11:18:09 +0000 (11:18 +0000)
Both the local and the remote key follow the same locking
schema, put in place the proper ONCE accessors.

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Mat Martineau <martineau@kernel.org>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/mptcp/options.c
net/mptcp/protocol.c
net/mptcp/protocol.h
net/mptcp/subflow.c

index d2527d189a799319c068a5b76a5816cc7a905861..5e2b130d868049d27c6697360d5447df6a6302b2 100644 (file)
@@ -689,8 +689,8 @@ static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff *
        opts->suboptions |= OPTION_MPTCP_ADD_ADDR;
        if (!echo) {
                MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ADDADDRTX);
-               opts->ahmac = add_addr_generate_hmac(msk->local_key,
-                                                    msk->remote_key,
+               opts->ahmac = add_addr_generate_hmac(READ_ONCE(msk->local_key),
+                                                    READ_ONCE(msk->remote_key),
                                                     &opts->addr);
        } else {
                MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ECHOADDTX);
@@ -792,7 +792,7 @@ static bool mptcp_established_options_fastclose(struct sock *sk,
 
        *size = TCPOLEN_MPTCP_FASTCLOSE;
        opts->suboptions |= OPTION_MPTCP_FASTCLOSE;
-       opts->rcvr_key = msk->remote_key;
+       opts->rcvr_key = READ_ONCE(msk->remote_key);
 
        pr_debug("FASTCLOSE key=%llu", opts->rcvr_key);
        MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFASTCLOSETX);
@@ -1099,8 +1099,8 @@ static bool add_addr_hmac_valid(struct mptcp_sock *msk,
        if (mp_opt->echo)
                return true;
 
-       hmac = add_addr_generate_hmac(msk->remote_key,
-                                     msk->local_key,
+       hmac = add_addr_generate_hmac(READ_ONCE(msk->remote_key),
+                                     READ_ONCE(msk->local_key),
                                      &mp_opt->addr);
 
        pr_debug("msk=%p, ahmac=%llu, mp_opt->ahmac=%llu\n",
@@ -1147,7 +1147,7 @@ bool mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)
 
        if (unlikely(mp_opt.suboptions != OPTION_MPTCP_DSS)) {
                if ((mp_opt.suboptions & OPTION_MPTCP_FASTCLOSE) &&
-                   msk->local_key == mp_opt.rcvr_key) {
+                   READ_ONCE(msk->local_key) == mp_opt.rcvr_key) {
                        WRITE_ONCE(msk->rcv_fastclose, true);
                        mptcp_schedule_work((struct sock *)msk);
                        MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFASTCLOSERX);
index 028e8b473626f122db6e3e664414b2f0447fae69..874f019c5093a399eb7a8c0f36920143831849e4 100644 (file)
@@ -3193,7 +3193,7 @@ struct sock *mptcp_sk_clone_init(const struct sock *sk,
        __mptcp_init_sock(nsk);
 
        msk = mptcp_sk(nsk);
-       msk->local_key = subflow_req->local_key;
+       WRITE_ONCE(msk->local_key, subflow_req->local_key);
        msk->token = subflow_req->token;
        msk->in_accept_queue = 1;
        WRITE_ONCE(msk->fully_established, false);
index 3517f2d24a226ff0be1adec800044810f1aa31c6..13b8cf8ec7044d421a91aca186d71752c2c68a43 100644 (file)
@@ -260,8 +260,10 @@ struct mptcp_data_frag {
 struct mptcp_sock {
        /* inet_connection_sock must be the first member */
        struct inet_connection_sock sk;
-       u64             local_key;
-       u64             remote_key;
+       u64             local_key;              /* protected by the first subflow socket lock
+                                                * lockless access read
+                                                */
+       u64             remote_key;             /* same as above */
        u64             write_seq;
        u64             bytes_sent;
        u64             snd_nxt;
index 0dcb721c89d193e8943aa414610fcf4284d51f38..d60b83511302b48cd7e65d3291cb477a973bf593 100644 (file)
@@ -75,7 +75,8 @@ static void subflow_req_create_thmac(struct mptcp_subflow_request_sock *subflow_
 
        get_random_bytes(&subflow_req->local_nonce, sizeof(u32));
 
-       subflow_generate_hmac(msk->local_key, msk->remote_key,
+       subflow_generate_hmac(READ_ONCE(msk->local_key),
+                             READ_ONCE(msk->remote_key),
                              subflow_req->local_nonce,
                              subflow_req->remote_nonce, hmac);
 
@@ -694,7 +695,8 @@ static bool subflow_hmac_valid(const struct request_sock *req,
        if (!msk)
                return false;
 
-       subflow_generate_hmac(msk->remote_key, msk->local_key,
+       subflow_generate_hmac(READ_ONCE(msk->remote_key),
+                             READ_ONCE(msk->local_key),
                              subflow_req->remote_nonce,
                              subflow_req->local_nonce, hmac);
 
@@ -1530,8 +1532,8 @@ int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_addr_info *loc,
        mptcp_pm_get_flags_and_ifindex_by_id(msk, local_id,
                                             &flags, &ifindex);
        subflow->remote_key_valid = 1;
-       subflow->remote_key = msk->remote_key;
-       subflow->local_key = msk->local_key;
+       subflow->remote_key = READ_ONCE(msk->remote_key);
+       subflow->local_key = READ_ONCE(msk->local_key);
        subflow->token = msk->token;
        mptcp_info2sockaddr(loc, &addr, ssk->sk_family);