manage fragmentation
authorMazet Laurent <laurent.mazet@thalesgroup.com>
Thu, 27 Mar 2025 13:04:31 +0000 (14:04 +0100)
committerMazet Laurent <laurent.mazet@thalesgroup.com>
Thu, 27 Mar 2025 13:04:31 +0000 (14:04 +0100)
morep.c
morep.h
morep_server.c

diff --git a/morep.c b/morep.c
index 75eb008e01955b55ebfa8d6ca8bc21f402c8c112..b80c221054d6a536b035a9a43d0f416ed472fa6e 100644 (file)
--- a/morep.c
+++ b/morep.c
@@ -40,6 +40,16 @@ typedef struct {
 
 #define MAX_MOREP_NUMBER 256
 #define MAX_ETHER_SIZE 1500 /* 9000 for jumbo frame */
+#define MAX_FRAGMENTS (2^4)
+
+/**
+   Fragment structure
+*/
+typedef struct {
+    int len;
+    uint8_t buffer[MAX_ETHER_SIZE - 4];
+    int status;
+} MOREP_fragment_t;
 
 /**
    Type of private descriptor associated to each connected SAP.
@@ -49,6 +59,7 @@ typedef struct {
     uint8_t seqnum;
     uint8_t tx_buffer[MAX_ETHER_SIZE + 14];
     uint8_t rx_buffer[MAX_ETHER_SIZE + 14];
+    MOREP_fragment_t fragment_list[MAX_FRAGMENTS];
     uint16_t rxlen;
 } MOREP_descriptor_t ;
 
@@ -332,27 +343,11 @@ int MOREP_Send (int index, uint8_t msgtype, uint8_t *buffer, int len)
         len -= pklen;
         buffer -= pklen;
         nfrag++;
-    } while (rc > 0) && (len > 0);
+    } while ((rc > 0) && (len > 0));
 
     return (rc > 0) ? seqnum : -1;
 }
 
-uint8_t *MOREP_Get_Rx_Buffer (int index, int *size)
-{
-    VERBOSE (morep, TRACE, PRINTF ("MOREP_Get_Tx_Buffer\n"));
-
-    if ((index < 0) || (index >= MAX_MOREP_NUMBER) ||
-        (MOREP_list[index] == NULL)) {
-        VERBOSE (morep, ERROR, PRINTF ("incorrect MOREP descriptor (%d)\n", index));
-        return NULL;
-    }
-    if (size) {
-        *size = MOREP_list[index]->rxlen;
-    }
-
-    return MOREP_list[index]->rx_buffer + 18;
-}
-
 int MOREP_Receive (int index, uint8_t *msgtype, uint8_t *buffer, int *len)
 {
     VERBOSE (morep, TRACE, PRINTF ("MOREP_Receive\n"));
@@ -364,24 +359,76 @@ int MOREP_Receive (int index, uint8_t *msgtype, uint8_t *buffer, int *len)
         return -1;
     }
     MOREP_descriptor_t *morep =  MOREP_list[index];
+    int i;
+    for (i = 0; i < MAX_FRAGMENTS; i++) {
+        (morep->fragment_list + i)->len = 0;
+        //(morep->fragment_list + i)->status = 0;
+    }
 
+    int rxmsgtype = -1;
+    int rxseqnum = -1;
+    int rxlen = 0;
+    int flag = 0;
     do {
         int rxlen = recvfrom (morep->sock, morep->rx_buffer, sizeof (morep->rx_buffer), 0, NULL, 0);
         VERBOSE (morep, DEBUG, PRINTF ("rec. preamble: "); int i; for (i = 0; i < 18; i++) printf ("%02x:", morep->rx_buffer[i]); printf ("\n"));
-        *msgtype = morep->rx_buffer[14];
-        uint8_t seqnum= morep->rx_buffer[15];
-        uint16_t msglen = 0;
-        memcpy ((void *) &msglen, morep->rx_buffer + 16, 2);
-        morep->rxlen = htons (msglen);
-        if (morep->rxlen < 64 - 18) {
+
+        /* sequence number */
+        int pkgseqnum = morep->rx_buffer[15];
+        if ((rxseqnum != -1) && (rxseqnum != pkgseqnum)) {
+            VERBOSE (morep, WARNING, PRINTF ("incoherent seqnum: %d != %d\n", rxseqnum, pkgseqnum));
+        }
+        rxseqnum = pkgseqnum;
+
+        /* msessage type */
+        int pkgmsgtype = morep->rx_buffer[14];
+        if ((rxmsgtype != -1) && (rxmsgtype != pkgmsgtype)) {
+            VERBOSE (morep, WARNING, PRINTF ("incoherent msgtype: %d != %d\n", rxmsgtype, pkgmsgtype));
+        }
+        rxmsgtype = pkgmsgtype;
+
+        /* flag, fragment number and payload length */
+        uint16_t pkgflagfraglen = 0;
+        memcpy ((void *) &pkgflagfraglen, morep->rx_buffer + 16, 2);
+       pkgflagfraglen = ntohs (pkgflagfraglen);
+        flag = (pkgflagfraglen >> 15) & 0x0001;
+        int pkgfrag = (pkgflagfraglen >> 11) & 0x000f;
+        int pkglen = (pkgflagfraglen >> 0) & 0x07ff;
+
+        /* check padding */
+        if (pkglen < 64 - 18) {
             VERBOSE (morep, DEBUG, PRINTF ("padding of %d bytes\n", 64 - 18 - morep->rxlen));
             VERBOSE (morep, DEBUG, int i; for (i = morep->rxlen + 18; i < 64; i++) if (morep->rx_buffer[i] != 0) { VERBOSE (morep, WARNING, PRINTF ("incorrect padding\n")); break; });
-        } else if (morep->rxlen != len - 18) {
-            VERBOSE (morep, WARNING, PRINTF ("incorrect size (%d/%d)\n", morep->rxlen, len - 18));
-            morep->rxlen = len - 18;
+        } else if (pkglen != rxlen - 18) {
+            VERBOSE (morep, WARNING, PRINTF ("incorrect size (%d/%d)\n", pkglen, rxlen - 18));
+        }
+
+        /* store fragment */
+        if (flag) {
+            MOREP_fragment_t *frag = morep->fragment_list + pkgfrag;
+            memcpy (frag->buffer, morep->rx_buffer + 18, pkglen);
+            frag->len = pkglen;
+            //frag->status = 1;
+        } else {
+            int i;
+            for (i = 0; (i < MAX_FRAGMENTS) && ((morep->fragment_list + i)->len != 0); i++) {
+                MOREP_fragment_t *frag = morep->fragment_list + i;
+                memcpy (buffer + rxlen, frag->buffer, frag->len);
+                rxlen += frag->len;
+            }
+            memcpy (buffer + rxlen, morep->rx_buffer + 18, pkglen);
+            rxlen += pkglen;
         }
+    } while (flag);
+
+    if (msgtype) {
+        *msgtype = rxmsgtype;
+    }
+    if (*len) {
+        *len = rxlen;
+    }
 
