From: Laurent Mazet Date: Sun, 23 Mar 2025 14:31:54 +0000 (+0100) Subject: wip X-Git-Tag: v1.0~109 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=ad879656ae07ac4e246fdfbcdef99316bbebec81;p=morep.git wip --- diff --git a/morep.c b/morep.c index 72a3030..15627ae 100644 --- a/morep.c +++ b/morep.c @@ -39,6 +39,7 @@ typedef struct { } MOREP_addr_t; #define MAX_MOREP_NUMBER 256 +#define MAX_ETHER_SIZE 1500 /* 9000 for jumbo frame */ /** Type of private descriptor associated to each connected SAP. @@ -46,8 +47,9 @@ typedef struct { typedef struct { int sock; uint8_t seqnum; - uint8_t tx_buffer[9014]; // jumbo frame (1514 standard frame) - uint8_t rx_buffer[9014]; // jumbo frame (1514 standard frame) + uint8_t tx_buffer[MAX_ETHER_SIZE + 14]; + uint8_t rx_buffer[MAX_ETHER_SIZE + 14]; + uint16_t rxlen; } MOREP_descriptor_t ; /** @@ -286,7 +288,7 @@ int MOREP_Connect (char *url) return index; } -uint8_t *MOREP_Get_Tx_Buffer (int index) +uint8_t *MOREP_Get_Tx_Buffer (int index, int *size) { VERBOSE (morep, TRACE, PRINTF ("MOREP_Get_Tx_Buffer\n")); @@ -295,6 +297,9 @@ uint8_t *MOREP_Get_Tx_Buffer (int index) VERBOSE (morep, ERROR, PRINTF ("incorrect MOREP descriptor (%d)\n", index)); return NULL; } + if (*size) { + *size = MAX_ETHER_SIZE + 14 - 18; + } return MOREP_list[index]->tx_buffer + 18; } @@ -310,7 +315,7 @@ int MOREP_Send (int index, uint8_t msgtype, int len) * bytes 4- : data */ - if ((len < 0) || (len > 9014 - 18) || + if ((len < 0) || (len > MAX_ETHER_SIZE + 14 - 18) || ((index < 0) || (index >= MAX_MOREP_NUMBER)) || (MOREP_list[index] == NULL)) { VERBOSE (morep, ERROR, PRINTF ("incorrect MOREP descriptor (%d)\n", index)); @@ -319,46 +324,75 @@ int MOREP_Send (int index, uint8_t msgtype, int len) MOREP_descriptor_t *morep = MOREP_list[index]; morep->tx_buffer[14] = msgtype; - morep->tx_buffer[15] = morep->seqnum++; + int seqnum = morep->tx_buffer[15] = morep->seqnum++; uint16_t msglen = htons (len); 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; + return (rc < 18) ? -1 : seqnum; } -uint8_t *MOREP_Receive (int index, uint8_t *msgtype, uint16_t *msglen) +uint8_t *MOREP_Get_Rx_Buffer (int index, int *size) +{ + 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)); + return NULL; + } + if (*size) { + *size = MOREP_list[index]->rxlen; + } + + return MOREP_list[index]->tx_buffer + 18; +} + +int MOREP_Receive (int index, uint8_t *msgtype) { VERBOSE (morep, TRACE, PRINTF ("MOREP_Receive\n")); - *msgtype = *msglen = 0; + *msgtype = 0; if (((index < 0) || (index >= MAX_MOREP_NUMBER)) || (MOREP_list[index] == NULL)) { VERBOSE (morep, ERROR, PRINTF ("incorrect MOREP descriptor (%d)\n", index)); - return NULL; + return -1; } 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; + return -1; } *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; + uint8_t seqnum= morep->rx_buffer[15]; + uint16_t msglen = 0; + memcpy ((void *) &msglen, morep->tx_buffer + 16, 2); + morep->rxlen = htons (msglen); + if (morep->rxlen != len - 18) { + VERBOSE (morep, WARNING, PRINTF ("incorrect size (%d/%d)\n", morep->rxlen, len - 18)); + morep->rxlen = len - 18; } - return morep->rx_buffer + 18; + return seqnum; } +int MOREP_Close (int index) +{ + VERBOSE (morep, TRACE, PRINTF ("MOREP_Close\n")); + + if ((index < 0) || (index >= MAX_MOREP_NUMBER) || + (MOREP_list[index] == NULL)) { + VERBOSE (morep, ERROR, PRINTF ("incorrect MOREP descriptor (%d)\n", index)); + return -1; + } + + close (MOREP_list[index]->sock); + free (MOREP_list[index]); + MOREP_list[index] = NULL; + + return 0; +} /* vi:set tabstop=4 expandtab shiftwidth=4: this line set vi mode*/ diff --git a/morep.h b/morep.h index e70b0e0..86a0946 100644 --- a/morep.h +++ b/morep.h @@ -61,9 +61,9 @@ int MOREP_Connect (char *url); @see MOREP_Connect() */ -void MOREP_Close (int morep); +int MOREP_Close (int index); -uint8_t *MOREP_Get_Tx_Buffer (int index); +uint8_t *MOREP_Get_Tx_Buffer (int index, int *size); /** @ingroup MOREP @@ -82,6 +82,8 @@ uint8_t *MOREP_Get_Tx_Buffer (int index); */ int MOREP_Send (int index, uint8_t msgtype, int len); +uint8_t *MOREP_Get_Rx_Buffer (int index, int *size); + /** @ingroup MOREP @@ -98,7 +100,8 @@ int MOREP_Send (int index, uint8_t msgtype, int len); @see MOREP_Connect() */ -uint8_t *MOREP_Receive (int index, uint8_t *msgtype, uint16_t *msglen); + +int MOREP_Receive (int index, uint8_t *msgtype); /** @ingroup MOREP diff --git a/morep_server.c b/morep_server.c index c5621e4..ae2081f 100644 --- a/morep_server.c +++ b/morep_server.c @@ -17,6 +17,7 @@ /* linker: morep.o */ /* winlnk: morep.o */ +#include #include #include #include @@ -31,6 +32,8 @@ int stop = 0; DECLARE_VERBOSE_LEVEL (morep, INFO); +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}; + void sig_handler (int sig) { switch (sig) { @@ -60,33 +63,86 @@ int server (char *url) 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) { 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); - int len = strlen (words[i]); - memcpy (buffer, words[i++], len); + int rxmsglen = 0; + int rxseqnum = MOREP_Receive (morep, &rxmsgtype); + MOREP_Get_Rx_Buffer (morep, &rxmsglen); + VERBOSE (morep, INFO, PRINTF ("receive %d bytes (%d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum)); + + uint8_t *buffer = MOREP_Get_Tx_Buffer (morep, NULL); + int txmsglen = strlen (words[i]); + memcpy (buffer, words[i++], txmsglen); if (words[i] == NULL) { i = 0; } - buffer[len] = '\0'; + buffer[txmsglen] = '\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)); + uint8_t txmsgtype = 0x01; + int txseqnum = MOREP_Send (morep, txmsgtype, txmsglen); + VERBOSE (morep, INFO, PRINTF ("send %d bytes (%d) [%d]\n", txmsglen, txmsgtype, txseqnum)); + + } + + MOREP_Close (morep); + + return 0; +} + +int client (char *url, uint8_t txmsgtype, char *filename) +{ + VERBOSE (morep, TRACE, PRINTF ("client\n")); + + /* open connection */ + int morep = MOREP_Connect (url); + if (morep < 0) { + VERBOSE (morep, ERROR, PRINTF ("can't connect on url '%s'\n", url)); + return -1; + } + + /* read file */ + FILE *fid = stdin; + if (filename != NULL) { + fid = fopen (filename, "r"); + if (fid == NULL) { + VERBOSE (morep, ERROR, PRINTF ("can't open file '%s' for reading\n", filename)); + return -1; + } + } + + while (!feof (fid)) { + int txmsglen = 0; + uint8_t *txbuffer = MOREP_Get_Tx_Buffer (morep, &txmsglen); + txmsglen = fread (txbuffer, 1, txmsglen, fid); + if ((txmsglen == 0) && (errno != 0)) { + VERBOSE (morep, ERROR, PRINTF ("can't read data from file '%s'\n", filename)); + return -1; + } + int txseqnum = MOREP_Send (morep, txmsgtype, txmsglen); + VERBOSE (morep, INFO, PRINTF ("send %d bytes(%d) [%d]\n", txmsglen, txmsgtype, txseqnum)); + + uint8_t rxmsgtype = 0; + int rxmsglen = 0; + int rxseqnum = MOREP_Receive (morep, &rxmsgtype); + MOREP_Get_Rx_Buffer (morep, &rxmsglen); + VERBOSE (morep, INFO, PRINTF ("receive %d bytes (%d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum)); } + if (fid != stdin) { + fclose (fid); + } + MOREP_Close (morep); + return 0; } int main (int argc, char **argv) { + char *filename = NULL; + int msgtype = -1; char *url = NULL; /* get basename */ @@ -107,6 +163,22 @@ int main (int argc, char **argv) } char c = arg[1]; switch (c) { + case 'f': + arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL; + if (arg == NULL) { + VERBOSE (ERROR, fprintf (stderr, "%s: message file not specified\n", progname)); + return 1; + } + filename = arg; + break; + case 's': + arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL; + if (arg == NULL) { + VERBOSE (ERROR, fprintf (stderr, "%s: message type not specified\n", progname)); + return 1; + } + msgtype = atoi (arg); + break; case 'v': arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL; if (arg == NULL) { @@ -117,18 +189,21 @@ int main (int argc, char **argv) break; case 'h': default: - printf ("usage: %s [-h] [-v int] \n", progname); + printf ("usage: %s [-h] [-f file] [-s msgtype] [-v int] \n", progname); return (c != 'h'); } } + int rc = 1; if (url == NULL) { VERBOSE (morep, ERROR, PRINTF ("missing url\n")); - return 1; + } else if (msgtype != -1) { + rc = client (url, msgtype, filename); + } else { + rc = server (url); } - server (url); - return 0; + return rc; } /* test-depend: morep_valid */