34 lines
1.2 KiB
C++
34 lines
1.2 KiB
C++
#include "tcp_state.hh"
|
|
|
|
using namespace std;
|
|
|
|
string TCPState::state_summary(const TCPReceiver &receiver) {
|
|
if (receiver.stream_out().error()) {
|
|
return TCPReceiverStateSummary::ERROR;
|
|
} else if (not receiver.ackno().has_value()) {
|
|
return TCPReceiverStateSummary::LISTEN;
|
|
} else if (receiver.stream_out().input_ended()) {
|
|
return TCPReceiverStateSummary::FIN_RECV;
|
|
} else {
|
|
return TCPReceiverStateSummary::SYN_RECV;
|
|
}
|
|
}
|
|
|
|
string TCPState::state_summary(const TCPSender &sender) {
|
|
if (sender.stream_in().error()) {
|
|
return TCPSenderStateSummary::ERROR;
|
|
} else if (sender.next_seqno_absolute() == 0) {
|
|
return TCPSenderStateSummary::CLOSED;
|
|
} else if (sender.next_seqno_absolute() == sender.bytes_in_flight()) {
|
|
return TCPSenderStateSummary::SYN_SENT;
|
|
} else if (not sender.stream_in().eof()) {
|
|
return TCPSenderStateSummary::SYN_ACKED;
|
|
} else if (sender.next_seqno_absolute() < sender.stream_in().bytes_written() + 2) {
|
|
return TCPSenderStateSummary::SYN_ACKED;
|
|
} else if (sender.bytes_in_flight()) {
|
|
return TCPSenderStateSummary::FIN_SENT;
|
|
} else {
|
|
return TCPSenderStateSummary::FIN_ACKED;
|
|
}
|
|
}
|