wip
authorLaurent Mazet <mazet@softndesign.org>
Sat, 22 Mar 2025 14:42:05 +0000 (15:42 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Sat, 22 Mar 2025 14:42:05 +0000 (15:42 +0100)
morep.c
morep_server.c

diff --git a/morep.c b/morep.c
index 7c93f23c1f46b209225d75fc84ec526d47fd000c..0b3f32349c4227f924d842a0e328275c81eb4ccf 100644 (file)
--- a/morep.c
+++ b/morep.c
@@ -8,21 +8,15 @@
 #include <errno.h>
 #include <fcntl.h>
 
-#if WIN32
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#define OPT_TYPE char
-#define SETBLOCK(fd) do { u_long _m = 0; ioctlsocket (fd, FIONBIO, &_m); } while (0)
-#define SETNOBLK(fd) do { u_long _m = 1; ioctlsocket (fd, FIONBIO, &_m); } while (0)
-#else /* Linux */
+#include <linux/if_arp.h>
+#include <linux/if_ether.h>
+#include <linux/if_packet.h>
 #include <netdb.h>
 #include <netinet/in.h>
-#include <netinet/tcp.h>
+#include <netinet/ip.h>
+#include <sys/ioctl.h>
 #include <sys/socket.h>
-#define OPT_TYPE int
-#define SETBLOCK(fd) fcntl (fd, F_SETFL, 0)
-#define SETNOBLK(fd) fcntl (fd, F_SETFL, 0_NONBLOCK)
-#endif
+#include <sys/types.h>
 
 #include <stdint.h>
 #include <stdio.h>
@@ -38,6 +32,7 @@
    MOREP address structure
 */
 typedef struct {
+    char ifname[32];
     char mac_address[18];
     uint16_t ether_type;
     uint8_t mac[6];
@@ -84,14 +79,14 @@ int parse_ifname (MOREP_addr_t *addr, char *url)
     char *pt = strchr (url, ':');
     if ((pt == NULL) || (pt[1] != '/') || (pt[2] != '/')) {
         VERBOSE (morep, WARNING, PRINTF ("can't parse interface name '%s'\n", url));
-        return NULL;
+        return -1;
     }
 
-    char *ifname = (char *) calloc (pt - url + 1, 1);
-    assert (ifname);
-    strncpy (ifname, url, pt - url);
+    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';
 
-    return ifname;
+    return 0;
 }
 
 int parse_mac (MOREP_addr_t *addr, char *url)
@@ -104,28 +99,28 @@ int parse_mac (MOREP_addr_t *addr, char *url)
         if (url[j] == 0) {
             break;
         }
-        mac_address[j] = url[j];
+        addr->mac_address[j] = url[j];
         j++;
         if (url[j] == 0) {
             break;
         }
-        mac_address[j] = url[j];
+        addr->mac_address[j] = url[j];
         j++;
-        if (url[j] != (i < 5) ? ':' : '/') {
+        if (url[j] != ((i < 5) ? ':' : '/')) {
             break;
         }
-        mac_address[j++] = '\0';
-        char ptr = NULL;
-        addr->mac[i] = strtoul (mac_address + 3 * i, &ptr, 16);
+        addr->mac_address[j++] = '\0';
+        char *ptr = NULL;
+        addr->mac[i] = strtoul (addr->mac_address + 3 * i, &ptr, 16);
         if (ptr != NULL) {
             break;
         }
         if (i < 5) {
-            mac_address[j - 1] = ':';
+            addr->mac_address[j - 1] = ':';
         }
     }
-    
-    if (j != 18) 
+
+    if (j != 18) {
         VERBOSE (morep, WARNING, PRINTF ("can't parse mac address '%s'(%d) \n", url, j));
         return -1;
     }
@@ -138,7 +133,7 @@ int parse_ethertype (MOREP_addr_t *addr, char *url)
     VERBOSE (morep, TRACE, PRINTF ("parse_ethertype\n"));
 
     /* ETHERTYPE format: XXXXX */
-    char ptr = NULL;
+    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));
@@ -148,7 +143,7 @@ int parse_ethertype (MOREP_addr_t *addr, char *url)
     return 0;
 }
 
-int get_interface_index (char *ifname)
+int get_interface_index (int sock, char *ifname)
 {
     VERBOSE (morep, TRACE, PRINTF ("get_interface_index\n"));
 
@@ -162,7 +157,7 @@ int get_interface_index (char *ifname)
     return ifr.ifr_ifindex;
 }
 
-int get_mac_address (char *ifname, uint8_t *mac)
+int get_mac_address (int sock, char *ifname, uint8_t *mac)
 {
     VERBOSE (morep, TRACE, PRINTF ("get_mac_address\n"));
 
@@ -196,9 +191,9 @@ void mactoa (char *str, uint8_t *mac)
     str[17] = '\0';
 }
 
-int alloc_morep (int sock)
+int alloc_morep ()
 {
-    VERBOSE (morep, TRACE, PRINTF ("morep_descriptor_t\n"));
+    VERBOSE (morep, TRACE, PRINTF ("alloc_morep\n"));
 
     int i;
     for (i = 0; i < MAX_MOREP_NUMBER; i++) {
@@ -211,7 +206,7 @@ int alloc_morep (int sock)
         return -1;
     }
 
-    MOREP_list[i] = (morep_descriptor_t *) calloc (sizeof (morep_descriptor_t), 1);
+    MOREP_list[i] = (MOREP_descriptor_t *) calloc (sizeof (MOREP_descriptor_t), 1);
     assert (MOREP_list[i]);
 
     return i;
@@ -223,10 +218,9 @@ int MOREP_Connect (char *url)
 
     /* parse url */
     MOREP_addr_t addr = {0};
-    char *ifname = parse_ifname (url);
-    if ((ifname == NULL != 0) ||
-        (parse_mac (&addr, url + strlen (url) + 3) != 0) ||
-        (parse_ethertype (&addr, url + strlen (url) + 21) != 0)) {
+    if ((parse_ifname (&addr, url) != 0) ||
+        (parse_mac (&addr, url + strlen (addr.ifname) + 3) != 0) ||
+        (parse_ethertype (&addr, url + strlen (addr.ifname) + 21) != 0)) {
         VERBOSE (morep, ERROR, PRINTF ("can't parse url (%s)\n", url));
         return -1;
     }
@@ -241,43 +235,39 @@ int MOREP_Connect (char *url)
     /* get local mac address */
     struct sockaddr_ll sock_addr = {0};
     sock_addr.sll_family = PF_PACKET;
-    sock_addr.sll_protocol = htons (addr->ethertype);
-    sock_addr.sll_ifindex = get_interface_index (ifname);
+    sock_addr.sll_protocol = htons (addr.ether_type);
+    sock_addr.sll_ifindex = get_interface_index (sock, addr.ifname);
     if (sock_addr.sll_ifindex < 0) {
-        VERBOSE (morep, ERROR, PRINTF ("can't get interface index for '%s': %s\n", ifname, strerror (errno)));
-        free (ifname);
+        VERBOSE (morep, ERROR, PRINTF ("can't get interface index for '%s': %s\n", addr.ifname, strerror (errno)));
         return -1;
     }
     sock_addr.sll_hatype = ARPHRD_ETHER;
     sock_addr.sll_pkttype = PACKET_OTHERHOST;
     sock_addr.sll_halen = ETH_ALEN;
-    if (get_mac_address(ifname, sock_addr.sll_addr) != 0) {
-        VERBOSE (morep, ERROR, PRINTF ("can't get mac address for '%s'\n", ifname));
-        free (ifname);
+    if (get_mac_address (sock, addr.ifname, sock_addr.sll_addr) != 0) {
+        VERBOSE (morep, ERROR, PRINTF ("can't get mac address for '%s'\n", addr.ifname));
         return -1;
     }
 
     /* bind socket */
     if (bind (sock, (struct sockaddr *)&sock_addr, sizeof (sock_addr)) != 0) {
         VERBOSE (morep, ERROR, printf ("can't bind '%s': %s\n", url, strerror (errno)));
-        free (ifname);
         return -1;
     }
 
     /* info message */
     char lmac[18] = {0};
     mactoa (lmac, sock_addr.sll_addr);
-    VERBOSE (morep, INFO, PRINTF ("I/O on %s local=[%s]\n", ifname, lmac));
-    free (ifname);
+    VERBOSE (morep, INFO, PRINTF ("I/O on %s local=[%s]\n", addr.ifname, lmac));
 
     /* store connection */
     int index = alloc_morep ();
-    if (i >= 0) {
-        MOREP_list[i]->sock = sock;
-        memcpy (MOREP_list[i]->tx_buffer, (void *) addr->mac, 6);
-        memcpy (MOREP_list[i]->tx_buffer + 6, sock_addr.sll_addr, 6);
-        uint16_t ether_type = htons (addr->ether_type);
-        memcpy (MOREP_list[i]->tx_buffer + 12, (void *) &ether_type, 2);
+    if (index >= 0) {
+        MOREP_list[index]->sock = sock;
+        memcpy (MOREP_list[index]->tx_buffer, (void *) addr.mac, 6);
+        memcpy (MOREP_list[index]->tx_buffer + 6, sock_addr.sll_addr, 6);
+        uint16_t ether_type = htons (addr.ether_type);
+        memcpy (MOREP_list[index]->tx_buffer + 12, (void *) &ether_type, 2);
     }
 
     return sock;
@@ -305,8 +295,8 @@ int MOREP_Send (int index, uint8_t msgtype, int len)
      */
 
     if ((len < 0) || (len > 9014 - 18) ||
-        ((data == NULL) && (len > 0)) ||
-        ((data != NULL) && (len == 0)) ||
+        //((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));
@@ -316,15 +306,15 @@ 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++;
-    uint16_t msglen = htons (mlen);
+    uint16_t msglen = htons (len);
     memcpy (morep->tx_buffer + 2, (void *) &msglen, 2);
 
-    int rc = sendto (morep->sock, morep->tx_buffer, nb + 18, 0, NULL, 0);
+    int rc = sendto (morep->sock, morep->tx_buffer, len + 18, 0, NULL, 0);
 
     return (rc < 18) ? -1 : rc - 18;
 }
 
-int MOREP_Receive (int sock)
+int MOREP_Receive (int index)
 {
     return -1;
 }
index c9a5e15e1f31752b88255a41395baef4fc0bf877..74233cc55a0a68c3a805a5637978e9addccee405 100644 (file)
@@ -115,11 +115,13 @@ int main (int argc, char **argv)
         }
     }
 
-    if (url) {
-        server (url);
+    if (url == NULL) {
+        VERBOSE (morep, ERROR, PRINTF ("missing url\n"));
+        return 1;
     }
+    server (url);
 
-    return (url == NULL);
+    return 0;
 }
 
 /* test-depend: morep_valid */