14#include <gvm/base/logging.h>
15#include <gvm/base/networking.h>
19#include <netinet/in.h>
35#define G_LOG_DOMAIN "lib misc"
40#define MAX_IFACE_NAME_LEN 64
90 memset (&in6, 0x0,
sizeof (in6));
91 for (i =
prefix, j = 0; i > 0; i -= 8, j++)
95 in6.s6_addr[j] = 0xff;
99 in6.s6_addr[j] = (
unsigned long) (0xffU << (8 - i));
103 memcpy (mask, &in6,
sizeof (*mask));
110 int i, j, ifaces, numroutes = 0;
113 struct in6_addr network, mask;
114 bpf_u_int32 v4mappednet, v4mappedmask;
119 if (IN6_IS_ADDR_V4MAPPED (addr))
121 for (i = 0; i < ifaces; i++)
123 char errbuf[PCAP_ERRBUF_SIZE];
124 pcap_lookupnet (ifs[i].
name, &v4mappednet, &v4mappedmask, errbuf);
125 if ((v4mappednet & v4mappedmask)
126 == (addr->s6_addr32[3] & v4mappedmask))
132 if (IN6_IS_ADDR_LINKLOCAL (addr))
134 if (IN6_IS_ADDR_LOOPBACK (addr))
138 for (i = 0; i < numroutes; i++)
140 char addr1[INET6_ADDRSTRLEN];
141 char addr2[INET6_ADDRSTRLEN];
145 for (j = 0; j < (int)
sizeof (
struct in6_addr); j++)
146 network.s6_addr[j] = addr->s6_addr[j] & mask.s6_addr[j];
148 g_debug (
"comparing addresses %s and %s",
149 inet_ntop (AF_INET6, &network, addr1,
sizeof (addr1)),
150 inet_ntop (AF_INET6, &myroutes[i].dest6, addr2,
152 if (IN6_ARE_ADDR_EQUAL (&network, &myroutes[i].dest6))
176 for (i = 0; i < numdevs; i++)
178 char addr1[INET6_ADDRSTRLEN];
179 char addr2[INET6_ADDRSTRLEN];
180 g_debug (
"comparing addresses %s and %s",
181 inet_ntop (AF_INET6,
addr, addr1,
sizeof (addr1)),
182 inet_ntop (AF_INET6, &mydevs[i].
addr6, addr2,
sizeof (addr2)));
183 if (IN6_ARE_ADDR_EQUAL (
addr, &mydevs[i].
addr6))
186 strncpy (dev, mydevs[i].
name, sz);
207 for (i = 0; i < numdevs; i++)
209 if (
addr->s_addr == mydevs[i].
addr.s_addr)
212 strncpy (dev, mydevs[i].
name, sz);
231 if (IN6_IS_ADDR_V4MAPPED (
addr))
235 if ((
addr->s6_addr32[3] & htonl (0xFF000000)) == htonl (0x7F000000))
238 if (!
addr->s6_addr32[3])
242 if (IN6_IS_ADDR_LOOPBACK (
addr))
270 if ((
addr->s_addr & htonl (0xFF000000)) == htonl (0x7F000000))
303#if (FREEBSD || OPENBSD || NETBSD || BSDI || DARWIN)
310#if (FREEBSD || OPENBSD || NETBSD || BSDI || DARWIN)
330 struct sockaddr_in *
saddr;
331 struct sockaddr_in6 *
s6addr;
333 int numinterfaces = 0;
334 struct ifaddrs *ifaddr, *ifa;
337 if (getifaddrs (&ifaddr) == -1)
339 perror (
"getifaddrs");
343 for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next)
345 if (ifa->ifa_addr == NULL)
348 family = ifa->ifa_addr->sa_family;
349 if (family == AF_INET)
351 strncpy (mydevs[numinterfaces].
name, ifa->ifa_name,
352 sizeof (mydevs[numinterfaces].
name) - 1);
353 saddr = (
struct sockaddr_in *) ifa->ifa_addr;
354 mydevs[numinterfaces].
addr6.s6_addr32[0] = 0;
355 mydevs[numinterfaces].
addr6.s6_addr32[1] = 0;
356 mydevs[numinterfaces].
addr6.s6_addr32[2] = htonl (0xffff);
357 mydevs[numinterfaces].
addr6.s6_addr32[3] =
saddr->sin_addr.s_addr;
358 saddr = (
struct sockaddr_in *) ifa->ifa_netmask;
359 mydevs[numinterfaces].
mask.s6_addr32[0] = 0;
360 mydevs[numinterfaces].
mask.s6_addr32[1] = 0;
361 mydevs[numinterfaces].
mask.s6_addr32[2] = htonl (0xffff);
362 mydevs[numinterfaces].
mask.s6_addr32[3] =
saddr->sin_addr.s_addr;
363 g_debug (
"interface name is %s", ifa->ifa_name);
364 g_debug (
"\tAF_INET family");
365 g_debug (
"\taddress is %s", inet_ntoa (
saddr->sin_addr));
366 g_debug (
"\tnetmask is %s", inet_ntoa (
saddr->sin_addr));
369 else if (family == AF_INET6)
371 char ipaddr[INET6_ADDRSTRLEN];
373 strncpy (mydevs[numinterfaces].
name, ifa->ifa_name,
374 sizeof (mydevs[numinterfaces].
name) - 1);
375 s6addr = (
struct sockaddr_in6 *) ifa->ifa_addr;
376 memcpy (&(mydevs[numinterfaces].addr6),
377 (
char *) &(
s6addr->sin6_addr),
sizeof (
struct in6_addr));
378 s6addr = (
struct sockaddr_in6 *) ifa->ifa_netmask;
379 memcpy (&(mydevs[numinterfaces].mask),
380 (
char *) &(
s6addr->sin6_addr),
sizeof (
struct in6_addr));
382 g_debug (
"\tAF_INET6 family");
383 g_debug (
"interface name is %s", ifa->ifa_name);
384 g_debug (
"\taddress is %s",
385 inet_ntop (AF_INET6, &
s6addr->sin6_addr, ipaddr,
389 g_debug (
"\tfamily is %d", ifa->ifa_addr->sa_family);
391 *howmany = numinterfaces;
393 freeifaddrs (ifaddr);
406 int numinterfaces = 0;
413 struct sockaddr_in *sin;
417 sd = socket (AF_INET, SOCK_DGRAM, 0);
418 bzero (buf,
sizeof (buf));
421 g_message (
"socket in getinterfaces");
425 ifc.ifc_len =
sizeof (buf);
427 if (ioctl (sd, SIOCGIFCONF, &ifc) < 0)
428 g_message (
"Failed to determine your configured interfaces!");
431 if (ifc.ifc_len == 0)
433 "getinterfaces: SIOCGIFCONF claims you have no network interfaces!");
436 len =
sizeof (
struct ifmap);
438 len =
sizeof (
struct sockaddr);
441 for (bufp = buf; bufp && *bufp && (bufp < (buf + ifc.ifc_len));
442 bufp +=
sizeof (ifr->ifr_name) +
len)
444 ifr = (
struct ifreq *) bufp;
445 sin = (
struct sockaddr_in *) &ifr->ifr_addr;
446 memcpy (&(mydevs[numinterfaces].addr), (
char *) &(sin->sin_addr),
447 sizeof (
struct in_addr));
449 if ((p = strchr (ifr->ifr_name,
':')))
454 memcpy (mydevs[numinterfaces].
name, ifr->ifr_name,
455 strlen (ifr->ifr_name));
457 memcpy (mydevs[numinterfaces].
name, ifr->ifr_name,
460 if (numinterfaces == 1023)
462 g_message (
"You seem to have more than 1023 network interfaces."
463 " Things may not work right.");
466 mydevs[numinterfaces].
name[0] =
'\0';
471 *howmany = numinterfaces;
480 struct sockaddr_in sock;
481 unsigned int socklen;
484 p1 = (
unsigned short) rand ();
488 if (IN6_IS_ADDR_V4MAPPED (dst))
490 char name[INET6_ADDRSTRLEN];
492 if ((sd = socket (AF_INET, SOCK_DGRAM, 0)) == -1)
494 perror (
"Socket troubles");
497 bzero (&sock,
sizeof (
struct sockaddr_in));
498 sock.sin_family = AF_INET;
499 sock.sin_addr.s_addr = dst->s6_addr32[3];
500 sock.sin_port = htons (p1);
501 if (connect (sd, (
struct sockaddr *) &sock,
sizeof (
struct sockaddr_in))
507 bzero (&sock,
sizeof (
struct sockaddr_in));
508 socklen =
sizeof (
struct sockaddr_in);
509 if (getsockname (sd, (
struct sockaddr *) &sock, &socklen) == -1)
511 perror (
"getsockname");
516 src->s6_addr32[0] = 0;
517 src->s6_addr32[1] = 0;
518 src->s6_addr32[2] = htonl (0xffff);
519 src->s6_addr32[3] = sock.sin_addr.s_addr;
520 g_debug (
"source address is %s",
521 inet_ntop (AF_INET6, src,
name,
sizeof (
name)));
526 struct sockaddr_in6 sock6;
527 char name[INET6_ADDRSTRLEN];
529 if ((sd = socket (AF_INET6, SOCK_DGRAM, 0)) == -1)
531 perror (
"Socket troubles");
534 bzero (&sock6,
sizeof (sock6));
535 sock6.sin6_family = AF_INET6;
536 sock6.sin6_addr.s6_addr32[0] = dst->s6_addr32[0];
537 sock6.sin6_addr.s6_addr32[1] = dst->s6_addr32[1];
538 sock6.sin6_addr.s6_addr32[2] = dst->s6_addr32[2];
539 sock6.sin6_addr.s6_addr32[3] = dst->s6_addr32[3];
540 sock6.sin6_port = htons (p1);
541 if (connect (sd, (
struct sockaddr *) &sock6,
sizeof (
struct sockaddr_in6))
547 bzero (&sock6,
sizeof (
struct sockaddr_in6));
548 socklen =
sizeof (
struct sockaddr_in6);
549 if (getsockname (sd, (
struct sockaddr *) &sock6, &socklen) == -1)
551 perror (
"getsockname");
556 src->s6_addr32[0] = sock6.sin6_addr.s6_addr32[0];
557 src->s6_addr32[1] = sock6.sin6_addr.s6_addr32[1];
558 src->s6_addr32[2] = sock6.sin6_addr.s6_addr32[2];
559 src->s6_addr32[3] = sock6.sin6_addr.s6_addr32[3];
560 memcpy (src, &sock6.sin6_addr, sizeof (
struct in6_addr));
561 g_debug (
"source addrss is %s",
562 inet_ntop (AF_INET6, src,
name,
sizeof (
name)));
591 struct in_addr inaddr;
599 routez = fopen (
"/proc/net/route",
"r");
605 if (fgets (buf,
sizeof (buf), routez) == NULL)
608 g_message (
"Could not read from /proc/net/route");
612 while (fgets (buf,
sizeof (buf), routez))
614 p = strtok (buf,
" \t\n");
617 g_message (
"Could not find interface in"
618 " /proc/net/route line");
621 strncpy (iface, p,
sizeof (iface));
623 if ((p = strchr (iface,
':')))
627 p = strtok (NULL,
" \t\n");
629 dest = strtoul (p, &endptr, 16);
630 g_debug (
"ipv4 dest is %s", p);
631 if (!endptr || *endptr)
633 g_message (
"Failed to determine Destination from"
637 inaddr.s_addr = dest;
638 myroutes[*numroutes].
dest6.s6_addr32[0] = 0;
639 myroutes[*numroutes].
dest6.s6_addr32[1] = 0;
640 myroutes[*numroutes].
dest6.s6_addr32[2] = htonl (0xffff);
641 myroutes[*numroutes].
dest6.s6_addr32[3] = inaddr.s_addr;
642 for (i = 0; i < 5; i++)
644 p = strtok (NULL,
" \t\n");
650 g_message (
"Failed to find field %d in"
657 myroutes[*numroutes].
metric = strtol (p, &endptr, 10);
658 if (!endptr || *endptr)
660 g_message (
"%s: Failed to determine metric from /proc/net/route",
664 p = strtok (NULL,
" \t\n");
666 mask = strtoul (p, &endptr, 16);
669 while (mask & (1 << i++) && i < 32)
671 myroutes[*numroutes].
mask = ones + 96;
672 g_debug (
"mask is %lu", myroutes[*numroutes].mask);
673 if (!endptr || *endptr)
675 g_message (
"Failed to determine mask from"
680 g_debug (
"#%d: for dev %s, The dest is %lX and the mask is %lX",
681 *numroutes, iface, myroutes[*numroutes].dest,
682 myroutes[*numroutes].mask);
683 for (i = 0; i < numinterfaces; i++)
684 if (!strcmp (iface, mydevs[i].
name))
686 myroutes[*numroutes].
dev = &mydevs[i];
689 if (i == numinterfaces)
691 "Failed to find interface %s mentioned in /proc/net/route",
696 g_message (
"You seem to have WAY to many routes!");
724 struct in6_addr in6addr;
730 char v6addr[INET6_ADDRSTRLEN];
736 routez = fopen (
"/proc/net/ipv6_route",
"r");
740 while (fgets (buf,
sizeof (buf), routez) != NULL)
744 token = strtok (buf,
" \t\n");
747 g_debug (
"first token is %s", token);
748 strncpy (destaddr, token,
sizeof (destaddr) - 1);
749 len = strlen (destaddr);
750 for (i = 0, j = 0; j <
len; j++)
752 v6addr[i++] = destaddr[j];
757 g_debug (
"ipv6 dest is %s", v6addr);
758 if (inet_pton (AF_INET6, v6addr, &in6addr) <= 0)
760 g_message (
"invalid ipv6 addressd");
763 memcpy (&myroutes[*numroutes].dest6, &in6addr,
764 sizeof (
struct in6_addr));
766 token = strtok (NULL,
" \t\n");
770 myroutes[*numroutes].
mask = strtoul (token, &endptr, 16);
777 token = strtok (NULL,
" \t\n");
779 g_message (
"getipv6routes error");
782 myroutes[*numroutes].
metric = strtoul (token, &endptr, 16);
783 if (!endptr || *endptr)
786 "%s: Failed to determine metric from /proc/net/ipv6_route",
795 token = strtok (NULL,
" \t\n");
797 g_message (
"getipv6routes error");
799 bzero (iface,
sizeof (iface));
800 token = strtok (NULL,
" \t\n");
802 strncpy (iface, token,
sizeof (iface) - 1);
803 for (i = 0; i < numinterfaces; i++)
804 if (!strcmp (iface, mydevs[i].
name)
805 && !IN6_IS_ADDR_V4MAPPED (&mydevs[i].addr6))
807 myroutes[*numroutes].
dev = &mydevs[i];
810 if (i == numinterfaces)
812 "Failed to find interface %s mentioned in /proc/net/ipv6_route",
817 g_message (
"You seem to have WAY to many routes!");
826 g_message (
"Didn't find IPv6 routes");
843 static int initialized = 0;
845 struct in6_addr addy;
848 connectsockettechnique,
850 } technique = procroutetechnique;
853 int numinterfaces = 0;
854 static int numroutes = 0;
855 struct in6_addr mask;
856 struct in6_addr network = {0};
858 long best_match = -1;
862 g_message (
"ipaddr2devname passed a NULL dest address");
866 if (IN6_IS_ADDR_V4MAPPED (dest))
867 gvm_source_addr_as_addr6 (&src);
869 gvm_source_addr6 (&src);
876 if (IN6_IS_ADDR_V4MAPPED (dest))
879 technique = connectsockettechnique;
884 technique = connectsockettechnique;
897 if (IN6_IS_ADDR_V4MAPPED (source))
899 source->s6_addr32[0] = 0;
900 source->s6_addr32[1] = 0;
901 source->s6_addr32[2] = htonl (0xffff);
902 source->s6_addr32[3] = htonl (0x7F000001);
906 source->s6_addr32[0] = 0;
907 source->s6_addr32[1] = 0;
908 source->s6_addr32[2] = 0;
909 source->s6_addr32[3] = htonl (1);
914 for (i = 0; i < numinterfaces; i++)
916 if (IN6_IS_ADDR_V4MAPPED (&mydevs[i].addr6))
918 if (mydevs[i].addr6.s6_addr32[3] == htonl (0x7F000001))
919 return mydevs[i].
name;
923 if (IN6_ARE_ADDR_EQUAL (&in6addr_any, &mydevs[i].addr6))
924 return mydevs[i].
name;
930 if (technique == procroutetechnique)
932 char addr1[INET6_ADDRSTRLEN];
933 char addr2[INET6_ADDRSTRLEN];
934 for (i = 0; i < numroutes; i++)
938 g_warning (
"error creating IPv6 mask from prefix: %ld",
942 for (
int j = 0; j < (int)
sizeof (
struct in6_addr); j++)
943 network.s6_addr[j] = dest->s6_addr[j] & mask.s6_addr[j];
946 "comparing addresses %s and %s",
947 inet_ntop (AF_INET6, &network, addr1,
sizeof (addr1)),
948 inet_ntop (AF_INET6, &myroutes[i].dest6, addr2,
sizeof (addr2)));
950 if (IN6_ARE_ADDR_EQUAL (&network, &myroutes[i].dest6))
953 if (-1 == best_match)
960 if (myroutes[i].mask > myroutes[best_match].mask)
965 else if ((myroutes[i].mask == myroutes[best_match].mask)
967 < myroutes[best_match].
metric))
976 if (!IN6_ARE_ADDR_EQUAL (&src, &in6addr_any))
977 memcpy (source, &src,
sizeof (
struct in6_addr));
980 if (myroutes[best_match].dev != NULL)
982 memcpy (source, &myroutes[best_match].dev->addr6,
983 sizeof (
struct in6_addr));
988 "%s: Best matching route with dst '%s' metric '%ld' and interface '%s'",
990 inet_ntop (AF_INET6, &myroutes[best_match].dest6, addr1,
992 myroutes[best_match].mask, myroutes[best_match].dev->name);
993 if (best_match != -1)
994 return myroutes[best_match].
dev->
name;
996 technique = connectsockettechnique;
998 if (technique == connectsockettechnique)
1002 if (IN6_ARE_ADDR_EQUAL (&addy, &network))
1004 struct hostent *myhostent = NULL;
1005 char myname[MAXHOSTNAMELEN + 1];
1007 myhostent = gethostbyname (myname);
1008 if (gethostname (myname, MAXHOSTNAMELEN) || !myhostent)
1009 g_message (
"Cannot get hostname!");
1010 else if (myhostent->h_addrtype == AF_INET)
1012 addy.s6_addr32[0] = 0;
1013 addy.s6_addr32[1] = 0;
1014 addy.s6_addr32[2] = htonl (0xffff);
1015 memcpy (&addy.s6_addr32[0], myhostent->h_addr_list[0],
1016 sizeof (
struct in6_addr));
1019 memcpy (&addy, myhostent->h_addr_list[0], sizeof (
struct in6_addr));
1023 for (i = 0; i < numinterfaces; i++)
1025 char addr1[INET6_ADDRSTRLEN];
1026 char addr2[INET6_ADDRSTRLEN];
1029 "comparing addresses %s and %s",
1030 inet_ntop (AF_INET6, &mydevs[i].addr6, addr1,
sizeof (addr1)),
1031 inet_ntop (AF_INET6, &addy, addr2,
sizeof (addr2)));
1032 if (IN6_ARE_ADDR_EQUAL (&mydevs[i].addr6, &addy))
1036 memcpy (source, &addy,
sizeof (
struct in6_addr));
1038 return mydevs[i].
name;
1044 g_message (
"%s: Provided technique is neither proc route nor"
1062 static int initialized = 0;
1073 int numinterfaces = 0;
1076 static int numroutes = 0;
1078 long best_match = -1;
1082 gvm_source_addr (&src);
1085 g_message (
"ipaddr2devname passed a NULL dest address");
1097 routez = fopen (
"/proc/net/route",
"r");
1102 if (fgets (buf,
sizeof (buf), routez)
1104 g_message (
"Could not read from /proc/net/route");
1105 while (fgets (buf,
sizeof (buf), routez))
1107 p = strtok (buf,
" \t\n");
1110 g_message (
"Could not find interface in"
1111 " /proc/net/route line");
1114 strncpy (iface, p,
sizeof (iface));
1116 if ((p = strchr (iface,
':')))
1120 p = strtok (NULL,
" \t\n");
1122 myroutes[numroutes].dest = strtoul (p, &endptr, 16);
1123 if (!endptr || *endptr)
1126 "Failed to determine Destination from /proc/net/route");
1129 for (i = 0; i < 5; i++)
1131 p = strtok (NULL,
" \t\n");
1137 g_message (
"Failed to find field %d in"
1143 myroutes[numroutes].metric = strtol (p, &endptr, 10);
1144 if (!endptr || *endptr)
1146 g_message (
"Failed to determine metric from /proc/net/route");
1149 p = strtok (NULL,
" \t\n");
1151 myroutes[numroutes].mask = strtoul (p, &endptr, 16);
1152 if (!endptr || *endptr)
1154 g_message (
"Failed to determine mask"
1155 " from /proc/net/route");
1159 g_debug (
"#%d: for dev %s, The dest is %lX and the mask is %lX",
1160 numroutes, iface, myroutes[numroutes].dest,
1161 myroutes[numroutes].mask);
1162 for (i = 0; i < numinterfaces; i++)
1163 if (!strcmp (iface, mydevs[i].
name))
1165 myroutes[numroutes].dev = &mydevs[i];
1168 if (i == numinterfaces)
1170 "Failed to find interface %s mentioned in /proc/net/route",
1175 g_message (
"You seem to have WAY to many routes!");
1183 g_message (
"Could not read from /proc/net/route");
1194 source->s_addr = htonl (0x7F000001);
1197 for (i = 0; i < numinterfaces; i++)
1199 if (mydevs[i].addr.s_addr == htonl (0x7F000001))
1201 return mydevs[i].
name;
1207 for (i = 0; i < numroutes; i++)
1210 if ((dest->s_addr & myroutes[i].mask) == myroutes[i].dest)
1213 if (-1 == best_match)
1220 if (myroutes[i].mask > myroutes[best_match].mask)
1225 else if ((myroutes[i].mask == myroutes[best_match].mask)
1226 && (myroutes[i].metric < myroutes[best_match].metric))
1238 if (src.s_addr != INADDR_ANY)
1239 source->s_addr = src.s_addr;
1241 else if (best_match != -1)
1242 source->s_addr = myroutes[best_match].dev->addr.s_addr;
1247 if (myroutes[0].dev)
1249 source->s_addr = myroutes[0].dev->addr.s_addr;
1254 source->s_addr = INADDR_ANY;
1258 if (best_match != -1)
1259 return myroutes[best_match].dev->name;
1272 char errbuf[PCAP_ERRBUF_SIZE];
1273 pcap_if_t *alldevsp1 = NULL, *devs_aux = NULL;
1274 char *if_name = NULL;
1276 if (pcap_findalldevs (&alldevsp1, errbuf) == -1)
1277 g_debug (
"Error for pcap_findalldevs(): %s", errbuf);
1279 devs_aux = alldevsp1;
1282 pcap_addr_t *addr_aux = NULL;
1284 addr_aux = devs_aux->addresses;
1287 char buffer[INET6_ADDRSTRLEN];
1289 if (((
struct sockaddr *) addr_aux->addr)->sa_family == AF_INET)
1291 &(((
struct sockaddr_in *) addr_aux->addr)->sin_addr),
1292 buffer, INET_ADDRSTRLEN);
1293 else if (((
struct sockaddr *) addr_aux->addr)->sa_family == AF_INET6)
1294 inet_ntop (AF_INET6,
1295 &(((
struct sockaddr_in6 *) addr_aux->addr)->sin6_addr),
1296 buffer, INET6_ADDRSTRLEN);
1298 if (!g_strcmp0 (buffer, local_ip))
1300 if_name = g_strdup (devs_aux->name);
1303 addr_aux = addr_aux->next;
1308 devs_aux = devs_aux->next;
1310 pcap_freealldevs (alldevsp1);
1311 g_debug (
"returning %s as device", if_name);
1326 struct in6_addr src_addr;
1327 char *if_name, *ip_address;
1330 memset (&src_addr,
'\0',
sizeof (
struct in6_addr));
1332 ip_address = addr6_as_str (&src_addr);
1336 g_free (ip_address);
1339 g_debug (
"%s: Missing interface name", __func__);
1343 *ifindex = if_nametoindex (if_name);
Header file for module bpf_share.
static void prefix(int n, int i)
Header file for module network.
struct interface_info * v6_getinterfaces(int *howmany)
int islocalhost(struct in_addr *addr)
Tests whether a packet sent to IP is LIKELY to route through the kernel localhost interface.
int v6_is_local_ip(struct in6_addr *addr)
static int getipv4routes(struct myroute *myroutes, int *numroutes)
Get the ipv4 routes and number of routes.
char * routethrough(struct in_addr *dest, struct in_addr *source)
An awesome function to determine what interface a packet to a given destination should be routed thro...
int v6_islocalhost(struct in6_addr *addr)
Tests whether a packet sent to IP is LIKELY to route through the kernel localhost interface.
int v6_getsourceip(struct in6_addr *src, struct in6_addr *dst)
static int v6_ipaddr2devname(char *dev, int sz, struct in6_addr *addr)
char * v6_routethrough(struct in6_addr *dest, struct in6_addr *source)
An awesome function to determine what interface a packet to a given destination should be routed thro...
int get_iface_index(struct in6_addr *ipaddr, int *ifindex)
Get the interface index depending on the target's IP.
int getipv6routes(struct myroute *myroutes, int *numroutes)
Get the IPv6 routes and number of routes.
static int ipv6_prefix_to_mask(unsigned prefix, struct in6_addr *mask)
Generate an ipv6 mask from the given ipv6 prefix.
struct interface_info * getinterfaces(int *howmany)
#define MAX_IFACE_NAME_LEN
Maximum length of an interface's name.
static int ipaddr2devname(char *dev, int sz, struct in_addr *addr)
int get_datalink_size(int datalink)
char * get_iface_from_ip(const char *local_ip)
Given an IP address, determines which interface belongs to.
Header file for module pcap.
char name[MAX_IFACE_NAME_LEN]
struct interface_info * dev
Support macros for special platforms.