diff options
Diffstat (limited to 'regress/sys/netinet6/nd6/nd6_ar.py')
-rw-r--r-- | regress/sys/netinet6/nd6/nd6_ar.py | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/regress/sys/netinet6/nd6/nd6_ar.py b/regress/sys/netinet6/nd6/nd6_ar.py new file mode 100644 index 00000000000..2c138951b9f --- /dev/null +++ b/regress/sys/netinet6/nd6/nd6_ar.py @@ -0,0 +1,48 @@ +#!/usr/local/bin/python2.7 +# send Address Resolution neighbor solicitation +# expect an neighbor advertisement answer and check it + +import os +from addr import * +from scapy.all import * + +# link-local solicited-node multicast address +def nsma(a): + n = inet_pton(socket.AF_INET6, a) + return inet_ntop(socket.AF_INET6, in6_getnsma(n)) + +# ethernet multicast address of multicast address +def nsmac(a): + n = inet_pton(socket.AF_INET6, a) + return in6_getnsmac(n) + +# ethernet multicast address of solicited-node multicast address +def nsmamac(a): + return nsmac(nsma(a)) + +# link-local address +def lla(m): + return "fe80::"+in6_mactoifaceid(m) + +ip=IPv6(src=SRC_OUT6, dst=nsma(DST_IN6))/ICMPv6ND_NS(tgt=DST_IN6) +eth=Ether(src=SRC_MAC, dst=nsmamac(DST_IN6))/ip + +if os.fork() == 0: + time.sleep(1) + sendp(eth, iface=SRC_IF) + os._exit(0) + +ans=sniff(iface=SRC_IF, timeout=3, filter= + "ip6 and src "+DST_IN6+" and dst "+SRC_OUT6+" and icmp6") +for a in ans: + if a and a.type == scapy.layers.dot11.ETHER_TYPES.IPv6 and \ + ipv6nh[a.payload.nh] == 'ICMPv6' and \ + icmp6types[a.payload.payload.type] == 'Neighbor Advertisement': + tgt=a.payload.payload.tgt + print "target=%s" % (tgt) + if tgt == DST_IN6: + exit(0) + print "TARGET!=%s" % (DST_IN6) + exit(1) +print "NO NEIGHBOR ADVERTISEMENT" +exit(2) |