Commit 669da7a7 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

tcp: add drop reasons to tcp_rcv_state_process()

Add basic support for drop reasons in tcp_rcv_state_process()
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 37fd4e84
...@@ -387,6 +387,9 @@ enum skb_drop_reason { ...@@ -387,6 +387,9 @@ enum skb_drop_reason {
SKB_DROP_REASON_TCP_INVALID_SEQUENCE, /* Not acceptable SEQ field */ SKB_DROP_REASON_TCP_INVALID_SEQUENCE, /* Not acceptable SEQ field */
SKB_DROP_REASON_TCP_RESET, /* Invalid RST packet */ SKB_DROP_REASON_TCP_RESET, /* Invalid RST packet */
SKB_DROP_REASON_TCP_INVALID_SYN, /* Incoming packet has unexpected SYN flag */ SKB_DROP_REASON_TCP_INVALID_SYN, /* Incoming packet has unexpected SYN flag */
SKB_DROP_REASON_TCP_CLOSE, /* TCP socket in CLOSE state */
SKB_DROP_REASON_TCP_FASTOPEN, /* dropped by FASTOPEN request socket */
SKB_DROP_REASON_TCP_OLD_ACK, /* TCP ACK is old, but in window */
SKB_DROP_REASON_IP_OUTNOROUTES, /* route lookup failed */ SKB_DROP_REASON_IP_OUTNOROUTES, /* route lookup failed */
SKB_DROP_REASON_BPF_CGROUP_EGRESS, /* dropped by SKB_DROP_REASON_BPF_CGROUP_EGRESS, /* dropped by
* BPF_PROG_TYPE_CGROUP_SKB * BPF_PROG_TYPE_CGROUP_SKB
......
...@@ -42,6 +42,9 @@ ...@@ -42,6 +42,9 @@
TCP_INVALID_SEQUENCE) \ TCP_INVALID_SEQUENCE) \
EM(SKB_DROP_REASON_TCP_RESET, TCP_RESET) \ EM(SKB_DROP_REASON_TCP_RESET, TCP_RESET) \
EM(SKB_DROP_REASON_TCP_INVALID_SYN, TCP_INVALID_SYN) \ EM(SKB_DROP_REASON_TCP_INVALID_SYN, TCP_INVALID_SYN) \
EM(SKB_DROP_REASON_TCP_CLOSE, TCP_CLOSE) \
EM(SKB_DROP_REASON_TCP_FASTOPEN, TCP_FASTOPEN) \
EM(SKB_DROP_REASON_TCP_OLD_ACK, TCP_OLD_ACK) \
EM(SKB_DROP_REASON_IP_OUTNOROUTES, IP_OUTNOROUTES) \ EM(SKB_DROP_REASON_IP_OUTNOROUTES, IP_OUTNOROUTES) \
EM(SKB_DROP_REASON_BPF_CGROUP_EGRESS, \ EM(SKB_DROP_REASON_BPF_CGROUP_EGRESS, \
BPF_CGROUP_EGRESS) \ BPF_CGROUP_EGRESS) \
......
...@@ -6413,21 +6413,26 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) ...@@ -6413,21 +6413,26 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
struct request_sock *req; struct request_sock *req;
int queued = 0; int queued = 0;
bool acceptable; bool acceptable;
SKB_DR(reason);
switch (sk->sk_state) { switch (sk->sk_state) {
case TCP_CLOSE: case TCP_CLOSE:
SKB_DR_SET(reason, TCP_CLOSE);
goto discard; goto discard;
case TCP_LISTEN: case TCP_LISTEN:
if (th->ack) if (th->ack)
return 1; return 1;
if (th->rst) if (th->rst) {
SKB_DR_SET(reason, TCP_RESET);
goto discard; goto discard;
}
if (th->syn) { if (th->syn) {
if (th->fin) if (th->fin) {
SKB_DR_SET(reason, TCP_FLAGS);
goto discard; goto discard;
}
/* It is possible that we process SYN packets from backlog, /* It is possible that we process SYN packets from backlog,
* so we need to make sure to disable BH and RCU right there. * so we need to make sure to disable BH and RCU right there.
*/ */
...@@ -6442,6 +6447,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) ...@@ -6442,6 +6447,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
consume_skb(skb); consume_skb(skb);
return 0; return 0;
} }
SKB_DR_SET(reason, TCP_FLAGS);
goto discard; goto discard;
case TCP_SYN_SENT: case TCP_SYN_SENT:
...@@ -6468,13 +6474,16 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) ...@@ -6468,13 +6474,16 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
WARN_ON_ONCE(sk->sk_state != TCP_SYN_RECV && WARN_ON_ONCE(sk->sk_state != TCP_SYN_RECV &&
sk->sk_state != TCP_FIN_WAIT1); sk->sk_state != TCP_FIN_WAIT1);
if (!tcp_check_req(sk, skb, req, true, &req_stolen)) if (!tcp_check_req(sk, skb, req, true, &req_stolen)) {
SKB_DR_SET(reason, TCP_FASTOPEN);
goto discard; goto discard;
}
} }
if (!th->ack && !th->rst && !th->syn) if (!th->ack && !th->rst && !th->syn) {
SKB_DR_SET(reason, TCP_FLAGS);
goto discard; goto discard;
}
if (!tcp_validate_incoming(sk, skb, th, 0)) if (!tcp_validate_incoming(sk, skb, th, 0))
return 0; return 0;
...@@ -6487,6 +6496,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) ...@@ -6487,6 +6496,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
if (sk->sk_state == TCP_SYN_RECV) if (sk->sk_state == TCP_SYN_RECV)
return 1; /* send one RST */ return 1; /* send one RST */
tcp_send_challenge_ack(sk); tcp_send_challenge_ack(sk);
SKB_DR_SET(reason, TCP_OLD_ACK);
goto discard; goto discard;
} }
switch (sk->sk_state) { switch (sk->sk_state) {
...@@ -6647,7 +6657,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) ...@@ -6647,7 +6657,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
if (!queued) { if (!queued) {
discard: discard:
tcp_drop(sk, skb); tcp_drop_reason(sk, skb, reason);
} }
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment