From d3b707c19b3ad89321d7664fb8f7e4f82d7a619f Mon Sep 17 00:00:00 2001 From: Mazet Laurent Date: Thu, 12 Jun 2025 15:07:27 +0200 Subject: [PATCH] better alien packet handling --- morep.c | 27 ++++++++++++--------------- morep_test.c | 15 ++++++++++++--- morep_valid.c | 6 ++++-- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/morep.c b/morep.c index 254428e..d30d118 100644 --- 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]; diff --git a/morep_test.c b/morep_test.c index 02b8578..1d71c6d 100644 --- a/morep_test.c +++ b/morep_test.c @@ -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")); } diff --git a/morep_valid.c b/morep_valid.c index 95ea42e..91478ee 100644 --- a/morep_valid.c +++ b/morep_valid.c @@ -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)); -- 2.30.2