19 #include <netinet/in.h> 23 #include <arpa/inet.h> 24 #include <sys/ioctl.h> 29 #include <sys/types.h> 39 #define MAXROUTES 1024 63 ipv6addrmask (
struct in6_addr *in6addr,
int mask)
72 ptr = (uint32_t *) in6addr;
76 ptr[1] = ptr[2] = ptr[3] = 0;
78 addr = ntohl (
addr) >> (32 - wordmask);
79 addr = htonl (
addr << (32 - wordmask));
85 addr = ntohl (
addr) >> (32 - wordmask);
86 addr = htonl (
addr << (32 - wordmask));
92 addr = ntohl (
addr) >> (32 - wordmask);
93 addr = htonl (
addr << (32 - wordmask));
98 addr = ntohl (
addr) >> (32 - wordmask);
99 addr = htonl (
addr << (32 - wordmask));
113 struct in6_addr in6addr;
115 char addr1[INET6_ADDRSTRLEN];
116 char addr2[INET6_ADDRSTRLEN];
122 if (IN6_IS_ADDR_V4MAPPED (addr))
124 for (i = 0; i < ifaces; i++)
126 bpf_u_int32 net, mask;
127 char errbuf[PCAP_ERRBUF_SIZE];
128 pcap_lookupnet (ifs[i].
name, &net, &mask, errbuf);
129 if ((net & mask) == (addr->s6_addr32[3] & mask))
135 if (IN6_IS_ADDR_LINKLOCAL (addr))
137 if (IN6_IS_ADDR_LOOPBACK (addr))
141 for (i = 0; i < numroutes; i++)
143 memcpy (&in6addr, addr,
sizeof (
struct in6_addr));
144 ipv6addrmask (&in6addr, myroutes[i].mask);
146 printf (
"comparing addresses %s and %s\n",
147 inet_ntop (AF_INET6, &in6addr, addr1,
sizeof (addr1)),
148 inet_ntop (AF_INET6, &myroutes[i].dest6, addr2,
151 if (IN6_ARE_ADDR_EQUAL (&in6addr, &myroutes[i].dest6))
174 struct sockaddr_in soca;
175 struct sockaddr_in6 soca6;
178 struct in_addr inaddr;
181 char *src_host, *dst_host;
182 unsigned char *packet;
184 char hostname[INET6_ADDRSTRLEN];
186 if (IN6_IS_ADDR_V4MAPPED (addr))
188 soc = socket (AF_INET, SOCK_DGRAM, 0);
193 inaddr.s_addr = me.s6_addr32[3];
194 src_host = g_strdup (inet_ntoa (inaddr));
195 inaddr.s_addr = addr->s6_addr32[3];
196 dst_host = g_strdup (inet_ntoa (inaddr));
197 snprintf (filter,
sizeof (filter)-1,
"ip and (src host %s and dst host %s)",
220 soca.sin_addr.s_addr = addr->s6_addr32[3];
221 soca.sin_port = htons (9);
222 soca.sin_family = AF_INET;
223 if (sendto (soc, NULL, 0, 0, (
struct sockaddr *) &soca,
sizeof (soca)) !=
233 soc = socket (AF_INET6, SOCK_DGRAM, 0);
238 g_strdup (inet_ntop (AF_INET6, &me, hostname,
sizeof (hostname)));
240 g_strdup (inet_ntop (AF_INET6, addr, hostname,
sizeof (hostname)));
241 snprintf (filter,
sizeof (filter)-1,
242 "ip6 and (src host %s and dst host %s)", src_host, dst_host);
263 memcpy (&soca6.sin6_addr, addr, sizeof (
struct in6_addr));
264 soca6.sin6_port = htons (9);
265 soca6.sin6_family = AF_INET6;
266 if (sendto (soc, NULL, 0, 0, (
struct sockaddr *) &soca6,
sizeof (soca6))
275 packet = (
unsigned char *)
bpf_next (bpf, &len);
281 for (i = 0; i < 6; i++)
282 if (packet[i] != 0xFF)
292 *mac = g_malloc0 (23);
293 snprintf (*mac, 22,
"%.2x.%.2x.%.2x.%.2x.%.2x.%.2x",
294 (
unsigned char) packet[0], (
unsigned char) packet[1],
295 (
unsigned char) packet[2], (
unsigned char) packet[3],
296 (
unsigned char) packet[4], (
unsigned char) packet[5]);
323 char addr1[INET6_ADDRSTRLEN];
324 char addr2[INET6_ADDRSTRLEN];
330 for (i = 0; i < numdevs; i++)
333 printf (
"comparing addresses %s and %s\n",
334 inet_ntop (AF_INET6,
addr, addr1,
sizeof (addr1)),
335 inet_ntop (AF_INET6, &mydevs[i].
addr6, addr2,
sizeof (addr2)));
337 if (IN6_ARE_ADDR_EQUAL (
addr, &mydevs[i].
addr6))
340 strncpy (dev, mydevs[i].
name, sz);
361 for (i = 0; i < numdevs; i++)
363 if (
addr->s_addr == mydevs[i].
addr.s_addr)
366 strncpy (dev, mydevs[i].
name, sz);
385 if (IN6_IS_ADDR_V4MAPPED (
addr))
389 if ((
addr->s6_addr32[3] & htonl (0xFF000000)) == htonl (0x7F000000))
392 if (!
addr->s6_addr32[3])
396 if (IN6_IS_ADDR_LOOPBACK (
addr))
424 if ((
addr->s_addr & htonl (0xFF000000)) == htonl (0x7F000000))
457 #if (FREEBSD || OPENBSD || NETBSD || BSDI || DARWIN) 464 #if (FREEBSD || OPENBSD || NETBSD || BSDI || DARWIN) 484 static char bytebuf[2048];
485 static char badrandomwarning = 0;
486 static int bytesleft = 0;
493 if (numbytes < 0 || numbytes > 0xFFFF)
498 fp = fopen (
"/dev/urandom",
"r");
500 fp = fopen (
"/dev/random",
"r");
503 res = fread (bytebuf, 1,
sizeof (bytebuf), fp);
504 if (res !=
sizeof (bytebuf))
509 bytesleft =
sizeof (bytebuf);
515 if (badrandomwarning == 0)
520 gettimeofday (&tv, NULL);
521 srand ((tv.tv_sec ^ tv.tv_usec) ^ getpid ());
523 for (i = 0; i <
sizeof (bytebuf) /
sizeof (
short); i++)
525 iptr = (
short *) ((
char *) bytebuf + i *
sizeof (short));
528 bytesleft = (
sizeof (bytebuf) /
sizeof (
short)) *
sizeof (
short);
534 if (numbytes <= bytesleft)
536 memcpy (buf, bytebuf + (
sizeof (bytebuf) - bytesleft), numbytes);
537 bytesleft -= numbytes;
542 memcpy (buf, bytebuf + (
sizeof (bytebuf) - bytesleft), bytesleft);
551 struct sockaddr_in *saddr;
552 struct sockaddr_in6 *s6addr;
554 int numinterfaces = 0;
555 struct ifaddrs *ifaddr, *ifa;
558 if (getifaddrs (&ifaddr) == -1)
560 perror (
"getifaddrs");
564 for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next)
566 if (ifa->ifa_addr == NULL)
569 family = ifa->ifa_addr->sa_family;
570 if (family == AF_INET)
572 memcpy (mydevs[numinterfaces].
name, ifa->ifa_name,
573 strlen (ifa->ifa_name));
574 saddr = (
struct sockaddr_in *) ifa->ifa_addr;
575 mydevs[numinterfaces].
addr6.s6_addr32[0] = 0;
576 mydevs[numinterfaces].
addr6.s6_addr32[1] = 0;
577 mydevs[numinterfaces].
addr6.s6_addr32[2] = htonl (0xffff);
578 mydevs[numinterfaces].
addr6.s6_addr32[3] = saddr->sin_addr.s_addr;
579 saddr = (
struct sockaddr_in *) ifa->ifa_netmask;
580 mydevs[numinterfaces].
mask.s6_addr32[0] = 0;
581 mydevs[numinterfaces].
mask.s6_addr32[1] = 0;
582 mydevs[numinterfaces].
mask.s6_addr32[2] = htonl (0xffff);
583 mydevs[numinterfaces].
mask.s6_addr32[3] = saddr->sin_addr.s_addr;
584 #ifdef TCPIP_DEBUGGING 585 printf (
"interface name is %s\n", ifa->ifa_name);
586 printf (
"\tAF_INET family\n");
587 printf (
"\taddress is %s\n", inet_ntoa (saddr->sin_addr));
588 printf (
"\tnetmask is %s\n", inet_ntoa (saddr->sin_addr));
592 else if (family == AF_INET6)
594 memcpy (mydevs[numinterfaces].
name, ifa->ifa_name,
595 strlen (ifa->ifa_name));
596 s6addr = (
struct sockaddr_in6 *) ifa->ifa_addr;
597 memcpy (&(mydevs[numinterfaces].addr6),
598 (
char *) &(s6addr->sin6_addr),
sizeof (
struct in6_addr));
599 s6addr = (
struct sockaddr_in6 *) ifa->ifa_netmask;
600 memcpy (&(mydevs[numinterfaces].mask),
601 (
char *) &(s6addr->sin6_addr),
sizeof (
struct in6_addr));
603 #ifdef TCPIP_DEBUGGING 604 printf (
"\tAF_INET6 family\n");
605 printf (
"interface name is %s\n", ifa->ifa_name);
606 printf (
"\taddress is %s\n",
607 inet_ntop (AF_INET6, &s6addr->sin6_addr, ipaddr,
613 #ifdef TCPIP_DEBUGGING 614 printf (
"\tfamily is %d\n", ifa->ifa_addr->sa_family);
618 *howmany = numinterfaces;
620 freeifaddrs (ifaddr);
633 int numinterfaces = 0;
640 struct sockaddr_in *sin;
644 sd = socket (AF_INET, SOCK_DGRAM, 0);
645 bzero (buf,
sizeof (buf));
649 ifc.ifc_len =
sizeof (buf);
651 if (ioctl (sd, SIOCGIFCONF, &ifc) < 0)
655 if (ifc.ifc_len == 0)
657 (
"getinterfaces: SIOCGIFCONF claims you have no network interfaces!");
659 len =
sizeof (
struct ifmap);
661 for (bufp = buf; bufp && *bufp && (bufp < (buf + ifc.ifc_len));
662 bufp +=
sizeof (ifr->ifr_name) + len)
664 ifr = (
struct ifreq *) bufp;
665 sin = (
struct sockaddr_in *) &ifr->ifr_addr;
666 memcpy (&(mydevs[numinterfaces].addr), (
char *) &(sin->sin_addr),
667 sizeof (
struct in_addr));
669 if ((p = strchr (ifr->ifr_name,
':')))
671 strncpy (mydevs[numinterfaces].
name, ifr->ifr_name, 63);
672 mydevs[numinterfaces].
name[63] =
'\0';
674 if (numinterfaces == 1023)
677 (
"You seem to have more than 1023 network interfaces." 678 " Things may not work right.");
681 mydevs[numinterfaces].
name[0] =
'\0';
686 *howmany = numinterfaces;
695 struct sockaddr_in sock;
696 struct sockaddr_in6 sock6;
697 unsigned int socklen;
700 #ifdef TCPIP_DEBUGGING 701 char name[INET6_ADDRSTRLEN];
708 if (IN6_IS_ADDR_V4MAPPED (dst))
710 if ((sd = socket (AF_INET, SOCK_DGRAM, 0)) == -1)
712 perror (
"Socket troubles");
715 sock.sin_family = AF_INET;
716 sock.sin_addr.s_addr = dst->s6_addr32[3];
717 sock.sin_port = htons (p1);
718 if (connect (sd, (
struct sockaddr *) &sock,
sizeof (
struct sockaddr_in))
724 bzero (&sock,
sizeof (
struct sockaddr_in));
725 socklen =
sizeof (
struct sockaddr_in);
726 if (getsockname (sd, (
struct sockaddr *) &sock, &socklen) == -1)
728 perror (
"getsockname");
734 src->s6_addr32[0] = 0;
735 src->s6_addr32[1] = 0;
736 src->s6_addr32[2] = htonl (0xffff);
737 src->s6_addr32[3] = sock.sin_addr.s_addr;
738 #ifdef TCPIP_DEBUGGING 739 printf (
"source addrss is %s\n",
740 inet_ntop (AF_INET6, src,
name,
sizeof (
name)));
746 if ((sd = socket (AF_INET6, SOCK_DGRAM, 0)) == -1)
748 perror (
"Socket troubles");
751 sock6.sin6_family = AF_INET6;
752 sock6.sin6_addr.s6_addr32[0] = dst->s6_addr32[0];
753 sock6.sin6_addr.s6_addr32[1] = dst->s6_addr32[1];
754 sock6.sin6_addr.s6_addr32[2] = dst->s6_addr32[2];
755 sock6.sin6_addr.s6_addr32[3] = dst->s6_addr32[3];
756 sock6.sin6_port = htons (p1);
757 if (connect (sd, (
struct sockaddr *) &sock6,
sizeof (
struct sockaddr_in6))
763 bzero (&sock6,
sizeof (
struct sockaddr_in6));
764 socklen =
sizeof (
struct sockaddr_in6);
765 if (getsockname (sd, (
struct sockaddr *) &sock6, &socklen) == -1)
767 perror (
"getsockname");
772 src->s6_addr32[0] = sock6.sin6_addr.s6_addr32[0];
773 src->s6_addr32[1] = sock6.sin6_addr.s6_addr32[1];
774 src->s6_addr32[2] = sock6.sin6_addr.s6_addr32[2];
775 src->s6_addr32[3] = sock6.sin6_addr.s6_addr32[3];
776 memcpy (src, &sock6.sin6_addr, sizeof (
struct in6_addr));
777 #ifdef TCPIP_DEBUGGING 778 printf (
"source addrss is %s\n",
779 inet_ntop (AF_INET6, src,
name,
sizeof (
name)));
790 struct sockaddr_in sock;
791 unsigned int socklen =
sizeof (
struct sockaddr_in);
798 if ((sd = socket (AF_INET, SOCK_DGRAM, 0)) == -1)
800 perror (
"Socket troubles");
803 sock.sin_family = AF_INET;
804 sock.sin_addr = *dst;
805 sock.sin_port = htons (p1);
806 if (connect (sd, (
struct sockaddr *) &sock,
sizeof (
struct sockaddr_in)) ==
812 bzero (&sock,
sizeof (
struct sockaddr_in));
813 if (getsockname (sd, (
struct sockaddr *) &sock, &socklen) == -1)
815 perror (
"getsockname");
820 src->s_addr = sock.sin_addr.s_addr;
836 struct in_addr inaddr;
844 routez = fopen (
"/proc/net/route",
"r");
850 if (fgets (buf,
sizeof (buf), routez) == NULL)
857 while (fgets (buf,
sizeof (buf), routez))
859 p = strtok (buf,
" \t\n");
863 " /proc/net/route line");
866 strncpy (iface, p,
sizeof (iface));
867 if ((p = strchr (iface,
':')))
871 p = strtok (NULL,
" \t\n");
873 dest = strtoul (p, &endptr, 16);
874 #ifdef TCPIP_DEBUGGING 875 printf (
"ipv4 dest is %s\n", p);
877 if (!endptr || *endptr)
883 inaddr.s_addr = dest;
884 myroutes[*numroutes].
dest6.s6_addr32[0] = 0;
885 myroutes[*numroutes].
dest6.s6_addr32[1] = 0;
886 myroutes[*numroutes].
dest6.s6_addr32[2] = htonl (0xffff);
887 myroutes[*numroutes].
dest6.s6_addr32[3] = inaddr.s_addr;
888 for (i = 0; i < 6; i++)
890 p = strtok (NULL,
" \t\n");
897 " /proc/net/route", i + 2);
901 mask = strtoul (p, &endptr, 16);
904 while (mask & (1 << i++) && i < 32)
906 myroutes[*numroutes].
mask = ones + 96;
907 #ifdef TCPIP_DEBUGGING 908 printf (
"mask is %lu\n", myroutes[*numroutes].mask);
910 if (!endptr || *endptr)
919 printf (
"#%d: for dev %s, The dest is %lX and the mask is %lX\n",
920 *numroutes, iface, myroutes[*numroutes].dest,
921 myroutes[*numroutes].mask);
923 for (i = 0; i < numinterfaces; i++)
924 if (!strcmp (iface, mydevs[i].
name))
926 myroutes[*numroutes].
dev = &mydevs[i];
929 if (i == numinterfaces)
931 (
"Failed to find interface %s mentioned in /proc/net/route",
953 struct in6_addr in6addr;
960 char v6addr[INET6_ADDRSTRLEN];
966 routez = fopen (
"/proc/net/ipv6_route",
"r");
970 while (fgets (buf,
sizeof (buf), routez) != NULL)
973 printf (
"%s\n", buf);
975 token = strtok (buf,
" \t\n");
979 printf (
"first token is %s\n", token);
981 strcpy (destaddr, token);
982 len = strlen (destaddr);
983 for (i = 0, j = 0; j < len; j++)
985 v6addr[i++] = destaddr[j];
991 printf (
"ipv6 dest is %s\n", v6addr);
993 if (inet_pton (AF_INET6, v6addr, &in6addr) <= 0)
998 memcpy (&myroutes[*numroutes].dest6, &in6addr,
999 sizeof (
struct in6_addr));
1001 token = strtok (NULL,
" \t\n");
1005 myroutes[*numroutes].
mask = strtoul (token, &endptr, 16);
1010 token = strtok (NULL,
" \t\n");
1015 token = strtok (NULL,
" \t\n");
1018 strcpy (iface, token);
1020 printf (
"name token is %s\n", token);
1023 for (i = 0; i < numinterfaces; i++)
1024 if (!strcmp (iface, mydevs[i].
name)
1025 && !IN6_IS_ADDR_V4MAPPED (&mydevs[i].addr6))
1027 myroutes[*numroutes].
dev = &mydevs[i];
1030 if (i == numinterfaces)
1032 (
"Failed to find interface %s mentioned in /proc/net/route\n",
1063 static int initialized = 0;
1065 struct in6_addr addy;
1067 { procroutetechnique, connectsockettechnique, guesstechnique } technique =
1071 int numinterfaces = 0;
1072 static int numroutes = 0;
1073 struct in6_addr in6addr;
1074 #ifdef TCPIP_DEBUGGING 1075 char addr1[INET6_ADDRSTRLEN];
1076 char addr2[INET6_ADDRSTRLEN];
1078 struct in6_addr src;
1083 if (IN6_IS_ADDR_V4MAPPED (dest))
1093 if (IN6_IS_ADDR_V4MAPPED (dest))
1096 technique = connectsockettechnique;
1101 technique = connectsockettechnique;
1114 if (IN6_IS_ADDR_V4MAPPED (source))
1116 source->s6_addr32[0] = 0;
1117 source->s6_addr32[1] = 0;
1118 source->s6_addr32[2] = htonl (0xffff);
1119 source->s6_addr32[3] = htonl (0x7F000001);
1123 source->s6_addr32[0] = 0;
1124 source->s6_addr32[1] = 0;
1125 source->s6_addr32[2] = 0;
1126 source->s6_addr32[3] = htonl (1);
1131 for (i = 0; i < numinterfaces; i++)
1133 if (IN6_IS_ADDR_V4MAPPED (&mydevs[i].addr6))
1135 if (mydevs[i].addr6.s6_addr32[3] == htonl (0x7F000001))
1136 return mydevs[i].
name;
1140 if (IN6_ARE_ADDR_EQUAL (&in6addr_any, &mydevs[i].addr6))
1141 return mydevs[i].
name;
1147 if (technique == procroutetechnique)
1149 for (i = 0; i < numroutes; i++)
1151 memcpy (&in6addr, dest,
sizeof (
struct in6_addr));
1152 ipv6addrmask (&in6addr, myroutes[i].mask);
1154 printf (
"comparing addresses %s and %s\n",
1155 inet_ntop (AF_INET6, &in6addr, addr1,
sizeof (addr1)),
1156 inet_ntop (AF_INET6, &myroutes[i].dest6, addr2,
1159 if (IN6_ARE_ADDR_EQUAL (&in6addr, &myroutes[i].dest6))
1163 if (!IN6_ARE_ADDR_EQUAL (&src, &in6addr_any))
1164 memcpy (source, &src,
sizeof (
struct in6_addr));
1167 if (myroutes[i].dev != NULL)
1170 printf (
"copying address %s\n",
1171 inet_ntop (AF_INET6, &myroutes[i].dev->addr6,
1172 addr1, sizeof (addr1)));
1173 printf (
"dev name is %s\n", myroutes[i].dev->name);
1175 memcpy (source, &myroutes[i].dev->addr6,
1176 sizeof (
struct in6_addr));
1182 technique = connectsockettechnique;
1185 if (technique == connectsockettechnique)
1189 if (IN6_ARE_ADDR_EQUAL (&addy, &in6addr))
1191 struct hostent *myhostent = NULL;
1194 myhostent = gethostbyname (myname);
1197 if (myhostent->h_addrtype == AF_INET)
1199 addy.s6_addr32[0] = 0;
1200 addy.s6_addr32[1] = 0;
1201 addy.s6_addr32[2] = htonl (0xffff);
1202 memcpy (&addy.s6_addr32[0], myhostent->h_addr_list[0],
1203 sizeof (
struct in6_addr));
1206 memcpy (&addy, myhostent->h_addr_list[0], sizeof (
struct in6_addr));
1210 for (i = 0; i < numinterfaces; i++)
1212 #ifdef TCPIP_DEBUGGING 1213 printf (
"comparing addresses %s and %s\n",
1214 inet_ntop (AF_INET6, &mydevs[i].addr6, addr1,
sizeof (addr1)),
1215 inet_ntop (AF_INET6, &addy, addr2,
sizeof (addr2)));
1217 if (IN6_ARE_ADDR_EQUAL (&mydevs[i].addr6, &addy))
1221 memcpy (source, &addy,
sizeof (
struct in6_addr));
1223 return mydevs[i].
name;
1230 " connect socket", __FUNCTION__);
1246 static int initialized = 0;
1248 struct in_addr addy;
1250 { procroutetechnique, connectsockettechnique, guesstechnique } technique =
1260 int numinterfaces = 0;
1263 static int numroutes = 0;
1266 unsigned long bestmatch = 0;
1281 routez = fopen (
"/proc/net/route",
"r");
1287 if (fgets (buf,
sizeof (buf), routez) == NULL)
1289 while (fgets (buf,
sizeof (buf), routez))
1291 p = strtok (buf,
" \t\n");
1295 " /proc/net/route line");
1298 strncpy (iface, p,
sizeof (iface));
1299 if ((p = strchr (iface,
':')))
1303 p = strtok (NULL,
" \t\n");
1305 myroutes[numroutes].dest = strtoul (p, &endptr, 16);
1306 if (!endptr || *endptr)
1309 (
"Failed to determine Destination from /proc/net/route");
1312 for (i = 0; i < 6; i++)
1314 p = strtok (NULL,
" \t\n");
1321 " /proc/net/route", i + 2);
1325 myroutes[numroutes].mask = strtoul (p, &endptr, 16);
1326 if (!endptr || *endptr)
1329 " from /proc/net/route");
1335 printf (
"#%d: for dev %s, The dest is %lX and the mask is %lX\n",
1336 numroutes, iface, myroutes[numroutes].dest,
1337 myroutes[numroutes].mask);
1339 for (i = 0; i < numinterfaces; i++)
1340 if (!strcmp (iface, mydevs[i].
name))
1342 myroutes[numroutes].dev = &mydevs[i];
1345 if (i == numinterfaces)
1347 (
"Failed to find interface %s mentioned in /proc/net/route",
1360 technique = connectsockettechnique;
1372 source->s_addr = htonl (0x7F000001);
1375 for (i = 0; i < numinterfaces; i++)
1377 if (mydevs[i].addr.s_addr == htonl (0x7F000001))
1379 return mydevs[i].
name;
1385 if (technique == procroutetechnique)
1387 for (i = 0; i < numroutes; i++)
1389 if ((dest->s_addr & myroutes[i].mask) == myroutes[i].dest && myroutes[i].mask >= bestmatch)
1393 if (src.s_addr != INADDR_ANY)
1394 source->s_addr = src.s_addr;
1396 source->s_addr = myroutes[i].dev->addr.s_addr;
1399 bestmatch = myroutes[i].mask;
1403 return myroutes[match].dev->name;
1405 else if (technique == connectsockettechnique)
1411 struct hostent *myhostent = NULL;
1413 myhostent = gethostbyname (myname);
1416 memcpy (&(addy.s_addr), myhostent->h_addr_list[0],
1417 sizeof (
struct in_addr));
1421 for (i = 0; i < numinterfaces; i++)
1422 if (mydevs[i].addr.s_addr == addy.s_addr)
1426 source->s_addr = addy.s_addr;
1428 return mydevs[i].
name;
1434 " nor connect socket", __FUNCTION__);
int v6_islocalhost(struct in6_addr *addr)
Tests whether a packet sent to IP is LIKELY to route through the kernel localhost interface.
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...
void openvas_source_addr6(void *addr6)
Gives the source IPv6 address.
void openvas_source_addr(void *addr)
Gives the source IPv4 address.
int v6_getsourceip(struct in6_addr *src, struct in6_addr *dst)
int getipv6routes(struct myroute *myroutes, int *numroutes)
struct interface_info * dev
int islocalhost(struct in_addr *addr)
Tests whether a packet sent to IP is LIKELY to route through the kernel localhost interface.
void log_legacy_write(const char *format,...)
Legacy function to write a log message.
struct interface_info * v6_getinterfaces(int *howmany)
int v6_get_mac_addr(struct in6_addr *addr, char **mac)
We send an empty UDP packet to the remote host, and read back its mac.
int get_datalink_size(int datalink)
int bpf_datalink(int bpf)
struct interface_info * getinterfaces(int *howmany)
int bpf_open_live(char *iface, char *filter)
int get_random_bytes(void *buf, int numbytes)
int v6_is_local_ip(struct in6_addr *addr)
int getsourceip(struct in_addr *src, struct in_addr *dst)
int getipv4routes(struct myroute *myroutes, int *numroutes)
struct timeval timeval(unsigned long val)
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...
u_char * bpf_next(int bpf, int *caplen)
int ipaddr2devname(char *dev, int sz, struct in_addr *addr)
void openvas_source_addr_as_addr6(struct in6_addr *addr6)
Gives the source IPv4 mapped as an IPv6 address. eg. 192.168.20.10 would map to ::ffff:192....
int v6_ipaddr2devname(char *dev, int sz, struct in6_addr *addr)