1@startuml
2
3[*] --> IDLE
4
5ESTABLISHING : PROBE_TIMEOUT: SendProbeIfAnySentPktsUnacked() [default]
6
7state ACTIVE {
8    state ESTABLISHING {
9        PROACTIVE_VER_NEG :
10        PRE_INITIAL :
11        INITIAL_EXCHANGE_A :
12        REACTIVE_VER_NEG :
13        INITIAL_EXCHANGE_B :
14        INITIAL_EXCHANGE_CONTINUED :
15        HANDSHAKE :
16        HANDSHAKE_CONTINUED :
17        HANDSHAKE_COMPLETED :
18        HANDSHAKE_CONFIRMED :
19
20        [*] --> PROACTIVE_VER_NEG : use proactive VN?
21        [*] --> PRE_INITIAL : else
22        PROACTIVE_VER_NEG --> PRE_INITIAL : RX:VER_NEG
23        PROACTIVE_VER_NEG --> PROACTIVE_VER_NEG : PROBE_TIMEOUT
24        PRE_INITIAL --> INITIAL_EXCHANGE_A : ε
25        INITIAL_EXCHANGE_A --> INITIAL_EXCHANGE_B : RX:RETRY
26        INITIAL_EXCHANGE_A --> INITIAL_EXCHANGE_CONTINUED : RX:INITIAL
27        INITIAL_EXCHANGE_A --> REACTIVE_VER_NEG : RX:VER_NEG
28
29        REACTIVE_VER_NEG --> PRE_INITIAL : ε
30
31        INITIAL_EXCHANGE_B --> INITIAL_EXCHANGE_CONTINUED : RX:INITIAL
32        INITIAL_EXCHANGE_CONTINUED --> HANDSHAKE : TLS:HAVE_EL(HANDSHAKE)
33
34        HANDSHAKE --> HANDSHAKE_CONTINUED : RX:HANDSHAKE
35        HANDSHAKE_CONTINUED --> HANDSHAKE_COMPLETED : TLS:HANDSHAKE_COMPLETE
36        HANDSHAKE_COMPLETED --> HANDSHAKE_CONFIRMED : RX:1RTT[HANDSHAKE_DONE]
37    }
38    OPEN :
39    [*] --> ESTABLISHING
40}
41
42state TERMINATING {
43    CLOSING :
44    DRAINING :
45    CLOSING --> DRAINING : RX:ANY[CONNECTION_CLOSE]
46}
47
48HANDSHAKE_CONFIRMED --> OPEN : ε
49
50IDLE --> ACTIVE : APP:CONNECT
51
52IDLE --> TERMINATED : APP:CLOSE
53TERMINATING --> TERMINATED : TERMINATING_TIMEOUT, RX:STATELESS_RESET
54
55ACTIVE --> CLOSING : APP:CLOSE
56ACTIVE --> DRAINING : RX:ANY[CONNECTION_CLOSE]
57ACTIVE --> TERMINATED : IDLE_TIMEOUT, RX:STATELESS_RESET
58
59@enduml
60