diff -x config.* -uNr v6test.orig/Makefile.in v6test/Makefile.in --- v6test.orig/configure Wed Oct 6 05:17:20 1999 +++ v6test/configure Sun May 20 11:45:21 2001 @@ -1290,6 +1368,10 @@ else if test -d $dir/include -a -f $dir/include/pcap.h; then pcap_include="$dir/include" + else + if test -d $dir/include/pcap -a -f $dir/include/pcap/pcap.h; then + pcap_include="$dir/include/pcap" + fi fi fi if test "$pcap_lib" != "no" -a "$pcap_include" != "no"; then diff -x config.* -uNr v6test.orig/configure.in v6test/configure.in --- v6test.orig/configure.in Wed Oct 6 05:17:20 1999 +++ v6test/configure.in Sun May 20 11:42:53 2001 @@ -120,6 +120,10 @@ else if test -d $dir/include -a -f $dir/include/pcap.h; then pcap_include="$dir/include" + else + if test -d $dir/include/pcap -a -f $dir/include/pcap/pcap.h; then + pcap_include="$dir/include/pcap" + fi fi fi if test "$pcap_lib" != "no" -a "$pcap_include" != "no"; then --- v6test.orig/Makefile.in Wed Oct 6 05:17:20 1999 +++ v6test/Makefile.in Sat May 19 21:38:02 2001 @@ -28,7 +28,7 @@ CONFDIR = ${prefix}/share/v6test CPPFLAGS=@CPPFLAGS@ -CFLAGS= @CFLAGS@ @DEFS@ @OPTFLAGS@ $(CPPFLAGS) +CFLAGS= @CFLAGS@ @DEFS@ @OPTFLAGS@ -D_BSD_SOURCE $(CPPFLAGS) LDFLAGS=@LDFLAGS@ LIBS=@LIBS@ --- v6test.orig/common.h Wed Oct 6 06:44:19 1999 +++ v6test/common.h Sun May 20 11:52:54 2001 @@ -42,6 +42,7 @@ #include #include #include +#include /* for older glibc's */ #include #include @@ -70,3 +71,9 @@ extern int getconfig __P((char *, u_char *)); /* cksum.c */ extern void cksum6 __P((void)); + +#define NTOHL(x) ((x) = ntohl((u_long)(x))) +#define NTOHS(x) ((x) = ntohs((u_short)(x))) +#define HTONL(x) ((x) = htonl((u_long)(x))) +#define HTONS(x) ((x) = htons((u_short)(x))) +#include --- v6test.orig/v6test.c Tue May 8 07:36:42 2001 +++ v6test/v6test.c Sun May 20 11:58:18 2001 @@ -35,7 +35,8 @@ u_char buf[65536]; char *conffile = NULL; char *iface = NULL; -char *optsrc, *optdst, *srceaddr, *dsteaddr; +char *optsrc, *optdst, srceaddr[6], *dsteaddr; +int intindex; static struct in6_addr ip6src, ip6dst; struct in6_addr *optsrcn, *optdstn; int sflag = 0, dflag = 0, nflag = 0; @@ -66,6 +67,8 @@ int size, ch; int fd = -1; int linkhdr; + struct sockaddr_ll ll_dest_addr; + struct sockaddr_ll ll_source_addr; while ((ch = getopt(argc, argv, "d:f:i:ns:")) != -1) switch(ch) { @@ -110,11 +113,40 @@ errx(1, "unsupported interface %s", iface); /*NOTREACHED*/ } + + /* dest address for sendto */ + memset(&ll_dest_addr, 0, sizeof(ll_dest_addr)); + ll_dest_addr.sll_family = AF_PACKET; + ll_dest_addr.sll_protocol = htons(ETH_P_IPV6); + ll_dest_addr.sll_ifindex = intindex; + ll_dest_addr.sll_halen = ETH_ALEN; + + /* source address for bind */ + memset(&ll_source_addr, 0, sizeof(ll_source_addr)); + ll_source_addr.sll_family = AF_PACKET; + ll_source_addr.sll_protocol = htons(ETH_P_IPV6); + ll_source_addr.sll_ifindex = intindex; + ll_source_addr.sll_halen = ETH_ALEN; + for (; argc > 0; argv++, argc--) { + struct ether_header *ether; size = getconfig(*argv, buf + linkhdr); form(fd, iface); + + ether = (struct ether_header *)buf; + memcpy (ll_dest_addr.sll_addr, ether->ether_dhost, ETH_ALEN); + + if (srceaddr) + memcpy (ll_source_addr.sll_addr, srceaddr, ETH_ALEN); + + if (bind(fd,(struct sockaddr*)&ll_source_addr,sizeof(ll_source_addr)) == -1 ) + perror("bind"); + if (size && nflag == 0) - write(fd, buf, size + linkhdr); + if ((sendto(fd, buf, size + linkhdr,0, + (struct sockaddr*)&ll_dest_addr, + sizeof(ll_dest_addr) )) < 0 ) + perror("sendto"); } exit(0); } @@ -131,6 +163,7 @@ #endif #define NBPFILTER 4 +#if 0 do { sprintf(dev, "/dev/bpf%d", n++); fd = open(dev, O_RDWR); @@ -146,6 +179,11 @@ } bzero(&ifr, sizeof(ifr)); +#else + if ( (fd = socket(PF_PACKET, SOCK_RAW, 0)) < 0) + perror("socket"); + +#endif #ifdef HAVE_LIBPCAP if (iface == NULL && (iface = pcap_lookupdev(pcaperrbuf)) == NULL) { @@ -160,10 +198,24 @@ } #endif strcpy(ifr.ifr_name, iface); +#if 0 if (ioctl(fd, BIOCSETIF, &ifr) < 0) { perror("ioctl(BIOCSETIF)"); return(-1); } +#else + if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) { + perror("ioctl(SIOCGIFHWADDR)"); + exit(-1); + } + memcpy(srceaddr, (char *) &(ifr.ifr_hwaddr.sa_data), 6); + if (ioctl(fd, SIOCGIFINDEX, &ifr) < 0) { + perror("ioctl(SIOCGIFINDEX)"); + exit(-1); + } + memcpy(&intindex, &(ifr.ifr_ifindex), sizeof(ifr.ifr_ifindex)); + +#endif return(fd); } @@ -173,10 +225,12 @@ char *iface; { u_int v; + struct ifreq ifr; if (fd < 0) return sizeof(struct ether_header); +#if 0 if (ioctl(fd, BIOCGDLT, (caddr_t)&v) < 0) { err(1, "ioctl(BIOCGDLT)"); /*NOTREACHED*/ @@ -187,7 +241,27 @@ case DLT_NULL: return sizeof(u_int); } +#else +#ifdef NOT_REALLY_NEEDED + memset(&ifr, 0, sizeof(ifr)); + strncpy(ifr.ifr_name, iface, sizeof(ifr.ifr_name)); + if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0 ) { + perror("ioctl(SIOCGIFHWADDR): hdrlen"); + exit(-1); + } + switch (ifr.ifr_hwaddr.sa_family) { + + case ARPHRD_ETHER: + return sizeof(struct ether_header); + break; + case ARPHRD_LOOPBACK: + return sizeof(u_int); + break; + } +#endif /* NOT_REALLY_NEEDED */ + return sizeof(struct ether_header); +#endif return -1; } @@ -197,10 +271,12 @@ char *iface; { u_int v; + struct ifreq ifr; if (fd < 0) return; +#if 0 if (ioctl(fd, BIOCGDLT, (caddr_t)&v) < 0) { err(1, "ioctl(BIOCGDLT)"); /*NOTREACHED*/ @@ -213,6 +289,27 @@ form_null(); break; } +#else +#ifdef NOT_REALLY_NEEDED + memset(&ifr, 0, sizeof(ifr)); + strncpy(ifr.ifr_name, iface, sizeof(ifr.ifr_name)); + if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0 ) { + perror("ioctl(SIOCGIFHWADDR): form"); + exit(-1); + } + switch (ifr.ifr_hwaddr.sa_family) { + + case ARPHRD_ETHER: + form_ether(); + break; + case ARPHRD_LOOPBACK: + form_null(); + break; + } +#endif /* NOT_REALLY_NEEDED */ + + form_ether(); +#endif } static void