return -1;
}
- int len = ((int)(pt - url) > (int)sizeof (addr->ifname) - 1) ? (int)(pt - url) : (int)sizeof (addr->ifname) - 1;
+ int len = ((int)(pt - url) < (int)sizeof (addr->ifname) - 1) ? (int)(pt - url) : (int)sizeof (addr->ifname) - 1;
strncpy (addr->ifname, url, len);
addr->ifname[len] = '\0';
+ VERBOSE (morep, DEBUG, PRINTF ("ifname: '%s'\n", addr->ifname));
+
return 0;
}
addr->mac_address[j++] = '\0';
char *ptr = NULL;
addr->mac[i] = strtoul (addr->mac_address + 3 * i, &ptr, 16);
- if (ptr != NULL) {
+ if (*ptr != '\0') {
break;
}
if (i < 5) {
return -1;
}
+ VERBOSE (morep, DEBUG, PRINTF ("mac: %02x:%02x:%02x:%02x:%02x:%02x\n", addr->mac[0], addr->mac[1], addr->mac[2], addr->mac[3], addr->mac[4], addr->mac[4]));
+
return 0;
}
/* ETHERTYPE format: XXXXX */
char *ptr = NULL;
addr->ether_type = strtoul (url, &ptr, 16);
- if (ptr != NULL) {
- VERBOSE (morep, WARNING, PRINTF ("can't parse ethertype numbe (hexa) '%s'\n", url));
+ if (*ptr != '\0') {
+ VERBOSE (morep, WARNING, PRINTF ("can't parse ethertype number (hexa) '%s'\n", url));
return -1;
}
+ VERBOSE (morep, DEBUG, PRINTF ("ethertype: 0x%04x\n", addr->ether_type));
+
return 0;
}
VERBOSE (morep, WARNING, PRINTF ("can't get interface index (%s)\n", strerror (errno)));
return -1;
}
+
+ VERBOSE (morep, DEBUG, PRINTF ("interface index: %d\n", ifr.ifr_ifindex));
+
return ifr.ifr_ifindex;
}
mac[i] = *p++;
}
+ VERBOSE (morep, DEBUG, PRINTF ("mac: %02x:%02x:%02x:%02x:%02x:%02x\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[4]));
+
return 0;
}
MOREP_list[i] = (MOREP_descriptor_t *) calloc (sizeof (MOREP_descriptor_t), 1);
assert (MOREP_list[i]);
+ VERBOSE (morep, DEBUG, PRINTF ("allocated morep: %d\n", i));
+
return i;
}
memcpy (MOREP_list[index]->tx_buffer + 12, (void *) ðer_type, 2);
}
- return sock;
+ return index;
}
uint8_t *MOREP_Get_Tx_Buffer (int index)
{
+ 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));
int MOREP_Send (int index, uint8_t msgtype, int len)
{
+ VERBOSE (morep, TRACE, PRINTF ("MOREP_Send\n"));
/* Message format is
* bytes 0 : msgtype
*/
if ((len < 0) || (len > 9014 - 18) ||
- //((data == NULL) && (len > 0)) ||
- //((data != NULL) && (len == 0)) ||
((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[0] = msgtype;
- morep->tx_buffer[1] = morep->seqnum++;
+ morep->tx_buffer[14] = msgtype;
+ morep->tx_buffer[15] = morep->seqnum++;
uint16_t msglen = htons (len);
- memcpy (morep->tx_buffer + 2, (void *) &msglen, 2);
+ 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;
}
-int MOREP_Receive (int index)
+uint8_t *MOREP_Receive (int index, uint8_t *msgtype, uint16_t *msglen)
{
- return -1;
+ VERBOSE (morep, TRACE, PRINTF ("MOREP_Receive\n"));
+
+ *msgtype = *msglen = 0;
+ if (((index < 0) || (index >= MAX_MOREP_NUMBER)) ||
+ (MOREP_list[index] == NULL)) {
+ VERBOSE (morep, ERROR, PRINTF ("incorrect MOREP descriptor (%d)\n", index));
+ return NULL;
+ }
+ 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;
+ }
+ *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;
+ }
+
+ return morep->rx_buffer + 18;
}
{
switch (sig) {
case SIGINT:
- stop = 1;
+ //stop = 1;
+ exit (0);
break;
case SIGTERM:
exit (0);
int server (char *url)
{
- VERBOSE (morep, TRACE, PRINTF ("morep_server\n"));
+ VERBOSE (morep, TRACE, PRINTF ("server\n"));
int morep = MOREP_Connect (url);
if (morep < 0) {
return -1;
}
- VERBOSE (morep, INFO, PRINTF ("server started at '%s'\n", url));
+ VERBOSE (morep, INFO, PRINTF ("server started at '%s' (%d)\n", url, morep));
signal(SIGINT, sig_handler);
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) {
+ while (!stop) {
- int len = MOREP_Receive (morep);
- VERBOSE (morep, INFO, PRINTF ("receive %d bytes\n", len));
+ 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);
- len = strlen (words[i]);
+ int len = strlen (words[i]);
memcpy (buffer, words[i++], len);
if (words[i] == NULL) {
i = 0;
}
+ buffer[len] = '\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));
char *arg = *(++argv);
if (arg[0] != '-') {
url = arg;
+ continue;
}
char c = arg[1];
switch (c) {