diff --git a/test/regression.uts b/test/regression.uts
new file mode 100644
index 000000000..49149c991
--- /dev/null
+++ b/test/regression.uts
@@ -0,0 +1,4077 @@
+% Regression tests for Scapy
+
+# More informations at http://www.secdev.org/projects/UTscapy/
+# $Id: regression.uts,v 1.9 2008/07/29 15:30:29 pbi Exp pbi $
+
+############
+############
++ Informations on Scapy
+
+= Get conf
+~ conf command
+* Dump the current configuration
+conf
+
+= List layers
+~ conf command
+ls()
+
+= List commands
+~ conf command
+lsc()
+
+= Configuration
+~ conf
+conf.debug_dissect=1
+
+############
+############
++ Basic tests
+
+* Those test are here mainly to check nothing has been broken
+* and to catch Exceptions
+
+= Building some packets packet
+~ basic IP TCP UDP NTP LLC SNAP Dot11
+IP()/TCP()
+Ether()/IP()/UDP()/NTP()
+Dot11()/LLC()/SNAP()/IP()/TCP()/"XXX"
+IP(ttl=25)/TCP(sport=12, dport=42)
+
+= Manipulating some packets
+~ basic IP TCP
+a=IP(ttl=4)/TCP()
+a.ttl
+a.ttl=10
+del(a.ttl)
+a.ttl
+TCP in a
+a[TCP]
+a[TCP].dport=[80,443]
+a
+a=3
+
+
+= Checking overloads
+~ basic IP TCP Ether
+a=Ether()/IP()/TCP()
+a.proto
+_ == 6
+
+
+= sprintf() function
+~ basic sprintf Ether IP UDP NTP
+a=Ether()/IP()/IP(ttl=4)/UDP()/NTP()
+a.sprintf("%type% %IP.ttl% %#05xr,UDP.sport% %IP:2.ttl%")
+_ in [ '0x800 64 0x07b 4', 'IPv4 64 0x07b 4']
+
+
+= sprintf() function
+~ basic sprintf IP TCP SNAP LLC Dot11
+* This test is on the conditionnal substring feature of sprintf()
+a=Dot11()/LLC()/SNAP()/IP()/TCP()
+a.sprintf("{IP:{TCP:flags=%TCP.flags%}{UDP:port=%UDP.ports%} %IP.src%}")
+_ == 'flags=S 127.0.0.1'
+
+
+= haslayer function
+~ basic haslayer IP TCP ICMP ISAKMP
+x=IP(id=1)/ISAKMP_payload_SA(prop=ISAKMP_payload_SA(prop=IP()/ICMP()))/TCP()
+TCP in x, ICMP in x, IP in x, UDP in x
+_ == (True,True,True,False)
+
+= getlayer function
+~ basic getlayer IP ISAKMP UDP
+x=IP(id=1)/ISAKMP_payload_SA(prop=IP(id=2)/UDP(dport=1))/IP(id=3)/UDP(dport=2)
+x[IP]
+x[IP:2]
+x[IP:3]
+x.getlayer(IP,3)
+x.getlayer(IP,4)
+x[UDP]
+x[UDP:1]
+x[UDP:2]
+assert(x[IP].id == 1 and x[IP:2].id == 2 and x[IP:3].id == 3 and
+ x.getlayer(IP).id == 1 and x.getlayer(IP,3).id == 3 and
+ x.getlayer(IP,4) == None and
+ x[UDP].dport == 1 and x[UDP:2].dport == 2)
+try:
+ x[IP:4]
+except IndexError:
+ True
+else:
+ False
+
+= equality
+~ basic
+w=Ether()/IP()/UDP(dport=53)
+x=Ether()/IP(dst="127.0.0.1")/UDP()
+y=Ether()/IP()/UDP(dport=4)
+z=Ether()/IP()/UDP()/NTP()
+t=Ether()/IP()/TCP()
+x==y, x==z, x==t, y==z, y==t, z==t, w==x
+_ == (False, False, False, False, False, False, True)
+
+
+############
+############
++ Tests on padding
+
+= Padding assembly
+str(Padding("abc"))
+assert( _ == "abc" )
+str(Padding("abc")/Padding("def"))
+assert( _ == "abcdef" )
+str(Raw("ABC")/Padding("abc")/Padding("def"))
+assert( _ == "ABCabcdef" )
+str(Raw("ABC")/Padding("abc")/Raw("DEF")/Padding("def"))
+assert( _ == "ABCabcDEFdef" )
+
+= Padding and length computation
+IP(str(IP()/Padding("abc")))
+assert( _.len == 20 and len(_) == 23 )
+IP(str(IP()/Raw("ABC")/Padding("abc")))
+assert( _.len == 23 and len(_) == 26 )
+IP(str(IP()/Raw("ABC")/Padding("abc")/Padding("def")))
+assert( _.len == 23 and len(_) == 29 )
+
+
+
+############
+############
++ Tests on basic fields
+
+#= Field class
+#~ core field
+#Field("foo", None, fmt="H").i2m(None,0xabcdef)
+#assert( _ == "\xcd\xef" )
+#Field("foo", None, fmt="P\xf4\xb6Y\xcbc\x8d\xb6\xbd\x18\xd4\x87J_\xdc\xef\xe9V\xf0\n\x0c\xe8u' )
+
+
+
+
+############
+############
++ Network tests
+
+* Those tests need network access
+
+= Sending and receiving an ICMP
+~ netaccess IP ICMP
+x=sr1(IP(dst="www.google.com")/ICMP(),timeout=3)
+x
+x is not None and ICMP in x and x[ICMP].type == 0
+
+= DNS request
+~ netaccess IP UDP DNS
+* A possible cause of failure could be that the open DNS (resolver1.opendns.com)
+* is not reachable or down.
+dns_ans = sr1(IP(dst="resolver1.opendns.com")/UDP()/DNS(rd=1,qd=DNSQR(qname="www.slashdot.com")),timeout=5)
+DNS in dns_ans
+
+
+
+############
+############
++ More complex tests
+
+= Implicit logic
+~ IP TCP
+a=IP(ttl=(5,10))/TCP(dport=[80,443])
+[p for p in a]
+len(_) == 12
+
+
+############
+############
++ Real usages
+
+= Port scan
+~ netaccess IP TCP
+ans,unans=sr(IP(dst="www.google.com/30")/TCP(dport=[80,443]),timeout=2)
+ans.make_table(lambda (s,r): (s.dst, s.dport, r.sprintf("{TCP:%TCP.flags%}{ICMP:%ICMP.code%}")))
+
+= Traceroute function
+~ netaccess
+* Let's test traceroute
+traceroute("www.slashdot.org")
+ans,unans=_
+
+= Result manipulation
+~ netaccess
+ans.nsummary()
+s,r=ans[0]
+s.show()
+s.show(2)
+
+= DNS packet manipulation
+~ netaccess DNS
+* We have to recalculate IP and UDP length because
+* DNS is not able to reassemble correctly
+dns_ans.show()
+del(dns_ans[IP].len)
+del(dns_ans[UDP].len)
+dns_ans.show2()
+dns_ans[DNS].an.show()
+DNS in IP(str(dns_ans))
+
+= Arping
+~ netaccess
+* This test assumes the local network is a /24. This is bad.
+conf.route.route("0.0.0.0")[2]
+arping(_+"/24")
+
+
+############
+############
++ Automaton tests
+
+= Simple automaton
+~ automaton
+class ATMT1(Automaton):
+ def parse_args(self, init, *args, **kargs):
+ Automaton.parse_args(self, *args, **kargs)
+ self.init = init
+ @ATMT.state(initial=1)
+ def BEGIN(self):
+ raise self.MAIN(self.init)
+ @ATMT.state()
+ def MAIN(self, s):
+ return s
+ @ATMT.condition(MAIN, prio=-1)
+ def go_to_END(self, s):
+ if len(s) > 20:
+ raise self.END(s).action_parameters(s)
+ @ATMT.condition(MAIN)
+ def trA(self, s):
+ if s.endswith("b"):
+ raise self.MAIN(s+"a")
+ @ATMT.condition(MAIN)
+ def trB(self, s):
+ if s.endswith("a"):
+ raise self.MAIN(s*2+"b")
+ @ATMT.state(final=1)
+ def END(self, s):
+ return s
+ @ATMT.action(go_to_END)
+ def action_test(self, s):
+ self.result = s
+
+= Simple automaton Tests
+~ automaton
+
+a=ATMT1(init="a")
+a.run()
+assert( _ == 'aabaaababaaabaaababab' )
+a.result
+assert( _ == 'aabaaababaaabaaababab' )
+a=ATMT1(init="b")
+a.run()
+assert( _ == 'babababababababababababababab' )
+a.result
+assert( _ == 'babababababababababababababab' )
+
+= Simple automaton stuck test
+~ automaton
+
+try:
+ ATMT1(init="").run()
+except Automaton.Stuck:
+ True
+else:
+ False
+
+
+= Automaton state overloading
+~ automaton
+class ATMT2(ATMT1):
+ @ATMT.state()
+ def MAIN(self, s):
+ return "c"+ATMT1.MAIN(self, s).run()
+
+a=ATMT2(init="a")
+a.run()
+assert( _ == 'ccccccacabacccacababacccccacabacccacababab' )
+
+
+a.result
+assert( _ == 'ccccccacabacccacababacccccacabacccacababab' )
+a=ATMT2(init="b")
+a.run()
+assert( _ == 'cccccbaccbabaccccbaccbabab')
+a.result
+assert( _ == 'cccccbaccbabaccccbaccbabab')
+
+
+= Automaton condition overloading
+~ automaton
+class ATMT3(ATMT2):
+ @ATMT.condition(ATMT1.MAIN)
+ def trA(self, s):
+ if s.endswith("b"):
+ raise self.MAIN(s+"da")
+
+
+a=ATMT3(init="a", debug=2)
+a.run()
+assert( _ == 'cccccacabdacccacabdabda')
+a.result
+assert( _ == 'cccccacabdacccacabdabda')
+a=ATMT3(init="b")
+a.run()
+assert( _ == 'cccccbdaccbdabdaccccbdaccbdabdab' )
+
+a.result
+assert( _ == 'cccccbdaccbdabdaccccbdaccbdabdab' )
+
+
+= Automaton action overloading
+~ automaton
+class ATMT4(ATMT3):
+ @ATMT.action(ATMT1.go_to_END)
+ def action_test(self, s):
+ self.result = "e"+s+"e"
+
+a=ATMT4(init="a")
+a.run()
+assert( _ == 'cccccacabdacccacabdabda')
+a.result
+assert( _ == 'ecccccacabdacccacabdabdae')
+a=ATMT4(init="b")
+a.run()
+assert( _ == 'cccccbdaccbdabdaccccbdaccbdabdab' )
+a.result
+assert( _ == 'ecccccbdaccbdabdaccccbdaccbdabdabe' )
+
+
+= Automaton priorities
+~ automaton
+class ATMT5(Automaton):
+ @ATMT.state(initial=1)
+ def BEGIN(self):
+ self.res = "J"
+ @ATMT.condition(BEGIN, prio=1)
+ def tr1(self):
+ self.res += "i"
+ raise self.END()
+ @ATMT.condition(BEGIN)
+ def tr2(self):
+ self.res += "p"
+ @ATMT.condition(BEGIN, prio=-1)
+ def tr3(self):
+ self.res += "u"
+
+ @ATMT.action(tr1)
+ def ac1(self):
+ self.res += "e"
+ @ATMT.action(tr1, prio=-1)
+ def ac2(self):
+ self.res += "t"
+ @ATMT.action(tr1, prio=1)
+ def ac3(self):
+ self.res += "r"
+
+ @ATMT.state(final=1)
+ def END(self):
+ return self.res
+
+a=ATMT5()
+a.run()
+assert( _ == 'Jupiter' )
+
+= Automaton test same action for many conditions
+~ automaton
+class ATMT6(Automaton):
+ @ATMT.state(initial=1)
+ def BEGIN(self):
+ self.res="M"
+ @ATMT.condition(BEGIN)
+ def tr1(self):
+ raise self.MIDDLE()
+ @ATMT.action(tr1) # default prio=0
+ def add_e(self):
+ self.res += "e"
+ @ATMT.action(tr1, prio=2)
+ def add_c(self):
+ self.res += "c"
+ @ATMT.state()
+ def MIDDLE(self):
+ self.res += "u"
+ @ATMT.condition(MIDDLE)
+ def tr2(self):
+ raise self.END()
+ @ATMT.action(tr2, prio=2)
+ def add_y(self):
+ self.res += "y"
+ @ATMT.action(tr1, prio=1)
+ @ATMT.action(tr2)
+ def add_r(self):
+ self.res += "r"
+ @ATMT.state(final=1)
+ def END(self):
+ return self.res
+
+a=ATMT6()
+a.run()
+assert( _ == 'Mercury' )
+
+
+# Scapy6 Regression Test Campaign
+
+
+########### IPv6 Class ##############################################
+
++ Test IPv6 Class
+= IPv6 Class basic Instantiation
+a=IPv6()
+
+= IPv6 Class basic build (default values)
+str(IPv6()) == '`\x00\x00\x00\x00\x00;@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
+
+= IPv6 Class basic dissection (default values)
+a=IPv6(str(IPv6()))
+a.version == 6 and a.tc == 0 and a.fl == 0 and a.plen == 0 and a.nh == 59 and a.hlim ==64 and a.src == "::1" and a.dst == "::1"
+
+= IPv6 Class with basic TCP stacked - build
+str(IPv6()/TCP()) == '`\x00\x00\x00\x00\x14\x06@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x8f}\x00\x00'
+
+= IPv6 Class with basic TCP stacked - dissection
+a=IPv6(str(IPv6()/TCP()))
+a.nh == 6 and a.plen == 20 and isinstance(a.payload, TCP) and a.payload.chksum == 0x8f7d
+
+= IPv6 Class with TCP and TCP data - build
+str(IPv6()/TCP()/Raw(load="somedata")) == '`\x00\x00\x00\x00\x1c\x06@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xd5\xdd\x00\x00somedata'
+
+= IPv6 Class with TCP and TCP data - dissection
+a=IPv6(str(IPv6()/TCP()/Raw(load="somedata")))
+a.nh == 6 and a.plen == 28 and isinstance(a.payload, TCP) and a.payload.chksum == 0xd5dd and isinstance(a.payload.payload, Raw) and a[Raw].load == "somedata"
+
+= IPv6 Class binding with Ethernet - build
+str(Ether(src="00:00:00:00:00:00", dst="ff:ff:ff:ff:ff:ff")/IPv6()/TCP()) == '\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x86\xdd`\x00\x00\x00\x00\x14\x06@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x8f}\x00\x00'
+
+= IPv6 Class binding with Ethernet - dissection
+a=Ether(str(Ether()/IPv6()/TCP()))
+a.type == 0x86dd
+
+
+########### IPv6ExtHdrRouting Class ###########################
+
+= IPv6ExtHdrRouting Class - No address - build
+str(IPv6(src="2048::deca", dst="2047::cafe")/IPv6ExtHdrRouting(addresses=[])/TCP(dport=80)) =='`\x00\x00\x00\x00\x1c+@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x06\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xa5&\x00\x00'
+
+= IPv6ExtHdrRouting Class - One address - build
+str(IPv6(src="2048::deca", dst="2047::cafe")/IPv6ExtHdrRouting(addresses=["2022::deca"])/TCP(dport=80)) == '`\x00\x00\x00\x00,+@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x06\x02\x00\x01\x00\x00\x00\x00 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91\x7f\x00\x00'
+
+= IPv6ExtHdrRouting Class - Multiple Addresses - build
+str(IPv6(src="2048::deca", dst="2047::cafe")/IPv6ExtHdrRouting(addresses=["2001::deca", "2022::deca"])/TCP(dport=80)) == '`\x00\x00\x00\x00<+@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x06\x04\x00\x02\x00\x00\x00\x00 \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91\x7f\x00\x00'
+
+= IPv6ExtHdrRouting Class - Specific segleft (2->1) - build
+str(IPv6(src="2048::deca", dst="2047::cafe")/IPv6ExtHdrRouting(addresses=["2001::deca", "2022::deca"], segleft=1)/TCP(dport=80)) == '`\x00\x00\x00\x00<+@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x06\x04\x00\x01\x00\x00\x00\x00 \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91\x7f\x00\x00'
+
+= IPv6ExtHdrRouting Class - Specific segleft (2->0) - build
+str(IPv6(src="2048::deca", dst="2047::cafe")/IPv6ExtHdrRouting(addresses=["2001::deca", "2022::deca"], segleft=0)/TCP(dport=80)) == '`\x00\x00\x00\x00<+@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x06\x04\x00\x00\x00\x00\x00\x00 \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xa5&\x00\x00'
+
+
+########### in6_get6to4Prefix() #####################################
++ Test in6_get6to4Prefix()
+
+= Test in6_get6to4Prefix() - 0.0.0.0 address
+in6_get6to4Prefix("0.0.0.0") == "2002::"
+
+= Test in6_get6to4Prefix() - 255.255.255.255 address
+in6_get6to4Prefix("255.255.255.255") == "2002:ffff:ffff::"
+
+= Test in6_get6to4Prefix() - 1.1.1.1 address
+in6_get6to4Prefix("1.1.1.1") == "2002:101:101::"
+
+= Test in6_get6to4Prefix() - invalid address
+in6_get6to4Prefix("somebadstring") is None
+
+
+########### in6_get6to4Prefix() #####################################
++ Test in6_6to4ExtractAddr()
+
+= Test in6_6to4ExtractAddr() - 2002:: address
+in6_6to4ExtractAddr("2002::") == "0.0.0.0"
+
+= Test in6_6to4ExtractAddr() - 255.255.255.255 address
+in6_6to4ExtractAddr("2002:ffff:ffff::") == "255.255.255.255"
+
+= Test in6_6to4ExtractAddr() - "2002:101:101::" address
+in6_6to4ExtractAddr("2002:101:101::") == "1.1.1.1"
+
+= Test in6_6to4ExtractAddr() - invalid address
+in6_6to4ExtractAddr("somebadstring") is None
+
+
+########### RFC 4489 - Link-Scoped IPv6 Multicast address ###########
+
+= in6_getLinkScopedMcastAddr() : default generation
+a = in6_getLinkScopedMcastAddr(addr="FE80::")
+a == 'ff32:ff::'
+
+= in6_getLinkScopedMcastAddr() : different valid scope values
+a = in6_getLinkScopedMcastAddr(addr="FE80::", scope=0)
+b = in6_getLinkScopedMcastAddr(addr="FE80::", scope=1)
+c = in6_getLinkScopedMcastAddr(addr="FE80::", scope=2)
+d = in6_getLinkScopedMcastAddr(addr="FE80::", scope=3)
+a == 'ff30:ff::' and b == 'ff31:ff::' and c == 'ff32:ff::' and d is None
+
+= in6_getLinkScopedMcastAddr() : grpid in different formats
+a = in6_getLinkScopedMcastAddr(addr="FE80::A12:34FF:FE56:7890", grpid="\x12\x34\x56\x78")
+b = in6_getLinkScopedMcastAddr(addr="FE80::A12:34FF:FE56:7890", grpid="12345678")
+c = in6_getLinkScopedMcastAddr(addr="FE80::A12:34FF:FE56:7890", grpid=305419896)
+a == b and b == c
+
+
+########### ethernet address to iface ID conversion #################
+
+= in6_mactoifaceid() conversion function (test 1)
+in6_mactoifaceid("FD:00:00:00:00:00", ulbit=0) == 'FD00:00FF:FE00:0000'
+
+= in6_mactoifaceid() conversion function (test 2)
+in6_mactoifaceid("FD:00:00:00:00:00", ulbit=1) == 'FF00:00FF:FE00:0000'
+
+= in6_mactoifaceid() conversion function (test 3)
+in6_mactoifaceid("FD:00:00:00:00:00") == 'FF00:00FF:FE00:0000'
+
+= in6_mactoifaceid() conversion function (test 4)
+in6_mactoifaceid("FF:00:00:00:00:00") == 'FD00:00FF:FE00:0000'
+
+= in6_mactoifaceid() conversion function (test 5)
+in6_mactoifaceid("FF:00:00:00:00:00", ulbit=1) == 'FF00:00FF:FE00:0000'
+
+= in6_mactoifaceid() conversion function (test 6)
+in6_mactoifaceid("FF:00:00:00:00:00", ulbit=0) == 'FD00:00FF:FE00:0000'
+
+########### iface ID conversion #################
+
+= in6_mactoifaceid() conversion function (test 1)
+in6_ifaceidtomac(in6_mactoifaceid("FD:00:00:00:00:00", ulbit=0)) == 'ff:00:00:00:00:00'
+
+= in6_mactoifaceid() conversion function (test 2)
+in6_ifaceidtomac(in6_mactoifaceid("FD:00:00:00:00:00", ulbit=1)) == 'fd:00:00:00:00:00'
+
+= in6_mactoifaceid() conversion function (test 3)
+in6_ifaceidtomac(in6_mactoifaceid("FD:00:00:00:00:00")) == 'fd:00:00:00:00:00'
+
+= in6_mactoifaceid() conversion function (test 4)
+in6_ifaceidtomac(in6_mactoifaceid("FF:00:00:00:00:00")) == 'ff:00:00:00:00:00'
+
+= in6_mactoifaceid() conversion function (test 5)
+in6_ifaceidtomac(in6_mactoifaceid("FF:00:00:00:00:00", ulbit=1)) == 'fd:00:00:00:00:00'
+
+= in6_mactoifaceid() conversion function (test 6)
+in6_ifaceidtomac(in6_mactoifaceid("FF:00:00:00:00:00", ulbit=0)) == 'ff:00:00:00:00:00'
+
+
+= in6_addrtomac() conversion function (test 1)
+in6_addrtomac("FE80::" + in6_mactoifaceid("FD:00:00:00:00:00", ulbit=0)) == 'ff:00:00:00:00:00'
+
+= in6_addrtomac() conversion function (test 2)
+in6_addrtomac("FE80::" + in6_mactoifaceid("FD:00:00:00:00:00", ulbit=1)) == 'fd:00:00:00:00:00'
+
+= in6_addrtomac() conversion function (test 3)
+in6_addrtomac("FE80::" + in6_mactoifaceid("FD:00:00:00:00:00")) == 'fd:00:00:00:00:00'
+
+= in6_addrtomac() conversion function (test 4)
+in6_addrtomac("FE80::" + in6_mactoifaceid("FF:00:00:00:00:00")) == 'ff:00:00:00:00:00'
+
+= in6_addrtomac() conversion function (test 5)
+in6_addrtomac("FE80::" + in6_mactoifaceid("FF:00:00:00:00:00", ulbit=1)) == 'fd:00:00:00:00:00'
+
+= in6_addrtomac() conversion function (test 6)
+in6_addrtomac("FE80::" + in6_mactoifaceid("FF:00:00:00:00:00", ulbit=0)) == 'ff:00:00:00:00:00'
+
+########### RFC 3041 related function ###############################
+= Test in6_getRandomizedIfaceId
+res=True
+for i in range(10):
+ s1,s2 = in6_getRandomizedIfaceId('20b:93ff:feeb:2d3')
+ inet_pton(socket.AF_INET6, '::'+s1)
+ tmp2 = inet_pton(socket.AF_INET6, '::'+s2)
+ res = res and ((ord(s1[0]) & 0x04) == 0x04)
+ s1,s2 = in6_getRandomizedIfaceId('20b:93ff:feeb:2d3', previous=tmp2)
+ tmp = inet_pton(socket.AF_INET6, '::'+s1)
+ inet_pton(socket.AF_INET6, '::'+s2)
+ res = res and ((ord(s1[0]) & 0x04) == 0x04)
+
+########### RFC 1924 related function ###############################
+= Test RFC 1924 function - in6_ctop() basic test
+in6_ctop("4)+k&C#VzJ4br>0wv%Yp") == '1080::8:800:200c:417a'
+
+= Test RFC 1924 function - in6_ctop() with character outside charset
+in6_ctop("4)+k&C#VzJ4br>0wv%Y'") == None
+
+= Test RFC 1924 function - in6_ctop() with bad length address
+in6_ctop("4)+k&C#VzJ4br>0wv%Y") == None
+
+= Test RFC 1924 function - in6_ptoc() basic test
+in6_ptoc('1080::8:800:200c:417a') == '4)+k&C#VzJ4br>0wv%Yp'
+
+= Test RFC 1924 function - in6_ptoc() basic test
+in6_ptoc('1080::8:800:200c:417a') == '4)+k&C#VzJ4br>0wv%Yp'
+
+= Test RFC 1924 function - in6_ptoc() with bad input
+in6_ptoc('1080:::8:800:200c:417a') == None
+
+########### in6_getAddrType #########################################
+
+= in6_getAddrType - 6to4 addresses
+in6_getAddrType("2002::1") == (IPV6_ADDR_UNICAST | IPV6_ADDR_GLOBAL | IPV6_ADDR_6TO4)
+
+= in6_getAddrType - Assignable Unicast global address
+in6_getAddrType("2001:db8::1") == (IPV6_ADDR_UNICAST | IPV6_ADDR_GLOBAL)
+
+= in6_getAddrType - Multicast global address
+in6_getAddrType("FF0E::1") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_MULTICAST)
+
+= in6_getAddrType - Multicast local address
+in6_getAddrType("FF02::1") == (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_MULTICAST)
+
+= in6_getAddrType - Unicast Link-Local address
+in6_getAddrType("FE80::") == (IPV6_ADDR_UNICAST | IPV6_ADDR_LINKLOCAL)
+
+= in6_getAddrType - Loopback address
+in6_getAddrType("::1") == IPV6_ADDR_LOOPBACK
+
+= in6_getAddrType - Unspecified address
+in6_getAddrType("::") == IPV6_ADDR_UNSPECIFIED
+
+= in6_getAddrType - Unassigned Global Unicast address
+in6_getAddrType("4000::") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST)
+
+= in6_getAddrType - Weird address (FE::1)
+in6_getAddrType("FE::") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST)
+
+= in6_getAddrType - Weird address (FE8::1)
+in6_getAddrType("FE8::1") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST)
+
+= in6_getAddrType - Weird address (1::1)
+in6_getAddrType("1::1") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST)
+
+= in6_getAddrType - Weird address (1000::1)
+in6_getAddrType("1000::1") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST)
+
+########### ICMPv6DestUnreach Class #################################
+
+= ICMPv6DestUnreach Class - Basic Build (no argument)
+str(ICMPv6DestUnreach()) == '\x01\x00\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6DestUnreach Class - Basic Build over IPv6 (for cksum and overload)
+str(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6DestUnreach()) == '`\x00\x00\x00\x00\x08:@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x01\x00\x14e\x00\x00\x00\x00'
+
+= ICMPv6DestUnreach Class - Basic Build over IPv6 with some payload
+str(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6DestUnreach()/IPv6(src="2047::cafe", dst="2048::deca")) == '`\x00\x00\x00\x000:@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x01\x00\x8e\xa3\x00\x00\x00\x00`\x00\x00\x00\x00\x00;@ G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca'
+
+= ICMPv6DestUnreach Class - Dissection with default values and some payload
+a = IPv6(str(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6DestUnreach()/IPv6(src="2047::cafe", dst="2048::deca")))
+a.plen == 48 and a.nh == 58 and ICMPv6DestUnreach in a and a[ICMPv6DestUnreach].type == 1 and a[ICMPv6DestUnreach].code == 0 and a[ICMPv6DestUnreach].cksum == 0x8ea3 and a[ICMPv6DestUnreach].unused == 0 and IPerror6 in a
+
+= ICMPv6DestUnreach Class - Dissection with specific values
+a=IPv6(str(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6DestUnreach(code=1, cksum=0x6666, unused=0x7777)/IPv6(src="2047::cafe", dst="2048::deca")))
+a.plen == 48 and a.nh == 58 and ICMPv6DestUnreach in a and a[ICMPv6DestUnreach].type == 1 and a[ICMPv6DestUnreach].cksum == 0x6666 and a[ICMPv6DestUnreach].unused == 0x7777 and IPerror6 in a[ICMPv6DestUnreach]
+
+= ICMPv6DestUnreach Class - checksum computation related stuff
+a=IPv6(str(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6DestUnreach(code=1, cksum=0x6666, unused=0x7777)/IPv6(src="2047::cafe", dst="2048::deca")/TCP()))
+b=IPv6(str(IPv6(src="2047::cafe", dst="2048::deca")/TCP()))
+a[ICMPv6DestUnreach][TCPerror].chksum == b.chksum
+
+
+########### ICMPv6PacketTooBig Class ################################
+
+= ICMPv6PacketTooBig Class - Basic Build (no argument)
+str(ICMPv6PacketTooBig()) == '\x02\x00\x00\x00\x00\x00\x05\x00'
+
+= ICMPv6PacketTooBig Class - Basic Build over IPv6 (for cksum and overload)
+str(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6PacketTooBig()) == '`\x00\x00\x00\x00\x08:@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x02\x00\x0ee\x00\x00\x05\x00'
+
+= ICMPv6PacketTooBig Class - Basic Build over IPv6 with some payload
+str(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6PacketTooBig()/IPv6(src="2047::cafe", dst="2048::deca")) == '`\x00\x00\x00\x000:@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x02\x00\x88\xa3\x00\x00\x05\x00`\x00\x00\x00\x00\x00;@ G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca'
+
+= ICMPv6PacketTooBig Class - Dissection with default values and some payload
+a = IPv6(str(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6PacketTooBig()/IPv6(src="2047::cafe", dst="2048::deca")))
+a.plen == 48 and a.nh == 58 and ICMPv6PacketTooBig in a and a[ICMPv6PacketTooBig].type == 2 and a[ICMPv6PacketTooBig].code == 0 and a[ICMPv6PacketTooBig].cksum == 0x88a3 and a[ICMPv6PacketTooBig].mtu == 1280 and IPerror6 in a
+True
+
+= ICMPv6PacketTooBig Class - Dissection with specific values
+a=IPv6(str(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6PacketTooBig(code=2, cksum=0x6666, mtu=1460)/IPv6(src="2047::cafe", dst="2048::deca")))
+a.plen == 48 and a.nh == 58 and ICMPv6PacketTooBig in a and a[ICMPv6PacketTooBig].type == 2 and a[ICMPv6PacketTooBig].code == 2 and a[ICMPv6PacketTooBig].cksum == 0x6666 and a[ICMPv6PacketTooBig].mtu == 1460 and IPerror6 in a
+
+= ICMPv6PacketTooBig Class - checksum computation related stuff
+a=IPv6(str(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6PacketTooBig(code=1, cksum=0x6666, mtu=0x7777)/IPv6(src="2047::cafe", dst="2048::deca")/TCP()))
+b=IPv6(str(IPv6(src="2047::cafe", dst="2048::deca")/TCP()))
+a[ICMPv6PacketTooBig][TCPerror].chksum == b.chksum
+
+
+########### ICMPv6TimeExceeded Class ################################
+# To be done but not critical. Same mechanisms and format as
+# previous ones.
+
+########### ICMPv6ParamProblem Class ################################
+# See previous note
+
+########### ICMPv6EchoRequest Class #################################
++ Test ICMPv6EchoRequest Class
+
+= ICMPv6EchoRequest - Basic Instantiation
+str(ICMPv6EchoRequest()) == '\x80\x00\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6EchoRequest - Instantiation with specific values
+str(ICMPv6EchoRequest(code=0xff, cksum=0x1111, id=0x2222, seq=0x3333, data="thisissomestring")) == '\x80\xff\x11\x11""33thisissomestring'
+
+= ICMPv6EchoRequest - Basic dissection
+a=ICMPv6EchoRequest('\x80\x00\x00\x00\x00\x00\x00\x00')
+a.type == 128 and a.code == 0 and a.cksum == 0 and a.id == 0 and a.seq == 0 and a.data == ""
+
+= ICMPv6EchoRequest - Dissection with specific values
+a=ICMPv6EchoRequest('\x80\xff\x11\x11""33thisissomestring')
+a.type == 128 and a.code == 0xff and a.cksum == 0x1111 and a.id == 0x2222 and a.seq == 0x3333 and a.data == "thisissomestring"
+
+= ICMPv6EchoRequest - Automatic checksum computation and field overloading (build)
+str(IPv6(dst="2001::cafe", src="2001::deca", hlim=64)/ICMPv6EchoRequest()) == '`\x00\x00\x00\x00\x08:@ \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x80\x00\x95\xf1\x00\x00\x00\x00'
+
+= ICMPv6EchoRequest - Automatic checksum computation and field overloading (dissection)
+a=IPv6('`\x00\x00\x00\x00\x08:@ \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x80\x00\x95\xf1\x00\x00\x00\x00')
+isinstance(a, IPv6) and a.nh == 58 and isinstance(a.payload, ICMPv6EchoRequest) and a.payload.cksum == 0x95f1
+
+
+########### ICMPv6EchoReply Class ###################################
++ Test ICMPv6EchoReply Class
+
+= ICMPv6EchoReply - Basic Instantiation
+str(ICMPv6EchoReply()) == '\x81\x00\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6EchoReply - Instantiation with specific values
+str(ICMPv6EchoReply(code=0xff, cksum=0x1111, id=0x2222, seq=0x3333, data="thisissomestring")) == '\x81\xff\x11\x11""33thisissomestring'
+
+= ICMPv6EchoReply - Basic dissection
+a=ICMPv6EchoReply('\x80\x00\x00\x00\x00\x00\x00\x00')
+a.type == 128 and a.code == 0 and a.cksum == 0 and a.id == 0 and a.seq == 0 and a.data == ""
+
+= ICMPv6EchoReply - Dissection with specific values
+a=ICMPv6EchoReply('\x80\xff\x11\x11""33thisissomestring')
+a.type == 128 and a.code == 0xff and a.cksum == 0x1111 and a.id == 0x2222 and a.seq == 0x3333 and a.data == "thisissomestring"
+
+= ICMPv6EchoReply - Automatic checksum computation and field overloading (build)
+str(IPv6(dst="2001::cafe", src="2001::deca", hlim=64)/ICMPv6EchoReply()) == '`\x00\x00\x00\x00\x08:@ \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x81\x00\x94\xf1\x00\x00\x00\x00'
+
+= ICMPv6EchoReply - Automatic checksum computation and field overloading (dissection)
+a=IPv6('`\x00\x00\x00\x00\x08:@ \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x80\x00\x95\xf1\x00\x00\x00\x00')
+isinstance(a, IPv6) and a.nh == 58 and isinstance(a.payload, ICMPv6EchoRequest) and a.payload.cksum == 0x95f1
+
+########### ICMPv6EchoReply/Request answers() and hashret() #########
+
+= ICMPv6EchoRequest and ICMPv6EchoReply - hashret() test 1
+b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(data="somedata")
+a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(data="somedata")
+b.hashret() == a.hashret()
+
+# data are not taken into account for hashret
+= ICMPv6EchoRequest and ICMPv6EchoReply - hashret() test 2
+b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(data="somedata")
+a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(data="otherdata")
+b.hashret() == a.hashret()
+
+= ICMPv6EchoRequest and ICMPv6EchoReply - hashret() test 3
+b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(id=0x6666, seq=0x7777,data="somedata")
+a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(id=0x6666, seq=0x8888, data="somedata")
+b.hashret() != a.hashret()
+
+= ICMPv6EchoRequest and ICMPv6EchoReply - hashret() test 4
+b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(id=0x6666, seq=0x7777,data="somedata")
+a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(id=0x8888, seq=0x7777, data="somedata")
+b.hashret() != a.hashret()
+
+= ICMPv6EchoRequest and ICMPv6EchoReply - answers() test 5
+b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(data="somedata")
+a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(data="somedata")
+(a > b) == True
+
+= ICMPv6EchoRequest and ICMPv6EchoReply - answers() test 6
+b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(id=0x6666, seq=0x7777, data="somedata")
+a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(id=0x6666, seq=0x7777, data="somedata")
+(a > b) == True
+
+
+########### ICMPv6MRD* Classes ######################################
+
+= ICMPv6MRD_Advertisement - Basic instantiation
+str(ICMPv6MRD_Advertisement()) == '\x97\x14\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6MRD_Advertisement - Instantiation with specific values
+str(ICMPv6MRD_Advertisement(advinter=0xdd, queryint=0xeeee, robustness=0xffff)) == '\x97\xdd\x00\x00\xee\xee\xff\xff'
+
+= ICMPv6MRD_Advertisement - Basic Dissection and overloading mechanisms
+a=Ether(str(Ether()/IPv6()/ICMPv6MRD_Advertisement()))
+a.dst == "33:33:00:00:00:02" and IPv6 in a and a[IPv6].plen == 8 and a[IPv6].nh == 58 and a[IPv6].hlim == 1 and a[IPv6].dst == "ff02::2" and ICMPv6MRD_Advertisement in a and a[ICMPv6MRD_Advertisement].type == 151 and a[ICMPv6MRD_Advertisement].advinter == 20 and a[ICMPv6MRD_Advertisement].queryint == 0 and a[ICMPv6MRD_Advertisement].robustness == 0
+
+
+= ICMPv6MRD_Solicitation - Basic dissection
+str(ICMPv6MRD_Solicitation()) == '\x98\x00\x00\x00'
+
+= ICMPv6MRD_Solicitation - Instantiation with specific values
+str(ICMPv6MRD_Solicitation(res=0xbb)) == '\x98\xbb\x00\x00'
+
+= ICMPv6MRD_Solicitation - Basic Dissection and overloading mechanisms
+a=Ether(str(Ether()/IPv6()/ICMPv6MRD_Solicitation()))
+a.dst == "33:33:00:00:00:02" and IPv6 in a and a[IPv6].plen == 4 and a[IPv6].nh == 58 and a[IPv6].hlim == 1 and a[IPv6].dst == "ff02::2" and ICMPv6MRD_Solicitation in a and a[ICMPv6MRD_Solicitation].type == 152 and a[ICMPv6MRD_Solicitation].res == 0
+
+
+= ICMPv6MRD_Termination Basic instantiation
+str(ICMPv6MRD_Termination()) == '\x99\x00\x00\x00'
+
+= ICMPv6MRD_Termination - Instantiation with specific values
+str(ICMPv6MRD_Termination(res=0xbb)) == '\x99\xbb\x00\x00'
+
+= ICMPv6MRD_Termination - Basic Dissection and overloading mechanisms
+a=Ether(str(Ether()/IPv6()/ICMPv6MRD_Termination()))
+a.dst == "33:33:00:00:00:6a" and IPv6 in a and a[IPv6].plen == 4 and a[IPv6].nh == 58 and a[IPv6].hlim == 1 and a[IPv6].dst == "ff02::6a" and ICMPv6MRD_Termination in a and a[ICMPv6MRD_Termination].type == 153 and a[ICMPv6MRD_Termination].res == 0
+
+
+########### HBHOptUnknown Class ##############################################
++ Test HBHOptUnknown Class
+
+= HBHOptUnknown - Basic Instantiation
+str(HBHOptUnknown()) == '\x01\x00'
+
+= HBHOptUnknown - Basic Dissection
+a=HBHOptUnknown('\x01\x00')
+a.otype == 0x01 and a.optlen == 0 and a.optdata == ""
+
+= HBHOptUnknown - Automatic optlen computation
+str(HBHOptUnknown(optdata="B"*10)) == '\x01\nBBBBBBBBBB'
+
+= HBHOptUnknown - Instantiation with specific values
+str(HBHOptUnknown(optlen=9, optdata="B"*10)) == '\x01\tBBBBBBBBBB'
+
+= HBHOptUnknown - Dissection with specific values
+a=HBHOptUnknown('\x01\tBBBBBBBBBB')
+a.otype == 0x01 and a.optlen == 9 and a.optdata == "B"*9 and isinstance(a.payload, Raw) and a.payload.load == "B"
+
+
+########### Pad1 Class ##############################################
++ Test Pad1 Class
+
+= Pad1 - Basic Instantiation
+str(Pad1()) == '\x00'
+
+= Pad1 - Basic Dissection
+str(Pad1('\x00')) == '\x00'
+
+########### PadN Class ##############################################
++ Test PadN Class
+
+= PadN - Basic Instantiation
+str(PadN()) == '\x01\x00'
+
+= PadN - Optlen Automatic computation
+str(PadN(optdata="B"*10)) == '\x01\nBBBBBBBBBB'
+
+= PadN - Basic Dissection
+a=PadN('\x01\x00')
+a.otype == 1 and a.optlen == 0 and a.optdata == ''
+
+= PadN - Dissection with specific values
+a=PadN('\x01\x0cBBBBBBBBBB')
+a.otype == 1 and a.optlen == 12 and a.optdata == 'BBBBBBBBBB'
+
+= PadN - Instantiation with forced optlen
+str(PadN(optdata="B"*10, optlen=9)) == '\x01\x09BBBBBBBBBB'
+
+########### RouterAlert Class #######################################
++ Test RouterAlert Class (RFC 2711)
+
+= RouterAlert - Basic Instantiation
+str(RouterAlert()) == '\x05\x02\x00\x00'
+
+= RouterAlert - Basic Dissection
+a=RouterAlert('\x05\x02\x00\x00')
+a.otype == 0x05 and a.optlen == 2 and a.value == 00
+
+= RouterAlert - Instantiation with specific values
+str(RouterAlert(optlen=3, value=0xffff)) == '\x05\x03\xff\xff'
+
+= RouterAlert - Instantiation with specific values
+a=RouterAlert('\x05\x03\xff\xff')
+a.otype == 0x05 and a.optlen == 3 and a.value == 0xffff
+
+
+########### Jumbo Class ############################################
++ Test Jumbo Class (RFC 2675)
+
+= Jumbo - Basic Instantiation
+str(Jumbo()) == '\xc2\x04\x00\x00\x00\x00'
+
+= Jumbo - Basic Dissection
+a=Jumbo('\xc2\x04\x00\x00\x00\x00')
+a.otype == 0xC2 and a.optlen == 4 and a.jumboplen == 0
+
+= Jumbo - Instantiation with specific values
+str(Jumbo(optlen=6, jumboplen=0xffffffff)) == '\xc2\x06\xff\xff\xff\xff'
+
+= Jumbo - Dissection with specific values
+a=Jumbo('\xc2\x06\xff\xff\xff\xff')
+a.otype == 0xc2 and a.optlen == 6 and a.jumboplen == 0xffffffff
+
+
+########### HAO Class ##############################################
++ Test HAO Class (RFC 3775)
+
+= HAO - Basic Instantiation
+str(HAO()) == '\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= HAO - Basic Dissection
+a=HAO('\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+a.otype == 0xC9 and a.optlen == 16 and a.hoa == "::"
+
+= HAO - Instantiation with specific values
+str(HAO(optlen=9, hoa="2001::ffff")) == '\xc9\t \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff'
+
+= HAO - Dissection with specific values
+a=HAO('\xc9\t \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff')
+a.otype == 0xC9 and a.optlen == 9 and a.hoa == "2001::ffff"
+
+
+########### IPv6ExtHdrHopByHop Class ##########################
++ Test IPv6ExtHdrHopByHop()
+
+= IPv6ExtHdrHopByHop - Basic Instantiation
+str(IPv6ExtHdrHopByHop()) == ';\x00\x01\x04\x00\x00\x00\x00'
+
+= IPv6ExtHdrHopByHop - Instantiation with HAO option
+str(IPv6ExtHdrHopByHop(options=[HAO()])) == ';\x02\x01\x02\x00\x00\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= IPv6ExtHdrHopByHop - Instantiation with RouterAlert option
+str(IPv6ExtHdrHopByHop(options=[RouterAlert()])) == ';\x00\x05\x02\x00\x00\x01\x00'
+
+= IPv6ExtHdrHopByHop - Instantiation with Jumbo option
+str(IPv6ExtHdrHopByHop(options=[Jumbo()])) == ';\x00\xc2\x04\x00\x00\x00\x00'
+
+= IPv6ExtHdrHopByHop - Instantiation with Pad1 option
+str(IPv6ExtHdrHopByHop(options=[Pad1()])) == ';\x00\x00\x01\x03\x00\x00\x00'
+
+= IPv6ExtHdrHopByHop - Instantiation with PadN option
+str(IPv6ExtHdrHopByHop(options=[Pad1()])) == ';\x00\x00\x01\x03\x00\x00\x00'
+
+= IPv6ExtHdrHopByHop - Instantiation with Jumbo, RouterAlert, HAO
+str(IPv6ExtHdrHopByHop(options=[Jumbo(), RouterAlert(), HAO()])) == ';\x03\xc2\x04\x00\x00\x00\x00\x05\x02\x00\x00\x01\x00\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= IPv6ExtHdrHopByHop - Instantiation with HAO, Jumbo, RouterAlert
+str(IPv6ExtHdrHopByHop(options=[HAO(), Jumbo(), RouterAlert()])) == ';\x04\x01\x02\x00\x00\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\xc2\x04\x00\x00\x00\x00\x05\x02\x00\x00\x01\x02\x00\x00'
+
+= IPv6ExtHdrHopByHop - Instantiation with RouterAlert, HAO, Jumbo
+str(IPv6ExtHdrHopByHop(options=[RouterAlert(), HAO(), Jumbo()])) == ';\x03\x05\x02\x00\x00\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\xc2\x04\x00\x00\x00\x00'
+
+= IPv6ExtHdrHopByHop - Basic Dissection
+a=IPv6ExtHdrHopByHop(';\x00\x01\x04\x00\x00\x00\x00')
+a.nh == 59 and a.len == 0 and len(a.options) == 1 and isinstance(a.options[0], PadN) and a.options[0].otype == 1 and a.options[0].optlen == 4 and a.options[0].optdata == '\x00'*4
+
+#= IPv6ExtHdrHopByHop - Automatic length computation
+#str(IPv6ExtHdrHopByHop(options=["toto"])) == '\x00\x00toto'
+#= IPv6ExtHdrHopByHop - Automatic length computation
+#str(IPv6ExtHdrHopByHop(options=["toto"])) == '\x00\x00tototo'
+
+
+
+
+########### ICMPv6ND_RS Class #######################################
++ Test ICMPv6ND_RS() class - ICMPv6 Type 133 Code 0
+
+= ICMPv6ND_RS - Basic instantiation
+str(ICMPv6ND_RS()) == '\x85\x00\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6ND_RS - Basic instantiation with empty dst in IPv6 underlayer
+str(IPv6(src="2001:db8::1")/ICMPv6ND_RS()) == '`\x00\x00\x00\x00\x08:\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x85\x00M\xfe\x00\x00\x00\x00'
+
+= ICMPv6ND_RS - Basic dissection
+a=ICMPv6ND_RS('\x85\x00\x00\x00\x00\x00\x00\x00')
+a.type == 133 and a.code == 0 and a.cksum == 0 and a.res == 0
+
+= ICMPv6ND_RS - Basic instantiation with empty dst in IPv6 underlayer
+a=IPv6('`\x00\x00\x00\x00\x08:\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x85\x00M\xfe\x00\x00\x00\x00')
+isinstance(a, IPv6) and a.nh == 58 and a.hlim == 255 and isinstance(a.payload, ICMPv6ND_RS) and a.payload.type == 133 and a.payload.code == 0 and a.payload.cksum == 0x4dfe and a.payload.res == 0
+
+
+########### ICMPv6ND_RA Class #######################################
++ Test ICMPv6ND_RA() class - ICMPv6 Type 134 Code 0
+
+= ICMPv6ND_RA - Basic Instantiation
+str(ICMPv6ND_RA()) == '\x86\x00\x00\x00\x00\x08\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6ND_RA - Basic instantiation with empty dst in IPv6 underlayer
+str(IPv6(src="2001:db8::1")/ICMPv6ND_RA()) == '`\x00\x00\x00\x00\x10:\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x86\x00E\xe7\x00\x08\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6ND_RA - Basic dissection
+a=ICMPv6ND_RA('\x86\x00\x00\x00\x00\x08\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00')
+a.type == 134 and a.code == 0 and a.cksum == 0 and a.chlim == 0 and a.M == 0 and a.O == 0 and a.H == 0 and a.prf == 1 and a.res == 0 and a.routerlifetime == 1800 and a.reachabletime == 0 and a.retranstimer == 0
+
+= ICMPv6ND_RA - Basic instantiation with empty dst in IPv6 underlayer
+a=IPv6('`\x00\x00\x00\x00\x10:\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x86\x00E\xe7\x00\x08\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00')
+isinstance(a, IPv6) and a.nh == 58 and a.hlim == 255 and isinstance(a.payload, ICMPv6ND_RA) and a.payload.type == 134 and a.code == 0 and a.cksum == 0x45e7 and a.chlim == 0 and a.M == 0 and a.O == 0 and a.H == 0 and a.prf == 1 and a.res == 0 and a.routerlifetime == 1800 and a.reachabletime == 0 and a.retranstimer == 0
+
+
+# TODO: Add answers()/Hashret() tests ( think about Cisco routers
+# that reply with mcast RA to mcast rs )
+
+
+
+########### ICMPv6ND_NS Class #######################################
++ ICMPv6ND_NS Class Test
+
+= ICMPv6ND_NS - Basic Instantiation
+str(ICMPv6ND_NS()) == '\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6ND_NS - Instantiation with specific values
+str(ICMPv6ND_NS(code=0x11, R=1, S=1, O=1, res=1, tgt="ffff::1111")) == '\x87\x11\x00\x00\xe0\x00\x00\x01\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11'
+
+= ICMPv6ND_NS - Basic Dissection
+a=ICMPv6ND_NS('\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+a.code==0 and a.R==0 and a.S==0 and a.O==0 and a.res==0 and a.tgt=="::"
+
+= ICMPv6ND_NS - Dissection with specific values
+a=ICMPv6ND_NS('\x87\x11\x00\x00\xe0\x00\x00\x01\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11')
+a.code==0x11 and a.R==1 and a.S==1 and a.O==1 and a.res==1 and a.tgt=="ffff::1111"
+
+= ICMPv6ND_NS - IPv6 layer fields overloading
+a=IPv6(str(IPv6()/ICMPv6ND_NS()))
+a.nh == 58 and a.dst=="ff02::1" and a.hlim==255
+
+########### ICMPv6ND_NA Class #######################################
++ ICMPv6ND_NA Class Test
+
+= ICMPv6ND_NA - Basic Instantiation
+str(ICMPv6ND_NA()) == '\x88\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6ND_NA - Instantiation with specific values
+str(ICMPv6ND_NA(code=0x11, R=0, S=1, O=0, res=1, tgt="ffff::1111")) == '\x88\x11\x00\x00@\x00\x00\x01\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11'
+
+= ICMPv6ND_NA - Basic Dissection
+a=ICMPv6ND_NA('\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+a.code==0 and a.R==0 and a.S==0 and a.O==0 and a.res==0 and a.tgt=="::"
+
+= ICMPv6ND_NA - Dissection with specific values
+a=ICMPv6ND_NA('\x88\x11\x00\x00@\x00\x00\x01\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11')
+a.code==0x11 and a.R==0 and a.S==1 and a.O==0 and a.res==1 and a.tgt=="ffff::1111"
+
+= ICMPv6ND_NS - IPv6 layer fields overloading
+a=IPv6(str(IPv6()/ICMPv6ND_NS()))
+a.nh == 58 and a.dst=="ff02::1" and a.hlim==255
+
+########### ICMPv6ND_NS/ICMPv6ND_NA matching ########################
++ ICMPv6ND_ND/ICMPv6ND_ND matching test
+
+= ICMPv6ND_ND/ICMPv6ND_ND matching - test 1
+# Sent NS
+a=IPv6('`\x00\x00\x00\x00\x18:\xff\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x0f\x1f\xff\xfe\xcaFP\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x87\x00UC\x00\x00\x00\x00\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x0f4\xff\xfe\x8a\x8a\xa1')
+# Received NA
+b=IPv6('n\x00\x00\x00\x00 :\xff\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x0f4\xff\xfe\x8a\x8a\xa1\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x0f\x1f\xff\xfe\xcaFP\x88\x00\xf3F\xe0\x00\x00\x00\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x0f4\xff\xfe\x8a\x8a\xa1\x02\x01\x00\x0f4\x8a\x8a\xa1')
+b.answers(a)
+
+
+########### ICMPv6NDOptUnknown Class ################################
++ ICMPv6NDOptUnknown Class Test
+
+= ICMPv6NDOptUnknown - Basic Instantiation
+str(ICMPv6NDOptUnknown()) == '\x00\x02'
+
+= ICMPv6NDOptUnknown - Instantiation with specific values
+str(ICMPv6NDOptUnknown(len=4, data="somestring")) == '\x00\x04somestring'
+
+= ICMPv6NDOptUnknown - Basic Dissection
+a=ICMPv6NDOptUnknown('\x00\x02')
+a.type == 0 and a.len == 2
+
+= ICMPv6NDOptUnknown - Dissection with specific values
+a=ICMPv6NDOptUnknown('\x00\x04somestring')
+a.type == 0 and a.len==4 and a.data == "so" and isinstance(a.payload, Raw) and a.payload.load == "mestring"
+
+########### ICMPv6NDOptSrcLLAddr Class ##############################
++ ICMPv6NDOptSrcLLAddr Class Test
+
+= ICMPv6NDOptSrcLLAddr - Basic Instantiation
+str(ICMPv6NDOptSrcLLAddr()) == '\x01\x01\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6NDOptSrcLLAddr - Instantiation with specific values
+str(ICMPv6NDOptSrcLLAddr(len=2, lladdr="11:11:11:11:11:11")) == '\x01\x02\x11\x11\x11\x11\x11\x11'
+
+= ICMPv6NDOptSrcLLAddr - Basic Dissection
+a=ICMPv6NDOptSrcLLAddr('\x01\x01\x00\x00\x00\x00\x00\x00')
+a.type == 1 and a.len == 1 and a.lladdr == "00:00:00:00:00:00"
+
+= ICMPv6NDOptSrcLLAddr - Instantiation with specific values
+a=ICMPv6NDOptSrcLLAddr('\x01\x02\x11\x11\x11\x11\x11\x11')
+a.type == 1 and a.len == 2 and a.lladdr == "11:11:11:11:11:11"
+
+########### ICMPv6NDOptDstLLAddr Class ##############################
++ ICMPv6NDOptDstLLAddr Class Test
+
+= ICMPv6NDOptDstLLAddr - Basic Instantiation
+str(ICMPv6NDOptDstLLAddr()) == '\x02\x01\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6NDOptDstLLAddr - Instantiation with specific values
+str(ICMPv6NDOptDstLLAddr(len=2, lladdr="11:11:11:11:11:11")) == '\x02\x02\x11\x11\x11\x11\x11\x11'
+
+= ICMPv6NDOptDstLLAddr - Basic Dissection
+a=ICMPv6NDOptDstLLAddr('\x02\x01\x00\x00\x00\x00\x00\x00')
+a.type == 2 and a.len == 1 and a.lladdr == "00:00:00:00:00:00"
+
+= ICMPv6NDOptDstLLAddr - Instantiation with specific values
+a=ICMPv6NDOptDstLLAddr('\x02\x02\x11\x11\x11\x11\x11\x11')
+a.type == 2 and a.len == 2 and a.lladdr == "11:11:11:11:11:11"
+
+########### ICMPv6NDOptPrefixInfo Class #############################
++ ICMPv6NDOptPrefixInfo Class Test
+
+= ICMPv6NDOptPrefixInfo - Basic Instantiation
+str(ICMPv6NDOptPrefixInfo()) == '\x03\x04\x00\xc0\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6NDOptPrefixInfo - Instantiation with specific values
+str(ICMPv6NDOptPrefixInfo(len=5, prefixlen=64, L=0, A=0, R=1, res1=1, validlifetime=0x11111111, preferredlifetime=0x22222222, res2=0x33333333, prefix="2001:db8::1")) == '\x03\x05@!\x11\x11\x11\x11""""3333 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
+
+= ICMPv6NDOptPrefixInfo - Basic Dissection
+a=ICMPv6NDOptPrefixInfo('\x03\x04\x00\xc0\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+a.type == 3 and a.len == 4 and a.prefixlen == 0 and a.L == 1 and a.A == 1 and a.R == 0 and a.res1 == 0 and a.validlifetime == 0xffffffff and a.preferredlifetime == 0xffffffff and a.res2 == 0 and a.prefix == "::"
+
+= ICMPv6NDOptPrefixInfo - Instantiation with specific values
+a=ICMPv6NDOptPrefixInfo('\x03\x05@!\x11\x11\x11\x11""""3333 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
+a.type == 3 and a.len == 5 and a.prefixlen == 64 and a.L == 0 and a.A == 0 and a.R == 1 and a.res1 == 1 and a.validlifetime == 0x11111111 and a.preferredlifetime == 0x22222222 and a.res2 == 0x33333333 and a.prefix == "2001:db8::1"
+
+
+########### ICMPv6NDOptRedirectedHdr Class ##########################
++ ICMPv6NDOptRedirectedHdr Class Test
+
+= ICMPv6NDOptRedirectedHdr - Basic Instantiation
+str(ICMPv6NDOptRedirectedHdr()) == '\x04\x00\x00\x00'
+
+= ICMPv6NDOptRedirectedHdr - Instantiation with specific values
+str(ICMPv6NDOptRedirectedHdr(len=0xff, res=0x1111, pkt="somestringthatisnotanipv6packet")) == '\x04\xff\x11\x11somestringthatisnotanipv6pac'
+
+= ICMPv6NDOptRedirectedHdr - Instantiation with simple IPv6 packet (no upper layer)
+str(ICMPv6NDOptRedirectedHdr(pkt=IPv6())) == '\x04\x05\x00\x00`\x00\x00\x00\x00\x00;@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6NDOptRedirectedHdr - Basic Dissection
+a=ICMPv6NDOptRedirectedHdr('\x04\x00\x00\x00')
+a.type == 4 and a.len == 0 and a.res == 0 and a.pkt == ""
+
+= ICMPv6NDOptRedirectedHdr - Disssection with specific values
+a=ICMPv6NDOptRedirectedHdr('\x04\xff\x11\x11somestringthatisnotanipv6pac')
+a.type == 4 and a.len == 255 and a.res == 0x1111 and isinstance(a.pkt, Raw) and a.pkt.load == "somestringthatisnotanipv6pac"
+
+= ICMPv6NDOptRedirectedHdr - Dissection with cut IPv6 Header
+a=ICMPv6NDOptRedirectedHdr('\x04\x05\x00\x00`\x00\x00\x00\x00\x00;@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+a.type == 4 and a.len == 5 and a.res == 0 and isinstance(a.pkt, Raw) and a.pkt.load == '`\x00\x00\x00\x00\x00;@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+# Add more tests
+
+########### ICMPv6NDOptMTU Class ####################################
++ ICMPv6NDOptMTU Class Test
+
+= ICMPv6NDOptMTU - Basic Instantiation
+str(ICMPv6NDOptMTU()) == '\x05\x01\x00\x00\x00\x00\x05\x00'
+
+= ICMPv6NDOptMTU - Instantiation with specific values
+str(ICMPv6NDOptMTU(len=2, res=0x1111, mtu=1500)) == '\x05\x02\x11\x11\x00\x00\x05\xdc'
+
+= ICMPv6NDOptMTU - Basic dissection
+a=ICMPv6NDOptMTU('\x05\x01\x00\x00\x00\x00\x05\x00')
+a.type == 5 and a.len == 1 and a.res == 0 and a.mtu == 1280
+
+= ICMPv6NDOptMTU - Dissection with specific values
+a=ICMPv6NDOptMTU('\x05\x02\x11\x11\x00\x00\x05\xdc')
+a.type == 5 and a.len == 2 and a.res == 0x1111 and a.mtu == 1500
+
+########### ICMPv6NDOptShortcutLimit Class ##########################
++ ICMPv6NDOptShortcutLimit Class Test (RFC2491)
+
+= ICMPv6NDOptShortcutLimit - Basic Instantiation
+str(ICMPv6NDOptShortcutLimit()) == '\x06\x01(\x00\x00\x00\x00\x00'
+
+= ICMPv6NDOptShortcutLimit - Instantiation with specific values
+str(ICMPv6NDOptShortcutLimit(len=2, shortcutlim=0x11, res1=0xee, res2=0xaaaaaaaa)) == '\x06\x02\x11\xee\xaa\xaa\xaa\xaa'
+
+= ICMPv6NDOptShortcutLimit - Basic Dissection
+a=ICMPv6NDOptShortcutLimit('\x06\x01(\x00\x00\x00\x00\x00')
+a.type == 6 and a.len == 1 and a.shortcutlim == 40 and a.res1 == 0 and a.res2 == 0
+
+= ICMPv6NDOptShortcutLimit - Dissection with specific values
+a=ICMPv6NDOptShortcutLimit('\x06\x02\x11\xee\xaa\xaa\xaa\xaa')
+a.len==2 and a.shortcutlim==0x11 and a.res1==0xee and a.res2==0xaaaaaaaa
+
+
+########### ICMPv6NDOptAdvInterval Class ############################
++ ICMPv6NDOptAdvInterval Class Test
+
+= ICMPv6NDOptAdvInterval - Basic Instantiation
+str(ICMPv6NDOptAdvInterval()) == '\x07\x01\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6NDOptAdvInterval - Instantiation with specific values
+str(ICMPv6NDOptAdvInterval(len=2, res=0x1111, advint=0xffffffff)) == '\x07\x02\x11\x11\xff\xff\xff\xff'
+
+= ICMPv6NDOptAdvInterval - Basic dissection
+a=ICMPv6NDOptAdvInterval('\x07\x01\x00\x00\x00\x00\x00\x00')
+a.type == 7 and a.len == 1 and a.res == 0 and a.advint == 0
+
+= ICMPv6NDOptAdvInterval - Dissection with specific values
+a=ICMPv6NDOptAdvInterval('\x07\x02\x11\x11\xff\xff\xff\xff')
+a.type == 7 and a.len == 2 and a.res == 0x1111 and a.advint == 0xffffffff
+
+########### ICMPv6NDOptHAInfo Class #################################
++ ICMPv6NDOptHAInfo Class Test
+
+= ICMPv6NDOptHAInfo - Basic Instantiation
+str(ICMPv6NDOptHAInfo()) == '\x08\x01\x00\x00\x00\x00\x00\x01'
+
+= ICMPv6NDOptHAInfo - Instantiation with specific values
+str(ICMPv6NDOptHAInfo(len=2, res=0x1111, pref=0x2222, lifetime=0x3333)) == '\x08\x02\x11\x11""33'
+
+= ICMPv6NDOptHAInfo - Basic dissection
+a=ICMPv6NDOptHAInfo('\x08\x01\x00\x00\x00\x00\x00\x01')
+a.type == 8 and a.len == 1 and a.res == 0 and a.pref == 0 and a.lifetime == 1
+
+= ICMPv6NDOptHAInfo - Dissection with specific values
+a=ICMPv6NDOptHAInfo('\x08\x02\x11\x11""33')
+a.type == 8 and a.len == 2 and a.res == 0x1111 and a.pref == 0x2222 and a.lifetime == 0x3333
+
+########### ICMPv6NDOptSrcAddrList Class (RFC 3122) #################
++ ICMPv6NDOptSrcAddrList Class Test
+
+= ICMPv6NDOptSrcAddrList - Basic Instantiation
+str(ICMPv6NDOptSrcAddrList()) == '\t\x01\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6NDOptSrcAddrList - Instantiation with specific values (auto len)
+str(ICMPv6NDOptSrcAddrList(res="BBBBBB", addrlist=["ffff::ffff", "1111::1111"])) == '\t\x05BBBBBB\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11'
+
+= ICMPv6NDOptSrcAddrList - Instantiation with specific values
+str(ICMPv6NDOptSrcAddrList(len=3, res="BBBBBB", addrlist=["ffff::ffff", "1111::1111"])) == '\t\x03BBBBBB\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11'
+
+= ICMPv6NDOptSrcAddrList - Basic Dissection
+a=ICMPv6NDOptSrcAddrList('\t\x01\x00\x00\x00\x00\x00\x00')
+a.type == 9 and a.len == 1 and a.res == '\x00\x00\x00\x00\x00\x00' and not a.addrlist
+
+= ICMPv6NDOptSrcAddrList - Dissection with specific values (auto len)
+a=ICMPv6NDOptSrcAddrList('\t\x05BBBBBB\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11')
+a.type == 9 and a.len == 5 and a.res == 'BBBBBB' and len(a.addrlist) == 2 and a.addrlist[0] == "ffff::ffff" and a.addrlist[1] == "1111::1111"
+
+= ICMPv6NDOptSrcAddrList - Dissection with specific values
+a=ICMPv6NDOptSrcAddrList('\t\x03BBBBBB\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11')
+a.type == 9 and a.len == 3 and a.res == 'BBBBBB' and len(a.addrlist) == 1 and a.addrlist[0] == "ffff::ffff" and isinstance(a.payload, Raw) and a.payload.load == '\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11'
+
+########### ICMPv6NDOptTgtAddrList Class (RFC 3122) #################
+
++ ICMPv6NDOptTgtAddrList Class Test
+
+= ICMPv6NDOptTgtAddrList - Basic Instantiation
+str(ICMPv6NDOptTgtAddrList()) == '\n\x01\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6NDOptTgtAddrList - Instantiation with specific values (auto len)
+str(ICMPv6NDOptTgtAddrList(res="BBBBBB", addrlist=["ffff::ffff", "1111::1111"])) == '\n\x05BBBBBB\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11'
+
+= ICMPv6NDOptTgtAddrList - Instantiation with specific values
+str(ICMPv6NDOptTgtAddrList(len=3, res="BBBBBB", addrlist=["ffff::ffff", "1111::1111"])) == '\n\x03BBBBBB\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11'
+
+= ICMPv6NDOptTgtAddrList - Basic Dissection
+a=ICMPv6NDOptTgtAddrList('\n\x01\x00\x00\x00\x00\x00\x00')
+a.type == 10 and a.len == 1 and a.res == '\x00\x00\x00\x00\x00\x00' and not a.addrlist
+
+= ICMPv6NDOptTgtAddrList - Dissection with specific values (auto len)
+a=ICMPv6NDOptTgtAddrList('\n\x05BBBBBB\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11')
+a.type == 10 and a.len == 5 and a.res == 'BBBBBB' and len(a.addrlist) == 2 and a.addrlist[0] == "ffff::ffff" and a.addrlist[1] == "1111::1111"
+
+= ICMPv6NDOptTgtAddrList - Instantiation with specific values
+a=ICMPv6NDOptTgtAddrList('\n\x03BBBBBB\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11')
+a.type == 10 and a.len == 3 and a.res == 'BBBBBB' and len(a.addrlist) == 1 and a.addrlist[0] == "ffff::ffff" and isinstance(a.payload, Raw) and a.payload.load == '\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11'
+
+
+
+########### ICMPv6NDOptIPAddr Class (RFC 4068) ######################
++ ICMPv6NDOptIPAddr Class Test (RFC 4068)
+
+= ICMPv6NDOptIPAddr - Basic Instantiation
+str(ICMPv6NDOptIPAddr()) == '\x11\x03\x01@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6NDOptIPAddr - Instantiation with specific values
+str(ICMPv6NDOptIPAddr(len=5, optcode=0xff, plen=40, res=0xeeeeeeee, addr="ffff::1111")) == '\x11\x05\xff(\xee\xee\xee\xee\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11'
+
+= ICMPv6NDOptIPAddr - Basic Dissection
+a=ICMPv6NDOptIPAddr('\x11\x03\x01@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+a.type == 17 and a.len == 3 and a.optcode == 1 and a.plen == 64 and a.res == 0 and a.addr == "::"
+
+= ICMPv6NDOptIPAddr - Dissection with specific values
+a=ICMPv6NDOptIPAddr('\x11\x05\xff(\xee\xee\xee\xee\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11')
+a.type == 17 and a.len == 5 and a.optcode == 0xff and a.plen == 40 and a.res == 0xeeeeeeee and a.addr == "ffff::1111"
+
+
+########### ICMPv6NDOptNewRtrPrefix Class (RFC 4068) ################
++ ICMPv6NDOptNewRtrPrefix Class Test (RFC 4068)
+
+= ICMPv6NDOptNewRtrPrefix - Basic Instantiation
+str(ICMPv6NDOptNewRtrPrefix()) == '\x12\x03\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6NDOptNewRtrPrefix - Instantiation with specific values
+str(ICMPv6NDOptNewRtrPrefix(len=5, optcode=0xff, plen=40, res=0xeeeeeeee, prefix="ffff::1111")) == '\x12\x05\xff(\xee\xee\xee\xee\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11'
+
+= ICMPv6NDOptNewRtrPrefix - Basic Dissection
+a=ICMPv6NDOptNewRtrPrefix('\x12\x03\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+a.type == 18 and a.len == 3 and a.optcode == 0 and a.plen == 64 and a.res == 0 and a.prefix == "::"
+
+= ICMPv6NDOptNewRtrPrefix - Dissection with specific values
+a=ICMPv6NDOptNewRtrPrefix('\x12\x05\xff(\xee\xee\xee\xee\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11')
+a.type == 18 and a.len == 5 and a.optcode == 0xff and a.plen == 40 and a.res == 0xeeeeeeee and a.prefix == "ffff::1111"
+
+########### ICMPv6NDOptLLA Class (RFC 4068) #########################
++ ICMPv6NDOptLLA Class Test (RFC 4068)
+
+= ICMPv6NDOptLLA - Basic Instantiation
+str(ICMPv6NDOptLLA()) == '\x13\x01\x00\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6NDOptLLA - Instantiation with specific values
+str(ICMPv6NDOptLLA(len=2, optcode=3, lla="ff:11:ff:11:ff:11")) == '\x13\x02\x03\xff\x11\xff\x11\xff\x11'
+
+= ICMPv6NDOptLLA - Basic Dissection
+a=ICMPv6NDOptLLA('\x13\x01\x00\x00\x00\x00\x00\x00\x00')
+a.type == 19 and a.len == 1 and a.optcode == 0 and a.lla == "00:00:00:00:00:00"
+
+= ICMPv6NDOptLLA - Dissection with specific values
+a=ICMPv6NDOptLLA('\x13\x02\x03\xff\x11\xff\x11\xff\x11')
+a.type == 19 and a.len == 2 and a.optcode == 3 and a.lla == "ff:11:ff:11:ff:11"
+
+
+
+
+########### ICMPv6NDOptRouteInfo Class (RFC 4191) ###################
++ ICMPv6NDOptRouteInfo Class Test
+
+= ICMPv6NDOptRouteInfo - Basic Instantiation
+str(ICMPv6NDOptRouteInfo()) == '\x18\x01\x00\x00\xff\xff\xff\xff'
+
+= ICMPv6NDOptRouteInfo - Instantiation with forced prefix but no length
+str(ICMPv6NDOptRouteInfo(prefix="2001:db8:1:1:1:1:1:1")) == '\x18\x03\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01'
+
+= ICMPv6NDOptRouteInfo - Instantiation with forced length values (1/4)
+str(ICMPv6NDOptRouteInfo(len=1, prefix="2001:db8:1:1:1:1:1:1")) == '\x18\x01\x00\x00\xff\xff\xff\xff'
+
+= ICMPv6NDOptRouteInfo - Instantiation with forced length values (2/4)
+str(ICMPv6NDOptRouteInfo(len=2, prefix="2001:db8:1:1:1:1:1:1")) == '\x18\x02\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x01\x00\x01'
+
+= ICMPv6NDOptRouteInfo - Instantiation with forced length values (3/4)
+str(ICMPv6NDOptRouteInfo(len=3, prefix="2001:db8:1:1:1:1:1:1")) == '\x18\x03\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01'
+
+= ICMPv6NDOptRouteInfo - Instantiation with forced length values (4/4)
+str(ICMPv6NDOptRouteInfo(len=4, prefix="2001:db8:1:1:1:1:1:1")) == '\x18\x04\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6NDOptRouteInfo - Instantiation with specific values
+str(ICMPv6NDOptRouteInfo(len=6, plen=0x11, res1=1, prf=3, res2=1, rtlifetime=0x22222222, prefix="2001:db8::1")) == '\x18\x06\x119"""" \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6NDOptRouteInfo - Basic dissection
+a=ICMPv6NDOptRouteInfo('\x18\x03\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+a.type == 24 and a.len == 3 and a.plen == 0 and a.res1 == 0 and a.prf == 0 and a.res2 == 0 and a.rtlifetime == 0xffffffff and a. prefix == "::"
+
+= ICMPv6NDOptRouteInfo - Dissection with specific values
+a=ICMPv6NDOptRouteInfo('\x18\x04\x119"""" \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
+a.plen == 0x11 and a.res1 == 1 and a.prf == 3 and a.res2 == 1 and a.rtlifetime == 0x22222222 and a.prefix == "2001:db8::1"
+
+########### ICMPv6NDOptMAP Class (RFC 4191) ###################
++ ICMPv6NDOptMAP Class Test
+
+= ICMPv6NDOptMAP - Basic Instantiation
+str(ICMPv6NDOptMAP()) == '\x17\x03\x1f\x80\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6NDOptMAP - Instantiation with specific values
+str(ICMPv6NDOptMAP(len=5, dist=3, pref=10, R=0, res=1, validlifetime=0x11111111, addr="ffff::1111")) == '\x17\x05:\x01\x11\x11\x11\x11\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11'
+
+= ICMPv6NDOptMAP - Basic Dissection
+a=ICMPv6NDOptMAP('\x17\x03\x1f\x80\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+a.type==23 and a.len==3 and a.dist==1 and a.pref==15 and a.R==1 and a.res==0 and a.validlifetime==0xffffffff and a.addr=="::"
+
+= ICMPv6NDOptMAP - Dissection with specific values
+a=ICMPv6NDOptMAP('\x17\x05:\x01\x11\x11\x11\x11\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11')
+a.type==23 and a.len==5 and a.dist==3 and a.pref==10 and a.R==0 and a.res==1 and a.validlifetime==0x11111111 and a.addr=="ffff::1111"
+
+########### ICMPv6NDOptRDNSS Class (RFC5006) ########################
++ ICMPv6NDOptRDNSS Class Test
+
+= ICMPv6NDOptRDNSS - Basic Instantiation
+str(ICMPv6NDOptRDNSS()) == '\x19\x01\x00\x00\xff\xff\xff\xff'
+
+= ICMPv6NDOptRDNSS - Basic instantiation with 1 DNS address
+str(ICMPv6NDOptRDNSS(dns=["2001:db8::1"])) == '\x19\x03\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
+
+= ICMPv6NDOptRDNSS - Basic instantiation with 2 DNS addresses
+str(ICMPv6NDOptRDNSS(dns=["2001:db8::1", "2001:db8::2"])) == '\x19\x05\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02'
+
+= ICMPv6NDOptRDNSS - Instantiation with specific values
+str(ICMPv6NDOptRDNSS(len=43, res=0xaaee, lifetime=0x11111111, dns=["2001:db8::2"])) == '\x19+\xaa\xee\x11\x11\x11\x11 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02'
+
+= ICMPv6NDOptRDNSS - Basic Dissection
+a=ICMPv6NDOptRDNSS('\x19\x01\x00\x00\xff\xff\xff\xff')
+a.type==25 and a.len==1 and a.res == 0 and a.dns==[]
+
+= ICMPv6NDOptRDNSS - Dissection (with 1 DNS address)
+a=ICMPv6NDOptRDNSS('\x19\x03\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
+a.type==25 and a.len==3 and a.res ==0 and len(a.dns) == 1 and a.dns[0] == "2001:db8::1"
+
+= ICMPv6NDOptRDNSS - Dissection (with 2 DNS addresses)
+a=ICMPv6NDOptRDNSS('\x19\x05\xaa\xee\xff\xff\xff\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02')
+a.type==25 and a.len==5 and a.res == 0xaaee and len(a.dns) == 2 and a.dns[0] == "2001:db8::1" and a.dns[1] == "2001:db8::2"
+
+########### ICMPv6NDOptEFA Class (RFC5075) ##########################
++ ICMPv6NDOptEFA Class Test
+
+= ICMPv6NDOptEFA - Basic Instantiation
+str(ICMPv6NDOptEFA()) == '\x1a\x01\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6NDOptEFA - Basic Dissection
+a=ICMPv6NDOptEFA('\x1a\x01\x00\x00\x00\x00\x00\x00')
+a.type==26 and a.len==1 and a.res == 0
+
+#####################################################################
++ Test Node Information Query - ICMPv6NIQueryNOOP
+
+= ICMPv6NIQueryNOOP - Basic Instantiation
+str(ICMPv6NIQueryNOOP(nonce="\x00"*8)) == '\x8b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6NIQueryNOOP - Basic Dissection
+a = ICMPv6NIQueryNOOP('\x8b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+a.type == 139 and a.code == 1 and a.cksum == 0 and a.qtype == 0 and a.unused == 0 and a.flags == 0 and a.nonce == "\x00"*8 and a.data == ""
+
+
+#####################################################################
++ Test Node Information Query - ICMPv6NIQueryName
+
+= ICMPv6NIQueryName - single label DNS name (internal)
+a=ICMPv6NIQueryName(data="abricot").getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == '\x07abricot\x00\x00'
+
+= ICMPv6NIQueryName - single label DNS name
+ICMPv6NIQueryName(data="abricot").data == "abricot"
+
+= ICMPv6NIQueryName - fqdn (internal)
+a=ICMPv6NIQueryName(data="n.d.org").getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == '\x01n\x01d\x03org\x00'
+
+= ICMPv6NIQueryName - fqdn
+ICMPv6NIQueryName(data="n.d.org").data == "n.d.org"
+
+= ICMPv6NIQueryName - IPv6 address (internal)
+a=ICMPv6NIQueryName(data="2001:db8::1").getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == '2001:db8::1'
+
+= ICMPv6NIQueryName - IPv6 address
+ICMPv6NIQueryName(data="2001:db8::1").data == "2001:db8::1"
+
+= ICMPv6NIQueryName - IPv4 address (internal)
+a=ICMPv6NIQueryName(data="169.254.253.252").getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 2 and a[1] == '169.254.253.252'
+
+= ICMPv6NIQueryName - IPv4 address
+ICMPv6NIQueryName(data="169.254.253.252").data == '169.254.253.252'
+
+
+#####################################################################
++ Test Node Information Query - ICMPv6NIQueryIPv6
+
+= ICMPv6NIQueryIPv6 - single label DNS name (internal)
+a=ICMPv6NIQueryIPv6(data="abricot").getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == '\x07abricot\x00\x00'
+
+= ICMPv6NIQueryIPv6 - single label DNS name
+ICMPv6NIQueryIPv6(data="abricot").data == "abricot"
+
+= ICMPv6NIQueryIPv6 - fqdn (internal)
+a=ICMPv6NIQueryIPv6(data="n.d.org").getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == '\x01n\x01d\x03org\x00'
+
+= ICMPv6NIQueryIPv6 - fqdn
+ICMPv6NIQueryIPv6(data="n.d.org").data == "n.d.org"
+
+= ICMPv6NIQueryIPv6 - IPv6 address (internal)
+a=ICMPv6NIQueryIPv6(data="2001:db8::1").getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == '2001:db8::1'
+
+= ICMPv6NIQueryIPv6 - IPv6 address
+ICMPv6NIQueryIPv6(data="2001:db8::1").data == "2001:db8::1"
+
+= ICMPv6NIQueryIPv6 - IPv4 address (internal)
+a=ICMPv6NIQueryIPv6(data="169.254.253.252").getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 2 and a[1] == '169.254.253.252'
+
+= ICMPv6NIQueryIPv6 - IPv4 address
+ICMPv6NIQueryIPv6(data="169.254.253.252").data == '169.254.253.252'
+
+
+#####################################################################
++ Test Node Information Query - ICMPv6NIQueryIPv4
+
+= ICMPv6NIQueryIPv4 - single label DNS name (internal)
+a=ICMPv6NIQueryIPv4(data="abricot").getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == '\x07abricot\x00\x00'
+
+= ICMPv6NIQueryIPv4 - single label DNS name
+ICMPv6NIQueryIPv4(data="abricot").data == "abricot"
+
+= ICMPv6NIQueryIPv4 - fqdn (internal)
+a=ICMPv6NIQueryIPv4(data="n.d.org").getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == '\x01n\x01d\x03org\x00'
+
+= ICMPv6NIQueryIPv4 - fqdn
+ICMPv6NIQueryIPv4(data="n.d.org").data == "n.d.org"
+
+= ICMPv6NIQueryIPv4 - IPv6 address (internal)
+a=ICMPv6NIQueryIPv4(data="2001:db8::1").getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == '2001:db8::1'
+
+= ICMPv6NIQueryIPv4 - IPv6 address
+ICMPv6NIQueryIPv4(data="2001:db8::1").data == "2001:db8::1"
+
+= ICMPv6NIQueryIPv4 - IPv4 address (internal)
+a=ICMPv6NIQueryIPv4(data="169.254.253.252").getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 2 and a[1] == '169.254.253.252'
+
+= ICMPv6NIQueryIPv4 - IPv4 address
+ICMPv6NIQueryIPv4(data="169.254.253.252").data == '169.254.253.252'
+
+#####################################################################
++ Test Node Information Query - Flags tests
+
+= ICMPv6NIQuery* - flags handling (Test 1)
+t = ICMPv6NIQueryIPv6(flags="T")
+a = ICMPv6NIQueryIPv6(flags="A")
+c = ICMPv6NIQueryIPv6(flags="C")
+l = ICMPv6NIQueryIPv6(flags="L")
+s = ICMPv6NIQueryIPv6(flags="S")
+g = ICMPv6NIQueryIPv6(flags="G")
+all = ICMPv6NIQueryIPv6(flags="TALCLSG")
+t.flags == 1 and a.flags == 2 and c.flags == 4 and l.flags == 8 and s.flags == 16 and g.flags == 32 and all.flags == 63
+
+
+= ICMPv6NIQuery* - flags handling (Test 2)
+t = str(ICMPv6NIQueryNOOP(flags="T", nonce="A"*8))[6:8]
+a = str(ICMPv6NIQueryNOOP(flags="A", nonce="A"*8))[6:8]
+c = str(ICMPv6NIQueryNOOP(flags="C", nonce="A"*8))[6:8]
+l = str(ICMPv6NIQueryNOOP(flags="L", nonce="A"*8))[6:8]
+s = str(ICMPv6NIQueryNOOP(flags="S", nonce="A"*8))[6:8]
+g = str(ICMPv6NIQueryNOOP(flags="G", nonce="A"*8))[6:8]
+all = str(ICMPv6NIQueryNOOP(flags="TALCLSG", nonce="A"*8))[6:8]
+t == '\x00\x01' and a == '\x00\x02' and c == '\x00\x04' and l == '\x00\x08' and s == '\x00\x10' and g == '\x00\x20' and all == '\x00\x3F'
+
+
+= ICMPv6NIReply* - flags handling (Test 1)
+t = ICMPv6NIReplyIPv6(flags="T")
+a = ICMPv6NIReplyIPv6(flags="A")
+c = ICMPv6NIReplyIPv6(flags="C")
+l = ICMPv6NIReplyIPv6(flags="L")
+s = ICMPv6NIReplyIPv6(flags="S")
+g = ICMPv6NIReplyIPv6(flags="G")
+all = ICMPv6NIReplyIPv6(flags="TALCLSG")
+t.flags == 1 and a.flags == 2 and c.flags == 4 and l.flags == 8 and s.flags == 16 and g.flags == 32 and all.flags == 63
+
+
+= ICMPv6NIReply* - flags handling (Test 2)
+t = str(ICMPv6NIReplyNOOP(flags="T", nonce="A"*8))[6:8]
+a = str(ICMPv6NIReplyNOOP(flags="A", nonce="A"*8))[6:8]
+c = str(ICMPv6NIReplyNOOP(flags="C", nonce="A"*8))[6:8]
+l = str(ICMPv6NIReplyNOOP(flags="L", nonce="A"*8))[6:8]
+s = str(ICMPv6NIReplyNOOP(flags="S", nonce="A"*8))[6:8]
+g = str(ICMPv6NIReplyNOOP(flags="G", nonce="A"*8))[6:8]
+all = str(ICMPv6NIReplyNOOP(flags="TALCLSG", nonce="A"*8))[6:8]
+t == '\x00\x01' and a == '\x00\x02' and c == '\x00\x04' and l == '\x00\x08' and s == '\x00\x10' and g == '\x00\x20' and all == '\x00\x3F'
+
+
+= ICMPv6NIQuery* - Flags Default values
+a = ICMPv6NIQueryNOOP()
+b = ICMPv6NIQueryName()
+c = ICMPv6NIQueryIPv4()
+d = ICMPv6NIQueryIPv6()
+a.flags == 0 and b.flags == 0 and c.flags == 0 and d.flags == 62
+
+= ICMPv6NIReply* - Flags Default values
+a = ICMPv6NIReplyIPv6()
+b = ICMPv6NIReplyName()
+c = ICMPv6NIReplyIPv6()
+d = ICMPv6NIReplyIPv4()
+e = ICMPv6NIReplyRefuse()
+f = ICMPv6NIReplyUnknown()
+a.flags == 0 and b.flags == 0 and c.flags == 0 and d.flags == 0 and e.flags == 0 and f.flags == 0
+
+
+
+# Nonces
+# hashret and answers
+# payload guess
+# automatic destination address computation when integrated in scapy6
+# at least computeNIGroupAddr
+
+
+#####################################################################
++ Test Node Information Query - Dispatching
+
+= ICMPv6NIQueryIPv6 - dispatch with nothing in data
+s = str(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv6())
+p = IPv6(s)
+isinstance(p.payload, ICMPv6NIQueryIPv6)
+
+= ICMPv6NIQueryIPv6 - dispatch with IPv6 address in data
+s = str(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv6(data="2001::db8::1"))
+p = IPv6(s)
+isinstance(p.payload, ICMPv6NIQueryIPv6)
+
+= ICMPv6NIQueryIPv6 - dispatch with IPv4 address in data
+s = str(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv6(data="192.168.0.1"))
+p = IPv6(s)
+isinstance(p.payload, ICMPv6NIQueryIPv6)
+
+= ICMPv6NIQueryIPv6 - dispatch with name in data
+s = str(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv6(data="alfred"))
+p = IPv6(s)
+isinstance(p.payload, ICMPv6NIQueryIPv6)
+
+= ICMPv6NIQueryName - dispatch with nothing in data
+s = str(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryName())
+p = IPv6(s)
+isinstance(p.payload, ICMPv6NIQueryName)
+
+= ICMPv6NIQueryName - dispatch with IPv6 address in data
+s = str(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryName(data="2001:db8::1"))
+p = IPv6(s)
+isinstance(p.payload, ICMPv6NIQueryName)
+
+= ICMPv6NIQueryName - dispatch with IPv4 address in data
+s = str(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryName(data="192.168.0.1"))
+p = IPv6(s)
+isinstance(p.payload, ICMPv6NIQueryName)
+
+= ICMPv6NIQueryName - dispatch with name in data
+s = str(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryName(data="alfred"))
+p = IPv6(s)
+isinstance(p.payload, ICMPv6NIQueryName)
+
+= ICMPv6NIQueryIPv4 - dispatch with nothing in data
+s = str(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv4())
+p = IPv6(s)
+isinstance(p.payload, ICMPv6NIQueryIPv4)
+
+= ICMPv6NIQueryIPv4 - dispatch with IPv6 address in data
+s = str(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv4(data="2001:db8::1"))
+p = IPv6(s)
+isinstance(p.payload, ICMPv6NIQueryIPv4)
+
+= ICMPv6NIQueryIPv4 - dispatch with IPv6 address in data
+s = str(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv4(data="192.168.0.1"))
+p = IPv6(s)
+isinstance(p.payload, ICMPv6NIQueryIPv4)
+
+= ICMPv6NIQueryIPv4 - dispatch with name in data
+s = str(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv4(data="alfred"))
+p = IPv6(s)
+isinstance(p.payload, ICMPv6NIQueryIPv4)
+
+= ICMPv6NIReplyName - dispatch
+s = str(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyName())
+p = IPv6(s)
+isinstance(p.payload, ICMPv6NIReplyName)
+
+= ICMPv6NIReplyIPv6 - dispatch
+s = str(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyIPv6())
+p = IPv6(s)
+isinstance(p.payload, ICMPv6NIReplyIPv6)
+
+= ICMPv6NIReplyIPv4 - dispatch
+s = str(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyIPv4())
+p = IPv6(s)
+isinstance(p.payload, ICMPv6NIReplyIPv4)
+
+= ICMPv6NIReplyRefuse - dispatch
+s = str(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyRefuse())
+p = IPv6(s)
+isinstance(p.payload, ICMPv6NIReplyRefuse)
+
+= ICMPv6NIReplyUnknown - dispatch
+s = str(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyUnknown())
+p = IPv6(s)
+isinstance(p.payload, ICMPv6NIReplyUnknown)
+
+
+
+#####################################################################
++ Test Node Information Query - ICMPv6NIReplyNOOP
+
+= ICMPv6NIReplyNOOP - single DNS name without hint => understood as string (internal)
+a=ICMPv6NIReplyNOOP(data="abricot").getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 0 and type(a[1]) is str and a[1] == "abricot"
+
+= ICMPv6NIReplyNOOP - single DNS name without hint => understood as string
+ICMPv6NIReplyNOOP(data="abricot").data == "abricot"
+
+= ICMPv6NIReplyNOOP - fqdn without hint => understood as string (internal)
+a=ICMPv6NIReplyNOOP(data="n.d.tld").getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 0 and type(a[1]) is str and a[1] == "n.d.tld"
+
+= ICMPv6NIReplyNOOP - fqdn without hint => understood as string
+ICMPv6NIReplyNOOP(data="n.d.tld").data == "n.d.tld"
+
+= ICMPv6NIReplyNOOP - IPv6 address without hint => understood as string (internal)
+a=ICMPv6NIReplyNOOP(data="2001:0db8::1").getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 0 and type(a[1]) is str and a[1] == "2001:0db8::1"
+
+= ICMPv6NIReplyNOOP - IPv6 address without hint => understood as string
+ICMPv6NIReplyNOOP(data="2001:0db8::1").data == "2001:0db8::1"
+
+= ICMPv6NIReplyNOOP - IPv4 address without hint => understood as string (internal)
+a=ICMPv6NIReplyNOOP(data="169.254.253.010").getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 0 and type(a[1]) is str and a[1] == "169.254.253.010"
+
+= ICMPv6NIReplyNOOP - IPv4 address without hint => understood as string
+ICMPv6NIReplyNOOP(data="169.254.253.010").data == "169.254.253.010"
+
+
+#####################################################################
++ Test Node Information Query - ICMPv6NIReplyName
+
+= ICMPv6NIReplyName - single label DNS name as a string (without ttl) (internal)
+a=ICMPv6NIReplyName(data="abricot").getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 2 and type(a[1]) is list and len(a[1]) == 2 and a[1][0] == 0 and a[1][1] == '\x07abricot\x00\x00'
+
+= ICMPv6NIReplyName - single label DNS name as a string (without ttl)
+ICMPv6NIReplyName(data="abricot").data == [0, "abricot"]
+
+= ICMPv6NIReplyName - fqdn name as a string (without ttl) (internal)
+a=ICMPv6NIReplyName(data="n.d.tld").getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 2 and type(a[1]) is list and len(a[1]) == 2 and a[1][0] == 0 and a[1][1] == '\x01n\x01d\x03tld\x00'
+
+= ICMPv6NIReplyName - fqdn name as a string (without ttl)
+ICMPv6NIReplyName(data="n.d.tld").data == [0, 'n.d.tld']
+
+= ICMPv6NIReplyName - list of 2 single label DNS names (without ttl) (internal)
+a=ICMPv6NIReplyName(data=["abricot", "poire"]).getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 2 and type(a[1]) is list and len(a[1]) == 2 and a[1][0] == 0 and a[1][1] == '\x07abricot\x00\x00\x05poire\x00\x00'
+
+= ICMPv6NIReplyName - list of 2 single label DNS names (without ttl)
+ICMPv6NIReplyName(data=["abricot", "poire"]).data == [0, "abricot", "poire"]
+
+= ICMPv6NIReplyName - [ttl, single-label, single-label, fqdn] (internal)
+a=ICMPv6NIReplyName(data=[42, "abricot", "poire", "n.d.tld"]).getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 2 and type(a[1]) is list and len(a[1]) == 2 and a[1][0] == 42 and a[1][1] == '\x07abricot\x00\x00\x05poire\x00\x00\x01n\x01d\x03tld\x00'
+
+= ICMPv6NIReplyName - [ttl, single-label, single-label, fqdn]
+ICMPv6NIReplyName(data=[42, "abricot", "poire", "n.d.tld"]).data == [42, "abricot", "poire", "n.d.tld"]
+
+
+#####################################################################
++ Test Node Information Query - ICMPv6NIReplyIPv6
+
+= ICMPv6NIReplyIPv6 - one IPv6 address without TTL (internal)
+a=ICMPv6NIReplyIPv6(data="2001:db8::1").getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 3 and type(a[1]) is list and len(a[1]) == 1 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 0 and a[1][0][1] == "2001:db8::1"
+
+= ICMPv6NIReplyIPv6 - one IPv6 address without TTL
+ICMPv6NIReplyIPv6(data="2001:db8::1").data == [(0, '2001:db8::1')]
+
+= ICMPv6NIReplyIPv6 - one IPv6 address without TTL (as a list) (internal)
+a=ICMPv6NIReplyIPv6(data=["2001:db8::1"]).getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 3 and type(a[1]) is list and len(a[1]) == 1 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 0 and a[1][0][1] == "2001:db8::1"
+
+= ICMPv6NIReplyIPv6 - one IPv6 address without TTL (as a list)
+ICMPv6NIReplyIPv6(data=["2001:db8::1"]).data == [(0, '2001:db8::1')]
+
+= ICMPv6NIReplyIPv6 - one IPv6 address with TTL (internal)
+a=ICMPv6NIReplyIPv6(data=[(0, "2001:db8::1")]).getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 3 and type(a[1]) is list and len(a[1]) == 1 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 0 and a[1][0][1] == "2001:db8::1"
+
+= ICMPv6NIReplyIPv6 - one IPv6 address with TTL
+ICMPv6NIReplyIPv6(data=[(0, "2001:db8::1")]).data == [(0, '2001:db8::1')]
+
+= ICMPv6NIReplyIPv6 - two IPv6 addresses as a list of strings (without TTL) (internal)
+a=ICMPv6NIReplyIPv6(data=["2001:db8::1", "2001:db8::2"]).getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 3 and type(a[1]) is list and len(a[1]) == 2 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 0 and a[1][0][1] == "2001:db8::1" and len(a[1][1]) == 2 and a[1][1][0] == 0 and a[1][1][1] == "2001:db8::2"
+
+= ICMPv6NIReplyIPv6 - two IPv6 addresses as a list of strings (without TTL)
+ICMPv6NIReplyIPv6(data=["2001:db8::1", "2001:db8::2"]).data == [(0, '2001:db8::1'), (0, '2001:db8::2')]
+
+= ICMPv6NIReplyIPv6 - two IPv6 addresses as a list (first with ttl, second without) (internal)
+a=ICMPv6NIReplyIPv6(data=[(42, "2001:db8::1"), "2001:db8::2"]).getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 3 and type(a[1]) is list and len(a[1]) == 2 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 42 and a[1][0][1] == "2001:db8::1" and len(a[1][1]) == 2 and a[1][1][0] == 0 and a[1][1][1] == "2001:db8::2"
+
+= ICMPv6NIReplyIPv6 - two IPv6 addresses as a list (first with ttl, second without)
+ICMPv6NIReplyIPv6(data=[(42, "2001:db8::1"), "2001:db8::2"]).data == [(42, "2001:db8::1"), (0, "2001:db8::2")]
+
+
+#####################################################################
++ Test Node Information Query - ICMPv6NIReplyIPv4
+
+= ICMPv6NIReplyIPv4 - one IPv4 address without TTL (internal)
+a=ICMPv6NIReplyIPv4(data="169.254.253.252").getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 4 and type(a[1]) is list and len(a[1]) == 1 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 0 and a[1][0][1] == "169.254.253.252"
+
+= ICMPv6NIReplyIPv4 - one IPv4 address without TTL
+ICMPv6NIReplyIPv4(data="169.254.253.252").data == [(0, '169.254.253.252')]
+
+= ICMPv6NIReplyIPv4 - one IPv4 address without TTL (as a list) (internal)
+a=ICMPv6NIReplyIPv4(data=["169.254.253.252"]).getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 4 and type(a[1]) is list and len(a[1]) == 1 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 0 and a[1][0][1] == "169.254.253.252"
+
+= ICMPv6NIReplyIPv4 - one IPv4 address without TTL (as a list)
+ICMPv6NIReplyIPv4(data=["169.254.253.252"]).data == [(0, '169.254.253.252')]
+
+= ICMPv6NIReplyIPv4 - one IPv4 address with TTL (internal)
+a=ICMPv6NIReplyIPv4(data=[(0, "169.254.253.252")]).getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 4 and type(a[1]) is list and len(a[1]) == 1 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 0 and a[1][0][1] == "169.254.253.252"
+
+= ICMPv6NIReplyIPv4 - one IPv4 address with TTL (internal)
+ICMPv6NIReplyIPv4(data=[(0, "169.254.253.252")]).data == [(0, '169.254.253.252')]
+
+= ICMPv6NIReplyIPv4 - two IPv4 addresses as a list of strings (without TTL)
+a=ICMPv6NIReplyIPv4(data=["169.254.253.252", "169.254.253.253"]).getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 4 and type(a[1]) is list and len(a[1]) == 2 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 0 and a[1][0][1] == "169.254.253.252" and len(a[1][1]) == 2 and a[1][1][0] == 0 and a[1][1][1] == "169.254.253.253"
+
+= ICMPv6NIReplyIPv4 - two IPv4 addresses as a list of strings (without TTL) (internal)
+ICMPv6NIReplyIPv4(data=["169.254.253.252", "169.254.253.253"]).data == [(0, '169.254.253.252'), (0, '169.254.253.253')]
+
+= ICMPv6NIReplyIPv4 - two IPv4 addresses as a list (first with ttl, second without)
+a=ICMPv6NIReplyIPv4(data=[(42, "169.254.253.252"), "169.254.253.253"]).getfieldval("data")
+type(a) is tuple and len(a) == 2 and a[0] == 4 and type(a[1]) is list and len(a[1]) == 2 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 42 and a[1][0][1] == "169.254.253.252" and len(a[1][1]) == 2 and a[1][1][0] == 0 and a[1][1][1] == "169.254.253.253"
+
+= ICMPv6NIReplyIPv4 - two IPv4 addresses as a list (first with ttl, second without) (internal)
+ICMPv6NIReplyIPv4(data=[(42, "169.254.253.252"), "169.254.253.253"]).data == [(42, "169.254.253.252"), (0, "169.254.253.253")]
+
+#####################################################################
++ Test Node Information Query - ICMPv6NIReplyRefuse
+= ICMPv6NIReplyRefuse - basic instantiation
+str(ICMPv6NIReplyRefuse())[:8] == '\x8c\x01\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6NIReplyRefuse - basic dissection
+a=ICMPv6NIReplyRefuse('\x8c\x01\x00\x00\x00\x00\x00\x00\xf1\xe9\xab\xc9\x8c\x0by\x18')
+a.type == 140 and a.code == 1 and a.cksum == 0 and a.unused == 0 and a.flags == 0 and a.nonce == '\xf1\xe9\xab\xc9\x8c\x0by\x18' and a.data == None
+
+#####################################################################
++ Test Node Information Query - ICMPv6NIReplyUnknown
+
+= ICMPv6NIReplyUnknown - basic instantiation
+str(ICMPv6NIReplyUnknown(nonce='\x00'*8)) == '\x8c\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= ICMPv6NIReplyRefuse - basic dissection
+a=ICMPv6NIReplyRefuse('\x8c\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+a.type == 140 and a.code == 2 and a.cksum == 0 and a.unused == 0 and a.flags == 0 and a.nonce == '\x00'*8 and a.data == None
+
+########### IPv6ExtHdrFragment Class ##########################
++ IPv6ExtHdrFragment Class Test
+
+= IPv6ExtHdrFragment - Basic Instantiation
+str(IPv6ExtHdrFragment()) == ';\x00\x00\x00\x00\x00\x00\x00'
+
+= IPv6ExtHdrFragment - Instantiation with specific values
+str(IPv6ExtHdrFragment(nh=0xff, res1=0xee, offset=0x1fff, res2=1, m=1, id=0x11111111)) == '\xff\xee\xff\xfb\x11\x11\x11\x11'
+
+= IPv6ExtHdrFragment - Basic Dissection
+a=IPv6ExtHdrFragment(';\x00\x00\x00\x00\x00\x00\x00')
+a.nh == 59 and a.res1 == 0 and a.offset == 0 and a.res2 == 0 and a.m == 0 and a.id == 0
+
+= IPv6ExtHdrFragment - Instantiation with specific values
+a=IPv6ExtHdrFragment('\xff\xee\xff\xfb\x11\x11\x11\x11')
+a.nh == 0xff and a.res1 == 0xee and a.offset==0x1fff and a.res2==1 and a.m == 1 and a.id == 0x11111111
+
+
+########### fragment6() function ####################################
++ Test fragment6 function
+
+= fragment6 - test against a long TCP packet with a 1280 MTU
+l=fragment6(IPv6()/IPv6ExtHdrFragment()/TCP()/Raw(load="A"*40000), 1280)
+len(l) == 33 and len(str(l[-1])) == 644
+
+
+########### defragment6() function ####################################
++ Test defragment6 function
+
+= defragment6 - test against a long TCP packet fragmented with a 1280 MTU
+l=fragment6(IPv6()/IPv6ExtHdrFragment()/TCP()/Raw(load="A"*40000), 1280)
+str(defragment6(l)) == ('`\x00\x00\x00\x9cT\x06@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xe92\x00\x00' + 'A'*40000)
+
+
+= defragment6 - test against a large TCP packet fragmented with a 1280 bytes MTU and missing fragments
+l=fragment6(IPv6()/IPv6ExtHdrFragment()/TCP()/Raw(load="A"*40000), 1280)
+del(l[2])
+del(l[4])
+del(l[12])
+del(l[18])
+str(defragment6(l)) == ('`\x00\x00\x00\x9cT\x06@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xe92\x00\x00' + 2444*'A' + 1232*'X' + 2464*'A' + 1232*'X' + 9856*'A' + 1232*'X' + 7392*'A' + 1232*'X' + 12916*'A')
+
+
+= defragment6 - test against a TCP packet fragmented with a 800 bytes MTU and missing fragments
+l=fragment6(IPv6()/IPv6ExtHdrFragment()/TCP()/Raw(load="A"*4000), 800)
+del(l[4])
+del(l[2])
+str(defragment6(l)) == '`\x00\x00\x00\x0f\xb4\x06@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xb2\x0f\x00\x00AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
+
+########### Route6 Class ############################################
+
++ Test Route6 class
+
+= Route6 - Route6 flushing
+conf.route6.routes=[
+( '::1', 128, '::', 'lo', ['::1']),
+( 'fe80::20f:1fff:feca:4650', 128, '::', 'lo', ['::1'])]
+conf.route6.flush()
+not conf.route6.routes
+
+= Route6 - Route6.route
+conf.route6.flush()
+conf.route6.routes=[
+( '::1', 128, '::', 'lo', ['::1']),
+( 'fe80::20f:1fff:feca:4650', 128, '::', 'lo', ['::1']),
+( 'fe80::', 64, '::', 'eth0', ['fe80::20f:1fff:feca:4650']),
+('2001:db8:0:4444:20f:1fff:feca:4650', 128, '::', 'lo', ['::1']),
+( '2001:db8:0:4444::', 64, '::', 'eth0', ['2001:db8:0:4444:20f:1fff:feca:4650']),
+( '::', 0, 'fe80::20f:34ff:fe8a:8aa1', 'eth0', ['2001:db8:0:4444:20f:1fff:feca:4650', '2002:db8:0:4444:20f:1fff:feca:4650'])
+]
+conf.route6.route("2002::1") == ('eth0', '2002:db8:0:4444:20f:1fff:feca:4650', 'fe80::20f:34ff:fe8a:8aa1') and conf.route6.route("2001::1") == ('eth0', '2001:db8:0:4444:20f:1fff:feca:4650', 'fe80::20f:34ff:fe8a:8aa1') and conf.route6.route("fe80::20f:1fff:feab:4870") == ('eth0', 'fe80::20f:1fff:feca:4650', '::') and conf.route6.route("::1") == ('lo', '::1', '::') and conf.route6.route("::") == ('eth0', '2001:db8:0:4444:20f:1fff:feca:4650', 'fe80::20f:34ff:fe8a:8aa1')
+
+
+# There are many other to do.
+
+# Below is our Homework : here is the mountain ...
+
+
+
+########### Net6 Class ##############################################
+########### ICMPv6MLQuery Class #####################################
+########### ICMPv6MLReport Class ####################################
+########### ICMPv6MLDone Class ######################################
+########### ICMPv6ND_Redirect Class #################################
+########### ICMPv6NDOptSrcAddrList Class ############################
+########### ICMPv6NDOptTgtAddrList Class ############################
+########### ICMPv6ND_INDSol Class ###################################
+########### ICMPv6ND_INDAdv Class ###################################
+########### ICMPerror6 Class ########################################
+########### TracerouteResult6 Class #################################
+
+
+
+
+
+#####################################################################
+#####################################################################
+########################## DHCPv6 ##########################
+#####################################################################
+#####################################################################
+
+
+#####################################################################
++ Test DHCP6 DUID_LLT
+
+= DUID_LLT basic instantiation
+a=DUID_LLT()
+
+= DUID_LLT basic build
+str(DUID_LLT()) == '\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= DUID_LLT build with specific values
+str(DUID_LLT(lladdr="ff:ff:ff:ff:ff:ff", timeval=0x11111111, hwtype=0x2222)) == '\x00\x01""\x11\x11\x11\x11\xff\xff\xff\xff\xff\xff'
+
+= DUID_LLT basic dissection
+a=DUID_LLT(str(DUID_LLT()))
+a.type == 1 and a.hwtype == 1 and a.timeval == 0 and a.lladdr == "00:00:00:00:00:00"
+
+= DUID_LLT dissection with specific values
+a=DUID_LLT('\x00\x01""\x11\x11\x11\x11\xff\xff\xff\xff\xff\xff')
+a.type == 1 and a.hwtype == 0x2222 and a.timeval == 0x11111111 and a.lladdr == "ff:ff:ff:ff:ff:ff"
+
+
+#####################################################################
++ Test DHCP6 DUID_EN
+
+= DUID_EN basic instantiation
+a=DUID_EN()
+
+= DUID_EN basic build
+str(DUID_EN()) == '\x00\x02\x00\x00\x017'
+
+= DUID_EN build with specific values
+str(DUID_EN(enterprisenum=0x11111111, id="iamastring")) == '\x00\x02\x11\x11\x11\x11iamastring'
+
+= DUID_EN basic dissection
+a=DUID_EN('\x00\x02\x00\x00\x017')
+a.type == 2 and a.enterprisenum == 311
+
+= DUID_EN dissection with specific values
+a=DUID_EN('\x00\x02\x11\x11\x11\x11iamastring')
+a.type == 2 and a.enterprisenum == 0x11111111 and a.id =="iamastring"
+
+
+#####################################################################
++ Test DHCP6 DUID_LL
+
+= DUID_LL basic instantiation
+a=DUID_LL()
+
+= DUID_LL basic build
+str(DUID_LL()) == '\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00'
+
+= DUID_LL build with specific values
+str(DUID_LL(hwtype=1, lladdr="ff:ff:ff:ff:ff:ff")) == '\x00\x03\x00\x01\xff\xff\xff\xff\xff\xff'
+
+= DUID_LL basic dissection
+a=DUID_LL(str(DUID_LL()))
+a.type == 3 and a.hwtype == 1 and a.lladdr == "00:00:00:00:00:00"
+
+= DUID_LL with specific values
+a=DUID_LL('\x00\x03\x00\x01\xff\xff\xff\xff\xff\xff')
+a.hwtype == 1 and a.lladdr == "ff:ff:ff:ff:ff:ff"
+
+
+#####################################################################
++ Test DHCP6 Opt Unknown
+
+= DHCP6 Opt Unknown basic instantiation
+a=DHCP6OptUnknown()
+
+= DHCP6 Opt Unknown basic build (default values)
+str(DHCP6OptUnknown()) == '\x00\x00\x00\x00'
+
+= DHCP6 Opt Unknown - len computation test
+str(DHCP6OptUnknown(data="shouldbe9")) == '\x00\x00\x00\tshouldbe9'
+
+
+#####################################################################
++ Test DHCP6 Client Identifier option
+
+= DHCP6OptClientId basic instantiation
+a=DHCP6OptClientId()
+
+= DHCP6OptClientId basic build
+str(DHCP6OptClientId()) == '\x00\x01\x00\x00'
+
+= DHCP6OptClientId instantiation with specific values
+str(DHCP6OptClientId(duid="toto")) == '\x00\x01\x00\x04toto'
+
+= DHCP6OptClientId instantiation with DUID_LL
+str(DHCP6OptClientId(duid=DUID_LL())) == '\x00\x01\x00\n\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00'
+
+= DHCP6OptClientId instantiation with DUID_LLT
+str(DHCP6OptClientId(duid=DUID_LLT())) == '\x00\x01\x00\x0e\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= DHCP6OptClientId instantiation with DUID_EN
+str(DHCP6OptClientId(duid=DUID_EN())) == '\x00\x01\x00\x06\x00\x02\x00\x00\x017'
+
+= DHCP6OptClientId instantiation with specified length
+str(DHCP6OptClientId(optlen=80, duid="somestring")) == '\x00\x01\x00Psomestring'
+
+= DHCP6OptClientId basic dissection
+a=DHCP6OptClientId('\x00\x01\x00\x00')
+a.optcode == 1 and a.optlen == 0
+
+= DHCP6OptClientId instantiation with specified length
+str(DHCP6OptClientId(optlen=80, duid="somestring")) == '\x00\x01\x00Psomestring'
+
+= DHCP6OptClientId basic dissection
+a=DHCP6OptClientId('\x00\x01\x00\x00')
+a.optcode == 1 and a.optlen == 0
+
+= DHCP6OptClientId dissection with specific duid value
+a=DHCP6OptClientId('\x00\x01\x00\x04somestring')
+a.optcode == 1 and a.optlen == 4 and isinstance(a.duid, Raw) and a.duid.load == 'some' and isinstance(a.payload, DHCP6OptUnknown)
+
+= DHCP6OptClientId dissection with specific DUID_LL as duid value
+a=DHCP6OptClientId('\x00\x01\x00\n\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00')
+a.optcode == 1 and a.optlen == 10 and isinstance(a.duid, DUID_LL) and a.duid.type == 3 and a.duid.hwtype == 1 and a.duid.lladdr == "00:00:00:00:00:00"
+
+= DHCP6OptClientId dissection with specific DUID_LLT as duid value
+a=DHCP6OptClientId('\x00\x01\x00\x0e\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+a.optcode == 1 and a.optlen == 14 and isinstance(a.duid, DUID_LLT) and a.duid.type == 1 and a.duid.hwtype == 1 and a.duid.timeval == 0 and a.duid.lladdr == "00:00:00:00:00:00"
+
+= DHCP6OptClientId dissection with specific DUID_EN as duid value
+a=DHCP6OptClientId('\x00\x01\x00\x06\x00\x02\x00\x00\x017')
+a.optcode == 1 and a.optlen == 6 and isinstance(a.duid, DUID_EN) and a.duid.type == 2 and a.duid.enterprisenum == 311 and a.duid.id == ""
+
+#####################################################################
++ Test DHCP6 Server Identifier option
+
+= DHCP6OptServerId basic instantiation
+a=DHCP6OptServerId()
+
+= DHCP6OptServerId basic build
+str(DHCP6OptServerId()) == '\x00\x02\x00\x00'
+
+= DHCP6OptServerId basic build with specific values
+str(DHCP6OptServerId(duid="toto")) == '\x00\x02\x00\x04toto'
+
+= DHCP6OptServerId instantiation with DUID_LL
+str(DHCP6OptServerId(duid=DUID_LL())) == '\x00\x02\x00\n\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00'
+
+= DHCP6OptServerId instantiation with DUID_LLT
+str(DHCP6OptServerId(duid=DUID_LLT())) == '\x00\x02\x00\x0e\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= DHCP6OptServerId instantiation with DUID_EN
+str(DHCP6OptServerId(duid=DUID_EN())) == '\x00\x02\x00\x06\x00\x02\x00\x00\x017'
+
+= DHCP6OptServerId instantiation with specified length
+str(DHCP6OptServerId(optlen=80, duid="somestring")) == '\x00\x02\x00Psomestring'
+
+= DHCP6OptServerId basic dissection
+a=DHCP6OptServerId('\x00\x02\x00\x00')
+a.optcode == 2 and a.optlen == 0
+
+= DHCP6OptServerId dissection with specific duid value
+a=DHCP6OptServerId('\x00\x02\x00\x04somestring')
+a.optcode == 2 and a.optlen == 4 and isinstance(a.duid, Raw) and a.duid.load == 'some' and isinstance(a.payload, DHCP6OptUnknown)
+
+= DHCP6OptServerId dissection with specific DUID_LL as duid value
+a=DHCP6OptServerId('\x00\x02\x00\n\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00')
+a.optcode == 2 and a.optlen == 10 and isinstance(a.duid, DUID_LL) and a.duid.type == 3 and a.duid.hwtype == 1 and a.duid.lladdr == "00:00:00:00:00:00"
+
+= DHCP6OptServerId dissection with specific DUID_LLT as duid value
+a=DHCP6OptServerId('\x00\x02\x00\x0e\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+a.optcode == 2 and a.optlen == 14 and isinstance(a.duid, DUID_LLT) and a.duid.type == 1 and a.duid.hwtype == 1 and a.duid.timeval == 0 and a.duid.lladdr == "00:00:00:00:00:00"
+
+= DHCP6OptServerId dissection with specific DUID_EN as duid value
+a=DHCP6OptServerId('\x00\x02\x00\x06\x00\x02\x00\x00\x017')
+a.optcode == 2 and a.optlen == 6 and isinstance(a.duid, DUID_EN) and a.duid.type == 2 and a.duid.enterprisenum == 311 and a.duid.id == ""
+
+#####################################################################
++ Test DHCP6 IA Address Option (IA_TA or IA_NA suboption)
+
+= DHCP6OptIAAddress - Basic Instantiation
+str(DHCP6OptIAAddress()) == '\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= DHCP6OptIAAddress - Basic Dissection
+a = DHCP6OptIAAddress('\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+a.optcode == 5 and a.optlen == 24 and a.addr == "::" and a.preflft == 0 and a. validlft == 0 and a.iaid == 0 and a.iaaddropts == ""
+
+= DHCP6OptIAAddress - Instantiation with specific values
+str(DHCP6OptIAAddress(optlen=0x1111, addr="2222:3333::5555", preflft=0x66666666, validlft=0x77777777, iaid=0x88888888, iaaddropts="somestring")) == '\x00\x05\x11\x11""33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00UUffffwwww\x88\x88\x88\x88somestring'
+
+= DHCP6OptIAAddress - Instantiation with specific values (default optlen computation)
+str(DHCP6OptIAAddress(addr="2222:3333::5555", preflft=0x66666666, validlft=0x77777777, iaid=0x88888888, iaaddropts="somestring")) == '\x00\x05\x00"""33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00UUffffwwww\x88\x88\x88\x88somestring'
+
+= DHCP6OptIAAddress - Dissection with specific values
+a = DHCP6OptIAAddress('\x00\x05\x00"""33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00UUffffwwww\x88\x88\x88\x88somestring')
+a.optcode == 5 and a.optlen == 34 and a.addr == "2222:3333::5555" and a.preflft == 0x66666666 and a. validlft == 0x77777777 and a.iaid == 0x88888888 and a.iaaddropts == "somestring"
+
+
+#####################################################################
++ Test DHCP6 Identity Association for Non-temporary Addresses Option
+
+= DHCP6OptIA_NA - Basic Instantiation
+str(DHCP6OptIA_NA()) == '\x00\x03\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= DHCP6OptIA_NA - Basic Dissection
+a = DHCP6OptIA_NA('\x00\x03\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+a.optcode == 3 and a.optlen == 12 and a.iaid == 0 and a.T1 == 0 and a.T2==0 and a.ianaopts == []
+
+= DHCP6OptIA_NA - Instantiation with specific values (keep automatic length computation)
+str(DHCP6OptIA_NA(iaid=0x22222222, T1=0x33333333, T2=0x44444444)) == '\x00\x03\x00\x0c""""3333DDDD'
+
+= DHCP6OptIA_NA - Instantiation with specific values (forced optlen)
+str(DHCP6OptIA_NA(optlen=0x1111, iaid=0x22222222, T1=0x33333333, T2=0x44444444)) == '\x00\x03\x11\x11""""3333DDDD'
+
+= DHCP6OptIA_NA - Instantiation with a list of IA Addresses (optlen automatic computation)
+str(DHCP6OptIA_NA(iaid=0x22222222, T1=0x33333333, T2=0x44444444, ianaopts=[DHCP6OptIAAddress(), DHCP6OptIAAddress()])) == '\x00\x03\x00L""""3333DDDD\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= DHCP6OptIA_NA - Dissection with specific values
+a = DHCP6OptIA_NA('\x00\x03\x00L""""3333DDDD\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+a.optcode == 3 and a.optlen == 76 and a.iaid == 0x22222222 and a.T1 == 0x33333333 and a.T2==0x44444444 and len(a.ianaopts) == 2 and isinstance(a.ianaopts[0], DHCP6OptIAAddress) and isinstance(a.ianaopts[1], DHCP6OptIAAddress)
+
+
+#####################################################################
++ Test DHCP6 Identity Association for Temporary Addresses Option
+
+= DHCP6OptIA_TA - Basic Instantiation
+str(DHCP6OptIA_TA()) == '\x00\x04\x00\x04\x00\x00\x00\x00'
+
+= DHCP6OptIA_TA - Basic Dissection
+a = DHCP6OptIA_TA('\x00\x04\x00\x04\x00\x00\x00\x00')
+a.optcode == 4 and a.optlen == 4 and a.iaid == 0 and a.iataopts == []
+
+= DHCP6OptIA_TA - Instantiation with specific values
+str(DHCP6OptIA_TA(optlen=0x1111, iaid=0x22222222, iataopts=[DHCP6OptIAAddress(), DHCP6OptIAAddress()])) == '\x00\x04\x11\x11""""\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= DHCP6OptIA_TA - Dissection with specific values
+a = DHCP6OptIA_TA('\x00\x04\x11\x11""""\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+a.optcode == 4 and a.optlen == 0x1111 and a.iaid == 0x22222222 and len(a.iataopts) == 2 and isinstance(a.iataopts[0], DHCP6OptIAAddress) and isinstance(a.iataopts[1], DHCP6OptIAAddress)
+
+
+#####################################################################
++ Test DHCP6 Option Request Option
+
+= DHCP6OptOptReq - Basic Instantiation
+str(DHCP6OptOptReq()) == '\x00\x06\x00\x04\x00\x17\x00\x18'
+
+= DHCP6OptOptReq - optlen field computation
+str(DHCP6OptOptReq(reqopts=[1,2,3,4])) == '\x00\x06\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04'
+
+= DHCP6OptOptReq - instantiation with empty list
+str(DHCP6OptOptReq(reqopts=[])) == '\x00\x06\x00\x00'
+
+= DHCP6OptOptReq - Basic dissection
+a=DHCP6OptOptReq('\x00\x06\x00\x00')
+a.optcode == 6 and a.optlen == 0 and a.reqopts == [23,24]
+
+= DHCP6OptOptReq - Dissection with specific value
+a=DHCP6OptOptReq('\x00\x06\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04')
+a.optcode == 6 and a.optlen == 8 and a.reqopts == [1,2,3,4]
+
+
+#####################################################################
++ Test DHCP6 Option - Preference option
+
+= DHCP6OptPref - Basic instantiation
+str(DHCP6OptPref()) == '\x00\x07\x00\x01\xff'
+
+= DHCP6OptPref - Instantiation with specific values
+str(DHCP6OptPref(optlen=0xffff, prefval= 0x11)) == '\x00\x07\xff\xff\x11'
+
+= DHCP6OptPref - Basic Dissection
+a=DHCP6OptPref('\x00\x07\x00\x01\xff')
+a.optcode == 7 and a.optlen == 1 and a.prefval == 255
+
+= DHCP6OptPref - Dissection with specific values
+a=DHCP6OptPref('\x00\x07\xff\xff\x11')
+a.optcode == 7 and a.optlen == 0xffff and a.prefval == 0x11
+
+
+#####################################################################
++ Test DHCP6 Option - Elapsed Time
+
+= DHCP6OptElapsedTime - Basic Instantiation
+str(DHCP6OptElapsedTime()) == '\x00\x08\x00\x02\x00\x00'
+
+= DHCP6OptElapsedTime - Instantiation with specific elapsedtime value
+str(DHCP6OptElapsedTime(elapsedtime=421)) == '\x00\x08\x00\x02\x01\xa5'
+
+= DHCP6OptElapsedTime - Basic Dissection
+a=DHCP6OptElapsedTime('\x00\x08\x00\x02\x00\x00')
+a.optcode == 8 and a.optlen == 2 and a.elapsedtime == 0
+
+= DHCP6OptElapsedTime - Dissection with specific values
+a=DHCP6OptElapsedTime('\x00\x08\x00\x02\x01\xa5')
+a.optcode == 8 and a.optlen == 2 and a.elapsedtime == 421
+
+
+#####################################################################
++ Test DHCP6 Option - Server Unicast Address
+
+= DHCP6OptServerUnicast - Basic Instantiation
+str(DHCP6OptServerUnicast()) == '\x00\x0c\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= DHCP6OptServerUnicast - Instantiation with specific values (test 1)
+str(DHCP6OptServerUnicast(srvaddr="2001::1")) == '\x00\x0c\x00\x10 \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
+
+= DHCP6OptServerUnicast - Instantiation with specific values (test 2)
+str(DHCP6OptServerUnicast(srvaddr="2001::1", optlen=42)) == '\x00\x0c\x00* \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
+
+= DHCP6OptServerUnicast - Dissection with default values
+a=DHCP6OptServerUnicast('\x00\x0c\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+a.optcode == 12 and a.optlen == 16 and a.srvaddr == "::"
+
+= DHCP6OptServerUnicast - Dissection with specific values (test 1)
+a=DHCP6OptServerUnicast('\x00\x0c\x00\x10 \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
+a.optcode == 12 and a.optlen == 16 and a.srvaddr == "2001::1"
+
+= DHCP6OptServerUnicast - Dissection with specific values (test 2)
+a=DHCP6OptServerUnicast('\x00\x0c\x00* \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
+a.optcode == 12 and a.optlen == 42 and a.srvaddr == "2001::1"
+
+
+#####################################################################
++ Test DHCP6 Option - Status Code
+
+= DHCP6OptStatusCode - Basic Instantiation
+str(DHCP6OptStatusCode()) == '\x00\r\x00\x02\x00\x00'
+
+= DHCP6OptStatusCode - Instantiation with specific values
+str(DHCP6OptStatusCode(optlen=42, statuscode=0xff, statusmsg="Hello")) == '\x00\r\x00*\x00\xffHello'
+
+= DHCP6OptStatusCode - Automatic Length computation
+str(DHCP6OptStatusCode(statuscode=0xff, statusmsg="Hello")) == '\x00\r\x00\x07\x00\xffHello'
+
+# Add tests to verify Unicode behavior
+
+
+#####################################################################
++ Test DHCP6 Option - Rapid Commit
+
+= DHCP6OptRapidCommit - Basic Instantiation
+str(DHCP6OptRapidCommit()) == '\x00\x0e\x00\x00'
+
+= DHCP6OptRapidCommit - Basic Dissection
+a=DHCP6OptRapidCommit('\x00\x0e\x00\x00')
+a.optcode == 14 and a.optlen == 0
+
+
+#####################################################################
++ Test DHCP6 Option - User class
+
+= DHCP6OptUserClass - Basic Instantiation
+str(DHCP6OptUserClass()) == '\x00\x0f\x00\x00'
+
+= DHCP6OptUserClass - Basic Dissection
+a = DHCP6OptUserClass('\x00\x0f\x00\x00')
+a.optcode == 15 and a.optlen == 0 and a.userclassdata == []
+
+= DHCP6OptUserClass - Instantiation with one user class data structure
+str(DHCP6OptUserClass(userclassdata=[USER_CLASS_DATA(data="something")])) == '\x00\x0f\x00\x0b\x00\tsomething'
+
+= DHCP6OptUserClass - Dissection with one user class data structure
+a = DHCP6OptUserClass('\x00\x0f\x00\x0b\x00\tsomething')
+a.optcode == 15 and a.optlen == 11 and len(a.userclassdata) == 1 and isinstance(a.userclassdata[0], USER_CLASS_DATA) and a.userclassdata[0].len == 9 and a.userclassdata[0].data == 'something'
+
+= DHCP6OptUserClass - Instantiation with two user class data structures
+str(DHCP6OptUserClass(userclassdata=[USER_CLASS_DATA(data="something"), USER_CLASS_DATA(data="somethingelse")])) == '\x00\x0f\x00\x1a\x00\tsomething\x00\rsomethingelse'
+
+= DHCP6OptUserClass - Dissection with two user class data structures
+a = DHCP6OptUserClass('\x00\x0f\x00\x1a\x00\tsomething\x00\rsomethingelse')
+a.optcode == 15 and a.optlen == 26 and len(a.userclassdata) == 2 and isinstance(a.userclassdata[0], USER_CLASS_DATA) and isinstance(a.userclassdata[1], USER_CLASS_DATA) and a.userclassdata[0].len == 9 and a.userclassdata[0].data == 'something' and a.userclassdata[1].len == 13 and a.userclassdata[1].data == 'somethingelse'
+
+
+#####################################################################
++ Test DHCP6 Option - Vendor class
+
+= DHCP6OptVendorClass - Basic Instantiation
+str(DHCP6OptVendorClass()) == '\x00\x10\x00\x04\x00\x00\x00\x00'
+
+= DHCP6OptVendorClass - Basic Dissection
+a = DHCP6OptVendorClass('\x00\x10\x00\x04\x00\x00\x00\x00')
+a.optcode == 16 and a.optlen == 4 and a.enterprisenum == 0 and a.vcdata == []
+
+= DHCP6OptVendorClass - Instantiation with one vendor class data structure
+str(DHCP6OptVendorClass(vcdata=[VENDOR_CLASS_DATA(data="something")])) == '\x00\x10\x00\x0f\x00\x00\x00\x00\x00\tsomething'
+
+= DHCP6OptVendorClass - Dissection with one vendor class data structure
+a = DHCP6OptVendorClass('\x00\x10\x00\x0f\x00\x00\x00\x00\x00\tsomething')
+a.optcode == 16 and a.optlen == 15 and a.enterprisenum == 0 and len(a.vcdata) == 1 and isinstance(a.vcdata[0], VENDOR_CLASS_DATA) and a.vcdata[0].len == 9 and a.vcdata[0].data == 'something'
+
+= DHCP6OptVendorClass - Instantiation with two vendor class data structures
+str(DHCP6OptVendorClass(vcdata=[VENDOR_CLASS_DATA(data="something"), VENDOR_CLASS_DATA(data="somethingelse")])) == '\x00\x10\x00\x1e\x00\x00\x00\x00\x00\tsomething\x00\rsomethingelse'
+
+= DHCP6OptVendorClass - Dissection with two vendor class data structures
+a = DHCP6OptVendorClass('\x00\x10\x00\x1e\x00\x00\x00\x00\x00\tsomething\x00\rsomethingelse')
+a.optcode == 16 and a.optlen == 30 and a.enterprisenum == 0 and len(a.vcdata) == 2 and isinstance(a.vcdata[0], VENDOR_CLASS_DATA) and isinstance(a.vcdata[1], VENDOR_CLASS_DATA) and a.vcdata[0].len == 9 and a.vcdata[0].data == 'something' and a.vcdata[1].len == 13 and a.vcdata[1].data == 'somethingelse'
+
+
+#####################################################################
++ Test DHCP6 Option - Vendor-specific information
+
+= DHCP6OptVendorSpecificInfo - Basic Instantiation
+str(DHCP6OptVendorSpecificInfo()) == '\x00\x11\x00\x04\x00\x00\x00\x00'
+
+= DHCP6OptVendorSpecificInfo - Basic Dissection
+a = DHCP6OptVendorSpecificInfo('\x00\x11\x00\x04\x00\x00\x00\x00')
+a.optcode == 17 and a.optlen == 4 and a.enterprisenum == 0
+
+= DHCP6OptVendorSpecificInfo - Instantiation with specific values (one option)
+str(DHCP6OptVendorSpecificInfo(enterprisenum=0xeeeeeeee, vso=[VENDOR_SPECIFIC_OPTION(optcode=43, optdata="something")])) == '\x00\x11\x00\x11\xee\xee\xee\xee\x00+\x00\tsomething'
+
+= DHCP6OptVendorSpecificInfo - Dissection with with specific values (one option)
+a = DHCP6OptVendorSpecificInfo('\x00\x11\x00\x11\xee\xee\xee\xee\x00+\x00\tsomething')
+a.optcode == 17 and a.optlen == 17 and a.enterprisenum == 0xeeeeeeee and len(a.vso) == 1 and isinstance(a.vso[0], VENDOR_SPECIFIC_OPTION) and a.vso[0].optlen == 9 and a.vso[0].optdata == 'something'
+
+= DHCP6OptVendorSpecificInfo - Instantiation with specific values (two options)
+str(DHCP6OptVendorSpecificInfo(enterprisenum=0xeeeeeeee, vso=[VENDOR_SPECIFIC_OPTION(optcode=43, optdata="something"), VENDOR_SPECIFIC_OPTION(optcode=42, optdata="somethingelse")])) == '\x00\x11\x00"\xee\xee\xee\xee\x00+\x00\tsomething\x00*\x00\rsomethingelse'
+
+= DHCP6OptVendorSpecificInfo - Dissection with with specific values (two options)
+a = DHCP6OptVendorSpecificInfo('\x00\x11\x00"\xee\xee\xee\xee\x00+\x00\tsomething\x00*\x00\rsomethingelse')
+a.optcode == 17 and a.optlen == 34 and a.enterprisenum == 0xeeeeeeee and len(a.vso) == 2 and isinstance(a.vso[0], VENDOR_SPECIFIC_OPTION) and isinstance(a.vso[1], VENDOR_SPECIFIC_OPTION) and a.vso[0].optlen == 9 and a.vso[0].optdata == 'something' and a.vso[1].optlen == 13 and a.vso[1].optdata == 'somethingelse'
+
+
+#####################################################################
++ Test DHCP6 Option - Interface-Id
+
+= DHCP6OptIfaceId - Basic Instantiation
+str(DHCP6OptIfaceId()) == '\x00\x12\x00\x00'
+
+= DHCP6OptIfaceId - Basic Dissection
+a = DHCP6OptIfaceId('\x00\x12\x00\x00')
+a.optcode == 18 and a.optlen == 0
+
+= DHCP6OptIfaceId - Instantiation with specific value
+str(DHCP6OptIfaceId(ifaceid="something")) == '\x00\x12\x00\x09something'
+
+= DHCP6OptIfaceId - Dissection with specific value
+a = DHCP6OptIfaceId('\x00\x12\x00\x09something')
+a.optcode == 18 and a.optlen == 9 and a.ifaceid == "something"
+
+
+#####################################################################
++ Test DHCP6 Option - Reconfigure Message
+
+= DHCP6OptReconfMsg - Basic Instantiation
+str(DHCP6OptReconfMsg()) == '\x00\x13\x00\x01\x0b'
+
+= DHCP6OptReconfMsg - Basic Dissection
+a = DHCP6OptReconfMsg('\x00\x13\x00\x01\x0b')
+a.optcode == 19 and a.optlen == 1 and a.msgtype == 11
+
+= DHCP6OptReconfMsg - Instantiation with specific values
+str(DHCP6OptReconfMsg(optlen=4, msgtype=5)) == '\x00\x13\x00\x04\x05'
+
+= DHCP6OptReconfMsg - Dissection with specific values
+a = DHCP6OptReconfMsg('\x00\x13\x00\x04\x05')
+a.optcode == 19 and a.optlen == 4 and a.msgtype == 5
+
+
+#####################################################################
++ Test DHCP6 Option - Reconfigure Accept
+
+= DHCP6OptReconfAccept - Basic Instantiation
+str(DHCP6OptReconfAccept()) == '\x00\x14\x00\x00'
+
+= DHCP6OptReconfAccept - Basic Dissection
+a = DHCP6OptReconfAccept('\x00\x14\x00\x00')
+a.optcode == 20 and a.optlen == 0
+
+= DHCP6OptReconfAccept - Instantiation with specific values
+str(DHCP6OptReconfAccept(optlen=23)) == '\x00\x14\x00\x17'
+
+= DHCP6OptReconfAccept - Dssection with specific values
+a = DHCP6OptReconfAccept('\x00\x14\x00\x17')
+a.optcode == 20 and a.optlen == 23
+
+
+#####################################################################
++ Test DHCP6 Option - SIP Servers Domain Name List
+
+= DHCP6OptSIPDomains - Basic Instantiation
+str(DHCP6OptSIPDomains()) == '\x00\x15\x00\x00'
+
+= DHCP6OptSIPDomains - Basic Dissection
+a = DHCP6OptSIPDomains('\x00\x15\x00\x00')
+a.optcode == 21 and a.optlen == 0 and a.sipdomains == []
+
+= DHCP6OptSIPDomains - Instantiation with one domain
+str(DHCP6OptSIPDomains(sipdomains=["toto.example.org"])) == '\x00\x15\x00\x12\x04toto\x07example\x03org\x00'
+
+= DHCP6OptSIPDomains - Dissection with one domain
+a = DHCP6OptSIPDomains('\x00\x15\x00\x12\x04toto\x07example\x03org\x00')
+a.optcode == 21 and a.optlen == 18 and len(a.sipdomains) == 1 and a.sipdomains[0] == "toto.example.org"
+
+= DHCP6OptSIPDomains - Instantiation with two domains
+str(DHCP6OptSIPDomains(sipdomains=["toto.example.org", "titi.example.org"])) == '\x00\x15\x00$\x04toto\x07example\x03org\x00\x04titi\x07example\x03org\x00'
+
+= DHCP6OptSIPDomains - Dissection with two domains
+a = DHCP6OptSIPDomains('\x00\x15\x00$\x04toto\x07example\x03org\x00\x04TITI\x07example\x03org\x00')
+a.optcode == 21 and a.optlen == 36 and len(a.sipdomains) == 2 and a.sipdomains[0] == "toto.example.org" and a.sipdomains[1] == "TITI.example.org"
+
+= DHCP6OptSIPDomains - Enforcing only one dot at end of domain
+str(DHCP6OptSIPDomains(sipdomains=["toto.example.org."])) == '\x00\x15\x00\x12\x04toto\x07example\x03org\x00'
+
+
+#####################################################################
++ Test DHCP6 Option - SIP Servers IPv6 Address List
+
+= DHCP6OptSIPServers - Basic Instantiation
+str(DHCP6OptSIPServers()) == '\x00\x16\x00\x00'
+
+= DHCP6OptSIPServers - Basic Dissection
+a = DHCP6OptSIPServers('\x00\x16\x00\x00')
+a.optcode == 22 and a. optlen == 0 and a.sipservers == []
+
+= DHCP6OptSIPServers - Instantiation with specific values (1 address)
+str(DHCP6OptSIPServers(sipservers = ["2001:db8::1"] )) == '\x00\x16\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
+
+= DHCP6OptSIPServers - Dissection with specific values (1 address)
+a = DHCP6OptSIPServers('\x00\x16\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
+a.optcode == 22 and a.optlen == 16 and len(a.sipservers) == 1 and a.sipservers[0] == "2001:db8::1"
+
+= DHCP6OptSIPServers - Instantiation with specific values (2 addresses)
+str(DHCP6OptSIPServers(sipservers = ["2001:db8::1", "2001:db8::2"] )) == '\x00\x16\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02'
+
+= DHCP6OptSIPServers - Dissection with specific values (2 addresses)
+a = DHCP6OptSIPServers('\x00\x16\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02')
+a.optcode == 22 and a.optlen == 32 and len(a.sipservers) == 2 and a.sipservers[0] == "2001:db8::1" and a.sipservers[1] == "2001:db8::2"
+
+
+#####################################################################
++ Test DHCP6 Option - DNS Recursive Name Server
+
+= DHCP6OptDNSServers - Basic Instantiation
+str(DHCP6OptDNSServers()) == '\x00\x17\x00\x00'
+
+= DHCP6OptDNSServers - Basic Dissection
+a = DHCP6OptDNSServers('\x00\x17\x00\x00')
+a.optcode == 23 and a. optlen == 0 and a.dnsservers == []
+
+= DHCP6OptDNSServers - Instantiation with specific values (1 address)
+str(DHCP6OptDNSServers(dnsservers = ["2001:db8::1"] )) == '\x00\x17\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
+
+= DHCP6OptDNSServers - Dissection with specific values (1 address)
+a = DHCP6OptDNSServers('\x00\x17\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
+a.optcode == 23 and a.optlen == 16 and len(a.dnsservers) == 1 and a.dnsservers[0] == "2001:db8::1"
+
+= DHCP6OptDNSServers - Instantiation with specific values (2 addresses)
+str(DHCP6OptDNSServers(dnsservers = ["2001:db8::1", "2001:db8::2"] )) == '\x00\x17\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02'
+
+= DHCP6OptDNSServers - Dissection with specific values (2 addresses)
+a = DHCP6OptDNSServers('\x00\x17\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02')
+a.optcode == 23 and a.optlen == 32 and len(a.dnsservers) == 2 and a.dnsservers[0] == "2001:db8::1" and a.dnsservers[1] == "2001:db8::2"
+
+
+#####################################################################
++ Test DHCP6 Option - DNS Domain Search List Option
+
+= DHCP6OptDNSDomains - Basic Instantiation
+str(DHCP6OptDNSDomains()) == '\x00\x18\x00\x00'
+
+= DHCP6OptDNSDomains - Basic Dissection
+a = DHCP6OptDNSDomains('\x00\x18\x00\x00')
+a.optcode == 24 and a.optlen == 0 and a.dnsdomains == []
+
+= DHCP6OptDNSDomains - Instantiation with specific values (1 domain)
+str(DHCP6OptDNSDomains(dnsdomains=["toto.example.com"])) == '\x00\x18\x00\x12\x04toto\x07example\x03com\x00'
+
+= DHCP6OptDNSDomains - Dissection with specific values (1 domain)
+a = DHCP6OptDNSDomains('\x00\x18\x00\x12\x04toto\x07example\x03com\x00')
+a.optcode == 24 and a.optlen == 18 and len(a.dnsdomains) == 1 and a.dnsdomains[0] == "toto.example.com"
+
+= DHCP6OptDNSDomains - Instantiation with specific values (2 domains)
+str(DHCP6OptDNSDomains(dnsdomains=["toto.example.com", "titi.example.com"])) == '\x00\x18\x00$\x04toto\x07example\x03com\x00\x04titi\x07example\x03com\x00'
+
+= DHCP6OptDNSDomains - Dissection with specific values (2 domains)
+a = DHCP6OptDNSDomains('\x00\x18\x00$\x04toto\x07example\x03com\x00\x04titi\x07example\x03com\x00')
+a.optcode == 24 and a.optlen == 36 and len(a.dnsdomains) == 2 and a.dnsdomains[0] == "toto.example.com" and a.dnsdomains[1] == "titi.example.com"
+
+
+#####################################################################
++ Test DHCP6 Option - IA_PD Prefix Option
+
+= DHCP6OptIAPrefix - Basic Instantiation
+str(DHCP6OptIAPrefix()) == '\x00\x1a\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x000 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+#TODO : finish me
+
+#####################################################################
++ Test DHCP6 Option - Identity Association for Prefix Delegation
+
+= DHCP6OptIA_PD - Basic Instantiation
+str(DHCP6OptIA_PD()) == '\x00\x19\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+#TODO : finish me
+
+#####################################################################
++ Test DHCP6 Option - NIS Servers
+
+= DHCP6OptNISServers - Basic Instantiation
+str(DHCP6OptNISServers()) == '\x00\x1b\x00\x00'
+
+= DHCP6OptNISServers - Basic Dissection
+a = DHCP6OptNISServers('\x00\x1b\x00\x00')
+a.optcode == 27 and a. optlen == 0 and a.nisservers == []
+
+= DHCP6OptNISServers - Instantiation with specific values (1 address)
+str(DHCP6OptNISServers(nisservers = ["2001:db8::1"] )) == '\x00\x1b\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
+
+= DHCP6OptNISServers - Dissection with specific values (1 address)
+a = DHCP6OptNISServers('\x00\x1b\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
+a.optcode == 27 and a.optlen == 16 and len(a.nisservers) == 1 and a.nisservers[0] == "2001:db8::1"
+
+= DHCP6OptNISServers - Instantiation with specific values (2 addresses)
+str(DHCP6OptNISServers(nisservers = ["2001:db8::1", "2001:db8::2"] )) == '\x00\x1b\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02'
+
+= DHCP6OptNISServers - Dissection with specific values (2 addresses)
+a = DHCP6OptNISServers('\x00\x1b\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02')
+a.optcode == 27 and a.optlen == 32 and len(a.nisservers) == 2 and a.nisservers[0] == "2001:db8::1" and a.nisservers[1] == "2001:db8::2"
+
+#####################################################################
++ Test DHCP6 Option - NIS+ Servers
+
+= DHCP6OptNISPServers - Basic Instantiation
+str(DHCP6OptNISPServers()) == '\x00\x1c\x00\x00'
+
+= DHCP6OptNISPServers - Basic Dissection
+a = DHCP6OptNISPServers('\x00\x1c\x00\x00')
+a.optcode == 28 and a. optlen == 0 and a.nispservers == []
+
+= DHCP6OptNISPServers - Instantiation with specific values (1 address)
+str(DHCP6OptNISPServers(nispservers = ["2001:db8::1"] )) == '\x00\x1c\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
+
+= DHCP6OptNISPServers - Dissection with specific values (1 address)
+a = DHCP6OptNISPServers('\x00\x1c\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
+a.optcode == 28 and a.optlen == 16 and len(a.nispservers) == 1 and a.nispservers[0] == "2001:db8::1"
+
+= DHCP6OptNISPServers - Instantiation with specific values (2 addresses)
+str(DHCP6OptNISPServers(nispservers = ["2001:db8::1", "2001:db8::2"] )) == '\x00\x1c\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02'
+
+= DHCP6OptNISPServers - Dissection with specific values (2 addresses)
+a = DHCP6OptNISPServers('\x00\x1c\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02')
+a.optcode == 28 and a.optlen == 32 and len(a.nispservers) == 2 and a.nispservers[0] == "2001:db8::1" and a.nispservers[1] == "2001:db8::2"
+
+#####################################################################
++ Test DHCP6 Option - NIS Domain Name
+
+= DHCP6OptNISDomain - Basic Instantiation
+str(DHCP6OptNISDomain()) == '\x00\x1d\x00\x00'
+
+= DHCP6OptNISDomain - Basic Dissection
+a = DHCP6OptNISDomain('\x00\x1d\x00\x00')
+a.optcode == 29 and a.optlen == 0 and a.nisdomain == ""
+
+= DHCP6OptNISDomain - Instantiation with one domain name
+str(DHCP6OptNISDomain(nisdomain="toto.example.org")) == '\x00\x1d\x00\x12\x04toto\x07example\x03org\x00'
+
+= DHCP6OptNISDomain - Dissection with one domain name
+a = DHCP6OptNISDomain('\x00\x1d\x00\x12\x04toto\x07example\x03org\x00')
+a.optcode == 29 and a.optlen == 18 and a.nisdomain == "toto.example.org"
+
+= DHCP6OptNISDomain - Instantiation with one domain with trailing dot
+str(DHCP6OptNISDomain(nisdomain="toto.example.org.")) == '\x00\x1d\x00\x12\x04toto\x07example\x03org\x00'
+
+
+#####################################################################
++ Test DHCP6 Option - NIS+ Domain Name
+
+= DHCP6OptNISPDomain - Basic Instantiation
+str(DHCP6OptNISPDomain()) == '\x00\x1e\x00\x00'
+
+= DHCP6OptNISPDomain - Basic Dissection
+a = DHCP6OptNISPDomain('\x00\x1e\x00\x00')
+a.optcode == 30 and a.optlen == 0 and a.nispdomain == ""
+
+= DHCP6OptNISPDomain - Instantiation with one domain name
+str(DHCP6OptNISPDomain(nispdomain="toto.example.org")) == '\x00\x1e\x00\x12\x04toto\x07example\x03org\x00'
+
+= DHCP6OptNISPDomain - Dissection with one domain name
+a = DHCP6OptNISPDomain('\x00\x1e\x00\x12\x04toto\x07example\x03org\x00')
+a.optcode == 30 and a.optlen == 18 and a.nispdomain == "toto.example.org"
+
+= DHCP6OptNISPDomain - Instantiation with one domain with trailing dot
+str(DHCP6OptNISPDomain(nispdomain="toto.example.org.")) == '\x00\x1e\x00\x12\x04toto\x07example\x03org\x00'
+
+
+#####################################################################
++ Test DHCP6 Option - SNTP Servers
+
+= DHCP6OptSNTPServers - Basic Instantiation
+str(DHCP6OptSNTPServers()) == '\x00\x1f\x00\x00'
+
+= DHCP6OptSNTPServers - Basic Dissection
+a = DHCP6OptSNTPServers('\x00\x1f\x00\x00')
+a.optcode == 31 and a. optlen == 0 and a.sntpservers == []
+
+= DHCP6OptSNTPServers - Instantiation with specific values (1 address)
+str(DHCP6OptSNTPServers(sntpservers = ["2001:db8::1"] )) == '\x00\x1f\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
+
+= DHCP6OptSNTPServers - Dissection with specific values (1 address)
+a = DHCP6OptSNTPServers('\x00\x1f\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
+a.optcode == 31 and a.optlen == 16 and len(a.sntpservers) == 1 and a.sntpservers[0] == "2001:db8::1"
+
+= DHCP6OptSNTPServers - Instantiation with specific values (2 addresses)
+str(DHCP6OptSNTPServers(sntpservers = ["2001:db8::1", "2001:db8::2"] )) == '\x00\x1f\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02'
+
+= DHCP6OptSNTPServers - Dissection with specific values (2 addresses)
+a = DHCP6OptSNTPServers('\x00\x1f\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02')
+a.optcode == 31 and a.optlen == 32 and len(a.sntpservers) == 2 and a.sntpservers[0] == "2001:db8::1" and a.sntpservers[1] == "2001:db8::2"
+
+#####################################################################
++ Test DHCP6 Option - Information Refresh Time
+
+= DHCP6OptInfoRefreshTime - Basic Instantiation
+str(DHCP6OptInfoRefreshTime()) == '\x00 \x00\x04\x00\x01Q\x80'
+
+= DHCP6OptInfoRefreshTime - Basic Dissction
+a = DHCP6OptInfoRefreshTime('\x00 \x00\x04\x00\x01Q\x80')
+a.optcode == 32 and a.optlen == 4 and a.reftime == 86400
+
+= DHCP6OptInfoRefreshTime - Instantiation with specific values
+str(DHCP6OptInfoRefreshTime(optlen=7, reftime=42)) == '\x00 \x00\x07\x00\x00\x00*'
+
+#####################################################################
++ Test DHCP6 Option - BCMCS Servers
+
+= DHCP6OptBCMCSServers - Basic Instantiation
+str(DHCP6OptBCMCSServers()) == '\x00"\x00\x00'
+
+= DHCP6OptBCMCSServers - Basic Dissection
+a = DHCP6OptBCMCSServers('\x00"\x00\x00')
+a.optcode == 34 and a. optlen == 0 and a.bcmcsservers == []
+
+= DHCP6OptBCMCSServers - Instantiation with specific values (1 address)
+str(DHCP6OptBCMCSServers(bcmcsservers = ["2001:db8::1"] )) == '\x00"\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
+
+= DHCP6OptBCMCSServers - Dissection with specific values (1 address)
+a = DHCP6OptBCMCSServers('\x00"\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
+a.optcode == 34 and a.optlen == 16 and len(a.bcmcsservers) == 1 and a.bcmcsservers[0] == "2001:db8::1"
+
+= DHCP6OptBCMCSServers - Instantiation with specific values (2 addresses)
+str(DHCP6OptBCMCSServers(bcmcsservers = ["2001:db8::1", "2001:db8::2"] )) == '\x00"\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02'
+
+= DHCP6OptBCMCSServers - Dissection with specific values (2 addresses)
+a = DHCP6OptBCMCSServers('\x00"\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02')
+a.optcode == 34 and a.optlen == 32 and len(a.bcmcsservers) == 2 and a.bcmcsservers[0] == "2001:db8::1" and a.bcmcsservers[1] == "2001:db8::2"
+
+#####################################################################
++ Test DHCP6 Option - BCMCS Domains
+
+= DHCP6OptBCMCSDomains - Basic Instantiation
+str(DHCP6OptBCMCSDomains()) == '\x00!\x00\x00'
+
+= DHCP6OptBCMCSDomains - Basic Dissection
+a = DHCP6OptBCMCSDomains('\x00!\x00\x00')
+a.optcode == 33 and a.optlen == 0 and a.bcmcsdomains == []
+
+= DHCP6OptBCMCSDomains - Instantiation with specific values (1 domain)
+str(DHCP6OptBCMCSDomains(bcmcsdomains=["toto.example.com"])) == '\x00!\x00\x12\x04toto\x07example\x03com\x00'
+
+= DHCP6OptBCMCSDomains - Dissection with specific values (1 domain)
+a = DHCP6OptBCMCSDomains('\x00!\x00\x12\x04toto\x07example\x03com\x00')
+a.optcode == 33 and a.optlen == 18 and len(a.bcmcsdomains) == 1 and a.bcmcsdomains[0] == "toto.example.com"
+
+= DHCP6OptBCMCSDomains - Instantiation with specific values (2 domains)
+str(DHCP6OptBCMCSDomains(bcmcsdomains=["toto.example.com", "titi.example.com"])) == '\x00!\x00$\x04toto\x07example\x03com\x00\x04titi\x07example\x03com\x00'
+
+= DHCP6OptBCMCSDomains - Dissection with specific values (2 domains)
+a = DHCP6OptBCMCSDomains('\x00!\x00$\x04toto\x07example\x03com\x00\x04titi\x07example\x03com\x00')
+a.optcode == 33 and a.optlen == 36 and len(a.bcmcsdomains) == 2 and a.bcmcsdomains[0] == "toto.example.com" and a.bcmcsdomains[1] == "titi.example.com"
+
+#####################################################################
++ Test DHCP6 Option - Relay Agent Remote-ID
+
+= DHCP6OptRemoteID - Basic Instantiation
+str(DHCP6OptRemoteID()) == '\x00%\x00\x04\x00\x00\x00\x00'
+
+= DHCP6OptRemoteID - Basic Dissection
+a = DHCP6OptRemoteID('\x00%\x00\x04\x00\x00\x00\x00')
+a.optcode == 37 and a.optlen == 4 and a.enterprisenum == 0 and a.remoteid == ""
+
+= DHCP6OptRemoteID - Instantiation with specific values
+str(DHCP6OptRemoteID(enterprisenum=0xeeeeeeee, remoteid="someid")) == '\x00%\x00\n\xee\xee\xee\xeesomeid'
+
+= DHCP6OptRemoteID - Dissection with specific values
+a = DHCP6OptRemoteID('\x00%\x00\n\xee\xee\xee\xeesomeid')
+a.optcode == 37 and a.optlen == 10 and a.enterprisenum == 0xeeeeeeee and a.remoteid == "someid"
+
+#####################################################################
++ Test DHCP6 Option - Subscriber ID
+
+= DHCP6OptSubscriberID - Basic Instantiation
+str(DHCP6OptSubscriberID()) == '\x00&\x00\x00'
+
+= DHCP6OptSubscriberID - Basic Dissection
+a = DHCP6OptSubscriberID('\x00&\x00\x00')
+a.optcode == 38 and a.optlen == 0 and a.subscriberid == ""
+
+= DHCP6OptSubscriberID - Instantiation with specific values
+str(DHCP6OptSubscriberID(subscriberid="someid")) == '\x00&\x00\x06someid'
+
+= DHCP6OptSubscriberID - Dissection with specific values
+a = DHCP6OptSubscriberID('\x00&\x00\x06someid')
+a.optcode == 38 and a.optlen == 6 and a.subscriberid == "someid"
+
+
+#####################################################################
++ Test DHCP6 Option - Client FQDN
+
+= DHCP6OptClientFQDN - Basic Instantiation
+str(DHCP6OptClientFQDN()) == "\x00'\x00\x01\x00"
+
+= DHCP6OptClientFQDN - Basic Dissection
+a = DHCP6OptClientFQDN("\x00'\x00\x01\x00")
+a.optcode == 39 and a.optlen == 1 and a.res == 0 and a.flags == 0 and a.fqdn == ""
+
+= DHCP6OptClientFQDN - Instantiation with various flags combinations
+str(DHCP6OptClientFQDN(flags="S")) == "\x00'\x00\x01\x01" and str(DHCP6OptClientFQDN(flags="O")) == "\x00'\x00\x01\x02" and str(DHCP6OptClientFQDN(flags="N")) == "\x00'\x00\x01\x04" and str(DHCP6OptClientFQDN(flags="SON")) == "\x00'\x00\x01\x07" and str(DHCP6OptClientFQDN(flags="ON")) == "\x00'\x00\x01\x06"
+
+= DHCP6OptClientFQDN - Instantiation with one fqdn
+str(DHCP6OptClientFQDN(fqdn="toto.example.org")) == "\x00'\x00\x13\x00\x04toto\x07example\x03org\x00"
+
+= DHCP6OptClientFQDN - Dissection with one fqdn
+a = DHCP6OptClientFQDN("\x00'\x00\x13\x00\x04toto\x07example\x03org\x00")
+a.optcode == 39 and a.optlen == 19 and a.res == 0 and a.flags == 0 and a.fqdn == "toto.example.org"
+
+
+#####################################################################
++ Test DHCP6 Option Relay Agent Echo Request Option
+
+= DHCP6OptRelayAgentERO - Basic Instantiation
+str(DHCP6OptRelayAgentERO()) == '\x00+\x00\x04\x00\x17\x00\x18'
+
+= DHCP6OptRelayAgentERO - optlen field computation
+str(DHCP6OptRelayAgentERO(reqopts=[1,2,3,4])) == '\x00+\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04'
+
+= DHCP6OptRelayAgentERO - instantiation with empty list
+str(DHCP6OptRelayAgentERO(reqopts=[])) == '\x00+\x00\x00'
+
+= DHCP6OptRelayAgentERO - Basic dissection
+a=DHCP6OptRelayAgentERO('\x00+\x00\x00')
+a.optcode == 43 and a.optlen == 0 and a.reqopts == [23,24]
+
+= DHCP6OptRelayAgentERO - Dissection with specific value
+a=DHCP6OptRelayAgentERO('\x00+\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04')
+a.optcode == 43 and a.optlen == 8 and a.reqopts == [1,2,3,4]
+
+
+
+#####################################################################
++ Test DHCP6 Messages - DHCP6_Solicit
+
+= DHCP6_Solicit - Basic Instantiation
+str(DHCP6_Solicit()) == '\x01\x00\x00\x00'
+
+= DHCP6_Solicit - Basic Dissection
+a = DHCP6_Solicit('\x01\x00\x00\x00')
+a.msgtype == 1 and a.trid == 0
+
+= DHCP6_Solicit - Basic test of DHCP6_solicit.hashret()
+DHCP6_Solicit().hashret() == '\x00\x00\x00'
+
+= DHCP6_Solicit - Test of DHCP6_solicit.hashret() with specific values
+DHCP6_Solicit(trid=0xbbccdd).hashret() == '\xbb\xcc\xdd'
+
+= DHCP6_Solicit - UDP ports overload
+a=UDP()/DHCP6_Solicit()
+a.sport == 546 and a.dport == 547
+
+= DHCP6_Solicit - Dispatch based on UDP port
+a=UDP(str(UDP()/DHCP6_Solicit()))
+isinstance(a.payload, DHCP6_Solicit)
+
+
+
+
+
+
+
+
+
+
+
+
+#####################################################################
++ Test DHCP6 Messages - DHCP6_Advertise
+
+= DHCP6_Advertise - Basic Instantiation
+str(DHCP6_Advertise()) == '\x02\x00\x00\x00'
+
+= DHCP6_Advertise - Basic test of DHCP6_solicit.hashret()
+DHCP6_Advertise().hashret() == '\x00\x00\x00'
+
+= DHCP6_Advertise - Test of DHCP6_Advertise.hashret() with specific values
+DHCP6_Advertise(trid=0xbbccdd).hashret() == '\xbb\xcc\xdd'
+
+= DHCP6_Advertise - Basic test of answers() with solicit message
+a = DHCP6_Solicit()
+b = DHCP6_Advertise()
+a > b
+
+= DHCP6_Advertise - Test of answers() with solicit message
+a = DHCP6_Solicit(trid=0xbbccdd)
+b = DHCP6_Advertise(trid=0xbbccdd)
+a > b
+
+= DHCP6_Advertise - UDP ports overload
+a=UDP()/DHCP6_Advertise()
+a.sport == 547 and a.dport == 546
+
+#####################################################################
++ Test DHCP6 Messages - DHCP6_Request
+
+= DHCP6_Request - Basic Instantiation
+str(DHCP6_Request()) == '\x03\x00\x00\x00'
+
+= DHCP6_Request - Basic Dissection
+a=DHCP6_Request('\x03\x00\x00\x00')
+a.msgtype == 3 and a.trid == 0
+
+= DHCP6_Request - UDP ports overload
+a=UDP()/DHCP6_Request()
+a.sport == 546 and a.dport == 547
+
+#####################################################################
++ Test DHCP6 Messages - DHCP6_Confirm
+
+= DHCP6_Confirm - Basic Instantiation
+str(DHCP6_Confirm()) == '\x04\x00\x00\x00'
+
+= DHCP6_Confirm - Basic Dissection
+a=DHCP6_Confirm('\x04\x00\x00\x00')
+a.msgtype == 4 and a.trid == 0
+
+= DHCP6_Confirm - UDP ports overload
+a=UDP()/DHCP6_Confirm()
+a.sport == 546 and a.dport == 547
+
+#####################################################################
++ Test DHCP6 Messages - DHCP6_Renew
+
+= DHCP6_Renew - Basic Instantiation
+str(DHCP6_Renew()) == '\x05\x00\x00\x00'
+
+= DHCP6_Renew - Basic Dissection
+a=DHCP6_Renew('\x05\x00\x00\x00')
+a.msgtype == 5 and a.trid == 0
+
+= DHCP6_Renew - UDP ports overload
+a=UDP()/DHCP6_Renew()
+a.sport == 546 and a.dport == 547
+
+#####################################################################
++ Test DHCP6 Messages - DHCP6_Rebind
+
+= DHCP6_Rebind - Basic Instantiation
+str(DHCP6_Rebind()) == '\x06\x00\x00\x00'
+
+= DHCP6_Rebind - Basic Dissection
+a=DHCP6_Rebind('\x06\x00\x00\x00')
+a.msgtype == 6 and a.trid == 0
+
+= DHCP6_Rebind - UDP ports overload
+a=UDP()/DHCP6_Rebind()
+a.sport == 546 and a.dport == 547
+
+#####################################################################
++ Test DHCP6 Messages - DHCP6_Reply
+
+= DHCP6_Reply - Basic Instantiation
+str(DHCP6_Reply()) == '\x07\x00\x00\x00'
+
+= DHCP6_Reply - Basic Dissection
+a=DHCP6_Reply('\x07\x00\x00\x00')
+a.msgtype == 7 and a.trid == 0
+
+= DHCP6_Reply - UDP ports overload
+a=UDP()/DHCP6_Reply()
+a.sport == 546 and a.dport == 547
+
+#####################################################################
++ Test DHCP6 Messages - DHCP6_Release
+
+= DHCP6_Release - Basic Instantiation
+str(DHCP6_Release()) == '\x08\x00\x00\x00'
+
+= DHCP6_Release - Basic Dissection
+a=DHCP6_Release('\x08\x00\x00\x00')
+a.msgtype == 8 and a.trid == 0
+
+= DHCP6_Release - UDP ports overload
+a=UDP()/DHCP6_Release()
+a.sport == 546 and a.dport == 547
+
+#####################################################################
++ Test DHCP6 Messages - DHCP6_Decline
+
+= DHCP6_Decline - Basic Instantiation
+str(DHCP6_Decline()) == '\x09\x00\x00\x00'
+
+= DHCP6_Confirm - Basic Dissection
+a=DHCP6_Confirm('\x09\x00\x00\x00')
+a.msgtype == 9 and a.trid == 0
+
+= DHCP6_Decline - UDP ports overload
+a=UDP()/DHCP6_Decline()
+a.sport == 546 and a.dport == 547
+
+#####################################################################
++ Test DHCP6 Messages - DHCP6_Reconf
+
+= DHCP6_Reconf - Basic Instantiation
+str(DHCP6_Reconf()) == '\x0A\x00\x00\x00'
+
+= DHCP6_Reconf - Basic Dissection
+a=DHCP6_Reconf('\x0A\x00\x00\x00')
+a.msgtype == 10 and a.trid == 0
+
+= DHCP6_Reconf - UDP ports overload
+a=UDP()/DHCP6_Reconf()
+a.sport == 547 and a.dport == 546
+
+#####################################################################
++ Test DHCP6 Messages - DHCP6_InfoRequest
+
+= DHCP6_InfoRequest - Basic Instantiation
+str(DHCP6_InfoRequest()) == '\x0B\x00\x00\x00'
+
+= DHCP6_InfoRequest - Basic Dissection
+a=DHCP6_InfoRequest('\x0B\x00\x00\x00')
+a.msgtype == 11 and a.trid == 0
+
+= DHCP6_InfoRequest - UDP ports overload
+a=UDP()/DHCP6_InfoRequest()
+a.sport == 546 and a.dport == 547
+
+#####################################################################
++ Test DHCP6 Messages - DHCP6_RelayForward
+
+= DHCP6_RelayForward - Basic Instantiation
+str(DHCP6_RelayForward()) == '\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= DHCP6_RelayForward - Basic Dissection
+a=DHCP6_RelayForward('\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+a.msgtype == 12 and a.hopcount == 0 and a.linkaddr == "::" and a.peeraddr == "::"
+
+#####################################################################
++ Test DHCP6 Messages - DHCP6_RelayReply
+
+= DHCP6_RelayReply - Basic Instantiation
+str(DHCP6_RelayReply()) == '\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= DHCP6_RelayReply - Basic Dissection
+a=DHCP6_RelayReply('\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+a.msgtype == 13 and a.hopcount == 0 and a.linkaddr == "::" and a.peeraddr == "::"
+
+
+
+#####################################################################
+#####################################################################
+################# MIPv6 and NEMO #################
+#####################################################################
+#####################################################################
++ Home Agent Address Discovery
+
+= in6_getha()
+in6_getha('2001:db8::') == '2001:db8::fdff:ffff:ffff:fffe'
+
+= ICMPv6HAADRequest - build/dissection
+p = IPv6(str(IPv6(dst=in6_getha('2001:db8::'), src='2001:db8::1')/ICMPv6HAADRequest(id=42)))
+p.cksum == 0x9620 and p.dst == '2001:db8::fdff:ffff:ffff:fffe' and p.R == 1
+
+= ICMPv6HAADReply - build/dissection
+p = IPv6(str(IPv6(dst='2001:db8::1', src='2001:db8::42')/ICMPv6HAADReply(id=42, addresses=['2001:db8::2', '2001:db8::3'])))
+p.cksum = 0x3747 and p.addresses == [ '2001:db8::2', '2001:db8::3' ]
+
+= ICMPv6HAADRequest / ICMPv6HAADReply - build/dissection
+a=ICMPv6HAADRequest(id=42)
+b=ICMPv6HAADReply(id=42)
+not a < b and a > b
+
++ Mobile Prefix Solicitation/Advertisement
+
+= ICMPv6MPSol - build (default values)
+s = '`\x00\x00\x00\x00\x08:@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x92\x00m\xbb\x00\x00\x00\x00'
+str(IPv6()/ICMPv6MPSol()) == s
+
+= ICMPv6MPSol - dissection (default values)
+p = IPv6(s)
+p[ICMPv6MPSol].type == 146 and p[ICMPv6MPSol].cksum == 0x6dbb and p[ICMPv6MPSol].id == 0
+
+= ICMPv6MPSol - build
+s = '`\x00\x00\x00\x00\x08:@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x92\x00(\x08\x00\x08\x00\x00'
+str(IPv6()/ICMPv6MPSol(cksum=0x2808, id=8)) == s
+
+= ICMPv6MPSol - dissection
+p = IPv6(s)
+p[ICMPv6MPSol].cksum == 0x2808 and p[ICMPv6MPSol].id == 8
+
+= ICMPv6MPAdv - build (default values)
+s = '`\x00\x00\x00\x00(:@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x93\x00\xe8\xd6\x00\x00\x80\x00\x03\x04\x00\xc0\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+str(IPv6()/ICMPv6MPAdv()/ICMPv6NDOptPrefixInfo()) == s
+
+= ICMPv6MPAdv - dissection (default values)
+p = IPv6(s)
+p[ICMPv6MPAdv].type == 147 and p[ICMPv6MPAdv].cksum == 0xe8d6 and p[ICMPv6NDOptPrefixInfo].prefix == '::'
+
+= ICMPv6MPAdv - build
+s = '`\x00\x00\x00\x00(:@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x93\x00(\x07\x00*@\x00\x03\x04\x00@\xff\xff\xff\xff\x00\x00\x00\x0c\x00\x00\x00\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
+str(IPv6()/ICMPv6MPAdv(cksum=0x2807, flags=1, id=42)/ICMPv6NDOptPrefixInfo(prefix='2001:db8::1', L=0, preferredlifetime=12)) == s
+
+= ICMPv6MPAdv - dissection
+p = IPv6(s)
+p[ICMPv6MPAdv].cksum == 0x2807 and p[ICMPv6MPAdv].flags == 1 and p[ICMPv6MPAdv].id == 42 and p[ICMPv6NDOptPrefixInfo].prefix == '2001:db8::1' and p[ICMPv6NDOptPrefixInfo].preferredlifetime == 12
+
++ Type 2 Routing Header
+
+= IPv6ExtHdrRouting - type 2 - build/dissection
+p = IPv6(str(IPv6(dst='2001:db8::1', src='2001:db8::2')/IPv6ExtHdrRouting(type=2, addresses=['2001:db8::3'])/ICMPv6EchoRequest()))
+p.type == 2 and len(p.addresses) == 1 and p.cksum == 0x2446
+
++ Mobility Options - Binding Refresh Advice
+
+= MIP6OptBRAdvice - build (default values)
+s = '\x02\x02\x00\x00'
+str(MIP6OptBRAdvice()) == s
+
+= MIP6OptBRAdvice - dissection (default values)
+p = MIP6OptBRAdvice(s)
+p.otype == 2 and p.olen == 2 and p.rinter == 0
+
+= MIP6OptBRAdvice - build
+s = '\x03*\n\xf7'
+str(MIP6OptBRAdvice(otype=3, olen=42, rinter=2807)) == s
+
+= MIP6OptBRAdvice - dissection
+p = MIP6OptBRAdvice(s)
+p.otype == 3 and p.olen == 42 and p.rinter == 2807
+
++ Mobility Options - Alternate Care-of Address
+
+= MIP6OptAltCoA - build (default values)
+s = '\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+str(MIP6OptAltCoA()) == s
+
+= MIP6OptAltCoA - dissection (default values)
+p = MIP6OptAltCoA(s)
+p.otype == 3 and p.olen == 16 and p.acoa == '::'
+
+= MIP6OptAltCoA - build
+s = '*\x08 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
+str(MIP6OptAltCoA(otype=42, olen=8, acoa='2001:db8::1')) == s
+
+= MIP6OptAltCoA - dissection
+p = MIP6OptAltCoA(s)
+p.otype == 42 and p.olen == 8 and p.acoa == '2001:db8::1'
+
++ Mobility Options - Nonce Indices
+
+= MIP6OptNonceIndices - build (default values)
+s = '\x04\x10\x00\x00\x00\x00'
+str(MIP6OptNonceIndices()) == s
+
+= MIP6OptNonceIndices - dissection (default values)
+p = MIP6OptNonceIndices(s)
+p.otype == 4 and p.olen == 16 and p.hni == 0 and p.coni == 0
+
+= MIP6OptNonceIndices - build
+s = '\x04\x12\x00\x13\x00\x14'
+str(MIP6OptNonceIndices(olen=18, hni=19, coni=20)) == s
+
+= MIP6OptNonceIndices - dissection
+p = MIP6OptNonceIndices(s)
+p.hni == 19 and p.coni == 20
+
++ Mobility Options - Binding Authentication Data
+
+= MIP6OptBindingAuthData - build (default values)
+s = '\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+str(MIP6OptBindingAuthData()) == s
+
+= MIP6OptBindingAuthData - dissection (default values)
+p = MIP6OptBindingAuthData(s)
+p.otype == 5 and p.olen == 16 and p.authenticator == 0
+
+= MIP6OptBindingAuthData - build
+s = '\x05*\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\xf7'
+str(MIP6OptBindingAuthData(olen=42, authenticator=2807)) == s
+
+= MIP6OptBindingAuthData - dissection
+p = MIP6OptBindingAuthData(s)
+p.otype == 5 and p.olen == 42 and p.authenticator == 2807
+
++ Mobility Options - Mobile Network Prefix
+
+= MIP6OptMobNetPrefix - build (default values)
+s = '\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+str(MIP6OptMobNetPrefix()) == s
+
+= MIP6OptMobNetPrefix - dissection (default values)
+p = MIP6OptMobNetPrefix(s)
+p.otype == 6 and p.olen == 18 and p.plen == 64 and p.prefix == '::'
+
+= MIP6OptMobNetPrefix - build
+s = '\x06*\x02 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+str(MIP6OptMobNetPrefix(olen=42, reserved=2, plen=32, prefix='2001:db8::')) == s
+
+= MIP6OptMobNetPrefix - dissection
+p = MIP6OptMobNetPrefix(s)
+p.olen == 42 and p.reserved == 2 and p.plen == 32 and p.prefix == '2001:db8::'
+
++ Mobility Options - Link-Layer Address (MH-LLA)
+
+= MIP6OptLLAddr - basic build
+str(MIP6OptLLAddr()) == '\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00'
+
+= MIP6OptLLAddr - basic dissection
+p = MIP6OptLLAddr('\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00')
+p.otype == 7 and p.olen == 7 and p.ocode == 2 and p.pad == 0 and p.lla == "00:00:00:00:00:00"
+
+= MIP6OptLLAddr - build with specific values
+str(MIP6OptLLAddr(olen=42, ocode=4, pad=0xff, lla='EE:EE:EE:EE:EE:EE')) == '\x07*\x04\xff\xee\xee\xee\xee\xee\xee'
+
+= MIP6OptLLAddr - dissection with specific values
+p = MIP6OptLLAddr('\x07*\x04\xff\xee\xee\xee\xee\xee\xee')
+
+str(MIP6OptLLAddr(olen=42, ocode=4, pad=0xff, lla='EE:EE:EE:EE:EE:EE'))
+p.otype == 7 and p.olen == 42 and p.ocode == 4 and p.pad == 0xff and p.lla == "ee:ee:ee:ee:ee:ee"
+
++ Mobility Options - Mobile Node Identifier
+
+= MIP6OptMNID - basic build
+str(MIP6OptMNID()) == '\x08\x01\x01'
+
+= MIP6OptMNID - basic dissection
+p = MIP6OptMNID('\x08\x01\x01')
+p.otype == 8 and p.olen == 1 and p.subtype == 1 and p.id == ""
+
+= MIP6OptMNID - build with specific values
+str(MIP6OptMNID(subtype=42, id="someid")) == '\x08\x07*someid'
+
+= MIP6OptMNID - dissection with specific values
+p = MIP6OptMNID('\x08\x07*someid')
+p.otype == 8 and p.olen == 7 and p.subtype == 42 and p.id == "someid"
+
+
++ Mobility Options - Message Authentication
+
+= MIP6OptMsgAuth - basic build
+str(MIP6OptMsgAuth()) == '\x09\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA'
+
+= MIP6OptMsgAuth - basic dissection
+p = MIP6OptMsgAuth('\x09\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA')
+p.otype == 9 and p.olen == 17 and p.subtype == 1 and p.mspi == 0 and p.authdata == "A"*12
+
+= MIP6OptMsgAuth - build with specific values
+str(MIP6OptMsgAuth(authdata="B"*16, mspi=0xeeeeeeee, subtype=0xff)) == '\t\x15\xff\xee\xee\xee\xeeBBBBBBBBBBBBBBBB'
+
+= MIP6OptMsgAuth - dissection with specific values
+p = MIP6OptMsgAuth('\t\x15\xff\xee\xee\xee\xeeBBBBBBBBBBBBBBBB')
+p.otype == 9 and p.olen == 21 and p.subtype == 255 and p.mspi == 0xeeeeeeee and p.authdata == "B"*16
+
+
++ Mobility Options - Replay Protection
+
+= MIP6OptReplayProtection - basic build
+str(MIP6OptReplayProtection()) == '\n\x08\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= MIP6OptReplayProtection - basic dissection
+p = MIP6OptReplayProtection('\n\x08\x00\x00\x00\x00\x00\x00\x00\x00')
+p.otype == 10 and p.olen == 8 and p.timestamp == 0
+
+= MIP6OptReplayProtection - build with specific values
+str(MIP6OptReplayProtection(olen=42, timestamp=(52*31536000)<<32)) == '\n*a\xbev\x00\x00\x00\x00\x00'
+
+= MIP6OptReplayProtection - dissection with specific values
+p = MIP6OptReplayProtection('\n*a\xbev\x00\x00\x00\x00\x00')
+p.otype == 10 and p.olen == 42 and p.timestamp == 7043196609626112000L
+
+
++ Mobility Options - CGA Parameters
+= MIP6OptCGAParams
+
++ Mobility Options - Signature
+= MIP6OptSignature
+
++ Mobility Options - Permanent Home Keygen Token
+= MIP6OptHomeKeygenToken
+
++ Mobility Options - Care-of Test Init
+= MIP6OptCareOfTestInit
+
++ Mobility Options - Care-of Test
+= MIP6OptCareOfTest
+
+
+
+
+
++ Mobility Options - Automatic Padding - MIP6OptBRAdvice
+= Mobility Options - Automatic Padding - MIP6OptBRAdvice
+a = str(MIP6MH_BU(seq=0x4242, options=[MIP6OptBRAdvice()])) ==';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x02\x02\x00\x00'
+b = str(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptBRAdvice()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x00\x02\x02\x00\x00\x01\x04\x00\x00\x00\x00'
+c = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*0),MIP6OptBRAdvice()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x02\x02\x00\x00\x01\x04\x00\x00\x00\x00'
+d = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*1),MIP6OptBRAdvice()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x00\x02\x02\x00\x00\x01\x02\x00\x00'
+e = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*2),MIP6OptBRAdvice()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x02\x02\x00\x00\x01\x02\x00\x00'
+g = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*3),MIP6OptBRAdvice()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x00\x02\x02\x00\x00\x01\x00'
+h = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*4),MIP6OptBRAdvice()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x02\x02\x00\x00\x01\x00'
+i = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*5),MIP6OptBRAdvice()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x00\x02\x02\x00\x00'
+j = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*6),MIP6OptBRAdvice()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x02\x02\x00\x00'
+a and b and c and d and e and g and h and i and j
+
++ Mobility Options - Automatic Padding - MIP6OptAltCoA
+= Mobility Options - Automatic Padding - MIP6OptAltCoA
+a = str(MIP6MH_BU(seq=0x4242, options=[MIP6OptAltCoA()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+b = str(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptAltCoA()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+c = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*0),MIP6OptAltCoA()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+d = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*1),MIP6OptAltCoA()])) ==';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x01\x05\x00\x00\x00\x00\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+e = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*2),MIP6OptAltCoA()])) ==';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x01\x04\x00\x00\x00\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+g = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*3),MIP6OptAltCoA()])) ==';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x01\x03\x00\x00\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+h = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*4),MIP6OptAltCoA()])) ==';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x01\x02\x00\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+i = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*5),MIP6OptAltCoA()])) ==';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x01\x01\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+j = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*6),MIP6OptAltCoA()])) ==';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x01\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+a and b and c and d and e and g and h and i and j
+
++ Mobility Options - Automatic Padding - MIP6OptNonceIndices
+= Mobility Options - Automatic Padding - MIP6OptNonceIndices
+a = str(MIP6MH_BU(seq=0x4242, options=[MIP6OptNonceIndices()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x04\x10\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00'
+b = str(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptNonceIndices()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x00\x04\x10\x00\x00\x00\x00\x01\x02\x00\x00'
+c = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*0),MIP6OptNonceIndices()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x04\x10\x00\x00\x00\x00\x01\x02\x00\x00'
+d = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*1),MIP6OptNonceIndices()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x00\x04\x10\x00\x00\x00\x00\x01\x00'
+e = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*2),MIP6OptNonceIndices()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x04\x10\x00\x00\x00\x00\x01\x00'
+g = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*3),MIP6OptNonceIndices()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x00\x04\x10\x00\x00\x00\x00'
+h = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*4),MIP6OptNonceIndices()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x04\x10\x00\x00\x00\x00'
+i = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*5),MIP6OptNonceIndices()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x00\x04\x10\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00'
+j = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*6),MIP6OptNonceIndices()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x04\x10\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00'
+a and b and c and d and e and g and h and i and j
+
++ Mobility Options - Automatic Padding - MIP6OptBindingAuthData
+= Mobility Options - Automatic Padding - MIP6OptBindingAuthData
+a = str(MIP6MH_BU(seq=0x4242, options=[MIP6OptBindingAuthData()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+b = str(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptBindingAuthData()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x01\x03\x00\x00\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+c = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*0),MIP6OptBindingAuthData()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x01\x02\x00\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+d = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*1),MIP6OptBindingAuthData()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x01\x01\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+e = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*2),MIP6OptBindingAuthData()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x01\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+g = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*3),MIP6OptBindingAuthData()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+h = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*4),MIP6OptBindingAuthData()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+i = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*5),MIP6OptBindingAuthData()])) ==';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+j = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*6),MIP6OptBindingAuthData()])) ==';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+a and b and c and d and e and g and h and i and j
+
++ Mobility Options - Automatic Padding - MIP6OptMobNetPrefix
+= Mobility Options - Automatic Padding - MIP6OptMobNetPrefix
+a = str(MIP6MH_BU(seq=0x4242, options=[MIP6OptMobNetPrefix()])) == ';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+b = str(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptMobNetPrefix()])) == ';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x01\x05\x00\x00\x00\x00\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+c = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*0),MIP6OptMobNetPrefix()])) == ';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x01\x04\x00\x00\x00\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+d = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*1),MIP6OptMobNetPrefix()])) == ';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x01\x03\x00\x00\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+e = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*2),MIP6OptMobNetPrefix()])) == ';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x01\x02\x00\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+g = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*3),MIP6OptMobNetPrefix()])) == ';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x01\x01\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+h = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*4),MIP6OptMobNetPrefix()])) == ';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x01\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+i = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*5),MIP6OptMobNetPrefix()])) == ';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+j = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*6),MIP6OptMobNetPrefix()])) == ';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+a and b and c and d and e and g and h and i and j
+
++ Mobility Options - Automatic Padding - MIP6OptLLAddr
+= Mobility Options - Automatic Padding - MIP6OptLLAddr
+a = str(MIP6MH_BU(seq=0x4242, options=[MIP6OptLLAddr()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00'
+b = str(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptLLAddr()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x00'
+c = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*0),MIP6OptLLAddr()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00'
+d = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*1),MIP6OptLLAddr()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00'
+e = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*2),MIP6OptLLAddr()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00'
+g = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*3),MIP6OptLLAddr()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x03\x00\x00\x00'
+h = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*4),MIP6OptLLAddr()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00'
+i = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*5),MIP6OptLLAddr()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00'
+j = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*6),MIP6OptLLAddr()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00'
+a and b and c and d and e and g and h and i and j
+
++ Mobility Options - Automatic Padding - MIP6OptMNID
+= Mobility Options - Automatic Padding - MIP6OptMNID
+a = str(MIP6MH_BU(seq=0x4242, options=[MIP6OptMNID()])) ==';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x08\x01\x01\x00'
+b = str(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptMNID()])) ==';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x08\x01\x01'
+c = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*0),MIP6OptMNID()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x08\x01\x01\x01\x05\x00\x00\x00\x00\x00'
+d = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*1),MIP6OptMNID()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x08\x01\x01\x01\x04\x00\x00\x00\x00'
+e = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*2),MIP6OptMNID()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x08\x01\x01\x01\x03\x00\x00\x00'
+g = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*3),MIP6OptMNID()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x08\x01\x01\x01\x02\x00\x00'
+h = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*4),MIP6OptMNID()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x08\x01\x01\x01\x01\x00'
+i = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*5),MIP6OptMNID()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x08\x01\x01\x01\x00'
+j = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*6),MIP6OptMNID()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x08\x01\x01\x00'
+a and b and c and d and e and g and h and i and j
+
++ Mobility Options - Automatic Padding - MIP6OptMsgAuth
+= Mobility Options - Automatic Padding - MIP6OptMsgAuth
+a = str(MIP6MH_BU(seq=0x4242, options=[MIP6OptMsgAuth()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA'
+b = str(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptMsgAuth()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA'
+c = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*0),MIP6OptMsgAuth()])) ==';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x01\x01\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA\x01\x02\x00\x00'
+d = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*1),MIP6OptMsgAuth()])) ==';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x01\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA\x01\x02\x00\x00'
+e = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*2),MIP6OptMsgAuth()])) ==';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA\x01\x02\x00\x00'
+g = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*3),MIP6OptMsgAuth()])) ==';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA\x01\x02\x00\x00'
+h = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*4),MIP6OptMsgAuth()])) ==';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x01\x01\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA'
+i = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*5),MIP6OptMsgAuth()])) ==';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x01\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA'
+j = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*6),MIP6OptMsgAuth()])) ==';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA'
+a and b and c and d and e and g and h and i and j
+
++ Mobility Options - Automatic Padding - MIP6OptReplayProtection
+= Mobility Options - Automatic Padding - MIP6OptReplayProtection
+a = str(MIP6MH_BU(seq=0x4242, options=[MIP6OptReplayProtection()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00'
+b = str(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptReplayProtection()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x01\x03\x00\x00\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00'
+c = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*0),MIP6OptReplayProtection()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x01\x02\x00\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00'
+d = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*1),MIP6OptReplayProtection()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x01\x01\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00'
+e = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*2),MIP6OptReplayProtection()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x01\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00'
+g = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*3),MIP6OptReplayProtection()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00'
+h = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*4),MIP6OptReplayProtection()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00'
+i = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*5),MIP6OptReplayProtection()])) ==';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00'
+j = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*6),MIP6OptReplayProtection()])) ==';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00'
+a and b and c and d and e and g and h and i and j
+
++ Mobility Options - Automatic Padding - MIP6OptCGAParamsReq
+= Mobility Options - Automatic Padding - MIP6OptCGAParamsReq
+a = str(MIP6MH_BU(seq=0x4242, options=[MIP6OptCGAParamsReq()])) ==';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x0b\x00\x01\x00'
+b = str(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptCGAParamsReq()])) ==';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x0b\x00\x00'
+c = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*0),MIP6OptCGAParamsReq()])) ==';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x0b\x00'
+d = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*1),MIP6OptCGAParamsReq()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x0b\x00\x01\x05\x00\x00\x00\x00\x00'
+e = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*2),MIP6OptCGAParamsReq()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x0b\x00\x01\x04\x00\x00\x00\x00'
+g = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*3),MIP6OptCGAParamsReq()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x0b\x00\x01\x03\x00\x00\x00'
+h = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*4),MIP6OptCGAParamsReq()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x0b\x00\x01\x02\x00\x00'
+i = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*5),MIP6OptCGAParamsReq()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x0b\x00\x01\x01\x00'
+j = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*6),MIP6OptCGAParamsReq()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x0b\x00\x01\x00'
+a and b and c and d and e and g and h and i and j
+
++ Mobility Options - Automatic Padding - MIP6OptCGAParams
+= Mobility Options - Automatic Padding - MIP6OptCGAParams
+a = str(MIP6MH_BU(seq=0x4242, options=[MIP6OptCGAParams()])) ==';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x0c\x00\x01\x00'
+b = str(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptCGAParams()])) ==';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x0c\x00\x00'
+c = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*0),MIP6OptCGAParams()])) ==';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x0c\x00'
+d = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*1),MIP6OptCGAParams()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x0c\x00\x01\x05\x00\x00\x00\x00\x00'
+e = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*2),MIP6OptCGAParams()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x0c\x00\x01\x04\x00\x00\x00\x00'
+g = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*3),MIP6OptCGAParams()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x0c\x00\x01\x03\x00\x00\x00'
+h = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*4),MIP6OptCGAParams()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x0c\x00\x01\x02\x00\x00'
+i = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*5),MIP6OptCGAParams()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x0c\x00\x01\x01\x00'
+j = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*6),MIP6OptCGAParams()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x0c\x00\x01\x00'
+a and b and c and d and e and g and h and i and j
+
++ Mobility Options - Automatic Padding - MIP6OptSignature
+= Mobility Options - Automatic Padding - MIP6OptSignature
+a = str(MIP6MH_BU(seq=0x4242, options=[MIP6OptSignature()])) ==';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\r\x00\x01\x00'
+b = str(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptSignature()])) ==';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\r\x00\x00'
+c = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*0),MIP6OptSignature()])) ==';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\r\x00'
+d = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*1),MIP6OptSignature()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\r\x00\x01\x05\x00\x00\x00\x00\x00'
+e = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*2),MIP6OptSignature()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\r\x00\x01\x04\x00\x00\x00\x00'
+g = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*3),MIP6OptSignature()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\r\x00\x01\x03\x00\x00\x00'
+h = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*4),MIP6OptSignature()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\r\x00\x01\x02\x00\x00'
+i = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*5),MIP6OptSignature()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\r\x00\x01\x01\x00'
+j = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*6),MIP6OptSignature()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\r\x00\x01\x00'
+a and b and c and d and e and g and h and i and j
+
++ Mobility Options - Automatic Padding - MIP6OptHomeKeygenToken
+= Mobility Options - Automatic Padding - MIP6OptHomeKeygenToken
+a = str(MIP6MH_BU(seq=0x4242, options=[MIP6OptHomeKeygenToken()])) ==';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x0e\x00\x01\x00'
+b = str(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptHomeKeygenToken()])) ==';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x0e\x00\x00'
+c = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*0),MIP6OptHomeKeygenToken()])) ==';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x0e\x00'
+d = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*1),MIP6OptHomeKeygenToken()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x0e\x00\x01\x05\x00\x00\x00\x00\x00'
+e = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*2),MIP6OptHomeKeygenToken()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x0e\x00\x01\x04\x00\x00\x00\x00'
+g = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*3),MIP6OptHomeKeygenToken()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x0e\x00\x01\x03\x00\x00\x00'
+h = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*4),MIP6OptHomeKeygenToken()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x0e\x00\x01\x02\x00\x00'
+i = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*5),MIP6OptHomeKeygenToken()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x0e\x00\x01\x01\x00'
+j = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*6),MIP6OptHomeKeygenToken()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x0e\x00\x01\x00'
+a and b and c and d and e and g and h and i and j
+
++ Mobility Options - Automatic Padding - MIP6OptCareOfTestInit
+= Mobility Options - Automatic Padding - MIP6OptCareOfTestInit
+a = str(MIP6MH_BU(seq=0x4242, options=[MIP6OptCareOfTestInit()])) ==';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x0f\x00\x01\x00'
+b = str(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptCareOfTestInit()])) ==';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x0f\x00\x00'
+c = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*0),MIP6OptCareOfTestInit()])) ==';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x0f\x00'
+d = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*1),MIP6OptCareOfTestInit()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x0f\x00\x01\x05\x00\x00\x00\x00\x00'
+e = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*2),MIP6OptCareOfTestInit()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x0f\x00\x01\x04\x00\x00\x00\x00'
+g = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*3),MIP6OptCareOfTestInit()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x0f\x00\x01\x03\x00\x00\x00'
+h = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*4),MIP6OptCareOfTestInit()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x0f\x00\x01\x02\x00\x00'
+i = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*5),MIP6OptCareOfTestInit()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x0f\x00\x01\x01\x00'
+j = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*6),MIP6OptCareOfTestInit()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x0f\x00\x01\x00'
+a and b and c and d and e and g and h and i and j
+
++ Mobility Options - Automatic Padding - MIP6OptCareOfTest
+= Mobility Options - Automatic Padding - MIP6OptCareOfTest
+a = str(MIP6MH_BU(seq=0x4242, options=[MIP6OptCareOfTest()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00'
+b = str(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptCareOfTest()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+c = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*0),MIP6OptCareOfTest()])) ==';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00'
+d = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*1),MIP6OptCareOfTest()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00'
+e = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*2),MIP6OptCareOfTest()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00'
+g = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*3),MIP6OptCareOfTest()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x03\x00\x00\x00'
+h = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*4),MIP6OptCareOfTest()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00'
+i = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*5),MIP6OptCareOfTest()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00'
+j = str(MIP6MH_BU(seq=0x4242, options=[PadN(optdata='\x00'*6),MIP6OptCareOfTest()])) ==';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00'
+a and b and c and d and e and g and h and i and j
+
+
+
+
++ Binding Refresh Request Message
+= MIP6MH_BRR - Build (default values)
+str(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_BRR()) == '`\x00\x00\x00\x00\x08\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x00\x00\x00h\xfb\x00\x00'
+
+= MIP6MH_BRR - Build with specific values
+str(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_BRR(nh=0xff, res=0xee, res2=0xaaaa, options=[MIP6OptLLAddr(), MIP6OptAltCoA()])) == '`\x00\x00\x00\x00(\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xff\x04\x00\xee\xec$\xaa\xaa\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= MIP6MH_BRR - Basic dissection
+a=IPv6('`\x00\x00\x00\x00\x08\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x00\x00\x00h\xfb\x00\x00')
+b=a.payload
+a.nh == 135 and isinstance(b, MIP6MH_BRR) and b.nh == 59 and b.len == 0 and b.mhtype == 0 and b.res == 0 and b.cksum == 0x68fb and b.res2 == 0 and b.options == []
+
+= MIP6MH_BRR - Dissection with specific values
+a=IPv6('`\x00\x00\x00\x00(\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xff\x04\x00\xee\xec$\xaa\xaa\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+b=a.payload
+a.nh == 135 and isinstance(b, MIP6MH_BRR) and b.nh == 0xff and b.len == 4 and b.mhtype == 0 and b.res == 238 and b.cksum == 0xec24 and b.res2 == 43690 and len(b.options) == 3 and isinstance(b.options[0], MIP6OptLLAddr) and isinstance(b.options[1], PadN) and isinstance(b.options[2], MIP6OptAltCoA)
+
+= MIP6MH_BRR / MIP6MH_BU / MIP6MH_BA hashret() and answers()
+hoa="2001:db8:9999::1"
+coa="2001:db8:7777::1"
+cn="2001:db8:8888::1"
+ha="2001db8:6666::1"
+a=IPv6(str(IPv6(src=cn, dst=hoa)/MIP6MH_BRR()))
+b=IPv6(str(IPv6(src=coa, dst=cn)/IPv6ExtHdrDestOpt(options=HAO(hoa=hoa))/MIP6MH_BU(flags=0x01)))
+b2=IPv6(str(IPv6(src=coa, dst=cn)/IPv6ExtHdrDestOpt(options=HAO(hoa=hoa))/MIP6MH_BU(flags=~0x01)))
+c=IPv6(str(IPv6(src=cn, dst=coa)/IPv6ExtHdrRouting(type=2, addresses=[hoa])/MIP6MH_BA()))
+b.answers(a) and not a.answers(b) and c.answers(b) and not b.answers(c) and not c.answers(b2)
+
+
++ Home Test Init Message
+
+= MIP6MH_HoTI - Build (default values)
+str(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_HoTI()) == '`\x00\x00\x00\x00\x0e\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x00\x01\x00g\xf5\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= MIP6MH_HoTI - Dissection (default values)
+a=IPv6('`\x00\x00\x00\x00\x0e\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x00\x01\x00g\xf5\x00\x00\x00\x00\x00\x00\x00\x00')
+b = a.payload
+a.nh == 135 and isinstance(b, MIP6MH_HoTI) and b.nh==59 and b.mhtype == 1 and b.len== 0 and b.res == 0 and b.cksum == 0x67f5 and b.cookie == '\x00'*8
+
+
+= MIP6MH_HoTI - Build (specific values)
+str(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_HoTI(res=0x77, cksum=0x8899, cookie="\xAA"*8)) == '`\x00\x00\x00\x00\x0e\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x00\x01w\x88\x99\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'
+
+= MIP6MH_HoTI - Dissection (specific values)
+a=IPv6('`\x00\x00\x00\x00\x0e\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x00\x01w\x88\x99\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa')
+b=a.payload
+a.nh == 135 and isinstance(b, MIP6MH_HoTI) and b.nh==59 and b.mhtype == 1 and b.len== 0 and b.res == 0x77 and b.cksum == 0x8899 and b.cookie == '\xAA'*8
+
+
++ Care-of Test Init Message
+
+= MIP6MH_CoTI - Build (default values)
+str(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_CoTI()) == '`\x00\x00\x00\x00\x0e\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x00\x02\x00f\xf5\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= MIP6MH_CoTI - Dissection (default values)
+a=IPv6('`\x00\x00\x00\x00\x0e\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x00\x02\x00f\xf5\x00\x00\x00\x00\x00\x00\x00\x00')
+b = a.payload
+a.nh == 135 and isinstance(b, MIP6MH_CoTI) and b.nh==59 and b.mhtype == 2 and b.len== 0 and b.res == 0 and b.cksum == 0x66f5 and b.cookie == '\x00'*8
+
+= MIP6MH_CoTI - Build (specific values)
+str(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_CoTI(res=0x77, cksum=0x8899, cookie="\xAA"*8)) == '`\x00\x00\x00\x00\x0e\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x00\x02w\x88\x99\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'
+
+= MIP6MH_CoTI - Dissection (specific values)
+a=IPv6('`\x00\x00\x00\x00\x0e\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x00\x02w\x88\x99\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa')
+b=a.payload
+a.nh == 135 and isinstance(b, MIP6MH_CoTI) and b.nh==59 and b.mhtype == 2 and b.len== 0 and b.res == 0x77 and b.cksum == 0x8899 and b.cookie == '\xAA'*8
+
+
++ Home Test Message
+
+= MIP6MH_HoT - Build (default values)
+str(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_HoT()) == '`\x00\x00\x00\x00\x18\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x02\x03\x00e\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= MIP6MH_HoT - Dissection (default values)
+a=IPv6('`\x00\x00\x00\x00\x18\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x02\x03\x00e\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+b = a.payload
+a.nh == 135 and isinstance(b, MIP6MH_HoT) and b.nh==59 and b.mhtype == 3 and b.len== 2 and b.res == 0 and b.cksum == 0x65e9 and b.index == 0 and b.cookie == '\x00'*8 and b.token == '\x00'*8
+
+= MIP6MH_HoT - Build (specific values)
+str(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_HoT(res=0x77, cksum=0x8899, cookie="\xAA"*8, index=0xAABB, token='\xCC'*8)) == '`\x00\x00\x00\x00\x18\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x02\x03w\x88\x99\xaa\xbb\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc'
+
+= MIP6MH_HoT - Dissection (specific values)
+a=IPv6('`\x00\x00\x00\x00\x18\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x02\x03w\x88\x99\xaa\xbb\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc')
+b = a.payload
+a.nh == 135 and isinstance(b, MIP6MH_HoT) and b.nh==59 and b.mhtype == 3 and b.len== 2 and b.res == 0x77 and b.cksum == 0x8899 and b.index == 0xAABB and b.cookie == '\xAA'*8 and b.token == '\xCC'*8
+
+
++ Care-of Test Message
+
+= MIP6MH_CoT - Build (default values)
+str(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_CoT()) == '`\x00\x00\x00\x00\x18\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x02\x04\x00d\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+= MIP6MH_CoT - Dissection (default values)
+a=IPv6('`\x00\x00\x00\x00\x18\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x02\x04\x00d\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+b = a.payload
+a.nh == 135 and isinstance(b, MIP6MH_HoT) and b.nh==59 and b.mhtype == 4 and b.len== 2 and b.res == 0 and b.cksum == 0x64e9 and b.index == 0 and b.cookie == '\x00'*8 and b.token == '\x00'*8
+
+= MIP6MH_CoT - Build (specific values)
+str(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_CoT(res=0x77, cksum=0x8899, cookie="\xAA"*8, index=0xAABB, token='\xCC'*8)) == '`\x00\x00\x00\x00\x18\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x02\x04w\x88\x99\xaa\xbb\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc'
+
+= MIP6MH_CoT - Dissection (specific values)
+a=IPv6('`\x00\x00\x00\x00\x18\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x02\x04w\x88\x99\xaa\xbb\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc')
+b = a.payload
+a.nh == 135 and isinstance(b, MIP6MH_CoT) and b.nh==59 and b.mhtype == 4 and b.len== 2 and b.res == 0x77 and b.cksum == 0x8899 and b.index == 0xAABB and b.cookie == '\xAA'*8 and b.token == '\xCC'*8
+
+
++ Binding Update Message
+
+= MIP6MH_BU - build (default values)
+s= '`\x00\x00\x00\x00(<@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x87\x02\x01\x02\x00\x00\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;\x01\x05\x00\xee`\x00\x00\xd0\x00\x00\x03\x01\x02\x00\x00'
+str(IPv6()/IPv6ExtHdrDestOpt(options=[HAO()])/MIP6MH_BU()) == s
+
+= MIP6MH_BU - dissection (default values)
+p = IPv6(s)
+p[MIP6MH_BU].len == 1
+
+= MIP6MH_BU - build
+s = '`\x00\x00\x00\x00P<@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x87\x02\x01\x02\x00\x00\xc9\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe;\x06\x05\x00\xea\xf2\x00\x00\xd0\x00\x00*\x01\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+str(IPv6()/IPv6ExtHdrDestOpt(options=[HAO(hoa='2001:db8::cafe')])/MIP6MH_BU(mhtime=42, options=[MIP6OptAltCoA(),MIP6OptMobNetPrefix()])) == s
+
+= MIP6MH_BU - dissection
+p = IPv6(s)
+p[MIP6MH_BU].cksum == 0xeaf2 and p[MIP6MH_BU].len == 6 and len(p[MIP6MH_BU].options) == 4 and p[MIP6MH_BU].mhtime == 42
+
+
++ Binding ACK Message
+
+= MIP6MH_BA - build
+s = '`\x00\x00\x00\x00\x10\x87@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01;\x01\x06\x00\xbc\xb9\x00\x80\x00\x00\x00*\x01\x02\x00\x00'
+str(IPv6()/MIP6MH_BA(mhtime=42)) == s
+
+= MIP6MH_BA - dissection
+p = IPv6(s)
+p[MIP6MH_BA].cksum == 0xbcb9 and p[MIP6MH_BA].len == 1 and len(p[MIP6MH_BA].options) == 1 and p[MIP6MH_BA].mhtime == 42
+
+
++ Binding ERR Message
+
+= MIP6MH_BE - build
+s = '`\x00\x00\x00\x00\x18\x87@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01;\x02\x07\x00\xbbY\x02\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02'
+str(IPv6()/MIP6MH_BE(status=2, ha='1::2')) == s
+
+= MIP6MH_BE - dissection
+p = IPv6(s)
+p[MIP6MH_BE].cksum=0xba10 and p[MIP6MH_BE].len == 1 and len(p[MIP6MH_BE].options) == 1
+
+
diff --git a/test/run_tests b/test/run_tests
new file mode 100755
index 000000000..46b9dcb31
--- /dev/null
+++ b/test/run_tests
@@ -0,0 +1,8 @@
+#! /bin/sh
+DIR=$(dirname $0)/..
+if [ "$*" == "" ]
+then
+PYTHONPATH=$DIR exec python ${DIR}/scapy/tools/UTscapy.py -t regression.uts -f html -o /tmp/scapy_regression_test_$(date +%Y%M%d-%H%H%S).html
+else
+PYTHONPATH=$DIR exec python ${DIR}/scapy/tools/UTscapy.py "$@"
+fi