From 40ca5385e97f393d0c231446f117ad43465735a7 Mon Sep 17 00:00:00 2001 From: Dimitri Staessens Date: Sun, 6 Mar 2022 15:15:51 +0100 Subject: ipdpd: Pass MPL to application at flow_allocation The maximum packet lifetime (MPL) is a property of the flow that needs to be passed to the reliable transmission protocol (FRCP) for its correct operation. Previously, the value of MPL was set fixed as one of the (fixed) Delta-t parameters. This patch makes the MPL a property of the layer, and it can now be set per layer-type at build time. This is a step towards a proper MPL estimator in the flow allocator. Signed-off-by: Dimitri Staessens Signed-off-by: Sander Vrijders --- src/lib/dev.c | 21 +++++++++++++++++---- src/lib/ipcpd_messages.proto | 3 ++- src/lib/irmd_messages.proto | 7 ++++--- 3 files changed, 23 insertions(+), 8 deletions(-) (limited to 'src/lib') diff --git a/src/lib/dev.c b/src/lib/dev.c index 2e61df52..5f6a3694 100644 --- a/src/lib/dev.c +++ b/src/lib/dev.c @@ -574,6 +574,7 @@ int flow_accept(qosspec_t * qs, uint8_t buf[MSGBUFSZ]; int err = -EIRMD; ssize_t key_len; + time_t mpl; memset(s, 0, SYMMKEYSZ); @@ -617,7 +618,7 @@ int flow_accept(qosspec_t * qs, } if (!recv_msg->has_pid || !recv_msg->has_flow_id || - recv_msg->qosspec == NULL) + !recv_msg->has_mpl || recv_msg->qosspec == NULL) goto fail_result; if (recv_msg->pk.len != 0 && @@ -632,6 +633,8 @@ int flow_accept(qosspec_t * qs, fd = flow_init(recv_msg->flow_id, recv_msg->pid, msg_to_spec(recv_msg->qosspec), s); + mpl = recv_msg->mpl; + irm_msg__free_unpacked(recv_msg, NULL); if (fd < 0) @@ -642,7 +645,7 @@ int flow_accept(qosspec_t * qs, assert(ai.flows[fd].frcti == NULL); if (ai.flows[fd].qs.in_order != 0) { - ai.flows[fd].frcti = frcti_create(fd, DELT_A, DELT_R, DELT_MPL); + ai.flows[fd].frcti = frcti_create(fd, DELT_A, DELT_R, mpl); if (ai.flows[fd].frcti == NULL) { pthread_rwlock_unlock(&ai.lock); flow_dealloc(fd); @@ -678,6 +681,7 @@ static int __flow_alloc(const char * dst, uint8_t s[SYMMKEYSZ]; /* secret key for flow */ uint8_t buf[MSGBUFSZ]; int err = -EIRMD; + time_t mpl; memset(s, 0, SYMMKEYSZ); @@ -726,7 +730,8 @@ static int __flow_alloc(const char * dst, goto fail_result; } - if (!recv_msg->has_pid || !recv_msg->has_flow_id) + if (!recv_msg->has_pid || !recv_msg->has_flow_id || + !recv_msg->has_mpl) goto fail_result; if (!join && qs != NULL && qs->cypher_s != 0) { @@ -747,6 +752,8 @@ static int __flow_alloc(const char * dst, fd = flow_init(recv_msg->flow_id, recv_msg->pid, qs == NULL ? qos_raw : *qs, s); + mpl = recv_msg->mpl; + irm_msg__free_unpacked(recv_msg, NULL); if (fd < 0) @@ -757,7 +764,7 @@ static int __flow_alloc(const char * dst, assert(ai.flows[fd].frcti == NULL); if (ai.flows[fd].qs.in_order != 0) { - ai.flows[fd].frcti = frcti_create(fd, DELT_A, DELT_R, DELT_MPL); + ai.flows[fd].frcti = frcti_create(fd, DELT_A, DELT_R, mpl); if (ai.flows[fd].frcti == NULL) { pthread_rwlock_unlock(&ai.lock); flow_dealloc(fd); @@ -1771,6 +1778,7 @@ int ipcp_create_r(int result) int ipcp_flow_req_arr(const uint8_t * dst, size_t len, qosspec_t qs, + time_t mpl, const void * data, size_t dlen) { @@ -1789,6 +1797,8 @@ int ipcp_flow_req_arr(const uint8_t * dst, msg.hash.data = (uint8_t *) dst; qs_msg = spec_to_msg(&qs); msg.qosspec = &qs_msg; + msg.has_mpl = true; + msg.mpl = mpl; msg.has_pk = true; msg.pk.data = (uint8_t *) data; msg.pk.len = dlen; @@ -1817,6 +1827,7 @@ int ipcp_flow_req_arr(const uint8_t * dst, int ipcp_flow_alloc_reply(int fd, int response, + time_t mpl, const void * data, size_t len) { @@ -1831,6 +1842,8 @@ int ipcp_flow_alloc_reply(int fd, msg.has_pk = true; msg.pk.data = (uint8_t *) data; msg.pk.len = (uint32_t) len; + msg.has_mpl = true; + msg.mpl = mpl; pthread_rwlock_rdlock(&ai.lock); diff --git a/src/lib/ipcpd_messages.proto b/src/lib/ipcpd_messages.proto index a8c3bfb4..4908a3a3 100644 --- a/src/lib/ipcpd_messages.proto +++ b/src/lib/ipcpd_messages.proto @@ -53,5 +53,6 @@ message ipcp_msg { optional int32 response = 10; optional string comp = 11; optional uint32 timeo_sec = 12; - optional int32 result = 13; + optional sint32 mpl = 13; + optional int32 result = 14; }; diff --git a/src/lib/irmd_messages.proto b/src/lib/irmd_messages.proto index 515d486f..2173d514 100644 --- a/src/lib/irmd_messages.proto +++ b/src/lib/irmd_messages.proto @@ -84,7 +84,8 @@ message irm_msg { repeated name_info_msg names = 16; optional uint32 timeo_sec = 17; optional uint32 timeo_nsec = 18; - optional string comp = 19; - optional bytes pk = 20; /* piggyback */ - optional sint32 result = 21; + optional sint32 mpl = 19; + optional string comp = 20; + optional bytes pk = 21; /* piggyback */ + optional sint32 result = 22; }; -- cgit v1.2.3