Skip to content

Commit

Permalink
Create 4 kyu - A Simplistic TCP Finite State Machine (FSM).c
Browse files Browse the repository at this point in the history
  • Loading branch information
freedan42x authored Dec 11, 2023
1 parent b86e215 commit ebe998e
Showing 1 changed file with 69 additions and 0 deletions.
69 changes: 69 additions & 0 deletions c/4 kyu - A Simplistic TCP Finite State Machine (FSM).c
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
#include <stddef.h>

enum event {
APP_PASSIVE_OPEN, APP_ACTIVE_OPEN, APP_SEND, APP_CLOSE,
APP_TIMEOUT, RCV_SYN, RCV_ACK, RCV_SYN_ACK, RCV_FIN, RCV_FIN_ACK
};

enum state {
ERROR, CLOSED, LISTEN, SYN_SENT, SYN_RCVD, ESTABLISHED,
CLOSE_WAIT, LAST_ACK, FIN_WAIT_1, FIN_WAIT_2, CLOSING, TIME_WAIT,
};

#define EVENT_COUNT (RCV_FIN_ACK + 1)
#define STATE_COUNT (TIME_WAIT + 1)

static const enum state table[STATE_COUNT][EVENT_COUNT] = {
[CLOSED] = {
[APP_PASSIVE_OPEN] = LISTEN,
[APP_ACTIVE_OPEN] = SYN_SENT
},
[LISTEN] = {
[RCV_SYN] = SYN_RCVD,
[APP_SEND] = SYN_SENT,
[APP_CLOSE] = CLOSED
},
[SYN_RCVD] = {
[APP_CLOSE] = FIN_WAIT_1,
[RCV_ACK] = ESTABLISHED
},
[SYN_SENT] = {
[RCV_SYN] = SYN_RCVD,
[RCV_SYN_ACK] = ESTABLISHED,
[APP_CLOSE] = CLOSED
},
[ESTABLISHED] = {
[APP_CLOSE] = FIN_WAIT_1,
[RCV_FIN] = CLOSE_WAIT
},
[FIN_WAIT_1] = {
[RCV_FIN] = CLOSING,
[RCV_FIN_ACK] = TIME_WAIT,
[RCV_ACK] = FIN_WAIT_2
},
[CLOSING] = {
[RCV_ACK] = TIME_WAIT
},
[FIN_WAIT_2] = {
[RCV_FIN] = TIME_WAIT
},
[TIME_WAIT] = {
[APP_TIMEOUT] = CLOSED
},
[CLOSE_WAIT] = {
[APP_CLOSE] = LAST_ACK
},
[LAST_ACK] = {
[RCV_ACK] = CLOSED
}
};

enum state get_TCP_state (size_t n, const enum event events[n])
{
enum state s = CLOSED;
for (size_t i = 0; i < n; i++) {
s = table[s][events[i]];
if (s == ERROR) break;
}
return s;
}

0 comments on commit ebe998e

Please sign in to comment.