-    return seqnum;
+    return rxseqnum;
 }
 
 int MOREP_Close (int index)
diff --git a/morep.h b/morep.h
index 86a0946526ec0d0a13e202312cdbd8a8ee281da5..a7e3bdf167150f1554c6364edd6456d98873d606 100644 (file)
--- a/morep.h
+++ b/morep.h
@@ -63,8 +63,6 @@ int MOREP_Connect (char *url);
 */
 int MOREP_Close (int index);
 
-uint8_t *MOREP_Get_Tx_Buffer (int index, int *size);
-
 /**
    @ingroup MOREP
 
@@ -80,9 +78,7 @@ uint8_t *MOREP_Get_Tx_Buffer (int index, int *size);
 
    @see MOREP_Connect()
 */
-int MOREP_Send (int index, uint8_t msgtype, int len);
-
-uint8_t *MOREP_Get_Rx_Buffer (int index, int *size);
+int MOREP_Send (int index, uint8_t msgtype, uint8_t *buffer, int len);
 
 /**
    @ingroup MOREP
@@ -101,7 +97,7 @@ uint8_t *MOREP_Get_Rx_Buffer (int index, int *size);
    @see MOREP_Connect()
 */
 
-int MOREP_Receive (int index, uint8_t *msgtype);
+int MOREP_Receive (int index, uint8_t *msgtype, uint8_t *buffer, int *len);
 
 /**
    @ingroup MOREP
index f42a3f07ddeb3729dbc2ecba8a8fa5b9c557aef1..2b093a314e08a3962eafabfc843c74bb081c3892 100644 (file)
@@ -67,24 +67,19 @@ int server (char *url)
 
         uint8_t rxmsgtype = 0;
         int rxmsglen = 0;
-        int rxseqnum = MOREP_Receive (morep, &rxmsgtype);
-        uint8_t *rxbuffer = MOREP_Get_Rx_Buffer (morep, &rxmsglen);
-        VERBOSE (morep, INFO, PRINTF ("receive %d bytes (%d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum));
-        VERBOSE (morep, INFO, PRINTF ("message: '"); fwrite ((char *)rxbuffer, 1, rxmsglen, stdout); printf ("'\n"));
-
-        uint8_t *buffer = MOREP_Get_Tx_Buffer (morep, NULL);
-        int txmsglen = strlen (words[i]);
-        memcpy (buffer, words[i++], txmsglen);
-        if (words[i] == NULL) {
-            i = 0;
-        }
-        buffer[txmsglen] = '\0';
-        VERBOSE (morep, INFO, PRINTF ("prepare buffer for sending: '%s'\n", (char *)buffer));
+        uint8_t rxbuffer[1500] = {0};
+        int rxseqnum = MOREP_Receive (morep, &rxmsgtype, rxbuffer, &rxmsglen);
+        VERBOSE (morep, INFO, PRINTF ("rx %d bytes (%d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum));
+        VERBOSE (morep, DEBUG, PRINTF ("rx msg: '"); fwrite ((char *)rxbuffer, 1, rxmsglen, stdout); printf ("'\n"));
 
         uint8_t txmsgtype = 0x01;
-        int txseqnum = MOREP_Send (morep, txmsgtype, txmsglen);
-        VERBOSE (morep, INFO, PRINTF ("send %d bytes (%d) [%d]\n", txmsglen, txmsgtype, txseqnum));
-
+       int txmsglen = strlen (words[i]);
+        int txseqnum = MOREP_Send (morep, txmsgtype, (uint8_t *)words[i], txmsglen);
+        VERBOSE (morep, INFO, PRINTF ("tx %d bytes (%d) [%d]\n", txmsglen, txmsgtype, txseqnum));
+        if (words[++i] == NULL) {
+            i = 0;
+        }
+        VERBOSE (morep, DEBUG, PRINTF ("tx msg: '%s'\n", words[i]));
     }
 
     MOREP_Close (morep);
@@ -114,9 +109,8 @@ int client (char *url, uint8_t txmsgtype, char *filename)
     }
 
     while (!feof (fid)) {
-        int txmsglen = 0;
-        uint8_t *txbuffer = MOREP_Get_Tx_Buffer (morep, &txmsglen);
-        memset (txbuffer, 0, txmsglen);
+        int txmsglen = 1500;
+        uint8_t txbuffer[1500] = {0};
         int i = 0;
         do {
             fread (txbuffer + i, 1, 1, fid);
@@ -133,15 +127,16 @@ int client (char *url, uint8_t txmsgtype, char *filename)
             return -1;
         }
 
-        int txseqnum = MOREP_Send (morep, txmsgtype, txmsglen);
-        VERBOSE (morep, INFO, PRINTF ("send %d bytes(%d) [%d]\n", txmsglen, txmsgtype, txseqnum));
+        int txseqnum = MOREP_Send (morep, txmsgtype, txbuffer, txmsglen);
+        VERBOSE (morep, INFO, PRINTF ("tx %d bytes(%d) [%d]\n", txmsglen, txmsgtype, txseqnum));
+       VERBOSE (morep, DEBUG, PRINTF ("tx msg: '%s'\n", txbuffer));
 
         uint8_t rxmsgtype = 0;
         int rxmsglen = 0;
-        int rxseqnum = MOREP_Receive (morep, &rxmsgtype);
-        uint8_t *rxbuffer = MOREP_Get_Rx_Buffer (morep, &rxmsglen);
-        VERBOSE (morep, INFO, PRINTF ("receive %d bytes (%d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum));
-        VERBOSE (morep, INFO, PRINTF ("message: '"); fwrite ((char *)rxbuffer, 1, rxmsglen, stdout); printf ("'\n"));
+        uint8_t rxbuffer[1500] = {0};
+        int rxseqnum = MOREP_Receive (morep, &rxmsgtype, rxbuffer, &rxmsglen);
+        VERBOSE (morep, INFO, PRINTF ("rx %d bytes (%d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum));
+        VERBOSE (morep, DEBUG, PRINTF ("rx msg: '"); fwrite ((char *)rxbuffer, 1, rxmsglen, stdout); printf ("'\n"));
     }
 
     if (fid != stdin) {
@@ -179,7 +174,7 @@ int main (int argc, char **argv)
         case 'f':
             arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
             if (arg == NULL) {
-                VERBOSE (ERROR, fprintf (stderr, "%s: message file not specified\n", progname));
+                VERBOSE (morep, ERROR, fprintf (stderr, "%s: message file not specified\n", progname));
                 return 1;
             }
             filename = arg;
@@ -187,7 +182,7 @@ int main (int argc, char **argv)
         case 's':
             arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
             if (arg == NULL) {
-                VERBOSE (ERROR, fprintf (stderr, "%s: message type not specified\n", progname));
+                VERBOSE (morep, ERROR, fprintf (stderr, "%s: message type not specified\n", progname));
                 return 1;
             }
             msgtype = atoi (arg);
@@ -195,7 +190,7 @@ int main (int argc, char **argv)
         case 'v':
             arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
             if (arg == NULL) {
-                VERBOSE (ERROR, fprintf (stderr, "%s: verbose level not specified\n", progname));
+                VERBOSE (morep, ERROR, fprintf (stderr, "%s: verbose level not specified\n", progname));
                 return 1;
             }
             CHANGE_VERBOSE_LEVEL (morep, atoi (arg));