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)
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"));
}
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;
}