wip
authorLaurent Mazet <mazet@softndesign.org>
Sat, 22 Mar 2025 22:24:35 +0000 (23:24 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Sat, 22 Mar 2025 22:24:35 +0000 (23:24 +0100)
morep.c
morep.h
morep_server.c

diff --git a/morep.c b/morep.c
index 0b3f32349c4227f924d842a0e328275c81eb4ccf..72a3030004f2227a6a6b7181653bda31d00de28c 100644 (file)
--- a/morep.c
+++ b/morep.c
@@ -82,10 +82,12 @@ int parse_ifname (MOREP_addr_t *addr, char *url)
         return -1;
     }
 
-    int len = ((int)(pt - url) > (int)sizeof (addr->ifname) - 1) ? (int)(pt - url) : (int)sizeof (addr->ifname) - 1;
+    int len = ((int)(pt - url) < (int)sizeof (addr->ifname) - 1) ? (int)(pt - url) : (int)sizeof (addr->ifname) - 1;
     strncpy (addr->ifname, url, len);
     addr->ifname[len] = '\0';
 
+    VERBOSE (morep, DEBUG, PRINTF ("ifname: '%s'\n", addr->ifname));
+
     return 0;
 }
 
@@ -112,7 +114,7 @@ int parse_mac (MOREP_addr_t *addr, char *url)
         addr->mac_address[j++] = '\0';
         char *ptr = NULL;
         addr->mac[i] = strtoul (addr->mac_address + 3 * i, &ptr, 16);
-        if (ptr != NULL) {
+        if (*ptr != '\0') {
             break;
         }
         if (i < 5) {
@@ -125,6 +127,8 @@ int parse_mac (MOREP_addr_t *addr, char *url)
         return -1;
     }
 
+    VERBOSE (morep, DEBUG, PRINTF ("mac: %02x:%02x:%02x:%02x:%02x:%02x\n", addr->mac[0], addr->mac[1], addr->mac[2], addr->mac[3], addr->mac[4], addr->mac[4]));
+
     return 0;
 }
 
@@ -135,11 +139,13 @@ int parse_ethertype (MOREP_addr_t *addr, char *url)
     /* ETHERTYPE format: XXXXX */
     char *ptr = NULL;
     addr->ether_type = strtoul (url, &ptr, 16);
-    if (ptr != NULL) {
-         VERBOSE (morep, WARNING, PRINTF ("can't parse ethertype numbe (hexa) '%s'\n", url));
+    if (*ptr != '\0') {
+         VERBOSE (morep, WARNING, PRINTF ("can't parse ethertype number (hexa) '%s'\n", url));
          return -1;
     }
 
+    VERBOSE (morep, DEBUG, PRINTF ("ethertype: 0x%04x\n", addr->ether_type));
+
     return 0;
 }
 
@@ -154,6 +160,9 @@ int get_interface_index (int sock, char *ifname)
         VERBOSE (morep, WARNING, PRINTF ("can't get interface index (%s)\n", strerror (errno)));
         return -1;
     }
+
+    VERBOSE (morep, DEBUG, PRINTF ("interface index: %d\n", ifr.ifr_ifindex));
+
     return ifr.ifr_ifindex;
 }
 
@@ -175,6 +184,8 @@ int get_mac_address (int sock, char *ifname, uint8_t *mac)
         mac[i] = *p++;
     }
 
+    VERBOSE (morep, DEBUG, PRINTF ("mac: %02x:%02x:%02x:%02x:%02x:%02x\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[4]));
+
     return 0;
 }
 
@@ -209,6 +220,8 @@ int alloc_morep ()
     MOREP_list[i] = (MOREP_descriptor_t *) calloc (sizeof (MOREP_descriptor_t), 1);
     assert (MOREP_list[i]);
 
+    VERBOSE (morep, DEBUG, PRINTF ("allocated morep: %d\n", i));
+
     return i;
 }
 
@@ -270,11 +283,13 @@ int MOREP_Connect (char *url)
         memcpy (MOREP_list[index]->tx_buffer + 12, (void *) &ether_type, 2);
     }
 
