From: Mazet Laurent Date: Thu, 27 Mar 2025 13:04:31 +0000 (+0100) Subject: manage fragmentation X-Git-Tag: v1.0~100 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=d7b67cafc67b41991c85dbc57607f29cabb004d7;p=morep.git manage fragmentation --- diff --git a/morep.c b/morep.c index 75eb008..b80c221 100644 --- a/morep.c +++ b/morep.c @@ -40,6 +40,16 @@ typedef struct { #define MAX_MOREP_NUMBER 256 #define MAX_ETHER_SIZE 1500 /* 9000 for jumbo frame */ +#define MAX_FRAGMENTS (2^4) + +/** + Fragment structure +*/ +typedef struct { + int len; + uint8_t buffer[MAX_ETHER_SIZE - 4]; + int status; +} MOREP_fragment_t; /** Type of private descriptor associated to each connected SAP. @@ -49,6 +59,7 @@ typedef struct { uint8_t seqnum; uint8_t tx_buffer[MAX_ETHER_SIZE + 14]; uint8_t rx_buffer[MAX_ETHER_SIZE + 14]; + MOREP_fragment_t fragment_list[MAX_FRAGMENTS]; uint16_t rxlen; } MOREP_descriptor_t ; @@ -332,27 +343,11 @@ int MOREP_Send (int index, uint8_t msgtype, uint8_t *buffer, int len) len -= pklen; buffer -= pklen; nfrag++; - } while (rc > 0) && (len > 0); + } while ((rc > 0) && (len > 0)); return (rc > 0) ? seqnum : -1; } -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]->rx_buffer + 18; -} - int MOREP_Receive (int index, uint8_t *msgtype, uint8_t *buffer, int *len) { VERBOSE (morep, TRACE, PRINTF ("MOREP_Receive\n")); @@ -364,24 +359,76 @@ int MOREP_Receive (int index, uint8_t *msgtype, uint8_t *buffer, int *len) return -1; } MOREP_descriptor_t *morep = MOREP_list[index]; + int i; + for (i = 0; i < MAX_FRAGMENTS; i++) { + (morep->fragment_list + i)->len = 0; + //(morep->fragment_list + i)->status = 0; + } + int rxmsgtype = -1; + int rxseqnum = -1; + int rxlen = 0; + int flag = 0; do { int rxlen = recvfrom (morep->sock, morep->rx_buffer, sizeof (morep->rx_buffer), 0, NULL, 0); VERBOSE (morep, DEBUG, PRINTF ("rec. preamble: "); int i; for (i = 0; i < 18; i++) printf ("%02x:", morep->rx_buffer[i]); printf ("\n")); - *msgtype = morep->rx_buffer[14]; - uint8_t seqnum= morep->rx_buffer[15]; - uint16_t msglen = 0; - memcpy ((void *) &msglen, morep->rx_buffer + 16, 2); - morep->rxlen = htons (msglen); - if (morep->rxlen < 64 - 18) { + + /* sequence number */ + int pkgseqnum = morep->rx_buffer[15]; + if ((rxseqnum != -1) && (rxseqnum != pkgseqnum)) { + VERBOSE (morep, WARNING, PRINTF ("incoherent seqnum: %d != %d\n", rxseqnum, pkgseqnum)); + } + rxseqnum = pkgseqnum; + + /* msessage type */ + int pkgmsgtype = morep->rx_buffer[14]; + if ((rxmsgtype != -1) && (rxmsgtype != pkgmsgtype)) { + VERBOSE (morep, WARNING, PRINTF ("incoherent msgtype: %d != %d\n", rxmsgtype, pkgmsgtype)); + } + rxmsgtype = pkgmsgtype; + + /* flag, fragment number and payload length */ + uint16_t pkgflagfraglen = 0; + memcpy ((void *) &pkgflagfraglen, morep->rx_buffer + 16, 2); + pkgflagfraglen = ntohs (pkgflagfraglen); + flag = (pkgflagfraglen >> 15) & 0x0001; + int pkgfrag = (pkgflagfraglen >> 11) & 0x000f; + int pkglen = (pkgflagfraglen >> 0) & 0x07ff; + + /* check padding */ + if (pkglen < 64 - 18) { VERBOSE (morep, DEBUG, PRINTF ("padding of %d bytes\n", 64 - 18 - morep->rxlen)); VERBOSE (morep, DEBUG, int i; for (i = morep->rxlen + 18; i < 64; i++) if (morep->rx_buffer[i] != 0) { VERBOSE (morep, WARNING, PRINTF ("incorrect padding\n")); break; }); - } else if (morep->rxlen != len - 18) { - VERBOSE (morep, WARNING, PRINTF ("incorrect size (%d/%d)\n", morep->rxlen, len - 18)); - morep->rxlen = len - 18; + } else if (pkglen != rxlen - 18) { + VERBOSE (morep, WARNING, PRINTF ("incorrect size (%d/%d)\n", pkglen, rxlen - 18)); + } + + /* store fragment */ + if (flag) { + MOREP_fragment_t *frag = morep->fragment_list + pkgfrag; + memcpy (frag->buffer, morep->rx_buffer + 18, pkglen); + frag->len = pkglen; + //frag->status = 1; + } else { + int i; + for (i = 0; (i < MAX_FRAGMENTS) && ((morep->fragment_list + i)->len != 0); i++) { + MOREP_fragment_t *frag = morep->fragment_list + i; + memcpy (buffer + rxlen, frag->buffer, frag->len); + rxlen += frag->len; + } + memcpy (buffer + rxlen, morep->rx_buffer + 18, pkglen); + rxlen += pkglen; } + } while (flag); + + if (msgtype) { + *msgtype = rxmsgtype; + } + if (*len) { + *len = rxlen; + } - return seqnum; + return rxseqnum; } int MOREP_Close (int index) diff --git a/morep.h b/morep.h index 86a0946..a7e3bdf 100644 --- a/morep.h +++ b/morep.h @@ -63,8 +63,6 @@ int MOREP_Connect (char *url); */ int MOREP_Close (int index); -uint8_t *MOREP_Get_Tx_Buffer (int index, int *size); - /** @ingroup MOREP @@ -80,9 +78,7 @@ uint8_t *MOREP_Get_Tx_Buffer (int index, int *size); @see MOREP_Connect() */ -int MOREP_Send (int index, uint8_t msgtype, int len); - -uint8_t *MOREP_Get_Rx_Buffer (int index, int *size); +int MOREP_Send (int index, uint8_t msgtype, uint8_t *buffer, int len); /** @ingroup MOREP @@ -101,7 +97,7 @@ uint8_t *MOREP_Get_Rx_Buffer (int index, int *size); @see MOREP_Connect() */ -int MOREP_Receive (int index, uint8_t *msgtype); +int MOREP_Receive (int index, uint8_t *msgtype, uint8_t *buffer, int *len); /** @ingroup MOREP diff --git a/morep_server.c b/morep_server.c index f42a3f0..2b093a3 100644 --- a/morep_server.c +++ b/morep_server.c @@ -67,24 +67,19 @@ int server (char *url) uint8_t rxmsgtype = 0; int rxmsglen = 0; - int rxseqnum = MOREP_Receive (morep, &rxmsgtype); - uint8_t *rxbuffer = MOREP_Get_Rx_Buffer (morep, &rxmsglen); - VERBOSE (morep, INFO, PRINTF ("receive %d bytes (%d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum)); - VERBOSE (morep, INFO, PRINTF ("message: '"); fwrite ((char *)rxbuffer, 1, rxmsglen, stdout); printf ("'\n")); - - 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[txmsglen] = '\0'; - VERBOSE (morep, INFO, PRINTF ("prepare buffer for sending: '%s'\n", (char *)buffer)); + uint8_t rxbuffer[1500] = {0}; + int rxseqnum = MOREP_Receive (morep, &rxmsgtype, rxbuffer, &rxmsglen); + VERBOSE (morep, INFO, PRINTF ("rx %d bytes (%d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum)); + VERBOSE (morep, DEBUG, PRINTF ("rx msg: '"); fwrite ((char *)rxbuffer, 1, rxmsglen, stdout); printf ("'\n")); uint8_t txmsgtype = 0x01; - int txseqnum = MOREP_Send (morep, txmsgtype, txmsglen); - VERBOSE (morep, INFO, PRINTF ("send %d bytes (%d) [%d]\n", txmsglen, txmsgtype, txseqnum)); - + int txmsglen = strlen (words[i]); + int txseqnum = MOREP_Send (morep, txmsgtype, (uint8_t *)words[i], txmsglen); + VERBOSE (morep, INFO, PRINTF ("tx %d bytes (%d) [%d]\n", txmsglen, txmsgtype, txseqnum)); + if (words[++i] == NULL) { + i = 0; + } + VERBOSE (morep, DEBUG, PRINTF ("tx msg: '%s'\n", words[i])); } MOREP_Close (morep); @@ -114,9 +109,8 @@ int client (char *url, uint8_t txmsgtype, char *filename) } while (!feof (fid)) { - int txmsglen = 0; - uint8_t *txbuffer = MOREP_Get_Tx_Buffer (morep, &txmsglen); - memset (txbuffer, 0, txmsglen); + int txmsglen = 1500; + uint8_t txbuffer[1500] = {0}; int i = 0; do { fread (txbuffer + i, 1, 1, fid); @@ -133,15 +127,16 @@ int client (char *url, uint8_t txmsgtype, char *filename) return -1; } - int txseqnum = MOREP_Send (morep, txmsgtype, txmsglen); - VERBOSE (morep, INFO, PRINTF ("send %d bytes(%d) [%d]\n", txmsglen, txmsgtype, txseqnum)); + int txseqnum = MOREP_Send (morep, txmsgtype, txbuffer, txmsglen); + VERBOSE (morep, INFO, PRINTF ("tx %d bytes(%d) [%d]\n", txmsglen, txmsgtype, txseqnum)); + VERBOSE (morep, DEBUG, PRINTF ("tx msg: '%s'\n", txbuffer)); uint8_t rxmsgtype = 0; int rxmsglen = 0; - int rxseqnum = MOREP_Receive (morep, &rxmsgtype); - uint8_t *rxbuffer = MOREP_Get_Rx_Buffer (morep, &rxmsglen); - VERBOSE (morep, INFO, PRINTF ("receive %d bytes (%d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum)); - VERBOSE (morep, INFO, PRINTF ("message: '"); fwrite ((char *)rxbuffer, 1, rxmsglen, stdout); printf ("'\n")); + uint8_t rxbuffer[1500] = {0}; + int rxseqnum = MOREP_Receive (morep, &rxmsgtype, rxbuffer, &rxmsglen); + VERBOSE (morep, INFO, PRINTF ("rx %d bytes (%d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum)); + VERBOSE (morep, DEBUG, PRINTF ("rx msg: '"); fwrite ((char *)rxbuffer, 1, rxmsglen, stdout); printf ("'\n")); } if (fid != stdin) { @@ -179,7 +174,7 @@ int main (int argc, char **argv) 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)); + VERBOSE (morep, ERROR, fprintf (stderr, "%s: message file not specified\n", progname)); return 1; } filename = arg; @@ -187,7 +182,7 @@ int main (int argc, char **argv) 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)); + VERBOSE (morep, ERROR, fprintf (stderr, "%s: message type not specified\n", progname)); return 1; } msgtype = atoi (arg); @@ -195,7 +190,7 @@ int main (int argc, char **argv) case 'v': arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL; if (arg == NULL) { - VERBOSE (ERROR, fprintf (stderr, "%s: verbose level not specified\n", progname)); + VERBOSE (morep, ERROR, fprintf (stderr, "%s: verbose level not specified\n", progname)); return 1; } CHANGE_VERBOSE_LEVEL (morep, atoi (arg));