last cleaning and fixes mirror/fragment origin/fragment
authorLaurent Mazet <mazet@softndesign.org>
Fri, 28 Mar 2025 00:08:09 +0000 (01:08 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Fri, 28 Mar 2025 00:08:09 +0000 (01:08 +0100)
morep.c
morep_server.c

diff --git a/morep.c b/morep.c
index 47e962dcf9c7c0e3eb5a3bacd19986450d6a1554..5506357e5fcee77233c2db9d9834716b8830a5e5 100644 (file)
--- a/morep.c
+++ b/morep.c
@@ -42,6 +42,7 @@ typedef struct {
 
 #define MAX_MOREP_NUMBER 256
 #define ETHER_PREAMBLE 14
+#define MIN_ETHER_SIZE 48
 #define MAX_ETHER_SIZE 1500 /* 9000 for jumbo frame */
 #define MOREP_PREAMBLE 4
 #define MAX_FRAGMENTS 15
@@ -83,13 +84,13 @@ void alloc_all_moreps ()
 
     int i;
     for (i = 0; i < MAX_MOREP_NUMBER; i++) {
-        MOREP_list[i] = (MOREP_descriptor_t *) calloc (sizeof (MOREP_descriptor_t), 1);
-        MOREP_list[i]->tx_buffer = (uint8_t *) calloc (1, ETHER_PREAMBLE + MAX_ETHER_SIZE);
-        MOREP_list[i]->rx_buffer = (uint8_t *) calloc (1, ETHER_PREAMBLE + MAX_ETHER_SIZE);
+        MOREP_list[i] = (MOREP_descriptor_t *) calloc (1, sizeof (MOREP_descriptor_t));
+        MOREP_list[i]->tx_buffer = (uint8_t *) calloc (ETHER_PREAMBLE + MAX_ETHER_SIZE, 1);
+        MOREP_list[i]->rx_buffer = (uint8_t *) calloc (ETHER_PREAMBLE + MAX_ETHER_SIZE, 1);
     }
     for (i = 0; i < MAX_FRAGMENTS; i++) {
-        fragment_list[i] = (MOREP_fragment_t *) calloc (sizeof (MOREP_fragment_t), 1);
-        fragment_list[i]->buffer = (uint8_t *) calloc (1, ETHER_PREAMBLE + MAX_ETHER_SIZE);
+        fragment_list[i] = (MOREP_fragment_t *) calloc (1, sizeof (MOREP_fragment_t));
+        fragment_list[i]->buffer = (uint8_t *) calloc (ETHER_PREAMBLE + MAX_ETHER_SIZE, 1);
     }
 }
 
@@ -111,6 +112,8 @@ void free_all_moreps (void)
         }
         free (fragment_list[i]);
     }
+
+    VERBOSE (morep, INFO, FPRINTF (stdout, "memory cleaned\n"));
 }
 
 void __attribute__((constructor)) _init_morep_ (void)
@@ -169,7 +172,7 @@ int parse_mac (MOREP_addr_t *addr, char *url)
         }
     }
 