-    return sock;
+    return index;
 }
 
 uint8_t *MOREP_Get_Tx_Buffer (int index)
 {
+    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));
@@ -286,6 +301,7 @@ uint8_t *MOREP_Get_Tx_Buffer (int index)
 
 int MOREP_Send (int index, uint8_t msgtype, int len)
 {
+    VERBOSE (morep, TRACE, PRINTF ("MOREP_Send\n"));
 
     /* Message format is
      *  bytes 0   : msgtype
@@ -295,8 +311,6 @@ int MOREP_Send (int index, uint8_t msgtype, int len)
      */
 
     if ((len < 0) || (len > 9014 - 18) ||
-        //((data == NULL) && (len > 0)) ||
-        //((data != NULL) && (len == 0)) ||
         ((index < 0) || (index >= MAX_MOREP_NUMBER)) ||
         (MOREP_list[index] == NULL)) {
         VERBOSE (morep, ERROR, PRINTF ("incorrect MOREP descriptor (%d)\n", index));
@@ -304,19 +318,46 @@ int MOREP_Send (int index, uint8_t msgtype, int len)
     }
 
     MOREP_descriptor_t *morep =  MOREP_list[index];
-    morep->tx_buffer[0] = msgtype;
-    morep->tx_buffer[1] = morep->seqnum++;
+    morep->tx_buffer[14] = msgtype;
+    morep->tx_buffer[15] = morep->seqnum++;
     uint16_t msglen = htons (len);
-    memcpy (morep->tx_buffer + 2, (void *) &msglen, 2);
+    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;
 }
 
-int MOREP_Receive (int index)
+uint8_t *MOREP_Receive (int index, uint8_t *msgtype, uint16_t *msglen)
 {
-    return -1;
+    VERBOSE (morep, TRACE, PRINTF ("MOREP_Receive\n"));
+
+    *msgtype = *msglen = 0;
+    if (((index < 0) || (index >= MAX_MOREP_NUMBER)) ||
+        (MOREP_list[index] == NULL)) {
+        VERBOSE (morep, ERROR, PRINTF ("incorrect MOREP descriptor (%d)\n", index));
+        return NULL;
+    }
+    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;
+    }
+    *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;
+    }
+
+    return morep->rx_buffer + 18;
 }
 
 
diff --git a/morep.h b/morep.h
index 9b96997469343e35ef89f64fc02e5409e49f5146..e70b0e0eb742cd8b4104b55b1868b6e0d628d77f 100644 (file)
--- a/morep.h
+++ b/morep.h
@@ -98,7 +98,7 @@ int MOREP_Send (int index, uint8_t msgtype, int len);
 
    @see MOREP_Connect()
 */
-int MOREP_Receive (int sock);
+uint8_t *MOREP_Receive (int index, uint8_t *msgtype, uint16_t *msglen);
 
 /**
    @ingroup MOREP
index 74233cc55a0a68c3a805a5637978e9addccee405..c5621e49cb01b6b12b538e65f777c2b7e8728acb 100644 (file)
@@ -35,7 +35,8 @@ void sig_handler (int sig)
 {
     switch (sig) {
     case SIGINT:
-        stop = 1;
+        //stop = 1;
+        exit (0);
         break;
     case SIGTERM:
         exit (0);
@@ -45,7 +46,7 @@ void sig_handler (int sig)
 
 int server (char *url)
 {
-    VERBOSE (morep, TRACE, PRINTF ("morep_server\n"));
+    VERBOSE (morep, TRACE, PRINTF ("server\n"));
 
     int morep = MOREP_Connect (url);
     if (morep < 0) {
@@ -53,24 +54,29 @@ int server (char *url)
         return -1;
     }
 
-    VERBOSE (morep, INFO, PRINTF ("server started at '%s'\n", url));
+    VERBOSE (morep, INFO, PRINTF ("server started at '%s' (%d)\n", url, morep));
 
     signal(SIGINT, sig_handler);
     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) {
+    while (!stop) {
 
-        int len = MOREP_Receive (morep);
-        VERBOSE (morep, INFO, PRINTF ("receive %d bytes\n", len));
+        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);
-        len = strlen (words[i]);
+        int len = strlen (words[i]);
         memcpy (buffer, words[i++], len);
         if (words[i] == NULL) {
             i = 0;
         }
+        buffer[len] = '\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));
 
@@ -97,6 +103,7 @@ int main (int argc, char **argv)
         char *arg = *(++argv);
         if (arg[0] != '-') {
             url = arg;
+            continue;
         }
         char c = arg[1];
         switch (c) {