tcp: make match on (state, control, ack) more readable.

This commit is contained in:
Dario Nieuwenhuis 2021-10-06 01:03:13 +02:00
parent 6fee12dcee
commit aea021cfa9
1 changed files with 10 additions and 59 deletions

View File

@ -1279,17 +1279,10 @@ impl<'a> TcpSocket<'a> {
let control_len = (sent_syn as usize) + (sent_fin as usize); let control_len = (sent_syn as usize) + (sent_fin as usize);
// Reject unacceptable acknowledgements. // Reject unacceptable acknowledgements.
match (self.state, repr) { match (self.state, repr.control, repr.ack_number) {
// An RST received in response to initial SYN is acceptable if it acknowledges // An RST received in response to initial SYN is acceptable if it acknowledges
// the initial SYN. // the initial SYN.
( (State::SynSent, TcpControl::Rst, None) => {
State::SynSent,
&TcpRepr {
control: TcpControl::Rst,
ack_number: None,
..
},
) => {
net_debug!( net_debug!(
"{}:{}:{}: unacceptable RST (expecting RST|ACK) \ "{}:{}:{}: unacceptable RST (expecting RST|ACK) \
in response to initial SYN", in response to initial SYN",
@ -1299,14 +1292,7 @@ impl<'a> TcpSocket<'a> {
); );
return Err(Error::Dropped); return Err(Error::Dropped);
} }
( (State::SynSent, TcpControl::Rst, Some(ack_number)) => {
State::SynSent,
&TcpRepr {
control: TcpControl::Rst,
ack_number: Some(ack_number),
..
},
) => {
if ack_number != self.local_seq_no + 1 { if ack_number != self.local_seq_no + 1 {
net_debug!( net_debug!(
"{}:{}:{}: unacceptable RST|ACK in response to initial SYN", "{}:{}:{}: unacceptable RST|ACK in response to initial SYN",
@ -1318,35 +1304,13 @@ impl<'a> TcpSocket<'a> {
} }
} }
// Any other RST need only have a valid sequence number. // Any other RST need only have a valid sequence number.
( (_, TcpControl::Rst, _) => (),
_,
&TcpRepr {
control: TcpControl::Rst,
..
},
) => (),
// The initial SYN cannot contain an acknowledgement. // The initial SYN cannot contain an acknowledgement.
( (State::Listen, _, None) => (),
State::Listen,
&TcpRepr {
ack_number: None, ..
},
) => (),
// This case is handled above. // This case is handled above.
( (State::Listen, _, Some(_)) => unreachable!(),
State::Listen,
&TcpRepr {
ack_number: Some(_),
..
},
) => unreachable!(),
// Every packet after the initial SYN must be an acknowledgement. // Every packet after the initial SYN must be an acknowledgement.
( (_, _, None) => {
_,
&TcpRepr {
ack_number: None, ..
},
) => {
net_debug!( net_debug!(
"{}:{}:{}: expecting an ACK", "{}:{}:{}: expecting an ACK",
self.meta.handle, self.meta.handle,
@ -1356,14 +1320,7 @@ impl<'a> TcpSocket<'a> {
return Err(Error::Dropped); return Err(Error::Dropped);
} }
// SYN|ACK in the SYN-SENT state must have the exact ACK number. // SYN|ACK in the SYN-SENT state must have the exact ACK number.
( (State::SynSent, TcpControl::Syn, Some(ack_number)) => {
State::SynSent,
&TcpRepr {
control: TcpControl::Syn,
ack_number: Some(ack_number),
..
},
) => {
if ack_number != self.local_seq_no + 1 { if ack_number != self.local_seq_no + 1 {
net_debug!( net_debug!(
"{}:{}:{}: unacceptable SYN|ACK in response to initial SYN", "{}:{}:{}: unacceptable SYN|ACK in response to initial SYN",
@ -1375,7 +1332,7 @@ impl<'a> TcpSocket<'a> {
} }
} }
// Anything else in the SYN-SENT state is invalid. // Anything else in the SYN-SENT state is invalid.
(State::SynSent, _) => { (State::SynSent, _, _) => {
net_debug!( net_debug!(
"{}:{}:{}: expecting a SYN|ACK", "{}:{}:{}: expecting a SYN|ACK",
self.meta.handle, self.meta.handle,
@ -1386,13 +1343,7 @@ impl<'a> TcpSocket<'a> {
return Err(Error::Dropped); return Err(Error::Dropped);
} }
// Every acknowledgement must be for transmitted but unacknowledged data. // Every acknowledgement must be for transmitted but unacknowledged data.
( (_, _, Some(ack_number)) => {
_,
&TcpRepr {
ack_number: Some(ack_number),
..
},
) => {
let unacknowledged = self.tx_buffer.len() + control_len; let unacknowledged = self.tx_buffer.len() + control_len;
// Acceptable ACK range (both inclusive) // Acceptable ACK range (both inclusive)