]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
tcp: record received TOS value in the request socket
authorWei Wang <weiwan@google.com>
Thu, 10 Sep 2020 00:50:46 +0000 (17:50 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 10 Sep 2020 20:15:40 +0000 (13:15 -0700)
A new field is added to the request sock to record the TOS value
received on the listening socket during 3WHS:
When not under syn flood, it is recording the TOS value sent in SYN.
When under syn flood, it is recording the TOS value sent in the ACK.
This is a preparation patch in order to do TOS reflection in the later
commit.

Signed-off-by: Wei Wang <weiwan@google.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/tcp.h
net/ipv4/syncookies.c
net/ipv4/tcp_input.c

index 56ff2952edafbc3a26616359b5ae56318fcb8db0..2f87377e9af70b8b714f842170e0ba3ac9ffddf8 100644 (file)
@@ -134,6 +134,7 @@ struct tcp_request_sock {
                                                  * FastOpen it's the seq#
                                                  * after data-in-SYN.
                                                  */
+       u8                              syn_tos;
 };
 
 static inline struct tcp_request_sock *tcp_rsk(const struct request_sock *req)
index f0794f0232bae749244fff35d8b96b1f561a5e87..c375c126f436f160ccd656dff6b477f05363f73e 100644 (file)
@@ -286,11 +286,10 @@ struct request_sock *cookie_tcp_reqsk_alloc(const struct request_sock_ops *ops,
                                            struct sock *sk,
                                            struct sk_buff *skb)
 {
+       struct tcp_request_sock *treq;
        struct request_sock *req;
 
 #ifdef CONFIG_MPTCP
-       struct tcp_request_sock *treq;
-
        if (sk_is_mptcp(sk))
                ops = &mptcp_subflow_request_sock_ops;
 #endif
@@ -299,8 +298,9 @@ struct request_sock *cookie_tcp_reqsk_alloc(const struct request_sock_ops *ops,
        if (!req)
                return NULL;
 
-#if IS_ENABLED(CONFIG_MPTCP)
        treq = tcp_rsk(req);
+       treq->syn_tos = TCP_SKB_CB(skb)->ip_dsfield;
+#if IS_ENABLED(CONFIG_MPTCP)
        treq->is_mptcp = sk_is_mptcp(sk);
        if (treq->is_mptcp) {
                int err = mptcp_subflow_init_cookie_req(req, sk, skb);
index 4337841faeff9723ecb755026069dfe4b63a384f..3658ad84f0c6252658dd5174eae31dcde4b34942 100644 (file)
@@ -6834,6 +6834,7 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops,
 
        tcp_rsk(req)->snt_isn = isn;
        tcp_rsk(req)->txhash = net_tx_rndhash();
+       tcp_rsk(req)->syn_tos = TCP_SKB_CB(skb)->ip_dsfield;
        tcp_openreq_init_rwin(req, sk, dst);
        sk_rx_queue_set(req_to_sk(req), skb);
        if (!want_cookie) {