[PATCH] ipcpd: Pass previous ECN value in congestion API

  • From: Dimitri Staessens <dimitri@ouroboros.rocks>
  • To: ouroboros@xxxxxxxxxxxxx
  • Date: Thu, 10 Dec 2020 18:11:20 +0100

The previous value of the ECN field should be passed to the congestion
notification function.

Signed-off-by: Dimitri Staessens <dimitri@ouroboros.rocks>
---
 src/ipcpd/unicast/ca.c            | 7 ++++---
 src/ipcpd/unicast/ca.h            | 5 +++--
 src/ipcpd/unicast/dt.c            | 6 ++++--
 src/ipcpd/unicast/pol-ca-ops.h    | 5 +++--
 src/ipcpd/unicast/pol/ca-mb-ecn.c | 9 ++++++---
 src/ipcpd/unicast/pol/ca-mb-ecn.h | 5 +++--
 src/ipcpd/unicast/pol/ca-nop.c    | 6 ++++--
 src/ipcpd/unicast/pol/ca-nop.h    | 5 +++--
 8 files changed, 30 insertions(+), 18 deletions(-)

diff --git a/src/ipcpd/unicast/ca.c b/src/ipcpd/unicast/ca.c
index 73de14a..3add2a7 100644
--- a/src/ipcpd/unicast/ca.c
+++ b/src/ipcpd/unicast/ca.c
@@ -92,10 +92,11 @@ void ca_wnd_wait(ca_wnd_t wnd)
         return ca.ops->wnd_wait(wnd);
 }
 
