From 5d108e7d701da2f1c80c479fbeafc7dce0862e46 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Sat, 22 Mar 2025 23:24:35 +0100 Subject: [PATCH] wip --- morep.c | 65 ++++++++++++++++++++++++++++++++++++++++---------- morep.h | 2 +- morep_server.c | 21 ++++++++++------ 3 files changed, 68 insertions(+), 20 deletions(-) diff --git a/morep.c b/morep.c index 0b3f323..72a3030 100644 --- 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 *) ðer_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 9b96997..e70b0e0 100644 --- 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 diff --git a/morep_server.c b/morep_server.c index 74233cc..c5621e4 100644 --- a/morep_server.c +++ b/morep_server.c @@ -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) { -- 2.30.2