wip
authorLaurent Mazet <mazet@softndesign.org>
Sun, 23 Mar 2025 14:31:54 +0000 (15:31 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Sun, 23 Mar 2025 14:31:54 +0000 (15:31 +0100)
morep.c
morep.h
morep_server.c

diff --git a/morep.c b/morep.c
index 72a3030004f2227a6a6b7181653bda31d00de28c..15627aee220ce4dbac7197f369401807f99643de 100644 (file)
--- a/morep.c
+++ b/morep.c
@@ -39,6 +39,7 @@ typedef struct {
 } MOREP_addr_t;
 
 #define MAX_MOREP_NUMBER 256
+#define MAX_ETHER_SIZE 1500 /* 9000 for jumbo frame */
 
 /**
    Type of private descriptor associated to each connected SAP.
@@ -46,8 +47,9 @@ typedef struct {
 typedef struct {
     int sock;
     uint8_t seqnum;
-    uint8_t tx_buffer[9014]; // jumbo frame (1514 standard frame)
-    uint8_t rx_buffer[9014]; // jumbo frame (1514 standard frame)
+    uint8_t tx_buffer[MAX_ETHER_SIZE + 14];
+    uint8_t rx_buffer[MAX_ETHER_SIZE + 14];
+    uint16_t rxlen;
 } MOREP_descriptor_t ;
 
 /**
@@ -286,7 +288,7 @@ int MOREP_Connect (char *url)
     return index;
 }
 
-uint8_t *MOREP_Get_Tx_Buffer (int index)
+uint8_t *MOREP_Get_Tx_Buffer (int index, int *size)
 {
     VERBOSE (morep, TRACE, PRINTF ("MOREP_Get_Tx_Buffer\n"));
 
@@ -295,6 +297,9 @@ uint8_t *MOREP_Get_Tx_Buffer (int index)
         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;
 }
@@ -310,7 +315,7 @@ int MOREP_Send (int index, uint8_t msgtype, int len)
      *  bytes 4-  : data
      */
 
-    if ((len < 0) || (len > 9014 - 18) ||
+    if ((len < 0) || (len > MAX_ETHER_SIZE + 14 - 18) ||
         ((index < 0) || (index >= MAX_MOREP_NUMBER)) ||
         (MOREP_list[index] == NULL)) {
         VERBOSE (morep, ERROR, PRINTF ("incorrect MOREP descriptor (%d)\n", index));
@@ -319,46 +324,75 @@ int MOREP_Send (int index, uint8_t msgtype, int len)
 
     MOREP_descriptor_t *morep =  MOREP_list[index];
     morep->tx_buffer[14] = msgtype;
-    morep->tx_buffer[15] = morep->seqnum++;
+    int seqnum = morep->tx_buffer[15] = morep->seqnum++;
     uint16_t msglen = htons (len);
     memcpy (morep->tx_buffer + 16, (void *) &msglen, 2);
 
     int rc = sendto (morep->sock, morep->tx_buffer, len + 18, 0, NULL, 0);
 
-    return (rc < 18) ? -1 : rc - 18;
+    return (rc < 18) ? -1 : seqnum;
 }
 
-uint8_t *MOREP_Receive (int index, uint8_t *msgtype, uint16_t *msglen)
+uint8_t *MOREP_Get_Rx_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 = MOREP_list[index]->rxlen;
+    }
+
+    return MOREP_list[index]->tx_buffer + 18;
+}
+
+int MOREP_Receive (int index, uint8_t *msgtype)
 {
     VERBOSE (morep, TRACE, PRINTF ("MOREP_Receive\n"));
 
-    *msgtype = *msglen = 0;
+    *msgtype = 0;
     if (((index < 0) || (index >= MAX_MOREP_NUMBER)) ||
         (MOREP_list[index] == NULL)) {
         VERBOSE (morep, ERROR, PRINTF ("incorrect MOREP descriptor (%d)\n", index));
-        return NULL;
+        return -1;
     }
     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 NULL;
+        return -1;
     }
     *msgtype = morep->rx_buffer[14];
-    if (morep->rx_buffer[15] != morep->seqnum) {
-        VERBOSE (morep, WARNING, PRINTF ("incorrect sequence id (%d/%d)\n", morep->rx_buffer[15], morep->seqnum));
-        morep->seqnum = morep->rx_buffer[15];
-    }
-    morep->seqnum++;
-    memcpy ((void *) msglen, morep->tx_buffer + 16, 2);
-    *msglen = htons (*msglen);
-    if (*msglen != len - 18) {
-        VERBOSE (morep, WARNING, PRINTF ("incorrect size (%d/%d)\n", *msglen, len - 18));
-        *msglen = len - 18;
+    uint8_t seqnum= morep->rx_buffer[15];
+    uint16_t msglen = 0;
+    memcpy ((void *) &msglen, morep->tx_buffer + 16, 2);
+    morep->rxlen = htons (msglen);
+    if (morep->rxlen != len - 18) {
+        VERBOSE (morep, WARNING, PRINTF ("incorrect size (%d/%d)\n", morep->rxlen, len - 18));
+        morep->rxlen = len - 18;
     }
 
-    return morep->rx_buffer + 18;
+    return seqnum;
 }
 
