From: Laurent Mazet Date: Thu, 27 Mar 2025 06:48:46 +0000 (+0100) Subject: wip X-Git-Tag: v1.0~102 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=a1cd89f63f77adc6ae663df26a72dae8605490d1;p=morep.git wip --- diff --git a/morep.c b/morep.c index 8f3f61d..75eb008 100644 --- a/morep.c +++ b/morep.c @@ -288,56 +288,53 @@ int MOREP_Connect (char *url) return index; } -uint8_t *MOREP_Get_Tx_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 = MAX_ETHER_SIZE + 14 - 18; - } - - return MOREP_list[index]->tx_buffer + 18; -} - -int MOREP_Send (int index, uint8_t msgtype, int len) +int MOREP_Send (int index, uint8_t msgtype, uint8_t *buffer, int len) { VERBOSE (morep, TRACE, PRINTF ("MOREP_Send\n")); /* Message format is - * bytes 0 : msgtype - * bytes 1 : seqnumber - * bytes 2-3 : len - * bytes 4- : data + * bytes 0 : msgtype + * bytes 1 : seqnumber + * bytes 2-3 : flag + length + * bit 15 : flag "more" fragmented packet(s) + * bit 11-14 : fragment number + * bit 0-10 : length (l) + * bytes 4-(l-5): data + * padding l<46 : zeros */ - if ((len < 0) || (len > MAX_ETHER_SIZE + 14 - 18) || - ((index < 0) || (index >= MAX_MOREP_NUMBER)) || - (MOREP_list[index] == NULL)) { + if ((len < 0) || ((len + MAX_ETHER_SIZE - 5) / (MAX_ETHER_SIZE - 4) > 16) || + (index < 0) || (index >= MAX_MOREP_NUMBER) || (MOREP_list[index] == NULL)) { VERBOSE (morep, ERROR, PRINTF ("incorrect MOREP descriptor (%d)\n", index)); return -1; } MOREP_descriptor_t *morep = MOREP_list[index]; morep->tx_buffer[14] = msgtype; + int nfrag = 0; int seqnum = morep->tx_buffer[15] = morep->seqnum++; - uint16_t msglen = htons (len); - memcpy (morep->tx_buffer + 16, (void *) &msglen, 2); - VERBOSE (morep, DEBUG, PRINTF ("sent preamble: "); int i; for (i = 0; i < 18; i++) printf ("%02x:", morep->tx_buffer[i]); printf ("\n")); - - int txlen = len + 18; - if (txlen < 64) { - VERBOSE (morep, DEBUG, PRINTF ("need padding: %d bytes\n", 64 - txlen)); - memset (morep->tx_buffer + txlen, 0, 64 - txlen); - txlen = 64; - } - int rc = sendto (morep->sock, morep->tx_buffer, txlen, 0, NULL, 0); - - return (rc < 18) ? -1 : seqnum; + int rc = 0; + do { + int pklen = (len > MAX_ETHER_SIZE - 4) ? MAX_ETHER_SIZE - 4 : len; + uint16_t msglen = htons (len | (nfrag << 11) | ((pklen != len) << 15)); + memcpy (morep->tx_buffer + 16, (void *) &msglen, 2); + VERBOSE (morep, DEBUG, PRINTF ("sent preamble: "); int i; for (i = 0; i < 18; i++) printf ("%02x:", morep->tx_buffer[i]); printf ("\n")); + + memcpy (morep->tx_buffer + 18, buffer, pklen); + int txlen = pklen + 18; + if (txlen < 64) { + VERBOSE (morep, DEBUG, PRINTF ("need padding: %d bytes\n", 64 - txlen)); + memset (morep->tx_buffer + txlen, 0, 64 - txlen); + txlen = 64; + } + rc = sendto (morep->sock, morep->tx_buffer, txlen, 0, NULL, 0); + + len -= pklen; + buffer -= pklen; + nfrag++; + } while (rc > 0) && (len > 0); + + return (rc > 0) ? seqnum : -1; } uint8_t *MOREP_Get_Rx_Buffer (int index, int *size) @@ -356,7 +353,7 @@ uint8_t *MOREP_Get_Rx_Buffer (int index, int *size) return MOREP_list[index]->rx_buffer + 18; } -int MOREP_Receive (int index, uint8_t *msgtype) +int MOREP_Receive (int index, uint8_t *msgtype, uint8_t *buffer, int *len) { VERBOSE (morep, TRACE, PRINTF ("MOREP_Receive\n")); @@ -368,23 +365,21 @@ int MOREP_Receive (int index, uint8_t *msgtype) } 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 -1; - } - 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) { - 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; - } + 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) { + 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; + } return seqnum; }