-    if (j != ETHER_PREAMBLE + MOREP_PREAMBLE) {
+    if (j != MAC_ADDR_STRING) {
         VERBOSE (morep, WARNING, PRINTF ("can't parse mac address '%s'(%d) \n", url, j));
         return -1;
     }
@@ -353,35 +356,36 @@ int MOREP_Send (int index, uint8_t msgtype, uint8_t *buffer, int len)
      *  padding l<46 : zeros
      */
 
-    if ((len < 0) || ((len + MAX_ETHER_SIZE - 5) / (MAX_ETHER_SIZE - 4) > 16) ||
+    if ((len < 0) ||
+        ((len + MAX_ETHER_SIZE - MOREP_PREAMBLE - 1) / (MAX_ETHER_SIZE - MOREP_PREAMBLE) > MAX_FRAGMENTS) ||
         (index < 0) || (index >= MAX_MOREP_NUMBER) || (MOREP_list[index] == NULL)) {
         VERBOSE (morep, ERROR, PRINTF ("incorrect MOREP descriptor (%d)\n", index));
         return -1;
     }
 
     MOREP_descriptor_t *morep =  MOREP_list[index];
-    morep->tx_buffer[14] = msgtype;
+    morep->tx_buffer[ETHER_PREAMBLE + 0] = msgtype;
     int nfrag = 0;
-    int seqnum = morep->tx_buffer[15] = morep->seqnum++;
+    int seqnum = morep->tx_buffer[ETHER_PREAMBLE + 1] = morep->seqnum++;
     int rc = 0;
     do {
-        int pklen = (len > MAX_ETHER_SIZE - 4) ? MAX_ETHER_SIZE - 4 : len;
+        int pklen = (len > MAX_ETHER_SIZE - MOREP_PREAMBLE) ? MAX_ETHER_SIZE - MOREP_PREAMBLE : len;
         VERBOSE (morep, DEBUG, PRINTF ("flag/frag/length: %d/%d/%d\n", (pklen != len), nfrag, pklen));
         uint16_t msglen = htons (pklen | (nfrag << 11) | ((pklen != len) << 15));
-        memcpy (morep->tx_buffer + 16, (void *) &msglen, 2);
+        memcpy (morep->tx_buffer + ETHER_PREAMBLE + 2, (void *) &msglen, 2);
         VERBOSE (morep, DEBUG, PRINTF ("sent preamble: "); int i; for (i = 0; i < ETHER_PREAMBLE + MOREP_PREAMBLE; i++) printf ("%02x:", morep->tx_buffer[i]); printf ("\n"));
 
         memcpy (morep->tx_buffer + ETHER_PREAMBLE + MOREP_PREAMBLE, buffer, pklen);
         int txlen = pklen + ETHER_PREAMBLE + MOREP_PREAMBLE;
-        if (txlen < 64) {
-            VERBOSE (morep, DEBUG, PRINTF ("need padding: %d bytes\n",  64 - txlen));
-            memset (morep->tx_buffer + txlen, 0, 64 - txlen);
-            txlen = 64;
+        if (txlen < ETHER_PREAMBLE + MIN_ETHER_SIZE) {
+            VERBOSE (morep, DEBUG, PRINTF ("need padding: %d bytes\n",  ETHER_PREAMBLE + MIN_ETHER_SIZE - txlen));
+            memset (morep->tx_buffer + txlen, 0, ETHER_PREAMBLE + MIN_ETHER_SIZE - txlen);
+            txlen = ETHER_PREAMBLE + MIN_ETHER_SIZE;
         }
         rc = sendto (morep->sock, morep->tx_buffer, txlen, 0, NULL, 0);
 
         len -= pklen;
-        buffer -= pklen;
+        buffer += pklen;
         nfrag++;
     } while ((rc > 0) && (len > 0));
 
@@ -410,18 +414,18 @@ int MOREP_Receive (int index, uint8_t *msgtype, uint8_t *buffer, int *len)
     int rxlen = 0;
     int flag = 0;
     do {
-        rxlen = recvfrom (morep->sock, morep->rx_buffer, sizeof (morep->rx_buffer), 0, NULL, 0);
+        rxlen = recvfrom (morep->sock, morep->rx_buffer, ETHER_PREAMBLE + MAX_ETHER_SIZE, 0, NULL, 0);
         VERBOSE (morep, DEBUG, PRINTF ("rec. preamble: "); int i; for (i = 0; i < ETHER_PREAMBLE + MOREP_PREAMBLE; i++) printf ("%02x:", morep->rx_buffer[i]); printf ("\n"));
 
         /* sequence number */
-        int pkgseqnum = morep->rx_buffer[15];
+        int pkgseqnum = morep->rx_buffer[ETHER_PREAMBLE + 1];
         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];
+        int pkgmsgtype = morep->rx_buffer[ETHER_PREAMBLE + 0];
         if ((rxmsgtype != -1) && (rxmsgtype != pkgmsgtype)) {
             VERBOSE (morep, WARNING, PRINTF ("incoherent msgtype: %d != %d\n", rxmsgtype, pkgmsgtype));
         }
@@ -429,7 +433,7 @@ 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);
+        memcpy ((void *) &pkgflagfraglen, morep->rx_buffer + ETHER_PREAMBLE + 2, 2);
         pkgflagfraglen = ntohs (pkgflagfraglen);
         flag = (pkgflagfraglen >> 15) & 0x0001;
         int pkgfrag = (pkgflagfraglen >> 11) & 0x000f;
@@ -437,13 +441,13 @@ int MOREP_Receive (int index, uint8_t *msgtype, uint8_t *buffer, int *len)
         VERBOSE (morep, DEBUG, PRINTF ("flag/frag/length: %d/%d/%d\n", flag, pkgfrag, pkglen));
 
         /* check padding */
-        if (pkglen < 64 - ETHER_PREAMBLE + MOREP_PREAMBLE) {
-            VERBOSE (morep, DEBUG, PRINTF ("padding of %d bytes\n", 64 - ETHER_PREAMBLE + MOREP_PREAMBLE - pkglen));
-            VERBOSE (morep, DEBUG, int _i; for (_i = pkglen + ETHER_PREAMBLE + MOREP_PREAMBLE; _i < 64; _i++) if (morep->rx_buffer[_i] != 0) { VERBOSE (morep, WARNING, PRINTF ("incorrect padding (%d)\n", _i)); break; });
+        if (pkglen < MIN_ETHER_SIZE - MOREP_PREAMBLE) {
+            VERBOSE (morep, DEBUG, PRINTF ("padding of %d bytes\n", MIN_ETHER_SIZE - MOREP_PREAMBLE - pkglen));
+            VERBOSE (morep, DEBUG, int _i; for (_i = pkglen + ETHER_PREAMBLE + MOREP_PREAMBLE; _i < ETHER_PREAMBLE + MIN_ETHER_SIZE; _i++) if (morep->rx_buffer[_i] != 0) { VERBOSE (morep, WARNING, PRINTF ("incorrect padding (%d)\n", _i)); break; });
         }
-        if (((rxlen == 64) && (pkglen > 64 - ETHER_PREAMBLE + MOREP_PREAMBLE)) || ((rxlen > 64) && (pkglen != rxlen - ETHER_PREAMBLE + MOREP_PREAMBLE))) {
-            VERBOSE (morep, WARNING, PRINTF ("incorrect size (%d/%d)\n", pkglen, rxlen - ETHER_PREAMBLE + MOREP_PREAMBLE));
-            pkglen = rxlen - ETHER_PREAMBLE + MOREP_PREAMBLE;
+        if (((rxlen == ETHER_PREAMBLE + MIN_ETHER_SIZE) && (pkglen > MIN_ETHER_SIZE - MOREP_PREAMBLE)) || ((rxlen > ETHER_PREAMBLE + MIN_ETHER_SIZE) && (pkglen != rxlen - (ETHER_PREAMBLE + MOREP_PREAMBLE)))) {
+            VERBOSE (morep, WARNING, PRINTF ("incorrect size (%d/%d)\n", pkglen, rxlen - (ETHER_PREAMBLE + MOREP_PREAMBLE)));
+            pkglen = rxlen - (ETHER_PREAMBLE + MOREP_PREAMBLE);
         }
 
         /* store fragment */
@@ -490,8 +494,7 @@ int MOREP_Close (int index)
     }
 
     close (MOREP_list[index]->sock);
-    free (MOREP_list[index]);
-    MOREP_list[index] = NULL;
+    MOREP_list[index]->used = 0;
 
     return 0;
 }
index 569aa485e3f074cb4249f40d3adaff2c61ec9b3a..6d27d1a489dcf0ebf1e6d70784d0655d8e632f80 100644 (file)
@@ -220,7 +220,7 @@ int clientfile (char *url, uint8_t txmsgtype, char *filename)
 
         uint8_t rxmsgtype = 0;
         int rxmsglen = 0;
-        uint8_t rxbuffer[1496] = {0};
+        uint8_t rxbuffer[1496 * 16] = {0};
         int rxseqnum = MOREP_Receive (morep, &rxmsgtype, rxbuffer, &rxmsglen);
         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"));