Skip to content

Commit a6fb986

Browse files
committed
Merge branch 'tcp-support-rstreasons-in-the-passive-logic'
Jason Xing says: ==================== tcp: support rstreasons in the passive logic In this series, I split all kinds of reasons into five part which, I think, can be easily reviewed. I respectively implement corresponding rstreasons in those functions. After this, we can trace the whole tcp passive reset with clear reasons. ==================== Link: https://lore.kernel.org/r/20240510122502.27850-1-kerneljasonxing@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2 parents 0621be4 + 11f46ea commit a6fb986

File tree

4 files changed

+64
-3
lines changed

4 files changed

+64
-3
lines changed

include/net/rstreason.h

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,15 @@
88
#define DEFINE_RST_REASON(FN, FNe) \
99
FN(NOT_SPECIFIED) \
1010
FN(NO_SOCKET) \
11+
FN(TCP_INVALID_ACK_SEQUENCE) \
12+
FN(TCP_RFC7323_PAWS) \
13+
FN(TCP_TOO_OLD_ACK) \
14+
FN(TCP_ACK_UNSENT_DATA) \
15+
FN(TCP_FLAGS) \
16+
FN(TCP_OLD_ACK) \
17+
FN(TCP_ABORT_ON_DATA) \
18+
FN(TCP_TIMEWAIT_SOCKET) \
19+
FN(INVALID_SYN) \
1120
FN(MPTCP_RST_EUNSPEC) \
1221
FN(MPTCP_RST_EMPTCP) \
1322
FN(MPTCP_RST_ERESOURCE) \
@@ -37,6 +46,44 @@ enum sk_rst_reason {
3746
SK_RST_REASON_NOT_SPECIFIED,
3847
/** @SK_RST_REASON_NO_SOCKET: no valid socket that can be used */
3948
SK_RST_REASON_NO_SOCKET,
49+
/**
50+
* @SK_RST_REASON_TCP_INVALID_ACK_SEQUENCE: Not acceptable ACK SEQ
51+
* field because ack sequence is not in the window between snd_una
52+
* and snd_nxt
53+
*/
54+
SK_RST_REASON_TCP_INVALID_ACK_SEQUENCE,
55+
/**
56+
* @SK_RST_REASON_TCP_RFC7323_PAWS: PAWS check, corresponding to
57+
* LINUX_MIB_PAWSESTABREJECTED, LINUX_MIB_PAWSACTIVEREJECTED
58+
*/
59+
SK_RST_REASON_TCP_RFC7323_PAWS,
60+
/** @SK_RST_REASON_TCP_TOO_OLD_ACK: TCP ACK is too old */
61+
SK_RST_REASON_TCP_TOO_OLD_ACK,
62+
/**
63+
* @SK_RST_REASON_TCP_ACK_UNSENT_DATA: TCP ACK for data we haven't
64+
* sent yet
65+
*/
66+
SK_RST_REASON_TCP_ACK_UNSENT_DATA,
67+
/** @SK_RST_REASON_TCP_FLAGS: TCP flags invalid */
68+
SK_RST_REASON_TCP_FLAGS,
69+
/** @SK_RST_REASON_TCP_OLD_ACK: TCP ACK is old, but in window */
70+
SK_RST_REASON_TCP_OLD_ACK,
71+
/**
72+
* @SK_RST_REASON_TCP_ABORT_ON_DATA: abort on data
73+
* corresponding to LINUX_MIB_TCPABORTONDATA
74+
*/
75+
SK_RST_REASON_TCP_ABORT_ON_DATA,
76+
77+
/* Here start with the independent reasons */
78+
/** @SK_RST_REASON_TCP_TIMEWAIT_SOCKET: happen on the timewait socket */
79+
SK_RST_REASON_TCP_TIMEWAIT_SOCKET,
80+
/**
81+
* @SK_RST_REASON_INVALID_SYN: receive bad syn packet
82+
* RFC 793 says if the state is not CLOSED/LISTEN/SYN-SENT then
83+
* "fourth, check the SYN bit,...If the SYN is in the window it is
84+
* an error, send a reset"
85+
*/
86+
SK_RST_REASON_INVALID_SYN,
4087

4188
/* Copy from include/uapi/linux/mptcp.h.
4289
* These reset fields will not be changed since they adhere to
@@ -113,6 +160,20 @@ sk_rst_convert_drop_reason(enum skb_drop_reason reason)
113160
return SK_RST_REASON_NOT_SPECIFIED;
114161
case SKB_DROP_REASON_NO_SOCKET:
115162
return SK_RST_REASON_NO_SOCKET;
163+
case SKB_DROP_REASON_TCP_INVALID_ACK_SEQUENCE:
164+
return SK_RST_REASON_TCP_INVALID_ACK_SEQUENCE;
165+
case SKB_DROP_REASON_TCP_RFC7323_PAWS:
166+
return SK_RST_REASON_TCP_RFC7323_PAWS;
167+
case SKB_DROP_REASON_TCP_TOO_OLD_ACK:
168+
return SK_RST_REASON_TCP_TOO_OLD_ACK;
169+
case SKB_DROP_REASON_TCP_ACK_UNSENT_DATA:
170+
return SK_RST_REASON_TCP_ACK_UNSENT_DATA;
171+
case SKB_DROP_REASON_TCP_FLAGS:
172+
return SK_RST_REASON_TCP_FLAGS;
173+
case SKB_DROP_REASON_TCP_OLD_ACK:
174+
return SK_RST_REASON_TCP_OLD_ACK;
175+
case SKB_DROP_REASON_TCP_ABORT_ON_DATA:
176+
return SK_RST_REASON_TCP_ABORT_ON_DATA;
116177
default:
117178
/* If we don't have our own corresponding reason */
118179
return SK_RST_REASON_NOT_SPECIFIED;

net/ipv4/tcp_ipv4.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2427,7 +2427,7 @@ int tcp_v4_rcv(struct sk_buff *skb)
24272427
tcp_v4_timewait_ack(sk, skb);
24282428
break;
24292429
case TCP_TW_RST:
2430-
tcp_v4_send_reset(sk, skb, sk_rst_convert_drop_reason(drop_reason));
2430+
tcp_v4_send_reset(sk, skb, SK_RST_REASON_TCP_TIMEWAIT_SOCKET);
24312431
inet_twsk_deschedule_put(inet_twsk(sk));
24322432
goto discard_it;
24332433
case TCP_TW_SUCCESS:;

net/ipv4/tcp_minisocks.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -879,7 +879,7 @@ struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
879879
* avoid becoming vulnerable to outside attack aiming at
880880
* resetting legit local connections.
881881
*/
882-
req->rsk_ops->send_reset(sk, skb, SK_RST_REASON_NOT_SPECIFIED);
882+
req->rsk_ops->send_reset(sk, skb, SK_RST_REASON_INVALID_SYN);
883883
} else if (fastopen) { /* received a valid RST pkt */
884884
reqsk_fastopen_remove(sk, req, true);
885885
tcp_reset(sk, skb);

net/ipv6/tcp_ipv6.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1999,7 +1999,7 @@ INDIRECT_CALLABLE_SCOPE int tcp_v6_rcv(struct sk_buff *skb)
19991999
tcp_v6_timewait_ack(sk, skb);
20002000
break;
20012001
case TCP_TW_RST:
2002-
tcp_v6_send_reset(sk, skb, sk_rst_convert_drop_reason(drop_reason));
2002+
tcp_v6_send_reset(sk, skb, SK_RST_REASON_TCP_TIMEWAIT_SOCKET);
20032003
inet_twsk_deschedule_put(inet_twsk(sk));
20042004
goto discard_it;
20052005
case TCP_TW_SUCCESS:

0 commit comments

Comments
 (0)