From 9f30f6640a062d97d06138b5e4e84becf2d6fc0a Mon Sep 17 00:00:00 2001 From: Laurent MAZET Date: Wed, 19 Mar 2025 19:14:51 +0100 Subject: [PATCH] wip --- debug.h | 14 +++++++++++++ morep.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 71 insertions(+), 4 deletions(-) diff --git a/debug.h b/debug.h index 03215c1..edac02d 100644 --- a/debug.h +++ b/debug.h @@ -20,6 +20,20 @@ __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 a8a8644..bca977b 100644 --- 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); -- 2.30.2