tcp: record received TOS value in the request socket

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>
This commit is contained in:
Wei Wang 2020-09-09 17:50:46 -07:00 committed by David S. Miller
parent 3a8c4ad161
commit e9b12edc13
3 changed files with 5 additions and 3 deletions

View File

@ -134,6 +134,7 @@ struct tcp_request_sock {
* FastOpen it's the seq# * FastOpen it's the seq#
* after data-in-SYN. * after data-in-SYN.
*/ */
u8 syn_tos;
}; };
static inline struct tcp_request_sock *tcp_rsk(const struct request_sock *req) static inline struct tcp_request_sock *tcp_rsk(const struct request_sock *req)

View File

@ -286,11 +286,10 @@ struct request_sock *cookie_tcp_reqsk_alloc(const struct request_sock_ops *ops,
struct sock *sk, struct sock *sk,
struct sk_buff *skb) struct sk_buff *skb)
{ {
struct tcp_request_sock *treq;
struct request_sock *req; struct request_sock *req;
#ifdef CONFIG_MPTCP #ifdef CONFIG_MPTCP
struct tcp_request_sock *treq;
if (sk_is_mptcp(sk)) if (sk_is_mptcp(sk))
ops = &mptcp_subflow_request_sock_ops; ops = &mptcp_subflow_request_sock_ops;
#endif #endif
@ -299,8 +298,9 @@ struct request_sock *cookie_tcp_reqsk_alloc(const struct request_sock_ops *ops,
if (!req) if (!req)
return NULL; return NULL;
#if IS_ENABLED(CONFIG_MPTCP)
treq = tcp_rsk(req); 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); treq->is_mptcp = sk_is_mptcp(sk);
if (treq->is_mptcp) { if (treq->is_mptcp) {
int err = mptcp_subflow_init_cookie_req(req, sk, skb); int err = mptcp_subflow_init_cookie_req(req, sk, skb);

View File

@ -6834,6 +6834,7 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops,
tcp_rsk(req)->snt_isn = isn; tcp_rsk(req)->snt_isn = isn;
tcp_rsk(req)->txhash = net_tx_rndhash(); 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); tcp_openreq_init_rwin(req, sk, dst);
sk_rx_queue_set(req_to_sk(req), skb); sk_rx_queue_set(req_to_sk(req), skb);
if (!want_cookie) { if (!want_cookie) {