Imported Upstream version 1.5.3 upstream/1.5.3
authorMati Aharoni (Kali Linux Developer) <muts@kali.org>
Fri, 23 May 2014 10:14:51 +0000 (06:14 -0400)
committerMati Aharoni (Kali Linux Developer) <muts@kali.org>
Fri, 23 May 2014 10:14:51 +0000 (06:14 -0400)
47 files changed:
CHANGES.TXT
CONTRIB.TXT
GNUmakefile
Makefile
README.TXT
manuals/addr6.1
manuals/flow6.1
manuals/frag6.1
manuals/icmp6.1
manuals/ipv6toolkit.7
manuals/ipv6toolkit.conf.5
manuals/jumbo6.1
manuals/na6.1
manuals/ni6.1
manuals/ns6.1
manuals/ra6.1
manuals/rd6.1
manuals/rs6.1
manuals/scan6.1
manuals/tcp6.1
manuals/tcp6.1~ [new file with mode: 0644]
tools/addr6.c
tools/addr6.h
tools/flow6.c
tools/flow6.h
tools/frag6.c
tools/frag6.h
tools/icmp6.c
tools/icmp6.h
tools/ipv6toolkit.h
tools/jumbo6.c
tools/jumbo6.h
tools/libipv6.c
tools/libipv6.h
tools/na6.c
tools/na6.h
tools/ni6.c
tools/ns6.c
tools/ra6.c
tools/ra6.h
tools/rd6.c
tools/rd6.h
tools/rs6.c
tools/scan6.c
tools/scan6.h
tools/tcp6.c
tools/tcp6.h

index 238f587..b153809 100644 (file)
@@ -1,7 +1,59 @@
+SI6 Networks IPv6 Toolkit v1.5.3
+
+   * All: Fix packet size issues
+     Many tools were using a (sometimes non-initialized) max_packet_size
+     variable, instead of the corresponding member of the idata structure.
+
+   * All: Add support for some Mac OS version
+     The toolkit would not compile on Lion (10.7.5) or Snow Leopard (10.6.8),
+     as a result of inconsistencies of how BYTE_ORDER-related constants were
+     (not) set in those versions of Mac OS.
+
+SI6 Networks IPv6 Toolkit v1.5.2
+
+   * All: Add support for GNU Debian/kfreebsd
+     The toolkit would not build on GNU Debian/kfreebsd before this release.
+
+   * tcp6: Add support for TCP/IPv6 probes
+     tcp6 can now send TCP/IPv6 packets ("--probe-mode" option), and read the 
+     TCP response packets, if any. This can be leveraged for port scans, and
+     miscellaneous measurements.
+
+SI6 Networks IPv6 Toolkit v1.5.1
+   * Fix Mac OS breakage
+     libipv6.h had incorrect definitions for "struct tcp_hdr".
+
+SI6 Networks IPv6 Toolkit v1.5
+
+   * All: Improved the next-hop determination
+     Since the toolkit employs libpcap (as there is no portable way to forge
+     IPv6 addresses and do other tricks), it was relying on the user specifying
+     a network interface ("-i" was mandatory for all tools) and that routers
+     would send Router Advertisements on the local links. This not only was 
+     rather inconvenient for users (specifying a network interface was not 
+     warranted), but also meant that in setups where RAs where not available
+     (e.g., manual configuration), the tools would fail. The toolkit now
+     employs routing sockets (in BSDs) or Netlink (in Linux), and only uses
+     "sending RAs" as a fall-back in case of failure (IPv6 not configured on
+     the local host).
+
+   * All: Improved source address selection
+     This is closely related to the previous bullet.
+
+   * All: More code moved to libipv6
+     More and more code was moved to libipv6 and removed to the individual tool
+     source files. As with some of the above, this was painful and
+     time-consuming, but was necessary -- and in the long run it will make
+     code maintenance easier.
+
+   * All: libipv6 used throughout all tools
+     This was rather painful and non-exciting, but necessary.
+
+
 SI6 Networks' IPv6 Toolkit v1.4.1
 
    * frag6: Fixed bug that prevented Ethernet header from being filled
-     A bug in the code caused Ethernet frames to go on te wire without any of
+     A bug in the code caused Ethernet frames to go on the wire without any of
      their header fields completed.
 
    * All: Use of library to avoid code replication
@@ -14,7 +66,7 @@ SI6 Networks' IPv6 Toolkit v1.4 release
 
    * frag6: Fixed the flooding option
      Fixed the fragment size used when employing the flooding option. It was 
-     prevously sending fragment sizes that where not a multiple of eight, and
+     previously sending fragment sizes that where not a multiple of eight, and
      hence these fragments were dropped.
 
    * scan6: Added support for 64-bit encoding of IPv4 addresses
@@ -22,7 +74,7 @@ SI6 Networks' IPv6 Toolkit v1.4 release
      and 64 bit) of embedded IPv4 addresses.
 
    * tcp6: Fixed response to Neighbor Solicitations
-     tcp6 was not responding to incomming Neighbor Solicitations. Hence, when
+     tcp6 was not responding to incoming Neighbor Solicitations. Hence, when
      packets were sent from spoofed addresses, tcp6 would never receive the
      response packets, because the NSs sent by the local router or target node
      would never be responded.
index fb090dd..4393b36 100644 (file)
@@ -7,7 +7,9 @@ The following people sent patches that were incorporated into this release
 of the toolkit:
 
     Octavio Alvarez <alvarezp@alvarezp.com>
+    Alexander Bluhm <bluhm@openbsd.org>
     Alistair Crooks <agc@pkgsrc.org>
+    Declan A Rieb   <darieb@sandia.gov>
 
 
 ** Package maintainers **
@@ -31,6 +33,11 @@ These are the maintainers for each of the different packages:
 
     Robin H. Johnson <robbat2@gentoo.org>
 
+  + Mac OS
+
+    Declan A Rieb <darieb@sandia.gov> tests the toolkit on multiple Mac OS
+    versions, to ensure clean compiles on such platforms.
+
   + NetBSD (pkgsrc framework)
 
     Alistair Crooks <agc@pkgsrc.org>
@@ -39,3 +46,18 @@ These are the maintainers for each of the different packages:
 
     Alexander Bluhm <bluhm@openbsd.org>
 
+
+** Troubleshooting/Debugging **
+
+Spotting bugs in networking tool can be tricky, since at times they only show
+up in specific network scenarios.
+
+The following indviduals provided great help in identifying bugs in the the
+toolkit (thus leading to fixes and improvements):
+
+    Stephane Bortzmeyer <stephane@bortzmeyer.org>
+    Marc Heuse <mh@mh-sec.de>
+    Erik Muller <erikm@buh.org>
+    Declan A Rieb <darieb@sandia.gov>
+    Tim <tim-security@sentinelchicken.org>
+
index 6824331..9bbd7ce 100644 (file)
@@ -51,20 +51,20 @@ all: $(TOOLS) $(LIBS) ipv6toolkit.conf
 addr6: $(SRCPATH)/addr6.c $(SRCPATH)/addr6.h $(SRCPATH)/ipv6toolkit.h
        $(CC) $(CPPFLAGS) $(CFLAGS) -o addr6 $(SRCPATH)/addr6.c $(LDFLAGS) 
 
-flow6: $(SRCPATH)/flow6.c $(SRCPATH)/flow6.h $(SRCPATH)/ipv6toolkit.h
-       $(CC) $(CPPFLAGS) $(CFLAGS) -o flow6 $(SRCPATH)/flow6.c $(LDFLAGS) 
+flow6: $(SRCPATH)/flow6.c $(SRCPATH)/flow6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPATH)/libipv6.h
+       $(CC) $(CPPFLAGS) $(CFLAGS) -o flow6 $(SRCPATH)/flow6.c $(LIBS) $(LDFLAGS)
 
-frag6: $(SRCPATH)/frag6.c $(SRCPATH)/frag6.h $(SRCPATH)/ipv6toolkit.h
-       $(CC) $(CPPFLAGS) $(CFLAGS) -o frag6 $(SRCPATH)/frag6.c $(LDFLAGS) 
+frag6: $(SRCPATH)/frag6.c $(SRCPATH)/frag6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPATH)/libipv6.h
+       $(CC) $(CPPFLAGS) $(CFLAGS) -o frag6 $(SRCPATH)/frag6.c $(LIBS) $(LDFLAGS) 
 
-icmp6: $(SRCPATH)/icmp6.c $(SRCPATH)/icmp6.h $(SRCPATH)/ipv6toolkit.h
-       $(CC) $(CPPFLAGS) $(CFLAGS) -o icmp6 $(SRCPATH)/icmp6.c $(LDFLAGS)
+icmp6: $(SRCPATH)/icmp6.c $(SRCPATH)/icmp6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPATH)/libipv6.h
+       $(CC) $(CPPFLAGS) $(CFLAGS) -o icmp6 $(SRCPATH)/icmp6.c $(LIBS) $(LDFLAGS)
 
-jumbo6: $(SRCPATH)/jumbo6.c $(SRCPATH)/jumbo6.h $(SRCPATH)/ipv6toolkit.h
-       $(CC) $(CPPFLAGS) $(CFLAGS) -o jumbo6 $(SRCPATH)/jumbo6.c $(LDFLAGS)
+jumbo6: $(SRCPATH)/jumbo6.c $(SRCPATH)/jumbo6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPATH)/libipv6.h
+       $(CC) $(CPPFLAGS) $(CFLAGS) -o jumbo6 $(SRCPATH)/jumbo6.c $(LIBS) $(LDFLAGS)
 
-na6: $(SRCPATH)/na6.c $(SRCPATH)/na6.h $(SRCPATH)/ipv6toolkit.h
-       $(CC) $(CPPFLAGS) $(CFLAGS) -o na6 $(SRCPATH)/na6.c $(LDFLAGS)
+na6: $(SRCPATH)/na6.c $(SRCPATH)/na6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPATH)/libipv6.h
+       $(CC) $(CPPFLAGS) $(CFLAGS) -o na6 $(SRCPATH)/na6.c $(LIBS) $(LDFLAGS)
 
 ni6: $(SRCPATH)/ni6.c $(SRCPATH)/ni6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPATH)/libipv6.h
        $(CC) $(CPPFLAGS) $(CFLAGS) -o ni6 $(SRCPATH)/ni6.c $(LIBS) $(LDFLAGS)
@@ -72,17 +72,17 @@ ni6: $(SRCPATH)/ni6.c $(SRCPATH)/ni6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPAT
 ns6: $(SRCPATH)/ns6.c $(SRCPATH)/ns6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPATH)/libipv6.h
        $(CC) $(CPPFLAGS) $(CFLAGS) -o ns6 $(SRCPATH)/ns6.c $(LIBS) $(LDFLAGS)
 
-ra6: $(SRCPATH)/ra6.c $(SRCPATH)/ra6.h $(SRCPATH)/ipv6toolkit.h
-       $(CC) $(CPPFLAGS) $(CFLAGS) -o ra6 $(SRCPATH)/ra6.c $(LDFLAGS)
+ra6: $(SRCPATH)/ra6.c $(SRCPATH)/ra6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPATH)/libipv6.h
+       $(CC) $(CPPFLAGS) $(CFLAGS) -o ra6 $(SRCPATH)/ra6.c $(LIBS) $(LDFLAGS)
 
-rd6: $(SRCPATH)/rd6.c $(SRCPATH)/rd6.h $(SRCPATH)/ipv6toolkit.h
-       $(CC) $(CPPFLAGS) $(CFLAGS) -o rd6 $(SRCPATH)/rd6.c $(LDFLAGS)
+rd6: $(SRCPATH)/rd6.c $(SRCPATH)/rd6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPATH)/libipv6.h
+       $(CC) $(CPPFLAGS) $(CFLAGS) -o rd6 $(SRCPATH)/rd6.c $(LIBS) $(LDFLAGS)
 
 rs6: $(SRCPATH)/rs6.c $(SRCPATH)/rs6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPATH)/libipv6.h
        $(CC) $(CPPFLAGS) $(CFLAGS) -o rs6 $(SRCPATH)/rs6.c $(LIBS) $(LDFLAGS)
 
-scan6: $(SRCPATH)/scan6.c $(SRCPATH)/scan6.h $(SRCPATH)/ipv6toolkit.h
-       $(CC) $(CPPFLAGS) $(CFLAGS) -o scan6 $(SRCPATH)/scan6.c $(LDFLAGS)
+scan6: $(SRCPATH)/scan6.c $(SRCPATH)/scan6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPATH)/libipv6.h
+       $(CC) $(CPPFLAGS) $(CFLAGS) -o scan6 $(SRCPATH)/scan6.c $(LIBS) $(LDFLAGS)
 
 tcp6: $(SRCPATH)/tcp6.c $(SRCPATH)/tcp6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPATH)/libipv6.h
        $(CC) $(CPPFLAGS) $(CFLAGS) -o tcp6 $(SRCPATH)/tcp6.c $(LIBS) $(LDFLAGS)
index 2105a95..d49e563 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -11,8 +11,8 @@
 # variable accordingly. The path of the manual pages can be overriden by setting
 # the MANPREFIX variable. Typically, packages will set these variables as follows:
 #
-# PREFIX=usr/
-# MANPREFIX=usr/share
+# PREFIX=/usr
+# MANPREFIX=/usr/share
 #
 # Finally, please note that this makefile supports the DESTDIR variable, as 
 # typically employed by package developers.
@@ -51,20 +51,20 @@ all: $(TOOLS) ipv6toolkit.conf
 addr6: $(SRCPATH)/addr6.c $(SRCPATH)/addr6.h $(SRCPATH)/ipv6toolkit.h
        $(CC) $(CPPFLAGS) $(CFLAGS) -o addr6 $(SRCPATH)/addr6.c $(LDFLAGS) 
 
-flow6: $(SRCPATH)/flow6.c $(SRCPATH)/flow6.h $(SRCPATH)/ipv6toolkit.h
-       $(CC) $(CPPFLAGS) $(CFLAGS) -o flow6 $(SRCPATH)/flow6.c $(LDFLAGS) 
+flow6: $(SRCPATH)/flow6.c $(SRCPATH)/flow6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPATH)/libipv6.h
+       $(CC) $(CPPFLAGS) $(CFLAGS) -o flow6 $(SRCPATH)/flow6.c $(LIBS) $(LDFLAGS) 
 
-frag6: $(SRCPATH)/frag6.c $(SRCPATH)/frag6.h $(SRCPATH)/ipv6toolkit.h
-       $(CC) $(CPPFLAGS) $(CFLAGS) -o frag6 $(SRCPATH)/frag6.c $(LDFLAGS) 
+frag6: $(SRCPATH)/frag6.c $(SRCPATH)/frag6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPATH)/libipv6.h
+       $(CC) $(CPPFLAGS) $(CFLAGS) -o frag6 $(SRCPATH)/frag6.c $(LIBS) $(LDFLAGS)  
 
-icmp6: $(SRCPATH)/icmp6.c $(SRCPATH)/icmp6.h $(SRCPATH)/ipv6toolkit.h
-       $(CC) $(CPPFLAGS) $(CFLAGS) -o icmp6 $(SRCPATH)/icmp6.c $(LDFLAGS)
+icmp6: $(SRCPATH)/icmp6.c $(SRCPATH)/icmp6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPATH)/libipv6.h
+       $(CC) $(CPPFLAGS) $(CFLAGS) -o icmp6 $(SRCPATH)/icmp6.c $(LIBS) $(LDFLAGS)
 
-jumbo6: $(SRCPATH)/jumbo6.c $(SRCPATH)/jumbo6.h $(SRCPATH)/ipv6toolkit.h
-       $(CC) $(CPPFLAGS) $(CFLAGS) -o jumbo6 $(SRCPATH)/jumbo6.c $(LDFLAGS)
+jumbo6: $(SRCPATH)/jumbo6.c $(SRCPATH)/jumbo6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPATH)/libipv6.h
+       $(CC) $(CPPFLAGS) $(CFLAGS) -o jumbo6 $(SRCPATH)/jumbo6.c $(LIBS) $(LDFLAGS)
 
-na6: $(SRCPATH)/na6.c $(SRCPATH)/na6.h $(SRCPATH)/ipv6toolkit.h
-       $(CC) $(CPPFLAGS) $(CFLAGS) -o na6 $(SRCPATH)/na6.c $(LDFLAGS)
+na6: $(SRCPATH)/na6.c $(SRCPATH)/na6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPATH)/libipv6.h
+       $(CC) $(CPPFLAGS) $(CFLAGS) -o na6 $(SRCPATH)/na6.c $(LIBS) $(LDFLAGS)
 
 ni6: $(SRCPATH)/ni6.c $(SRCPATH)/ni6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPATH)/libipv6.h
        $(CC) $(CPPFLAGS) $(CFLAGS) -o ni6 $(SRCPATH)/ni6.c $(LIBS) $(LDFLAGS)
@@ -72,20 +72,20 @@ ni6: $(SRCPATH)/ni6.c $(SRCPATH)/ni6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPAT
 ns6: $(SRCPATH)/ns6.c $(SRCPATH)/ns6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPATH)/libipv6.h
        $(CC) $(CPPFLAGS) $(CFLAGS) -o ns6 $(SRCPATH)/ns6.c $(LIBS) $(LDFLAGS)
 
-ra6: $(SRCPATH)/ra6.c $(SRCPATH)/ra6.h $(SRCPATH)/ipv6toolkit.h
-       $(CC) $(CPPFLAGS) $(CFLAGS) -o ra6 $(SRCPATH)/ra6.c $(LDFLAGS)
+ra6: $(SRCPATH)/ra6.c $(SRCPATH)/ra6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPATH)/libipv6.h
+       $(CC) $(CPPFLAGS) $(CFLAGS) -o ra6 $(SRCPATH)/ra6.c $(LIBS) $(LDFLAGS)
 
-rd6: $(SRCPATH)/rd6.c $(SRCPATH)/rd6.h $(SRCPATH)/ipv6toolkit.h
-       $(CC) $(CPPFLAGS) $(CFLAGS) -o rd6 $(SRCPATH)/rd6.c $(LDFLAGS)
+rd6: $(SRCPATH)/rd6.c $(SRCPATH)/rd6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPATH)/libipv6.h
+       $(CC) $(CPPFLAGS) $(CFLAGS) -o rd6 $(SRCPATH)/rd6.c $(LIBS) $(LDFLAGS)
 
-rs6: $(SRCPATH)/rs6.c $(SRCPATH)/rs6.h $(SRCPATH)/ipv6toolkit.h
-       $(CC) $(CPPFLAGS) $(CFLAGS) -o rs6 $(SRCPATH)/rs6.c $(LDFLAGS)
+rs6: $(SRCPATH)/rs6.c $(SRCPATH)/rs6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPATH)/libipv6.h
+       $(CC) $(CPPFLAGS) $(CFLAGS) -o rs6 $(SRCPATH)/rs6.c $(LIBS) $(LDFLAGS)
 
-scan6: $(SRCPATH)/scan6.c $(SRCPATH)/scan6.h $(SRCPATH)/ipv6toolkit.h
-       $(CC) $(CPPFLAGS) $(CFLAGS) -o scan6 $(SRCPATH)/scan6.c $(LDFLAGS)
+scan6: $(SRCPATH)/scan6.c $(SRCPATH)/scan6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPATH)/libipv6.h
+       $(CC) $(CPPFLAGS) $(CFLAGS) -o scan6 $(SRCPATH)/scan6.c $(LIBS) $(LDFLAGS)
 
-tcp6: $(SRCPATH)/tcp6.c $(SRCPATH)/tcp6.h $(SRCPATH)/ipv6toolkit.h
-       $(CC) $(CPPFLAGS) $(CFLAGS) -o tcp6 $(SRCPATH)/tcp6.c $(LDFLAGS)
+tcp6: $(SRCPATH)/tcp6.c $(SRCPATH)/tcp6.h $(SRCPATH)/ipv6toolkit.h $(LIBS) $(SRCPATH)/libipv6.h
+       $(CC) $(CPPFLAGS) $(CFLAGS) -o tcp6 $(SRCPATH)/tcp6.c $(LIBS) $(LDFLAGS)
 
 libipv6.o: $(SRCPATH)/libipv6.c $(SRCPATH)/libipv6.h
        $(CC) $(CPPFLAGS) $(CFLAGS) -c -o libipv6.o $(SRCPATH)/libipv6.c
index 521d5de..83e8346 100644 (file)
@@ -1,5 +1,5 @@
 *******************************************************************************
-*                      SI6 Networks IPv6 Toolkit v1.4.1                       *
+*                      SI6 Networks IPv6 Toolkit v1.5.3                       *
 *******************************************************************************
 
 Description of each of the files and directories:
@@ -28,8 +28,9 @@ pages by running the following command:
 
 Note: The libpcap library must be previously installed on the system.
 
-All the tools have been tested to compile and run on Debian GNU/Linux 6.0,
-FreeBSD 9.0, NetBSD 5.1, OpenBSD 5.0, Ubuntu 11.10, and Mac 0S 10.8.0.
+All the tools have been tested to build (both with gcc and clang) and run on 
+Debian GNU/Linux 7.0, Debian GNU/kfreebsd 7.0, FreeBSD 9.0, NetBSD 6.1.1, 
+OpenBSD 5.3, Ubuntu 11.10, and Mac 0S 10.8.0.
 
 
 Bug reports
index 364d5f2..e5d4b29 100644 (file)
@@ -326,5 +326,5 @@ for SI6 Networks
 .SH COPYRIGHT
 Copyright (c) 2011\-2013 Fernando Gont.
 
-Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being just "AUTHOR" and "COPYRIGHT", with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the license is available at
+Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front\-Cover Texts, and no Back\-Cover Texts.  A copy of the license is available at
 .IR <http://www.gnu.org/licenses/fdl.html> .
index 35680ee..1b7d61a 100644 (file)
@@ -3,7 +3,8 @@
 flow6 \- A security assessment tool for the IPv6 Flow Label field
 .SH SYNOPSIS
 .B flow6
-.BI \-i \|\ INTERFACE
+.RB [\| \-i
+.IR INTERFACE\| ]
 .BI \-d \|\ DST_ADDR
 .RB [\| \-S
 .IR LINK_SRC_ADDR\| ]
@@ -30,9 +31,9 @@ sends a number of probe packets to the target node, and samples the Flow Label v
 .PP
 The tool will first send a number of probe packets from single IPv6 address, such that the per-destination policy is determined. The tool will then send probe packets from random IPv6 addresses (from the same prefix as the first probes) such that the "global" Flow Label generation policy can be determined.
 .PP
-The tool computes the expected value and the standard deviation of the difference between consecutive-sampled Flow Label values (Labeln – Labeln-1) with the intent of inferring the Flow Label generation algorithm of the target node. 
+The tool computes the expected value and the standard deviation of the difference between consecutive-sampled Flow Label values (Labeln \- Labeln\-1) with the intent of inferring the Flow Label generation algorithm of the target node. 
 .PP
-If the standard deviation of [Labeln – Labeln-1] is 0, the Flow Label is assumed to be set to a constant value, and the corresponding value is informed to the user. For small values of the standard deviation, the Flow Label is assumed to be a monotonically-increasing function with increments of the "expected value", and such "expected value" together with the standard deviation, are informed to the user. For large values of the standard deviation, the Flow Label is assumed to be randomized, and the expected value and standard deviation are informed to the user, as indicators of the "quality" of the Flow Label generation algorithm.
+If the standard deviation of [Labeln \- Labeln\-1] is 0, the Flow Label is assumed to be set to a constant value, and the corresponding value is informed to the user. For small values of the standard deviation, the Flow Label is assumed to be a monotonically\-increasing function with increments of the "expected value", and such "expected value" together with the standard deviation, are informed to the user. For large values of the standard deviation, the Flow Label is assumed to be randomized, and the expected value and standard deviation are informed to the user, as indicators of the "quality" of the Flow Label generation algorithm.
 
 .SH OPTIONS
 .B flow6
@@ -40,7 +41,7 @@ takes it parameters as command-line options. Each of the options can be specifie
 
 .TP
 .BI \-i\  INTERFACE ,\ \-\-interface\  INTERFACE
-This option specifies the network interface that the tool will use. The network interface must be specified (i.e., the tool does not select any network interface "by default").
+This option specifies the network interface that the tool will use. If the destination address ("\-d" option) is a link-local address, the interface must be explicitly specified. The interface may also be specified alon with a destination address, with the "\-d" option.
 
 .TP
 .BI \-s\  SRC_ADDR ,\ \-\-src\-address\  SRC_ADDR
@@ -60,12 +61,12 @@ This option specifies the Hop Limit to be used for the IPv6 packets. By default,
 .TP
 .BI \-S\  SRC_LINK_ADDR ,\ \-\-src\-link\-address\  SRC_LINK_ADDR
 
-This option specifies the link-layer Source Address of the probe packets (currently, only Ethernet is supported). If left unspecified, the link-layer Source Address of the packets is set to the real link-layer address of the network interface.
+This option specifies the link\-layer Source Address of the probe packets (currently, only Ethernet is supported). If left unspecified, the link\-layer Source Address of the packets is set to the real link\-layer address of the network interface.
 
 .TP
 .BI \-D\  DST_LINK_ADDR ,\ \-\-dst\-link\-address\  DST_LINK_ADDR
 
-This option specifies the link-layer Destination Address of the probe packets (currently, only Ethernet is supported). By default, the link-layer Destination Address is automatically set to the link-layer address of the destination host (for on-link destinations) or to the link-layer address of the first-hop router.
+This option specifies the link\-layer Destination Address of the probe packets (currently, only Ethernet is supported). By default, the link\-layer Destination Address is automatically set to the link\-layer address of the destination host (for on-link destinations) or to the link\-layer address of the first\-hop router.
 
 .TP
 .BI \-P\  PROTOCOL ,\ \-\-protocol\  PROTOCOL
@@ -104,13 +105,13 @@ tool.
 
 # flow6 \-i eth0 \-\-flow-label-policy \-d fe80::1 \-v
 
-Assess the Flow Label generation policy of the host "fe80::1", using the network interface "eth0". Probe packets are TCP segments directed to port 80 (default). Be verbose.
+Assess the Flow Label generation policy of the host "fe80::1", using the network interface "eth0". Probe packets are TCP segments directed to port 80 (default). Be verbose. In this example, since the IPv6 destination address is a link-local address, the network interface ccard must be explicitly specified.
 
 \fBExample #2\fR
 
-# flow6 \-i eth0 \-d fe80::1 \-\-flow\-label\-policy \-P TCP \-p 22 \-vv
+# flow6 \-d 2001:db8::1 \-\-flow\-label\-policy \-P TCP \-p 22 \-vv
 
-Assess the Flow Label generation policy of the host "fe80::1", using the network interface "eth0". Probe packets are TCP segments directed to port 22. Be very verbose (i.e., list the sampled Flow Label values).
+Assess the Flow Label generation policy of the host "2001:db8::1". Probe packets are TCP segments directed to port 22. Be very verbose (i.e., list the sampled Flow Label values).
 
 .SH AUTHOR
 The
@@ -120,5 +121,5 @@ tool and the corresponding manual pages were produced by Fernando Gont <fgont@si
 .SH COPYRIGHT
 Copyright (c) 2011\-2013 Fernando Gont.
 
-Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being just "AUTHOR" and "COPYRIGHT", with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the license is available at
+Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front\-Cover Texts, and no Back\-Cover Texts.  A copy of the license is available at
 .IR <http://www.gnu.org/licenses/fdl.html> .
index 929549f..ab53b2f 100644 (file)
@@ -3,7 +3,9 @@
 frag6 \- A security assessment tool for IPv6 fragmentation
 .SH SYNOPSIS
 .B frag6
-\-i INTERFACE \-d DST_ADDR [\-S LINK_SRC_ADDR] [\-D LINK-DST-ADDR] [\-s SRC_ADDR[/LEN]] [\-A HOP_LIMIT] [\-u DST_OPT_HDR_SIZE] [\-U DST_OPT_U_HDR_SIZE] [\-H HBH_OPT_HDR_SIZE] [\-P FRAG_SIZE] [\-O FRAG_TYPE] [\-o FRAG_OFFSET] [\-I FRAG_ID] [\-T] [\-n] [\-p | \-W | \-X | \-F N_FRAGS] [\-l] [\-z SECONDS] [\-v] [\-h]
+.RB [\| \-i
+.IR INTERFACE\| ]
+\-d DST_ADDR [\-S LINK_SRC_ADDR] [\-D LINK-DST-ADDR] [\-s SRC_ADDR[/LEN]] [\-A HOP_LIMIT] [\-u DST_OPT_HDR_SIZE] [\-U DST_OPT_U_HDR_SIZE] [\-H HBH_OPT_HDR_SIZE] [\-P FRAG_SIZE] [\-O FRAG_TYPE] [\-o FRAG_OFFSET] [\-I FRAG_ID] [\-T] [\-n] [\-p | \-W | \-X | \-F N_FRAGS] [\-l] [\-z SECONDS] [\-v] [\-h]
 
 .SH DESCRIPTION
 .B frag6
@@ -15,17 +17,17 @@ takes it parameters as command-line options. Each of the options can be specifie
 
 .TP
 .BI \-i\  INTERFACE ,\ \-\-interface\  INTERFACE
-This option specifies the network interface that the tool will use. The network interface must be specified (i.e., the tool does not select any network interface "by default").
+This option specifies the network interface that the tool will use. If the destination address ("\-d" option) is a link-local address, the interface must be explicitly specified. The interface may also be specified along with a destination address, with the "\-d" option.
 
 .TP
 .BI \-S\  SRC_LINK_ADDR ,\ \-\-src\-link\-address\  SRC_LINK_ADDR
 
-This option specifies the link-layer Source Address of the probe packets (currently, only Ethernet is supported). If left unspecified, the link-layer Source Address of the packets is set to the real link-layer address of the network interface.
+This option specifies the link\-layer Source Address of the probe packets. If left unspecified, the link\-layer Source Address of the packets is set to the real link\-layer address of the network interface.
 
 .TP
 .BI \-D\  DST_LINK_ADDR ,\ \-\-dst\-link\-address\  DST_LINK_ADDR
 
-This option specifies the link-layer Destination Address of the probe packets (currently, only Ethernet is supported). By default, the link-layer Destination Address is automatically set to the link-layer address of the destination host (for on-link destinations) or to the link-layer address of the first-hop router.
+This option specifies the link\-layer Destination Address of the probe packets. By default, the link\-layer Destination Address is automatically set to the link\-layer address of the destination host (for on-link destinations) or to the link\-layer address of the first-hop router.
 
 .TP
 .BI \-s\  SRC_ADDR ,\ \-\-src\-address\  SRC_ADDR
@@ -201,25 +203,25 @@ tool.
 
 \fBExample #1\fR
 
-# frag6 \-i eth0 \-\-frag\-id\-policy \-d fc00:1::1 \-v
+# frag6 \-\-frag\-id\-policy \-d fc00:1::1 \-v
 
-Assess the fragment Identification generation policy of the host "fc00:1::1", using the network interface "eth0". Be verbose.
+Assess the fragment Identification generation policy of the host "fc00:1::1". Be verbose.
 
 \fBExample #2\fR
 
-# frag6 \-i eth0 \-\-frag\-reass\-policy \-d fc00:1::1 \-v
+# frag6 \-\-frag\-reass\-policy \-d fc00:1::1 \-v
 
-Assess the fragment reassembly policy of the host "fc00:1::1", using the network interface "eth0". Be verbose.
+Assess the fragment reassembly policy of the host "fc00:1::1". Be verbose.
 
 \fBExample #3\fR
 
-# frag6 \-i eth0 –frag-type atomic \-d fc00:1::1 \-v
+# frag6 \-\-frag\-type atomic \-d fc00:1::1 \-v
 
-Send an IPv6 atomic fragment to the host "fc00:1::1", using the network interface "eth0". Be verbose.
+Send an IPv6 atomic fragment to the host "fc00:1::1". Be verbose.
 
 \fBExample #4\fR
 
-# frag6 \-i eth0 \-s ::/0 \-\-flood\-frags 100 \-l \-z 5 \-d fc00:1::1 \-v
+# frag6 \-s ::/0 \-\-flood\-frags 100 \-l \-z 5 \-d fc00:1::1 \-v
 
 Send 100 fragments (every 5 seconds) to the host fc00:1::1, using a forged IPv6 Source Address from the prefix ::/0. The aforementioned fragments should have an offset of 0, and the M bit set (i.e., be first-fragments). Be verbose.
 
@@ -231,5 +233,5 @@ tool and the corresponding manual pages were produced by Fernando Gont <fgont@si
 .SH COPYRIGHT
 Copyright (c) 2011\-2013 Fernando Gont.
 
-Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being just "AUTHOR" and "COPYRIGHT", with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the license is available at
+Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front\-Cover Texts, and no Back\-Cover Texts.  A copy of the license is available at
 .IR <http://www.gnu.org/licenses/fdl.html> .
index 6cf45ec..945b8eb 100644 (file)
@@ -3,7 +3,9 @@
 icmp6 \- A security assessment tool for attack vectors based on ICMPv6 packets
 .SH SYNOPSIS
 .B icmp6
-\-i INTERFACE [\-s SRC_ADDR[/LEN]] [\-d DST_ADDR] [\-S LINK_SRC_ADDR] [\-D LINK-DST-ADDR] [\-c HOP_LIMIT] [\-y FRAG_SIZE] [\-u DST_OPT_HDR_SIZE] [\-U DST_OPT_U_HDR_SIZE] [\-H HBH_OPT_HDR_SIZE] [\-t TYPE[:CODE] | \-e CODE | \-A CODE \-V CODE \-R CODE] [\-r TARGET_ADDR] [\-x PEER_ADDR] [\-c HOP_LIMIT] [\-m MTU] [\-O POINTER] [\-p PAYLOAD_TYPE] [\-P PAYLOAD_SIZE] [\-n] [\-a SRC_PORTL[:SRC_PORTH]] [\-o DST_PORTL[:DST_PORTH]] [\-X TCP_FLAGS] [\-q TCP_SEQ] [\-Q TCP_ACK] [\-V TCP_URP] [\-w TCP_WIN] [\-M] [\-j PREFIX[/LEN]] [\-k PREFIX[/LEN]] [\-J LINK_ADDR] [\-K LINK_ADDR] [\-b PREFIX[/LEN]] [\-g PREFIX[/LEN]] [\-B LINK_ADDR] [\-G LINK_ADDR] [\-f] [\-L | \-l] [\-z] [\-v] [\-h]
+.RB [\| \-i
+.IR INTERFACE\| ]
+[\-s SRC_ADDR[/LEN]] [\-d DST_ADDR] [\-S LINK_SRC_ADDR] [\-D LINK-DST-ADDR] [\-c HOP_LIMIT] [\-y FRAG_SIZE] [\-u DST_OPT_HDR_SIZE] [\-U DST_OPT_U_HDR_SIZE] [\-H HBH_OPT_HDR_SIZE] [\-t TYPE[:CODE] | \-e CODE | \-A CODE \-V CODE \-R CODE] [\-r TARGET_ADDR] [\-x PEER_ADDR] [\-c HOP_LIMIT] [\-m MTU] [\-O POINTER] [\-p PAYLOAD_TYPE] [\-P PAYLOAD_SIZE] [\-n] [\-a SRC_PORTL[:SRC_PORTH]] [\-o DST_PORTL[:DST_PORTH]] [\-X TCP_FLAGS] [\-q TCP_SEQ] [\-Q TCP_ACK] [\-V TCP_URP] [\-w TCP_WIN] [\-M] [\-j PREFIX[/LEN]] [\-k PREFIX[/LEN]] [\-J LINK_ADDR] [\-K LINK_ADDR] [\-b PREFIX[/LEN]] [\-g PREFIX[/LEN]] [\-B LINK_ADDR] [\-G LINK_ADDR] [\-f] [\-L | \-l] [\-z] [\-v] [\-h]
 
 .SH DESCRIPTION
 .B icmp6
@@ -21,8 +23,7 @@ The icmp6 tool supports IPv6 fragmentation, which might be of use to circumvent
 
 .TP
 .BI \-i\  INTERFACE ,\ \-\-interface\  INTERFACE
-
-This option specifies the network interface that the tool will use. The network interface must be specified (i.e., the tool does not select any network interface "by default").
+This option specifies the network interface that the tool will use. If the destination address ("\-d" option) is a link-local address, or the "listening" ("\-L") mode is selected, the interface must be explicitly specified. The interface may also be specified along with a destination address, with the "\-d" option.
 
 .TP
 .BI \-s\  SRC_ADDR ,\ \-\-src\-address\  SRC_ADDR
@@ -37,6 +38,18 @@ This option specifies the IPv6 Destination Address of the victim. It can be left
 When operating in "listening" mode ("\-L" option), the IPv6 Destination Address is selected according to the IPv6 Source Address of the incoming packet. 
 
 .TP
+.BI \-S\  SRC_LINK_ADDR ,\ \-\-src\-link\-address\  SRC_LINK_ADDR
+
+This option specifies the link\-layer Source Address of the attack packets. If left unspecified, the link\-layer Source Address is randomized.
+
+.TP
+.BI \-D\  DST_LINK_ADDR ,\ \-\-dst\-link\-address\  DST_LINK_ADDR
+
+This option specifies the link\-layer Destination Address of the attack packets. If left unspecified, it is set to that of the local router (for non-local destinations) or to that corresponding to the destination host (for local hosts).
+
+When operating in "listening" mode, the link\-layer Destination Address is set to the link\-layer Source Address of the incoming packet.
+
+.TP
 .BI \-c\  HOP_LIMIT ,\ \-\-hop\-limit\  HOP_LIMIT
 
 This option specifies the Hop Limit to be used for the Redirect messages. If this option is left unspecified, the Hop Limit is randomized to a value between 64 and 243.
@@ -62,18 +75,6 @@ This option specifies a Destination Options header to be included in the "unfrag
 This option specifies that a Hop-by-Hop Options header is to be included in the outgoing packet(s). The header size must be specified as an argument to this option (the header is filled with padding options). Multiple Hop-by-Hop Options headers may be specified by means of multiple "\-H" options.
 
 .TP
-.BI \-S\  SRC_LINK_ADDR ,\ \-\-src\-link\-address\  SRC_LINK_ADDR
-
-This option specifies the link-layer Source Address of the attack packets (currently, only Ethernet is supported). If left unspecified, the link-layer Source Address is randomized.
-
-.TP
-.BI \-D\  DST_LINK_ADDR ,\ \-\-dst\-link\-address\  DST_LINK_ADDR
-
-This option specifies the link-layer Destination Address of the attack packets (currently, only Ethernet is supported). If left unspecified, it is set to that of the local router (for non-local destinations) or to that corresponding to the destination host (for local hosts).
-
-When operating in "listening" mode, the link-layer Destination Address is set to the link-layer Source Address of the incoming packet.
-
-.TP
 .BI \-t\  TYPE ,\ \-\-icmp6\ TYPE
 
 This option specifies the Type and Code of the ICMPv6 error message in the form "\-\-icmp6 TYPE:CODE". If left unspecified, the ICMPv6 error message defaults to "Parameter Problem, Erroneous header field encountered" (Type 4, Code 0).
@@ -218,12 +219,12 @@ This option sets a block filter for the incoming Neighbor Solicitation messages,
 .TP
 .BI \-J\  SRC_ADDR ,\ \-\-block\-link\-src\  SRC_ADDR
 
-This option sets a block filter for the incoming packets, based on their link-layer Source Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
+This option sets a block filter for the incoming packets, based on their link\-layer Source Address. The option must be followed by a link\-layer address (currently, only Ethernet is supported).
 
 .TP
 .BI \-K\  DST_ADDR ,\ \-\-block\-link\-dst\  DST_ADDR
 
-This option sets a block filter for the incoming packets, based on their link-layer Destination Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
+This option sets a block filter for the incoming packets, based on their link\-layer Destination Address. The option must be followed by a link\-layer address (currently, only Ethernet is supported).
 
 .TP
 .BI \-b\  SRC_ADDR ,\ \-\-accept\-src\  SRC_ADDR
@@ -238,12 +239,12 @@ This option sets a accept filter for the incoming packets, based on their IPv6 D
 .TP
 .BI \-B\  SRC_ADDR ,\ \-\-accept\-link\-src\  SRC_ADDR
 
-This option sets an accept filter for the incoming Neighbor Solicitation messages, based on their link-layer Source Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
+This option sets an accept filter for the incoming Neighbor Solicitation messages, based on their link\-layer Source Address. The option must be followed by a link\-layer address (currently, only Ethernet is supported).
 
 .TP
 .BI \-G\  DST_ADDR ,\ \-\-accept\-link\-dst\  DST_ADDR
 
-This option sets an accept filter for the incoming packets, based on their link-layer Destination Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
+This option sets an accept filter for the incoming packets, based on their link\-layer Destination Address. The option must be followed by a link\-layer address (currently, only Ethernet is supported).
 
 .TP
 .BR \-f\| ,\  \-\-sanity\-filters
@@ -286,18 +287,18 @@ tool.
 
 \fBExample #1\fR
 
-# ./icmp6 \-i eth0 \-L \-p TCP \-v
+# icmp6 \-i eth0 \-L \-p TCP \-v
 
-The tool uses the network interface "eth0", and operates in "Listening" mode ("\-L" option). Each ICMPv6 error message will contain the ICMPv6 Payload as many bytes from the captured packet without exceeding the minimum IPv6 MTU (1280 bytes). The tool will print detailed information about the attack ("\-v" option).
+The tool employs the network interface "eth0", and operates in "Listening" mode ("\-L" option). Each ICMPv6 error message will contain the ICMPv6 Payload as many bytes from the captured packet without exceeding the minimum IPv6 MTU (1280 bytes). The tool will print detailed information about the attack ("\-v" option).
 
 \fBExample #2\fR
 
-# ./icmp6 \-i eth0 \-\-icmp6\-packet\-too\-big \-p ICMP6 \-d 2001:db8:10::1 \-\-peer\-addr 2001:db8:11::2 \-m 1240 \-v
+# icmp6 \-\-icmp6\-packet\-too\-big \-p ICMP6 \-d 2001:db8:10::1 \-\-peer\-addr 2001:db8:11::2 \-m 1240 \-v
 
-The tool uses the network interface "eth0" to send an ICMPv6 Packet Too Big error message that advertises an MTU of 1240 bytes. The ICMPv6 error message will be sent to the address " "2001:db8:10::1". The ICMPv6 error message will embed an ICMPv6 Echo Request message with the Source Address set to  "2001:db8:10::1" (i.e., Destination Address of the error message), and the Destination Address set to "2001:db8:11::2) ("\-\-peer\-addr" option). The value of the "Identifier" and "Sequence Number" fields of the embedded ICMPv6 Echo Request message randomized. The tool will provide detailed information about the attack ("\-v" option).
+The tool will send an ICMPv6 Packet Too Big error message that advertises an MTU of 1240 bytes. The ICMPv6 error message will be sent to the address " "2001:db8:10::1". The ICMPv6 error message will embed an ICMPv6 Echo Request message with the Source Address set to  "2001:db8:10::1" (i.e., Destination Address of the error message), and the Destination Address set to "2001:db8:11::2) ("\-\-peer\-addr" option). The value of the "Identifier" and "Sequence Number" fields of the embedded ICMPv6 Echo Request message will be randomized. The tool will provide detailed information about the attack ("\-v" option).
 
 .SH SEE ALSO
-RFC 5927 (available at <http://www.rfc-editor.org/rfc/rfc5927.txt>) and "Security Assessment of the Transmission Control Protocol (TCP)" (available at <http://www.si6networks.com/publications/tn-03\-09\-security-assessment-TCP.pdf>) for a discussion of ICMPv6 attacks against TCP.
+RFC 5927 (available at <http://www.rfc-editor.org/rfc/rfc5927.txt>) and "Security Assessment of the Transmission Control Protocol (TCP)" (available at <http://www.si6networks.com/publications/tn\-03\-09\-security\-assessment\-TCP.pdf>) for a discussion of ICMPv6 attacks against TCP.
 
 .SH AUTHOR
 The
@@ -307,5 +308,5 @@ tool and the corresponding manual pages were produced by Fernando Gont <fgont@si
 .SH COPYRIGHT
 Copyright (c) 2011\-2013 Fernando Gont.
 
-Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being just "AUTHOR" and "COPYRIGHT", with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the license is available at
+Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front\-Cover Texts, and no Back\-Cover Texts.  A copy of the license is available at
 .IR <http://www.gnu.org/licenses/fdl.html> .
index 7189229..bc5ea7e 100644 (file)
@@ -1,9 +1,9 @@
 .TH IPV6TOOLKIT 7
 .SH NAME
-ipv6toolkit \- An IPv6 security assessment and trouble-shooting toolkit
+ipv6toolkit \- An IPv6 security assessment and trouble\-shooting toolkit
 
 .SH DESCRIPTION
-The SI6 Networks' IPv6 Toolkit is a security assessment and trouble-shooting toolkit for IPv6 networks and implementations. It provides a number of tools to send abitrary IPv6 packets, perform IPv6 address-scans, analyze IPv6 addresses, etc.
+The SI6 Networks' IPv6 Toolkit is a security assessment and trouble\-shooting toolkit for IPv6 networks and implementations. It provides a number of tools to send abitrary IPv6 packets, perform IPv6 address\-scans, analyze IPv6 addresses, etc.
 
 The current version of the toolkit includes the following tools:
 
@@ -26,13 +26,13 @@ is an IPv6 address analysis and manipulation tool. Given a list of IPv6 addresse
 .B addr6
 can produce statistics on such addresses, including address scopes, types, and type of IPv6 interface identifier.
 .B addr6
-can also analyze a single address, producing script-friendly output, such that its analysis can be leveraged by other tools or scripts.
+can also analyze a single address, producing script\-friendly output, such that its analysis can be leveraged by other tools or scripts.
 
 .B flow6
 allows the security assessment of the IPv6 Flow Label. Essentially, it can be leveraged to assess the Flow Label generation policy of a terget implementation.
 
 .B frag6
-is a security assessment tool for the IPv6 fragmentation mechanism. It allows the exploitation of fragmentation-based attacks, and can also be employed to assess the Fragment Identification generation policy, assess support for IPv6 atomic fragments, etc.
+is a security assessment tool for the IPv6 fragmentation mechanism. It allows the exploitation of fragmentation\-based attacks, and can also be employed to assess the Fragment Identification generation policy, assess support for IPv6 atomic fragments, etc.
 
 .B icmp6
 is a security assessment tool for the ICMPv6 protocol. It can easily produce arbitrary ICMPv6 error messages, and includes the capability to generate such messages in response to received traffic. 
@@ -64,7 +64,7 @@ is a security assessment tool for attack vectors based on Router Solicitation me
 is a full-fledged IPv6 address scanning tool, which can leverage specific IPv6 address patterns to greatly reduce the search space for "alive" nodes.
 
 .B tcp6
-is a security assessment tool for attack vectors based on TCP/IPv6 packets. It can be easily employed to launch classic TCP-based attacks such as SYN-floods, but can also be employed to launch other more complex attacks such as TCO connection floods, etc.
+is a security assessment tool for attack vectors based on TCP/IPv6 packets. It can be easily employed to launch classic TCP\-based attacks such as SYN-floods, but can also be employed to launch other more complex attacks such as TCP connection floods, etc.
 
 
 .SH SEE ALSO
@@ -90,7 +90,7 @@ for SI6 Networks
 .IR <http://www.si6networks.com> .
 
 .SH COPYRIGHT
-Copyright (c) 2011-2013 Fernando Gont.
+Copyright (c) 2011\-2013 Fernando Gont.
 
-Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being just "AUTHOR" and "COPYRIGHT", with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the license is available at
+Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front\-Cover Texts, and no Back\-Cover Texts.  A copy of the license is available at
 .IR <http://www.gnu.org/licenses/fdl.html> .
index ff428bd..dabdb52 100644 (file)
@@ -48,7 +48,7 @@ The
 and the corresponding manual pages were produced by Fernando Gont <fgont@si6networks.com> for SI6 Networks <http://www.si6networks.com>.
 
 .SH COPYRIGHT
-Copyright (c) 2011-2013 Fernando Gont.
+Copyright (c) 2011\-2013 Fernando Gont.
 
-Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being just "AUTHOR" and "COPYRIGHT", with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the license is available at
+Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front\-Cover Texts, and no Back\-Cover Texts.  A copy of the license is available at
 .IR <http://www.gnu.org/licenses/fdl.html> .
index 99f966e..85b0321 100644 (file)
@@ -3,52 +3,45 @@
 jumbo6 \- A security assessment tool for attack vectors based on IPv6 jumbograms
 .SH SYNOPSIS
 .B jumbo6
-\-i INTERFACE [\-S LINK_SRC_ADDR] [\-D LINK-DST-ADDR] [\-s SRC_ADDR[/LEN]] [\-d DST_ADDR] [\-A HOP_LIMIT] [\-H HBH_OPT_HDR_SIZE]  [\-U DST_OPT_U_HDR_SIZE] [\-y FRAG_SIZE] [\-u DST_OPT_HDR_SIZE] [\-q IPV6_LENGTH] [\-Q JUMBO_LENGTH] [\-P PAYLOAD_SIZE] [\-j PREFIX[/LEN]] [\-k PREFIX[/LEN]] [\-J LINK_ADDR] [\-K LINK_ADDR] [\-b PREFIX[/LEN]] [\-g PREFIX[/LEN]] [\-B LINK_ADDR] [\-G LINK_ADDR] [\-L | \-l] [\-z SECONDS] [\-v] [\-h]
+.RB [\| \-i
+.IR INTERFACE\| ]
+[\-S LINK_SRC_ADDR] [\-D LINK-DST-ADDR] [\-s SRC_ADDR[/LEN]] [\-d DST_ADDR] [\-A HOP_LIMIT] [\-H HBH_OPT_HDR_SIZE]  [\-U DST_OPT_U_HDR_SIZE] [\-y FRAG_SIZE] [\-u DST_OPT_HDR_SIZE] [\-q IPV6_LENGTH] [\-Q JUMBO_LENGTH] [\-P PAYLOAD_SIZE] [\-l] [\-z SECONDS] [\-v] [\-h]
 
 .SH DESCRIPTION
 .B jumbo6
 allows the assessment of IPv6 implementations with respect to attack vectors based on IPv6 jumbograms. It is part of the SI6 Networks' IPv6 Toolkit : a security assessment suite for the IPv6 protocols. 
 
-This tool has two modes of operation: active and listening. Active mode is employed if an IPv6 Destination Address is specified, while "listening" mode is employed if the "\-L" option (or its long counterpart "\-\-listen") is set. If both a target and the "\-L" option are specified, IPv6 jumbograms are sent to the specified target, and then the tool enters listening mode to send IPv6 jumbograms in response to incoming packets.
-
-In active mode, the tool sends IPv6 jumbograms to the specified target, and informs the user of any received ICMPv6 error messages (typically "ICMPv6 Parameter Problem" error messages). In "listening" mode, the tool listens to traffic on the local network, and sends IPv6 jumbograms in response to received packets.  
-
-When operating in "listening" mode, the tool can filter incoming packets based on the Ethernet Source Address, the Ethernet Destination Address, the IPv6 Source Address, and the IPv6 Destination Address.  There are two types of filters: "block filters" and "accept filters". If any "block filter" is specified, and the incoming packet matches any of those filters, the message is discarded (and thus no attack packets are sent in response). If any "accept filter" is specified, incoming packets must match the specified filters in order for the tool to respond with attack packets.
+This tool has only one mode of operation: active mode. In active mode, the tool sends IPv6 jumbograms to the specified target, and informs the user of any received ICMPv6 error messages (typically "ICMPv6 Parameter Problem" error messages).
 
 .SH OPTIONS
 .B jumbo6
 takes its parameters as command-line options. Each of the options can be specified with a short name (one character preceded with the hyphen character, as e.g. "\-i") or with a long name (a string preceded with two hyphen characters, as e.g. "\-\-interface").
 
-jumbo6 supports IPv6 Extension Headers, including the IPv6 Fragmentation Header, which might be of use to circumvent layer-2 filtering and/or Network Intrusion Detection Systems (NIDS). However, IPv6 extension headers are not employed by default, and must be explicitly enabled with the corresponding options.
+jumbo6 supports IPv6 Extension Headers, including the IPv6 Fragmentation Header, which might be of use to circumvent layer\-2 filtering and/or Network Intrusion Detection Systems (NIDS). However, IPv6 extension headers are not employed by default, and must be explicitly enabled with the corresponding options.
 
 .TP
-\-\-interface, \-i
-
-This option specifies the network interface that the tool will use. The network interface must be specified (i.e., the tool does not select any network interface "by default").
+.BI \-i\  INTERFACE ,\ \-\-interface\  INTERFACE
+This option specifies the network interface that the tool will use. If the destination address ("\-d" option) is a link\-local address, the interface must be explicitly specified. The interface may also be specified along with a destination address, with the "\-d" option.
 
 .TP
-\-\-src\-link\-address, \-S
+.BI \-S\  SRC_LINK_ADDR ,\ \-\-src\-link\-address\  SRC_LINK_ADDR
 
-This option specifies the link-layer Source Address of the IPv6 jumbograms (currently, only Ethernet is supported). If left unspecified, the link-layer Source Address is randomized.
+This option specifies the link\-layer Source Address of the probe packets. If left unspecified, the link\-layer Source Address of the packets is set to the real link\-layer address of the network interface.
 
 .TP
-\-\-link\-dst\-address, \-D
+.BI \-D\  DST_LINK_ADDR ,\ \-\-dst\-link\-address\  DST_LINK_ADDR
 
-This option specifies the link-layer Destination Address of the IPv6 jumbograms (currently, only Ethernet is supported). By default, the link-layer Destination Address is automatically set to the link-layer address of the destination host (for on-link destinations) or to the link-layer of the first-hop router. 
+This option specifies the link\-layer Destination Address of the probe packets (currently, only Ethernet is supported). By default, the link\-layer Destination Address is automatically set to the link\-layer address of the destination host (for on-link destinations) or to the link\-layer address of the first-hop router.
 
 .TP
-\-\-src\-address, \-s
+.BI \-s\  SRC_ADDR ,\ \-\-src\-address\  SRC_ADDR
 
-This option specifies the IPv6 Source Address (or IPv6 prefix) to be used for the Source Address of the attack packets. If an IPv6 prefix is specified, the IPv6 Source Address is randomized from that prefix. If left unspecified, a real IPv6 address of the specified network interface is used.
-
-Note: When operating in "listening" mode, the Source Address is automatically set to the Destination Address of the incoming packet.
+This option specifies the IPv6 source address (or IPv6 prefix) to be used for the Source Address of the outgoing packets. If an IPv6 prefix is specified, the IPv6 Source Address of the outgoing packets will be randomized from that prefix.
 
 .TP
-\-\-dst\-address, \-d
-
-This option specifies the IPv6 Destination Address of the victim. It can be left unspecified only if the "\-L" option is selected (i.e., if the tool is to operate in "listening" mode).
+.BI \-d\  DST_ADDR ,\ \-\-dst\-address\  DST_ADDR
 
-Note: When operating in "listening" mode, the Destination Address is automatically set to the Source Address of the incoming packet.
+This option specifies the IPv6 Destination Address of the target node. This option cannot be left unspecified.
 
 .TP
 \-\-hop\-limit, \-A
@@ -56,24 +49,24 @@ Note: When operating in "listening" mode, the Destination Address is automatical
 This option specifies the Hop Limit to be used for the IPv6 packets. By default, the Hop Limit is randomized.
 
 .TP
-\-\-frag\-hdr, \-y
+.BI \-y\  SIZE ,\ \-\-frag\-hdr\  SIZE
 
 This option specifies that the resulting packet must be fragmented. The fragment size must be specified as an argument to this option.
 
 .TP
-\-\-dst\-opt\-hdr, \-u
+.BI \-u\  HDR_SIZE ,\ \-\-dst\-opt\-hdr\  HDR_SIZE
 
 This option specifies that a Destination Options header is to be included in the resulting packet. The extension header size must be specified as an argument to this option (the header is filled with padding options). Multiple Destination Options headers may be specified by means of multiple "\-u" options.
 
 .TP
-\-\-dst\-opt\-u\-hdr, \-U
+.BI \-U\  HDR_SIZE ,\ \-\-dst\-opt\-u\-hdr\  HDR_SIZE
 
 This option specifies a Destination Options header to be included in the "unfragmentable part" of the resulting packet. The header size must be specified as an argument to this option (the header is filled with padding options). Multiple Destination Options headers may be specified by means of multiple "\-U" options. This option is only valid if the "\-y" option is specified (as the concept of "unfragmentable part" only makes sense when fragmentation is employed).
 
 .TP
-\-\-hbh\-opt\-hdr, \-H
+.BI \-H\  HDR_SIZE ,\ \-\-hbh\-opt\-hdr\  HDR_SIZE
 
-This option specifies that a Hop-by-Hop Options header is to be included in the resulting packet. The header size must be specified as an argument to this option (the header is filled with padding options). Multiple Hop-by-Hop Options headers may be specified by means of multiple "\-H" options.
+This option specifies that a Hop-by-Hop Options header is to be included in the resulting packet. The header size must be specified as an argument to this option (the header is filled with padding options). Multiple Hop\-by\-Hop Options headers may be specified by means of multiple "\-H" options.
 
 .TP
 \-\-ipv6\-length, \-q
@@ -91,49 +84,9 @@ This option specifies the value to which the "Jumbo Payload Length" field of the
 This options specifies the size of the jumbo payload.  If left unspecified, the payload size is set to 0.
 
 .TP
-\-\-block\-src, \-j
-
-This option sets a block filter for the incoming packets, based on their IPv6 Source Address. It allows the specification of an IPv6 prefix in the form "\-j prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
-
-.TP
-\-\-block\-dst, \-k
-
-This option sets a block filter for the incoming packets, based on their IPv6 Destination Address. It allows the specification of an IPv6 prefix in the form "\-k prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
-
-.TP
-\-\-block\-link\-src, \-J
-
-This option sets a block filter for the incoming packets, based on their link-layer Source Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
-
-.TP
-\-\-block\-link\-dst, \-K
-
-This option sets a block filter for the incoming packets, based on their link-layer Destination Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
-
-.TP
-\-\-accept\-src, \-b
-
-This option sets an accept filter for the incoming packets, based on their IPv6 Source Address. It allows the specification of an IPv6 prefix in the form "\-b prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
-
-.TP
-\-\-accept\-dst, \-g
-
-This option sets a accept filter for the incoming packets, based on their IPv6 Destination Address. It allows the specification of an IPv6 prefix in the form "\-g prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
-
-.TP
-\-\-accept\-link\-src, \-B
-
-This option sets an accept filter for the incoming packets, based on their link-layer Source Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
-
-.TP
-\-\-accept\-link\-dst, \-G
-
-This option sets an accept filter for the incoming packets, based on their link-layer Destination Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
-
-.TP
 \-\-loop, \-l
 
-This option instructs the jumbo6 tool to send periodic IPv6 jumbograms to the victim node. The amount of time to pause between sending IPv6 jumbograms can be specified by means of the "\-z" option, and defaults to 1 second. Note that this option cannot be set in conjunction with the "\-L" ("\-\-listen") option.
+This option instructs the jumbo6 tool to send periodic IPv6 jumbograms to the victim node. The amount of time to pause between sending IPv6 jumbograms can be specified by means of the "\-z" option, and defaults to 1 second.
 
 .TP
 \-\-sleep, \-z
@@ -141,11 +94,6 @@ This option instructs the jumbo6 tool to send periodic IPv6 jumbograms to the vi
 This option specifies the amount of time to pause between sending IPv6 jumbograms (when the "\-\-loop" option is set). If left unspecified, it defaults to 1 second.
 
 .TP
-\-\-listen, \-L
-
-This option instructs the jumbo6 tool to operate in listening mode (possibly after attacking a given node, if a target was specified with the "\-d" option). Note that this option cannot be used in conjunction with the "\-l" ("\-\-loop") option.
-
-.TP
 \-\-verbose, \-v
 
 This option instructs the jumbo6 tool to be verbose.  When the option is set twice, the tool is "very verbose", and the tool also informs which packets have been accepted or discarded as a result of applying the specified filters. 
@@ -163,16 +111,10 @@ tool.
 
 \fBExample #1\fR
 
-# jumbo6 \-i eth0 \-s fc00:1::/64 \-d fc00:1::1 \-P 100
+# jumbo6 \-s fc00:1::/64 \-d fc00:1::1 \-P 100
 
 Send an IPv6 jumbogram to the host fc00:1::1. The IPv6 Source Address will be randomly selected from the prefix fc00:1::/64, and a the payload of 100 bytes is included in the packet.
 
-\fBExample #2\fR
-
-# jumbo6 \-i eth0 \-L \-b 2001:db8::1 \-v
-
-Listen on the eth0 interface to incoming packets with the IPv6 Source Address set to "2001:db8::1", and respond to such packets with an IPv6 jumbogram. Be verbose.
-
 .SH AUTHOR
 The
 .B jumbo6
@@ -184,6 +126,5 @@ for SI6 Networks
 .SH COPYRIGHT
 Copyright (c) 2011\-2013 Fernando Gont.
 
-Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being just "AUTHOR" and "COPYRIGHT", with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the license is available at
+Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front\-Cover Texts, and no Back\-Cover Texts.  A copy of the license is available at
 .IR <http://www.gnu.org/licenses/fdl.html> .
-
index 29586ea..d7d6ff8 100644 (file)
@@ -3,11 +3,13 @@
 na6 \- A security assessment tool for attack vectors based on ICMPv6 Neighbor Advertisement messages
 .SH SYNOPSIS
 .B na6
-\-i INTERFACE [\-s SRC_ADDR[/LEN]] [\-d DST_ADDR] [\-S LINK_SRC_ADDR] [\-y FRAG_SIZE] [\-u DST_OPT_HDR_SIZE] [\-U DST_OPT_U_HDR_SIZE] [\-H HBH_OPT_HDR_SIZE] [\-D LINK-DST-ADDR] [\-t TARGET_ADDR[/LEN]] [\-r] [\-c] [\-o] [\-E LINK_ADDR] [\-e] [\-j PREFIX[/LEN]] [\-k PREFIX[/LEN]] [\-J LINK_ADDR] [\-K LINK_ADDR] [\-w PREFIX[/LEN]] [\-b PREFIX[/LEN]] [\-g PREFIX[/LEN]] [\-B LINK_ADDR] [\-G LINK_ADDR] [\-W PREFIX[/LEN]] [\-F N_SOURCES] [\-T N_TARGETS] [\-L | \-l] [\-z] [\-v] [\-V] [\-h]
+.RB [\| \-i
+.IR INTERFACE\| ]
+[\-s SRC_ADDR[/LEN]] [\-d DST_ADDR] [\-S LINK_SRC_ADDR] [\-y FRAG_SIZE] [\-u DST_OPT_HDR_SIZE] [\-U DST_OPT_U_HDR_SIZE] [\-H HBH_OPT_HDR_SIZE] [\-D LINK-DST-ADDR] [\-t TARGET_ADDR[/LEN]] [\-r] [\-c] [\-o] [\-E LINK_ADDR] [\-e] [\-j PREFIX[/LEN]] [\-k PREFIX[/LEN]] [\-J LINK_ADDR] [\-K LINK_ADDR] [\-w PREFIX[/LEN]] [\-b PREFIX[/LEN]] [\-g PREFIX[/LEN]] [\-B LINK_ADDR] [\-G LINK_ADDR] [\-W PREFIX[/LEN]] [\-F N_SOURCES] [\-T N_TARGETS] [\-L | \-l] [\-z] [\-v] [\-V] [\-h]
 
 .SH DESCRIPTION
 .B na6
-allows the assessment of IPv6 implementations with respect to a variety of attack vectors based on ICMPv6 Neighbor Advertisement messages. It is part of the IPv6 Toolkit v1.3: a security assessment suite for the IPv6 Protocols.
+allows the assessment of IPv6 implementations with respect to a variety of attack vectors based on ICMPv6 Neighbor Advertisement messages. It is part of the SI6 Networks' IPv6 Toolkit: a security assessment suite for the IPv6 Protocols.
 
 This tool has two modes of operation: active and passive. In active mode, the tool attacks a specific target, while in passive mode the tool listens to traffic on the local network, and launches an attack in response to such traffic. Active mode is employed if a destination address (IPv6 Destination Address or Ethernet Destination Address) and a Target Address are specified. Passive mode is employed if the "\-L" option (or its long counterpart "\-\-listen") is set. If both an attack target and the "\-L" option are set, the attack is launched against the specified target, and then the tool enters passive mode to respond incoming Neighbor Solicitation messages with Neighbor Advertisement (attack) packets.
 
@@ -20,19 +22,18 @@ takes its parameters as command-line options. Each of the options can be specifi
 Depending on the amount of information (i.e., options) to be conveyed into the Neighbor Advertisements, it may be necessary for the na6 tool to split that information into more than one Neighbor Advertisement message. Also, if the tool is instructed to flood the victim with Neighbor Advertisements from different sources ("\-\-flood\-sources" option), multiple packets may need to be generated. na6 supports IPv6 fragmentation, which may be of use if a large amount of information needs to be conveyed within a single Neighbor Advertisement message. However, IPv6 fragmentation is not enabled by default, and must be explicitly enabled with the "\-y" option.
 
 .TP
-\-\-interface, \-i
-
-This option specifies the network interface that the tool will use. The network interface must be specified (i.e., the tool does not select any network interface "by default").
+.BI \-i\  INTERFACE ,\ \-\-interface\  INTERFACE
+This option specifies the network interface that the tool will use. If the destination address ("\-d" option) is a link-local address, or the "listening" ("\-L") mode is selected, the interface must be explicitly specified. The interface may also be specified along with a destination address, with the "\-d" option.
 
 .TP
-\-\-src\-address, \-s
+.BI \-s\  SRC_ADDR ,\ \-\-src\-address\  SRC_ADDR
 
 This option specifies the IPv6 source address (or IPv6 prefix) to be used for the Source Address of the attack packets. If left unspecified, a random link-local unicast address (fe80::/64) is selected. 
 
 If the "\-T" ("\-\-flood\-targets") option is specified, this option includes an IPv6 prefix. See the description of the "\-T" option for further information on how the "\-s" option is processed in that specific case.
 
 .TP
-\-\-dst\-address, \-d
+.BI \-d\  DST_ADDR ,\ \-\-dst\-address\  DST_ADDR
 
 This option specifies the IPv6 Destination Address of the victim. If left unspecified, but the Ethernet Destination Address is specified, the "all-nodes link-local multicast" address (ff02::1) is selected as the IPv6 Destination Address. 
 
@@ -44,40 +45,40 @@ When operating in passive mode ("\-L" option), the IPv6 Destination Address is s
 This option specifies the Hop Limit to be used for the Neighbor Advertisement messages. It defaults to 255. Note that IPv6 nodes are required to check that the Hop Limit of incoming Neighbor Advertisement messages is 255. Therefore, this option is only useful to assess whether an IPv6 implementation fails to enforce the aforementioned check.
 
 .TP
-\-\-frag\-hdr, \-y
+.BI \-y\  SIZE ,\ \-\-frag\-hdr\  SIZE
 
 This option specifies that the resulting packet must be fragmented. The fragment size must be specified as an argument to this option.
 
 .TP
-\-\-dst\-opt\-hdr, \-u
+.BI \-u\  HDR_SIZE ,\ \-\-dst\-opt\-hdr\  HDR_SIZE
 
 This option specifies that a Destination Options header is to be included in the resulting packet. The extension header size must be specified as an argument to this option (the header is filled with padding options). Multiple Destination Options headers may be specified by means of multiple "\-u" options.
 
 .TP
-\-\-dst\-opt\-u\-hdr, \-U
+.BI \-U\  HDR_SIZE ,\ \-\-dst\-opt\-u\-hdr\  HDR_SIZE
 
 This option specifies a Destination Options header to be included in the "unfragmentable part" of the resulting packet. The header size must be specified as an argument to this option (the header is filled with padding options). Multiple Destination Options headers may be specified by means of multiple "\-U" options. This option is only valid if the "\-y" option is specified (as the concept of "unfragmentable part" only makes sense when fragmentation is employed).
 
 .TP
-\-\-hbh\-opt\-hdr, \-H
+.BI \-H\  HDR_SIZE ,\ \-\-hbh\-opt\-hdr\  HDR_SIZE
 
-This option specifies that a Hop-by-Hop Options header is to be included in the resulting packet. The header size must be specified as an argument to this option (the header is filled with padding options). Multiple Hop-by-Hop Options headers may be specified by means of multiple "\-H" options.
+This option specifies that a Hop-by-Hop Options header is to be included in the resulting packet. The header size must be specified as an argument to this option (the header is filled with padding options). Multiple Hop\-by\-Hop Options headers may be specified by means of multiple "\-H" options.
 
 .TP
-\-\-src\-link\-address, \-S
+.BI \-S\  SRC_LINK_ADDR ,\ \-\-src\-link\-address\  SRC_LINK_ADDR
 
-This option specifies the link-layer Source Address of the Neighbor Advertisement messages (currently, only Ethernet is supported). If left unspecified, the link-layer Source Address is randomized.
+This option specifies the link\-layer Source Address of the Neighbor Advertisement messages (this option is only valid for Ethernet interfaces). If left unspecified, the link\-layer Source Address is randomized.
 
-When operating in passive mode, the link-layer Source Address is selected according to the IPv6 Destination Address of the incoming Neighbor Solicitation message. 
-If the IPv6 Destination Address of the incoming Neighbor Solicitation message is a multicast address (usually a solicited-node multicast address), the link-layer Source Address is set to the address specified by the "\-S" option (or to a random address if the "\-S" option was left unspecified). If the IPv6 Destination Address of the incoming Neighbor Solicitation is not a multicast address (i.e., it is a unicast address), the link-layer Source Address is set to the Ethernet Destination Address of the incoming Neighbor Solicitation message.
+When operating in passive mode, the link\-layer Source Address is selected according to the IPv6 Destination Address of the incoming Neighbor Solicitation message. 
+If the IPv6 Destination Address of the incoming Neighbor Solicitation message is a multicast address (usually a solicited-node multicast address), the link\-layer Source Address is set to the address specified by the "\-S" option (or to a random address if the "\-S" option was left unspecified). If the IPv6 Destination Address of the incoming Neighbor Solicitation is not a multicast address (i.e., it is a unicast address), the link\-layer Source Address is set to the Ethernet Destination Address of the incoming Neighbor Solicitation message.
 
 .TP
-\-\-link\-dst\-address, \-D
+.BI \-D\  DST_LINK_ADDR ,\ \-\-dst\-link\-address\  DST_LINK_ADDR
 
-This option specifies the link-layer Destination Address of the Neighbor Advertisement messages (currently, only Ethernet is supported). If left unspecified, it is set to the "all-nodes link-local multicast" address (ff02::1).
+This option specifies the link\-layer Destination Address of the Neighbor Advertisement messages (this option is only valid for Ethernet interfaces). If left unspecified, it is set to the "all-nodes link-local multicast" address (ff02::1).
 
-When operating in passive mode, the link-layer Destination Address is set according to the IPv6 Source Address of the incoming Neighbor Solicitation message. 
-If the IPv6 Source Address of the incoming Neighbor Solicitation message is the unspecified address (::), the link-layer destination address is set to "33:33:00:00:00:01" (the Ethernet multicast address corresponding to the IPv6 "all-nodes link-local multicast" address). Otherwise, the link-layer Destination Address is set to the link-layer Source Address of the incoming Neighbor Solicitation message.
+When operating in passive mode, the link\-layer Destination Address is set according to the IPv6 Source Address of the incoming Neighbor Solicitation message. 
+If the IPv6 Source Address of the incoming Neighbor Solicitation message is the unspecified address (::), the link\-layer destination address is set to "33:33:00:00:00:01" (the Ethernet multicast address corresponding to the IPv6 "all-nodes link-local multicast" address). Otherwise, the link\-layer Destination Address is set to the link\-layer Source Address of the incoming Neighbor Solicitation message.
 
 .TP
 \-\-router, \-r
@@ -104,57 +105,57 @@ If the "\-T" ("\-\-flood\-targets") option is specified, this option specifies a
 .TP
 \-\-target\-lla\-opt, \-E
 
-This option specifies the contents of a target link-layer address option to be included in the Neighbor Advertisement messages. If a single option is specified, it is included in all the outgoing Neighbor Advertisement messages. If more than one target link-layer address is specified (by means of multiple "\-E" options), and all the resulting options cannot be conveyed into a single Neighbor Advertisement message, multiple Neighbor Advertisements will be sent as needed.
+This option specifies the contents of a target link\-layer address option to be included in the Neighbor Advertisement messages. If a single option is specified, it is included in all the outgoing Neighbor Advertisement messages. If more than one target link\-layer address is specified (by means of multiple "\-E" options), and all the resulting options cannot be conveyed into a single Neighbor Advertisement message, multiple Neighbor Advertisements will be sent as needed.
 
 .TP
 \-\-add\-tlla\-opt, \-e
 
-This option instructs the na6 tool to include a target link-layer address option in the Neighbor Advertisement messages that it sends. The target link-layer address included in the option is the same as the Ethernet Source Address used for the outgoing Neighbor Advertisement messages. The difference between this option and the "\-E" option is that the "\-e" option does not specify the actual value of the option, but just instructs the tool to include a target link-layer address option (the actual value of the option is selected as explained before).
+This option instructs the na6 tool to include a target link\-layer address option in the Neighbor Advertisement messages that it sends. The target link\-layer address included in the option is the same as the Ethernet Source Address used for the outgoing Neighbor Advertisement messages. The difference between this option and the "\-E" option is that the "\-e" option does not specify the actual value of the option, but just instructs the tool to include a target link\-layer address option (the actual value of the option is selected as explained before).
 
 .TP
-\-\-block\-src, \-j
+.BI \-j\  SRC_ADDR ,\ \-\-block\-src\  SRC_ADDR
 
-This option sets a block filter for the incoming Neighbor Solicitation messages, based on their IPv6 Source Address. It allows the specification of an IPv6 prefix in the form "\-j prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
+This option sets a block filter for the incoming packets, based on their IPv6 Source Address. It allows the specification of an IPv6 prefix in the form "\-j prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
 
 .TP
-\-\-block\-dst, \-k
+.BI \-k\  DST_ADDR ,\ \-\-block\-dst\  DST_ADDR
 
 This option sets a block filter for the incoming Neighbor Solicitation messages, based on their IPv6 Destination Address. It allows the specification of an IPv6 prefix in the form "\-k prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
 
 .TP
-\-\-block\-link\-src, \-J
+.BI \-J\  SRC_ADDR ,\ \-\-block\-link\-src\  SRC_ADDR
 
-This option sets a block filter for the incoming Neighbor Solicitation messages, based on their link-layer Source Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
+This option sets a block filter for the incoming packets, based on their link\-layer Source Address. The option must be followed by a link\-layer address (this option is only valid for Ethernet interfaces).
 
 .TP
-\-\-block\-link\-dst, \-K
+.BI \-K\  DST_ADDR ,\ \-\-block\-link\-dst\  DST_ADDR
 
-This option sets a block filter for the incoming Neighbor Solicitation messages, based on their link-layer Destination Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
+This option sets a block filter for the incoming packets, based on their link\-layer Destination Address. The option must be followed by a link\-layer address (this option is only valid for Ethernet interfaces).
 
 .TP
-\-\-block\-target, \-w
+.BI \-b\  SRC_ADDR ,\ \-\-accept\-src\  SRC_ADDR
 
-This option sets a block filter for the incoming Neighbor Solicitation messages, based on their Target Address. It allows the specification of an IPv6 prefix in the form "\-w prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
+This option sets an accept filter for the incoming packets, based on their IPv6 Source Address. It allows the specification of an IPv6 prefix in the form "\-b prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
 
 .TP
-\-\-accept\-src, \-b
+.BI \-g\  DST_ADDR ,\ \-\-accept\-dst\  DST_ADDR
 
-This option sets an accept filter for the incoming Neighbor Solicitation messages, based on their IPv6 Source Address. It allows the specification of an IPv6 prefix in the form "\-b prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
+This option sets a accept filter for the incoming packets, based on their IPv6 Destination Address. It allows the specification of an IPv6 prefix in the form "\-g prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
 
 .TP
-\-\-accept\-dst, \-g
+.BI \-B\  SRC_ADDR ,\ \-\-accept\-link\-src\  SRC_ADDR
 
-This option sets a accept filter for the incoming Neighbor Solicitation messages, based on their IPv6 Destination Address. It allows the specification of an IPv6 prefix in the form "\-g prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
+This option sets an accept filter for the incoming Neighbor Solicitation messages, based on their link\-layer Source Address. The option must be followed by a link\-layer address (this option is only valid for Ethernet interfaces).
 
 .TP
-\-\-accept\-link\-src, \-B
+.BI \-G\  DST_ADDR ,\ \-\-accept\-link\-dst\  DST_ADDR
 
-This option sets an accept filter for the incoming Neighbor Solicitation messages, based on their link-layer Source Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
+This option sets an accept filter for the incoming packets, based on their link\-layer Destination Address. The option must be followed by a link\-layer address (this option is only valid for Ethernet interfaces).
 
 .TP
-\-\-accept\-link\-dst, \-K
+\-\-block\-target, \-w
 
-This option sets an accept filter for the incoming Neighbor Solicitation messages, based on their link-layer Destination Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
+This option sets a block filter for the incoming Neighbor Solicitation messages, based on their Target Address. It allows the specification of an IPv6 prefix in the form "\-w prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
 
 .TP
 \-\-accept\-target, \-W
@@ -206,7 +207,7 @@ tool.
 
 # na6 \-i eth0 \-d fe80::1 \-t 2001:db8::1 \-c \-o \-e
 
-Use the network interface "eth0" to send a Neighbor Advertisement using a random link-local unicast IPv6 Source Address and a random Ethernet Source Address, to the IPv6 Destination address ffe80::1 and the Ethernet Destination Address 33:33:00:00:00:01 (selected by default). The target of the Neighbor Advertisement is 2001:db8::1, and the message has both the "Override" and the "Solicited" flags set. The Neighbor Advertisement also includes a target link-layer address option that contains the same Ethernet address as that used for the Ethernet Source Address of the packet. 
+Use the network interface "eth0" to send a Neighbor Advertisement using a random link-local unicast IPv6 Source Address and a random Ethernet Source Address, to the IPv6 Destination address ffe80::1 and the Ethernet Destination Address 33:33:00:00:00:01 (selected by default). The target of the Neighbor Advertisement is 2001:db8::1, and the message has both the "Override" and the "Solicited" flags set. The Neighbor Advertisement also includes a target link\-layer address option that contains the same Ethernet address as that used for the Ethernet Source Address of the packet. 
 
 \fBExample #2\fR
 
@@ -215,7 +216,7 @@ Use the network interface "eth0" to send a Neighbor Advertisement using a random
 Listen for incoming Neighbor Solicitation messages on the interface "eth0". Discard those messages that have an IPv6 Source Address equal to fe80::1, an IPv6 Source Address that belongs to the prefix 2001:db8::/32, or a Target Address that does not belong to the prefix fe80::/64. Respond (to those messages that are accepted) with a Neighbor Advertisement with a randomized Ethernet Source Address and a randomized link-local unicast IPv6 Source Address (unless the Destination Address of the Neighbor Solicitation was a unicast address), the IPv6 Destination Address set to the Source Address of the incoming NS message (unless it was the unspecified address), the Target Address set to the same value as the Target Address of the incoming NS, and the "Solicited" and "Override" flags set. Be very verbose ("\-v \-v" options).
 
 .SH SEE ALSO
-"Security/Robustness Assessment of IPv6 Neighbor Discovery Implementations" (available at: <http://www.si6networks.com/tools/ipv6toolkit/si6networks-ipv6\-nd-assessment.pdf>) for a discussion of Neighbor Discovery vulnerabilities, and additional examples of how to use the na6 tool to exploit them.
+"Security/Robustness Assessment of IPv6 Neighbor Discovery Implementations" (available at: <http://www.si6networks.com/tools/ipv6toolkit/si6networks\-ipv6\-nd\-assessment.pdf>) for a discussion of Neighbor Discovery vulnerabilities, and additional examples of how to use the na6 tool to exploit them.
 
 .SH AUTHOR
 The
@@ -228,6 +229,5 @@ for SI6 Networks
 .SH COPYRIGHT
 Copyright (c) 2011\-2013 Fernando Gont.
 
-Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being just "AUTHOR" and "COPYRIGHT", with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the license is available at
+Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front\-Cover Texts, and no Back\-Cover Texts.  A copy of the license is available at
 .IR <http://www.gnu.org/licenses/fdl.html> .
-
index 801749a..09c59da 100644 (file)
@@ -3,7 +3,9 @@
 nI6 \- A security assessment tool for attack vectors based on ICMPv6 Node Information messages
 .SH SYNOPSIS
 .B ni6
-\-i INTERFACE [\-S LINK_SRC_ADDR | \-R] [\-D LINK_DST_ADDR] [\-s SRC_ADDR[/LEN] | \-r] [\-d DST_ADDR] [\-c HOP_LIMIT] [\-y FRAG_SIZE] [\-u DST_OPT_HDR_SIZE] [\-U DST_OPT_U_HDR_SIZE] [\-H HBH_OPT_HDR_SIZE] [\-P SIZE | \-6 IPV6_ADDR | \-4 IPV4_ADDR | \-n NAME | \-N LEN | \-x LEN \-o TYPE] [\-Z SIZE] [\-e] [\-C ICMP6_CODE] [\-q NI_QTYPE] [\-X NI_FLAGS] [\-P SIZE | \-w IPV6_ADDR | \-W IPV4_ADDR | \-a NAME | \-A LEN | \-Q LEN \-O TYPE] [\-E] [\-j PREFIX[/LEN]] [\-k PREFIX[/LEN]] [\-J LINK_ADDR] [\-K LINK_ADDR] [\-b PREFIX[/LEN]] [\-g PREFIX[/LEN]] [\-B LINK_ADDR] [\-G LINK_ADDR] [\-L | \-l] [\-z] [\-v] [\-h]
+.RB [\| \-i
+.IR INTERFACE\| ]
+[\-S LINK_SRC_ADDR | \-R] [\-D LINK_DST_ADDR] [\-s SRC_ADDR[/LEN] | \-r] [\-d DST_ADDR] [\-c HOP_LIMIT] [\-y FRAG_SIZE] [\-u DST_OPT_HDR_SIZE] [\-U DST_OPT_U_HDR_SIZE] [\-H HBH_OPT_HDR_SIZE] [\-P SIZE | \-6 IPV6_ADDR | \-4 IPV4_ADDR | \-n NAME | \-N LEN | \-x LEN \-o TYPE] [\-Z SIZE] [\-e] [\-C ICMP6_CODE] [\-q NI_QTYPE] [\-X NI_FLAGS] [\-P SIZE | \-w IPV6_ADDR | \-W IPV4_ADDR | \-a NAME | \-A LEN | \-Q LEN \-O TYPE] [\-E] [\-j PREFIX[/LEN]] [\-k PREFIX[/LEN]] [\-J LINK_ADDR] [\-K LINK_ADDR] [\-b PREFIX[/LEN]] [\-g PREFIX[/LEN]] [\-B LINK_ADDR] [\-G LINK_ADDR] [\-L | \-l] [\-z] [\-v] [\-h]
 
 .SH DESCRIPTION
 .B ni6
@@ -20,19 +22,18 @@ takes it parameters as command-line options. Each of the options can be specifie
 ni6 supports IPv6 Extension Headers, including the IPv6 Fragmentation Header, which might be of use to circumvent layer-2 filtering and/or Network Intrusion Detection Systems (NIDS). However, IPv6 extension headers are not employed by default, and must be explicitly enabled with the corresponding options.
 
 .TP
-\-\-interface, \-i
-
-This option specifies the network interface that the tool will use. The network interface must be specified (i.e., the tool does not select any network interface "by default").
+.BI \-i\  INTERFACE ,\ \-\-interface\  INTERFACE
+This option specifies the network interface that the tool will use. If the destination address ("\-d" option) is a link-local address, or the "listening" ("\-L") mode is selected, the interface must be explicitly specified. The interface may also be specified along with a destination address, with the "\-d" option.
 
 .TP
-\-\-src\-address, \-s
+.BI \-s\  SRC_ADDR ,\ \-\-src\-address\  SRC_ADDR
 
 This option specifies the IPv6 source address (or IPv6 prefix) to be used for the Source Address of the attack packets. If an IPv6 prefix is specified, the IPv6 Source Address of the ICMPv6 packets will be randomized from the specified prefix.
 
 Note: When operating in "listening" mode, the Source Address is automatically selected depending on the IPv6 Destination Address of the ICMPv6 NI Query (unless a specific IPv6 Source Address has been specified with the "\-s" option).
 
 .TP
-\-\-dst\-address, \-d
+.BI \-d\  DST_ADDR ,\ \-\-dst\-address\  DST_ADDR
 
 This option specifies the IPv6 Destination Address of the victim. It can be left unspecified only if the "\-L" option is selected (i.e., if the tool is to operate in "listening" mode).
 
@@ -44,34 +45,34 @@ Note: When operating in "listening" mode, the Destination Address is automatical
 This option specifies the Hop Limit to be used for the IPv6 packets. It is randomized by default.
 
 .TP
-\-\-frag\-hdr, \-y
+.BI \-y\  SIZE ,\ \-\-frag\-hdr\  SIZE
 
 This option specifies that the resulting packet must be fragmented. The fragment size must be specified as an argument to this option.
 
 .TP
-\-\-dst\-opt\-hdr, \-u
+.BI \-u\  HDR_SIZE ,\ \-\-dst\-opt\-hdr\  HDR_SIZE
 
 This option specifies that a Destination Options header is to be included in the resulting packet. The extension header size must be specified as an argument to this option (the header is filled with padding options). Multiple Destination Options headers may be specified by means of multiple "\-u" options.
 
 .TP
-\-\-dst\-opt\-u\-hdr, \-U
+.BI \-U\  HDR_SIZE ,\ \-\-dst\-opt\-u\-hdr\  HDR_SIZE
 
 This option specifies a Destination Options header to be included in the "unfragmentable part" of the resulting packet. The header size must be specified as an argument to this option (the header is filled with padding options). Multiple Destination Options headers may be specified by means of multiple "\-U" options. This option is only valid if the "\-y" option is specified (as the concept of "unfragmentable part" only makes sense when fragmentation is employed).
 
 .TP
-\-\-hbh\-opt\-hdr, \-H
+.BI \-H\  HDR_SIZE ,\ \-\-hbh\-opt\-hdr\  HDR_SIZE
 
-This option specifies that a Hop-by-Hop Options header is to be included in the resulting packet. The header size must be specified as an argument to this option (the header is filled with padding options). Multiple Hop-by-Hop Options headers may be specified by means of multiple "\-H" options.
+This option specifies that a Hop-by-Hop Options header is to be included in the resulting packet. The header size must be specified as an argument to this option (the header is filled with padding options). Multiple Hop\-by\-Hop Options headers may be specified by means of multiple "\-H" options.
 
 .TP
-\-\-src\-link\-address, \-S
+.BI \-S\  SRC_LINK_ADDR ,\ \-\-src\-link\-address\  SRC_LINK_ADDR
 
-This option specifies the link-layer Source Address of the TCP segments (currently, only Ethernet is supported). If left unspecified, the link-layer Source Address is set to the real link-layer address of the network interface.
+This option specifies the link\-layer Source Address of the TCP segments. If left unspecified, the link\-layer Source Address is set to the real link\-layer address of the network interface.
 
 .TP
-\-\-link\-dst\-address, \-D
+.BI \-D\  DST_LINK_ADDR ,\ \-\-dst\-link\-address\  DST_LINK_ADDR
 
-This option specifies the link-layer Destination Address of the ICMPv6 NI packets (currently, only Ethernet is supported). By default, the link-layer Destination Address is automatically set to the link-layer address of the destination host (for on-link destinations) or to the link-layer of the first-hop router. 
+This option specifies the link\-layer Destination Address of the ICMPv6 NI packets. By default, the link\-layer Destination Address is automatically set to the link\-layer address of the destination host (for on-link destinations) or to the link\-layer of the first-hop router. 
 
 .TP
 \-\-payload\-size, \-P
@@ -173,47 +174,47 @@ This option specifies that the Data field should be set to a Name that contains
 .TP
 \-\-dname\-slabel, \-E
 
-This option specifies that the specified Data Name is a single-label name, and hence should be terminated with two (rather than one) NULL labels.
+This option specifies that the specified Data Name is a single\-label name, and hence should be terminated with two (rather than one) NULL labels.
 
 .TP
-\-\-block\-src, \-j
+.BI \-j\  SRC_ADDR ,\ \-\-block\-src\  SRC_ADDR
 
 This option sets a block filter for the incoming packets, based on their IPv6 Source Address. It allows the specification of an IPv6 prefix in the form "\-j prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
 
 .TP
-\-\-block\-dst, \-k
+.BI \-k\  DST_ADDR ,\ \-\-block\-dst\  DST_ADDR
 
-This option sets a block filter for the incoming packets, based on their IPv6 Destination Address. It allows the specification of an IPv6 prefix in the form "\-k prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
+This option sets a block filter for the incoming Neighbor Solicitation messages, based on their IPv6 Destination Address. It allows the specification of an IPv6 prefix in the form "\-k prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
 
 .TP
-\-\-block\-link\-src, \-J
+.BI \-J\  SRC_ADDR ,\ \-\-block\-link\-src\  SRC_ADDR
 
-This option sets a block filter for the incoming packets, based on their link-layer Source Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
+This option sets a block filter for the incoming packets, based on their link\-layer Source Address. The option must be followed by a link\-layer address (this option is only valid for Ethernet interfaces).
 
 .TP
-\-\-block\-link\-dst, \-K
+.BI \-K\  DST_ADDR ,\ \-\-block\-link\-dst\  DST_ADDR
 
-This option sets a block filter for the incoming packets, based on their link-layer Destination Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
+This option sets a block filter for the incoming packets, based on their link\-layer Destination Address. The option must be followed by a link\-layer address (this option is only valid for Ethernet interfaces).
 
 .TP
-\-\-accept\-src, \-b
+.BI \-b\  SRC_ADDR ,\ \-\-accept\-src\  SRC_ADDR
 
 This option sets an accept filter for the incoming packets, based on their IPv6 Source Address. It allows the specification of an IPv6 prefix in the form "\-b prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
 
 .TP
-\-\-accept\-dst, \-g
+.BI \-g\  DST_ADDR ,\ \-\-accept\-dst\  DST_ADDR
 
 This option sets a accept filter for the incoming packets, based on their IPv6 Destination Address. It allows the specification of an IPv6 prefix in the form "\-g prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
 
 .TP
-\-\-accept\-link\-src, \-B
+.BI \-B\  SRC_ADDR ,\ \-\-accept\-link\-src\  SRC_ADDR
 
-This option sets an accept filter for the incoming packets, based on their link-layer Source Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
+This option sets an accept filter for the incoming Neighbor Solicitation messages, based on their link\-layer Source Address. The option must be followed by a link\-layer address (this option is only valid for Ethernet interfaces).
 
 .TP
-\-\-accept\-link\-dst, \-K
+.BI \-G\  DST_ADDR ,\ \-\-accept\-link\-dst\  DST_ADDR
 
-This option sets an accept filter for the incoming packets, based on their link-layer Destination Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
+This option sets an accept filter for the incoming packets, based on their link\-layer Destination Address. The option must be followed by a link\-layer address (this option is only valid for Ethernet interfaces).
 
 .TP
 \-\-forge\-src\-addr, \-r
@@ -223,9 +224,9 @@ This option instructs the ni6 tool to forge the IPv6 Source Address of ICMPv6 NI
 .TP
 \-\-forge\-link\-src\-addr, \-R
 
-This option instructs the ni6 tool to forge the link-layer Source Address of ICMPv6 NI messages. 
+This option instructs the ni6 tool to forge the link\-layer Source Address of ICMPv6 NI messages. 
 
-Note: Some interface cards (or their corresponding drivers) may silently discard packets that contain a forged link-layer Source Address.
+Note: Some interface cards (or their corresponding drivers) may silently discard packets that contain a forged link\-layer Source Address.
 
 .TP
 \-\-loop, \-l
@@ -281,6 +282,5 @@ for SI6 Networks
 .SH COPYRIGHT
 Copyright (c) 2011\-2013 Fernando Gont.
 
-Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being just "AUTHOR" and "COPYRIGHT", with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the license is available at
+Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front\-Cover Texts, and no Back\-Cover Texts.  A copy of the license is available at
 .IR <http://www.gnu.org/licenses/fdl.html> .
-
index 4d35ad2..7cf611e 100644 (file)
@@ -3,7 +3,9 @@
 ns6 \- A security assessment tool for attack vectors based on ICMPv6 Neighbor Solicitation messages
 .SH SYNOPSIS
 .B ns6
-\-i INTERFACE [\-s SRC_ADDR[/LEN]] [\-d DST_ADDR] [\-y FRAG_SIZE] [\-u DST_OPT_HDR_SIZE] [\-U DST_OPT_U_HDR_SIZE] [\-H HBH_OPT_HDR_SIZE] [\-S LINK_SRC_ADDR] [\-D LINK-DST-ADDR] [\-E LINK_ADDR] [\-e] [\-t TARGET_ADDR[/LEN]] [\-F N_SOURCES] [\-T N_TARGETS] [\-z SECONDS] [\-l] [\-v] [\-h]
+.RB [\| \-i
+.IR INTERFACE\| ]
+[\-s SRC_ADDR[/LEN]] [\-d DST_ADDR] [\-y FRAG_SIZE] [\-u DST_OPT_HDR_SIZE] [\-U DST_OPT_U_HDR_SIZE] [\-H HBH_OPT_HDR_SIZE] [\-S LINK_SRC_ADDR] [\-D LINK-DST-ADDR] [\-E LINK_ADDR] [\-e] [\-t TARGET_ADDR[/LEN]] [\-F N_SOURCES] [\-T N_TARGETS] [\-z SECONDS] [\-l] [\-v] [\-h]
 
 .SH DESCRIPTION
 .B ns6
@@ -16,17 +18,16 @@ The ns6 tool takes its parameters by means of command-line options. Each of the
 Depending on the amount of information (i.e., options) to be conveyed into the Neighbor Solicitations, it may be necessary for the ns6 tool to split that information into more than one Neighbor Solicitation message. Also, when the ns6 tool is instructed to flood the victim with Neighbor Solicitations from different sources ("\-\-flood\-sources" option), multiple packets may need to be sent. ns6 supports IPv6 fragmentation, which may be of use if a large amount of information needs to be conveyed within a single Neighbor Solicitation message. IPv6 fragmentation is not enabled by default, and must be explicitly enabled with the "\-y" option.
 
 .TP
-\-\-interface, \-i
-
-This option specifies the network interface that na-attack will use. The network interface must be specified (i.e., the tool does not select any network interface "by default").
+.BI \-i\  INTERFACE ,\ \-\-interface\  INTERFACE
+This option specifies the network interface that the tool will use. If the destination address ("\-d" option) is a link-local address, the interface must be explicitly specified. The interface may also be specified along with a destination address, with the "\-d" option.
 
 .TP
-\-\-src\-address, \-s
+.BI \-s\  SRC_ADDR ,\ \-\-src\-address\  SRC_ADDR
 
 This option is meant to specify the IPv6 Source Address to be used for the Neighbor Solicitation messages. If left unspecified, a randomized link-local (fe80::/64) address is selected.
 
 .TP
-\-\-dst\-address, \-d
+.BI \-d\  DST_ADDR ,\ \-\-dst\-address\  DST_ADDR
 
 This option specifies the IPv6 Destination Address of the Neighbor Solicitation messages. If this option is left unspecified, but the Ethernet Destination Address is specified, the "all-nodes link-local multicast" address (ff02::1) is selected as the IPv6 Destination Address. 
 
@@ -36,34 +37,34 @@ This option specifies the IPv6 Destination Address of the Neighbor Solicitation
 This option specifies the IPv6 Hop Limit to be used for the Neighbor Solicitation messages. It defaults to 255. Note that IPv6 nodes are required to check that the Hop Limit of incoming Neighbor Solicitation messages is 255. Therefore, this option is only useful to assess whether an IPv6 implementation fails to enforce the aforementioned check.
 
 .TP
-\-\-frag\-hdr, \-y
+.BI \-y\  SIZE ,\ \-\-frag\-hdr\  SIZE
 
 This option specifies that the resulting packet must be fragmented. The fragment size must be specified as an argument to this option.
 
 .TP
-\-\-dst\-opt\-hdr, \-u
+.BI \-u\  HDR_SIZE ,\ \-\-dst\-opt\-hdr\  HDR_SIZE
 
 This option specifies that a Destination Options header is to be included in the resulting packet. The extension header size must be specified as an argument to this option (the header is filled with padding options). Multiple Destination Options headers may be specified by means of multiple "\-u" options.
 
 .TP
-\-\-dst\-opt\-u\-hdr, \-U
+.BI \-U\  HDR_SIZE ,\ \-\-dst\-opt\-u\-hdr\  HDR_SIZE
 
 This option specifies a Destination Options header to be included in the "unfragmentable part" of the resulting packet. The header size must be specified as an argument to this option (the header is filled with padding options). Multiple Destination Options headers may be specified by means of multiple "\-U" options. This option is only valid if the "\-y" option is specified (as the concept of "unfragmentable part" only makes sense when fragmentation is employed).
 
 .TP
-\-\-hbh\-opt\-hdr, \-H
+.BI \-H\  HDR_SIZE ,\ \-\-hbh\-opt\-hdr\  HDR_SIZE
 
-This option specifies that a Hop-by-Hop Options header is to be included in the resulting packet. The header size must be specified as an argument to this option (the header is filled with padding options). Multiple Hop-by-Hop Options headers may be specified by means of multiple "\-H" options.
+This option specifies that a Hop-by-Hop Options header is to be included in the resulting packet. The header size must be specified as an argument to this option (the header is filled with padding options). Multiple Hop\-by\-Hop Options headers may be specified by means of multiple "\-H" options.
 
 .TP
-\-\-src\-link\-address, \-S
+.BI \-S\  SRC_LINK_ADDR ,\ \-\-src\-link\-address\  SRC_LINK_ADDR
 
-This option specifies the link-layer Source Address of the Neighbor Solicitation messages (currently, only Ethernet is supported). If left unspecified, the link-layer Source Address is randomized.
+This option specifies the link\-layer Source Address of the Neighbor Solicitation messages (currently, only Ethernet is supported). If left unspecified, the link\-layer Source Address is randomized.
 
 .TP
-\-\-link\-dst\-address, \-D
+.BI \-D\  DST_LINK_ADDR ,\ \-\-dst\-link\-address\  DST_LINK_ADDR
 
-This option specifies the link-layer Destination Address of the Neighbor Solicitation messages (currently, only Ethernet is supported). If left unspecified, it is set to the address "33:33:00:00:00:01" (the Ethernet address corresponding to the "all-nodes link-local multicast" IPv6 address (ff02::1).
+This option specifies the link\-layer Destination Address of the Neighbor Solicitation messages (currently, only Ethernet is supported). If left unspecified, it is set to the address "33:33:00:00:00:01" (the Ethernet address corresponding to the "all-nodes link-local multicast" IPv6 address (ff02::1).
 
 .TP
 \-\-target, \-t
@@ -75,12 +76,12 @@ If the "\-T" ("\-\-flood\-targets") option is specified, this option specifies a
 .TP
 \-\-source\-lla\-opt, \-E
 
-This option specifies the contents of a source link-layer address option to be included in the Neighbor Solicitation messages. If more than one source link-layer address is specified (by means of multiple "\-E" options), and all the resulting options cannot be conveyed into a single Neighbor Solicitation, multiple Neighbor Solicitations will be sent as needed.
+This option specifies the contents of a source link\-layer address option to be included in the Neighbor Solicitation messages. If more than one source link\-layer address is specified (by means of multiple "\-E" options), and all the resulting options cannot be conveyed into a single Neighbor Solicitation, multiple Neighbor Solicitations will be sent as needed.
 
 .TP
 \-\-add\-slla\-opt, \-e
 
-This option instructs the ns6 tool to include a source link-layer address option in the Neighbor Solicitation messages that it sends. The link-layer address included in the option is the same as the Ethernet Source Address used for the outgoing Neighbor Solicitation messages.
+This option instructs the ns6 tool to include a source link\-layer address option in the Neighbor Solicitation messages that it sends. The link\-layer address included in the option is the same as the Ethernet Source Address used for the outgoing Neighbor Solicitation messages.
 
 .TP
 \-\-flood\-sources, \-F
@@ -122,22 +123,22 @@ tool.
 
 # ns6 \-i eth0 \-d fe80::01 \-t 2001:db8::1 \-e
 
-Use the network interface "eth0" to send a Neighbor Solicitation message using a random link-local unicast IPv6 Source Address and a random Ethernet Source Address, to the IPv6 Destination address fe80::1 and the Ethernet Destination Address 33:33:00:00:00:01 (selected by default). The target of the Neighbor Advertisement is 2001:db8::1. The Neighbor Solicitation also includes a source link-layer address option, that contains the same Ethernet address as that used for the Ethernet Source Address of the packet. 
+Use the network interface "eth0" to send a Neighbor Solicitation message using a random link-local unicast IPv6 Source Address and a random Ethernet Source Address, to the IPv6 Destination address fe80::1 and the Ethernet Destination Address 33:33:00:00:00:01 (selected by default). The target of the Neighbor Advertisement is 2001:db8::1. The Neighbor Solicitation also includes a source link\-layer address option, that contains the same Ethernet address as that used for the Ethernet Source Address of the packet. 
 
 \fBExample #2\fR
 
 # ns6 \-i eth0 \-s 2001:db8::/32 \-t 2001:db8::1 \-F 10 \-l \-z 10 \-e \-v
 
-Send 10 Neighbor Solicitation messages using random Ethernet Source Addresses and random IPv6 Source Addresses from the prefix 2001:db8::/32, to the Ethernet Destination Address 33:33:00:00:00:01 (default) and the IPv6 Destination Address ff02::1 (default). The IPv6 Target Address of the Neighbor Solicitation is 2001:db8::1, and each message includes a source link-layer address option that contains the same address as that used for the Ethernet Source Address of the packet. Repeat this operation every ten seconds. Be verbose.
+Send 10 Neighbor Solicitation messages using random Ethernet Source Addresses and random IPv6 Source Addresses from the prefix 2001:db8::/32, to the Ethernet Destination Address 33:33:00:00:00:01 (default) and the IPv6 Destination Address ff02::1 (default). The IPv6 Target Address of the Neighbor Solicitation is 2001:db8::1, and each message includes a source link\-layer address option that contains the same address as that used for the Ethernet Source Address of the packet. Repeat this operation every ten seconds. Be verbose.
 
 \fBExample #3\fR
 
 # ns6 \-i eth0 \-s 2001:db8::/32 \-t 2001:db8::1 \-F 10 \-l \-z 10 \-E ff:ff:ff:ff:ff:ff \-v
 
-Send 10 Neighbor Solicitation messages using random Ethernet Source Addresses and random IPv6 Source Addresses from the prefix fe80::/64 (default, link-local unicast), to the Ethernet Destination Address 33:33:00:00:00:01 (default) and the IPv6 Destination Address ff02:1 (default). The IPv6 Target Address of the Neighbor Solicitation is 2001:db8::1, and each message includes a source link-layer address option that contains the Ethernet address ff:ff:ff:ff:ff:ff. Repeat this operation every ten seconds. Be verbose.
+Send 10 Neighbor Solicitation messages using random Ethernet Source Addresses and random IPv6 Source Addresses from the prefix fe80::/64 (default, link-local unicast), to the Ethernet Destination Address 33:33:00:00:00:01 (default) and the IPv6 Destination Address ff02:1 (default). The IPv6 Target Address of the Neighbor Solicitation is 2001:db8::1, and each message includes a source link\-layer address option that contains the Ethernet address ff:ff:ff:ff:ff:ff. Repeat this operation every ten seconds. Be verbose.
 
 .SH SEE ALSO
-"Security/Robustness Assessment of IPv6 Neighbor Discovery Implementations" (available at: <http://www.si6networks.com/tools/ipv6toolkit/si6networks-ipv6\-nd-assessment.pdf>) for a discussion of Neighbor Discovery vulnerabilities, and additional examples of how to use the na6 tool to exploit them.
+"Security/Robustness Assessment of IPv6 Neighbor Discovery Implementations" (available at: <http://www.si6networks.com/tools/ipv6toolkit/si6networks\-ipv6\-nd\-assessment.pdf>) for a discussion of Neighbor Discovery vulnerabilities, and additional examples of how to use the na6 tool to exploit them.
 
 .SH AUTHOR
 The
@@ -150,6 +151,5 @@ for SI6 Networks
 .SH COPYRIGHT
 Copyright (c) 2011\-2013 Fernando Gont.
 
-Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being just "AUTHOR" and "COPYRIGHT", with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the license is available at
+Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front\-Cover Texts, and no Back\-Cover Texts.  A copy of the license is available at
 .IR <http://www.gnu.org/licenses/fdl.html> .
-
index 7c2be22..d890251 100644 (file)
@@ -3,7 +3,9 @@
 ra6 \- A security assessment tool for attack vectors based on ICMPv6 Router Advertisement messages
 .SH SYNOPSIS
 .B ra6
-\-i INTERFACE [\-s SRC_ADDR[/LEN]] [\-d DST_ADDR] [\-y FRAG_SIZE] [\-u DST_OPT_HDR_SIZE] [\-U DST_OPT_U_HDR_SIZE] [\-H HBH_OPT_HDR_SIZE] [\-S LINK_SRC_ADDR] [\-D LINK_DST_ADDR] [\-c CUR_HOP] [\-t ROUTER_LIFETIME] [\-r REACHABLE_TIME] [\-x RETRANS_TIMER] [\-m] [\-o] [\-a] [\-q] [\-p PREFERENCE] [\-E LINK_ADDR] [\-e] [\-P PREFIX/LEN[#FLAGS[#VALID[#PREFERRED]]]] [\-M MTU] [\-N [LIFETIME[#DNS_ADDR]]] [\-R PREFIX/LEN[#PREF[#LIFETIME]]] [\-f N_PREFIXES] [\-F N_SOURCES] [\-w N_ROUTES] [\-W N_ADDRS[#ADDRSPEROPT]] [\-j PREFIX[/LEN]] [\-k PREFIX[/LEN]] [\-J LINK_ADDR] [\-K LINK_ADDR] [\-b PREFIX[/LEN]] [\-g PREFIX[/LEN]] [\-B LINK_ADDR] [\-G LINK_ADDR] [\-L] [\-v] [\-h]
+.RB [\| \-i
+.IR INTERFACE\| ]
+[\-s SRC_ADDR[/LEN]] [\-d DST_ADDR] [\-y FRAG_SIZE] [\-u DST_OPT_HDR_SIZE] [\-U DST_OPT_U_HDR_SIZE] [\-H HBH_OPT_HDR_SIZE] [\-S LINK_SRC_ADDR] [\-D LINK_DST_ADDR] [\-c CUR_HOP] [\-t ROUTER_LIFETIME] [\-r REACHABLE_TIME] [\-x RETRANS_TIMER] [\-m] [\-o] [\-a] [\-q] [\-p PREFERENCE] [\-E LINK_ADDR] [\-e] [\-P PREFIX/LEN[#FLAGS[#VALID[#PREFERRED]]]] [\-M MTU] [\-N [LIFETIME[#DNS_ADDR]]] [\-R PREFIX/LEN[#PREF[#LIFETIME]]] [\-f N_PREFIXES] [\-F N_SOURCES] [\-w N_ROUTES] [\-W N_ADDRS[#ADDRSPEROPT]] [\-j PREFIX[/LEN]] [\-k PREFIX[/LEN]] [\-J LINK_ADDR] [\-K LINK_ADDR] [\-b PREFIX[/LEN]] [\-g PREFIX[/LEN]] [\-B LINK_ADDR] [\-G LINK_ADDR] [\-L] [\-v] [\-h]
 
 .SH DESCRIPTION
 .B ra6
@@ -20,17 +22,16 @@ Depending on the amount of information (i.e., options and option data) to be con
 The tool supports filtering of incoming Router Solicitation messages based on the Ethernet Source Address, the Ethernet Destination Address, the IPv6 Source Address, and the IPv6 Destination Address.  There are two types of filters: "block filters" and "accept filters". If any "block filter" is specified, and the incoming Router Solicitation message matches any of those filters, the message is discarded (and thus no Router Advertisements are sent in response). If any "accept filter" is specified, incoming Router Solicitation messages must match the specified filters in order for the ra6 tool to respond with Router Advertisement messages. 
 
 .TP
-\-\-interface, \-i
-
-This option is meant to specify the network interface to use for performing the attack. The network interface must be specified (i.e., the tool does not select any network interface "by default").
+.BI \-i\  INTERFACE ,\ \-\-interface\  INTERFACE
+This option specifies the network interface that the tool will use. If the destination address ("\-d" option) is a link-local address, or the "listening" ("\-L") mode is selected, the interface must be explicitly specified. The interface may also be specified along with a destination address, with the "\-d" option.
 
 .TP
-\-\-src\-address, \-s
+.BI \-s\  SRC_ADDR ,\ \-\-src\-address\  SRC_ADDR
 
 This option specifies the IPv6 Source Address (or IPv6 prefix) to be used for the Router Advertisement messages. If left unspecified, a randomized link-local unicast (fe80::/64) address is selected.
 
 .TP
-\-\-dst\-address, \-d
+.BI \-d\  DST_ADDR ,\ \-\-dst\-address\  DST_ADDR
 
 This specifies the IPv6 Destination Address of the Router Advertisement messages. If this option is left unspecified, but the Ethernet Destination Address is specified, the "all-nodes link-local multicast" address (ff02::1) is selected as the IPv6 Destination Address. 
 
@@ -42,24 +43,24 @@ When operating in passive mode ("\-L" option), the IPv6 Destination Address is s
 This option specifies the Hop Limit of the Router Advertisement messages. It defaults to 255. Note that IPv6 nodes are required to check that the Hop Limit of incoming Router Advertisement messages is 255. Therefore, this option is only useful to assess whether an IPv6 implementation fails to enforce the aforementioned check.
 
 .TP
-\-\-frag\-hdr, \-y
+.BI \-y\  SIZE ,\ \-\-frag\-hdr\  SIZE
 
 This option specifies that the resulting packet must be fragmented. The fragment size must be specified as an argument to this option.
 
 .TP
-\-\-dst\-opt\-hdr, \-u
+.BI \-u\  HDR_SIZE ,\ \-\-dst\-opt\-hdr\  HDR_SIZE
 
 This option specifies that a Destination Options header is to be included in the resulting packet. The extension header size must be specified as an argument to this option (the header is filled with padding options). Multiple Destination Options headers may be specified by means of multiple "\-u" options.
 
 .TP
-\-\-dst\-opt\-u\-hdr, \-U
+.BI \-U\  HDR_SIZE ,\ \-\-dst\-opt\-u\-hdr\  HDR_SIZE
 
 This option specifies a Destination Options header to be included in the "unfragmentable part" of the resulting packet. The header size must be specified as an argument to this option (the header is filled with padding options). Multiple Destination Options headers may be specified by means of multiple "\-U" options. This option is only valid if the "\-y" option is specified (as the concept of "unfragmentable part" only makes sense when fragmentation is employed).
 
 .TP
-\-\-hbh\-opt\-hdr, \-H
+.BI \-H\  HDR_SIZE ,\ \-\-hbh\-opt\-hdr\  HDR_SIZE
 
-This option specifies that a Hop-by-Hop Options header is to be included in the resulting packet. The header size must be specified as an argument to this option (the header is filled with padding options). Multiple Hop-by-Hop Options headers may be specified by means of multiple "\-H" options.
+This option specifies that a Hop-by-Hop Options header is to be included in the resulting packet. The header size must be specified as an argument to this option (the header is filled with padding options). Multiple Hop\-by\-Hop Options headers may be specified by means of multiple "\-H" options.
  
 .TP
 \-\-curhop, \-c
@@ -107,33 +108,33 @@ This option causes the ra6 tool to set the ‘P’ ("ND Proxy") bit in the Route
 This option specifies the Preference field of the Router Advertisement messages, with "1" meaning "High", "0" meaning "Normal", and "\-1" meaning "low" (the value "\-2" is forbidden). If left unspecified, a Preference value of "1" (High) is selected.
 
 .TP
-\-\-src\-link\-address, \-S
+.BI \-S\  SRC_LINK_ADDR ,\ \-\-src\-link\-address\  SRC_LINK_ADDR
 
-This option specifies the link-layer Source Address of the Router Advertisement messages (currently, only Ethernet is supported). If left unspecified, the link-layer Source Address is randomized.
+This option specifies the link\-layer Source Address of the Router Advertisement messages (this option is only valid for Ethernet interfaces). If left unspecified, the link\-layer Source Address is randomized.
 
-When operating in passive mode, the link-layer Source Address is selected according to the IPv6 Destination Address of the incoming Router Solicitation messages. If the IPv6 Destination Address of the incoming Router Solicitation message is a multicast address (usually the "all-routers link-local multicast" address "ff02::02"), the link-layer Source Address is set to the address specified by the "\-S" option (or to a random address if the "\-S" option was left unspecified). If the IPv6 Destination Address of the incoming Router Solicitation is not a multicast address (i.e., it is a unicast address), the link-layer Source Address is set to the Ethernet Destination Address of the incoming Router Solicitation message.
+When operating in passive mode, the link\-layer Source Address is selected according to the IPv6 Destination Address of the incoming Router Solicitation messages. If the IPv6 Destination Address of the incoming Router Solicitation message is a multicast address (usually the "all-routers link-local multicast" address "ff02::02"), the link\-layer Source Address is set to the address specified by the "\-S" option (or to a random address if the "\-S" option was left unspecified). If the IPv6 Destination Address of the incoming Router Solicitation is not a multicast address (i.e., it is a unicast address), the link\-layer Source Address is set to the Ethernet Destination Address of the incoming Router Solicitation message.
 
 .TP
-\-\-link\-dst\-address, \-D
+.BI \-D\  DST_LINK_ADDR ,\ \-\-dst\-link\-address\  DST_LINK_ADDR
 
-This option is meant to specify the link-layer Destination Address of the Router Advertisement messages (currently, only Ethernet is supported). If left unspecified, it is set to "33:33:00:00:00:01" (the Ethernet multicast address corresponding to the IPv6 "all-nodes link-local multicast" address).
+This option is meant to specify the link\-layer Destination Address of the Router Advertisement messages (this option is only valid for Ethernet interfaces). If left unspecified, it is set to "33:33:00:00:00:01" (the Ethernet multicast address corresponding to the IPv6 "all-nodes link-local multicast" address).
 
-When operating in passive mode, the link-layer Destination Address is set depending to the IPv6 Source Address of the incoming Router Solicitation message. If the IPv6 Source Address of the incoming Router Solicitation message is the unspecified address (::), the link-layer destination address is set to "33:33:00:00:00:01" (the Ethernet multicast address corresponding to the IPv6 "all-nodes link-local multicast" address). Otherwise, the link-layer Destination Address is set to the same value as the link-layer Source Address of the incoming Router Solicitation message.
+When operating in passive mode, the link\-layer Destination Address is set depending to the IPv6 Source Address of the incoming Router Solicitation message. If the IPv6 Source Address of the incoming Router Solicitation message is the unspecified address (::), the link\-layer destination address is set to "33:33:00:00:00:01" (the Ethernet multicast address corresponding to the IPv6 "all-nodes link-local multicast" address). Otherwise, the link\-layer Destination Address is set to the same value as the link\-layer Source Address of the incoming Router Solicitation message.
 
 .TP
 \-\-source\-lla\-opt, \-E
 
-This option specifies the contents of a source link-layer address option to be included in the Router Advertisement messages. If a single option is specified, it is included in all the outgoing Router Advertisement messages. If more than one source link-layer address is specified, they are included only in the first packet of a set of Router Advertisements (if more than one Router Advertisement needs to be sent in order to convey all the specified information).
+This option specifies the contents of a source link\-layer address option to be included in the Router Advertisement messages. If a single option is specified, it is included in all the outgoing Router Advertisement messages. If more than one source link\-layer address is specified, they are included only in the first packet of a set of Router Advertisements (if more than one Router Advertisement needs to be sent in order to convey all the specified information).
 
 .TP
 \-\-add\-slla\-opt, \-e
 
-This option instructs the ra6 tool to include a source link-layer address option in the Router Advertisement messages. The link-layer address included in the option is the same as the Ethernet Source Address used for the outgoing Router Advertisement message. The difference between this option and the "\-E" option is that the latter does not specify the actual value of the option, but just instructs the tool include the option (the actual value of the option is selected according to the Ethernet Source address used in the outgoing packet).
+This option instructs the ra6 tool to include a source link\-layer address option in the Router Advertisement messages. The link\-layer address included in the option is the same as the Ethernet Source Address used for the outgoing Router Advertisement message. The difference between this option and the "\-E" option is that the latter does not specify the actual value of the option, but just instructs the tool include the option (the actual value of the option is selected according to the Ethernet Source address used in the outgoing packet).
 
 .TP
 \-\-prefix\-opt, \-P
 
-This option specifies the contents of a Prefix Information option to be included in Router advertisement messages, with the following format: "\-P prefix/length#flags#valid#preferred". Where "prefix/length" is a mandatory field that indicates an IPv6 prefix (e.g., "2001::/16"). "flags" is an optional argument that indicates which flags should be set for this prefix (‘L’ for the "on-link" flag, ‘A’ for the "autonomous address-configuration" flag, ‘R’ for "Router Address", and ‘-‘ for indicating that no flags should be set for this prefix) -- if this field is left unspecified, the "L" and "A" flags are set for in the specified Prefix Information option. "valid" is an optional field that indicates the "Valid Lifetime" for this prefix (the length of time in seconds during which this information can be used for on-link determination. If left unspecified, a value of 0xffffffff (infinity) is used. "preferred" is an optional argument that specifies the "Preferred Lifetime" value for this prefix (the length of time in seconds that addresses generated from this prefix via stateless address auto-configuration remain preferred). If left unspecified, a value of 0xffffffff (infinity) is used.
+This option specifies the contents of a Prefix Information option to be included in Router advertisement messages, with the following format: "\-P prefix/length#flags#valid#preferred". Where "prefix/length" is a mandatory field that indicates an IPv6 prefix (e.g., "2001::/16"). "flags" is an optional argument that indicates which flags should be set for this prefix (‘L’ for the "on-link" flag, ‘A’ for the "autonomous address-configuration" flag, ‘R’ for "Router Address", and ‘-‘ for indicating that no flags should be set for this prefix) \-\- if this field is left unspecified, the "L" and "A" flags are set for in the specified Prefix Information option. "valid" is an optional field that indicates the "Valid Lifetime" for this prefix (the length of time in seconds during which this information can be used for on-link determination. If left unspecified, a value of 0xffffffff (infinity) is used. "preferred" is an optional argument that specifies the "Preferred Lifetime" value for this prefix (the length of time in seconds that addresses generated from this prefix via stateless address auto-configuration remain preferred). If left unspecified, a value of 0xffffffff (infinity) is used.
 
 .TP
 \-\-route\-opt, \-R
@@ -185,12 +186,12 @@ This option sets a block filter for the incoming Router Solicitation messages, b
 .TP
 \-\-block\-link\-src, \-J
 
-This option sets a block filter for the incoming Router Solicitation messages, based on their link-layer Source Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
+This option sets a block filter for the incoming Router Solicitation messages, based on their link\-layer Source Address. The option must be followed by a link\-layer address (this option is only valid for Ethernet interfaces).
 
 .TP
 \-\-block\-link\-dst, \-K
 
-This option sets a block filter for the incoming Router Solicitation messages, based on their link-layer Destination Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
+This option sets a block filter for the incoming Router Solicitation messages, based on their link\-layer Destination Address. The option must be followed by a link\-layer address (this option is only valid for Ethernet interfaces).
 
 .TP
 \-\-accept\-src, \-b
@@ -205,12 +206,12 @@ This option sets a accept filter for the incoming Router Solicitation messages,
 .TP
 \-\-accept\-link\-src, \-B
 
-This option sets an accept filter for the incoming Router Solicitation messages, based on their link-layer Source Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
+This option sets an accept filter for the incoming Router Solicitation messages, based on their link\-layer Source Address. The option must be followed by a link\-layer address (this option is only valid for Ethernet interfaces).
 
 .TP
 \-\-accept\-link\-dst, \-K
 
-This option sets an accept filter for the incoming Router Solicitation messages, based on their link-layer Destination Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
+This option sets an accept filter for the incoming Router Solicitation messages, based on their link\-layer Destination Address. The option must be followed by a link\-layer address (this option is only valid for Ethernet interfaces).
 
 .TP
 \-\-loop, \-l
@@ -247,19 +248,19 @@ tool.
 
 # ra6 \-i eth0 \-P 2001::/64#LA \-P 2002::/64#A \-e \-L
 
-Listen ("\-L") for incoming Router Solicitations on interface eth0 ("\-i eth0"), and advertise the prefix 2001::/64 for both on-link determination and auto-configuration ("\-P 2001::/64#LA") and the prefix 2002::/64 only for auto-configuration ("\-P 2002::/64#A"). Include a source link-layer address option ("\-e") in the Router Advertisements.
+Listen ("\-L") for incoming Router Solicitations on interface eth0 ("\-i eth0"), and advertise the prefix 2001::/64 for both on-link determination and auto-configuration ("\-P 2001::/64#LA") and the prefix 2002::/64 only for auto-configuration ("\-P 2002::/64#A"). Include a source link\-layer address option ("\-e") in the Router Advertisements.
 
 \fBExample #2\fR
 
 # ra6 \-i eth0 \-d fe80::1 \-D 01:02:03:04:05:06 \-c 5 \-\-lifetime 100 \-o \-e \-M 1400
 
-Use the network interface "eth0" to send a Router Advertisement using a random link-local IPv6 Source Address and a random Ethernet Source Address, to the IPv6 Destination address fe80::1 and the Ethernet Destination Address 01:02:03:04:05:06. The Router Advertisement includes a "Router Lifetime" of 100, and advertises a CurHop value of 5 (i.e., a recommended "Hop Limit" of "5"). The ‘O’ bit is set (thus indicating that other configuration information is available via DHCP). The Router Advertisement includes a source link-layer address option (containing the same address as the Ethernet Source Address of the packet) and an MTU option with a value of 1400.
+Use the network interface "eth0" to send a Router Advertisement using a random link-local IPv6 Source Address and a random Ethernet Source Address, to the IPv6 Destination address fe80::1 and the Ethernet Destination Address 01:02:03:04:05:06. The Router Advertisement includes a "Router Lifetime" of 100, and advertises a CurHop value of 5 (i.e., a recommended "Hop Limit" of "5"). The ‘O’ bit is set (thus indicating that other configuration information is available via DHCP). The Router Advertisement includes a source link\-layer address option (containing the same address as the Ethernet Source Address of the packet) and an MTU option with a value of 1400.
 
 \fBExample #3\fR
 
 # ra6 \-i eth0 \-\-flood\-sources 10 \-\-flood\-routes 50 \-\-flood\-prefixes 40 \-R ::/64#1 \-P ::/48#LA \-L \-e
 
-Listen for incoming Router Solicitation messages on the interface "eth0", and respond with Router Advertisements from 10 different link-local unicast IPv6 Source Addresses (randomized) and 10 different (randomized) Ethernet Source Addresses. Each Router Advertisement includes 50 Route Information options, each of them with a randomized /64 prefix and a preference of 1 ("high"). The Router Advertisements also contain 40 Prefix Information options, each with a randomized /48 prefix and the ‘A’ (auto-configuration) and ‘L’ (on-link determination) bits set. In addition, each Router Advertisement includes a source link-layer address option, containing the same (randomized) address as that used for the Ethernet Source Address field.
+Listen for incoming Router Solicitation messages on the interface "eth0", and respond with Router Advertisements from 10 different link-local unicast IPv6 Source Addresses (randomized) and 10 different (randomized) Ethernet Source Addresses. Each Router Advertisement includes 50 Route Information options, each of them with a randomized /64 prefix and a preference of 1 ("high"). The Router Advertisements also contain 40 Prefix Information options, each with a randomized /48 prefix and the ‘A’ (auto-configuration) and ‘L’ (on-link determination) bits set. In addition, each Router Advertisement includes a source link\-layer address option, containing the same (randomized) address as that used for the Ethernet Source Address field.
 
 \fBExample #4\fR
 
@@ -287,6 +288,5 @@ for SI6 Networks
 .SH COPYRIGHT
 Copyright (c) 2011\-2013 Fernando Gont.
 
-Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being just "AUTHOR" and "COPYRIGHT", with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the license is available at
+Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front\-Cover Texts, and no Back\-Cover Texts.  A copy of the license is available at
 .IR <http://www.gnu.org/licenses/fdl.html> .
-
index 8e9859e..3906917 100644 (file)
@@ -3,7 +3,9 @@
 rd6 \- A security assessment tool for attack vectors based on ICMPv6 Redirect messages
 .SH SYNOPSIS
 .B rd6
-\-i INTERFACE [\-s SRC_ADDR[/LEN]] [\-d DST_ADDR] [\-S LINK_SRC_ADDR] [\-D LINK-DST-ADDR] [\-A HOP_LIMIT] [\-y FRAG_SIZE] [\-u DST_OPT_HDR_SIZE] [\-U DST_OPT_U_HDR_SIZE] [\-H HBH_OPT_HDR_SIZE] [\-r RD_DESTADDR/LEN] [\-t RD_TARGETADDR/LEN] [\-p PAYLOAD_TYPE] [\-P PAYLOAD_SIZE] [\-n] [\-c HOP_LIMIT] [\-x SRC_ADDR] [\-a SRC_PORT] [\-o DST_PORT] [\-X TCP_FLAGS] [\-q TCP_SEQ] [\-Q TCP_ACK] [\-V TCP_URP] [\-w TCP_WIN] [\-M] [\-O] [\-N] [\-E LINK_ADDR] [\-e] [\-j PREFIX[/LEN]] [\-k PREFIX[/LEN]] [\-J LINK_ADDR] [\-K LINK_ADDR] [\-b PREFIX[/LEN]] [\-g PREFIX[/LEN]] [\-B LINK_ADDR] [\-G LINK_ADDR] [\-f] [\-R N_DESTS] [\-T N_TARGETS] [\-F N_SOURCES] [\-L | \-l] [\-z] [\-v] [\-h]
+.RB [\| \-i
+.IR INTERFACE\| ]
+[\-s SRC_ADDR[/LEN]] [\-d DST_ADDR] [\-S LINK_SRC_ADDR] [\-D LINK-DST-ADDR] [\-A HOP_LIMIT] [\-y FRAG_SIZE] [\-u DST_OPT_HDR_SIZE] [\-U DST_OPT_U_HDR_SIZE] [\-H HBH_OPT_HDR_SIZE] [\-r RD_DESTADDR/LEN] [\-t RD_TARGETADDR/LEN] [\-p PAYLOAD_TYPE] [\-P PAYLOAD_SIZE] [\-n] [\-c HOP_LIMIT] [\-x SRC_ADDR] [\-a SRC_PORT] [\-o DST_PORT] [\-X TCP_FLAGS] [\-q TCP_SEQ] [\-Q TCP_ACK] [\-V TCP_URP] [\-w TCP_WIN] [\-M] [\-O] [\-N] [\-E LINK_ADDR] [\-e] [\-j PREFIX[/LEN]] [\-k PREFIX[/LEN]] [\-J LINK_ADDR] [\-K LINK_ADDR] [\-b PREFIX[/LEN]] [\-g PREFIX[/LEN]] [\-B LINK_ADDR] [\-G LINK_ADDR] [\-f] [\-R N_DESTS] [\-T N_TARGETS] [\-F N_SOURCES] [\-L | \-l] [\-z] [\-v] [\-h]
 
 .SH DESCRIPTION
 .B rd6
@@ -20,19 +22,18 @@ takes it parameters as command-line options. Each of the options can be specifie
 Depending on the amount of information (i.e., options) to be conveyed into the ICMPv6 Redirect messages, it may be necessary for the rd6 tool to split that information into more than one Redirect message. Also, if the tool is instructed to e.g. flood the victim with Redirect messages from different sources ("\-\-flood\-sources" option), multiple packets may need to be generated. rd6 supports IPv6 fragmentation, which might be of use to circumvent layer-2 filtering and/or Network Intrusion Detection Systems (NIDS). However, IPv6 fragmentation is not enabled by default, and must be explicitly enabled with the "\-y" option.
 
 .TP
-\-\-interface, \-i
-
-This option specifies the network interface that the tool will use. The network interface must be specified (i.e., the tool does not select any network interface "by default").
+.BI \-i\  INTERFACE ,\ \-\-interface\  INTERFACE
+This option specifies the network interface that the tool will use. If the destination address ("\-d" option) is a link-local address, or the "listening" ("\-L") mode is selected, the interface must be explicitly specified. The interface may also be specified along with a destination address, with the "\-d" option.
 
 .TP
-\-\-src\-address, \-s
+.BI \-s\  SRC_ADDR ,\ \-\-src\-address\  SRC_ADDR
 
 This option specifies the IPv6 source address (or IPv6 prefix) to be used for the Source Address of the attack packets. This address typically corresponds to the IPv6 link-local address of the default router. If the "\-F" ("\-\-flood\-sources") option is specified, this option includes an IPv6 prefix, from which random addresses are selected. See the description of the "\-F" option for further information on how the "\-s" option is processed in that specific case.
 
 Note: Instead of specifying the "Source Address" with this option, the "\-\-learn\-router" option could be set, such that the tool automatically learns the IPv6 link-local address of the default router, and uses this address for the "Source Address" of the Redirect messages.
 
 .TP
-\-\-dst\-address, \-d
+.BI \-d\  DST_ADDR ,\ \-\-dst\-address\  DST_ADDR
 
 This option specifies the IPv6 Destination Address of the victim. It can be left unspecified only if the "\-L" option is selected (i.e., if the tool is to operate in "Passive" mode).
 
@@ -44,36 +45,36 @@ When operating in passive mode ("\-L" option), the IPv6 Destination Address is s
 This option specifies the Hop Limit to be used for the Redirect messages. It defaults to 255. Note that IPv6 nodes are required to check that the Hop Limit of incoming Redirect messages is 255. Therefore, this option is only useful to assess whether an IPv6 implementation fails to enforce the aforementioned check.
 
 .TP
-\-\-frag\-hdr, \-y
+.BI \-y\  SIZE ,\ \-\-frag\-hdr\  SIZE
 
 This option specifies that the resulting packet must be fragmented. The fragment size must be specified as an argument to this option.
 
 .TP
-\-\-dst\-opt\-hdr, \-u
+.BI \-u\  HDR_SIZE ,\ \-\-dst\-opt\-hdr\  HDR_SIZE
 
 This option specifies that a Destination Options header is to be included in the resulting packet. The extension header size must be specified as an argument to this option (the header is filled with padding options). Multiple Destination Options headers may be specified by means of multiple "\-u" options.
 
 .TP
-\-\-dst\-opt\-u\-hdr, \-U
+.BI \-U\  HDR_SIZE ,\ \-\-dst\-opt\-u\-hdr\  HDR_SIZE
 
 This option specifies a Destination Options header to be included in the "unfragmentable part" of the resulting packet. The header size must be specified as an argument to this option (the header is filled with padding options). Multiple Destination Options headers may be specified by means of multiple "\-U" options. This option is only valid if the "\-y" option is specified (as the concept of "unfragmentable part" only makes sense when fragmentation is employed).
 
 .TP
-\-\-hbh\-opt\-hdr, \-H
+.BI \-H\  HDR_SIZE ,\ \-\-hbh\-opt\-hdr\  HDR_SIZE
 
-This option specifies that a Hop-by-Hop Options header is to be included in the resulting packet. The header size must be specified as an argument to this option (the header is filled with padding options). Multiple Hop-by-Hop Options headers may be specified by means of multiple "\-H" options.
+This option specifies that a Hop-by-Hop Options header is to be included in the resulting packet. The header size must be specified as an argument to this option (the header is filled with padding options). Multiple Hop\-by\-Hop Options headers may be specified by means of multiple "\-H" options.
 
 .TP
-\-\-src\-link\-address, \-S
+.BI \-S\  SRC_LINK_ADDR ,\ \-\-src\-link\-address\  SRC_LINK_ADDR
 
-This option specifies the link-layer Source Address of the Redirect messages (currently, only Ethernet is supported). If left unspecified, the link-layer Source Address is randomized. However, if this option is left unspecified, but the "\-\-learn\-router" option is set, the link-layer Source Address is set to that of the default router for the local network.
+This option specifies the link\-layer Source Address of the Redirect messages (this option is only valid for Ethernet interfaces). If left unspecified, the link\-layer Source Address is randomized. However, if this option is left unspecified, but the "\-\-learn\-router" option is set, the link\-layer Source Address is set to that of the default router for the local network.
 
 .TP
-\-\-link\-dst\-address, \-D
+.BI \-D\  DST_LINK_ADDR ,\ \-\-dst\-link\-address\  DST_LINK_ADDR
 
-This option specifies the link-layer Destination Address of the Redirect messages (currently, only Ethernet is supported). If left unspecified, it is set to the "all-nodes link-local multicast" address (ff02::1).
+This option specifies the link\-layer Destination Address of the Redirect messages (this option is only valid for Ethernet interfaces). If left unspecified, it is set to the "all-nodes link-local multicast" address (ff02::1).
 
-When operating in passive mode, the link-layer Destination Address is set according to the link-layer Source Address of the incoming packet.
+When operating in passive mode, the link\-layer Destination Address is set according to the link\-layer Source Address of the incoming packet.
 
 .TP
 \-\-redir\-target, \-t
@@ -176,64 +177,64 @@ This option instructs the tool to set the Redirect Target Address to the same va
 .TP
 \-\-learn\-router, \-N
 
-This option instructs the tool to learn the link-layer and the (link-local) IPv6 addresses of the local router by means of Router Solicitation and Router Advertisement messages. If the IPv6 Source Address or the link-layer Source Address are left unspecified, the corresponding values learned with this option will be used.
+This option instructs the tool to learn the link\-layer and the (link-local) IPv6 addresses of the local router by means of Router Solicitation and Router Advertisement messages. If the IPv6 Source Address or the link\-layer Source Address are left unspecified, the corresponding values learned with this option will be used.
 
 Note: This option is very useful to avoid having to manually enter the IPv6 and/or Ethernet addresses of the router.
 
 .TP
 \-\-target\-lla\-opt, \-E
 
-This option specifies the contents of a target link-layer address option to be included in the Redirect messages. If a single option is specified, it is included in all the outgoing Redirect messages. If more than one target link-layer address is specified (by means of multiple "\-E" options), and all the resulting options cannot be conveyed into a single Redirect message, multiple Redirect messages will be sent as needed.
+This option specifies the contents of a target link\-layer address option to be included in the Redirect messages. If a single option is specified, it is included in all the outgoing Redirect messages. If more than one target link\-layer address is specified (by means of multiple "\-E" options), and all the resulting options cannot be conveyed into a single Redirect message, multiple Redirect messages will be sent as needed.
 
 .TP
 \-\-add\-tlla\-opt, \-e
 
-This option instructs the rd6 tool to include a target link-layer address option in the Redirect messages that it sends. When this option is employed, the link-layer Source Address must be specified, and such value will be used for the target link-layer address option. The difference between this option and the "\-E" option is that the "\-e" option does not specify the actual value of the option, but just instructs the tool to include a target link-layer address option (the actual value of the option is selected as explained before).
+This option instructs the rd6 tool to include a target link\-layer address option in the Redirect messages that it sends. When this option is employed, the link\-layer Source Address must be specified, and such value will be used for the target link\-layer address option. The difference between this option and the "\-E" option is that the "\-e" option does not specify the actual value of the option, but just instructs the tool to include a target link\-layer address option (the actual value of the option is selected as explained before).
 
 .TP
-\-\-block\-src, \-j
+.BI \-j\  SRC_ADDR ,\ \-\-block\-src\  SRC_ADDR
 
 This option sets a block filter for the incoming packets, based on their IPv6 Source Address. It allows the specification of an IPv6 prefix in the form "\-j prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
 
 .TP
-\-\-block\-dst, \-k
+.BI \-k\  DST_ADDR ,\ \-\-block\-dst\  DST_ADDR
 
-This option sets a block filter for the incoming packets, based on their IPv6 Destination Address. It allows the specification of an IPv6 prefix in the form "\-k prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
+This option sets a block filter for the incoming Neighbor Solicitation messages, based on their IPv6 Destination Address. It allows the specification of an IPv6 prefix in the form "\-k prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
 
 .TP
-\-\-block\-link\-src, \-J
+.BI \-J\  SRC_ADDR ,\ \-\-block\-link\-src\  SRC_ADDR
 
-This option sets a block filter for the incoming packets, based on their link-layer Source Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
+This option sets a block filter for the incoming packets, based on their link\-layer Source Address. The option must be followed by a link\-layer address (this option is only valid for Ethernet interfaces).
 
 .TP
-\-\-block\-link\-dst, \-K
+.BI \-K\  DST_ADDR ,\ \-\-block\-link\-dst\  DST_ADDR
 
-This option sets a block filter for the incoming packets, based on their link-layer Destination Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
+This option sets a block filter for the incoming packets, based on their link\-layer Destination Address. The option must be followed by a link\-layer address (this option is only valid for Ethernet interfaces).
 
 .TP
-\-\-accept\-src, \-b
+.BI \-b\  SRC_ADDR ,\ \-\-accept\-src\  SRC_ADDR
 
 This option sets an accept filter for the incoming packets, based on their IPv6 Source Address. It allows the specification of an IPv6 prefix in the form "\-b prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
 
 .TP
-\-\-accept\-dst, \-g
+.BI \-g\  DST_ADDR ,\ \-\-accept\-dst\  DST_ADDR
 
 This option sets a accept filter for the incoming packets, based on their IPv6 Destination Address. It allows the specification of an IPv6 prefix in the form "\-g prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
 
 .TP
-\-\-accept\-link\-src, \-B
+.BI \-B\  SRC_ADDR ,\ \-\-accept\-link\-src\  SRC_ADDR
 
-This option sets an accept filter for the incoming packets, based on their link-layer Source Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
+This option sets an accept filter for the incoming Neighbor Solicitation messages, based on their link\-layer Source Address. The option must be followed by a link\-layer address (this option is only valid for Ethernet interfaces).
 
 .TP
-\-\-accept\-link\-dst, \-K
+.BI \-G\  DST_ADDR ,\ \-\-accept\-link\-dst\  DST_ADDR
 
-This option sets an accept filter for the incoming packets, based on their link-layer Destination Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
+This option sets an accept filter for the incoming packets, based on their link\-layer Destination Address. The option must be followed by a link\-layer address (this option is only valid for Ethernet interfaces).
 
 .TP
 \-\-sanity\-filters, \-w
 
-This option automatically adds an "accept filter" for the link-layer Destination Address corresponding to the local router (either learned as a result of the "\-\-learn\-router" option, or specified by the "\-S" option), and a block filter for the IPv6 Source Address fe80::/16.
+This option automatically adds an "accept filter" for the link\-layer Destination Address corresponding to the local router (either learned as a result of the "\-\-learn\-router" option, or specified by the "\-S" option), and a block filter for the IPv6 Source Address fe80::/16.
 
 Note: This option is desirable in virtually all scenarios, such that the tool does not respond to link-local traffic, etc.
 
@@ -293,7 +294,7 @@ The tool uses the network interface "eth0", and operates in passive mode ("\-L"
 
 # rd6 \-i eth0 \-\-learn\-router \-d 2001:db8::1 \-r 2001:db8::/64 \-t fe80::bad \-R 100 \-l \-v
 
-Flood the victim host (specified with the "\-d" option) with batches of 100 Redirect messages ("\-R 100" option). Each Redirect message redirects a random address from the prefix "2001:db8::/64" to the address "fe80::bad". The IPv6 and link-layer addresses of the current local router is dynamically learned by means of RS/RA messages ("\-\-learn\-router" option). The process is repeated every second ("\-l" option, with the default delay of 1 second).
+Flood the victim host (specified with the "\-d" option) with batches of 100 Redirect messages ("\-R 100" option). Each Redirect message redirects a random address from the prefix "2001:db8::/64" to the address "fe80::bad". The IPv6 and link\-layer addresses of the current local router is dynamically learned by means of RS/RA messages ("\-\-learn\-router" option). The process is repeated every second ("\-l" option, with the default delay of 1 second).
 
 .SH SEE ALSO
 "Security/Robustness Assessment of IPv6 Neighbor Discovery Implementations" (available at: <http://www.si6networks.com/tools/ipv6toolkit/si6networks\-ipv6\-nd\-assessment.pdf>) for a discussion of Neighbor Discovery vulnerabilities, and additional examples of how to use the na6 tool to exploit them.
@@ -309,6 +310,5 @@ for SI6 Networks
 .SH COPYRIGHT
 Copyright (c) 2011\-2013 Fernando Gont.
 
-Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being just "AUTHOR" and "COPYRIGHT", with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the license is available at
+Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front\-Cover Texts, and no Back\-Cover Texts.  A copy of the license is available at
 .IR <http://www.gnu.org/licenses/fdl.html> .
-
index 2b37740..aff2124 100644 (file)
@@ -3,7 +3,9 @@
 rs6 \- A security assessment tool for attack vectors based on ICMPv6 Router Solicitation messages
 .SH SYNOPSIS
 .B rs6
-\-i INTERFACE [\-s SRC_ADDR[/LEN]] [\-d DST_ADDR] [\-y FRAG_SIZE] [\-u DST_OPT_HDR_SIZE] [\-U DST_OPT_U_HDR_SIZE] [\-H HBH_OPT_HDR_SIZE] [\-S LINK_SRC_ADDR] [\-D LINK-DST-ADDR] [\-E LINK_ADDR] [\-e] [\-F N_SOURCES] [\-z SECONDS] [\-l] [\-v] [\-h]
+.RB [\| \-i
+.IR INTERFACE\| ]
+[\-s SRC_ADDR[/LEN]] [\-d DST_ADDR] [\-y FRAG_SIZE] [\-u DST_OPT_HDR_SIZE] [\-U DST_OPT_U_HDR_SIZE] [\-H HBH_OPT_HDR_SIZE] [\-S LINK_SRC_ADDR] [\-D LINK-DST-ADDR] [\-E LINK_ADDR] [\-e] [\-F N_SOURCES] [\-z SECONDS] [\-l] [\-v] [\-h]
 
 .SH DESCRIPTION
 .B rs6
@@ -16,17 +18,16 @@ takes its parameters as command-line options. Each of the options can be specifi
 Depending on the amount of information (i.e., options and option data) to be conveyed into the Router Solicitations, it may be necessary for rs6 to split that information into more than one Router Solicitation. Also, when the rs6 tool is instructed to flood the victim with Router Solicitations from different sources ("\-\-flood\-sources" option), multiple packets may need to be generated. rs6 supports IPv6 fragmentation, which may be of use if a large amount of information needs to be conveyed within a single Router Solicitation message. IPv6 fragmentation is not enabled by default, and must be explicitly enabled with the "\-y" option.
 
 .TP
-\-\-interface, \-i
-
-This option specifies the network interface that the rs6 tool will use. The network interface must be specified (i.e., the tool does not select any network interface "by default").
+.BI \-i\  INTERFACE ,\ \-\-interface\  INTERFACE
+This option specifies the network interface that the tool will use. If the destination address ("\-d" option) is a link-local address, the interface must be explicitly specified. The interface may also be specified along with a destination address, with the "\-d" option.
 
 .TP
-\-\-src\-address, \-s
+.BI \-s\  SRC_ADDR ,\ \-\-src\-address\  SRC_ADDR
 
 This option is meant to specify the IPv6 Source Address (or IPv6 prefix) to be used for the Router Solicitation messages. If left unspecified, a randomized link-local unicast (fe80::/64) address is selected.
 
 .TP
-\-\-dst\-address, \-d
+.BI \-d\  DST_ADDR ,\ \-\-dst\-address\  DST_ADDR
 
 This option specifies the IPv6 Destination Address of the Router Solicitation messages. If left unspecified, but the Ethernet Destination Address is specified, the "all-routers link-local multicast" address (ff02::2) is selected as the IPv6 Destination Address. 
 
@@ -36,32 +37,32 @@ This option specifies the IPv6 Destination Address of the Router Solicitation me
 This option specifies the IPv6 Hop Limit to be used for the Router Solicitation messages. It defaults to 255. Note that IPv6 nodes are required to check that the Hop Limit of incoming Router Solicitation messages is 255. Therefore, this option is only useful to assess whether an IPv6 implementation fails to enforce the aforementioned check.
 
 .TP
-\-\-frag\-hdr, \-y
+.BI \-y\  SIZE ,\ \-\-frag\-hdr\  SIZE
 
 This option specifies that the resulting packet must be fragmented. The fragment size must be specified as an argument to this option.
 
 .TP
-\-\-dst\-opt\-hdr, \-u
+.BI \-u\  HDR_SIZE ,\ \-\-dst\-opt\-hdr\  HDR_SIZE
 
 This option specifies that a Destination Options header is to be included in the resulting packet. The extension header size must be specified as an argument to this option (the header is filled with padding options). Multiple Destination Options headers may be specified by means of multiple "\-u" options.
 
 .TP
-\-\-dst\-opt\-u\-hdr, \-U
+.BI \-U\  HDR_SIZE ,\ \-\-dst\-opt\-u\-hdr\  HDR_SIZE
 
 This option specifies a Destination Options header to be included in the "unfragmentable part" of the resulting packet. The header size must be specified as an argument to this option (the header is filled with padding options). Multiple Destination Options headers may be specified by means of multiple "\-U" options. This option is only valid if the "\-y" option is specified (as the concept of "unfragmentable part" only makes sense when fragmentation is employed).
 
 .TP
-\-\-hbh\-opt\-hdr, \-H
+.BI \-H\  HDR_SIZE ,\ \-\-hbh\-opt\-hdr\  HDR_SIZE
 
-This option specifies that a Hop-by-Hop Options header is to be included in the resulting packet. The header size must be specified as an argument to this option (the header is filled with padding options). Multiple Hop-by-Hop Options headers may be specified by means of multiple "\-H" options.
+This option specifies that a Hop-by-Hop Options header is to be included in the resulting packet. The header size must be specified as an argument to this option (the header is filled with padding options). Multiple Hop\-by\-Hop Options headers may be specified by means of multiple "\-H" options.
 
 .TP
-\-\-src\-link\-address, \-S
+.BI \-S\  SRC_LINK_ADDR ,\ \-\-src\-link\-address\  SRC_LINK_ADDR
 
 This option specifies the link-layer Source Address of the Router Solicitation messages (currently, only Ethernet is supported). If left unspecified, the link-layer Source Address is randomized.
 
 .TP
-\-\-link\-dst\-address, \-D
+.BI \-D\  DST_LINK_ADDR ,\ \-\-dst\-link\-address\  DST_LINK_ADDR
 
 This option specifies the link-layer Destination Address of the Router Solicitation messages (currently, only Ethernet is supported). If left unspecified, the link-layer Destination Address is set to "33:33:00:00:00:02" (the Ethernet address that corresponds to the "all-routers link-local multicast" address).
 
@@ -78,7 +79,7 @@ This option instructs the rs6 tool to include a source link-layer address option
 .TP
 \-\-flood\-sources, \-F
 
-This option instructs the rs6 tool to send Neighbor Solicitations from multiple (and random) IPv6 Source Addresses. The number of different sources is specified as "\-F number". The IPv6 Source Address of each Router Solicitation is a randomized from the IPv6 prefix specified with the "\-s" option, and defaults to a random link-local unicast address (fe80::/64).
+This option instructs the rs6 tool to send Router Solicitations from multiple (and random) IPv6 Source Addresses. The number of different sources is specified as "\-F number". The IPv6 Source Address of each Router Solicitation is a randomized from the IPv6 prefix specified with the "\-s" option, and defaults to a random link-local unicast address (fe80::/64).
 
 .TP
 \-\-loop, \-l
@@ -88,7 +89,7 @@ This option instructs the rs6 tool to send periodic Router Solicitations to the
 .TP
 \-\-sleep, \-z
 
-This option instructs the rs6 tool to the amount of time to pause between sending Neighbor Solicitations. If left unspecified, it defaults to 1 second.
+This option instructs the rs6 tool to the amount of time to pause between sending Router Solicitation messages. If left unspecified, it defaults to 1 second.
 
 .TP
 \-\-verbose, \-v
@@ -125,7 +126,7 @@ Send 100 Router Solicitation messages using a random Ethernet Source Address and
 Send one Router Solicitation message using a random Ethernet Source Address and a random link-local unicast (i.e., fe80::/64) IPv6 Source Address, to the Ethernet Destination Address "33:33:00:00:00:02" (default) and the IPv6 Destination Address "fe80::1". Each Router Solicitation includes a source link-layer address option that contains the Ethernet address "ff:ff:ff:ff:ff:ff". Be verbose.
 
 .SH SEE ALSO
-"Security/Robustness Assessment of IPv6 Neighbor Discovery Implementations" (available at: <http://www.si6networks.com/tools/ipv6toolkit/si6networks-ipv6\-nd-assessment.pdf>) for a discussion of Neighbor Discovery vulnerabilities, and additional examples of how to use the na6 tool to exploit them.
+"Security/Robustness Assessment of IPv6 Neighbor Discovery Implementations" (available at: <http://www.si6networks.com/tools/ipv6toolkit/si6networks\-ipv6\-nd\-assessment.pdf>) for a discussion of Neighbor Discovery vulnerabilities, and additional examples of how to use the na6 tool to exploit them.
 
 .SH AUTHOR
 The
@@ -138,6 +139,5 @@ for SI6 Networks
 .SH COPYRIGHT
 Copyright (c) 2011\-2013 Fernando Gont.
 
-Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being just "AUTHOR" and "COPYRIGHT", with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the license is available at
+Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front\-Cover Texts, and no Back\-Cover Texts.  A copy of the license is available at
 .IR <http://www.gnu.org/licenses/fdl.html> .
-
index ffc5865..e527744 100644 (file)
@@ -3,8 +3,8 @@
 scan6 \- An IPv6 host scanner
 .SH SYNOPSIS
 .B scan6
-.RB \-i
-.IR INTERFACE
+.RB [\| \-i
+.IR INTERFACE \|]
 .RB [\| \-s
 .IR SRC_ADDR \|[/\| LEN \|]]
 .RB [\| \-d
@@ -80,9 +80,9 @@ operates (roughly) as follows:
 .sp
 .RS 4
 .nf
-\+ The tool learns the local prefixes used for auto-configuration,
+\+ The tool learns the local prefixes used for auto\-configuration,
 \  and generates one address for each local prefix (in addition to
-\  a link-local address)
+\  a link\-local address)
 
 \+ An ICMPv6 Echo Request message destined to the all-nodes on-link
 \  multicast address (ff02::1) is sent with each of the addresses 
@@ -102,7 +102,7 @@ operates (roughly) as follows:
 \+ Each time a new "alive" address is discovered, the corresponding
 \  Interface-ID is combined with all the local prefixes, and the 
 \  resulting addresses are probed (with unicasted packets). This 
-\  can help to discover all the SLAAC-derived and the "private 
+\  can help to discover all the SLAAC\-derived and the "private 
 \  addresses", since some responses might contain e.g. Modified 
 \  EUI-64 Format Identifiers, which are likely used with all the 
 \  available prefixes.
@@ -112,7 +112,7 @@ operates (roughly) as follows:
 .fi
 .RE
 
-The aforementioned scheme can fail to discover some addresses for some implementation. For example, MacOS X employs IPv6 addresses embedding IEEE-identifiers when responding to packets destined to a link-local multicast address (and hence the temporary addresses could not be learned).
+The aforementioned scheme can fail to discover some addresses for some implementation. For example, MacOS X employs IPv6 addresses embedding IEEE-identifiers when responding to packets destined to a link\-local multicast address (and hence the temporary addresses could not be learned).
 
 \fBRemote scans\fR
 
@@ -137,7 +137,7 @@ scan6 employs a number of bran-new techniques for performing address scans of re
 .fi
 .RE
 
-A thorough discussion of these address patterns can be found in: <http://tools.ietf.org/html/draft-ietf-opsec-ipv6\-host-scanning>.
+A thorough discussion of these address patterns can be found in: <http://tools.ietf.org/html/draft\-ietf\-opsec\-ipv6\-host\-scanning>.
 
 \fBHOST TRACKING\fR
 
@@ -156,12 +156,14 @@ takes its parameters as command-line options. Each of the options can be specifi
 
 .TP
 .BI \-i\  interface ,\ \-\-interface\  interface
+
 This option specifies the network interface to be used by the
 .B scan6
-tool. For local scans (\-L option), specification of the network interface is mandatory (i.e., the tool does not select any network interface "by default").
+tool, and is mandatory when performing local address scans (\-L option).
 
 .TP
 .BI \-s\  SRC_ADDR ,\ \-\-src\-address\  SRC_ADDR
+
 This option specifies the IPv6 Source Address to be used for the Source Address of the probe packets. If a prefix is specified, the Source Address is randomly selected from that prefix.
 
 If this option is left unspecified, the addresses currently configured for the specified network interface card are used. 
@@ -174,9 +176,9 @@ This option specifies the target address prefix/range of the address scan. An IP
 .TP
 .BI \-S\  SRC_LINK_ADDR ,\ \-\-link\-src\-address\  SRC_LINK_ADDR
 
-This option specifies the link-layer Source Address of the probe packets (currently, only Ethernet is supported). If left unspecified, the real link-layer address of the interface is used.
+This option specifies the link\-layer Source Address of the probe packets (currently, only Ethernet is supported). If left unspecified, the real link\-layer address of the interface is used.
 
-Note: Some systems may discard packets when the link-layer address is forged. That is, even when the relevant function calls (and hence the scan6 tool itself) may return "success", packets may be discarded and not actually sent on the specified network link. In such scenarios, the real Ethernet address should be used. This type of behaviour has been found in some Linux systems.
+Note: Some systems may discard packets when the link\-layer address is forged. That is, even when the relevant function calls (and hence the scan6 tool itself) may return "success", packets may be discarded and not actually sent on the specified network link. In such scenarios, the real Ethernet address should be used. This type of behaviour has been found in some Linux systems.
 
 .TP
 .BI \-p\  PROBE_TYPE ,\ \-\-probe\-type\  PROBE_TYPE 
@@ -214,7 +216,7 @@ If this option is left unspecified, the ACK bit is set on all probe packets.
 
 This option specifies the address types to be printed/informed by the 
 .B scan6
-tool. The possible arguments are: "local" (link-local addresses), "global" (global addresses), and "all" (print both link-local and global-addresses). If left unspecified, this option defaults to "all" (print both link-local and global-addresses).
+tool. The possible arguments are: "local" (link\-local addresses), "global" (global addresses), and "all" (print both link\-local and global-addresses). If left unspecified, this option defaults to "all" (print both link\-local and global-addresses).
 
 .TP
 .BR \-q ,\  \-\-print\-unique
@@ -226,7 +228,7 @@ Note: In the case of systems that implement "Privacy Extensions for SLAAC" (IETF
 .TP
 .BR \-e\|  ,\  \-\-print\-link\-addr
 
-This option specifies that the link-layer addresses should be printed along with the IPv6 addresses, with the format "IPV6ADDRESS @ LINKADDRESS".
+This option specifies that the link\-layer addresses should be printed along with the IPv6 addresses, with the format "IPV6ADDRESS @ LINKADDRESS".
 
 .TP
 .BR \-t\|  ,\  \-\-print\-timestamp
@@ -263,24 +265,24 @@ This option specifies that the IPv6 Source Address should be randomized.
 This option specifies that the Ethernet Source Address should be randomized.
 
 .TP
-.BI \-V\  VM_TYPE ,\ \-\-tgt-virtual\-machines\  VM_TYPE
+.BI \-V\  VM_TYPE ,\ \-\-tgt\-virtual\-machines\  VM_TYPE
 
 This option specifies that the target is virtual machines. Possible options are: 'vbox' (VirtualBox), 'vmware' (vmware), and 'all' (both VirtualBox and vmware). When this option is specified, scan6 can narrow dow the search space by targeting only those IEEE OUIs employed by the aforementioned virtualization software. Note: For vmware, the search space can be further reduced if the '\-\-ipv4\-host' option is specified.
 
 .TP
-.BR \-b\| ,\  \-\-tgt\-low-byte
+.BR \-b\| ,\  \-\-tgt\-low\-byte
 
 This option specifies that the target is IPv6 nodes employing "low-byte" addresses. Low byte addresses are generated by concatenating the IPv6 prefix specified by the "\-d" option with an Interface I-D of the form "0:0:0\-100:0\-1500".
 
 .TP
-.BI \-B\  IPV4_ENCODING ,\ \-\-tgt\-ipv4\-embedded\  IPV4_ENCODING
+.BI \-B\  IPV4_ENCODING ,\ \-\-tgt\-ipv4\  IPV4_ENCODING
 
 This option specifies that the target is IPv6 addresses that embed an IPv4 address. Possible encondings are "ipv4-32" (where the IPv4 address is embedded in the low-order 32 bits of the IPv6 address), "ipv4-64" (where the IPv4 address is embedded in the low-order 64 bits of the IPv6 address), and "ipv4-all" (which is equivalent to setting both the "ipv4-32" and "ipv4-64" encodings). When this option is set, a prefix should be specified with the '\-\-ipv4\-host' option, such that the search space is reduced.
 
 Note: When an IPv4 address is encoded in 64 bits, each byte of the IPv4 address is firstly converted to a number that has the same representation in hexadecimal (e.g., 100 would be converted to 256, since the hexadecimal representation of 256 is 0x100) before that byte is embedded in a 16-bit word. For example, the IPv4 address 192.168.0.1 would result, when combined with the prefix 2001:db8::/32 in the IPv6 address 2001:db8::192:168:0:1 (note that while each byte of the original IPv4 address has the same representation within the IPv6 address, each value now stands for an hexadecimal number).
 
 .TP
-.BR \-g\| ,\  \-\-tgt\-port\-embedded
+.BR \-g\| ,\  \-\-tgt\-port
 
 This option specifies that the target is IPv6 addresses that embed service ports (such as 2001:db8::25, 2001:db8::80, etc.). When this option is set addresses containing these ports will be probed: 
 .sp
@@ -349,16 +351,14 @@ This option specifies the name of a file containing a list of IPv6 addresses and
 .TP
 .BI \-w\  IIDS_FILE ,\ \-\-tgt\-iids\-file\  IIDS_FILE
 
-This option specifies the name of a file containing one IPv6 address per line. The Interface ID of each of those IPv6 addresses will be employed, together with the network prefix specified with the '\-d' option, to construct the IPv6 addresses to be probed. Since auto-configured addresses typically employ Interface IDs that are constant across networks, this option can leverage known IIDs to track such nodes across networks. Please see <http://tools.ietf.org/html/draft-ietf-6man-stable-privacy-addresses> for further details. Note: The file can contain comments if they are preceded with the numeral sign ('#'), as in:
+This option specifies the name of a file containing one IPv6 address per line. The Interface ID of each of those IPv6 addresses will be employed, together with the network prefix specified with the '\-d' option, to construct the IPv6 addresses to be probed. Since auto-configured addresses typically employ Interface IDs that are constant across networks, this option can leverage known IIDs to track such nodes across networks. Please see <http://tools.ietf.org/html/draft\-ietf\-6man\-stable\-privacy\-addresses> for further details. Note: The file can contain comments if they are preceded with the numeral sign ('#'), as in:
 
         IPv6_address      # comment
 
 .TP
 .BI \-W\  IID ,\ \-\-tgt\-iid\  IID
 
-.nf
 This option specifies an IPv6 Interface Identifier (IID), with the same syntax as that of an IPv6 address (only the lowest-order 64 bits of the address will be employed). The specified Interface ID will be employed, together with the any network prefixes specified with the '\-d' option (or with the '\-m' option), to construct the IPv6 addresses to be probed. Since auto-configured addresses typically employ Interface IDs that are constant across networks, this option can leverage known IIDs to track such nodes across networks. Please see <http://tools.ietf.org/html/draft-ietf-6man-stable-privacy-addresses> for further details. Note: The file can contain comments if they are preceded with the numeral sign ('#'), as in:
-.fi
 
         IPv6_address      # comment
 
@@ -395,14 +395,14 @@ This option specifies that the tool should periodically loop through the specifi
 This option specifies the amount of time (in seconds) that the tool should sleep in-between iterations over the specified targets. It is only meaningful when the '\-l' option is set.
 
 .TP
-.BI \-c\  CONFIG_FILE ,\ \-\-config-file\  CONFIG_FILE
+.BI \-c\  CONFIG_FILE ,\ \-\-config\-file\  CONFIG_FILE
 
 This option is used to specify an alternative configuration file. If left unspecified, the tool will employ '/etc/ipv6toolkit.conf'.
 
 .TP
 .BR \-v\| ,\  \-\-verbose 
 
-This option selects the "verbosity" of the tool. If this option is left unspecified, only minimum information is printed. If this option is set once, additional information is printed (e.g., the tool indicates which addresses are "link-local" and which addresses are "global"). If this option is set twice, detailed information will be printed in the case the tool finds any problems when performing host scanning.
+This option selects the "verbosity" of the tool. If this option is left unspecified, only minimum information is printed. If this option is set once, additional information is printed (e.g., the tool indicates which addresses are "link\-local" and which addresses are "global"). If this option is set twice, detailed information will be printed in the case the tool finds any problems when performing host scanning.
 
 .TP
 .BR \-h\| ,\  \-\-help
@@ -419,34 +419,34 @@ tool.
 
 \fBExample #1\fR
 
-# ./scan6 \-i eth0 \-L \-e \-v
+# scan6 \-i eth0 \-L \-e \-v
 
 Perform host scanning on the local network ("\-L" option) using interface "eth0" ("\-i" option). Use both ICMPv6 echo requests and unrecognized IPv6 options of type 10xxxxxx (default). Print link-link layer addresses along with IPv6 addresses ("\-e" option). Be verbose ("\-v" option).
 
 
 \fBExample #2\fR
 
-# ./scan6 \-i eth0 \-d 2001:db8::/64 \-\-tgt\-virtual\-machines all –ipv4\-host 10.10.10.0/24
+# scan6 \-d 2001:db8::/64 \-\-tgt\-virtual\-machines all \-\-ipv4\-host 10.10.10.0/24
 
-Use the "eth0" interface ("\-i" option) to scan for virtual machines (both VirtualBox and vmware) in the prefix 2001:db8::/64. The additional information about the IPv4 prefix employed by the host system is leveraged to reduce the search space.
+Scan for virtual machines (both VirtualBox and vmware) in the prefix 2001:db8::/64. The additional information about the IPv4 prefix employed by the host system is leveraged to reduce the search space.
 
 \fBExample #3\fR
 
-# ./scan6 \-i eth0 \-d 2001:db8::/64 \-\-tgt\-ipv4\-embedded ipv4-32 \-\-ipv4\-host 10.10.10.0/24
+# scan6 \-d 2001:db8::/64 \-\-tgt\-ipv4\-embedded ipv4\-32 \-\-ipv4\-host 10.10.10.0/24
 
-Use the "eth0" interface ("\-i" option) to scan for IPv6 addresses of the network 2001:db8::/64 that embed the IPv4 prefix 10.10.10.0/24 (with the 32-bit encoding).
+Scan for IPv6 addresses of the network 2001:db8::/64 that embed the IPv4 prefix 10.10.10.0/24 (with the 32-bit encoding).
 
 \fBExample #4\fR
 
-# ./scan6 \-i eth0 \-d 2001:db8:0\-500:0\-1000
+# scan6 \-d 2001:db8:0\-500:0\-1000
 
-Use the "eth0" interface ("\-i" option) to scan for IPv6 addresses of the network 2001:db8::/64, varying the two lowest order 16\-bit words of the addresses in the range 0\-500 and 0\-1000, respectively.
+Scan for IPv6 addresses of the network 2001:db8::/64, varying the two lowest order 16\-bit words of the addresses in the range 0\-500 and 0\-1000, respectively.
 
 \fBExample #5\fR
 
-# ./scan6 \-i eth0 \-d fc00::/64 \-\-tgt\-vendor 'Dell Inc' \-p tcp
+# scan6 \-d fc00::/64 \-\-tgt\-vendor 'Dell Inc' \-p tcp
 
-Use the "eth0" interface to scan for network devices manufactured by 'Dell Inc' in the target prefix fc00::/64. The tool will employ TCP segments as the probe packets (rather than the default ICMPv6 echo requests).
+Scan for network devices manufactured by 'Dell Inc' in the target prefix fc00::/64. The tool will employ TCP segments as the probe packets (rather than the default ICMPv6 echo requests).
 
 \fBExample #6\fR
 
@@ -456,9 +456,9 @@ Use the "eth0" interface ("\-i" option) to perform host-scanning on the local ne
 
 \fBExample #7\fR
 
-# scan6 \-i eth0 \-d 2001:db8::/64 \-w KNOWN_IIDS
+# scan6 \-d 2001:db8::/64 \-w KNOWN_IIDS
 
-Use the "eth0" interface ("\-i" option) to perform an address scan of a set of known hosts listed in the file KNOWN_IIDS, at remote network 2001:db8::/64. The target addresses are obtaining by concatenating the network prefix 2001:db8::/64 with the interface IDs of each of the addresses fund in the file KNOWN_IIDS.
+Perform an address scan of a set of known hosts listed in the file KNOWN_IIDS, at remote network 2001:db8::/64. The target addresses are obtaining by concatenating the network prefix 2001:db8::/64 with the interface IDs of each of the addresses fund in the file KNOWN_IIDS.
 
 \fBExample #8\fR
 
@@ -468,30 +468,28 @@ Use the "eth0" interface ("\-i" option) to perform host-scanning on the local ne
 
 \fBExample #9\fR
 
-# scan6 \-i eth0 \-m knownprefixes.txt \-w knowniids.txt \-l \-z 60 \-t \-v
+# scan6 \-m knownprefixes.txt \-w knowniids.txt \-l \-z 60 \-t \-v
 
-Use the "eth0" interface ("\-i" option). Build the list of targets from the IPv6 prefixes contained in the file 'knownprefixes.txt' and the Interface IDs (IIDs) contained in the file 'knowniids.txt'. Poll the targets periodically ("\-l" option), and sleep 60 seconds after each iteration ("\-z" option). Print a timestamp along the IPv6 address of each alive node ("\-t" option). Be verbose ("\-v" option).
+Build the list of targets from the IPv6 prefixes contained in the file 'knownprefixes.txt' and the Interface IDs (IIDs) contained in the file 'knowniids.txt'. Poll the targets periodically ("\-l" option), and sleep 60 seconds after each iteration ("\-z" option). Print a timestamp along the IPv6 address of each alive node ("\-t" option). Be verbose ("\-v" option).
 
 
 .SH SEE ALSO
 .BR ipv6toolkit.conf (5)
 
-draft-ietf-opsec-ipv6\-host-scanning (available at: 
-.IR <http://tools.ietf.org/html/draft-ietf-opsec-ipv6\-host-scanning> )
-for a discussion of the IPv6 host-tracking technique implemented by
+draft\-ietf\-opsec\-ipv6\-host\-scanning (available at: 
+.IR <http://tools.ietf.org/html/draft\-ietf\-opsec\-ipv6\-host\-scanning> )
+for a discussion of the IPv6 host\-tracking technique implemented by
 .B scan6
 , and a proposal on how to mitigate such attacks.
 
-.nf
-draft-ietf-6man-stable-privacy-addresses (available at: 
-.IR <http://tools.ietf.org/html/draft-ietf-6man-stable-privacy-addresses> )
+draft\-ietf\-6man\-stable\-privacy\-addresses (available at: 
+.IR <http://tools.ietf.org/html/draft\-ietf\-6man\-stable\-privacy\-addresses> )
 for a discussion of the scanning techniques implemented by
 .B scan6
 , and a discussion of a number of aspects that should be taken into account when performing address scanning of remote networks.
-.fi
 
 RFC 6583 (available at 
-.IR <http://www.rfc-editor.org/rfc/rfc6583.txt> )
+.IR <http://www.rfc\-editor.org/rfc/rfc6583.txt> )
 for a discussion of the potential Denial of Service (DoS) when scanning remote networks.
 
 .SH AUTHOR
@@ -505,5 +503,5 @@ for SI6 Networks
 .SH COPYRIGHT
 Copyright (c) 2011\-2013 Fernando Gont.
 
-Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being just "AUTHOR" and "COPYRIGHT", with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the license is available at
+Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front\-Cover Texts, and no Back\-Cover Texts.  A copy of the license is available at
 .IR <http://www.gnu.org/licenses/fdl.html> .
index c5b9ef8..a9e8d5b 100644 (file)
@@ -3,7 +3,7 @@
 tcp6 \- A security assessment tool for TCP/IPv6 implementations
 .SH SYNOPSIS
 .B tcp6
-\-i INTERFACE [\-S LINK_SRC_ADDR] [\-D LINK-DST-ADDR] [\-s SRC_ADDR[/LEN]] [\-d DST_ADDR] [\-A HOP_LIMIT] [\-y FRAG_SIZE] [\-u DST_OPT_HDR_SIZE] [\-U DST_OPT_U_HDR_SIZE] [\-H HBH_OPT_HDR_SIZE] [\-c OPEN_TYPE] [\-C CLOSE_TYPE] [\-P PAYLOAD_SIZE] [\-o SRC_PORT] [\-a DST_PORT] [\-X TCP_FLAGS] [\-q TCP_SEQ] [\-Q TCP_ACK] [\-V TCP_URP] [\-w TCP_WIN] [\-W WINDOW_MODE] [\-M WIN_MOD_MODE] [\-Z DATA] [\-N] [\-n] [\-j PREFIX[/LEN]] [\-k PREFIX[/LEN]] [\-J LINK_ADDR] [\-K LINK_ADDR] [\-b PREFIX[/LEN]] [\-g PREFIX[/LEN]] [\-B LINK_ADDR] [\-G LINK_ADDR] [\-F N_SOURCES] [\-T N_PORTS] [\-f] [\-R] [\-L] [\-l] [\-z SECONDS] [\-r RATE] [\-v] [\-h]
+\-i INTERFACE [\-S LINK_SRC_ADDR] [\-D LINK-DST-ADDR] [\-s SRC_ADDR[/LEN]] [\-d DST_ADDR] [\-A HOP_LIMIT] [\-y FRAG_SIZE] [\-u DST_OPT_HDR_SIZE] [\-U DST_OPT_U_HDR_SIZE] [\-H HBH_OPT_HDR_SIZE] [\-c OPEN_TYPE] [\-C CLOSE_TYPE] [\-P PAYLOAD_SIZE] [\-o SRC_PORT] [\-a DST_PORT] [\-X TCP_FLAGS] [\-q TCP_SEQ] [\-Q TCP_ACK] [\-V TCP_URP] [\-w TCP_WIN] [\-W WINDOW_MODE] [\-M WIN_MOD_MODE] [\-Z DATA] [\-N] [\-n] [\-j PREFIX[/LEN]] [\-k PREFIX[/LEN]] [\-J LINK_ADDR] [\-K LINK_ADDR] [\-b PREFIX[/LEN]] [\-g PREFIX[/LEN]] [\-B LINK_ADDR] [\-G LINK_ADDR] [\-F N_SOURCES] [\-T N_PORTS] [\-f] [\-R] [\-L] [\-l] [\-p PROBE_MODE] [\-z SECONDS] [\-r RATE] [\-v] [\-h]
 
 .SH DESCRIPTION
 .B tcp6
@@ -287,6 +287,31 @@ This option specifies the rate limit to use when performing a remote address sca
 This instructs the tcp6 tool to operate in listening mode (possibly after attacking a given node). Note that this option cannot be used in conjunction with the "\-l" ("\-\-loop") option.
 
 .TP
+.BI \-p\   PROBE_MODE ,\ \-\-probe\-mode\  PROBE_MODE
+
+This option instructs tcp6 to operate in probe mode. The specific probe mode is specified as an argument to this option (currently, only "script" mode is supported). In probe mode, 
+.B tcp6 
+sends probe segments, and waits for response packets. The response packets are decoded based on the selected probe mode.
+
+In the "script" probe mode, the tool decodes TCP segments as follows:
+
+     RESPONSE:RESPONSE_TYPE:RESPONSE_DECODE...
+
+Where the string RESPONSE is fixed, and RESPONSE_TYPE indicates the response received. As of this version of the tool, the following RESPONSE_TYPE values are supported:
+
+   \+ TCP6: Indicates that the tool received a TCP/IPv6 packet
+   \+ TIMEOUT: Indicates that the tool received no response
+
+If RESPONSE_TYPE is TCP6, RESPONSE code contains the TCP flags set in the receive TCP segment. The TCP flags are encoded as "F" (FIN), "S" (SYN), "R" (RST), "P" (PSH), "A" (ACK), and "U" (URG).
+
+Possibe output lines of the tool are:
+
+    RESPONSE:TIMEOUT:
+    RESPONSE:TCP6:RA:
+
+Note: Future versions of the tool will also decode ICMPv6 error messages, and will include additional data regarding the incoming TCP segments (e.g., ACK value, payload size, etc.).
+
+.TP
 .BR \-v\| ,\  \-\-verbose 
 
 This option instructs the tcp6 tool to be verbose.  When the option is set twice, the tool is "very verbose", and the tool also informs which packets have been accepted or discarded as a result of applying the specified filters. 
@@ -337,6 +362,13 @@ will send an HTTP application request.
 Flood the target node (fc00:1::1) with TCP connections (on port 80). On each connection that is established, an HTTP request is sent, and the TCP window is immediately closed. For each forged IPv6 source address ten different TCP source ports are randomized. The bandwidth of the attack is limited to 1000 pps.
 
 
+\fBExample #5\fR
+
+# tcp6 \-d fc00:1::1 \-a 80 \-\-tcp\-flags A \-\-dst-opt-hdr 8 \-\-payload\-size 50 \-\-probe\-mode script
+
+Send a probe TCP segment to TCP port 80 at fc00:1::1. The probe packet consists of an IPv6 packet with a Destination Options header of 8 bytes, and an IPv6 payload consisting of a TCP segment with the ACK bit set, and 50 data bytes. The probe mode is "script".
+
+
 .SH SEE ALSO
 "Security Assessment of the Transmission Control Protocol (TCP)" (available at: <http://www.gont.com.ar/papers/tn\-03\-09\-security\-assessment\-TCP.pdf>) for a discussion of TCP vulnerabilities.
 
@@ -351,6 +383,5 @@ for SI6 Networks
 .SH COPYRIGHT
 Copyright (c) 2011\-2013 Fernando Gont.
 
-Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being just "AUTHOR" and "COPYRIGHT", with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the license is available at
+Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.  A copy of the license is available at
 .IR <http://www.gnu.org/licenses/fdl.html> .
-
diff --git a/manuals/tcp6.1~ b/manuals/tcp6.1~
new file mode 100644 (file)
index 0000000..0b301ad
--- /dev/null
@@ -0,0 +1,387 @@
+.TH TCP6 1
+.SH NAME
+tcp6 \- A security assessment tool for TCP/IPv6 implementations
+.SH SYNOPSIS
+.B tcp6
+\-i INTERFACE [\-S LINK_SRC_ADDR] [\-D LINK-DST-ADDR] [\-s SRC_ADDR[/LEN]] [\-d DST_ADDR] [\-A HOP_LIMIT] [\-y FRAG_SIZE] [\-u DST_OPT_HDR_SIZE] [\-U DST_OPT_U_HDR_SIZE] [\-H HBH_OPT_HDR_SIZE] [\-c OPEN_TYPE] [\-C CLOSE_TYPE] [\-P PAYLOAD_SIZE] [\-o SRC_PORT] [\-a DST_PORT] [\-X TCP_FLAGS] [\-q TCP_SEQ] [\-Q TCP_ACK] [\-V TCP_URP] [\-w TCP_WIN] [\-W WINDOW_MODE] [\-M WIN_MOD_MODE] [\-Z DATA] [\-N] [\-n] [\-j PREFIX[/LEN]] [\-k PREFIX[/LEN]] [\-J LINK_ADDR] [\-K LINK_ADDR] [\-b PREFIX[/LEN]] [\-g PREFIX[/LEN]] [\-B LINK_ADDR] [\-G LINK_ADDR] [\-F N_SOURCES] [\-T N_PORTS] [\-f] [\-R] [\-L] [\-l] [\-z SECONDS] [\-r RATE] [\-v] [\-h]
+
+.SH DESCRIPTION
+.B tcp6
+tool allows the assessment of IPv6 implementations with respect to a variety of attack vectors based on TCP/IPv6 segments. This tool is part of the SI6 Networks' IPv6 Toolkit: a security assessment suite for the IPv6 protocols. 
+
+.B tcp6
+can be employed to perform specific TCP connection-establishment and connection-termination sequences. For example, it can be employed to simulate a TCP "simultaneous open" scenario (see the "\-\-open\-mode" option) or to simulate a TCP "simultaneous close" scenario (see the "\-\-close\-mode" option). It can be employed to perform a number of resource-exhaustion attacks against TCP, such as SYN-flooding attacks, connection\-flooding attacks (see the "\-\-flood\-sources" and "\-\-flood\-ports" options), etc. Additionally, it can be employed to exploit attack vectors based on the TCP window (see the "\-\-window" option).
+
+.B tcp6
+tool has two modes of operation: active and listening. In active mode, the tool attacks a specific target, while in listening mode the tool listens to TCP traffic on the local network, and launches an attack in response to such traffic. Active mode is employed if an IPv6 Destination Address is specified. Listening mode is employed if the "\-L" option (or its long counterpart "\-\-listen") is set. If both an attack target and the "\-L" option are specified, the attack is launched against the specified target, and then the tool enters listening mode to respond incoming packets with TCP segments.
+
+.B tcp6
+supports filtering of incoming packets based on the Ethernet Source Address, the Ethernet Destination Address, the IPv6 Source Address, and the IPv6 Destination Address.  There are two types of filters: "block filters" and "accept filters". If any "block filter" is specified, and the incoming packet matches any of those filters, the message is discarded (and thus no TCP segments are sent in response). If any "accept filter" is specified, incoming packets must match the specified filters in order for the tool to respond with TCP segments.
+
+.SH OPTIONS
+.B tcp6
+takes itS parameters as command\-line options. Each of the options can be specified with a short name (one character preceded with the hyphen character, as e.g. "\-i") or with a long name (a string preceded with two hyphen characters, as e.g. "\-\-interface").
+
+If the tool is instructed to e.g. flood the victim with TCP segments from different sources ("\-\-flood\-sources" option), multiple packets may need to be generated. 
+
+tcp6 supports IPv6 Extension Headers, including the IPv6 Fragmentation Header, which might be of use to circumvent layer-2 filtering and/or Network Intrusion Detection Systems (NIDS). However, IPv6 extension headers are not employed by default, and must be explicitly enabled with the corresponding options.
+
+.TP
+.BI \-i\  INTERFACE ,\ \-\-interface\  INTERFACE
+This option specifies the network interface that the tool will use. The network interface must be specified (i.e., the tool does not select any network interface "by default").
+
+.TP
+.BI \-S\  SRC_LINK_ADDR ,\ \-\-src\-link\-address\  SRC_LINK_ADDR
+
+This option specifies the link-layer Source Address of the probe packets. If left unspecified, the link-layer Source Address of the packets is set to the real link-layer address of the network interface. Note: this option is meaningful only when the underlying link-layer technology is Ethernet.
+
+.TP
+.BI \-D\  DST_LINK_ADDR ,\ \-\-dst\-link\-address\  DST_LINK_ADDR
+
+This option specifies the link-layer Destination Address of the probe packets. By default, the link-layer Destination Address is automatically set to the link-layer address of the destination host (for on-link destinations) or to the link-layer address of the first-hop router. Note: this option is meaningful only when the underlying link-layer technology is Ethernet.
+
+.TP
+.BI \-s\  SRC_ADDR ,\ \-\-src\-address\  SRC_ADDR
+
+This option specifies the IPv6 source address (or IPv6 prefix) to be used for the Source Address of the attack packets. If the "\-F" ("\-\-flood\-sources") option is specified, this option includes an IPv6 prefix, from which random addresses are selected. See the description of the "\-F" option for further information on how the "\-s" option is processed in that specific case.
+
+Note: When operating in "listening" mode, the Source Address is automatically set to the Destination Address of the incoming packet.
+
+.TP
+.BI \-d\  DST_ADDR ,\ \-\-dst\-address\  DST_ADDR
+
+This option specifies the IPv6 Destination Address of the victim. It can be left unspecified only if the "\-L" option is selected (i.e., if the tool is to operate in "listening" mode).
+
+Note: When operating in "listening" mode, the Destination Address is automatically set to the Source Address of the incoming packet.
+
+.TP
+.BI \-A\  HOP_LIMIT ,\ \-\-hop\-limit\  HOP_LIMIT
+
+This option specifies the Hop Limit to be used for the IPv6 packets. It defaults to 255.
+
+.TP
+.BI \-u\  HDR_SIZE ,\ \-\-dst\-opt\-hdr\  HDR_SIZE
+
+This option specifies that a Destination Options header is to be included in the outgoing packet(s). The extension header size must be specified as an argument to this option (the header is filled with padding options). Multiple Destination Options headers may be specified by means of multiple "\-u" options.
+
+.TP
+.BI \-U\  HDR_SIZE ,\ \-\-dst\-opt\-u\-hdr\  HDR_SIZE
+
+This option specifies a Destination Options header to be included in the "unfragmentable part" of the outgoing packet(s). The header size must be specified as an argument to this option (the header is filled with padding options). Multiple Destination Options headers may be specified by means of multiple "\-U" options. 
+
+.TP
+.BI \-H\  HDR_SIZE ,\ \-\-hbh\-opt\-hdr\  HDR_SIZE
+
+This option specifies that a Hop-by-Hop Options header is to be included in the outgoing packet(s). The header size must be specified as an argument to this option (the header is filled with padding options). Multiple Hop-by-Hop Options headers may be specified by means of multiple "\-H" options.
+
+.TP
+.BI \-y\  FRAG_SIZE ,\ \-\-frag\-hdr\  FRAG_SIZE
+
+This option specifies that the resulting packet must be fragmented. The fragment size must be specified as an argument to this option.
+
+.TP
+.BI \-P\  PAYLOAD_SIZE ,\ \-\-payload\-size\  PAYLOAD_SIZE
+
+This options specifies the size of the TCP payload. It defaults to 0 (i.e., empty TCP segments).
+
+.TP
+.BI \-o\  SRC_PORT ,\ \-\-src\-port\  SRC_PORT
+
+This option specifies the TCP Source Port.
+
+.TP
+.BI \-a\   DST_PORT ,\ \-\-dst\-port\  DST_PORT
+
+This option specifies the TCP/UDP Destination Port.
+
+.TP
+.BI \-X\   TCP_FLAGS ,\ \-\-tcp\-flags\  TCP_FLAGS
+
+his option is used to set specific the TCP flags. The flags are specified as "F" (FIN), "S" (SYN), "R" (RST), "P" (PSH), "A" (ACK), "U" (URG), "X" (no flags). 
+
+If this option is not set, and the tool operates in listening mode, the flags of the generated TCP segments are automatically set as follows: TCP segments elicited by SYNs have both the SYN and ACK flags set. All other TCP segments have the ACK bit set.
+
+.TP
+.BI \-q\   SEQ_NUMBER ,\ \-\-tcp\-seq\  SEQ_NUMBER
+
+This option specifies the Sequence Number of the TCP header. If left unspecified, the Sequence Number is randomized.
+
+If this option is left unspecified and the tool is operating in listening mode, the TCP Sequence Number is set to the Acknowledgement Number of the packet that elicited the TCP segment.
+
+.TP
+.BI \-Q\   ACK_NUMBER ,\ \-\-tcp\-ack\  ACK_NUMBER
+
+This option specifies the Acknowledgment Number of the TCP segment. If left unspecified, the Acknowledgment Number is randomized.
+
+If this option is left unspecified and the tool is operating in listening mode, the TCP Sequence Number is set to the Acknowledgement Number of the packet that elicited the TCP segment.
+
+.TP
+.BI \-V\   URG_POINTER ,\ \-\-tcp\-urg\  URG_POINTER
+
+This option specifies the Urgent Pointer of the TCP segment. If left unspecified, the Urgent Pointer is set to 0.
+
+.TP
+.BI \-w\   TCP_WINDOW ,\ \-\-tcp\-win\  TCP_WINDOW
+
+This option specifies the value of the TCP Window. If left unspecified, the Window is randomized.
+
+.TP
+.BI \-W\   WIN_MODE ,\ \-\-window\-mode\  WIN_MODE
+
+This option specifies how to operate the TCP window by means of the WIN_MODE parameter. Two modes are supported:
+
+   \+ closed
+   \+ modulated
+
+When the "closed" mode is selected, the TCP window will be set to 0 (i.e., "closed window"). If the tool estabishes new TCP connections, the initial window advertised during the TCP three\-way handshake will be that specified with the '\-w' option. However, once the connection has been established, the TCP window will be set to 0. This allows for the implementation of the so\-called Netkill attack, discussed in Section 7.1.1 of the document "Security Assessment of the Transmission Control Protocol (TCP)" (available at: <http://www.gont.com.ar/papers/tn\-03\-09\-security\-assessment\-TCP.pdf>).
+
+When the "modulated" mode is selected, the TCP window will oscillate between alternate between two different values. These values, along the amount of time that each of them is "active", can be specified by means of the '\-M' ("\-\-win-modulate") option. The first of the aforementioned values is meant to close the window (hence it will typically be zero), while the second is meant to open the window. The goal of alternating between these two values is to circumvent a trivial mitigation against Zero-Window attacks implemented by some stacks where they enforce a limit on the maximum amount of time that the TCP advertised by a remote peer remains fully\-closed (i.e., set to 0). By changing the advertised window to some other (small) value every now and then, such a trivial "counter-measure" can be easily circumvented.
+
+
+.TP
+.BI \-M\   WIN_MOD_MODE ,\ \-\-win\-modulation\  WIN_MOD_MODE
+
+This option specifies the two values (and their respective duration) over which the TCP window will alternate. The value WIN_MOD_MODE hast the syntax "WIN1:TIME1:WIN2:TIME2", where the WIN1 and WIN2 parameters specify the window size for each of these periods, while the TIME1 and TIME2 parameters specify their respective time lengths. For example, setting "\-\-win\-modulation 0:60:10:30" will cause
+.B tcp6
+to alternate between advertising a TCP window of 0 bytes for 60 seconds, and advertising a TCP window of 10 bytes for 30 seconds.
+
+This option will be typically employed along with one of the flooding options ("\-\-flood\-sources" an/or "\-\-flood\-ports") and the "\-\-data" option, such that multiple TCP connections are established, and the target TCPs keep their retransmission buffer full. In this scenario, the TCP window "modulation" option can be leveraged to evade trivial counter-measures implemented by some TCP stacks that try to mitigate Zero-Window attacks by enforcing a limit on the maximum amount of time the TCP window can be in the "closed state".
+
+.TP
+.BI \-c\   OPEN_MODE ,\ \-\-open\-mode\  OPEN_MODE
+
+This option specifies the connection\-establishment mode. The following modes are available:
+
+   \+ simultaneous
+   \+ passive
+   \+ abort
+
+When the "simultaneous" mode is selected, 
+.B tcp6
+will respond to incoming SYN segments with other SYN segments, thus simulating a "simultaneous open" scenario. When the "passive" mode is selected,
+.B tcp6
+will respond to incoming SYN segments with the typical SYN/ACK segments, thus leading to the traditional "three\-way handshake". Finally, when the "abort" mode si selected,
+.B tcp6
+wil respond to incoming SYN segments with RST segments, thus aborting the incoming connections.
+
+For the most part, this option is useful for assessing the correct behavior of TCP implementations (e.g., support for "simultaneous opens").
+
+
+.TP
+.BI \-C\   CLOSE_MODE ,\ \-\-close\-mode\  CLOSE_MODE
+
+This option specifies the the connection-termination mode. The following modes are available:
+
+   \+ simultaneous
+   \+ passive
+   \+ abort
+   \+ active
+   \+ FIN\-WAIT\-1
+   \+ FIN\-WAIT\-2
+   \+ LAST\-ACK
+
+When the "simultaneous" mode is selected, 
+.B tcp6
+will respond to incoming FIN segments with FIN segments, thus simulating a "simultaneous close" scenario. When the "passive" mode is selected,
+.B tcp6
+will respond to incoming FIN segments with the typical FIN/ACK segments, thus leading to the traditional TCP connection-termination sequence. When the "abort" mode is selected,
+.B tcp6
+wil respond to incoming FIN segments with RST segments, thus aborting the corresponding connections. When the "active" mode is selected,
+.B tcp6
+will start the connection\-termination sequence by sending a FIN segment. 
+
+The FIN\-WAIT\-1, FIN\-WAIT\-2, and LAST\-ACK modes will result in connections in the FIN\-WAIT\-1, FIN\-WAIT\-2, and LAST\-ACK, respectively. It should be noted that in order for the remote TCPs to transition to the FIN\-WAIT\-1 or FIN\-WAIT\-2 states, the remote TCPs must perform the "active close". This can be trivially triggered for application protocols such as HTTP, but might not be feasible for other protocols.
+
+.TP
+.BI \-Z\   DATA ,\ \-\-data\  DATA
+
+This option is used to specify a payload that should be sent as the first data segment once a TCP connection has been established. It will typically include an application-layer request. Note: the string used for the DATA parameter can contain the "\\r" and "\\n" C\-style escape senquenced for representing "carriage return" and "line feed" (respectively). 
+
+As an example, this option could be employed to send an HTTP request if set as '\-\-data "GET / HTTP/1.0\\r\\n\\r\\n"'.
+
+
+.TP
+.BR \-N\| ,\  \-\-not\-ack\-data
+
+This option instructs 
+.B tcp6
+not to acknowledge the TCP payload of incoming segments (when operating in listening mode). 
+
+Note: By default, tcp6 will acknowledge both the payload and the flags of the incoming TCP segments.
+
+.TP
+.BR \-n\| ,\  \-\-not\-ack\-flags
+
+This option instructs tcp6 not to acknowledge the TCP flags (SYN and/or FIN) of incoming segments (when operating in listening mode). 
+
+Note: By default, tcp6 will acknowledge both the payload and the flags of the incoming TCP segments.
+
+.TP
+.BI \-j\  SRC_ADDR ,\ \-\-block\-src\  SRC_ADDR
+
+This option sets a block filter for the incoming packets, based on their IPv6 Source Address. It allows the specification of an IPv6 prefix in the form "\-j prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
+
+.TP
+.BI \-k\  DST_ADDR ,\ \-\-block\-dst\  DST_ADDR
+
+This option sets a block filter for the incoming packets, based on their IPv6 Destination Address. It allows the specification of an IPv6 prefix in the form "\-k prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
+
+.TP
+.BI \-J\   LINK_ADDR ,\ \-\-block\-link\-src\  LINK_ADDR
+
+This option sets a block filter for the incoming packets, based on their link-layer Source Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
+
+.TP
+.BI \-K\   LINK_ADDR ,\ \-\-block\-link\-dst\  LINK_ADDR
+
+This option sets a block filter for the incoming packets, based on their link-layer Destination Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
+
+.TP
+.BI \-b\  SRC_ADDR ,\ \-\-accept\-src\  SRC_ADDR
+
+This option sets an accept filter for the incoming packets, based on their IPv6 Source Address. It allows the specification of an IPv6 prefix in the form "\-b prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
+
+.TP
+.BI \-g\  DST_ADDR ,\ \-\-accept\-dst\  DST_ADDR
+
+This option sets a accept filter for the incoming packets, based on their IPv6 Destination Address. It allows the specification of an IPv6 prefix in the form "\-g prefix/prefixlen". If the prefix length is not specified, a prefix length of "/128" is selected (i.e., the option assumes that a single IPv6 address, rather than an IPv6 prefix, has been specified).
+
+.TP
+.BI \-B\   LINK_ADDR ,\ \-\-accept\-link\-src\  LINK_ADDR
+
+This option sets an accept filter for the incoming packets, based on their link-layer Source Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
+
+.TP
+.BI \-G\   LINK_ADDR ,\ \-\-accept\-link\-dst\  LINK_ADDR
+
+This option sets an accept filter for the incoming packets, based on their link-layer Destination Address. The option must be followed by a link-layer address (currently, only Ethernet is supported).
+
+.TP
+.BI \-F\   N_SOURCES ,\ \-\-flood\-sources\  N_SOURCES
+
+This option instructs the tool to send multiple TCP segments with different Source Addresses. The number of different source addresses is specified as "\-F number". The Source Address of each TCP segment is randomly selected from the prefix specified by the "\-s" option. If the "\-F" option is specified but the "\-s" option is left unspecified, the Source Address of the packets is randomly selected from the prefix ::/0.
+
+.TP
+.BI \-T\   N_PORTS ,\ \-\-flood\-ports\  N_PORTS
+
+This option instructs the tool to send multiple TCP segments with different Source Ports. The Source Port of each TCP segment is randomly selected from the whole port number space (0\-65535).
+
+.TP
+.BR \-l\| ,\  \-\-loop
+
+This option instructs the tcp6 tool to send periodic TCP segments to the victim node. The amount of time to pause between sending TCP segments can be specified by means of the "\-z" option, and defaults to 1 second. Note that this option cannot be set in conjunction with the "\-L" ("\-\-listen") option.
+
+.TP
+.BR \-z\| ,\  \-\-sleep
+
+This option specifies the amount of time to pause between sending TCP segments (when the "\-\-loop" option is set). If left unspecified, it defaults to 1 second.
+
+.TP
+.BI \-r\  RATE ,\ \-\-rate\-limit\  RATE
+
+This option specifies the rate limit to use when performing a remote address scan. "RATE" should be specified as "xbps" or "xpps" (with "x" being an unsigned integer), for rate-limits in bits per second or packets per second, respectively.
+
+.TP
+.BR \-L\| ,\  \-\-listen 
+
+This instructs the tcp6 tool to operate in listening mode (possibly after attacking a given node). Note that this option cannot be used in conjunction with the "\-l" ("\-\-loop") option.
+
+.TP
+.BI \-p\   PROBE_MODE ,\ \-\-probe\-mode\  PROBE_MODE
+
+This option instructs tcp6 to operate in probe mode. The specific probe mode is specified as an argument to this option (currently, only "script" mode is supported). In probe mode, 
+.B tcp6 
+sends probe segments, and waits for response packets. The response packets are decoded based on the selected probe mode.
+
+In the "script" probe mode, the tool decodes TCP segments as follows:
+
+     RESPONSE:RESPONSE_TYPE:RESPONSE_DECODE...
+
+Where the string RESPONSE is fixed, and RESPONSE_TYPE indicates the response received. As of this version of the tool, the following RESPONSE_TYPE values are supported:
+
+   \+ TCP6: Indicates that the tool received a TCP/IPv6 packet
+   \+ TIMEOUT: Indicates that the tool received no response
+
+If RESPONSE_TYPE is TCP6, RESPONSE code contains the TCP flags set in the receive TCP segment. The TCP flags are encoded as "F" (FIN), "S" (SYN), "R" (RST), "P" (PSH), "A" (ACK), and "U" (URG).
+
+Possibe output lines of the tool are:
+
+    RESPONSE:TIMEOUT:
+    RESPONSE:TCP6:RA:
+
+Note: Future versions of the tool will also decode ICMPv6 error messages, and will include additional data regarding the incoming TCP segments (e.g., ACK value, payload size, etc.).
+
+.TP
+.BR \-v\| ,\  \-\-verbose 
+
+This option instructs the tcp6 tool to be verbose.  When the option is set twice, the tool is "very verbose", and the tool also informs which packets have been accepted or discarded as a result of applying the specified filters. 
+
+.TP
+.BR \-h\| ,\  \-\-help
+
+Print help information for the 
+.B tcp6
+tool. 
+
+.SH EXAMPLES
+
+The following sections illustrate typical use cases of the
+.B tcp6
+tool.
+
+\fBExample #1\fR
+
+# tcp6 \-i eth0 \-s fc00:1::/64 \-d fc00:1::1 \-a 22 \-X S \-F 100 \-l \-z 1 \-v
+
+In this example the 
+.B tcp6
+tool is essentially employed to perform a SYN-flood attack against port number 22 of the host fc00:1::1. The tool uses the network interface "eth0" (as specified by the "\-i" option), and sends SYN segments (as specified by the "\-X" option) from the prefix fc00:1::/64 (as specified by the "\-s" option) to port 22 (specified by the "\-a" option) at the destination address fc00:1::1 (specified by the "\-d" option). The tool sends TCP segments from 100 different addresses (as specified by the "\-F" option) every one second (as specified by the "\-l" and "\-z" options). The tool will be verbose (as specified by the "\-v" option).
+
+\fBExample #2\fR
+
+# tcp6 \-i eth0 \-L \-X RA \-v
+
+In this example, the 
+.B tcp6
+tool is employed to perform a TCP connection-reset attack against all  active TCP connections in the local network. The tool listens ("\-L") on the interface eth0 ("\-i eth0"), and responds to any TCP segments with a RST packet (with both the RST and ACK bits set). The tool will be verbose.
+
+
+\fBExample #3\fR
+
+# tcp6 \-i eth0 \-d fc00:1::1 \-a 80 \-L \-s fc00:1::/112 \-l \-r 1pps \-v \-\-data "GET / HTTP/1.0\\r\\n\\r\\n" \-\-close\-mode last\-ack \-\-flood\-ports 10
+
+Flood the target system (fc00:1::1) with connections that stay in the LAST\-ACK state (on port 80), sending packets at a rate of one packet per second. For each forged address, 10 different (forged) ports are used. For each connection,
+.B tcp6
+will send an HTTP application request. 
+
+
+\fBExample #4\fR
+
+# tcp6 \-i eth0 \-d fc00:1::1 \-a 80 \-L \-s fc00:1::/112 \-l \-r 1000pps \-\-tcp\-flags auto \-v \-\-data "GET / HTTP/1.0\\r\\n\\r\\n" \-\-flood\-ports 10 \-\-window\-mode close
+
+Flood the target node (fc00:1::1) with TCP connections (on port 80). On each connection that is established, an HTTP request is sent, and the TCP window is immediately closed. For each forged IPv6 source address ten different TCP source ports are randomized. The bandwidth of the attack is limited to 1000 pps.
+
+
+\fBExample #5\fR
+
+# tcp6 \-d fc00:1::1 \-a 80 \-\-tcp\-flags A \-\-dst-opt-hdr 8 \-\-payload\-size 50 \-\-probe\-mode script
+
+Send a probe TCP segment to TCP port 80 at fc00:1::1. The probe packet consists of an IPv6 packet with a Destination Options header of 8 bytes, and an IPv6 payload consisting of a TCP segment with the ACK bit set, and 50 data bytes. The probe mode is "script".
+
+
+.SH SEE ALSO
+"Security Assessment of the Transmission Control Protocol (TCP)" (available at: <http://www.gont.com.ar/papers/tn\-03\-09\-security\-assessment\-TCP.pdf>) for a discussion of TCP vulnerabilities.
+
+.SH AUTHOR
+The
+.B tcp6
+tool and the corresponding manual pages were produced by Fernando Gont 
+.I <fgont@si6networks.com>
+for SI6 Networks 
+.IR <http://www.si6networks.com> .
+
+.SH COPYRIGHT
+Copyright (c) 2011\-2013 Fernando Gont.
+
+Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.  A copy of the license is available at
+.IR <http://www.gnu.org/licenses/fdl.html> .
index ef77776..271c032 100644 (file)
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
  * 
- * Build with: gcc addr6.c -Wall -o addr6
- * 
- * This program has been tested to compile and run on: Debian GNU/Linux 6.0,
- * FreeBSD 9.0, NetBSD 5.1, OpenBSD 5.0, and Ubuntu 11.10.
+ * Build with: make addr6
  *
  * It requires that the libpcap library be installed on your system.
  *
@@ -1426,7 +1423,7 @@ size_t Strnlen(const char *s, size_t maxlen){
 int init_host_list(struct host_list *hlist){
        unsigned int i;
 
-       bzero(hlist, sizeof(struct host_list));
+       memset(hlist, 0, sizeof(struct host_list));
 
        if( (hlist->host = malloc(MAX_LIST_ENTRIES * sizeof(struct host_entry *))) == NULL){
                return(0);
@@ -1475,7 +1472,7 @@ struct host_entry *add_host_entry(struct host_list *hlist, struct in6_addr *ipv6
                return(NULL);
        }
 
-       bzero(hentry, sizeof(struct host_entry));
+       memset(hentry, 0, sizeof(struct host_entry));
        hentry->ip6 = *ipv6;
        hentry->next= NULL;
 
index 49181a7..850ff03 100644 (file)
@@ -162,7 +162,7 @@ struct stats6{
     #ifndef s6_addr32
            #define s6_addr32   __u6_addr.__u6_addr32
     #endif
-#elif defined __linux__
+#elif defined __linux__ || ( !defined(__FreeBSD__) && defined(__FreeBSD_kernel__))
     #ifndef s6_addr16
            #define s6_addr16   __in6_u.__u6_addr16
     #endif
index fce203c..a365fb1 100644 (file)
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
  * 
- * Build with: gcc flow6.c -Wall -lpcap -lm -o flow6
+ * Build with: make flow6
  * 
- * This program has been tested to compile and run on: Debian GNU/Linux 6.0,
- * FreeBSD 9.0, NetBSD 5.1, OpenBSD 5.0, Ubuntu 11.10, and Mac OS X.
- *
  * It requires that the libpcap library be installed on your system.
  *
  * Please send any bug reports to Fernando Gont <fgont@si6networks.com>
  */
 
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-#include <time.h>
-#include <getopt.h>
-#include <unistd.h>
-#include <signal.h>
-#include <string.h>
-#include <pcap.h>
 #include <sys/types.h>
 #include <sys/param.h>
-#include <setjmp.h>
+#include <sys/select.h>
+#include <sys/socket.h>
+
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <netinet/ip6.h>
 #include <netinet/icmp6.h>
-#include <sys/socket.h>
-#include <pwd.h>
+#include <netinet/tcp.h>
+#include <netinet/udp.h>
 #include <net/if.h>
 #include <ifaddrs.h>
 #ifdef __linux__
        #include <netpacket/packet.h>
-#elif defined (__FreeBSD__) || defined(__NetBSD__) || defined (__OpenBSD__) || defined(__APPLE__)
+#elif defined (__FreeBSD__) || defined(__NetBSD__) || defined (__OpenBSD__) || defined(__APPLE__) || ( !defined(__FreeBSD__) && defined(__FreeBSD_kernel__))
        #include <net/if_dl.h>
 #endif
-#include <sys/select.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <time.h>
+#include <getopt.h>
+#include <unistd.h>
+#include <signal.h>
+#include <string.h>
+#include <pcap.h>
+
 #include "flow6.h"
 #include "ipv6toolkit.h"
-#include <netinet/tcp.h>
-#include <netinet/udp.h>
-#include <math.h>
+#include "libipv6.h"
+
 
 /* Function prototypes */
-int                                    init_iface_data(struct iface_data *);
-int                                    insert_pad_opt(unsigned char *ptrhdr, const unsigned char *, unsigned int);
-void                           print_icmp6_echo(struct pcap_pkthdr *, const u_char *);
-void                           process_icmp6_echo(struct pcap_pkthdr *, const u_char *, unsigned char *, unsigned int *);
-void                           print_icmp6_timed(struct pcap_pkthdr *, const u_char *);
-void                           process_icmp6_timed(struct pcap_pkthdr *, const u_char *, unsigned char *);
-int                            send_neighbor_advert(struct iface_data *, pcap_t *,  const u_char *);
 void                           print_attack_info(void);
 void                           usage(void);
 void                           print_help(void);
-int                                    ether_pton(const char *, struct ether_addr *, unsigned int);
-int                                    ether_ntop(const struct ether_addr *, char *, size_t);
-u_int16_t                      in_chksum(void *, void *, size_t, u_int8_t);
-int                                    is_ip6_in_prefix_list(struct in6_addr *, struct prefix_list *);
-unsigned int           match_ipv6(struct in6_addr *, u_int8_t *, unsigned int, struct in6_addr *);
-unsigned int           match_ether(struct ether_addr *, unsigned int, struct ether_addr *);
-void                           sanitize_ipv6_prefix(struct in6_addr *, u_int8_t);
-void                           randomize_ipv6_addr(struct in6_addr *, struct in6_addr *, u_int8_t);
-void                           randomize_ether_addr(struct ether_addr *);
-void                           ether_to_ipv6_linklocal(struct ether_addr *etheraddr, struct in6_addr *ipv6addr);
-void                           generate_slaac_address(struct in6_addr *, struct ether_addr *, struct in6_addr *);
-void                           sig_alarm(int);
-int                                    is_eq_in6_addr(struct in6_addr *, struct in6_addr *);
-int                                    find_ipv6_router_full(pcap_t *, struct iface_data *);
-int                                    ipv6_to_ether(pcap_t *, struct iface_data *, struct in6_addr *, struct ether_addr *);
-struct in6_addr                solicited_node(const struct in6_addr *);
-struct ether_addr      ether_multicast(const struct in6_addr *);
-int                            match_ipv6_to_prefixes(struct in6_addr *, struct prefix_list *);
-int                                    get_if_addrs(struct iface_data *);
-struct in6_addr *      src_addr_sel(struct iface_data *, struct in6_addr *);
-int                            valid_icmp6_response(struct iface_data *, struct pcap_pkthdr *, const u_char *);
-int                                    valid_icmp6_response2(struct iface_data *, struct pcap_pkthdr *, const u_char *, unsigned int);
 int                                    send_fid_probe(void);
 int                                    predict_flow_id(u_int32_t *, unsigned int, u_int32_t *, unsigned int);
-int                                    inc_sdev(u_int32_t *, unsigned int, u_int32_t *, double *);
-void                           change_endianness(u_int32_t *, unsigned int);
-int                                    send_neighbor_solicit(struct iface_data *);
+
 
 /* Used for router discovery */
 struct iface_data      idata;
-struct prefix_entry    *prefix_ols[MAX_PREFIXES_ONLINK], *prefix_acs[MAX_PREFIXES_AUTO];
-struct prefix_entry    *prefix_local[MAX_LOCAL_ADDRESSES];
 struct in6_addr                randprefix;
 unsigned char          randpreflen;
 
@@ -114,8 +80,8 @@ const u_char         *pktdata;
 unsigned char          *pkt_end, *pkt_ptr;
 struct ether_header    *pkt_ether;
 struct ip6_hdr         *pkt_ipv6;
-struct tcphdr          *pkt_tcp;
-struct udphdr          *pkt_udp;
+struct tcp_hdr         *pkt_tcp;
+struct udp_hdr         *pkt_udp;
 struct icmp6_hdr       *pkt_icmp6;
 struct nd_neighbor_solicit *pkt_ns;
 struct in6_addr                *pkt_ipv6addr;
@@ -135,10 +101,7 @@ struct ip6_hdr             *ipv6;
 struct icmp6_hdr       *icmp6;
 
 struct ether_header    *ethernet;
-struct ether_addr      hsrcaddr, hdstaddr;
 struct nd_opt_tlla     *tllaopt;
-
-struct in6_addr                srcaddr, dstaddr, targetaddr;
 struct ether_addr      linkaddr[MAX_TLLA_OPTION];
 unsigned int           nlinkaddr=0, linkaddrs;
 
@@ -157,8 +120,7 @@ u_int8_t                    hoplimit;
 
 char                           plinkaddr[ETHER_ADDR_PLEN];
 char                           psrcaddr[INET6_ADDRSTRLEN], pdstaddr[INET6_ADDRSTRLEN], pv6addr[INET6_ADDRSTRLEN];
-unsigned char          verbose_f=0, iface_f=0;
-unsigned char          srcaddr_f=0, dstaddr_f=0, hsrcaddr_f=0, hdstaddr_f=0, localaddr_f=0;
+unsigned char          localaddr_f=0;
 unsigned char          srcprefix_f=0, hoplimit_f=0, flowidp_f=0, dstport_f=0, protocol_f=0;
 
 /* Support for Extension Headers */
@@ -175,7 +137,7 @@ unsigned char               fragh_f=0;
 
 unsigned char          *fragpart, *ptrend, *ptrhdr, *ptrhdrend;
 unsigned int           hdrlen, ndstopthdr=0, nhbhopthdr=0, ndstoptuhdr=0;
-unsigned int           nfrags, fragsize, max_packet_size, linkhsize;
+unsigned int           nfrags, fragsize;
 unsigned char          *prev_nh, *startoffragment;
 
 
@@ -184,19 +146,13 @@ u_int16_t                 baseport, lastport, dstport, tcpwin, addr_sig, addr_key;
 u_int32_t                      tcpseq;
 u_int8_t                       protocol;
 
-/* IPv6 Address Resolution */
-sigjmp_buf                     env;
-unsigned int           canjump;
 
 int main(int argc, char **argv){
-       extern char             *optarg;        
-       uid_t                   ruid;
-       gid_t                   rgid;
-       struct passwd   *pwdptr;
-       fd_set                  sset, rset;
-       struct timeval  timeout;
-       int                             r, sel;
-       time_t                  curtime, start, lastfrag1=0;
+       extern char                     *optarg;        
+       fd_set                          sset, rset;
+       struct timeval          timeout;
+       int                                     r, sel;
+       time_t                          curtime, start, lastfrag1=0;
 
        /* Arrays for storing the Flow ID samples */
        u_int32_t               test1[NSAMPLES], test2[NSAMPLES];
@@ -229,7 +185,11 @@ int main(int argc, char **argv){
 
        srandom(time(NULL));
        hoplimit=64+random()%180;
-       init_iface_data(&idata);
+
+       if(init_iface_data(&idata) == FAILURE){
+               puts("Error initializing internal data structure");
+               exit(EXIT_FAILURE);
+       }
 
        while((r=getopt_long(argc, argv, shortopts, longopts, NULL)) != -1) {
                option= r;
@@ -238,7 +198,9 @@ int main(int argc, char **argv){
 
                        case 'i':  /* Interface */
                                strncpy(idata.iface, optarg, IFACE_LENGTH-1);
-                               iface_f=1;
+                               idata.iface[IFACE_LENGTH-1]=0;
+                               idata.ifindex= if_nametoindex(idata.iface);
+                               idata.iface_f=TRUE;
                                break;
 
                        case 's':       /* IPv6 Source Address */
@@ -247,12 +209,12 @@ int main(int argc, char **argv){
                                        exit(EXIT_FAILURE);
                                }
 
-                               if ( inet_pton(AF_INET6, charptr, &srcaddr) <= 0){
+                               if ( inet_pton(AF_INET6, charptr, &(idata.srcaddr)) <= 0){
                                        puts("inet_pton(): Source Address not valid");
                                        exit(EXIT_FAILURE);
                                }
 
-                               srcaddr_f = 1;
+                               idata.srcaddr_f = 1;
                
                                if((charptr = strtok_r(NULL, " ", &lasts)) != NULL){
                                        srcpreflen = atoi(charptr);
@@ -262,19 +224,19 @@ int main(int argc, char **argv){
                                                exit(EXIT_FAILURE);
                                        }
 
-                                       sanitize_ipv6_prefix(&srcaddr, srcpreflen);
+                                       sanitize_ipv6_prefix(&(idata.srcaddr), srcpreflen);
                                        srcprefix_f=1;
                                }
 
                                break;
            
                        case 'd':       /* IPv6 Destination Address */
-                               if( inet_pton(AF_INET6, optarg, &dstaddr) <= 0){
+                               if( inet_pton(AF_INET6, optarg, &(idata.dstaddr)) <= 0){
                                        puts("inet_pton(): address not valid");
                                        exit(EXIT_FAILURE);
                                }
                
-                               dstaddr_f = 1;
+                               idata.dstaddr_f = 1;
                                break;
 
                        case 'A':       /* Hop Limit */
@@ -283,21 +245,21 @@ int main(int argc, char **argv){
                                break;
 
                        case 'S':       /* Source Ethernet address */
-                               if(ether_pton(optarg, &hsrcaddr, sizeof(hsrcaddr)) == 0){
+                               if(ether_pton(optarg, &(idata.hsrcaddr), sizeof(idata.hsrcaddr)) == 0){
                                        puts("Error in Source link-layer address.");
                                        exit(EXIT_FAILURE);
                                }
                
-                               hsrcaddr_f = 1;
+                               idata.hsrcaddr_f = 1;
                                break;
 
                        case 'D':       /* Destination Ethernet Address */
-                               if(ether_pton(optarg, &hdstaddr, sizeof(hdstaddr)) == 0){
+                               if(ether_pton(optarg, &(idata.hdstaddr), sizeof(idata.hdstaddr)) == 0){
                                        puts("Error in Source link-layer address.");
                                        exit(EXIT_FAILURE);
                                }
                
-                               hdstaddr_f = 1;
+                               idata.hdstaddr_f = 1;
                                break;
 
                        case 'P':       /* Protocol */
@@ -327,7 +289,7 @@ int main(int argc, char **argv){
                                break;
 
                        case 'v':       /* Be verbose */
-                               verbose_f++;
+                               idata.verbose_f++;
                                break;
                
                        case 'h':       /* Help */
@@ -349,168 +311,30 @@ int main(int argc, char **argv){
                exit(EXIT_FAILURE);
        }
 
-       if(!iface_f){
-               puts("Must specify the network interface with the -i option");
-               exit(EXIT_FAILURE);
-       }
-
-       if( (idata.pd= pcap_open_live(idata.iface, PCAP_SNAP_LEN, PCAP_PROMISC, PCAP_TIMEOUT, errbuf)) == NULL){
-               printf("pcap_open_live(): %s\n", errbuf);
-               exit(EXIT_FAILURE);
-       }
-
-       /* 
-          If the real UID is not root, we setuid() and setgid() to that user and group, releasing superuser
-          privileges. Otherwise, if the real UID is 0, we try to setuid() to "nobody", releasing superuser 
-          privileges.
-        */
-       if( (ruid=getuid()) && (rgid=getgid())){
-               if(setgid(rgid) == -1){
-                       puts("Error while releasing superuser privileges (changing to real GID)");
-                       exit(EXIT_FAILURE);
-               }
-
-               if(setuid(ruid) == -1){
-                       puts("Error while releasing superuser privileges (changing to real UID)");
+       if(!idata.iface_f){
+               if(idata.dstaddr_f && IN6_IS_ADDR_LINKLOCAL(&(idata.dstaddr))){
+                       puts("Must specify a network interface for link-local destinations");
                        exit(EXIT_FAILURE);
                }
        }
-       else{
-               if((pwdptr=getpwnam("nobody"))){
-                       if(!pwdptr->pw_uid || !pwdptr->pw_gid){
-                               puts("User 'nobody' has incorrect privileges");
-                               exit(EXIT_FAILURE);
-                       }
-
-                       if(setgid(pwdptr->pw_gid) == -1){
-                               puts("Error while releasing superuser privileges (changing to nobody's group)");
-                               exit(EXIT_FAILURE);
-                       }
-
-                       if(setuid(pwdptr->pw_uid) == -1){
-                               puts("Error while releasing superuser privileges (changing to 'nobody')");
-                               exit(EXIT_FAILURE);
-                       }
-               }
-       }
-
-
-       if( (idata.type = pcap_datalink(idata.pd)) == DLT_EN10MB){
-               linkhsize= ETH_HLEN;
-               idata.mtu= ETH_DATA_LEN;
-       }
-       else if( idata.type == DLT_RAW){
-               linkhsize=0;
-               idata.mtu= MIN_IPV6_MTU;
-               idata.flags= IFACE_TUNNEL;
-       }
-       else if(idata.type == DLT_NULL){
-               linkhsize=4;
-               idata.mtu= MIN_IPV6_MTU;
-               idata.flags= IFACE_TUNNEL;
-       }
-       else{
-               printf("Error: Interface %s is not an Ethernet or tunnel interface", idata.iface);
-               exit(EXIT_FAILURE);
-       }
-
 
-       if(get_if_addrs(&idata) == -1){
-               puts("Error obtaining local addresses");
+       if(load_dst_and_pcap(&idata, LOAD_SRC_NXT_HOP) == FAILURE){
+               puts("Error while learning Souce Address and Next Hop");
                exit(EXIT_FAILURE);
        }
 
-       if((idata.ip6_local_flag && idata.ip6_global_flag) && !srcaddr_f)
-               localaddr_f=1;
-
-       if(!idata.ether_flag){
-               randomize_ether_addr(&idata.ether);
-               idata.ether_flag=1;
-       }
-
-       if(!hsrcaddr_f)
-               hsrcaddr=idata.ether;
-
-       if(!idata.ip6_local_flag){
-               ether_to_ipv6_linklocal(&idata.ether, &idata.ip6_local);
-       }
-
-       /*
-          Select link-layer destination address
-
-          + If the underlying interface is loopback or tunnel, there is no need 
-            to select a link-layer destination address
-          + If a link-layer Destination Address has been specified, we do not need to
-            select one
-          + If the destination address is link-local, there is no need to perform
-            next-hop determination
-          + Otherwise we need to learn the local router or do ND as a last ressort
-        */
-       if((idata.type == DLT_EN10MB && (idata.flags != IFACE_LOOPBACK && idata.flags != IFACE_TUNNEL)) && (!hdstaddr_f && dstaddr_f)){
-               if(IN6_IS_ADDR_LINKLOCAL(&dstaddr)){
-                       /*
-                          If the IPv6 Destination Address is a multicast address, there is no need
-                          to perform Neighbor Discovery
-                        */
-                       if(IN6_IS_ADDR_MC_LINKLOCAL(&dstaddr)){
-                               hdstaddr= ether_multicast(&dstaddr);
-                       }
-                       else if(ipv6_to_ether(idata.pd, &idata, &dstaddr, &hdstaddr) != 1){
-                               puts("Error while performing Neighbor Discovery for the Destination Address");
-                               exit(EXIT_FAILURE);
-                       }
-               }
-               else if(find_ipv6_router_full(idata.pd, &idata) == 1){
-                       if(match_ipv6_to_prefixes(&dstaddr, &idata.prefix_ol)){
-                               /* If address is on-link, we must perform Neighbor Discovery */
-                               if(ipv6_to_ether(idata.pd, &idata, &dstaddr, &hdstaddr) != 1){
-                                       puts("Error while performing Neighbor Discovery for the Destination Address");
-                                       exit(EXIT_FAILURE);
-                               }
-                       }
-                       else{
-                               hdstaddr= idata.router_ether;
-                       }
-               }
-               else{
-                       if(verbose_f)
-                               puts("Couldn't find local router. Now trying Neighbor Discovery for the target node");
-                       /*
-                        * If we were not able to find a local router, we assume the destination is "on-link" (as
-                        * a last ressort), and thus perform Neighbor Discovery for that destination
-                        */
-                       if(ipv6_to_ether(idata.pd, &idata, &dstaddr, &hdstaddr) != 1){
-                               puts("Error while performing Neighbor Discovery for the Destination Address");
-                               exit(EXIT_FAILURE);
-                       }
-               }
-       }
-
-       if(srcprefix_f){
-               randprefix=srcaddr;
-               randpreflen=srcpreflen;
-               randomize_ipv6_addr(&srcaddr, &randprefix, randpreflen);
-               srcaddr_f=1;
-       }
-       else if(!srcaddr_f){
-               srcaddr= *src_addr_sel(&idata, &dstaddr);
-       }
+       release_privileges();
 
        if( !fragh_f && dstoptuhdr_f){
                puts("Dst. Options Header (Unfragmentable Part) set, but Fragmentation not specified");
                exit(EXIT_FAILURE);
        }
     
-       if(fragh_f)
-               max_packet_size = MAX_IPV6_PAYLOAD + MIN_IPV6_HLEN;
-       else
-               max_packet_size = ETH_DATA_LEN;
-
-       if(verbose_f){
+       if(idata.verbose_f){
                print_attack_info();
        }
 
-       if(!dstaddr_f){
+       if(!idata.dstaddr_f){
                puts("Error: Nothing to send! (Destination Address left unspecified)");
                exit(EXIT_FAILURE);
        }
@@ -545,19 +369,19 @@ int main(int argc, char **argv){
                /*
                   Set filter for receiving Neighbor Solicitations, and TCP segments
                 */
-               if(pcap_compile(idata.pd, &pcap_filter, PCAP_NSTCP_FILTER, PCAP_OPT, PCAP_NETMASK_UNKNOWN) == -1){
-                       printf("pcap_compile(): %s", pcap_geterr(idata.pd));
+               if(pcap_compile(idata.pfd, &pcap_filter, PCAP_NSTCP_FILTER, PCAP_OPT, PCAP_NETMASK_UNKNOWN) == -1){
+                       printf("pcap_compile(): %s", pcap_geterr(idata.pfd));
                        exit(EXIT_FAILURE);
                }
                
-               if(pcap_setfilter(idata.pd, &pcap_filter) == -1){
-                       printf("pcap_setfilter(): %s", pcap_geterr(idata.pd));
+               if(pcap_setfilter(idata.pfd, &pcap_filter) == -1){
+                       printf("pcap_setfilter(): %s", pcap_geterr(idata.pfd));
                        exit(EXIT_FAILURE);
                }
 
                pcap_freecode(&pcap_filter);
 
-               if( (idata.fd= pcap_fileno(idata.pd)) == -1){
+               if( (idata.fd= pcap_fileno(idata.pfd)) == -1){
                        puts("Error obtaining descriptor number for pcap_t");
                        exit(EXIT_FAILURE);
                }
@@ -571,11 +395,11 @@ int main(int argc, char **argv){
                testtype= FIXED_ORIGIN;
 
                if(srcprefix_f){
-                       randprefix=srcaddr;
+                       randprefix= idata.srcaddr;
                        randpreflen=srcpreflen;
                }
                else{
-                       randprefix= *src_addr_sel(&idata, &dstaddr);
+                       randprefix= idata.srcaddr;
                        randpreflen=64;
                        sanitize_ipv6_prefix(&randprefix, randpreflen);
                }
@@ -607,17 +431,17 @@ int main(int argc, char **argv){
                                }
                                else{
                                        for(i=0; i<NSAMPLES; i++){
-                                               randomize_ipv6_addr(&srcaddr, &randprefix, randpreflen);
+                                               randomize_ipv6_addr(&(idata.srcaddr), &randprefix, randpreflen);
 
                                                /*
                                                 * Two words of the Source IPv6 Address are specially encoded such that we only respond
                                                 * to Neighbor Solicitations that target those addresses, and accept ICMPv6 Echo Replies
                                                 * only if they are destined to those addresses
                                                 */
-                                               srcaddr.s6_addr16[5]= addr_sig;
-                                               srcaddr.s6_addr16[7] =  srcaddr.s6_addr16[6] ^ addr_key;
+                                               idata.srcaddr.s6_addr16[5]= addr_sig;
+                                               idata.srcaddr.s6_addr16[7] =  idata.srcaddr.s6_addr16[6] ^ addr_key;
 
-                                               if(send_neighbor_solicit(&idata) == -1){
+                                               if(send_neighbor_solicit(&idata, &(idata.dstaddr)) == -1){
                                                        puts("Error while sending Neighbor Solicitation");
                                                        exit(EXIT_FAILURE);
                                                }
@@ -653,8 +477,8 @@ int main(int argc, char **argv){
                                continue;
 
                        /* Read a packet (Echo Reply, or Neighbor Solicitation) */
-                       if((r=pcap_next_ex(idata.pd, &pkthdr, &pktdata)) == -1){
-                               printf("pcap_next_ex(): %s", pcap_geterr(idata.pd));
+                       if((r=pcap_next_ex(idata.pfd, &pkthdr, &pktdata)) == -1){
+                               printf("pcap_next_ex(): %s", pcap_geterr(idata.pfd));
                                exit(EXIT_FAILURE);
                        }
                        else if(r == 0){
@@ -662,11 +486,11 @@ int main(int argc, char **argv){
                        }
 
                        pkt_ether = (struct ether_header *) pktdata;
-                       pkt_ipv6 = (struct ip6_hdr *)((char *) pkt_ether + linkhsize);
+                       pkt_ipv6 = (struct ip6_hdr *)((char *) pkt_ether + idata.linkhsize);
                        pkt_icmp6 = (struct icmp6_hdr *) ((char *) pkt_ipv6 + sizeof(struct ip6_hdr));
                        pkt_end = (unsigned char *) pktdata + pkthdr->caplen;
 
-                       if( (pkt_end -  pktdata) < (linkhsize + MIN_IPV6_HLEN))
+                       if( (pkt_end -  pktdata) < (idata.linkhsize + MIN_IPV6_HLEN))
                                continue;
 
                        if(pkt_ipv6->ip6_nxt == IPPROTO_ICMPV6 && pkt_icmp6->icmp6_type == ND_NEIGHBOR_SOLICIT){
@@ -681,8 +505,8 @@ int main(int argc, char **argv){
                                    will take care of that.
                                 */
                                if(testtype==FIXED_ORIGIN){
-                                       if(!localaddr_f && is_eq_in6_addr(&(pkt_ns->nd_ns_target), &srcaddr)){
-                                               if(send_neighbor_advert(&idata, idata.pd, pktdata) == -1){
+                                       if(!localaddr_f && is_eq_in6_addr(&(pkt_ns->nd_ns_target), &(idata.srcaddr))){
+                                               if(send_neighbor_advert(&idata, idata.pfd, pktdata) == -1){
                                                        puts("Error sending Neighbor Advertisement");
                                                        exit(EXIT_FAILURE);
                                                }
@@ -693,7 +517,7 @@ int main(int argc, char **argv){
                                                pkt_ns->nd_ns_target.s6_addr16[7] !=  (pkt_ns->nd_ns_target.s6_addr16[6] ^ addr_key))
                                                continue;
 
-                                       if(send_neighbor_advert(&idata, idata.pd, pktdata) == -1){
+                                       if(send_neighbor_advert(&idata, idata.pfd, pktdata) == -1){
                                                puts("Error sending Neighbor Advertisement");
                                                exit(EXIT_FAILURE);
                                        }
@@ -704,10 +528,10 @@ int main(int argc, char **argv){
                                /* Perform TCP-specific validation checks */
                                if(protocol == IPPROTO_TCP){
                                        if( (pkt_end - (unsigned char *) pkt_ipv6) < \
-                                                       (sizeof(struct ip6_hdr) + sizeof(struct tcphdr)))
+                                                       (sizeof(struct ip6_hdr) + sizeof(struct tcp_hdr)))
                                                continue;
 
-                                       pkt_tcp= (struct tcphdr *) ((unsigned char *)pkt_ipv6 + sizeof(struct ip6_hdr));
+                                       pkt_tcp= (struct tcp_hdr *) ((unsigned char *)pkt_ipv6 + sizeof(struct ip6_hdr));
 
                                        /*
                                         * The TCP Destination Port must correspond to one of the ports that we have used as
@@ -735,10 +559,10 @@ int main(int argc, char **argv){
                                /* Perform UDP-specific validation checks */
                                else if(protocol == IPPROTO_UDP){
                                        if( (pkt_end - (unsigned char *) pkt_ipv6) < \
-                                                       (sizeof(struct ip6_hdr) + sizeof(struct udphdr)))
+                                                       (sizeof(struct ip6_hdr) + sizeof(struct udp_hdr)))
                                                continue;
 
-                                       pkt_udp= (struct udphdr *) ((unsigned char *)pkt_ipv6 + sizeof(struct ip6_hdr));
+                                       pkt_udp= (struct udp_hdr *) ((unsigned char *)pkt_ipv6 + sizeof(struct ip6_hdr));
 
                                        /*
                                         * The UDP Destination Port must correspond to one of the ports that we have used as
@@ -757,7 +581,7 @@ int main(int argc, char **argv){
                                }
 
                                if(testtype==FIXED_ORIGIN){
-                                       if(!is_eq_in6_addr(&(pkt_ipv6->ip6_dst), &srcaddr)){
+                                       if(!is_eq_in6_addr(&(pkt_ipv6->ip6_dst), &(idata.srcaddr))){
                                                continue;
                                        }
 
@@ -782,7 +606,7 @@ int main(int argc, char **argv){
                        }
                }
 
-               if(verbose_f > 1){
+               if(idata.verbose_f > 1){
                        printf("Sampled %u Flow Labels from single-origin probes\n", ntest1);
 
                        for(i=0; i<ntest1; i++)
@@ -823,19 +647,19 @@ int send_fid_probe(void){
        struct ether_header     *ethernet;
        struct dlt_null         *dlt_null;
        struct ip6_hdr          *ipv6;
-       struct tcphdr           *tcp;
-       struct udphdr           *udp;
+       struct tcp_hdr          *tcp;
+       struct udp_hdr          *udp;
        unsigned char           *ptr;
 
        ethernet= (struct ether_header *) buffer;
        dlt_null= (struct dlt_null *) buffer;
-       v6buffer = buffer + linkhsize;
+       v6buffer = buffer + idata.linkhsize;
        ipv6 = (struct ip6_hdr *) v6buffer;
 
        if(idata.type == DLT_EN10MB && idata.flags != IFACE_LOOPBACK){
-               ethernet->src = hsrcaddr;
-               ethernet->dst = hdstaddr;
-               ethernet->ether_type = htons(0x86dd);
+               ethernet->src = idata.hsrcaddr;
+               ethernet->dst = idata.hdstaddr;
+               ethernet->ether_type = htons(ETHERTYPE_IPV6);
        }
        else if(idata.type == DLT_NULL){
                dlt_null->family= PF_INET6;
@@ -844,14 +668,14 @@ int send_fid_probe(void){
        ipv6->ip6_flow=0;
        ipv6->ip6_vfc= 0x60;
        ipv6->ip6_hlim= hoplimit;
-       ipv6->ip6_src= srcaddr;
-       ipv6->ip6_dst= dstaddr;
+       ipv6->ip6_src= idata.srcaddr;
+       ipv6->ip6_dst= idata.dstaddr;
        ipv6->ip6_nxt= protocol;
 
        if(protocol == IPPROTO_TCP){
-               tcp= (struct tcphdr *) ( (unsigned char *) ipv6 + sizeof(struct ip6_hdr));
-               ptr= (unsigned char *) tcp + sizeof(struct tcphdr);
-               bzero(tcp, sizeof(struct tcphdr));
+               tcp= (struct tcp_hdr *) ( (unsigned char *) ipv6 + sizeof(struct ip6_hdr));
+               ptr= (unsigned char *) tcp + sizeof(struct tcp_hdr);
+               memset(tcp, 0, sizeof(struct tcp_hdr));
                tcp->th_sport= htons(lastport);
                tcp->th_dport= htons(dstport);
                tcp->th_seq = htonl(tcpseq);
@@ -859,29 +683,29 @@ int send_fid_probe(void){
                tcp->th_flags= TH_SYN;;
                tcp->th_urp= htons(0);
                tcp->th_win= htons(tcpwin);
-               tcp->th_off= sizeof(struct tcphdr) >> 2;
+               tcp->th_off= sizeof(struct tcp_hdr) >> 2;
                ipv6->ip6_plen= htons(ptr - (unsigned char *) tcp);
                tcp->th_sum = in_chksum(ipv6, tcp, (ptr - (unsigned char *) tcp), IPPROTO_TCP);
        }
        else{
-               udp= (struct udphdr *) ( (unsigned char *) ipv6 + sizeof(struct ip6_hdr));
-               ptr= (unsigned char *) udp + sizeof(struct udphdr);
-               bzero(udp, sizeof(struct udphdr));
+               udp= (struct udp_hdr *) ( (unsigned char *) ipv6 + sizeof(struct ip6_hdr));
+               ptr= (unsigned char *) udp + sizeof(struct udp_hdr);
+               memset(udp, 0, sizeof(struct udp_hdr));
                udp->uh_sport= htons(lastport);
                udp->uh_dport= htons(dstport);
                ipv6->ip6_plen= htons(ptr - (unsigned char *) udp);
                udp->uh_sum = in_chksum(ipv6, udp, (ptr - (unsigned char *) udp), IPPROTO_TCP);
        }
 
-       if((nw=pcap_inject(idata.pd, buffer, ptr - buffer)) == -1){
-               if(verbose_f)
-                       printf("pcap_inject(): %s\n", pcap_geterr(idata.pd));
+       if((nw=pcap_inject(idata.pfd, buffer, ptr - buffer)) == -1){
+               if(idata.verbose_f)
+                       printf("pcap_inject(): %s\n", pcap_geterr(idata.pfd));
 
                return(-1);
        }
 
        if(nw != (ptr- buffer)){
-               if(verbose_f)
+               if(idata.verbose_f)
                        printf("pcap_inject(): only wrote %lu bytes (rather than %lu bytes)\n", (LUI) nw, (LUI) (ptr-buffer));
 
                return(-1);
@@ -932,56 +756,6 @@ void print_help(void){
 }
 
 
-/* 
- * Function: in_chksum()
- *
- * Calculate the 16-bit checksum
- */
-
-u_int16_t in_chksum(void *ptr_ipv6, void *ptr_icmpv6, size_t len, u_int8_t proto){
-       struct ipv6pseudohdr pseudohdr;
-       struct ip6_hdr *v6packet;
-       size_t nleft;
-       unsigned int sum = 0;
-       u_int16_t *w;
-       u_int16_t answer = 0;
-
-       v6packet=ptr_ipv6;
-       
-       bzero(&pseudohdr, sizeof(struct ipv6pseudohdr));
-       pseudohdr.srcaddr= v6packet->ip6_src;
-       pseudohdr.dstaddr= v6packet->ip6_dst;
-       pseudohdr.len = htons(len);
-       pseudohdr.nh = proto;
-
-       nleft=40;
-       w= (u_int16_t *) &pseudohdr;
-
-       while(nleft > 1){
-               sum += *w++;
-               nleft -= 2;
-       }
-
-       nleft= len;
-       w= (u_int16_t *) ptr_icmpv6;
-
-       while(nleft > 1){
-               sum += *w++;
-               nleft -= 2;
-       }
-
-       if(nleft == 1){
-               *(unsigned char *) (&answer) = *(unsigned char *) w;
-               sum += answer;
-       }
-
-       sum = (sum >> 16) + (sum & 0xffff);
-       sum += (sum >> 16);
-       answer = ~sum;
-       return(answer);
-}
-
-
 
 
 /*
@@ -991,34 +765,34 @@ u_int16_t in_chksum(void *ptr_ipv6, void *ptr_icmpv6, size_t len, u_int8_t proto
  */
  
 void print_attack_info(void){
-       if(ether_ntop(&hsrcaddr, plinkaddr, sizeof(plinkaddr)) == 0){
+       if(ether_ntop(&(idata.hsrcaddr), plinkaddr, sizeof(plinkaddr)) == 0){
                puts("ether_ntop(): Error converting address");
                exit(EXIT_FAILURE);
        }
 
-       printf("Ethernet Source Address: %s%s\n", plinkaddr, (!hsrcaddr_f)?" (automatically selected)":"");
+       printf("Ethernet Source Address: %s%s\n", plinkaddr, (!idata.hsrcaddr_f)?" (automatically selected)":"");
 
        /* 
           Ethernet Destination Address only used if a IPv6 Destination Address or an
           Ethernet Destination Address were specified.
         */
-       if(ether_ntop(&hdstaddr, plinkaddr, sizeof(plinkaddr)) == 0){
+       if(ether_ntop(&(idata.hdstaddr), plinkaddr, sizeof(plinkaddr)) == 0){
                puts("ether_ntop(): Error converting address");
                exit(EXIT_FAILURE);
        }
 
-       printf("Ethernet Destination Address: %s%s\n", plinkaddr, (!hdstaddr_f)?" (automatically selected)":"");
+       printf("Ethernet Destination Address: %s%s\n", plinkaddr, (!idata.hdstaddr_f)?" (automatically selected)":"");
 
-       if(inet_ntop(AF_INET6, &srcaddr, psrcaddr, sizeof(psrcaddr)) == NULL){
+       if(inet_ntop(AF_INET6, &(idata.srcaddr), psrcaddr, sizeof(psrcaddr)) == NULL){
                puts("inet_ntop(): Error converting IPv6 Source Address to presentation format");
                exit(EXIT_FAILURE);
        }
 
-       if(dstaddr_f){
-               printf("IPv6 Source Address: %s%s\n", psrcaddr, ((!srcaddr_f)?" (automatically selected)":""));
+       if(idata.dstaddr_f){
+               printf("IPv6 Source Address: %s%s\n", psrcaddr, ((!idata.srcaddr_f)?" (automatically selected)":""));
        }
 
-       if(inet_ntop(AF_INET6, &dstaddr, pdstaddr, sizeof(pdstaddr)) == NULL){
+       if(inet_ntop(AF_INET6, &(idata.dstaddr), pdstaddr, sizeof(pdstaddr)) == NULL){
                puts("inet_ntop(): Error converting IPv6 Destination Address to presentation format");
                exit(EXIT_FAILURE);
        }
@@ -1031,1606 +805,59 @@ void print_attack_info(void){
 }
 
 
-/*
- * Function: ether_pton()
- *
- * Convert a string (printable Ethernet Address) into binary format
- */
-
-int ether_pton(const char *ascii, struct ether_addr *etheraddr, unsigned int s){
-       unsigned int i, a[6];
-
-       if(s < ETHER_ADDR_LEN)
-               return 0;
-       
-       if(ascii){
-               if( sscanf(ascii,"%x:%x:%x:%x:%x:%x", &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]) == 6){ 
-                       for(i=0;i<6;i++)
-                               etheraddr->a[i]= a[i];
-
-                       return 1;
-               }
-       }
-
-       return 0;
-}
-
-
-
-/*
- * Function: ether_ntop()
- *
- * Convert binary Ethernet Address into printable foramt (an ASCII string)
- */
-
-int ether_ntop(const struct ether_addr *ether, char *ascii, size_t s){
-       unsigned int r;
-
-       if(s < ETHER_ADDR_PLEN)
-               return 0;
-
-       r=snprintf(ascii, s, "%02x:%02x:%02x:%02x:%02x:%02x", ether->a[0], ether->a[1], ether->a[2], ether->a[3], \
-                                                                                       ether->a[4], ether->a[5]);
-
-       if(r != 17)
-               return 0;
-
-       return 1;
-}
-
-
-/*
- * Function match_ipv6()
- *
- * Finds if an IPv6 address matches a prefix in a list of prefixes.
- */
-
-unsigned int match_ipv6(struct in6_addr *prefixlist, u_int8_t *prefixlen, unsigned int nprefix, 
-                                                               struct in6_addr *ipv6addr){
-
-       unsigned int    i;
-       struct in6_addr dummyipv6;
-    
-       for(i=0; i<nprefix; i++){
-               dummyipv6 = *ipv6addr;
-               sanitize_ipv6_prefix(&dummyipv6, prefixlen[i]);
-       
-               for(j=0; j<4; j++)
-                       if(dummyipv6.s6_addr32[j] != prefixlist[i].s6_addr32[j])
-                               break;
-
-               if(j==4)
-                       return 1;
-       }
-
-       return 0;
-}
-
-
-/*
- * match_ether()
- *
- * Finds if an Ethernet address matches any of the Ethernet addreses contained in an array.
- */
-
-unsigned int match_ether(struct ether_addr *addrlist, unsigned int naddr, \
-                                                           struct ether_addr *linkaddr){
-
-       unsigned int i, j;
-
-       for(i=0; i<naddr; i++){
-               for(j=0; j<6; j++)
-                       if(linkaddr->a[j] != addrlist[i].a[j])
-                               break;
-
-               if(j==6)
-                       return 1;
-       }
-
-       return 0;
-}
-
-
-/*
- * sanitize_ipv6_prefix()
- *
- * Clears those bits in an IPv6 address that are not within a prefix length.
- */
-
-void sanitize_ipv6_prefix(struct in6_addr *ipv6addr, u_int8_t prefixlen){
-       unsigned int    skip, i;
-       u_int16_t       mask;
-
-       skip= (prefixlen+15)/16;
-
-       if(prefixlen%16){
-               mask=0;
-               for(i=0; i<(prefixlen%16); i++)
-                       mask= (mask>>1) | 0x8000;
-           
-               ipv6addr->s6_addr16[skip-1]= ipv6addr->s6_addr16[skip-1] & htons(mask);
-       }
-                       
-       for(i=skip;i<8;i++)
-               ipv6addr->s6_addr16[i]=0;
-}
-
 
 /*
- * randomize_ipv6_addr()
+ * Function: predict_flow_id()
  *
- * Select a random IPv6 from a given prefix.
- */
-
-void randomize_ipv6_addr(struct in6_addr *ipv6addr, struct in6_addr *prefix, u_int8_t preflen){
-       u_int16_t mask;
-       u_int8_t startrand;     
-       unsigned int i;
-
-       startrand= preflen/16;
-
-       for(i=0; i<startrand; i++)
-               ipv6addr->s6_addr16[i]= 0;
-
-       for(i=startrand; i<8; i++)
-               ipv6addr->s6_addr16[i]=random();
-
-       if(preflen%16){
-               mask=0xffff;
+ * Identifies and prints the Flow Label generation policy
+*/
+int predict_flow_id(u_int32_t *s1, unsigned int n1, u_int32_t *s2, unsigned int n2){
+       u_int32_t               diff1_avg, diff2_avg;
+       double                  diff1_sdev, diff2_sdev;
 
-               for(i=0; i<(preflen%16); i++)
-                       mask= mask>>1;
+       if(inc_sdev(s1, n1, &diff1_avg, &diff1_sdev) == -1){
+               if(idata.verbose_f)
+                       puts("Error while allocating memory in inc_sdev()");
 
-               ipv6addr->s6_addr16[startrand]= ipv6addr->s6_addr16[startrand] & htons(mask);
+               return(-1);
        }
 
-       for(i=0; i<=(preflen/16); i++)
-               ipv6addr->s6_addr16[i]= ipv6addr->s6_addr16[i] | prefix->s6_addr16[i];
-
-}
-
-
-
-/*
- * randomize_ether_addr()
- *
- * Select a random Ethernet address.
- */
-
-void randomize_ether_addr(struct ether_addr *ethaddr){
-       for(i=0; i<6; i++)
-               ethaddr->a[i]= random();
-
-       ethaddr->a[0]= (ethaddr->a[0] & 0xfc) | 0x02;
-}
-
-
-/*
- * Function: inset_pad_opt()
- *
- * Insert a padding option (Pad1 or PadN) into an IPv6 extension header
- */
-
-int insert_pad_opt(unsigned char *ptrhdr, const unsigned char *ptrhdrend, unsigned int padn){
-       unsigned char *ptr;
-
-       if( (ptrhdrend - ptrhdr) < padn)
-               return 0;
+       if(inc_sdev(s2, n2, &diff2_avg, &diff2_sdev) == -1){
+               if(idata.verbose_f)
+                       puts("Error while allocating memory in inc_sdev()");
 
-       if(padn == 1){
-               *ptrhdr= 0x00;
-               return 1;
+               return(-1);
        }
-       else{
-               ptr=ptrhdr;
-               *ptr= 0x01;
-               ptr++;
-               *ptr= padn-2;
-               ptr+=2;
        
-               while(ptr < (ptrhdr+padn)){
-                       *ptr= 0x00;
-                       ptr++;
-               }    
-               return 1;
-       }
-}
-
-
-/*
- * Function: ipv6_to_ether()
- *
- * Obtains the Ethernet address corresponding to an IPv6 address (by means of Neighbor Discovery)
- */
-
-int ipv6_to_ether(pcap_t *pfd, struct iface_data *idata, struct in6_addr *targetaddr, struct ether_addr *result_ether){
-       struct bpf_program              pcap_filter;
-       struct pcap_pkthdr              *pkthdr;
-       const u_char                    *pktdata;
-       struct ip6_hdr                  *pkt_ipv6;
-       struct nd_neighbor_advert       *pkt_na;
-       unsigned char                   *pkt_end;
-       volatile unsigned char  *ptr, *p;
-
-       unsigned char                   buffer[65556];
-       unsigned int                    ns_max_packet_size;
-       struct ether_header             *ether;
-       unsigned char                   *v6buffer;
-       struct ip6_hdr                  *ipv6;
-       struct nd_neighbor_solicit      *ns;
-       struct nd_opt_slla              *sllaopt;
-       volatile unsigned int           tries=0;
-       unsigned int                    foundaddr=0;
-       struct sigaction                new_sig, old_sig;
-       int                             result;
-       unsigned char                   error_f=0, closefd_f=0;
-
-       ns_max_packet_size = idata->mtu;
-
-       ether = (struct ether_header *) buffer;
-       v6buffer = buffer + linkhsize;
-       ipv6 = (struct ip6_hdr *) v6buffer;
-
-       if(pfd == NULL){
-               if( (pfd= pcap_open_live(idata->iface, PCAP_SNAP_LEN, PCAP_PROMISC, PCAP_TIMEOUT, errbuf)) == NULL){
-                       if(verbose_f>1)
-                               printf("pcap_open_live(): %s\n", errbuf);
-
-                       return(-1);
+       if(diff1_sdev == 0 && diff1_avg == 0){
+               if(diff2_sdev == 0 && diff2_avg == 0){
+                       printf("Flow Label policy: Global (predictable) constant labels, set to %05lu\n", (LUI) s1[0]);
                }
-
-               if( pcap_datalink(pfd) != DLT_EN10MB){
-                       if(verbose_f>1)
-                               printf("Error: Interface %s is not an Ethernet interface", iface);
-
-                       return(-1);
+               else{
+                       printf("Flow Label policy: Per-destination constant labels with increments of %lu (sdev: %f)\n", \
+                                       (LUI) diff2_avg, diff2_sdev);
                }
-
-               closefd_f=1;
        }
 
-       if(pcap_compile(pfd, &pcap_filter, PCAP_ICMPV6_NA_FILTER, PCAP_OPT, PCAP_NETMASK_UNKNOWN) == -1){
-               if(verbose_f>1)
-                       printf("pcap_compile(): %s", pcap_geterr(pfd));
-
-               if(closefd_f)
-                       pcap_close(pfd);
-
-               return(-1);
+       else if(diff1_sdev <= 100){
+               if(diff2_sdev <= 100){
+                       printf("Flow Label policy: Global (predictable) labels with increments of %lu (sdev: %f)\n", \
+                                       (LUI) diff1_avg, diff1_sdev);
+               }
+               else{
+                       printf("Flow Label policy: Per-destination labels with increments of %lu (sdev: %f)\n", \
+                                       (LUI) diff1_avg, diff1_sdev);
+                       printf("                   Global policy: Avg. inc.: %lu, sdev: %f\n", (LUI) diff2_avg, diff2_sdev);
+               }
        }
-    
-       if(pcap_setfilter(pfd, &pcap_filter) == -1){
-               if(verbose_f>1)
-                       printf("pcap_setfilter(): %s", pcap_geterr(pfd));
-
-               if(closefd_f)
-                       pcap_close(pfd);
-
-               return(-1);
+       else{
+               puts("Flow Label policy: Randomized labels");
+               printf("    Per-destination: Avg. inc.: %lu, sdev: %f\n"
+                      "    Global:          Avg. inc.: %lu, sdev: %f\n", \
+                               (LUI) diff1_avg, diff1_sdev, (LUI) diff2_avg, diff2_sdev);
        }
 
-       pcap_freecode(&pcap_filter);
-
-       ipv6->ip6_flow=0;
-       ipv6->ip6_vfc= 0x60;
-       ipv6->ip6_hlim= 255;
-       ipv6->ip6_src= idata->ip6_local;
-       ipv6->ip6_dst= solicited_node(targetaddr);
-
-       ether->src = idata->ether;
-       ether->dst = ether_multicast(&(ipv6->ip6_dst));
-       ether->ether_type = htons(0x86dd);
+       return(0);
+}
 
-       prev_nh = (unsigned char *) &(ipv6->ip6_nxt);
-       *prev_nh = IPPROTO_ICMPV6;
-
-       ptr = (unsigned char *) v6buffer + MIN_IPV6_HLEN;
-
-       if( (ptr+sizeof(struct nd_neighbor_solicit)) > (v6buffer+ns_max_packet_size)){
-               if(verbose_f>1)
-                       puts("Packet too large while inserting Neighbor Solicitation header");
-
-               if(closefd_f)
-                       pcap_close(pfd);
-
-               return(-1);
-       }
-
-       ns= (struct nd_neighbor_solicit *) (ptr);
-
-       ns->nd_ns_type = ND_NEIGHBOR_SOLICIT;
-       ns->nd_ns_code = 0;
-       ns->nd_ns_reserved = 0;
-       ns->nd_ns_target = *targetaddr;
-
-       ptr += sizeof(struct nd_neighbor_solicit);
-       sllaopt = (struct nd_opt_slla *) ptr;    
-
-       if( (ptr+sizeof(struct nd_opt_slla)) > (v6buffer+ns_max_packet_size)){
-               if(verbose_f>1)
-                       puts("NS message too large while processing source link-layer addresss opt.");
-
-               if(closefd_f)
-                       pcap_close(pfd);
-
-               return(-1);
-       }
-
-       sllaopt->type= ND_OPT_SOURCE_LINKADDR;
-       sllaopt->length= SLLA_OPT_LEN;
-       bcopy( &(idata->ether.a), sllaopt->address, ETH_ALEN);
-       ptr += sizeof(struct nd_opt_slla);
-
-       ipv6->ip6_plen = htons((ptr - v6buffer) - MIN_IPV6_HLEN);
-       ns->nd_ns_cksum = 0;
-       ns->nd_ns_cksum = in_chksum(v6buffer, ns, ptr-((unsigned char *)ns), IPPROTO_ICMPV6);
-
-       /* We set the signal handler, and the anchor for siglongjump() */
-       canjump=0;
-       bzero(&new_sig, sizeof(struct sigaction));
-       sigemptyset(&new_sig.sa_mask);
-       new_sig.sa_handler= &sig_alarm;
-
-       alarm(0);
-
-       if( sigaction(SIGALRM, &new_sig, &old_sig) == -1){
-               if(verbose_f>1)
-                       puts("Error setting up 'Alarm' signal");
-
-               if(closefd_f)
-                       pcap_close(pfd);
-
-               return(-1);
-       }
-
-       if(sigsetjmp(env, 1) != 0)
-               tries++;
-
-       canjump=1;
-
-       while(tries<3 && !foundaddr && !error_f){
-               if((nw=pcap_inject(pfd, buffer, ptr - buffer)) == -1){
-                       if(verbose_f>1)
-                               printf("pcap_inject(): %s\n", pcap_geterr(pfd));
-
-                       error_f=1;
-                       break;
-               }
-
-               if(nw != (ptr-buffer)){
-                       if(verbose_f>1)
-                               printf("pcap_inject(): only wrote %lu bytes (rather than %lu bytes)\n", (LUI) nw, \
-                                                                                               (LUI) (ptr-buffer));
-                       error_f=1;
-                       break;
-               }
-
-               alarm(idata->local_timeout);
-               
-               while(!foundaddr && !error_f){
-                       do{
-                               if( (result=pcap_next_ex(pfd, &pkthdr, &pktdata)) == -1){
-                                       if(verbose_f>1)
-                                               printf("pcap_next_ex(): %s", pcap_geterr(pfd));
-
-                                       error_f=1;
-                                       break;
-                               }
-                       }while(result==0);                      
-
-                       if(error_f)
-                               break;  
-
-                       pkt_ether = (struct ether_header *) pktdata;
-                       pkt_ipv6 = (struct ip6_hdr *)((char *) pkt_ether + linkhsize);
-                       pkt_na = (struct nd_neighbor_advert *) ((char *) pkt_ipv6 + MIN_IPV6_HLEN);
-                       pkt_end = (unsigned char *) pktdata + pkthdr->caplen;
-
-                       /* The packet length is the minimum of what we capured, and what is specified in the
-                          IPv6 Total Lenght field
-                        */
-                       if( pkt_end > ((unsigned char *)pkt_na+ pkt_ipv6->ip6_plen) )
-                               pkt_end = (unsigned char *)pkt_na + pkt_ipv6->ip6_plen;
-
-                       /*
-                          Discard the packet if it is not of the minimum size to contain a Neighbor Advertisement
-                          message with a source link-layer address option
-                        */
-                       if( (pkt_end - (unsigned char *) pkt_na) < (sizeof(struct nd_neighbor_advert) + \
-                                                                               sizeof(struct nd_opt_tlla)))
-                               continue;
-
-                       /*
-                          Neighbor Discovery packets must have a Hop Limit of 255
-                        */
-                       if(pkt_ipv6->ip6_hlim != 255)
-                               continue;
-
-                       /* 
-                          Check that that the Destination Address of the Neighbor Advertisement is the one
-                          that we used for sending the Neighbor Solicitation message
-                        */
-                       if(!is_eq_in6_addr(&(pkt_ipv6->ip6_dst), &(ipv6->ip6_src)))
-                               continue;
-
-                       /* Check that the ICMPv6 checksum is correct */
-                       if(in_chksum(pkt_ipv6, pkt_na, pkt_end-((unsigned char *)pkt_na), IPPROTO_ICMPV6) != 0)
-                               continue;
-
-                       /* Check that the ICMPv6 Target Address is the one we had asked for */
-                       if(!is_eq_in6_addr(&(pkt_na->nd_na_target), targetaddr))
-                               continue;
-
-                       p= (unsigned char *) pkt_na + sizeof(struct nd_neighbor_advert);
-
-                       /* Process Neighbor Advertisement options */
-                       while( (p+sizeof(struct nd_opt_tlla)) <= pkt_end && (*(p+1) != 0)){
-                               if(*p == ND_OPT_TARGET_LINKADDR){
-                                       if( (*(p+1) * 8) != sizeof(struct nd_opt_tlla))
-                                               break;
-
-                                       /* Got a response, so we shouln't time out */
-                                       alarm(0);
-
-                                       /* Save the link-layer address */
-                                       *result_ether= *(struct ether_addr *) (p+2);
-                                       foundaddr=1;
-                                       break;
-                               }
-
-                               p= p + *(p+1) * 8;
-                       } /* Processing options */
-
-               } /* Processing packets */
-
-       } /* Resending Neighbor Solicitations */
-
-       alarm(0);
-
-       if(closefd_f)
-               pcap_close(pfd);
-
-       if( sigaction(SIGALRM, &old_sig, NULL) == -1){
-               if(verbose_f>1)
-                       puts("Error setting up 'Alarm' signal");
-
-               return(-1);
-       }
-
-       if(foundaddr)
-               return 1;
-       else
-               return 0;
-}
-
-
-/*
- * Function: solicited_node()
- *
- * Obtains the Solicited-node multicast address corresponding to an IPv6 address.
- */
-
-struct in6_addr solicited_node(const struct in6_addr *ipv6addr){
-       struct in6_addr solicited;
-
-       solicited.s6_addr16[0]= htons(0xff02);
-       solicited.s6_addr16[1]= 0x0000;
-       solicited.s6_addr16[2]= 0x0000;
-       solicited.s6_addr16[3]= 0x0000;
-       solicited.s6_addr16[4]= 0x0000;
-       solicited.s6_addr16[5]= htons(0x0001);
-       solicited.s6_addr16[6]= htons(0xff00) | ipv6addr->s6_addr16[6];
-       solicited.s6_addr16[7]= ipv6addr->s6_addr16[7];
-
-       return solicited;
-}
-
-
-/*
- * Function: ether_multicast()
- *
- * Obtains the Ethernet multicast address corresponding to an IPv6 multicast address.
- */
-
-struct ether_addr ether_multicast(const struct in6_addr *ipv6addr){
-       unsigned int i;
-       struct ether_addr ether;
-
-       ether.a[0]=0x33;
-       ether.a[1]=0x33;
-
-       for(i=2;i<6;i++)
-               ether.a[i]= ipv6addr->s6_addr[i+10];
-
-       return ether;
-}
-
-
-/*
- * Function: init_iface_data()
- *
- * Initializes the contents of "iface_data" structure
- */
-
-int init_iface_data(struct iface_data *idata){
-       bzero(idata, sizeof(struct iface_data));
-       idata->local_retrans = 0;
-       idata->local_timeout = 1;
-
-       idata->ip6_global.prefix= prefix_local;
-       idata->ip6_global.nprefix=0;
-       idata->ip6_global.maxprefix= MAX_LOCAL_ADDRESSES;
-
-       idata->prefix_ol.prefix= prefix_ols;
-       idata->prefix_ol.nprefix= 0;
-       idata->prefix_ol.maxprefix= MAX_PREFIXES_ONLINK;
-
-       idata->prefix_ac.prefix= prefix_acs;
-       idata->prefix_ac.nprefix= 0;
-       idata->prefix_ac.maxprefix= MAX_PREFIXES_AUTO;
-
-       return 0;
-}
-
-
-/*
- * Function: find_ipv6_router_full()
- *
- * Finds a local router (by means of Neighbor Discovery)
- */
-
-int find_ipv6_router_full(pcap_t *pfd, struct iface_data *idata){
-       struct pcap_pkthdr                      *pkthdr;
-       const u_char                            *pktdata;
-       struct ip6_hdr                          *pkt_ipv6;
-       struct nd_router_advert         *pkt_ra;
-       unsigned char                           *pkt_end;
-       volatile unsigned char          *ptr;
-       volatile unsigned char          *p;
-
-       unsigned char                           buffer[65556];
-       unsigned int                            rs_max_packet_size;
-       struct ether_header             *ether;
-       unsigned char                           *v6buffer;
-       struct ip6_hdr                          *ipv6;
-       struct nd_router_solicit        *rs;
-       struct nd_opt_slla                      *sllaopt;
-       struct nd_opt_prefix_info       *pio;
-       volatile unsigned int           tries=0;
-       volatile unsigned int           foundrouter=0;
-       struct sigaction                        new_sig, old_sig;
-       unsigned char                           closefd_f=0, error_f=0;
-       int                                                     result;
-
-       rs_max_packet_size = idata->mtu;
-       ether = (struct ether_header *) buffer;
-       v6buffer = buffer + linkhsize;
-       ipv6 = (struct ip6_hdr *) v6buffer;
-
-       if(pfd == NULL){
-               if( (pfd= pcap_open_live(idata->iface, PCAP_SNAP_LEN, PCAP_PROMISC, PCAP_TIMEOUT, errbuf)) == NULL){
-                       if(verbose_f>1)
-                               printf("pcap_open_live(): %s\n", errbuf);
-
-                       return(-1);
-               }
-
-               if( pcap_datalink(pfd) != DLT_EN10MB){
-                       if(verbose_f>1)
-                               printf("Error: Interface %s is not an Ethernet interface", idata->iface);
-
-                       return(-1);
-               }
-
-               closefd_f=1;
-       }
-
-       if(pcap_compile(pfd, &pcap_filter, PCAP_ICMPV6_RANS_FILTER, PCAP_OPT, PCAP_NETMASK_UNKNOWN) == -1){
-               if(verbose_f>1)
-                       printf("pcap_compile(): %s", pcap_geterr(pfd));
-
-               if(closefd_f)
-                       pcap_close(pfd);
-
-               return(-1);
-       }
-    
-       if(pcap_setfilter(pfd, &pcap_filter) == -1){
-               if(verbose_f>1)
-                       printf("pcap_setfilter(): %s", pcap_geterr(pfd));
-
-               if(closefd_f)
-                       pcap_close(pfd);
-
-               return(-1);
-       }
-
-       pcap_freecode(&pcap_filter);
-
-       ipv6->ip6_flow=0;
-       ipv6->ip6_vfc= 0x60;
-       ipv6->ip6_hlim= 255;
-       ipv6->ip6_src= idata->ip6_local;
-
-       if ( inet_pton(AF_INET6, ALL_ROUTERS_MULTICAST_ADDR, &(ipv6->ip6_dst)) <= 0){
-               if(verbose_f>1)
-                       puts("inet_pton(): Error converting All Routers address from presentation to network format");
-
-               if(closefd_f)
-                       pcap_close(pfd);
-
-               return(-1);
-       }
-
-       ether->src = idata->ether;
-
-       if(ether_pton(ETHER_ALLROUTERS_LINK_ADDR, &(ether->dst), sizeof(struct ether_addr)) == 0){
-               if(verbose_f>1)
-                       puts("ether_pton(): Error converting all-nodes multicast address");
-
-               if(closefd_f)
-                       pcap_close(pfd);
-
-               return(-1);
-       }
-
-       ether->ether_type = htons(0x86dd);
-
-       prev_nh = (unsigned char *) &(ipv6->ip6_nxt);
-       *prev_nh = IPPROTO_ICMPV6;
-
-       ptr = (unsigned char *) v6buffer + MIN_IPV6_HLEN;
-
-       if( (ptr+sizeof(struct nd_router_solicit)) > (v6buffer+rs_max_packet_size)){
-               if(verbose_f>1)
-                       puts("Packet too large while inserting Router Solicitation header");
-
-               if(closefd_f)
-                       pcap_close(pfd);
-
-               return(-1);
-       }
-
-       rs= (struct nd_router_solicit *) (ptr);
-
-       rs->nd_rs_type = ND_ROUTER_SOLICIT;
-       rs->nd_rs_code = 0;
-       rs->nd_rs_reserved = 0;
-
-       ptr += sizeof(struct nd_router_solicit);
-       sllaopt = (struct nd_opt_slla *) ptr;    
-
-       if( (ptr+sizeof(struct nd_opt_slla)) > (v6buffer+rs_max_packet_size)){
-               if(verbose_f>1)
-                       puts("RS message too large while processing source link-layer addresss opt.");
-
-               if(closefd_f)
-                       pcap_close(pfd);
-
-               return(-1);
-       }
-
-       sllaopt->type= ND_OPT_SOURCE_LINKADDR;
-       sllaopt->length= SLLA_OPT_LEN;
-       bcopy( &(idata->ether.a), sllaopt->address, ETH_ALEN);
-       ptr += sizeof(struct nd_opt_slla);
-
-       ipv6->ip6_plen = htons((ptr - v6buffer) - MIN_IPV6_HLEN);
-       rs->nd_rs_cksum = 0;
-       rs->nd_rs_cksum = in_chksum(v6buffer, rs, ptr-((unsigned char *)rs), IPPROTO_ICMPV6);
-
-       /* We set the signal handler, and the anchor for siglongjump() */
-       canjump=0;
-       bzero(&new_sig, sizeof(struct sigaction));
-       sigemptyset(&new_sig.sa_mask);
-       new_sig.sa_handler= &sig_alarm;
-
-       alarm(0);
-
-       if( sigaction(SIGALRM, &new_sig, &old_sig) == -1){
-               if(verbose_f>1)
-                       puts("Error setting up 'Alarm' signal");
-
-               if(closefd_f)
-                       pcap_close(pfd);
-
-               return(-1);
-       }
-
-       if(sigsetjmp(env, 1) != 0)
-               tries++;
-
-       canjump=1;
-
-       while(tries<3 && !foundrouter && !error_f){
-               if((nw=pcap_inject(pfd, buffer, ptr - buffer)) == -1){
-                       if(verbose_f>1)
-                               printf("pcap_inject(): %s\n", pcap_geterr(pfd));
-
-                       error_f=1;
-                       break;
-               }
-
-               if(nw != (ptr-buffer)){
-                       if(verbose_f>1)
-                               printf("pcap_inject(): only wrote %lu bytes (rather than %lu bytes)\n", (LUI) nw, \
-                                                                                               (LUI) (ptr-buffer));
-
-                       error_f=1;
-                       break;
-               }
-
-               alarm(idata->local_timeout + 1);
-               
-               while(!foundrouter && !error_f){
-
-                       do{
-                               if( (result=pcap_next_ex(pfd, &pkthdr, &pktdata)) == -1){
-                                       if(verbose_f>1)
-                                               printf("pcap_next_ex(): %s", pcap_geterr(pfd));
-
-                                       error_f=1;
-                                       break;
-                               }
-                       }while(result==0);                      
-
-                       if(error_f)
-                               break;
-
-                       pkt_ether = (struct ether_header *) pktdata;
-                       pkt_ipv6 = (struct ip6_hdr *)((char *) pkt_ether + linkhsize);
-                       pkt_ra = (struct nd_router_advert *) ((char *) pkt_ipv6 + MIN_IPV6_HLEN);
-                       pkt_end = (unsigned char *) pktdata + pkthdr->caplen;
-
-
-                       /* The packet length is the minimum of what we capured, and what is specified in the
-                          IPv6 Total Lenght field
-                        */
-                       if( pkt_end > ((unsigned char *)pkt_ra + pkt_ipv6->ip6_plen) )
-                               pkt_end = (unsigned char *)pkt_ra + pkt_ipv6->ip6_plen;
-
-                       /*
-                          Discard the packet if it is not of the minimum size to contain a Neighbor Advertisement
-                          message with a source link-layer address option
-                        */
-                       if( (pkt_end - (unsigned char *) pkt_ra) < (sizeof(struct nd_router_advert) + \
-                                                                               sizeof(struct nd_opt_slla)))
-                               continue;
-
-                       /*
-                          Neighbor Discovery packets must have a Hop Limit of 255
-                        */
-                       if(pkt_ipv6->ip6_hlim != 255)
-                               continue;
-
-                       /*
-                          Check that the IPv6 Source Address of the Router Advertisement is an IPv6 link-local
-                          address.
-                        */
-                       if( (pkt_ipv6->ip6_src.s6_addr16[0] & htons(0xffc0)) != htons(0xfe80))
-                               continue;
-
-                       /* 
-                          Check that that the Destination Address of the Router Advertisement is either the one
-                          that we used for sending the Router Solicitation message or a multicast address 
-                          (typically the all-nodes)
-                        */
-                       if(!is_eq_in6_addr(&(pkt_ipv6->ip6_dst), &(ipv6->ip6_src)) \
-                                       && !IN6_IS_ADDR_MULTICAST(&(pkt_ipv6->ip6_dst)))
-                               continue;
-
-                       /* Check that the ICMPv6 checksum is correct. If the received checksum is valid,
-                          and we compute the checksum over the received packet (including the Checkdum field)
-                          the result is 0. Otherwise, the packet has been corrupted.
-                       */
-                       if(in_chksum(pkt_ipv6, pkt_ra, pkt_end- (unsigned char *)pkt_ra, IPPROTO_ICMPV6) != 0)
-                               continue;
-
-                       p= (unsigned char *) pkt_ra + sizeof(struct nd_router_advert);
-
-                       /* Process Router Advertisement options */
-                       while( (p+ *(p+1) * 8) <= pkt_end && *(p+1)!=0 && !error_f){
-                               switch(*p){
-                                       case ND_OPT_SOURCE_LINKADDR:
-                                               if( (*(p+1) * 8) != sizeof(struct nd_opt_tlla))
-                                                       break;
-
-                                               /* Got a response, so we shouln't time out */
-                                               alarm(0);
-
-                                               /* Save the link-layer address */
-                                               idata->router_ether = *(struct ether_addr *) (p+2);
-                                               idata->router_ip6= pkt_ipv6->ip6_src;
-                                               foundrouter=1;
-                                               break;
-
-                                       case ND_OPT_PREFIX_INFORMATION:
-                                               if(*(p+1) != 4)
-                                                       break;
-
-                                               pio= (struct nd_opt_prefix_info *) p;
-
-                                               if((idata->prefix_ol.nprefix) < idata->prefix_ol.maxprefix){
-                                                       if( (pio->nd_opt_pi_flags_reserved & ND_OPT_PI_FLAG_ONLINK) && \
-                                                               (pio->nd_opt_pi_prefix_len <= 128) && !is_ip6_in_prefix_list(&(pio->nd_opt_pi_prefix), \
-                                                               &(idata->prefix_ol))){
-
-                                                               if( (idata->prefix_ol.prefix[idata->prefix_ol.nprefix] = \
-                                                                                                                                               malloc(sizeof(struct prefix_entry))) == NULL){
-                                                                       if(verbose_f>1)
-                                                                               puts("Error in malloc() while learning prefixes");
-
-                                                                       error_f=1;
-                                                                       break;
-                                                               }
-
-                                                               (idata->prefix_ol.prefix[idata->prefix_ol.nprefix])->ip6= pio->nd_opt_pi_prefix;
-                                                               (idata->prefix_ol.prefix[idata->prefix_ol.nprefix])->len= pio->nd_opt_pi_prefix_len;
-                                                               sanitize_ipv6_prefix(&((idata->prefix_ol.prefix[idata->prefix_ol.nprefix])->ip6), \
-                                                                                                               (idata->prefix_ol.prefix[idata->prefix_ol.nprefix])->len);
-                                                               (idata->prefix_ol.nprefix)++;
-                                                       }
-                                               }
-
-                                               if(idata->prefix_ac.nprefix < idata->prefix_ac.maxprefix){
-                                                       if( (pio->nd_opt_pi_flags_reserved & ND_OPT_PI_FLAG_AUTO) && \
-                                                               (pio->nd_opt_pi_prefix_len == 64) && !is_ip6_in_prefix_list(&(pio->nd_opt_pi_prefix), \
-                                                                                                                                                                                       &(idata->prefix_ac))){
-
-                                                               if((idata->prefix_ac.prefix[idata->prefix_ac.nprefix] = \
-                                                                                                                                               malloc(sizeof(struct prefix_entry))) == NULL){
-                                                                       if(verbose_f>1)
-                                                                               puts("Error in malloc() while learning prefixes");
-
-                                                                       error_f=1;
-                                                                       break;
-                                                               }
-
-                                                               (idata->prefix_ac.prefix[idata->prefix_ac.nprefix])->ip6= \
-                                                                                               pio->nd_opt_pi_prefix;
-                                                               (idata->prefix_ac.prefix[idata->prefix_ac.nprefix])->len= \
-                                                                                               pio->nd_opt_pi_prefix_len;
-
-                                                               sanitize_ipv6_prefix(&((idata->prefix_ac.prefix[idata->prefix_ac.nprefix])->ip6), \
-                                                                                                               (idata->prefix_ac.prefix[idata->prefix_ac.nprefix])->len);
-
-                                                               if(!idata->ip6_global_flag && idata->ip6_global.nprefix < idata->ip6_global.maxprefix){
-                                                               
-                                                                       if( (idata->ip6_global.prefix[idata->ip6_global.nprefix] = \
-                                                                                                                                       malloc(sizeof(struct prefix_entry))) == NULL){
-                                                                               if(verbose_f>1)
-                                                                                       puts("Error in malloc() creating local SLAAC addresses");
-
-                                                                               error_f=1;
-                                                                               break;
-                                                                       }
-
-                                                                       generate_slaac_address(&(idata->prefix_ac.prefix[idata->prefix_ac.nprefix]->ip6), \
-                                                                               &(idata->ether), &((idata->ip6_global.prefix[idata->ip6_global.nprefix])->ip6));
-                                                                       (idata->ip6_global.prefix[idata->ip6_global.nprefix])->len = 64;
-                                                                       (idata->ip6_global.nprefix)++;
-                                                               }
-                                                               (idata->prefix_ac.nprefix)++;
-                                                       }
-                                               }
-
-                                               break;
-                               }
-
-                               p= p + *(p+1) * 8;
-                       } /* Processing options */
-
-               } /* Processing packets */
-
-       } /* Resending Router Solicitations */
-
-       /* If we added at least one global address, we set the corresponding flag to 1 */
-       if(idata->ip6_global.nprefix)
-               idata->ip6_global_flag=1;
-
-       if(closefd_f)
-               pcap_close(pfd);
-
-       if( sigaction(SIGALRM, &old_sig, NULL) == -1){
-               if(verbose_f>1)
-                       puts("Error setting up 'Alarm' signal");
-
-               return(-1);
-       }
-
-       if(error_f){
-               return(-1);
-       }
-       else if(foundrouter)
-               return 1;
-       else
-               return 0;
-}
-
-
-
-/*
- * Function: is_eq_in6_addr()
- *
- * Compares two IPv6 addresses. Returns 0 if they are equal.
- */
-
-int is_eq_in6_addr(struct in6_addr *ip1, struct in6_addr *ip2){
-       unsigned int i;
-
-       for(i=0; i<8; i++)
-               if(ip1->s6_addr16[i] != ip2->s6_addr16[i])
-                       return 0;
-
-       return 1;
-}
-
-
-/*
- * Function: ether_to_ipv6_linklocal()
- *
- * Generates an IPv6 link-local address (with modified EUI-64 identifiers) based on
- * an Ethernet address.
- */
-
-void ether_to_ipv6_linklocal(struct ether_addr *etheraddr, struct in6_addr *ipv6addr){
-       ipv6addr->s6_addr16[0]= htons(0xfe80); /* Link-local unicast prefix */
-
-       for(i=1;i<4;i++)
-               ipv6addr->s6_addr16[i]=0x0000;
-
-       ipv6addr->s6_addr16[4]=  htons(((u_int16_t)etheraddr->a[0] << 8) | etheraddr->a[1]);
-       ipv6addr->s6_addr16[5]=  htons( ((u_int16_t)etheraddr->a[2] << 8) | 0xff);
-       ipv6addr->s6_addr16[6]=  htons((u_int16_t) 0xfe00 | etheraddr->a[3]);
-       ipv6addr->s6_addr16[7]=  htons(((u_int16_t)etheraddr->a[4] << 8) | etheraddr->a[5]);
-}
-
-
-
-
-/*
- * Handler for the ALARM signal.
- *
- * Used for setting a timeout on libpcap reads
- */
-
-void sig_alarm(int num){
-       if(canjump == 0)
-               return;
-
-       siglongjmp(env, 1);
-}
-
-
-/*
- * Function: get_if_addrs()
- *
- * Obtains Ethernet and IPv6 addresses of a network interface card
- */
-
-int get_if_addrs(struct iface_data *idata){
-       struct ifaddrs  *ifptr, *ptr;
-       struct sockaddr_in6     *sockin6ptr;
-
-#ifdef __linux__
-       struct sockaddr_ll      *sockpptr;
-#elif defined (__FreeBSD__) || defined(__NetBSD__) || defined (__OpenBSD__) || defined(__APPLE__)
-       struct sockaddr_dl      *sockpptr;
-#endif
-
-       if(getifaddrs(&ifptr) != 0){
-               if(verbose_f > 1){
-                       printf("Error while learning addresses of the %s interface\n", idata->iface);
-               }
-               return(-1);
-       }
-
-       for(ptr=ifptr; ptr != NULL; ptr= ptr->ifa_next){
-               if(ptr->ifa_addr == NULL)
-                       continue;
-
-#ifdef __linux__
-               if( !(idata->ether_flag) && ((ptr->ifa_addr)->sa_family == AF_PACKET)){
-                       if(strncmp(idata->iface, ptr->ifa_name, IFACE_LENGTH-1) == 0){
-                               sockpptr = (struct sockaddr_ll *) (ptr->ifa_addr);
-                               if(sockpptr->sll_halen == ETHER_ADDR_LEN){
-                                       memcpy((idata->ether).a, sockpptr->sll_addr, ETHER_ADDR_LEN);
-                                       idata->ether_flag=1;
-                               }
-                       }
-               }
-#elif defined (__FreeBSD__) || defined(__NetBSD__) || defined (__OpenBSD__) || defined(__APPLE__)
-               if( !(idata->ether_flag) && ((ptr->ifa_addr)->sa_family == AF_LINK)){
-                       if(strncmp(idata->iface, ptr->ifa_name, IFACE_LENGTH-1) == 0){
-                               sockpptr = (struct sockaddr_dl *) (ptr->ifa_addr);
-                               if(sockpptr->sdl_alen == ETHER_ADDR_LEN){
-                                       memcpy((idata->ether).a, (sockpptr->sdl_data + sockpptr->sdl_nlen), ETHER_ADDR_LEN);
-                                       idata->ether_flag= 1;
-                               }
-                       }
-               }
-#endif
-               else if((ptr->ifa_addr)->sa_family == AF_INET6){
-                       sockin6ptr= (struct sockaddr_in6 *) (ptr->ifa_addr);
-
-                       if( !(idata->ip6_local_flag) &&  (((sockin6ptr->sin6_addr).s6_addr16[0] & htons(0xffc0)) \
-                                                                                                                       == htons(0xfe80))){
-                               if(strncmp(idata->iface, ptr->ifa_name, IFACE_LENGTH-1) == 0){
-                                       idata->ip6_local = sockin6ptr->sin6_addr;
-#if defined (__FreeBSD__) || defined(__NetBSD__) || defined (__OpenBSD__) || defined(__APPLE__)
-                                       /* BSDs store the interface index in s6_addr16[1], so we must clear it */
-                                       idata->ip6_local.s6_addr16[1] =0;
-                                       idata->ip6_local.s6_addr16[2] =0;
-                                       idata->ip6_local.s6_addr16[3] =0;                                       
-#endif
-                                       idata->ip6_local_flag= 1;
-                               }
-                       }
-                       else if( ((sockin6ptr->sin6_addr).s6_addr16[0] & htons(0xffc0)) != htons(0xfe80)){
-                               if(strncmp(idata->iface, ptr->ifa_name, IFACE_LENGTH-1) == 0){
-                                       if(IN6_IS_ADDR_LOOPBACK(&(sockin6ptr->sin6_addr)))
-                                               idata->flags= IFACE_LOOPBACK;
-
-                                       if(!is_ip6_in_prefix_list( &(sockin6ptr->sin6_addr), &(idata->ip6_global))){
-                                               if(idata->ip6_global.nprefix < idata->ip6_global.maxprefix){
-                                                       if( (idata->ip6_global.prefix[idata->ip6_global.nprefix] = \
-                                                                                               malloc(sizeof(struct prefix_entry))) == NULL){
-                                                               if(verbose_f > 1)
-                                                                       puts("Error while storing Source Address");
-
-                                                               freeifaddrs(ifptr);
-                                                               return(-1);
-                                                       }
-
-                                                       (idata->ip6_global.prefix[idata->ip6_global.nprefix])->len = 64;
-                                                       (idata->ip6_global.prefix[idata->ip6_global.nprefix])->ip6 = sockin6ptr->sin6_addr;
-                                                       idata->ip6_global.nprefix++;
-                                                       idata->ip6_global_flag= 1;
-                                               }
-                                       }
-                               }
-                       }
-               }
-       }
-
-       freeifaddrs(ifptr);
-       return(0);
-}
-
-
-/*
- * Function: is_ip6_in_list()
- *
- * Checks whether an IPv6 address is present in an address list.
- */
-
-int is_ip6_in_prefix_list(struct in6_addr *target, struct prefix_list *plist){
-       unsigned int i, j, full16, rest16;
-       u_int16_t       mask16;
-
-       for(i=0; i < plist->nprefix; i++){
-               full16=(plist->prefix[i])->len / 16;
-               rest16=(plist->prefix[i])->len % 16;
-               mask16 = 0xffff;
-
-               for(j=0; j < full16; j++)
-                       if(target->s6_addr16[j] != (plist->prefix[i])->ip6.s6_addr16[j])
-                               break;
-
-               if( (j == full16) && rest16){
-                       mask16 = mask16 << (16 - rest16);
-
-                       if( (target->s6_addr16[full16] & mask16) == ((plist->prefix[i])->ip6.s6_addr16[full16] & mask16))
-                               return 1;
-               }
-       }
-
-       return 0;
-}
-
-
-/*
- * match_ipv6_to_prefixes()
- *
- * Finds out whether an IPv6 address matches any IPv6 prefix in an array
- */
-
-int match_ipv6_to_prefixes(struct in6_addr *ipv6addr, struct prefix_list *pf){
-       unsigned int    i, j, full16, rbits;
-       u_int16_t       mask;
-
-       for(i=0; i < pf->nprefix; i++){
-               full16= (pf->prefix[i])->len/16;
-               for(j=0; j<full16; j++){
-                       if(ipv6addr->s6_addr16[j] != (pf->prefix[i])->ip6.s6_addr16[j])
-                               break;
-               }
-
-               if(j == full16){
-                       if((rbits= (pf->prefix[i])->len%16) == 0)
-                               return 1;
-                       else{
-                               mask= 0xffff;
-                               mask= mask<<rbits;
-                               if((pf->prefix[i])->ip6.s6_addr16[full16] == (ipv6addr->s6_addr16[full16] & htons(mask)))
-                                       return 1;
-                       }
-               }
-       }
-
-       return 0;
-}
-
-
-/*
- * Function: generate_slaac_address()
- *
- * Generates an IPv6 address (with modified EUI-64 identifiers) based on
- * a IPv6 prefix and an Ethernet address.
- */
-
-void generate_slaac_address(struct in6_addr *prefix, struct ether_addr *etheraddr, struct in6_addr *ipv6addr){
-       ipv6addr->s6_addr16[0]= htons(0xfe80); /* Link-local unicast prefix */
-
-       for(i=0;i<4;i++)
-               ipv6addr->s6_addr16[i]= prefix->s6_addr16[i];
-
-       ipv6addr->s6_addr16[4]=  htons(((u_int16_t) (etheraddr->a[0] | 0x02) << 8) | etheraddr->a[1]);
-       ipv6addr->s6_addr16[5]=  htons( ((u_int16_t)etheraddr->a[2] << 8) | 0xff);
-       ipv6addr->s6_addr16[6]=  htons((u_int16_t) 0xfe00 | etheraddr->a[3]);
-       ipv6addr->s6_addr16[7]=  htons(((u_int16_t)etheraddr->a[4] << 8) | etheraddr->a[5]);
-}
-
-
-
-/*
- * Function: src_addr_sel()
- *
- * Selects a Source Address for a given Destination Address
- */
-
-struct in6_addr *src_addr_sel(struct iface_data *idata, struct in6_addr *dst){
-       u_int16_t       mask16;
-       unsigned int    i, j, full16, rest16;
-       /*
-          If the destination address is a link-local address, we select our link-local
-          address as the Source Address. If the dst address is a global unicast address
-          we select our first matching address, or else our first global address.
-          Worst case scenario, we don't have global address and must use our link-local
-          address.
-       */   
-
-       if( (dst->s6_addr16[0] & htons(0xffc0)) == htons(0xfe80)){
-               return( &(idata->ip6_local));
-       }
-       else if(IN6_IS_ADDR_MC_LINKLOCAL(dst) || IN6_IS_ADDR_LINKLOCAL(dst)){
-               return( &(idata->ip6_local));
-       }
-       else if(idata->ip6_global_flag){
-               for(i=0; i < idata->ip6_global.nprefix; i++){
-                               full16=(idata->ip6_global.prefix[i])->len / 16;
-                               rest16=(idata->ip6_global.prefix[i])->len % 16;
-                               mask16 = 0xffff;
-
-                               for(j=0; j < full16; j++)
-                                       if( dst->s6_addr16[j] != (idata->ip6_global.prefix[i])->ip6.s6_addr16[j])
-                                               break;
-
-                               if( (j == full16) && rest16){
-                                       mask16 = mask16 << (16 - rest16);
-
-                                       if( (dst->s6_addr16[full16] & mask16) == ((idata->ip6_global.prefix[i])->ip6.s6_addr16[full16] & mask16))
-                                               return( &((idata->ip6_global.prefix[i])->ip6));
-                               }
-               }
-
-               return( &((idata->ip6_global.prefix[0])->ip6));
-       }
-       else{
-               return( &(idata->ip6_local));
-       }
-}
-
-
-/*
- * Function: send_neighbor_advertisement()
- *
- * Send a Neighbor advertisement in response to a Neighbor Solicitation message
- */
-
-int send_neighbor_advert(struct iface_data *idata, pcap_t *pfd,  const u_char *pktdata){
-       struct ether_header                     *pkt_ether;
-       struct ip6_hdr                          *pkt_ipv6;
-       struct nd_neighbor_solicit      *pkt_ns;
-       unsigned char                           *ptr;
-       struct ether_header                     *ethernet;
-       unsigned char                           *v6buffer;
-       struct ip6_hdr                          *ipv6;
-       struct nd_neighbor_advert       *na;
-       struct nd_opt_tlla                      *tllaopt;
-       unsigned char                           wbuffer[2500];
-
-       if(idata->mtu > sizeof(wbuffer)){
-               if(verbose_f)
-                       puts("send_neighbor_advert(): Internal buffer too small");
-
-               return(-1);
-       }
-
-       ethernet= (struct ether_header *) wbuffer;
-       v6buffer = (unsigned char *) ethernet + linkhsize;
-       ipv6 = (struct ip6_hdr *) v6buffer;
-
-
-
-
-
-
-       na= (struct nd_neighbor_advert *) ((char *) v6buffer + MIN_IPV6_HLEN);
-       ptr = (unsigned char *) na;
-
-       pkt_ether = (struct ether_header *) pktdata;
-       pkt_ipv6 = (struct ip6_hdr *)((char *) pkt_ether + linkhsize);
-       pkt_ns = (struct nd_neighbor_solicit *) ((char *) pkt_ipv6 + MIN_IPV6_HLEN);
-
-       ethernet->ether_type = htons(0x86dd);
-       ipv6->ip6_flow=0;
-       ipv6->ip6_vfc= 0x60;
-       ipv6->ip6_hlim= 255;
-       ipv6->ip6_nxt= IPPROTO_ICMPV6;
-
-       if( (ptr+sizeof(struct nd_neighbor_advert)) > (v6buffer+idata->mtu)){
-               if(verbose_f)
-                       puts("send_neighbor_advert(): Packet too large when sending Neighbor Advertisement");
-
-               return(-1);
-       }
-
-       na->nd_na_type = ND_NEIGHBOR_ADVERT;
-       na->nd_na_code = 0;
-       ptr += sizeof(struct nd_neighbor_advert);
-
-       if( (ptr+sizeof(struct nd_opt_tlla)) <= (v6buffer+idata->mtu) ){
-               tllaopt = (struct nd_opt_tlla *) ptr;
-               tllaopt->type= ND_OPT_TARGET_LINKADDR;
-               tllaopt->length= TLLA_OPT_LEN;
-               bcopy(idata->ether.a, tllaopt->address, ETH_ALEN);
-               ptr += sizeof(struct nd_opt_tlla);
-       }
-       else{
-               if(verbose_f)
-                       puts("send_neighbor_advert(): Packet Too Large while inserting TLLA option in NA message");
-
-               return(-1);
-       }
-
-       /* If the IPv6 Source Address of the incoming Neighbor Solicitation is the unspecified 
-          address (::), the Neighbor Advertisement must be directed to the IPv6 all-nodes 
-          multicast address (and the Ethernet Destination address should be 33:33:33:00:00:01). 
-          Otherwise, the Neighbor Advertisement is sent to the IPv6 Source Address (and 
-          Ethernet Source Address) of the incoming Neighbor Solicitation message
-        */
-       pkt_ipv6addr = &(pkt_ipv6->ip6_src);
-
-       if(IN6_IS_ADDR_UNSPECIFIED(pkt_ipv6addr)){
-               na->nd_na_flags_reserved = 0;
-
-               if ( inet_pton(AF_INET6, ALL_NODES_MULTICAST_ADDR, &(ipv6->ip6_dst)) <= 0){
-                       if(verbose_f)
-                               puts("send_neighbor_advert(): Error converting all-nodes multicast address");
-
-                       return(-1);
-               }
-
-               if(ether_pton(ETHER_ALLNODES_LINK_ADDR, &(ethernet->dst), ETHER_ADDR_LEN) == 0){
-                       if(verbose_f)
-                               puts("send_neighbor_advert(): Error converting all-nodes link-local address");
-
-                       return(-1);
-               }
-       }
-       else{
-               ipv6->ip6_dst = pkt_ipv6->ip6_src;
-               ethernet->dst = pkt_ether->src;
-
-               /* 
-                  Set the "Solicited" flag if NS was sent from an address other than the unspecified
-                  address (i.e., the response will be unicast). 
-                */ 
-
-               na->nd_na_flags_reserved =  ND_NA_FLAG_OVERRIDE | ND_NA_FLAG_SOLICITED;
-       }
-
-       ethernet->src = idata->ether;
-
-       /* 
-          If the Neighbor Solicitation message was directed to one of our unicast addresses, the IPv6 Source
-          Address is set to that address. Otherwise, we set the IPv6 Source Address to our link-local address.
-        */
-
-       pkt_ipv6addr = &(pkt_ipv6->ip6_dst);
-
-       if(IN6_IS_ADDR_MULTICAST(pkt_ipv6addr)){
-               ipv6->ip6_src = idata->ip6_local;
-       }
-       else{
-               if(is_eq_in6_addr(pkt_ipv6addr, &(idata->ip6_local))){
-                       ipv6->ip6_src = idata->ip6_local;       
-               }
-               else if(idata->ip6_global_flag){
-                       for(i=0; i < idata->ip6_global.nprefix; i++){
-                               if(is_eq_in6_addr(pkt_ipv6addr, &((idata->ip6_global.prefix[i])->ip6))){
-                                       ipv6->ip6_src = (idata->ip6_global.prefix[i])->ip6;     
-                                       break;
-                               }
-                       }
-
-                       if(i == idata->ip6_global.nprefix)
-                               return 0;
-               }
-               else{
-                       return 0;
-               }
-       }
-
-       na->nd_na_target= pkt_ns->nd_ns_target;
-
-       na->nd_na_cksum = 0;
-       na->nd_na_cksum = in_chksum(v6buffer, na, ptr-((unsigned char *)na), IPPROTO_ICMPV6);
-
-       ipv6->ip6_plen = htons((ptr - v6buffer) - MIN_IPV6_HLEN);
-
-       if((nw=pcap_inject(pfd, wbuffer, ptr - wbuffer)) == -1){
-               if(verbose_f)
-                       printf("send_neighbor_advert(): pcap_inject(): %s", pcap_geterr(pfd));
-
-               return(-1);
-       }
-
-       if(nw != (ptr-wbuffer)){
-               if(verbose_f)
-                       printf("send_neighbor_advert(): pcap_inject(): only wrote %lu bytes "
-                                                       "(rather than %lu bytes)\n", (LUI) nw, (LUI) (ptr-wbuffer));
-
-               return(-1);
-       }
-
-       return 0;
-}
-
-
-/*
- * Function: predict_flow_id()
- *
- * Identifies and prints the Flow Label generation policy
-*/
-int predict_flow_id(u_int32_t *s1, unsigned int n1, u_int32_t *s2, unsigned int n2){
-       u_int32_t               diff1_avg, diff2_avg;
-       double                  diff1_sdev, diff2_sdev;
-
-       if(inc_sdev(s1, n1, &diff1_avg, &diff1_sdev) == -1){
-               if(verbose_f)
-                       puts("Error while allocating memory in inc_sdev()");
-
-               return(-1);
-       }
-
-       if(inc_sdev(s2, n2, &diff2_avg, &diff2_sdev) == -1){
-               if(verbose_f)
-                       puts("Error while allocating memory in inc_sdev()");
-
-               return(-1);
-       }
-       
-       if(diff1_sdev == 0 && diff1_avg == 0){
-               if(diff2_sdev == 0 && diff2_avg == 0){
-                       printf("Flow Label policy: Global (predictable) constant labels, set to %05lu\n", (LUI) s1[0]);
-               }
-               else{
-                       printf("Flow Label policy: Per-destination constant labels with increments of %lu (sdev: %f)\n", \
-                                       (LUI) diff2_avg, diff2_sdev);
-               }
-       }
-
-       else if(diff1_sdev <= 100){
-               if(diff2_sdev <= 100){
-                       printf("Flow Label policy: Global (predictable) labels with increments of %lu (sdev: %f)\n", \
-                                       (LUI) diff1_avg, diff1_sdev);
-               }
-               else{
-                       printf("Flow Label policy: Per-destination labels with increments of %lu (sdev: %f)\n", \
-                                       (LUI) diff1_avg, diff1_sdev);
-                       printf("                   Global policy: Avg. inc.: %lu, sdev: %f\n", (LUI) diff2_avg, diff2_sdev);
-               }
-       }
-       else{
-               puts("Flow Label policy: Randomized labels");
-               printf("    Per-destination: Avg. inc.: %lu, sdev: %f\n"
-                      "    Global:          Avg. inc.: %lu, sdev: %f\n", \
-                               (LUI) diff1_avg, diff1_sdev, (LUI) diff2_avg, diff2_sdev);
-       }
-
-       return(0);
-}
-
-
-
-/*
- * Function: inc_sdev()
- *
- * Computes the average increment and standard deviation of an array of u_int32_t's.
- * The function computes the aforementioned values for network byte order and host byte order,
- * and returns as a result the set of values with smaller standard deviation.
-*/
-int inc_sdev(u_int32_t *s, unsigned int n, u_int32_t *diff_avg, double *diff_sdev){
-       unsigned int                    i;
-       u_int32_t                               *diff, *s2;
-       unsigned long long int  diff1_avg, diff2_avg;
-       double                                  diff1_sdev, diff2_sdev;
-
-       if( (diff=malloc((n-1)*sizeof(u_int32_t))) == NULL)
-               return(-1);
-
-       diff1_avg= 0;
-
-       for(i=0; i<(n-1); i++){
-               diff[i]= s[i+1]-s[i];
-               diff1_avg+= diff[i];
-       }
-
-       diff1_avg= diff1_avg/(n-1);
-
-       diff1_sdev= 0;
-
-       for(i=0; i<(n-1); i++)
-               diff1_sdev= diff1_sdev + (diff[i] - diff1_avg) * (diff[i] - diff1_avg);
-
-       diff1_sdev= sqrt(diff1_sdev/(n-2));
-
-       if( (s2=malloc(n * sizeof(u_int32_t))) == NULL)
-               return(-1);
-
-       memcpy(s2, s, n* sizeof(u_int32_t));
-       change_endianness(s2, n);
-
-       diff2_avg= 0;
-
-       for(i=0; i<(n-1); i++){
-               diff[i]= s2[i+1]-s2[i];
-               diff2_avg+= diff[i];
-       }
-
-       diff2_avg= diff2_avg/(n-1);
-
-       diff2_sdev= 0;
-
-       for(i=0; i<(n-1); i++)
-               diff2_sdev= diff2_sdev + (diff[i] - diff2_avg) * (diff[i] - diff2_avg);
-
-       diff2_sdev= sqrt(diff2_sdev/(n-2));
-
-       free(diff);
-       free(s2);
-
-       if(diff1_sdev <= diff2_sdev){
-               *diff_avg= diff1_avg;
-               *diff_sdev= diff1_sdev;
-       }
-       else{
-               *diff_avg= diff2_avg;
-               *diff_sdev= diff2_sdev;
-       }
-
-       return(0);
-}
-
-
-/*
- * Function: change_endianness()
- *
- * Changes the endianness of an array of u_int32_t's
-*/
-void change_endianness(u_int32_t *s, unsigned int n){
-       unsigned int            i;
-       union {
-               u_int32_t               ui;
-               unsigned char   c[4];
-       } swapper;
-
-       unsigned char   c;
-
-       for(i=0; i<n; i++){
-               swapper.ui= *s;
-               c= swapper.c[3];
-               swapper.c[3]= swapper.c[0];
-               swapper.c[0]= c;
-
-               c= swapper.c[2];
-               swapper.c[2]= swapper.c[1];
-               swapper.c[1]= c;
-       }
-}              
-
-
-
-int send_neighbor_solicit(struct iface_data *idata){
-       unsigned char   *ptr;
-       unsigned char                   buffer[65556];
-       unsigned int                    ns_max_packet_size;
-       struct ether_header             *ether;
-       unsigned char                   *v6buffer;
-       struct ip6_hdr                  *ipv6;
-       struct nd_neighbor_solicit      *ns;
-       struct nd_opt_slla              *sllaopt;
-
-       ns_max_packet_size = idata->mtu;
-
-       ether = (struct ether_header *) buffer;
-       v6buffer = buffer + linkhsize;
-       ipv6 = (struct ip6_hdr *) v6buffer;
-
-       ether->src = idata->ether;
-       ether->dst = ether_multicast(&(ipv6->ip6_dst));
-       ether->ether_type = htons(0x86dd);
-
-       ipv6->ip6_flow=0;
-       ipv6->ip6_vfc= 0x60;
-       ipv6->ip6_hlim= 255;
-       ipv6->ip6_src= srcaddr;
-       ipv6->ip6_dst= solicited_node(&dstaddr);
-
-       prev_nh = (unsigned char *) &(ipv6->ip6_nxt);
-       *prev_nh = IPPROTO_ICMPV6;
-
-       ptr = (unsigned char *) v6buffer + MIN_IPV6_HLEN;
-
-       if( (ptr+sizeof(struct nd_neighbor_solicit)) > (v6buffer+ns_max_packet_size)){
-               if(verbose_f>1)
-                       puts("Packet too large while inserting Neighbor Solicitation header");
-
-               return(-1);
-       }
-
-       ns= (struct nd_neighbor_solicit *) (ptr);
-
-       ns->nd_ns_type = ND_NEIGHBOR_SOLICIT;
-       ns->nd_ns_code = 0;
-       ns->nd_ns_reserved = 0;
-       ns->nd_ns_target = dstaddr;
-
-       ptr += sizeof(struct nd_neighbor_solicit);
-       sllaopt = (struct nd_opt_slla *) ptr;    
-
-       if( (ptr+sizeof(struct nd_opt_slla)) > (v6buffer+ns_max_packet_size)){
-               if(verbose_f>1)
-                       puts("NS message too large while processing source link-layer addresss opt.");
-
-               return(-1);
-       }
-
-       sllaopt->type= ND_OPT_SOURCE_LINKADDR;
-       sllaopt->length= SLLA_OPT_LEN;
-       bcopy( &(idata->ether.a), sllaopt->address, ETH_ALEN);
-       ptr += sizeof(struct nd_opt_slla);
-
-       ipv6->ip6_plen = htons((ptr - v6buffer) - MIN_IPV6_HLEN);
-       ns->nd_ns_cksum = 0;
-       ns->nd_ns_cksum = in_chksum(v6buffer, ns, ptr-((unsigned char *)ns), IPPROTO_ICMPV6);
-
-       if((nw=pcap_inject(idata->pd, buffer, ptr - buffer)) == -1){
-               if(verbose_f>1)
-                       printf("pcap_inject(): %s\n", pcap_geterr(idata->pd));
-
-               return(-1);
-       }
-
-       if(nw != (ptr-buffer)){
-               if(verbose_f>1)
-                       printf("pcap_inject(): only wrote %lu bytes (rather than %lu bytes)\n", (LUI) nw, \
-                                                                                       (LUI) (ptr-buffer));
-               return(-1);
-       }
-
-       return 0;
-}
 
index 921f951..11ed611 100644 (file)
@@ -3,205 +3,7 @@
  *
  */
 
-#define LUI            long unsigned int
-
-#define ETH_ALEN       6               /* Octets in one ethernet addr   */
-#define ETH_HLEN       14              /* Total octets in header.       */
-#define ETH_DATA_LEN   1500            /* Max. octets in payload        */
-#define        ETHERTYPE_IPV6  0x86dd          /* IP protocol version 6 */
-#define        ETHER_ADDR_LEN  ETH_ALEN        /* size of ethernet addr */
-#define        ETHER_HDR_LEN   ETH_HLEN        /* total octets in header */
-
-#define ETHER_ADDR_PLEN        18              /* Includes termination byte */
-
-#define ETHER_ALLNODES_LINK_ADDR       "33:33:00:00:00:01"
-#define ETHER_ALLROUTERS_LINK_ADDR     "33:33:00:00:00:02"
-
-#define        MIN_IPV6_HLEN           40
-#define MIN_IPV6_MTU           1280
-#define MIN_TCP_HLEN           20
-#define MIN_UDP_HLEN           20
-#define MIN_ICMP6_HLEN         8
-#define        SLLA_OPT_LEN            1
-#define        TLLA_OPT_LEN            1
-#define MAX_TLLA_OPTION                256
-#define IFACE_LENGTH   255
-#define ALL_NODES_MULTICAST_ADDR       "FF02::1"
-#define ALL_ROUTERS_MULTICAST_ADDR     "FF02::2"
-#define SOLICITED_NODE_MULTICAST_PREFIX "FF02:0:0:0:0:1:FF00::"
-
-
-/* Support for IPv6 extension headers */
-#define FRAG_HDR_SIZE          8
-#define        MAX_IPV6_PAYLOAD        65535
-#define MAX_DST_OPT_HDR                256
-#define MAX_DST_OPT_U_HDR      MAX_DST_OPT_HDR
-#define MAX_HBH_OPT_HDR                MAX_DST_OPT_HDR
-
-
-/* Filter Constants */
-#define MAX_BLOCK_SRC                  50
-#define MAX_BLOCK_DST                  50
-#define MAX_BLOCK_TARGET               50
-#define MAX_BLOCK_LINK_SRC             50
-#define MAX_BLOCK_LINK_DST             50
-
-#define MAX_ACCEPT_SRC                 50
-#define MAX_ACCEPT_DST                 50
-#define MAX_ACCEPT_TARGET              50
-#define MAX_ACCEPT_LINK_SRC            50
-#define MAX_ACCEPT_LINK_DST            50
-
-#define ACCEPTED                       1
-#define BLOCKED                                0
-
 #define        QUERY_TIMEOUT                   65
 
-#define MIN_HBH_LEN                    8
-
-/* For discovering the fragment reassembly policy */
-#define        TIMED_OUT                       1
-#define FIRST_COPY                     2
-#define LAST_COPY                      3
-#define TIME_EXCEEDED                  4
-#define UNKNOWN_COPY                   5
-#define MIN_FRAG_SIZE                  104
-
-
-/* Constants used with the libpcap functions */
-#define PCAP_ICMPV6_NA_FILTER "icmp6 and ip6[7]==255 and ip6[40]==136 and ip6[41]==0"
-
-#define PCAP_ICMPV6NSEXCEEDED_FILTER  "icmp6 and ((ip6[40]==3 and ip6[41]==1) or (ip6[40]==129 and ip6[41]==0))"
-
-#define PCAP_ICMPV6_NSECHOEXCEEDED_FILTER  "icmp6 and ((ip6[40]==3 and ip6[41]==1) or (ip6[40]==129 and ip6[41]==0) OR (ip6[7]==255 and ip6[40]==135 and ip6[41]==0))"
-
-/* Filter to receive Neighbor Solicitations and Fragmented packets */
-#define PCAP_ICMPV6NSFRAG_FILTER "(ip6[7]==255 and icmp6 and ip6[40]==135 and ip6[41]==0) or (ip6 and ip6[6]==44)"
-
-#define PCAP_NSTCP_FILTER "(ip6[7]==255 and icmp6 and ip6[40]==135 and ip6[41]==0) or (ip6 and ip6[6]==6)"
-
-/*
-#define PCAP_ICMPV6NSEXCEEDED_FILTER  "icmp6 and ((ip6[7]==255 and ip6[40]==135 and ip6[41]==0) or (ip6[40]==3 and ip6[41]==1) or (ip6[40]==129 and ip6[41]==0))"
-*/
-#define PCAP_ICMPV6_RANS_FILTER                "icmp6 and ip6[7]==255 and ((ip6[40]==134 and ip6[41]==0) or (ip6[40]==135 and ip6[41]==0))"
-#define PCAP_ICMPV6_NA_FILTER "icmp6 and ip6[7]==255 and ip6[40]==136 and ip6[41]==0"
-#define PCAP_TCPIPV6_FILTER "ip6 and tcp"
-#define PCAP_IPV6_FILTER "ip6"
-
-/* Constants used for Router Discovery */
-#define MAX_PREFIXES_ONLINK            100
-#define MAX_PREFIXES_AUTO              100
-#define MAX_LOCAL_ADDRESSES            256
-
-
-/* Constants for the send_fragment() function */
-#define        FIRST_FRAGMENT                  1
-#define LAST_FRAGMENT                  2
-#define ATOMIC_FRAGMENT                        3
-#define MIDDLE_FRAGMENT                        4
-#define TIMESTAMP                              1
-#define NO_TIMESTAMP                   0
-
-#define MAX_FRAG_OFFSET                        0xfff8
-
-/* For Fragment ID assessment */
-#define ID_ASSESS_TIMEOUT              5
-#define NSAMPLES                               40
-#define FIXED_ORIGIN                   1
-#define MULTI_ORIGIN                   2
-
-
-/* For limiting strncmp */
-#define MAX_STRING_SIZE                        10
-
-struct ether_addr{
-       u_int8_t a[ETHER_ADDR_LEN];
-} __attribute__ ((__packed__));
-
-/* For DLT_NULL encapsulation */
-struct dlt_null
-{
-  u_int32_t    family; /* Protocol Family      */
-} __attribute__ ((__packed__));
-
-struct nd_opt_slla{
-       u_int8_t        type;
-       u_int8_t        length;
-       u_int8_t        address[6];
-} __attribute__ ((__packed__));
-
-struct nd_opt_tlla{
-       u_int8_t        type;
-       u_int8_t        length;
-       u_int8_t        address[6];
-} __attribute__ ((__packed__));
-
-struct ipv6pseudohdr{
-       struct in6_addr srcaddr;
-       struct in6_addr dstaddr;
-       u_int32_t       len;
-       u_int8_t zero[3];
-       u_int8_t        nh;
-} __attribute__ ((__packed__));
-
-/* 10Mb/s ethernet header */
-struct ether_header
-{
-  struct ether_addr dst;       /* destination eth addr */
-  struct ether_addr src;       /* source ether addr    */
-  u_int16_t ether_type;                /* packet type ID field */
-} __attribute__ ((__packed__));
-
-
-struct prefix_entry{
-       struct in6_addr         ip6;
-       unsigned char           len;
-};
-
-struct prefix_list{
-       struct prefix_entry     **prefix;
-       unsigned int            nprefix;
-       unsigned int            maxprefix;
-};
-
-struct iface_data{
-       char                    iface[IFACE_LENGTH];
-       int                     type;
-       int                     flags;
-       int                     fd;
-       pcap_t                  *pd;
-       struct ether_addr       ether;
-       unsigned int            ether_flag;
-       struct in6_addr         ip6_local;
-       unsigned int            ip6_local_flag;
-       struct prefix_list      ip6_global;
-       unsigned int            ip6_global_flag;
-       struct in6_addr         router_ip6;
-       struct ether_addr       router_ether;
-       struct prefix_list      prefix_ac;
-       struct prefix_list      prefix_ol;
-       unsigned int            local_retrans;
-       unsigned int            local_timeout;
-       unsigned int            mtu;
-};
-
-#if defined (__FreeBSD__) || defined(__NetBSD__) || defined (__OpenBSD__) || defined(__APPLE__)
-    #ifndef s6_addr16
-           #define s6_addr16   __u6_addr.__u6_addr16
-    #endif
-
-    #ifndef s6_addr8
-           #define s6_addr8    __u6_addr.__u6_addr8
-    #endif
-
-    #ifndef s6_addr32
-           #define s6_addr32   __u6_addr.__u6_addr32
-    #endif
-#endif
-
 
-/* This causes Linux to use the BSD definition of the TCP and UDP header fields */
-#ifndef __FAVOR_BSD
-       #define __FAVOR_BSD
-#endif
 
index f2565d0..6ee0529 100644 (file)
  * 
  * Build with: make frag6
  * 
- * This program has been tested to compile and run on: Debian GNU/Linux 6.0,
- * FreeBSD 9.0, NetBSD 5.1, OpenBSD 5.0, and Ubuntu 11.10.
- *
  * It requires that the libpcap library be installed on your system.
  *
  * Please send any bug reports to Fernando Gont <fgont@si6networks.com>
  */
 
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/socket.h>
+#include <sys/select.h>
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <errno.h>
 #include <unistd.h>
 #include <signal.h>
 #include <string.h>
-#include <pcap.h>
-#include <sys/types.h>
-#include <sys/param.h>
 #include <setjmp.h>
+#include <math.h>
+
+#include <pcap.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <netinet/ip6.h>
 #include <netinet/icmp6.h>
-#include <sys/socket.h>
-#include <pwd.h>
 #include <net/if.h>
 #include <ifaddrs.h>
 #ifdef __linux__
        #include <netpacket/packet.h>
-#elif defined (__FreeBSD__) || defined(__NetBSD__) || defined (__OpenBSD__) || defined(__APPLE__)
+#elif defined (__FreeBSD__) || defined(__NetBSD__) || defined (__OpenBSD__) || defined(__APPLE__) || ( !defined(__FreeBSD__) && defined(__FreeBSD_kernel__))
        #include <net/if_dl.h>
 #endif
-#include <sys/select.h>
+
 #include "frag6.h"
 #include "ipv6toolkit.h"
+#include "libipv6.h"
 #include <netinet/tcp.h>
-#include <math.h>
 
 
 /* Function prototypes */
-int                                    init_iface_data(struct iface_data *);
-int                                    insert_pad_opt(unsigned char *ptrhdr, const unsigned char *, unsigned int);
-void                           print_icmp6_echo(struct pcap_pkthdr *, const u_char *);
-void                           process_icmp6_echo(struct pcap_pkthdr *, const u_char *, unsigned char *, unsigned int *);
-void                           print_icmp6_timed(struct pcap_pkthdr *, const u_char *);
-void                           process_icmp6_timed(struct pcap_pkthdr *, const u_char *, unsigned char *);
-int                            send_neighbor_advert(struct iface_data *, pcap_t *,  const u_char *);
-void                           print_attack_info(void);
-void                           usage(void);
+int                                    predict_frag_id(u_int32_t *, unsigned int, u_int32_t *, unsigned int);
+void                           print_attack_info(struct iface_data *);
 void                           print_help(void);
-int                                    ether_pton(const char *, struct ether_addr *, unsigned int);
-int                                    ether_ntop(const struct ether_addr *, char *, size_t);
-u_int16_t                      in_chksum(void *, void *, size_t, u_int8_t);
-int                                    is_ip6_in_prefix_list(struct in6_addr *, struct prefix_list *);
-unsigned int           match_ipv6(struct in6_addr *, u_int8_t *, unsigned int, struct in6_addr *);
-unsigned int           match_ether(struct ether_addr *, unsigned int, struct ether_addr *);
-void                           sanitize_ipv6_prefix(struct in6_addr *, u_int8_t);
-void                           randomize_ipv6_addr(struct in6_addr *, struct in6_addr *, u_int8_t);
-void                           randomize_ether_addr(struct ether_addr *);
-void                           ether_to_ipv6_linklocal(struct ether_addr *etheraddr, struct in6_addr *ipv6addr);
-void                           generate_slaac_address(struct in6_addr *, struct ether_addr *, struct in6_addr *);
-void                           sig_alarm(int);
-int                                    is_eq_in6_addr(struct in6_addr *, struct in6_addr *);
-int                                    find_ipv6_router_full(pcap_t *, struct iface_data *);
-int                                    ipv6_to_ether(pcap_t *, struct iface_data *, struct in6_addr *, struct ether_addr *);
-struct in6_addr                solicited_node(const struct in6_addr *);
-struct ether_addr      ether_multicast(const struct in6_addr *);
-int                            match_ipv6_to_prefixes(struct in6_addr *, struct prefix_list *);
-int                                    get_if_addrs(struct iface_data *);
-struct in6_addr *      src_addr_sel(struct iface_data *, struct in6_addr *);
+void                           print_icmp6_echo(struct iface_data *, struct pcap_pkthdr *, const u_char *);
+void                           print_icmp6_timed(struct iface_data *, struct pcap_pkthdr *, const u_char *);
+void                           process_icmp6_echo(struct iface_data *, struct pcap_pkthdr *, const u_char *, unsigned char *, unsigned int *);
+void                           process_icmp6_timed(struct iface_data *, struct pcap_pkthdr *, const u_char *, unsigned char *);
+int                                    send_fid_probe(struct iface_data *);
+int                            send_fragment(struct iface_data *, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int);
+int                            send_fragment2(struct iface_data *, u_int16_t, unsigned int, unsigned int, unsigned int, unsigned int, char *);
+int                                    test_frag_pattern(unsigned char *, unsigned int, char *);
+void                           usage(void);
 int                            valid_icmp6_response(struct iface_data *, struct pcap_pkthdr *, const u_char *);
 int                                    valid_icmp6_response2(struct iface_data *, struct pcap_pkthdr *, const u_char *, unsigned int);
-int                            send_fragment(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int);
-int                            send_fragment2(u_int16_t, unsigned int, unsigned int, unsigned int, unsigned int, char *);
-int                                    send_fid_probe(void);
-int                                    test_frag_pattern(unsigned char *, unsigned int, char *);
-int                                    predict_frag_id(u_int32_t *, unsigned int, u_int32_t *, unsigned int);
-int                                    inc_sdev(u_int32_t *, unsigned int, u_int32_t *, double *);
-void                           change_endianness(u_int32_t *, unsigned int);
-int                                    send_neighbor_solicit(struct iface_data *);
 
 /* Used for router discovery */
 struct iface_data      idata;
@@ -129,17 +104,14 @@ char                              dev[64], errbuf[PCAP_ERRBUF_SIZE];
 unsigned char          buffer[65556], buffrh[MIN_IPV6_HLEN + MIN_TCP_HLEN];
 unsigned char          *v6buffer, *ptr, *startofprefixes;
 char                           *pref;
-char                           iface[IFACE_LENGTH];
     
 struct ip6_hdr         *ipv6;
 struct icmp6_hdr       *icmp6;
 
 struct ether_header    *ethernet;
 struct dlt_null                *dlt_null;
-struct ether_addr      hsrcaddr, hdstaddr;
 struct nd_opt_tlla     *tllaopt;
 
-struct in6_addr                srcaddr, dstaddr, targetaddr;
 struct ether_addr      linkaddr[MAX_TLLA_OPTION];
 unsigned int           nlinkaddr=0, linkaddrs;
 
@@ -151,15 +123,13 @@ unsigned long             ul_res, ul_val;
 unsigned int           i, j, startrand;
 unsigned int           skip;
 unsigned int           frags, nfrags, nsleep;
-unsigned char          srcpreflen;
-
 u_int16_t                      mask, ip6length;
 u_int8_t                       hoplimit;
 
 char                           plinkaddr[ETHER_ADDR_PLEN];
 char                           psrcaddr[INET6_ADDRSTRLEN], pdstaddr[INET6_ADDRSTRLEN], pv6addr[INET6_ADDRSTRLEN];
-unsigned char          verbose_f=0, iface_f=0;
-unsigned char          srcaddr_f=0, dstaddr_f=0, hsrcaddr_f=0, hdstaddr_f=0, floodf_f=0;
+unsigned char          verbose_f=0;
+unsigned char          floodf_f=0;
 unsigned char          loop_f=0, sleep_f=0, localaddr_f=0, tstamp_f=1, pod_f=0;
 unsigned char          srcprefix_f=0, hoplimit_f=0, ip6length_f=0, icmp6psize_f=0;
 unsigned char          fsize_f=0, forder_f=0, foffset_f=0, fid_f=0, fragp_f=0, fragidp_f=0, resp_f=1;
@@ -180,7 +150,7 @@ struct ip6_hdr              *fipv6;
 
 unsigned char          *fragpart, *ptrend, *ptrhdr, *ptrhdrend;
 unsigned int           hdrlen, ndstopthdr=0, nhbhopthdr=0, ndstoptuhdr=0;
-unsigned int           nfrags, fragsize, max_packet_size, linkhsize;
+unsigned int           nfrags, fragsize;
 unsigned char          *prev_nh, *startoffragment;
 
 
@@ -202,16 +172,9 @@ char                               block8[8]={'a', 'a', 'd', 'd', 'c', 'c', 'b', 'b'};
 u_int16_t                      addr_sig, addr_key;
 u_int32_t                      icmp6_sig;
 
-/* IPv6 Address Resolution */
-sigjmp_buf                     env;
-unsigned int           canjump;
-
 int main(int argc, char **argv){
        extern char             *optarg;        
        char                    *endptr; /* Used by strtoul() */
-       uid_t                   ruid;
-       gid_t                   rgid;
-       struct passwd   *pwdptr;
        fd_set                  sset, rset;
        struct timeval  timeout;
        int                             r, sel;
@@ -271,10 +234,11 @@ int main(int argc, char **argv){
                option= r;
 
                switch(option) {
-
                        case 'i':  /* Interface */
                                strncpy(idata.iface, optarg, IFACE_LENGTH-1);
-                               iface_f=1;
+                               idata.iface[IFACE_LENGTH-1]=0;
+                               idata.ifindex= if_nametoindex(idata.iface);
+                               idata.iface_f=TRUE;
                                break;
 
                        case 's':       /* IPv6 Source Address */
@@ -283,34 +247,34 @@ int main(int argc, char **argv){
                                        exit(EXIT_FAILURE);
                                }
 
-                               if ( inet_pton(AF_INET6, charptr, &srcaddr) <= 0){
+                               if ( inet_pton(AF_INET6, charptr, &(idata.srcaddr)) <= 0){
                                        puts("inet_pton(): Source Address not valid");
                                        exit(EXIT_FAILURE);
                                }
 
-                               srcaddr_f = 1;
+                               idata.srcaddr_f = 1;
                
                                if((charptr = strtok_r(NULL, " ", &lasts)) != NULL){
-                                       srcpreflen = atoi(charptr);
+                                       idata.srcpreflen = atoi(charptr);
                
-                                       if(srcpreflen>128){
+                                       if(idata.srcpreflen>128){
                                                puts("Prefix length error in IPv6 Source Address");
                                                exit(EXIT_FAILURE);
                                        }
 
-                                       sanitize_ipv6_prefix(&srcaddr, srcpreflen);
-                                       srcprefix_f=1;
+                                       sanitize_ipv6_prefix(&(idata.srcaddr), idata.srcpreflen);
+                                       idata.srcprefix_f=1;
                                }
 
                                break;
            
                        case 'd':       /* IPv6 Destination Address */
-                               if( inet_pton(AF_INET6, optarg, &dstaddr) <= 0){
+                               if( inet_pton(AF_INET6, optarg, &(idata.dstaddr)) <= 0){
                                        puts("inet_pton(): address not valid");
                                        exit(EXIT_FAILURE);
                                }
                
-                               dstaddr_f = 1;
+                               idata.dstaddr_f = 1;
                                break;
 
                        case 'A':       /* Hop Limit */
@@ -452,21 +416,21 @@ int main(int argc, char **argv){
                                break;
 
                        case 'S':       /* Source Ethernet address */
-                               if(ether_pton(optarg, &hsrcaddr, sizeof(hsrcaddr)) == 0){
+                               if(ether_pton(optarg, &(idata.hsrcaddr), sizeof(idata.hsrcaddr)) == 0){
                                        puts("Error in Source link-layer address.");
                                        exit(EXIT_FAILURE);
                                }
                
-                               hsrcaddr_f = 1;
+                               idata.hsrcaddr_f = 1;
                                break;
 
                        case 'D':       /* Destination Ethernet Address */
-                               if(ether_pton(optarg, &hdstaddr, sizeof(hdstaddr)) == 0){
+                               if(ether_pton(optarg, &(idata.hdstaddr), sizeof(idata.hdstaddr)) == 0){
                                        puts("Error in Source link-layer address.");
                                        exit(EXIT_FAILURE);
                                }
                
-                               hdstaddr_f = 1;
+                               idata.hdstaddr_f = 1;
                                break;
 
                        case 'P':       /* Fragment Size*/
@@ -569,7 +533,7 @@ int main(int argc, char **argv){
                                break;
 
                        case 'v':       /* Be verbose */
-                               verbose_f++;
+                               idata.verbose_f++;
                                break;
                
                        case 'h':       /* Help */
@@ -586,166 +550,40 @@ int main(int argc, char **argv){
                } /* switch */
        } /* while(getopt) */
 
+       verbose_f= idata.verbose_f;
+
        if(geteuid()) {
                puts("frag6 needs root privileges to run.");
                exit(EXIT_FAILURE);
        }
 
-       if(!iface_f){
-               puts("Must specify the network interface with the -i option");
-               exit(EXIT_FAILURE);
-       }
-
-       if( (idata.pd = pcap_open_live(idata.iface, PCAP_SNAP_LEN, PCAP_PROMISC, PCAP_TIMEOUT, errbuf)) == NULL){
-               printf("pcap_open_live(): %s\n", errbuf);
-               exit(EXIT_FAILURE);
-       }
-
-       /* 
-          If the real UID is not root, we setuid() and setgid() to that user and group, releasing superuser
-          privileges. Otherwise, if the real UID is 0, we try to setuid() to "nobody", releasing superuser 
-          privileges.
-        */
-       if( (ruid=getuid()) && (rgid=getgid())){
-               if(setgid(rgid) == -1){
-                       puts("Error while releasing superuser privileges (changing to real GID)");
-                       exit(EXIT_FAILURE);
-               }
-
-               if(setuid(ruid) == -1){
-                       puts("Error while releasing superuser privileges (changing to real UID)");
+       if(!idata.iface_f){
+               if(idata.dstaddr_f && IN6_IS_ADDR_LINKLOCAL(&(idata.dstaddr))){
+                       puts("Must specify a network interface for link-local destinations");
                        exit(EXIT_FAILURE);
                }
        }
-       else{
-               if((pwdptr=getpwnam("nobody"))){
-                       if(!pwdptr->pw_uid || !pwdptr->pw_gid){
-                               puts("User 'nobody' has incorrect privileges");
-                               exit(EXIT_FAILURE);
-                       }
-
-                       if(setgid(pwdptr->pw_gid) == -1){
-                               puts("Error while releasing superuser privileges (changing to nobody's group)");
-                               exit(EXIT_FAILURE);
-                       }
-
-                       if(setuid(pwdptr->pw_uid) == -1){
-                               puts("Error while releasing superuser privileges (changing to 'nobody')");
-                               exit(EXIT_FAILURE);
-                       }
-               }
-       }
 
-       if( (idata.type = pcap_datalink(idata.pd)) == DLT_EN10MB){
-               linkhsize= ETH_HLEN;
-               idata.mtu= ETH_DATA_LEN;
-       }
-       else if( idata.type == DLT_RAW){
-               linkhsize=0;
-               idata.mtu= MIN_IPV6_MTU;
-               idata.flags= IFACE_TUNNEL;
-       }
-       else if(idata.type == DLT_NULL){
-               linkhsize=4;
-               idata.mtu= MIN_IPV6_MTU;
-               idata.flags= IFACE_TUNNEL;
-       }
-       else{
-               printf("Error: Interface %s is not an Ethernet or tunnel interface", iface);
+       if(load_dst_and_pcap(&idata, LOAD_SRC_NXT_HOP) == FAILURE){
+               puts("Error while learning Souce Address and Next Hop");
                exit(EXIT_FAILURE);
        }
 
-       if(get_if_addrs(&idata) == -1){
-               puts("Error obtaining local addresses");
-               exit(EXIT_FAILURE);
-       }
+       release_privileges();
 
-       if((idata.ip6_local_flag && idata.ip6_global_flag) && !srcaddr_f)
+       if((idata.ip6_local_flag && idata.ip6_global_flag) && !idata.srcaddr_f)
                localaddr_f=1;
 
-       if(!idata.ether_flag){
-               randomize_ether_addr(&idata.ether);
-               idata.ether_flag=1;
-       }
-
-       if(!hsrcaddr_f)
-               hsrcaddr=idata.ether;
-
-       if(!idata.ip6_local_flag){
-               ether_to_ipv6_linklocal(&idata.ether, &idata.ip6_local);
-       }
-
-       /*
-          Select link-layer destination address
-
-          + If the underlying interface is loopback or tunnel, there is no need 
-            to select a link-layer destination address
-          + If a link-layer Destination Address has been specified, we do not need to
-            select one
-          + If the destination address is link-local, there is no need to perform
-            next-hop determination
-          + Otherwise we need to learn the local router or do ND as a last ressort
-        */
-       if((idata.type == DLT_EN10MB && idata.flags != IFACE_LOOPBACK) && (!hdstaddr_f && dstaddr_f)){
-               if(IN6_IS_ADDR_LINKLOCAL(&dstaddr)){
-                       /*
-                          If the IPv6 Destination Address is a multicast address, there is no need
-                          to perform Neighbor Discovery
-                        */
-                       if(IN6_IS_ADDR_MC_LINKLOCAL(&dstaddr)){
-                               hdstaddr= ether_multicast(&dstaddr);
-                       }
-                       else if(ipv6_to_ether(idata.pd, &idata, &dstaddr, &hdstaddr) != 1){
-                               puts("Error while performing Neighbor Discovery for the Destination Address");
-                               exit(EXIT_FAILURE);
-                       }
-               }
-               else if(find_ipv6_router_full(idata.pd, &idata) == 1){
-                       if(match_ipv6_to_prefixes(&dstaddr, &idata.prefix_ol)){
-                               /* If address is on-link, we must perform Neighbor Discovery */
-                               if(ipv6_to_ether(idata.pd, &idata, &dstaddr, &hdstaddr) != 1){
-                                       puts("Error while performing Neighbor Discovery for the Destination Address");
-                                       exit(EXIT_FAILURE);
-                               }
-                       }
-                       else{
-                               hdstaddr= idata.router_ether;
-                       }
-               }
-               else{
-                       if(verbose_f)
-                               puts("Couldn't find local router. Now trying Neighbor Discovery for the target node");
-                       /*
-                        * If we were not able to find a local router, we assume the destination is "on-link" (as
-                        * a last ressort), and thus perform Neighbor Discovery for that destination
-                        */
-                       if(ipv6_to_ether(idata.pd, &idata, &dstaddr, &hdstaddr) != 1){
-                               puts("Error while performing Neighbor Discovery for the Destination Address");
-                               exit(EXIT_FAILURE);
-                       }
-               }
-       }
-
-       if(srcprefix_f){
-               randprefix=srcaddr;
-               randpreflen=srcpreflen;
-               randomize_ipv6_addr(&srcaddr, &randprefix, randpreflen);
-               srcaddr_f=1;
-       }
-       else if(!srcaddr_f){
-               srcaddr= *src_addr_sel(&idata, &dstaddr);
-       }
-
        if(!sleep_f)
                nsleep=QUERY_TIMEOUT;
 
-       max_packet_size = MAX_IPV6_PAYLOAD + MIN_IPV6_HLEN;
+       idata.max_packet_size = MAX_IPV6_PAYLOAD + MIN_IPV6_HLEN;
 
-       if(verbose_f){
-               print_attack_info();
+       if(idata.verbose_f){
+               print_attack_info(&idata);
        }
 
-       if(!dstaddr_f){
+       if(!idata.dstaddr_f){
                puts("Error: Nothing to send! (Destination Address left unspecified)");
                exit(EXIT_FAILURE);
        }
@@ -763,13 +601,13 @@ int main(int argc, char **argv){
                /*
                   Set filter for receiving Neighbor Solicitations, ICMPv6 Echo Responses, and ICMPv6 Time Exceeded
                 */
-               if(pcap_compile(idata.pd, &pcap_filter, PCAP_ICMPV6_NSECHOEXCEEDED_FILTER, PCAP_OPT, PCAP_NETMASK_UNKNOWN) == -1){
-                       printf("pcap_compile(): %s", pcap_geterr(idata.pd));
+               if(pcap_compile(idata.pfd, &pcap_filter, PCAP_ICMPV6_NSECHOEXCEEDED_FILTER, PCAP_OPT, PCAP_NETMASK_UNKNOWN) == -1){
+                       printf("pcap_compile(): %s\n", pcap_geterr(idata.pfd));
                        exit(EXIT_FAILURE);
                }
                
-               if(pcap_setfilter(idata.pd, &pcap_filter) == -1){
-                       printf("pcap_setfilter(): %s", pcap_geterr(idata.pd));
+               if(pcap_setfilter(idata.pfd, &pcap_filter) == -1){
+                       printf("pcap_setfilter(): %s\n", pcap_geterr(idata.pfd));
                        exit(EXIT_FAILURE);
                }
 
@@ -801,7 +639,7 @@ int main(int argc, char **argv){
                        exit(EXIT_FAILURE);
                }
 
-               if( (idata.fd= pcap_fileno(idata.pd)) == -1){
+               if( (idata.fd= pcap_fileno(idata.pfd)) == -1){
                        puts("Error obtaining descriptor number for pcap_t");
                        exit(EXIT_FAILURE);
                }
@@ -824,16 +662,16 @@ int main(int argc, char **argv){
                        }
 
                        if((curtime - lastfrag1) >= QUERY_TIMEOUT/2 && (test[0]== TIMED_OUT || test[0]==TIME_EXCEEDED)){
-                               if(verbose_f)
+                               if(idata.verbose_f)
                                        puts("Sending Fragments for Test #1....");
 
                                id= random();
 
-                               if(send_fragment2(sizeof(struct icmp6_hdr)+minfragsize*2-overlap, id, 0, minfragsize, \
+                               if(send_fragment2(&idata, sizeof(struct icmp6_hdr)+minfragsize*2-overlap, id, 0, minfragsize, \
                                                                        FIRST_FRAGMENT, block1) == -1){
                                }
 
-                               if(send_fragment2(0, id, sizeof(struct icmp6_hdr)+minfragsize-overlap, minfragsize, \
+                               if(send_fragment2(&idata, 0, id, sizeof(struct icmp6_hdr)+minfragsize-overlap, minfragsize, \
                                                                        LAST_FRAGMENT, block6) == -1){
                                }
 
@@ -842,20 +680,20 @@ int main(int argc, char **argv){
                        }
 
                        if((curtime - lastfrag2) >= QUERY_TIMEOUT/2 && (test[1]== TIMED_OUT || test[1]==TIME_EXCEEDED)){
-                               if(verbose_f)
+                               if(idata.verbose_f)
                                        puts("Sending Fragments for Test #2....");
 
                                id= random();
 
-                               if(send_fragment2(sizeof(struct icmp6_hdr)+minfragsize * 3-overlap, id, 0, minfragsize, \
+                               if(send_fragment2(&idata, sizeof(struct icmp6_hdr)+minfragsize * 3-overlap, id, 0, minfragsize, \
               &nb