} MOREP_addr_t;
#define MAX_MOREP_NUMBER 256
+#define MAX_ETHER_SIZE 1500 /* 9000 for jumbo frame */
/**
Type of private descriptor associated to each connected SAP.
typedef struct {
int sock;
uint8_t seqnum;
- uint8_t tx_buffer[9014]; // jumbo frame (1514 standard frame)
- uint8_t rx_buffer[9014]; // jumbo frame (1514 standard frame)
+ uint8_t tx_buffer[MAX_ETHER_SIZE + 14];
+ uint8_t rx_buffer[MAX_ETHER_SIZE + 14];
+ uint16_t rxlen;
} MOREP_descriptor_t ;
/**
return index;
}
-uint8_t *MOREP_Get_Tx_Buffer (int index)
+uint8_t *MOREP_Get_Tx_Buffer (int index, int *size)
{
VERBOSE (morep, TRACE, PRINTF ("MOREP_Get_Tx_Buffer\n"));
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;
}
* bytes 4- : data
*/
- if ((len < 0) || (len > 9014 - 18) ||
+ if ((len < 0) || (len > MAX_ETHER_SIZE + 14 - 18) ||
((index < 0) || (index >= MAX_MOREP_NUMBER)) ||
(MOREP_list[index] == NULL)) {
VERBOSE (morep, ERROR, PRINTF ("incorrect MOREP descriptor (%d)\n", index));
MOREP_descriptor_t *morep = MOREP_list[index];
morep->tx_buffer[14] = msgtype;
- morep->tx_buffer[15] = morep->seqnum++;
+ int seqnum = morep->tx_buffer[15] = morep->seqnum++;
uint16_t msglen = htons (len);
memcpy (morep->tx_buffer + 16, (void *) &msglen, 2);
int rc = sendto (morep->sock, morep->tx_buffer, len + 18, 0, NULL, 0);
- return (rc < 18) ? -1 : rc - 18;
+ return (rc < 18) ? -1 : seqnum;
}
-uint8_t *MOREP_Receive (int index, uint8_t *msgtype, uint16_t *msglen)
+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]->tx_buffer + 18;
+}
+
+int MOREP_Receive (int index, uint8_t *msgtype)
{
VERBOSE (morep, TRACE, PRINTF ("MOREP_Receive\n"));
- *msgtype = *msglen = 0;
+ *msgtype = 0;
if (((index < 0) || (index >= MAX_MOREP_NUMBER)) ||
(MOREP_list[index] == NULL)) {
VERBOSE (morep, ERROR, PRINTF ("incorrect MOREP descriptor (%d)\n", index));
- return NULL;
+ return -1;
}
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 NULL;
+ return -1;
}
*msgtype = morep->rx_buffer[14];
- if (morep->rx_buffer[15] != morep->seqnum) {
- VERBOSE (morep, WARNING, PRINTF ("incorrect sequence id (%d/%d)\n", morep->rx_buffer[15], morep->seqnum));
- morep->seqnum = morep->rx_buffer[15];
- }
- morep->seqnum++;
- memcpy ((void *) msglen, morep->tx_buffer + 16, 2);
- *msglen = htons (*msglen);
- if (*msglen != len - 18) {
- VERBOSE (morep, WARNING, PRINTF ("incorrect size (%d/%d)\n", *msglen, len - 18));
- *msglen = len - 18;
+ uint8_t seqnum= morep->rx_buffer[15];
+ uint16_t msglen = 0;
+ memcpy ((void *) &msglen, morep->tx_buffer + 16, 2);
+ morep->rxlen = htons (msglen);
+ if (morep->rxlen != len - 18) {
+ VERBOSE (morep, WARNING, PRINTF ("incorrect size (%d/%d)\n", morep->rxlen, len - 18));
+ morep->rxlen = len - 18;
}
- return morep->rx_buffer + 18;
+ return seqnum;
}
+int MOREP_Close (int index)
+{
+ VERBOSE (morep, TRACE, PRINTF ("MOREP_Close\n"));
+
+ if ((index < 0) || (index >= MAX_MOREP_NUMBER) ||
+ (MOREP_list[index] == NULL)) {
+ VERBOSE (morep, ERROR, PRINTF ("incorrect MOREP descriptor (%d)\n", index));
+ return -1;
+ }
+
+ close (MOREP_list[index]->sock);
+ free (MOREP_list[index]);
+ MOREP_list[index] = NULL;
+
+ return 0;
+}
/* vi:set tabstop=4 expandtab shiftwidth=4: this line set vi mode*/
/* linker: morep.o */
/* winlnk: morep.o */
+#include <errno.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
DECLARE_VERBOSE_LEVEL (morep, INFO);
+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};
+
void sig_handler (int sig)
{
switch (sig) {
signal(SIGTERM, sig_handler);
int i = 0;
- 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};
while (!stop) {
uint8_t rxmsgtype = 0;
- uint16_t rxmsglen = 0;
- uint8_t *rxbuffer = MOREP_Receive (morep, &rxmsgtype, &rxmsglen);
- VERBOSE (morep, INFO, PRINTF ("receive %d bytes (%d)\n", rxmsglen, rxmsgtype));
-
- uint8_t *buffer = MOREP_Get_Tx_Buffer (morep);
- int len = strlen (words[i]);
- memcpy (buffer, words[i++], len);
+ int rxmsglen = 0;
+ int rxseqnum = MOREP_Receive (morep, &rxmsgtype);
+ MOREP_Get_Rx_Buffer (morep, &rxmsglen);
+ VERBOSE (morep, INFO, PRINTF ("receive %d bytes (%d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum));
+
+ 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[len] = '\0';
+ buffer[txmsglen] = '\0';
VERBOSE (morep, INFO, PRINTF ("prepare buffer for sending: '%s'\n", (char *)buffer));
- len = MOREP_Send (morep, 0x01, len);
- VERBOSE (morep, INFO, PRINTF ("send %d bytes\n", len));
+ uint8_t txmsgtype = 0x01;
+ int txseqnum = MOREP_Send (morep, txmsgtype, txmsglen);
+ VERBOSE (morep, INFO, PRINTF ("send %d bytes (%d) [%d]\n", txmsglen, txmsgtype, txseqnum));
+
+ }
+
+ MOREP_Close (morep);
+
+ return 0;
+}
+
+int client (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;
+ }
+ }
+
+ while (!feof (fid)) {
+ int txmsglen = 0;
+ uint8_t *txbuffer = MOREP_Get_Tx_Buffer (morep, &txmsglen);
+ txmsglen = fread (txbuffer, 1, txmsglen, fid);
+ if ((txmsglen == 0) && (errno != 0)) {
+ VERBOSE (morep, ERROR, PRINTF ("can't read data from file '%s'\n", filename));
+ return -1;
+ }
+ int txseqnum = MOREP_Send (morep, txmsgtype, txmsglen);
+ VERBOSE (morep, INFO, PRINTF ("send %d bytes(%d) [%d]\n", txmsglen, txmsgtype, txseqnum));
+
+ uint8_t rxmsgtype = 0;
+ int rxmsglen = 0;
+ int rxseqnum = MOREP_Receive (morep, &rxmsgtype);
+ MOREP_Get_Rx_Buffer (morep, &rxmsglen);
+ VERBOSE (morep, INFO, PRINTF ("receive %d bytes (%d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum));
}
+ if (fid != stdin) {
+ fclose (fid);
+ }
+ MOREP_Close (morep);
+
return 0;
}
int main (int argc, char **argv)
{
+ char *filename = NULL;
+ int msgtype = -1;
char *url = NULL;
/* get basename */
}
char c = arg[1];
switch (c) {
+ 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));
+ return 1;
+ }
+ filename = arg;
+ break;
+ 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));
+ return 1;
+ }
+ msgtype = atoi (arg);
+ break;
case 'v':
arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
if (arg == NULL) {
break;
case 'h':
default:
- printf ("usage: %s [-h] [-v int] <url>\n", progname);
+ printf ("usage: %s [-h] [-f file] [-s msgtype] [-v int] <url>\n", progname);
return (c != 'h');
}
}
+ int rc = 1;
if (url == NULL) {
VERBOSE (morep, ERROR, PRINTF ("missing url\n"));
- return 1;
+ } else if (msgtype != -1) {
+ rc = client (url, msgtype, filename);
+ } else {
+ rc = server (url);
}
- server (url);
- return 0;
+ return rc;
}
/* test-depend: morep_valid */