+int MOREP_Close (int index)
+{
+    VERBOSE (morep, TRACE, PRINTF ("MOREP_Close\n"));
+
+    if ((index < 0) || (index >= MAX_MOREP_NUMBER) ||
+        (MOREP_list[index] == NULL)) {
+        VERBOSE (morep, ERROR, PRINTF ("incorrect MOREP descriptor (%d)\n", index));
+        return -1;
+    }
+
+    close (MOREP_list[index]->sock);
+    free (MOREP_list[index]);
+    MOREP_list[index] = NULL;
+
+    return 0;
+}
 
 /* vi:set tabstop=4 expandtab shiftwidth=4: this line set vi mode*/
diff --git a/morep.h b/morep.h
index e70b0e0eb742cd8b4104b55b1868b6e0d628d77f..86a0946526ec0d0a13e202312cdbd8a8ee281da5 100644 (file)
--- a/morep.h
+++ b/morep.h
@@ -61,9 +61,9 @@ int MOREP_Connect (char *url);
 
    @see MOREP_Connect()
 */
-void MOREP_Close (int morep);
+int MOREP_Close (int index);
 
-uint8_t *MOREP_Get_Tx_Buffer (int index);
+uint8_t *MOREP_Get_Tx_Buffer (int index, int *size);
 
 /**
    @ingroup MOREP
@@ -82,6 +82,8 @@ uint8_t *MOREP_Get_Tx_Buffer (int index);
 */
 int MOREP_Send (int index, uint8_t msgtype, int len);
 
+uint8_t *MOREP_Get_Rx_Buffer (int index, int *size);
+
 /**
    @ingroup MOREP
 
@@ -98,7 +100,8 @@ int MOREP_Send (int index, uint8_t msgtype, int len);
 
    @see MOREP_Connect()
 */
-uint8_t *MOREP_Receive (int index, uint8_t *msgtype, uint16_t *msglen);
+
+int MOREP_Receive (int index, uint8_t *msgtype);
 
 /**
    @ingroup MOREP
index c5621e49cb01b6b12b538e65f777c2b7e8728acb..ae2081fede829680a8b42544fa3cc3fed346b585 100644 (file)
@@ -17,6 +17,7 @@
 /* linker: morep.o */
 /* winlnk: morep.o */
 
+#include <errno.h>
 #include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -31,6 +32,8 @@ int stop = 0;
 
 DECLARE_VERBOSE_LEVEL (morep, INFO);
 
