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 ;
/**
int rxlen = 0;
int flag = 0;
do {
- int rxlen = recvfrom (morep->sock, morep->rx_buffer, sizeof (morep->rx_buffer), 0, NULL, 0);
+ 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"));
/* sequence number */
/* flag, fragment number and payload length */
uint16_t pkgflagfraglen = 0;
memcpy ((void *) &pkgflagfraglen, morep->rx_buffer + 16, 2);
- pkgflagfraglen = ntohs (pkgflagfraglen);
+ pkgflagfraglen = ntohs (pkgflagfraglen);
flag = (pkgflagfraglen >> 15) & 0x0001;
int pkgfrag = (pkgflagfraglen >> 11) & 0x000f;
int pkglen = (pkgflagfraglen >> 0) & 0x07ff;
+ VERBOSE (morep, DEBUG, PRINTF ("flag/frag/length: %d/%d/%d\n", flag, pkgfrag, pkglen));
/* 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 (pkglen != rxlen - 18) {
+ VERBOSE (morep, DEBUG, PRINTF ("padding of %d bytes\n", 64 - 18 - pkglen));
+ VERBOSE (morep, DEBUG, int i; for (i = pkglen + 18; i < 64; i++) if (morep->rx_buffer[i] != 0) { VERBOSE (morep, WARNING, PRINTF ("incorrect padding (%d)\n", i)); break; });
+ }
+ if (((rxlen == 64) && (pkglen > 64 - 18)) || ((rxlen > 64) && (pkglen != rxlen - 18))) {
VERBOSE (morep, WARNING, PRINTF ("incorrect size (%d/%d)\n", pkglen, rxlen - 18));
+ pkglen = rxlen - 18;
}
/* store fragment */
if (flag) {
+ VERBOSE (morep, DEBUG, PRINTF ("storing fragment %d (%d bytes)\n", pkgfrag, pkglen));
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;
+ rxlen = 0;
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;
+ VERBOSE (morep, DEBUG, PRINTF ("gluing fragment %d (%d/%d bytes)\n", i, frag->len, rxlen));
}
memcpy (buffer + rxlen, morep->rx_buffer + 18, pkglen);
rxlen += pkglen;
+ VERBOSE (morep, DEBUG, PRINTF ("last fragment (%d/%d bytes)\n", pkglen, rxlen));
}
} while (flag);
if (msgtype) {
*msgtype = rxmsgtype;
}
- if (*len) {
+ if (len) {
*len = rxlen;
}
int rxmsglen = 0;
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, INFO, PRINTF ("rx %d bytes (msgid %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 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));
+ VERBOSE (morep, INFO, PRINTF ("tx %d bytes (msgid %d) [%d]\n", txmsglen, txmsgtype, txseqnum));
+ VERBOSE (morep, DEBUG, PRINTF ("tx msg: '%s'\n", words[i]));
if (words[++i] == NULL) {
i = 0;
}
- VERBOSE (morep, DEBUG, PRINTF ("tx msg: '%s'\n", words[i]));
}
MOREP_Close (morep);
}
int txseqnum = MOREP_Send (morep, txmsgtype, txbuffer, txmsglen);
- VERBOSE (morep, INFO, PRINTF ("tx %d bytes(%d) [%d]\n", txmsglen, txmsgtype, txseqnum));
+ VERBOSE (morep, INFO, PRINTF ("tx %d bytes (msgid %d) [%d]\n", txmsglen, txmsgtype, txseqnum));
VERBOSE (morep, DEBUG, PRINTF ("tx msg: '%s'\n", txbuffer));
uint8_t rxmsgtype = 0;
int rxmsglen = 0;
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, INFO, PRINTF ("rx %d bytes (msgid %d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum));
VERBOSE (morep, DEBUG, PRINTF ("rx msg: '"); fwrite ((char *)rxbuffer, 1, rxmsglen, stdout); printf ("'\n"));
}