#include <errno.h>
#include <fcntl.h>
-#if WIN32
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#define OPT_TYPE char
-#define SETBLOCK(fd) do { u_long _m = 0; ioctlsocket (fd, FIONBIO, &_m); } while (0)
-#define SETNOBLK(fd) do { u_long _m = 1; ioctlsocket (fd, FIONBIO, &_m); } while (0)
-#else /* Linux */
+#include <linux/if_arp.h>
+#include <linux/if_ether.h>
+#include <linux/if_packet.h>
#include <netdb.h>
#include <netinet/in.h>
-#include <netinet/tcp.h>
+#include <netinet/ip.h>
+#include <sys/ioctl.h>
#include <sys/socket.h>
-#define OPT_TYPE int
-#define SETBLOCK(fd) fcntl (fd, F_SETFL, 0)
-#define SETNOBLK(fd) fcntl (fd, F_SETFL, 0_NONBLOCK)
-#endif
+#include <sys/types.h>
#include <stdint.h>
#include <stdio.h>
MOREP address structure
*/
typedef struct {
+ char ifname[32];
char mac_address[18];
uint16_t ether_type;
uint8_t mac[6];
char *pt = strchr (url, ':');
if ((pt == NULL) || (pt[1] != '/') || (pt[2] != '/')) {
VERBOSE (morep, WARNING, PRINTF ("can't parse interface name '%s'\n", url));
- return NULL;
+ return -1;
}
- char *ifname = (char *) calloc (pt - url + 1, 1);
- assert (ifname);
- strncpy (ifname, url, pt - url);
+ 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';
- return ifname;
+ return 0;
}
int parse_mac (MOREP_addr_t *addr, char *url)
if (url[j] == 0) {
break;
}
- mac_address[j] = url[j];
+ addr->mac_address[j] = url[j];
j++;
if (url[j] == 0) {
break;
}
- mac_address[j] = url[j];
+ addr->mac_address[j] = url[j];
j++;
- if (url[j] != (i < 5) ? ':' : '/') {
+ if (url[j] != ((i < 5) ? ':' : '/')) {
break;
}
- mac_address[j++] = '\0';
- char ptr = NULL;
- addr->mac[i] = strtoul (mac_address + 3 * i, &ptr, 16);
+ addr->mac_address[j++] = '\0';
+ char *ptr = NULL;
+ addr->mac[i] = strtoul (addr->mac_address + 3 * i, &ptr, 16);
if (ptr != NULL) {
break;
}
if (i < 5) {
- mac_address[j - 1] = ':';
+ addr->mac_address[j - 1] = ':';
}
}
-
- if (j != 18)
+
+ if (j != 18) {
VERBOSE (morep, WARNING, PRINTF ("can't parse mac address '%s'(%d) \n", url, j));
return -1;
}
VERBOSE (morep, TRACE, PRINTF ("parse_ethertype\n"));
/* ETHERTYPE format: XXXXX */
- char ptr = NULL;
+ 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));
return 0;
}
-int get_interface_index (char *ifname)
+int get_interface_index (int sock, char *ifname)
{
VERBOSE (morep, TRACE, PRINTF ("get_interface_index\n"));
return ifr.ifr_ifindex;
}
-int get_mac_address (char *ifname, uint8_t *mac)
+int get_mac_address (int sock, char *ifname, uint8_t *mac)
{
VERBOSE (morep, TRACE, PRINTF ("get_mac_address\n"));
str[17] = '\0';
}
-int alloc_morep (int sock)
+int alloc_morep ()
{
- VERBOSE (morep, TRACE, PRINTF ("morep_descriptor_t\n"));
+ VERBOSE (morep, TRACE, PRINTF ("alloc_morep\n"));
int i;
for (i = 0; i < MAX_MOREP_NUMBER; i++) {
return -1;
}
- MOREP_list[i] = (morep_descriptor_t *) calloc (sizeof (morep_descriptor_t), 1);
+ MOREP_list[i] = (MOREP_descriptor_t *) calloc (sizeof (MOREP_descriptor_t), 1);
assert (MOREP_list[i]);
return i;
/* parse url */
MOREP_addr_t addr = {0};
- char *ifname = parse_ifname (url);
- if ((ifname == NULL != 0) ||
- (parse_mac (&addr, url + strlen (url) + 3) != 0) ||
- (parse_ethertype (&addr, url + strlen (url) + 21) != 0)) {
+ if ((parse_ifname (&addr, url) != 0) ||
+ (parse_mac (&addr, url + strlen (addr.ifname) + 3) != 0) ||
+ (parse_ethertype (&addr, url + strlen (addr.ifname) + 21) != 0)) {
VERBOSE (morep, ERROR, PRINTF ("can't parse url (%s)\n", url));
return -1;
}
/* get local mac address */
struct sockaddr_ll sock_addr = {0};
sock_addr.sll_family = PF_PACKET;
- sock_addr.sll_protocol = htons (addr->ethertype);
- sock_addr.sll_ifindex = get_interface_index (ifname);
+ sock_addr.sll_protocol = htons (addr.ether_type);
+ sock_addr.sll_ifindex = get_interface_index (sock, addr.ifname);
if (sock_addr.sll_ifindex < 0) {
- VERBOSE (morep, ERROR, PRINTF ("can't get interface index for '%s': %s\n", ifname, strerror (errno)));
- free (ifname);
+ VERBOSE (morep, ERROR, PRINTF ("can't get interface index for '%s': %s\n", addr.ifname, strerror (errno)));
return -1;
}
sock_addr.sll_hatype = ARPHRD_ETHER;
sock_addr.sll_pkttype = PACKET_OTHERHOST;
sock_addr.sll_halen = ETH_ALEN;
- if (get_mac_address(ifname, sock_addr.sll_addr) != 0) {
- VERBOSE (morep, ERROR, PRINTF ("can't get mac address for '%s'\n", ifname));
- free (ifname);
+ if (get_mac_address (sock, addr.ifname, sock_addr.sll_addr) != 0) {
+ VERBOSE (morep, ERROR, PRINTF ("can't get mac address for '%s'\n", addr.ifname));
return -1;
}
/* bind socket */
if (bind (sock, (struct sockaddr *)&sock_addr, sizeof (sock_addr)) != 0) {
VERBOSE (morep, ERROR, printf ("can't bind '%s': %s\n", url, strerror (errno)));
- free (ifname);
return -1;
}
/* info message */
char lmac[18] = {0};
mactoa (lmac, sock_addr.sll_addr);
- VERBOSE (morep, INFO, PRINTF ("I/O on %s local=[%s]\n", ifname, lmac));
- free (ifname);
+ VERBOSE (morep, INFO, PRINTF ("I/O on %s local=[%s]\n", addr.ifname, lmac));
/* store connection */
int index = alloc_morep ();
- if (i >= 0) {
- MOREP_list[i]->sock = sock;
- memcpy (MOREP_list[i]->tx_buffer, (void *) addr->mac, 6);
- memcpy (MOREP_list[i]->tx_buffer + 6, sock_addr.sll_addr, 6);
- uint16_t ether_type = htons (addr->ether_type);
- memcpy (MOREP_list[i]->tx_buffer + 12, (void *) ðer_type, 2);
+ if (index >= 0) {
+ MOREP_list[index]->sock = sock;
+ memcpy (MOREP_list[index]->tx_buffer, (void *) addr.mac, 6);
+ memcpy (MOREP_list[index]->tx_buffer + 6, sock_addr.sll_addr, 6);
+ uint16_t ether_type = htons (addr.ether_type);
+ memcpy (MOREP_list[index]->tx_buffer + 12, (void *) ðer_type, 2);
}
return sock;
*/
if ((len < 0) || (len > 9014 - 18) ||
- ((data == NULL) && (len > 0)) ||
- ((data != NULL) && (len == 0)) ||
+ //((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++;
- uint16_t msglen = htons (mlen);
+ uint16_t msglen = htons (len);
memcpy (morep->tx_buffer + 2, (void *) &msglen, 2);
- int rc = sendto (morep->sock, morep->tx_buffer, nb + 18, 0, NULL, 0);
+ int rc = sendto (morep->sock, morep->tx_buffer, len + 18, 0, NULL, 0);
return (rc < 18) ? -1 : rc - 18;
}
-int MOREP_Receive (int sock)
+int MOREP_Receive (int index)
{
return -1;
}