diff --git a/ft_recv.dot b/ft_recv.dot new file mode 100644 index 0000000..59f10e2 --- /dev/null +++ b/ft_recv.dot @@ -0,0 +1,33 @@ +digraph ft_send { + fontname="Helvetica,Arial,sans-serif" + node [fontname="Helvetica,Arial,sans-serif"] + edge [fontname="Helvetica,Arial,sans-serif"] + + label="FT1_Receiver"; + labelloc="t"; + + start [label="start | we got FT_INIT"]; + fail [shape=doublecircle]; + done [shape=doublecircle]; + + // peer offline (how) + start -> fail [label="peer offline"] + + start -> starting [label="send FT_INIT_ACK"]; + starting -> starting [label="if timeout or get FT_INIT send FT_INIT_ACK"]; + starting -> got_data [label="got FT_DATA"]; + starting -> fail [label="if timeout too often"]; + + got_data -> fail [label="peer offline"]; + + subgraph cluster_data { + label="for each data chunk"; + style=filled; + + got_data -> wait_for_all_data [label="send FT_DATA_ACK"]; + } + + wait_for_all_data -> fail [label="peer offline"]; + wait_for_all_data -> done [label="all chunks received and acked"]; +} + diff --git a/ft_send.dot b/ft_send.dot new file mode 100644 index 0000000..5a003a5 --- /dev/null +++ b/ft_send.dot @@ -0,0 +1,47 @@ +digraph ft_send { + fontname="Helvetica,Arial,sans-serif" + node [fontname="Helvetica,Arial,sans-serif"] + edge [fontname="Helvetica,Arial,sans-serif"] + + label="FT1_Sender"; + labelloc="t"; + + //layout=fdp + //rankdir = LR + + start; + fail [shape=doublecircle]; + done [shape=doublecircle]; + + // peer offline (how) + start -> fail [label="peer offline"]; + + start -> sent_init [label="send FT_INIT"]; + + // peer offline (how) + sent_init -> fail [label="peer offline OR timeout too often"]; + + sent_init -> sent_init [label="timeout & sentcount <= 3, send FT_INIT"]; + + // got an ack after an init + sent_init -> have_data [label="got init_ack"] + + subgraph cluster_data { + label="for each data chunk"; + style=filled; + //node [style=filled]; + + have_data -> data_awaiting_ack [label="send FT_DATA"]; + data_awaiting_ack -> data_wait_for_all [label="get FT_DATA_ACK"]; + data_awaiting_ack -> have_data [label="no FT_DATA_ACK"]; + + data_wait_for_all; + } + + // fail + have_data -> fail [label="peer offline"] + data_wait_for_all -> fail [label="peer offline"] + + data_wait_for_all -> done [label="all chunks acked"]; +} +