diff options
author | Dimitri Staessens <[email protected]> | 2020-09-20 13:04:52 +0200 |
---|---|---|
committer | Sander Vrijders <[email protected]> | 2020-09-25 11:52:51 +0200 |
commit | 1e3a9e464cbb2f02c057e9f63c1f270ff27530f4 (patch) | |
tree | 5193774eea2bb204d062cc47e178a3702d4790a4 /src/irmd/ipcp.c | |
parent | 5f468ee5e02a0d63ed8ad7420ee1beda87e524d6 (diff) | |
download | ouroboros-1e3a9e464cbb2f02c057e9f63c1f270ff27530f4.tar.gz ouroboros-1e3a9e464cbb2f02c057e9f63c1f270ff27530f4.zip |
lib: Complete retransmission logic
This completes the retransmission (automated repeat-request, ARQ)
logic, sending (delayed) ACK messages when needed.
On deallocation, flows will ACK try to retransmit any remaining
unacknowledged messages (unless the FRCTFLINGER flag is turned off;
this is on by default). Applications can safely shut down as soon as
everything is ACK'd (i.e. the current Delta-t run is done). The
activity timeout is now passed to the IPCP for it to sleep before
completing deallocation (and releasing the flow_id). That should be
moved to the IRMd in due time.
The timerwheel is revised to be multi-level to reduce memory
consumption. The resolution bumps by a factor of 1 << RXMQ_BUMP (16)
and each level has RXMQ_SLOTS (1 << 8) slots. The lowest level has a
resolution of (1 << RXMQ_RES) (20) ns, which is roughly a
millisecond. Currently, 3 levels are defined, so the largest delay we
can schedule at each level is:
Level 0: 256ms
Level 1: 4s
Level 2: about a minute.
Signed-off-by: Dimitri Staessens <[email protected]>
Signed-off-by: Sander Vrijders <[email protected]>
Diffstat (limited to 'src/irmd/ipcp.c')
-rw-r--r-- | src/irmd/ipcp.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/src/irmd/ipcp.c b/src/irmd/ipcp.c index 78408185..cbd9ee15 100644 --- a/src/irmd/ipcp.c +++ b/src/irmd/ipcp.c @@ -543,16 +543,19 @@ int ipcp_flow_alloc_resp(pid_t pid, return ret; } -int ipcp_flow_dealloc(pid_t pid, - int flow_id) +int ipcp_flow_dealloc(pid_t pid, + int flow_id, + time_t timeo) { ipcp_msg_t msg = IPCP_MSG__INIT; ipcp_msg_t * recv_msg = NULL; int ret = -1; - msg.code = IPCP_MSG_CODE__IPCP_FLOW_DEALLOC; - msg.has_flow_id = true; - msg.flow_id = flow_id; + msg.code = IPCP_MSG_CODE__IPCP_FLOW_DEALLOC; + msg.has_flow_id = true; + msg.flow_id = flow_id; + msg.has_timeo_sec = true; + msg.timeo_sec = timeo; recv_msg = send_recv_ipcp_msg(pid, &msg); if (recv_msg == NULL) |