some fixes
authorMazet Laurent <laurent.mazet@thalesgroup.com>
Thu, 27 Mar 2025 14:28:19 +0000 (15:28 +0100)
committerMazet Laurent <laurent.mazet@thalesgroup.com>
Thu, 27 Mar 2025 14:28:19 +0000 (15:28 +0100)
morep.c
morep_server.c

diff --git a/morep.c b/morep.c
index b80c221054d6a536b035a9a43d0f416ed472fa6e..bf177262b7dd2ec4c2a492a0bef94fd15d9ecaab 100644 (file)
--- a/morep.c
+++ b/morep.c
@@ -60,7 +60,6 @@ typedef struct {
     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 ;
 
 /**
@@ -370,7 +369,7 @@ int MOREP_Receive (int index, uint8_t *msgtype, uint8_t *buffer, int *len)
     int rxlen = 0;
     int flag = 0;
     do {
-        int rxlen = recvfrom (morep->sock, morep->rx_buffer, sizeof (morep->rx_buffer), 0, NULL, 0);
+        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"));
 
         /* sequence number */
@@ -390,41 +389,48 @@ int MOREP_Receive (int index, uint8_t *msgtype, uint8_t *buffer, int *len)
         /* flag, fragment number and payload length */
         uint16_t pkgflagfraglen = 0;
         memcpy ((void *) &pkgflagfraglen, morep->rx_buffer + 16, 2);
-       pkgflagfraglen = ntohs (pkgflagfraglen);
+        pkgflagfraglen = ntohs (pkgflagfraglen);
         flag = (pkgflagfraglen >> 15) & 0x0001;
         int pkgfrag = (pkgflagfraglen >> 11) & 0x000f;
         int pkglen = (pkgflagfraglen >> 0) & 0x07ff;
+        VERBOSE (morep, DEBUG, PRINTF ("flag/frag/length: %d/%d/%d\n", flag, pkgfrag, pkglen));
 
         /* 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 (pkglen != rxlen - 18) {
+            VERBOSE (morep, DEBUG, PRINTF ("padding of %d bytes\n", 64 - 18 - pkglen));
+            VERBOSE (morep, DEBUG, int i; for (i = pkglen + 18; i < 64; i++) if (morep->rx_buffer[i] != 0) { VERBOSE (morep, WARNING, PRINTF ("incorrect padding (%d)\n", i)); break; });
+        }
+        if (((rxlen == 64) && (pkglen > 64 - 18)) || ((rxlen > 64) && (pkglen != rxlen - 18))) {
             VERBOSE (morep, WARNING, PRINTF ("incorrect size (%d/%d)\n", pkglen, rxlen - 18));
+            pkglen = rxlen - 18;
         }
 
         /* store fragment */
         if (flag) {
+            VERBOSE (morep, DEBUG, PRINTF ("storing fragment %d (%d bytes)\n", pkgfrag, pkglen));
             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;
+            rxlen = 0;
             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;
+                VERBOSE (morep, DEBUG, PRINTF ("gluing fragment %d (%d/%d bytes)\n", i, frag->len, rxlen));
             }
             memcpy (buffer + rxlen, morep->rx_buffer + 18, pkglen);
             rxlen += pkglen;
+            VERBOSE (morep, DEBUG, PRINTF ("last fragment (%d/%d bytes)\n", pkglen, rxlen));
         }
     } while (flag);
 
     if (msgtype) {
         *msgtype = rxmsgtype;
     }
-    if (*len) {
+    if (len) {
         *len = rxlen;
     }
 
index 2b093a314e08a3962eafabfc843c74bb081c3892..6161815878703141de7a65bfa65cf0cacb7f8094 100644 (file)
@@ -69,17 +69,17 @@ int server (char *url)
         int rxmsglen = 0;
         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, INFO, PRINTF ("rx %d bytes (msgid %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 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));
+        VERBOSE (morep, INFO, PRINTF ("tx %d bytes (msgid %d) [%d]\n", txmsglen, txmsgtype, txseqnum));
+        VERBOSE (morep, DEBUG, PRINTF ("tx msg: '%s'\n", words[i]));
         if (words[++i] == NULL) {
             i = 0;
         }
-        VERBOSE (morep, DEBUG, PRINTF ("tx msg: '%s'\n", words[i]));
     }
 
     MOREP_Close (morep);
@@ -128,14 +128,14 @@ int client (char *url, uint8_t txmsgtype, char *filename)
         }
 
         int txseqnum = MOREP_Send (morep, txmsgtype, txbuffer, txmsglen);
-        VERBOSE (morep, INFO, PRINTF ("tx %d bytes(%d) [%d]\n", txmsglen, txmsgtype, txseqnum));
+        VERBOSE (morep, INFO, PRINTF ("tx %d bytes (msgid %d) [%d]\n", txmsglen, txmsgtype, txseqnum));
        VERBOSE (morep, DEBUG, PRINTF ("tx msg: '%s'\n", txbuffer));
 
         uint8_t rxmsgtype = 0;
         int rxmsglen = 0;
         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, INFO, PRINTF ("rx %d bytes (msgid %d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum));
         VERBOSE (morep, DEBUG, PRINTF ("rx msg: '"); fwrite ((char *)rxbuffer, 1, rxmsglen, stdout); printf ("'\n"));
     }