-uint8_t ca_calc_ecn(int    fd,
-                    size_t len)
+int  ca_calc_ecn(int       fd,
+                 uint8_t * ecn,
+                 size_t    len)
 {
-        return ca.ops->calc_ecn(fd, len);
+        return ca.ops->calc_ecn(fd, ecn, len);
 }
 
 ssize_t ca_print_stats(void * ctx,
diff --git a/src/ipcpd/unicast/ca.h b/src/ipcpd/unicast/ca.h
index 7e3ab38..0604a16 100644
--- a/src/ipcpd/unicast/ca.h
+++ b/src/ipcpd/unicast/ca.h
@@ -55,8 +55,9 @@ void     ca_ctx_update_ece(void *   ctx,
 
 void     ca_wnd_wait(ca_wnd_t wnd);
 
-uint8_t  ca_calc_ecn(int    fd,
-                     size_t len);
+int      ca_calc_ecn(int       fd,
+                     uint8_t * ecn,
+                     size_t    len);
 
 ssize_t  ca_print_stats(void * ctx,
                         char * buf,
diff --git a/src/ipcpd/unicast/dt.c b/src/ipcpd/unicast/dt.c
index 9031848..1360371 100644
--- a/src/ipcpd/unicast/dt.c
+++ b/src/ipcpd/unicast/dt.c
@@ -480,7 +480,7 @@ static void packet_handler(int                  fd,
                         return;
                 }
 
-                *(head + dt_pci_info.ecn_o) |= ca_calc_ecn(ofd, len);
+                (void) ca_calc_ecn(ofd, head + dt_pci_info.ecn_o, len);
 
                 ret = ipcp_flow_write(ofd, sdb);
                 if (ret < 0) {
@@ -814,7 +814,9 @@ int dt_write_packet(uint64_t             dst_addr,
         dt_pci.dst_addr = dst_addr;
         dt_pci.qc       = qc;
         dt_pci.eid      = eid;
-        dt_pci.ecn      = ca_calc_ecn(fd, len);
+        dt_pci.ecn      = 0;
+
+        (void) ca_calc_ecn(fd, &dt_pci.ecn, len);
 
         dt_pci_ser(head, &dt_pci);
 
diff --git a/src/ipcpd/unicast/pol-ca-ops.h b/src/ipcpd/unicast/pol-ca-ops.h
index 69bd0d2..1e7c48b 100644
--- a/src/ipcpd/unicast/pol-ca-ops.h
+++ b/src/ipcpd/unicast/pol-ca-ops.h
@@ -43,8 +43,9 @@ struct pol_ca_ops {
 
         void     (* wnd_wait)(ca_wnd_t wnd);
 
-        uint8_t  (* calc_ecn)(int    fd,
-                              size_t len);
+        int      (* calc_ecn)(int       fd,
+                              uint8_t * ecn,
+                              size_t    len);
 
         /* Optional, can be NULL */
         ssize_t  (* print_stats)(void * ctx,
diff --git a/src/ipcpd/unicast/pol/ca-mb-ecn.c 
b/src/ipcpd/unicast/pol/ca-mb-ecn.c
index 1baaca7..1791e42 100644
--- a/src/ipcpd/unicast/pol/ca-mb-ecn.c
+++ b/src/ipcpd/unicast/pol/ca-mb-ecn.c
@@ -222,8 +222,9 @@ void mb_ecn_ctx_update_ece(void *   _ctx,
         ctx->tx_cav = true;
 }
 
-uint8_t mb_ecn_calc_ecn(int    fd,
-                        size_t len)
+int  mb_ecn_calc_ecn(int       fd,
+                     uint8_t * ecn,
+                     size_t    len)
 {
         size_t q;
 
@@ -231,7 +232,9 @@ uint8_t mb_ecn_calc_ecn(int    fd,
 
         q = ipcp_flow_queued(fd);
 
-        return (uint8_t) (q >> ECN_Q_SHFT);
+        *ecn |= (uint8_t) (q >> ECN_Q_SHFT);
+
+        return 0;
 }
 
 ssize_t  mb_ecn_print_stats(void * _ctx,
diff --git a/src/ipcpd/unicast/pol/ca-mb-ecn.h 
b/src/ipcpd/unicast/pol/ca-mb-ecn.h
index 945b0df..30dba4a 100644
--- a/src/ipcpd/unicast/pol/ca-mb-ecn.h
+++ b/src/ipcpd/unicast/pol/ca-mb-ecn.h
@@ -42,8 +42,9 @@ void     mb_ecn_ctx_update_ece(void *   ctx,
 
 void     mb_ecn_wnd_wait(ca_wnd_t wnd);
 
-uint8_t  mb_ecn_calc_ecn(int    fd,
-                         size_t len);
+int      mb_ecn_calc_ecn(int       fd,
+                         uint8_t * ecn,
+                         size_t    len);
 
 ssize_t  mb_ecn_print_stats(void * ctx,
                             char * buf,
diff --git a/src/ipcpd/unicast/pol/ca-nop.c b/src/ipcpd/unicast/pol/ca-nop.c
index 15b253c..ce210cf 100644
--- a/src/ipcpd/unicast/pol/ca-nop.c
+++ b/src/ipcpd/unicast/pol/ca-nop.c
@@ -84,11 +84,13 @@ void nop_ctx_update_ece(void *   ctx,
 }
 
 
-uint8_t nop_calc_ecn(int    fd,
-                     size_t len)
+int nop_calc_ecn(int       fd,
+                 uint8_t * ecn,
+                 size_t    len)
 {
         (void) fd;
         (void) len;
+        (void) ecn;
 
         return 0;
 }
diff --git a/src/ipcpd/unicast/pol/ca-nop.h b/src/ipcpd/unicast/pol/ca-nop.h
index baf649d..859b52d 100644
--- a/src/ipcpd/unicast/pol/ca-nop.h
+++ b/src/ipcpd/unicast/pol/ca-nop.h
@@ -42,8 +42,9 @@ void     nop_ctx_update_ece(void *   ctx,
 
 void     nop_wnd_wait(ca_wnd_t wnd);
 
-uint8_t  nop_calc_ecn(int    fd,
-                      size_t len);
+int      nop_calc_ecn(int       fd,
+                      uint8_t * ecn,
+                      size_t    len);
 
 extern struct pol_ca_ops nop_ca_ops;
 
-- 
2.29.2


Other related posts:

  • » [PATCH] ipcpd: Pass previous ECN value in congestion API - Dimitri Staessens