Add basic TCP three-way handshake.
This commit is contained in:
parent
3c05139204
commit
f5f0b8e435
|
@ -246,6 +246,18 @@ impl<'a> TcpSocket<'a> {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
(State::SynReceived, TcpRepr {
|
||||
control: TcpControl::None, ack_number: Some(ack_number), ..
|
||||
}) => {
|
||||
if ack_number != self.local_seq_no + 1 { return Err(Error::Rejected) }
|
||||
self.set_state(State::Established);
|
||||
|
||||
// FIXME: queue data from ACK
|
||||
// FIXME: update sequence numbers
|
||||
self.retransmit.reset();
|
||||
Ok(())
|
||||
}
|
||||
|
||||
_ => {
|
||||
// This will cause the interface to reply with an RST.
|
||||
Err(Error::Rejected)
|
||||
|
@ -274,6 +286,7 @@ impl<'a> TcpSocket<'a> {
|
|||
State::Listen => {
|
||||
return Err(Error::Exhausted)
|
||||
}
|
||||
|
||||
State::SynReceived => {
|
||||
if !self.retransmit.check() { return Err(Error::Exhausted) }
|
||||
repr.control = TcpControl::Syn;
|
||||
|
@ -282,6 +295,12 @@ impl<'a> TcpSocket<'a> {
|
|||
net_trace!("tcp:{}:{}: SYN sent",
|
||||
self.local_end, self.remote_end);
|
||||
}
|
||||
|
||||
State::Established => {
|
||||
// FIXME: transmit something
|
||||
return Err(Error::Exhausted)
|
||||
}
|
||||
|
||||
_ => unreachable!()
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue