wip
authorLaurent Mazet <mazet@softndesign.org>
Thu, 27 Mar 2025 06:48:46 +0000 (07:48 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Thu, 27 Mar 2025 06:48:46 +0000 (07:48 +0100)
morep.c

diff --git a/morep.c b/morep.c
index 8f3f61d77cccc839225fc9b7f9c4f4228b44a2a0..75eb008e01955b55ebfa8d6ca8bc21f402c8c112 100644 (file)
--- a/morep.c
+++ b/morep.c
@@ -288,56 +288,53 @@ int MOREP_Connect (char *url)
     return index;
 }
 
-uint8_t *MOREP_Get_Tx_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 = MAX_ETHER_SIZE + 14 - 18;
-    }
-
-    return MOREP_list[index]->tx_buffer + 18;
-}
-
-int MOREP_Send (int index, uint8_t msgtype, int len)
+int MOREP_Send (int index, uint8_t msgtype, uint8_t *buffer, int len)
 {
     VERBOSE (morep, TRACE, PRINTF ("MOREP_Send\n"));
 
     /* Message format is
-     *  bytes 0   : msgtype
-     *  bytes 1   : seqnumber
-     *  bytes 2-3 : len
-     *  bytes 4-  : data
+     *  bytes 0      : msgtype
+     *  bytes 1      : seqnumber
+     *  bytes 2-3    : flag + length
+     *    bit 15     : flag "more" fragmented packet(s)
+     *    bit 11-14  : fragment number
+     *    bit 0-10   : length (l)
+     *  bytes 4-(l-5): data
+     *  padding l<46 : zeros
      */
 
-    if ((len < 0) || (len > MAX_ETHER_SIZE + 14 - 18) ||
-        ((index < 0) || (index >= MAX_MOREP_NUMBER)) ||
-        (MOREP_list[index] == NULL)) {
+    if ((len < 0) || ((len + MAX_ETHER_SIZE - 5) / (MAX_ETHER_SIZE - 4) > 16) ||
+        (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;
+    int nfrag = 0;
     int seqnum = morep->tx_buffer[15] = morep->seqnum++;
-    uint16_t msglen = htons (len);
-    memcpy (morep->tx_buffer + 16, (void *) &msglen, 2);
-    VERBOSE (morep, DEBUG, PRINTF ("sent preamble: "); int i; for (i = 0; i < 18; i++) printf ("%02x:", morep->tx_buffer[i]); printf ("\n"));
-
-    int txlen = len + 18;
-    if (txlen < 64) {
-        VERBOSE (morep, DEBUG, PRINTF ("need padding: %d bytes\n",  64 - txlen));
-        memset (morep->tx_buffer + txlen, 0, 64 - txlen);
-        txlen = 64;
-    }
-    int rc = sendto (morep->sock, morep->tx_buffer, txlen, 0, NULL, 0);
-
-    return (rc < 18) ? -1 : seqnum;
+    int rc = 0;
+    do {
+        int pklen = (len > MAX_ETHER_SIZE - 4) ? MAX_ETHER_SIZE - 4 : len;
+        uint16_t msglen = htons (len | (nfrag << 11) | ((pklen != len) << 15));
+        memcpy (morep->tx_buffer + 16, (void *) &msglen, 2);
+        VERBOSE (morep, DEBUG, PRINTF ("sent preamble: "); int i; for (i = 0; i < 18; i++) printf ("%02x:", morep->tx_buffer[i]); printf ("\n"));
+
+        memcpy (morep->tx_buffer + 18, buffer, pklen);
+        int txlen = pklen + 18;
+        if (txlen < 64) {
+            VERBOSE (morep, DEBUG, PRINTF ("need padding: %d bytes\n",  64 - txlen));
+            memset (morep->tx_buffer + txlen, 0, 64 - txlen);
+            txlen = 64;
+        }
+        rc = sendto (morep->sock, morep->tx_buffer, txlen, 0, NULL, 0);
+        
+        len -= pklen;
+        buffer -= pklen;
+        nfrag++;
+    } while (rc > 0) && (len > 0);
+
+    return (rc > 0) ? seqnum : -1;
 }
 
 uint8_t *MOREP_Get_Rx_Buffer (int index, int *size)
@@ -356,7 +353,7 @@ uint8_t *MOREP_Get_Rx_Buffer (int index, int *size)
     return MOREP_list[index]->rx_buffer + 18;
 }
 
-int MOREP_Receive (int index, uint8_t *msgtype)
+int MOREP_Receive (int index, uint8_t *msgtype, uint8_t *buffer, int *len)
 {
     VERBOSE (morep, TRACE, PRINTF ("MOREP_Receive\n"));
 
@@ -368,23 +365,21 @@ int MOREP_Receive (int index, uint8_t *msgtype)
     }
     MOREP_descriptor_t *morep =  MOREP_list[index];
 
-    int len = recvfrom (morep->sock, morep->rx_buffer, sizeof (morep->rx_buffer), 0, NULL, 0);
-    if (len < 18) {
-        return -1;
-    }
-    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) {
-        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;
-    }
+    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) {
+            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;
+        }
 
     return seqnum;
 }