void free_all_moreps (void)
{
-
- VERBOSE (morep, 2, FPRINTF (stdout, "free_all_moreps\n"));
+ VERBOSE (morep, TRACE, FPRINTF (stdout, "free_all_moreps\n"));
int i;
for (i = 0; i < MAX_MOREP_NUMBER; i++) {
}
}
-static int _parse_mac (const char *hexa_str, MOREP_addr_t *addr)
+int _parse_mac (char *hexa_str, MOREP_addr_t *addr)
{
+ VERBOSE (morep, TRACE, FPRINTF (stdout, "free_all_moreps\n"));
+
/* MAC address format: XX:XX:XX:XX:XX:XX */
if (strlen (hexa_str) != 17) {
return -1;
}
return 0;
}
- struct in_addr **addr_list;
+
+int MOREP_open (const char *ifname, const char *mac_address, unsigned short EthType)
+{
+ VERBOSE (morep, TRACE, FPRINTF (stdout, "MOREP_open\n"));
+
+ this->mac_address = strdup(mac_address);
+
+ parse_mac(mac_address, this->remote_mac);
+
+ sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
+ if (sock < 0) {
+ VERBOSE (VERBOSE_ERROR, printf ("socket(): %s\n", strerror (errno)));
+ VERBOSE (VERBOSE_ERROR, printf("Warning: you must be root to have raw access to sockets\n"));
+ return -1;
+ }
+
+ memset(&sock_addr, 0, sizeof (struct sockaddr_ll));
+
+ sock_addr.sll_family = PF_PACKET;
+ sock_addr.sll_protocol = htons(EthType);
+ sock_addr.sll_ifindex = Get_IfaceIndex(ifname);
+ if (sock_addr.sll_ifindex < 0) return -1;
+ sock_addr.sll_hatype = ARPHRD_ETHER;
+ sock_addr.sll_pkttype = PACKET_OTHERHOST;
+ sock_addr.sll_halen = ETH_ALEN;
+ if (Get_MacAddress(ifname, sock_addr.sll_addr) != 0) {
+ printf("Cannot get local mac address for %s\n", ifname);
+ return -1;
+ }
+
+ int res = bind(sock, (struct sockaddr *) & sock_addr, sizeof (sock_addr));
+ if (res != 0) {
+ VERBOSE (VERBOSE_ERROR, printf ("bind(): %s\n", strerror (errno)));
+ return -1;
+ }
+
+ printf("I/O on %s local=[", ifname);
+ for (int i = 0; i < 6; i++) {
+ printf("%02x", sock_addr.sll_addr[i]);
+ if (i < 5) printf(":");
+ } printf("]\n");
+
+ eth_type = htons(EthType);
+ memset(TxBuf, 0, sizeof (TxBuf));
+ memcpy(TxBuf, (void *) remote_mac, 6);
+ memcpy(TxBuf + 6, sock_addr.sll_addr, 6);
+ memcpy(TxBuf + 12, (void *) & eth_type, 2);
+
+ return 0;
+}
+
+
+struct in_addr **addr_list;
char url_to_parse[256] = { 0 };
strncpy (url_to_parse, ascii_url, sizeof (url_to_parse) - 1);