From cdec0e7f4ef8df69c95004d022ddffdc271157fe Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Sat, 22 Mar 2025 15:42:05 +0100 Subject: [PATCH] wip --- morep.c | 104 ++++++++++++++++++++++--------------------------- morep_server.c | 8 ++-- 2 files changed, 52 insertions(+), 60 deletions(-) diff --git a/morep.c b/morep.c index 7c93f23..0b3f323 100644 --- a/morep.c +++ b/morep.c @@ -8,21 +8,15 @@ #include #include -#if WIN32 -#include -#include -#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 +#include +#include #include #include -#include +#include +#include #include -#define OPT_TYPE int -#define SETBLOCK(fd) fcntl (fd, F_SETFL, 0) -#define SETNOBLK(fd) fcntl (fd, F_SETFL, 0_NONBLOCK) -#endif +#include #include #include @@ -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 *) ðer_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 *) ðer_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; } diff --git a/morep_server.c b/morep_server.c index c9a5e15..74233cc 100644 --- a/morep_server.c +++ b/morep_server.c @@ -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 */ -- 2.30.2