Add session state 'discard'

This commit is contained in:
luwenpeng
2024-03-15 15:36:26 +08:00
parent 5b8d5610a2
commit 1cdbb7c2a4
10 changed files with 134 additions and 42 deletions

View File

@@ -3,7 +3,7 @@
#include "session_transition.h"
#define MAX_TRANSITION_PER_STATE 4
#define MAX_TRANSITION_PER_STATE 8
struct session_transition
{
@@ -20,14 +20,20 @@ struct session_transition
* SESSION_STATE_OPENING -> SESSION_STATE_OPENING ( NONE )
* SESSION_STATE_OPENING -> SESSION_STATE_ACTIVE ( TCP_DATA | UDP_DATA )
* SESSION_STATE_OPENING -> SESSION_STATE_CLOSING ( TCP_FIN | TCP_RST | TIMEOUT )
* SESSION_STATE_OPENING -> SESSION_STATE_DISCARD ( USER_CLOSE )
* SESSION_STATE_OPENING -> SESSION_STATE_CLOSED ( LRU_EVICT )
*
* SESSION_STATE_ACTIVE -> SESSION_STATE_ACTIVE ( NONE )
* SESSION_STATE_ACTIVE -> SESSION_STATE_CLOSING ( TCP_FIN | TCP_RST | TIMEOUT )
* SESSION_STATE_ACTIVE -> SESSION_STATE_DISCARD ( USER_CLOSE )
* SESSION_STATE_ACTIVE -> SESSION_STATE_CLOSED ( LRU_EVICT )
*
* SESSION_STATE_CLOSING -> SESSION_STATE_CLOSING ( NONE )
* SESSION_STATE_CLOSING -> SESSION_STATE_CLOSED ( TIMEOUT | LRU_EVICT )
* SESSION_STATE_CLOSING -> SESSION_STATE_DISCARD ( USER_CLOSE )
* SESSION_STATE_CLOSING -> SESSION_STATE_CLOSED ( LRU_EVICT | TIMEOUT )
*
* SESSION_STATE_DISCARD -> SESSION_STATE_DISCARD ( NONE )
* SESSION_STATE_DISCARD -> SESSION_STATE_CLOSED ( LRU_EVICT | TIMEOUT )
*/
static void session_inputs_to_str(int inputs, char *buff, int len)
@@ -65,57 +71,61 @@ static void session_inputs_to_str(int inputs, char *buff, int len)
{
nused += snprintf(buff + nused, len - nused, "LRU_EVICT ");
}
if (inputs & USER_CLOSE)
{
nused += snprintf(buff + nused, len - nused, "USER_CLOSE ");
}
}
void session_transition_init()
{
// SESSION_STATE_INIT -> SESSION_STATE_OPENING ( TCP_SYN | TCP_SYN_ACK | UDP_DATA )
// SESSION_STATE_INIT -> SESSION_STATE_INIT ( NONE )
fsm[SESSION_STATE_INIT][0].inputs_mask = TCP_SYN | TCP_SYN_ACK | UDP_DATA;
fsm[SESSION_STATE_INIT][0].next_state = SESSION_STATE_OPENING;
fsm[SESSION_STATE_INIT][1].inputs_mask = NONE;
fsm[SESSION_STATE_INIT][1].next_state = SESSION_STATE_INIT;
// SESSION_STATE_OPENING -> SESSION_STATE_ACTIVE ( TCP_DATA | UDP_DATA )
// SESSION_STATE_OPENING -> SESSION_STATE_CLOSING ( TCP_FIN | TCP_RST | TIMEOUT )
// SESSION_STATE_OPENING -> SESSION_STATE_CLOSED ( LRU_EVICT )
// SESSION_STATE_OPENING -> SESSION_STATE_OPENING ( NONE )
fsm[SESSION_STATE_OPENING][0].inputs_mask = TCP_DATA | UDP_DATA;
fsm[SESSION_STATE_OPENING][0].next_state = SESSION_STATE_ACTIVE;
fsm[SESSION_STATE_OPENING][1].inputs_mask = TCP_FIN | TCP_RST | TIMEOUT;
fsm[SESSION_STATE_OPENING][1].next_state = SESSION_STATE_CLOSING;
fsm[SESSION_STATE_OPENING][2].inputs_mask = LRU_EVICT;
fsm[SESSION_STATE_OPENING][2].next_state = SESSION_STATE_CLOSED;
fsm[SESSION_STATE_OPENING][2].inputs_mask = USER_CLOSE;
fsm[SESSION_STATE_OPENING][2].next_state = SESSION_STATE_DISCARD;
fsm[SESSION_STATE_OPENING][3].inputs_mask = NONE;
fsm[SESSION_STATE_OPENING][3].next_state = SESSION_STATE_OPENING;
fsm[SESSION_STATE_OPENING][3].inputs_mask = LRU_EVICT;
fsm[SESSION_STATE_OPENING][3].next_state = SESSION_STATE_CLOSED;
// SESSION_STATE_ACTIVE -> SESSION_STATE_CLOSING ( TCP_FIN | TCP_RST | TIMEOUT )
// SESSION_STATE_ACTIVE -> SESSION_STATE_CLOSED ( LRU_EVICT )
// SESSION_STATE_ACTIVE -> SESSION_STATE_ACTIVE ( NONE )
fsm[SESSION_STATE_OPENING][4].inputs_mask = NONE;
fsm[SESSION_STATE_OPENING][4].next_state = SESSION_STATE_OPENING;
fsm[SESSION_STATE_ACTIVE][0].inputs_mask = TCP_FIN | TCP_RST | TIMEOUT;
fsm[SESSION_STATE_ACTIVE][0].next_state = SESSION_STATE_CLOSING;
fsm[SESSION_STATE_ACTIVE][1].inputs_mask = LRU_EVICT;
fsm[SESSION_STATE_ACTIVE][1].next_state = SESSION_STATE_CLOSED;
fsm[SESSION_STATE_ACTIVE][1].inputs_mask = USER_CLOSE;
fsm[SESSION_STATE_ACTIVE][1].next_state = SESSION_STATE_DISCARD;
fsm[SESSION_STATE_ACTIVE][2].inputs_mask = NONE;
fsm[SESSION_STATE_ACTIVE][2].next_state = SESSION_STATE_ACTIVE;
fsm[SESSION_STATE_ACTIVE][2].inputs_mask = LRU_EVICT;
fsm[SESSION_STATE_ACTIVE][2].next_state = SESSION_STATE_CLOSED;
// SESSION_STATE_CLOSING -> SESSION_STATE_CLOSED ( TIMEOUT | LRU_EVICT )
// SESSION_STATE_CLOSING -> SESSION_STATE_CLOSING ( NONE )
fsm[SESSION_STATE_ACTIVE][3].inputs_mask = NONE;
fsm[SESSION_STATE_ACTIVE][3].next_state = SESSION_STATE_ACTIVE;
fsm[SESSION_STATE_CLOSING][0].inputs_mask = TIMEOUT | LRU_EVICT;
fsm[SESSION_STATE_CLOSING][0].next_state = SESSION_STATE_CLOSED;
fsm[SESSION_STATE_CLOSING][0].inputs_mask = USER_CLOSE;
fsm[SESSION_STATE_CLOSING][0].next_state = SESSION_STATE_DISCARD;
fsm[SESSION_STATE_CLOSING][1].inputs_mask = NONE;
fsm[SESSION_STATE_CLOSING][1].next_state = SESSION_STATE_CLOSING;
fsm[SESSION_STATE_CLOSING][1].inputs_mask = LRU_EVICT | TIMEOUT;
fsm[SESSION_STATE_CLOSING][1].next_state = SESSION_STATE_CLOSED;
fsm[SESSION_STATE_CLOSING][2].inputs_mask = NONE;
fsm[SESSION_STATE_CLOSING][2].next_state = SESSION_STATE_CLOSING;
fsm[SESSION_STATE_DISCARD][0].inputs_mask = LRU_EVICT | TIMEOUT;
fsm[SESSION_STATE_DISCARD][0].next_state = SESSION_STATE_CLOSED;
fsm[SESSION_STATE_DISCARD][1].inputs_mask = NONE;
fsm[SESSION_STATE_DISCARD][1].next_state = SESSION_STATE_DISCARD;
}
enum session_state session_transition_run(enum session_state curr_state, int inputs)