#define MAX_MOREP_NUMBER 256
#define MAX_ETHER_SIZE 1500 /* 9000 for jumbo frame */
-#define MAX_FRAGMENTS (2^4)
+#define MAX_FRAGMENTS 15
/**
Fragment structure
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));
+ VERBOSE (morep, DEBUG, PRINTF ("flag/frag/length: %d/%d/%d\n", (pklen != len), nfrag, pklen));
+ uint16_t msglen = htons (pklen | (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"));
txlen = 64;
}
rc = sendto (morep->sock, morep->tx_buffer, txlen, 0, NULL, 0);
-
+
len -= pklen;
buffer -= pklen;
nfrag++;
int MOREP_Receive (int index, uint8_t *msgtype, uint8_t *buffer, int *len)
{
VERBOSE (morep, TRACE, PRINTF ("MOREP_Receive\n"));
+ int i;
*msgtype = 0;
if (((index < 0) || (index >= MAX_MOREP_NUMBER)) ||
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;
/* check padding */
if (pkglen < 64 - 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; });
+ 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));
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;
char *words[] = {"Quo", "cognito", "Constantius", "ultra", "mortalem", "modum", "exarsit", "ac", "nequo", "casu", "idem", "Gallus", "de", "futuris", "incertus", "agitare", "quaedam", "conducentia", "saluti", "suae", "per", "itinera", "conaretur,", "remoti", "sunt", "omnes", "de", "industria", "milites", "agentes", "in", "civitatibus", "perviis.", NULL};
+#define BUFMAX 4096
+
void sig_handler (int sig)
{
switch (sig) {
uint8_t rxmsgtype = 0;
int rxmsglen = 0;
- uint8_t rxbuffer[1500] = {0};
+ uint8_t rxbuffer[1496 * 16] = {0};
int rxseqnum = MOREP_Receive (morep, &rxmsgtype, rxbuffer, &rxmsglen);
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"));
+ VERBOSE (morep, TRACE, PRINTF ("rx msg: '"); fwrite ((char *)rxbuffer, 1, rxmsglen, stdout); printf ("'\n"));
uint8_t txmsgtype = 0x01;
- int txmsglen = strlen (words[i]);
+ int txmsglen = strlen (words[i]);
int txseqnum = MOREP_Send (morep, txmsgtype, (uint8_t *)words[i], txmsglen);
VERBOSE (morep, INFO, PRINTF ("tx %d bytes (msgid %d) [%d]\n", txmsglen, txmsgtype, txseqnum));
- VERBOSE (morep, DEBUG, PRINTF ("tx msg: '%s'\n", words[i]));
+ VERBOSE (morep, TRACE, PRINTF ("tx msg: '%s'\n", words[i]));
if (words[++i] == NULL) {
i = 0;
}
return 0;
}
-int client (char *url, uint8_t txmsgtype, char *filename)
+int clientline (char *url, uint8_t txmsgtype, char *filename)
{
VERBOSE (morep, TRACE, PRINTF ("client\n"));
}
while (!feof (fid)) {
- int txmsglen = 1500;
- uint8_t txbuffer[1500] = {0};
+ int txmsglen = 1496;
+ uint8_t txbuffer[1496] = {0};
int i = 0;
do {
fread (txbuffer + i, 1, 1, fid);
int txseqnum = MOREP_Send (morep, txmsgtype, txbuffer, txmsglen);
VERBOSE (morep, INFO, PRINTF ("tx %d bytes (msgid %d) [%d]\n", txmsglen, txmsgtype, txseqnum));
- VERBOSE (morep, DEBUG, PRINTF ("tx msg: '%s'\n", txbuffer));
+ VERBOSE (morep, TRACE, PRINTF ("tx msg: '%s'\n", txbuffer));
uint8_t rxmsgtype = 0;
int rxmsglen = 0;
- uint8_t rxbuffer[1500] = {0};
+ uint8_t rxbuffer[1496] = {0};
int rxseqnum = MOREP_Receive (morep, &rxmsgtype, rxbuffer, &rxmsglen);
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"));
+ VERBOSE (morep, TRACE, PRINTF ("rx msg: '"); fwrite ((char *)rxbuffer, 1, rxmsglen, stdout); printf ("'\n"));
}
if (fid != stdin) {
return 0;
}
+
+char *readstream (FILE *sd, int *length)
+{
+ VERBOSE (morep, TRACE, PRINTF ("readstream\n"));
+
+ char *buffer = NULL;
+ size_t size = 0;
+ int blocklen = 0;
+ int _length = 0;
+ do {
+ size += BUFMAX + (size == 0);
+ buffer = (char *) realloc (buffer, size);
+ memset (buffer + size - BUFMAX - 1, 0, BUFMAX + 1);
+ blocklen = fread (buffer + size - BUFMAX - 1, 1, BUFMAX, sd);
+ _length += blocklen;
+ VERBOSE (morep, DEBUG, PRINTF ("buffer: 0x%p 0x%p %d %d %d\n", buffer, buffer + size - BUFMAX - 1, (int)size, _length, blocklen));
+ } while (blocklen > 0);
+
+ /* check size */
+ VERBOSE (morep, DEBUG, PRINTF ("read length: %d\n", _length));
+ if (_length == 0) {
+ free (buffer);
+ buffer = NULL;
+ }
+ if (length) {
+ *length = _length;
+ }
+
+ return buffer;
+}
+
+int clientfile (char *url, uint8_t txmsgtype, char *filename)
+{
+ VERBOSE (morep, TRACE, PRINTF ("client\n"));
+
+ /* open connection */
+ int morep = MOREP_Connect (url);
+ if (morep < 0) {
+ VERBOSE (morep, ERROR, PRINTF ("can't connect on url '%s'\n", url));
+ return -1;
+ }
+
+ /* read file */
+ FILE *fid = stdin;
+ if (filename != NULL) {
+ fid = fopen (filename, "r");
+ if (fid == NULL) {
+ VERBOSE (morep, ERROR, PRINTF ("can't open file '%s' for reading\n", filename));
+ return -1;
+ }
+ }
+ int len = 0;
+ uint8_t *buffer = (uint8_t *) readstream (fid, &len);
+ if (fid != stdin) {
+ fclose (fid);
+ }
+
+ uint8_t *txbuffer = buffer;
+ while (len > 0) {
+ int txmsglen = 1496 * 16 - 1;
+ if (len < txmsglen) {
+ txmsglen = len;
+ }
+ int txseqnum = MOREP_Send (morep, txmsgtype, txbuffer, txmsglen);
+ VERBOSE (morep, INFO, PRINTF ("tx %d bytes (msgid %d) [%d]\n", txmsglen, txmsgtype, txseqnum));
+ VERBOSE (morep, TRACE, PRINTF ("tx msg: '"); fwrite ((char *)txbuffer, 1, txmsglen, stdout); printf ("'\n"));
+ len -= txmsglen;
+ txbuffer -= txmsglen;
+
+ uint8_t rxmsgtype = 0;
+ int rxmsglen = 0;
+ uint8_t rxbuffer[1496] = {0};
+ int rxseqnum = MOREP_Receive (morep, &rxmsgtype, rxbuffer, &rxmsglen);
+ VERBOSE (morep, INFO, PRINTF ("rx %d bytes (msgid %d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum));
+ VERBOSE (morep, TRACE, PRINTF ("rx msg: '"); fwrite ((char *)rxbuffer, 1, rxmsglen, stdout); printf ("'\n"));
+ }
+
+ free (buffer);
+ MOREP_Close (morep);
+
+ return 0;
+}
+
int main (int argc, char **argv)
{
char *filename = NULL;
int msgtype = -1;
char *url = NULL;
+ int linebyline = 1;
/* get basename */
char *pt = progname = argv[0];
}
char c = arg[1];
switch (c) {
+ case 'b':
+ linebyline = 0;
+ break;
case 'f':
arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
if (arg == NULL) {
}
filename = arg;
break;
+ case 'l':
+ linebyline = 1;
+ break;
case 's':
arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
if (arg == NULL) {
break;
case 'h':
default:
- printf ("usage: %s [-h] [-f file] [-s msgtype] [-v int] <url>\n", progname);
+ printf ("usage: %s [-b|-l] [-h] [-f file] [-s msgtype] [-v int] <url>\n", progname);
return (c != 'h');
}
}
if (url == NULL) {
VERBOSE (morep, ERROR, PRINTF ("missing url\n"));
} else if (msgtype != -1) {
- rc = client (url, msgtype, filename);
+ if (linebyline) {
+ rc = clientline (url, msgtype, filename);
+ } else {
+ rc = clientfile (url, msgtype, filename);
+ }
} else {
rc = server (url);
}
/* test: morep_server -h */
/* test: morep_server -v 4 */
-/* vi:set tabstop=4 expandtab shiftwidth=4: this line set vi mode*/
+/* vim: set tabstop=4 expandtab shiftwidth=4: */