tcp: make match on (state, control, ack) more readable.
This commit is contained in:
parent
6fee12dcee
commit
aea021cfa9
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue