wip
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Wed, 19 Mar 2025 18:14:51 +0000 (19:14 +0100)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Wed, 19 Mar 2025 18:14:51 +0000 (19:14 +0100)
debug.h
morep.c

diff --git a/debug.h b/debug.h
index 03215c16ec23f9f02eb233fe3c52749e280dcd60..edac02dcd116ce6a04ffa40d7ecc2d054d4462be 100644 (file)
--- a/debug.h
+++ b/debug.h
 
 __BEGIN_DECLS
 
+/**
+   Debug level
+     - Error messages
+     - Warning messages
+     - Informational messages
+     - Debug messages
+     - Trace messages
+*/
+#define TRACE 4
+#define DEBUG 3
+#define INFO 2
+#define WARNING 1
+#define ERROR 0
+
 /**
    Declare a verbose level. Should be used only one time per module
    outside the main function.
diff --git a/morep.c b/morep.c
index a8a864407792cd1ac8aea3ad8e8700bcc1105f8f..bca977b2fc28136724c46bb6d3d4910797d6b9e4 100644 (file)
--- a/morep.c
+++ b/morep.c
@@ -68,8 +68,7 @@ static int __init = 1;
 
 void free_all_moreps (void)
 {
-
-    VERBOSE (morep, 2, FPRINTF (stdout, "free_all_moreps\n"));
+    VERBOSE (morep, TRACE, FPRINTF (stdout, "free_all_moreps\n"));
 
     int i;
     for (i = 0; i < MAX_MOREP_NUMBER; i++) {
@@ -78,8 +77,10 @@ void free_all_moreps (void)
     }
 }
 
-static int _parse_mac (const char *hexa_str, MOREP_addr_t *addr)
+int _parse_mac (char *hexa_str, MOREP_addr_t *addr)
 {
+    VERBOSE (morep, TRACE, FPRINTF (stdout, "free_all_moreps\n"));
+
     /* MAC address format: XX:XX:XX:XX:XX:XX */ 
     if (strlen (hexa_str) != 17) {
         return -1;
@@ -102,7 +103,59 @@ static int _parse_mac (const char *hexa_str, MOREP_addr_t *addr)
     }
     return 0;
 }
-    struct in_addr **addr_list;
+
+int MOREP_open (const char *ifname, const char *mac_address, unsigned short EthType)
+{
+    VERBOSE (morep, TRACE, FPRINTF (stdout, "MOREP_open\n"));
+
+    this->mac_address = strdup(mac_address);
+
+    parse_mac(mac_address, this->remote_mac);
+
+    sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
+    if (sock < 0) {
+        VERBOSE (VERBOSE_ERROR, printf ("socket(): %s\n", strerror (errno)));
+        VERBOSE (VERBOSE_ERROR, printf("Warning: you must be root to have raw access to sockets\n"));
+        return -1;
+    }
+
+    memset(&sock_addr, 0, sizeof (struct sockaddr_ll));
+
+    sock_addr.sll_family = PF_PACKET;
+    sock_addr.sll_protocol = htons(EthType);
+    sock_addr.sll_ifindex = Get_IfaceIndex(ifname);
+    if (sock_addr.sll_ifindex < 0) return -1;
+    sock_addr.sll_hatype = ARPHRD_ETHER;
+    sock_addr.sll_pkttype = PACKET_OTHERHOST;
+    sock_addr.sll_halen = ETH_ALEN;
+    if (Get_MacAddress(ifname, sock_addr.sll_addr) != 0) {
+        printf("Cannot get local mac address for %s\n", ifname);
+        return -1;
+    }
+
+    int res = bind(sock, (struct sockaddr *) & sock_addr, sizeof (sock_addr));
+    if (res != 0) {
+        VERBOSE (VERBOSE_ERROR, printf ("bind(): %s\n", strerror (errno)));
+        return -1;
+    }
+
+    printf("I/O on %s local=[", ifname);
+    for (int i = 0; i < 6; i++) {
+        printf("%02x", sock_addr.sll_addr[i]);
+        if (i < 5) printf(":");
+    }    printf("]\n");
+
+    eth_type = htons(EthType);
+    memset(TxBuf, 0, sizeof (TxBuf));
+    memcpy(TxBuf, (void *) remote_mac, 6);
+    memcpy(TxBuf + 6, sock_addr.sll_addr, 6);
+    memcpy(TxBuf + 12, (void *) & eth_type, 2);
+
+    return 0;
+}
+
+
+struct in_addr **addr_list;
     char url_to_parse[256] = { 0 };
 
     strncpy (url_to_parse, ascii_url, sizeof (url_to_parse) - 1);