+char *words[] = {"Quo", "cognito", "Constantius", "ultra", "mortalem", "modum", "exarsit", "ac", "nequo", "casu", "idem", "Gallus", "de", "futuris", "incertus", "agitare", "quaedam", "conducentia", "saluti", "suae", "per", "itinera", "conaretur,", "remoti", "sunt", "omnes", "de", "industria", "milites", "agentes", "in", "civitatibus", "perviis.", NULL};
+
 void sig_handler (int sig)
 {
     switch (sig) {
@@ -60,33 +63,86 @@ int server (char *url)
     signal(SIGTERM, sig_handler);
 
     int i = 0;
-    char *words[] = {"Quo", "cognito", "Constantius", "ultra", "mortalem", "modum", "exarsit", "ac", "nequo", "casu", "idem", "Gallus", "de", "futuris", "incertus", "agitare", "quaedam", "conducentia", "saluti", "suae", "per", "itinera", "conaretur,", "remoti", "sunt", "omnes", "de", "industria", "milites", "agentes", "in", "civitatibus", "perviis.", NULL};
     while (!stop) {
 
         uint8_t rxmsgtype = 0;
-        uint16_t rxmsglen = 0;
-        uint8_t *rxbuffer = MOREP_Receive (morep, &rxmsgtype, &rxmsglen);
-        VERBOSE (morep, INFO, PRINTF ("receive %d bytes (%d)\n", rxmsglen, rxmsgtype));
-
-        uint8_t *buffer = MOREP_Get_Tx_Buffer (morep);
-        int len = strlen (words[i]);
-        memcpy (buffer, words[i++], len);
+        int rxmsglen = 0;
+        int rxseqnum = MOREP_Receive (morep, &rxmsgtype);
+        MOREP_Get_Rx_Buffer (morep, &rxmsglen);
+        VERBOSE (morep, INFO, PRINTF ("receive %d bytes (%d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum));
+
+        uint8_t *buffer = MOREP_Get_Tx_Buffer (morep, NULL);
+        int txmsglen = strlen (words[i]);
+        memcpy (buffer, words[i++], txmsglen);
         if (words[i] == NULL) {
             i = 0;
         }
-        buffer[len] = '\0';
+        buffer[txmsglen] = '\0';
         VERBOSE (morep, INFO, PRINTF ("prepare buffer for sending: '%s'\n", (char *)buffer));
 
-        len = MOREP_Send (morep, 0x01, len);
-        VERBOSE (morep, INFO, PRINTF ("send %d bytes\n", len));
+        uint8_t txmsgtype = 0x01;
+        int txseqnum = MOREP_Send (morep, txmsgtype, txmsglen);
+        VERBOSE (morep, INFO, PRINTF ("send %d bytes (%d) [%d]\n", txmsglen, txmsgtype, txseqnum));
+
+    }
+
+    MOREP_Close (morep);
+
+    return 0;
+}
+
+int client (char *url, uint8_t txmsgtype, char *filename)
+{
+    VERBOSE (morep, TRACE, PRINTF ("client\n"));
+
+    /* open connection */
+    int morep = MOREP_Connect (url);
+    if (morep < 0) {
+        VERBOSE (morep, ERROR, PRINTF ("can't connect on url '%s'\n", url));
+        return -1;
+    }
+
+    /* read file */
+    FILE *fid = stdin;
+    if (filename != NULL) {
+        fid = fopen (filename, "r");
+        if (fid == NULL) {
+            VERBOSE (morep, ERROR, PRINTF ("can't open file '%s' for reading\n", filename));
+            return -1;
+        }
+    }
+
+    while (!feof (fid)) {
+        int txmsglen = 0;
+        uint8_t *txbuffer = MOREP_Get_Tx_Buffer (morep, &txmsglen);
+        txmsglen = fread (txbuffer, 1, txmsglen, fid);
+        if ((txmsglen == 0) && (errno != 0)) {
+            VERBOSE (morep, ERROR, PRINTF ("can't read data from file '%s'\n", filename));
+            return -1;
+        }
 
+        int txseqnum = MOREP_Send (morep, txmsgtype, txmsglen);
+        VERBOSE (morep, INFO, PRINTF ("send %d bytes(%d) [%d]\n", txmsglen, txmsgtype, txseqnum));
+
+        uint8_t rxmsgtype = 0;
+        int rxmsglen = 0;
+        int rxseqnum = MOREP_Receive (morep, &rxmsgtype);
+        MOREP_Get_Rx_Buffer (morep, &rxmsglen);
+        VERBOSE (morep, INFO, PRINTF ("receive %d bytes (%d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum));
     }
 
+    if (fid != stdin) {
+        fclose (fid);
+    }
+    MOREP_Close (morep);
+
     return 0;
 }
 
 int main (int argc, char **argv)
 {
+    char *filename = NULL;
+    int msgtype = -1;
     char *url = NULL;
 
     /* get basename */
@@ -107,6 +163,22 @@ int main (int argc, char **argv)
         }
         char c = arg[1];
         switch (c) {
+        case 'f':
+            arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
+            if (arg == NULL) {
+                VERBOSE (ERROR, fprintf (stderr, "%s: message file not specified\n", progname));
+                return 1;
+            }
+            filename = arg;
+            break;
+        case 's':
+            arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
+            if (arg == NULL) {
+                VERBOSE (ERROR, fprintf (stderr, "%s: message type not specified\n", progname));
+                return 1;
+            }
+            msgtype = atoi (arg);
+            break;
         case 'v':
             arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
             if (arg == NULL) {
@@ -117,18 +189,21 @@ int main (int argc, char **argv)
             break;
         case 'h':
         default:
-            printf ("usage: %s [-h] [-v int] <url>\n", progname);
+            printf ("usage: %s [-h] [-f file] [-s msgtype] [-v int] <url>\n", progname);
             return (c != 'h');
         }
     }
 
+    int rc = 1;
     if (url == NULL) {
         VERBOSE (morep, ERROR, PRINTF ("missing url\n"));
-        return 1;
+    } else if (msgtype != -1) {
+        rc = client (url, msgtype, filename);
+    } else {
+        rc = server (url);
     }
-    server (url);
 
-    return 0;
+    return rc;
 }
 
 /* test-depend: morep_valid */