better alien packet handling
authorMazet Laurent <laurent.mazet@thalesgroup.com>
Thu, 12 Jun 2025 13:07:27 +0000 (15:07 +0200)
committerMazet Laurent <laurent.mazet@thalesgroup.com>
Thu, 12 Jun 2025 13:07:27 +0000 (15:07 +0200)
morep.c
morep_test.c
morep_valid.c

diff --git a/morep.c b/morep.c
index 254428e3000f829721fdfb7e4c48bad01a8128c3..d30d11861399673982b77ac0e39227906d2c508d 100644 (file)
--- a/morep.c
+++ b/morep.c
@@ -440,21 +440,18 @@ int MOREP_Receive (int sock, uint8_t *msgtype, uint8_t *buffer, int *len)
     int rxlen = 0;
     int flag = 0;
     do {
-        do {
-            rxlen = recvfrom (sock, morep->rx_buffer, ETHER_PREAMBLE + MAX_ETHER_SIZE, 0, NULL, 0);
-            VERBOSE (morep, DEBUG, PRINTF ("rec. preamble: "); for (int i = 0; i < ETHER_PREAMBLE + MOREP_PREAMBLE; i++) printf ("%02x%c", morep->rx_buffer[i], (i == ETHER_PREAMBLE + MOREP_PREAMBLE - 1) ? '\n' : ':'));
-
-            /* avoid alien packets */
-            uint16_t rx_n_etype;
-            memcpy ((void *)&rx_n_etype, morep->rx_buffer + 12, 2);
-            if ((morep->n_etype != rx_n_etype) ||
-                (memcmp (morep->tx_buffer, morep->rx_buffer + 6, 6) != 0) ||
-                (memcmp (morep->tx_buffer + 6, morep->rx_buffer, 6) != 0)) {
-                VERBOSE (morep, DEBUG, PRINTF ("alien packet\n"));
-            } else {
-                break;
-            }
-        } while (1);
+        rxlen = recvfrom (sock, morep->rx_buffer, ETHER_PREAMBLE + MAX_ETHER_SIZE, 0, NULL, 0);
+        VERBOSE (morep, DEBUG, PRINTF ("rec. preamble: "); for (int i = 0; i < ETHER_PREAMBLE + MOREP_PREAMBLE; i++) printf ("%02x%c", morep->rx_buffer[i], (i == ETHER_PREAMBLE + MOREP_PREAMBLE - 1) ? '\n' : ':'));
+
+        /* avoid alien packets */
+        uint16_t rx_n_etype;
+        memcpy ((void *)&rx_n_etype, morep->rx_buffer + 12, 2);
+        if ((morep->n_etype != rx_n_etype) ||
+            (memcmp (morep->tx_buffer, morep->rx_buffer + 6, 6) != 0) ||
+            (memcmp (morep->tx_buffer + 6, morep->rx_buffer, 6) != 0)) {
+            VERBOSE (morep, DEBUG, PRINTF ("alien packet\n"));
+            return -2;
+        }
 
         /* sequence number */
         int pkgseqnum = morep->rx_buffer[ETHER_PREAMBLE + 1];
index 02b8578ad71f71d92f4c1613b25b1e2de6a8550e..1d71c6d3158dec5969efb06d844d57e50427ba53 100644 (file)
@@ -69,7 +69,10 @@ int server (char *url)
         uint8_t rxmsgtype = 0;
         int rxmsglen = 0;
         uint8_t rxbuffer[MOREP_PAYLOAD * 16] = {0};
-        int rxseqnum = MOREP_Receive (morep, &rxmsgtype, rxbuffer, &rxmsglen);
+        int rxseqnum;
+        do {
+            rxseqnum = MOREP_Receive (morep, &rxmsgtype, rxbuffer, &rxmsglen);
+        } while (rxseqnum == -2);
         VERBOSE (morep, INFO, PRINTF ("rx %d bytes (msgid %d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum));
         VERBOSE (morep, TRACE, PRINTF ("rx msg: '"); fwrite ((char *)rxbuffer, 1, rxmsglen, stdout); printf ("'\n"));
 
@@ -132,7 +135,10 @@ int clientline (char *url, uint8_t txmsgtype, char *filename)
             uint8_t rxmsgtype = 0;
             int rxmsglen = 0;
             uint8_t rxbuffer[MOREP_PAYLOAD] = {0};
-            int rxseqnum = MOREP_Receive (morep, &rxmsgtype, rxbuffer, &rxmsglen);
+            int rxseqnum;
+            do {
+                rxseqnum = MOREP_Receive (morep, &rxmsgtype, rxbuffer, &rxmsglen);
+            } while (rxseqnum == -2);
             VERBOSE (morep, INFO, PRINTF ("rx %d bytes (msgid %d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum));
             VERBOSE (morep, TRACE, PRINTF ("rx msg: '"); fwrite ((char *)rxbuffer, 1, rxmsglen, stdout); printf ("'\n"));
         }
@@ -224,7 +230,10 @@ int clientfile (char *url, uint8_t txmsgtype, char *filename)
         uint8_t rxmsgtype = 0;
         int rxmsglen = 0;
         uint8_t rxbuffer[MOREP_PAYLOAD * 16] = {0};
-        int rxseqnum = MOREP_Receive (morep, &rxmsgtype, rxbuffer, &rxmsglen);
+        int rxseqnum;
+        do {
+            rxseqnum = MOREP_Receive (morep, &rxmsgtype, rxbuffer, &rxmsglen);
+        } while (rxseqnum == -2);
         VERBOSE (morep, INFO, PRINTF ("rx %d bytes (msgid %d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum));
         VERBOSE (morep, TRACE, PRINTF ("rx msg: '"); fwrite ((char *)rxbuffer, 1, rxmsglen, stdout); printf ("'\n"));
     }
index 95ea42ec2781a310dec8215f512f4777a2d7feec..91478ee386698f81c9f491a8784a86c79e95bae4 100644 (file)
@@ -313,8 +313,10 @@ int main (int argc, char **argv)
             uint8_t rxdata[MOREP_PAYLOAD] = {0};
             RAW_DATA_t rxpayload = {0};
             int rxlen = -1;
-            int seqnum = MOREP_Receive (comm->morep, &rxmsgtype, rxdata, &rxlen);
-
+            int seqnum;
+            do {
+                seqnum = MOREP_Receive (comm->morep, &rxmsgtype, rxdata, &rxlen);
+            } while (seqnum == -2);
             /* check msg type */
             if (rxmsgtype != msgtype) {
                 VERBOSE (morep, WARNING, PRINTF ("R%s SEQ=%d MSG=%d: expected msgtype %d\n", comm->etype, seqnum, rxmsgtype, msgtype));