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