Home | History | Annotate | Download | only in test
      1 % Regression tests for Scapy
      2 
      3 # More informations at http://www.secdev.org/projects/UTscapy/
      4 
      5 ############
      6 ############
      7 + Informations on Scapy
      8 
      9 = Get conf
     10 ~ conf command
     11 * Dump the current configuration
     12 conf
     13 
     14 IP().src
     15 scapy.consts.LOOPBACK_INTERFACE
     16 
     17 = List layers
     18 ~ conf command
     19 ls()
     20 
     21 = List commands
     22 ~ conf command
     23 lsc()
     24 
     25 = List contribs
     26 def test_list_contrib():
     27     with ContextManagerCaptureOutput() as cmco:
     28         list_contrib()
     29         result_list_contrib = cmco.get_output()
     30     assert("http2               : HTTP/2 (RFC 7540, RFC 7541)              status=loads" in result_list_contrib)
     31     assert(len(result_list_contrib.split('\n')) > 40)
     32 
     33 test_list_contrib()
     34 
     35 = Configuration
     36 ~ conf
     37 conf.debug_dissector = True
     38 
     39 
     40 ###########
     41 ###########
     42 = UTscapy route check
     43 * Check that UTscapy has correctly replaced the routes. Many tests won't work otherwise
     44 
     45 if WINDOWS:
     46     route_add_loopback()
     47 
     48 IP().src
     49 assert _ == "127.0.0.1"
     50 
     51 ############
     52 ############
     53 + Scapy functions tests
     54 
     55 = Interface related functions
     56 
     57 get_if_raw_hwaddr(conf.iface)
     58 
     59 bytes_hex(get_if_raw_addr(conf.iface))
     60 
     61 def get_dummy_interface():
     62     """Returns a dummy network interface"""
     63     if WINDOWS:
     64         data = {}
     65         data["name"] = "dummy0"
     66         data["description"] = "Does not exist"
     67         data["win_index"] = -1
     68         data["guid"] = "{1XX00000-X000-0X0X-X00X-00XXXX000XXX}"
     69         data["invalid"] = True
     70         dummy_int = NetworkInterface(data)
     71         dummy_int.pcap_name = "\\Device\\NPF_" + data["guid"]
     72         conf.cache_ipaddrs[dummy_int.pcap_name] = b'\x7f\x00\x00\x01'
     73         return dummy_int
     74     else:
     75         return "dummy0"
     76 
     77 get_if_raw_addr(get_dummy_interface())
     78 
     79 get_if_list()
     80 
     81 get_if_raw_addr6(conf.iface6)
     82 
     83 = Test read_routes6() - default output
     84 
     85 routes6 = read_routes6()
     86 if WINDOWS:
     87     route_add_loopback(routes6, True)
     88 
     89 routes6
     90 
     91 # Expected results:
     92 # - one route if there is only the loopback interface
     93 # - three routes if there is a network interface
     94 
     95 if routes6:
     96     iflist = get_if_list()
     97     if WINDOWS:
     98         route_add_loopback(ipv6=True, iflist=iflist)
     99     if iflist == [LOOPBACK_NAME]:
    100         len(routes6) == 1
    101     elif len(iflist) >= 2:
    102         len(routes6) >= 3
    103     else:
    104         False
    105 else:
    106     # IPv6 seems disabled. Force a route to ::1
    107     conf.route6.routes.append(("::1", 128, "::", LOOPBACK_NAME, ["::1"], 1))
    108     True
    109 
    110 = Test read_routes6() - check mandatory routes
    111 
    112 if len(routes6):
    113     assert(len([r for r in routes6 if r[0] == "::1" and r[4] == ["::1"]]) >= 1)
    114     if len(iflist) >= 2:
    115         assert(len([r for r in routes6 if r[0] == "fe80::" and r[1] == 64]) >= 1)
    116         len([r for r in routes6 if in6_islladdr(r[0]) and r[1] == 128 and r[4] == ["::1"]]) >= 1
    117 else:
    118     True
    119 
    120 = Test ifchange()
    121 conf.route6.ifchange(LOOPBACK_NAME, "::1/128")
    122 True
    123 
    124 
    125 ############
    126 ############
    127 + Main.py tests
    128 
    129 = Pickle and unpickle a packet
    130 
    131 import scapy.modules.six as six
    132 
    133 a = IP(dst="192.168.0.1")/UDP()
    134 
    135 b = six.moves.cPickle.dumps(a)
    136 c = six.moves.cPickle.loads(b)
    137 
    138 assert c[IP].dst == "192.168.0.1"
    139 assert raw(c) == raw(a)
    140 
    141 = Usage test
    142 
    143 from scapy.main import _usage
    144 try:
    145     _usage()
    146     assert False
    147 except SystemExit:
    148     assert True
    149 
    150 = Session test
    151 
    152 # This is automatic when using the console
    153 def get_var(var):
    154     return six.moves.builtins.__dict__["scapy_session"][var]
    155 
    156 def set_var(var, value):
    157     six.moves.builtins.__dict__["scapy_session"][var] = value
    158 
    159 def del_var(var):
    160     del(six.moves.builtins.__dict__["scapy_session"][var])
    161 
    162 init_session(None, {"init_value": 123})
    163 set_var("test_value", "8.8.8.8") # test_value = "8.8.8.8"
    164 save_session()
    165 del_var("test_value")
    166 load_session()
    167 update_session()
    168 assert get_var("test_value") == "8.8.8.8" #test_value == "8.8.8.8"
    169 assert get_var("init_value") == 123
    170  
    171 = Session test with fname
    172 
    173 init_session("scapySession2")
    174 set_var("test_value", IP(dst="192.168.0.1")) # test_value = IP(dst="192.168.0.1")
    175 save_session(fname="scapySession1.dat")
    176 del_var("test_value")
    177 
    178 set_var("z", True) #z = True
    179 load_session(fname="scapySession1.dat")
    180 try:
    181     get_var("z")
    182     assert False
    183 except:
    184     pass
    185 
    186 set_var("z", False) #z = False
    187 update_session(fname="scapySession1.dat")
    188 assert get_var("test_value").dst == "192.168.0.1" #test_value.dst == "192.168.0.1"
    189 assert not get_var("z")
    190 
    191 = Clear session files
    192 
    193 os.remove("scapySession1.dat")
    194 
    195 = Test temporary file creation
    196 ~ appveyor_only
    197 
    198 scapy_delete_temp_files()
    199 
    200 tmpfile = get_temp_file(autoext=".ut")
    201 tmpfile
    202 if WINDOWS:
    203     assert("scapy" in tmpfile and tmpfile.lower().startswith('c:\\users\\appveyor\\appdata\\local\\temp'))
    204 else:
    205     import platform
    206     BYPASS_TMP = platform.python_implementation().lower() == "pypy" or DARWIN
    207     assert("scapy" in tmpfile and (BYPASS_TMP == True or "/tmp/" in tmpfile))
    208 
    209 assert(conf.temp_files[0].endswith(".ut"))
    210 scapy_delete_temp_files()
    211 assert(len(conf.temp_files) == 0)
    212 
    213 = Emulate interact()
    214 
    215 import mock, sys
    216 from scapy.main import interact
    217 # Detect IPython
    218 try:
    219     import IPython
    220 except:
    221     code_interact_import = "scapy.main.code.interact"
    222 else:
    223     code_interact_import = "IPython.terminal.embed.InteractiveShellEmbed"
    224 
    225 @mock.patch(code_interact_import)
    226 def interact_emulator(code_int, extra_args=[]):
    227     try:
    228         code_int.side_effect = lambda *args, **kwargs: lambda *args, **kwargs: None
    229         interact(argv=["-s scapy1"] + extra_args, mybanner="What a test")
    230         return True
    231     except:
    232         raise
    233         return False
    234     finally:
    235         sys.ps1 = ">>> "
    236 
    237 assert interact_emulator()  # Default
    238 assert not interact_emulator(extra_args=["-?"])  # Failing
    239 assert interact_emulator(extra_args=["-d"])  # Extended
    240 
    241 = Test sane function
    242 sane("A\x00\xFFB") == "A..B"
    243 
    244 = Test lhex function
    245 assert(lhex(42) == "0x2a")
    246 assert(lhex((28,7)) == "(0x1c, 0x7)")
    247 assert(lhex([28,7]) == "[0x1c, 0x7]")
    248 
    249 = Test restart function
    250 import mock
    251 conf.interactive = True
    252 
    253 try:
    254     from scapy.utils import restart
    255     import os
    256     @mock.patch("os.execv")
    257     @mock.patch("subprocess.call")
    258     @mock.patch("os._exit")
    259     def _test(e, m, m2):
    260         def check(x, y=[]):
    261             z = [x] + y if not isinstance(x, list) else x + y
    262             assert os.path.isfile(z[0])
    263             assert os.path.isfile(z[1])
    264             return 0
    265         m2.side_effect = check
    266         m.side_effect = check
    267         e.side_effect = lambda x: None
    268         restart()
    269     _test()
    270 finally:
    271     conf.interactive = False
    272 
    273 = Test linehexdump function
    274 conf_color_theme = conf.color_theme
    275 conf.color_theme = BlackAndWhite()
    276 assert(linehexdump(Ether(src="00:01:02:03:04:05"), dump=True) == "FFFFFFFFFFFF0001020304059000 ..............")
    277 conf.color_theme = conf_color_theme
    278 
    279 = Test chexdump function
    280 chexdump(Ether(src="00:01:02:02:04:05"), dump=True) == "0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x02, 0x04, 0x05, 0x90, 0x00"
    281 
    282 = Test repr_hex function
    283 repr_hex("scapy") == "7363617079"
    284 
    285 = Test hexstr function
    286 hexstr(b"A\x00\xFFB") == "41 00 ff 42  A..B"
    287 
    288 = Test fletcher16 functions
    289 assert(fletcher16_checksum(b"\x28\x07") == 22319)
    290 assert(fletcher16_checkbytes(b"\x28\x07", 1) == b"\xaf(")
    291 
    292 = Test hexdiff function
    293 ~ not_pypy
    294 def test_hexdiff():
    295     conf_color_theme = conf.color_theme
    296     conf.color_theme = BlackAndWhite()
    297     with ContextManagerCaptureOutput() as cmco:
    298         hexdiff("abcde", "abCde")
    299         result_hexdiff = cmco.get_output()
    300     conf.interactive = True
    301     conf.color_theme = conf_color_theme
    302     expected  = "0000        61 62 63 64 65                                     abcde\n"
    303     expected += "     0000   61 62 43 64 65                                     abCde\n"
    304     assert(result_hexdiff == expected)
    305 
    306 test_hexdiff()
    307 
    308 = Test mysummary functions - Ether
    309 
    310 Ether(dst="ff:ff:ff:ff:ff:ff", src="ff:ff:ff:ff:ff:ff", type=0x9000)
    311 assert _.mysummary() in ['ff:ff:ff:ff:ff:ff > ff:ff:ff:ff:ff:ff (%s)' % loop
    312                          for loop in ['0x9000', 'LOOP']]
    313 
    314 = Test zerofree_randstring function
    315 random.seed(0x2807)
    316 zerofree_randstring(4) in [b"\xd2\x12\xe4\x5b", b'\xd3\x8b\x13\x12']
    317 
    318 = Test export_object and import_object functions
    319 import mock
    320 def test_export_import_object():
    321     with ContextManagerCaptureOutput() as cmco:
    322         export_object(2807)
    323         result_export_object = cmco.get_output(eval_bytes=True)
    324     assert(result_export_object.startswith("eNprYPL9zqUHAAdrAf8="))
    325     assert(import_object(result_export_object) == 2807)
    326 
    327 test_export_import_object()
    328 
    329 = Test tex_escape function
    330 tex_escape("$#_") == "\\$\\#\\_"
    331 
    332 = Test colgen function
    333 f = colgen(range(3))
    334 assert(len([next(f) for i in range(2)]) == 2)
    335 
    336 = Test incremental_label function
    337 f = incremental_label()
    338 assert([next(f) for i in range(2)] == ["tag00000", "tag00001"])
    339 
    340 = Test corrupt_* functions
    341 import random
    342 random.seed(0x2807)
    343 assert(corrupt_bytes("ABCDE") in [b"ABCDW", b"ABCDX"])
    344 assert(sane(corrupt_bytes("ABCDE", n=3)) in ["A.8D4", ".2.DE"])
    345 
    346 assert(corrupt_bits("ABCDE") in [b"EBCDE", b"ABCDG"])
    347 assert(sane(corrupt_bits("ABCDE", n=3)) in ["AF.EE", "QB.TE"])
    348 
    349 = Test save_object and load_object functions
    350 import tempfile
    351 fd, fname = tempfile.mkstemp()
    352 save_object(fname, 2807)
    353 assert(load_object(fname) == 2807)
    354 
    355 = Test whois function
    356 if not WINDOWS:
    357     result = whois("193.0.6.139")
    358     assert(b"inetnum" in result and b"Amsterdam" in result)
    359 
    360 = Test manuf DB methods
    361 ~ manufdb
    362 assert(conf.manufdb._resolve_MAC("00:00:0F:01:02:03") == "Next:01:02:03")
    363 assert(conf.manufdb._get_short_manuf("00:00:0F:01:02:03") == "Next")
    364 assert(in6_addrtovendor("fe80::0200:0fff:fe01:0203").lower().startswith("next"))
    365 
    366 = Test utility functions - network related
    367 ~ netaccess
    368 
    369 atol("www.secdev.org") == 3642339845
    370 
    371 = Test autorun functions
    372 
    373 ret = autorun_get_text_interactive_session("IP().src")
    374 assert(ret == (">>> IP().src\n'127.0.0.1'\n", '127.0.0.1'))
    375 
    376 ret = autorun_get_html_interactive_session("IP().src")
    377 assert(ret == ("<span class=prompt>&gt;&gt;&gt; </span>IP().src\n'127.0.0.1'\n", '127.0.0.1'))
    378 
    379 ret = autorun_get_latex_interactive_session("IP().src")
    380 assert(ret == ("\\textcolor{blue}{{\\tt\\char62}{\\tt\\char62}{\\tt\\char62} }IP().src\n'127.0.0.1'\n", '127.0.0.1'))
    381 
    382 = Test utility TEX functions
    383 
    384 assert tex_escape("{scapy}\\^$~#_&%|><") == "{\\tt\\char123}scapy{\\tt\\char125}{\\tt\\char92}\\^{}\\${\\tt\\char126}\\#\\_\\&\\%{\\tt\\char124}{\\tt\\char62}{\\tt\\char60}"
    385 
    386 a = colgen(1, 2, 3)
    387 assert next(a) == (1, 2, 2)
    388 assert next(a) == (1, 3, 3)
    389 assert next(a) == (2, 2, 1)
    390 assert next(a) == (2, 3, 2)
    391 assert next(a) == (2, 1, 3)
    392 assert next(a) == (3, 3, 1)
    393 assert next(a) == (3, 1, 2)
    394 assert next(a) == (3, 2, 3)
    395 
    396 = Test config file functions
    397 
    398 saved_conf_verb = conf.verb
    399 fd, fname = tempfile.mkstemp()
    400 os.write(fd, b"conf.verb = 42\n")
    401 os.close(fd)
    402 from scapy.main import _read_config_file
    403 _read_config_file(fname, globals(), locals())
    404 assert(conf.verb == 42)
    405 conf.verb = saved_conf_verb
    406 
    407 = Test CacheInstance repr
    408 
    409 conf.netcache
    410 
    411 
    412 ############
    413 ############
    414 + Basic tests
    415 
    416 * Those test are here mainly to check nothing has been broken
    417 * and to catch Exceptions
    418 
    419 = Packet class methods
    420 p = IP()/ICMP()
    421 ret = p.do_build_ps()                                                                                                                             
    422 assert(ret[0] == b"@\x00\x00\x00\x00\x01\x00\x00@\x01\x00\x00\x7f\x00\x00\x01\x7f\x00\x00\x01\x08\x00\x00\x00\x00\x00\x00\x00")
    423 assert(len(ret[1]) == 2)
    424 
    425 assert(p[ICMP].firstlayer() == p)
    426 
    427 assert(p.command() == "IP()/ICMP()")
    428 
    429 p.decode_payload_as(UDP)
    430 assert(p.sport == 2048 and p.dport == 63487)
    431 
    432 = hide_defaults
    433 conf_color_theme = conf.color_theme
    434 conf.color_theme = BlackAndWhite()
    435 p = IP(ttl=64)/ICMP()
    436 assert(repr(p) in ["<IP  frag=0 ttl=64 proto=icmp |<ICMP  |>>", "<IP  frag=0 ttl=64 proto=1 |<ICMP  |>>"])
    437 p.hide_defaults()
    438 assert(repr(p) in ["<IP  frag=0 proto=icmp |<ICMP  |>>", "<IP  frag=0 proto=1 |<ICMP  |>>"])
    439 conf.color_theme = conf_color_theme
    440 
    441 = split_layers
    442 p = IP()/ICMP()
    443 s = raw(p)
    444 split_layers(IP, ICMP, proto=1)
    445 assert(Raw in IP(s))
    446 bind_layers(IP, ICMP, frag=0, proto=1)
    447 
    448 = fuzz
    449 ~ not_pypy random_weird_py3
    450 random.seed(0x2807)
    451 raw(fuzz(IP()/ICMP()))
    452 assert _ in [
    453     b'u\x14\x00\x1c\xc2\xf6\x80\x00\xde\x01k\xd3\x7f\x00\x00\x01\x7f\x00\x00\x01y\xc9>\xa6\x84\xd8\xc2\xb7',
    454     b'E\xa7\x00\x1c\xb0c\xc0\x00\xf6\x01U\xd3\x7f\x00\x00\x01\x7f\x00\x00\x01\xfex\xb3\x92B<\x0b\xb8',
    455 ]
    456 
    457 = Building some packets
    458 ~ basic IP TCP UDP NTP LLC SNAP Dot11
    459 IP()/TCP()
    460 Ether()/IP()/UDP()/NTP()
    461 Dot11()/LLC()/SNAP()/IP()/TCP()/"XXX"
    462 IP(ttl=25)/TCP(sport=12, dport=42)
    463 IP().summary()
    464 
    465 = Manipulating some packets
    466 ~ basic IP TCP
    467 a=IP(ttl=4)/TCP()
    468 a.ttl
    469 a.ttl=10
    470 del(a.ttl)
    471 a.ttl
    472 TCP in a
    473 a[TCP]
    474 a[TCP].dport=[80,443]
    475 a
    476 assert(a.copy().time == a.time)
    477 a=3
    478 
    479 
    480 = Checking overloads
    481 ~ basic IP TCP Ether
    482 a=Ether()/IP()/TCP()
    483 a.proto
    484 _ == 6
    485 
    486 
    487 = sprintf() function
    488 ~ basic sprintf Ether IP UDP NTP
    489 a=Ether()/IP()/IP(ttl=4)/UDP()/NTP()
    490 a.sprintf("%type% %IP.ttl% %#05xr,UDP.sport% %IP:2.ttl%")
    491 _ in [ '0x800 64 0x07b 4', 'IPv4 64 0x07b 4']
    492 
    493 
    494 = sprintf() function 
    495 ~ basic sprintf IP TCP SNAP LLC Dot11
    496 * This test is on the conditionnal substring feature of <tt>sprintf()</tt>
    497 a=Dot11()/LLC()/SNAP()/IP()/TCP()
    498 a.sprintf("{IP:{TCP:flags=%TCP.flags%}{UDP:port=%UDP.ports%} %IP.src%}")
    499 _ == 'flags=S 127.0.0.1'
    500 
    501 
    502 = haslayer function
    503 ~ basic haslayer IP TCP ICMP ISAKMP
    504 x=IP(id=1)/ISAKMP_payload_SA(prop=ISAKMP_payload_SA(prop=IP()/ICMP()))/TCP()
    505 TCP in x, ICMP in x, IP in x, UDP in x
    506 _ == (True,True,True,False)
    507 
    508 = getlayer function
    509 ~ basic getlayer IP ISAKMP UDP
    510 x=IP(id=1)/ISAKMP_payload_SA(prop=IP(id=2)/UDP(dport=1))/IP(id=3)/UDP(dport=2)
    511 x[IP]
    512 x[IP:2]
    513 x[IP:3]
    514 x.getlayer(IP,3)
    515 x.getlayer(IP,4)
    516 x[UDP]
    517 x[UDP:1]
    518 x[UDP:2]
    519 assert(x[IP].id == 1 and x[IP:2].id == 2 and x[IP:3].id == 3 and 
    520        x.getlayer(IP).id == 1 and x.getlayer(IP,3).id == 3 and
    521        x.getlayer(IP,4) == None and
    522        x[UDP].dport == 1 and x[UDP:2].dport == 2)
    523 try:
    524     x[IP:4]
    525 except IndexError:
    526     True
    527 else:
    528     False
    529 
    530 = getlayer with a filter
    531 ~ getlayer IP
    532 pkt = IP() / IP(ttl=3) / IP()
    533 assert pkt[IP::{"ttl":3}].ttl == 3
    534 assert pkt.getlayer(IP, ttl=3).ttl == 3
    535 
    536 = specific haslayer and getlayer implementations for NTP
    537 ~ haslayer getlayer NTP
    538 pkt = IP() / UDP() / NTPHeader()
    539 assert NTP in pkt
    540 assert pkt.haslayer(NTP)
    541 assert isinstance(pkt[NTP], NTPHeader)
    542 assert isinstance(pkt.getlayer(NTP), NTPHeader)
    543 
    544 = specific haslayer and getlayer implementations for EAP
    545 ~ haslayer getlayer EAP
    546 pkt = Ether() / EAPOL() / EAP_MD5()
    547 assert EAP in pkt
    548 assert pkt.haslayer(EAP)
    549 assert isinstance(pkt[EAP], EAP_MD5)
    550 assert isinstance(pkt.getlayer(EAP), EAP_MD5)
    551 
    552 = specific haslayer and getlayer implementations for RadiusAttribute
    553 ~ haslayer getlayer RadiusAttribute
    554 pkt = RadiusAttr_EAP_Message()
    555 assert RadiusAttribute in pkt
    556 assert pkt.haslayer(RadiusAttribute)
    557 assert isinstance(pkt[RadiusAttribute], RadiusAttr_EAP_Message)
    558 assert isinstance(pkt.getlayer(RadiusAttribute), RadiusAttr_EAP_Message)
    559 
    560 
    561 = equality
    562 ~ basic
    563 w=Ether()/IP()/UDP(dport=53)
    564 x=Ether()/IP(version=4)/UDP()
    565 y=Ether()/IP()/UDP(dport=4)
    566 z=Ether()/IP()/UDP()/NTP()
    567 t=Ether()/IP()/TCP()
    568 x==y, x==z, x==t, y==z, y==t, z==t, w==x
    569 _ == (False, False, False, False, False, False, True)
    570 
    571 = answers
    572 ~ basic
    573 a1, a2 = "1.2.3.4", "5.6.7.8"
    574 p1 = IP(src=a1, dst=a2)/ICMP(type=8)
    575 p2 = IP(src=a2, dst=a1)/ICMP(type=0)
    576 assert p1.hashret() == p2.hashret()
    577 assert not p1.answers(p2)
    578 assert p2.answers(p1)
    579 assert p1 > p2
    580 assert p2 < p1
    581 assert p1 == p1
    582 conf_back = conf.checkIPinIP
    583 conf.checkIPinIP = True
    584 px = [IP()/p1, IPv6()/p1]
    585 assert not any(p.hashret() == p2.hashret() for p in px)
    586 assert not any(p.answers(p2) for p in px)
    587 assert not any(p2.answers(p) for p in px)
    588 conf.checkIPinIP = False
    589 assert all(p.hashret() == p2.hashret() for p in px)
    590 assert not any(p.answers(p2) for p in px)
    591 assert all(p2.answers(p) for p in px)
    592 conf.checkIPinIP = conf_back
    593 
    594 a1, a2 = Net("www.google.com"), Net("www.secdev.org")
    595 prt1, prt2 = 12345, 54321
    596 s1, s2 = 2767216324, 3845532842
    597 p1 = IP(src=a1, dst=a2)/TCP(flags='SA', seq=s1, ack=s2, sport=prt1, dport=prt2)
    598 p2 = IP(src=a2, dst=a1)/TCP(flags='R', seq=s2, ack=0, sport=prt2, dport=prt1)
    599 assert p2.answers(p1)
    600 assert not p1.answers(p2)
    601 # Not available yet because of IPv6
    602 # a1, a2 = Net6("www.google.com"), Net6("www.secdev.org")
    603 p1 = IP(src=a1, dst=a2)/TCP(flags='S', seq=s1, ack=0, sport=prt1, dport=prt2)
    604 p2 = IP(src=a2, dst=a1)/TCP(flags='RA', seq=0, ack=s1+1, sport=prt2, dport=prt1)
    605 assert p2.answers(p1)
    606 assert not p1.answers(p2)
    607 p1 = IP(src=a1, dst=a2)/TCP(flags='S', seq=s1, ack=0, sport=prt1, dport=prt2)
    608 p2 = IP(src=a2, dst=a1)/TCP(flags='SA', seq=s2, ack=s1+1, sport=prt2, dport=prt1)
    609 assert p2.answers(p1)
    610 assert not p1.answers(p2)
    611 p1 = IP(src=a1, dst=a2)/TCP(flags='A', seq=s1, ack=s2+1, sport=prt1, dport=prt2)
    612 assert not p2.answers(p1)
    613 assert p1.answers(p2)
    614 p1 = IP(src=a1, dst=a2)/TCP(flags='S', seq=s1, ack=0, sport=prt1, dport=prt2)
    615 p2 = IP(src=a2, dst=a1)/TCP(flags='SA', seq=s2, ack=s1+10, sport=prt2, dport=prt1)
    616 assert not p2.answers(p1)
    617 assert not p1.answers(p2)
    618 p1 = IP(src=a1, dst=a2)/TCP(flags='A', seq=s1, ack=s2+1, sport=prt1, dport=prt2)
    619 assert not p2.answers(p1)
    620 assert not p1.answers(p2)
    621 p1 = IP(src=a1, dst=a2)/TCP(flags='A', seq=s1+9, ack=s2+10, sport=prt1, dport=prt2)
    622 assert not p2.answers(p1)
    623 assert not p1.answers(p2)
    624 
    625 
    626 ############
    627 ############
    628 + Tests on padding
    629 
    630 = Padding assembly
    631 raw(Padding("abc"))
    632 assert( _ == b"abc" )
    633 raw(Padding("abc")/Padding("def"))
    634 assert( _ == b"abcdef" )
    635 raw(Raw("ABC")/Padding("abc")/Padding("def"))
    636 assert( _ == b"ABCabcdef" )
    637 raw(Raw("ABC")/Padding("abc")/Raw("DEF")/Padding("def"))
    638 assert( _ == b"ABCDEFabcdef" )
    639 
    640 = Padding and length computation
    641 IP(raw(IP()/Padding("abc")))
    642 assert( _.len == 20 and len(_) == 23 )
    643 IP(raw(IP()/Raw("ABC")/Padding("abc")))
    644 assert( _.len == 23 and len(_) == 26 )
    645 IP(raw(IP()/Raw("ABC")/Padding("abc")/Padding("def")))
    646 assert( _.len == 23 and len(_) == 29 )
    647 
    648 = PadField test
    649 ~ PadField padding
    650 
    651 class TestPad(Packet):
    652     fields_desc = [ PadField(StrNullField("st", b""),4), StrField("id", b"")]
    653 
    654 TestPad() == TestPad(raw(TestPad()))
    655 
    656 
    657 ############
    658 ############
    659 + Tests on default value changes mechanism
    660 
    661 = Creation of an IPv3 class from IP class with different default values
    662 class IPv3(IP):
    663     version = 3
    664     ttl = 32
    665 
    666 = Test of IPv3 class
    667 a = IPv3()
    668 a.version, a.ttl
    669 assert(_ == (3,32))
    670 raw(a)
    671 assert(_ == b'5\x00\x00\x14\x00\x01\x00\x00 \x00\xac\xe7\x7f\x00\x00\x01\x7f\x00\x00\x01')
    672 
    673 
    674 ############
    675 ############
    676 + ISAKMP transforms test
    677 
    678 = ISAKMP creation
    679 ~ IP UDP ISAKMP 
    680 p=IP(src='192.168.8.14',dst='10.0.0.1')/UDP()/ISAKMP()/ISAKMP_payload_SA(prop=ISAKMP_payload_Proposal(trans=ISAKMP_payload_Transform(transforms=[('Encryption', 'AES-CBC'), ('Hash', 'MD5'), ('Authentication', 'PSK'), ('GroupDesc', '1536MODPgr'), ('KeyLength', 256), ('LifeType', 'Seconds'), ('LifeDuration', 86400)])/ISAKMP_payload_Transform(res2=12345,transforms=[('Encryption', '3DES-CBC'), ('Hash', 'SHA'), ('Authentication', 'PSK'), ('GroupDesc', '1024MODPgr'), ('LifeType', 'Seconds'), ('LifeDuration', 86400)])))
    681 p.show()
    682 p
    683 
    684 
    685 = ISAKMP manipulation
    686 ~ ISAKMP
    687 p[ISAKMP_payload_Transform:2]
    688 _.res2 == 12345
    689 
    690 = ISAKMP assembly
    691 ~ ISAKMP 
    692 hexdump(p)
    693 raw(p) == b"E\x00\x00\x96\x00\x01\x00\x00@\x11\xa7\x9f\xc0\xa8\x08\x0e\n\x00\x00\x01\x01\xf4\x01\xf4\x00\x82\xbf\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00z\x00\x00\x00^\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00R\x01\x01\x00\x00\x03\x00\x00'\x00\x01\x00\x00\x80\x01\x00\x07\x80\x02\x00\x01\x80\x03\x00\x01\x80\x04\x00\x05\x80\x0e\x01\x00\x80\x0b\x00\x01\x00\x0c\x00\x03\x01Q\x80\x00\x00\x00#\x00\x0109\x80\x01\x00\x05\x80\x02\x00\x02\x80\x03\x00\x01\x80\x04\x00\x02\x80\x0b\x00\x01\x00\x0c\x00\x03\x01Q\x80"
    694 
    695 
    696 = ISAKMP disassembly
    697 ~ ISAKMP
    698 q=IP(raw(p))
    699 q.show()
    700 q[ISAKMP_payload_Transform:2]
    701 _.res2 == 12345
    702 
    703 
    704 ############
    705 ############
    706 + TFTP tests
    707 
    708 = TFTP Options
    709 x=IP()/UDP(sport=12345)/TFTP()/TFTP_RRQ(filename="fname")/TFTP_Options(options=[TFTP_Option(oname="blksize", value="8192"),TFTP_Option(oname="other", value="othervalue")])
    710 assert( raw(x) == b'E\x00\x00H\x00\x01\x00\x00@\x11|\xa2\x7f\x00\x00\x01\x7f\x00\x00\x0109\x00E\x004B6\x00\x01fname\x00octet\x00blksize\x008192\x00other\x00othervalue\x00' )
    711 y=IP(raw(x))
    712 y[TFTP_Option].oname
    713 y[TFTP_Option:2].oname
    714 assert(len(y[TFTP_Options].options) == 2 and y[TFTP_Option].oname == b"blksize")
    715 
    716 
    717 ############
    718 ############
    719 + Dot11 tests
    720 
    721 
    722 = WEP tests
    723 ~ wifi crypto Dot11 LLC SNAP IP TCP
    724 conf.wepkey = "Fobar"
    725 raw(Dot11WEP()/LLC()/SNAP()/IP()/TCP(seq=12345678))
    726 assert(_ == b'\x00\x00\x00\x00\xe3OjYLw\xc3x_%\xd0\xcf\xdeu-\xc3pH#\x1eK\xae\xf5\xde\xe7\xb8\x1d,\xa1\xfe\xe83\xca\xe1\xfe\xbd\xfe\xec\x00)T`\xde.\x93Td\x95C\x0f\x07\xdd')
    727 Dot11WEP(_)
    728 assert(TCP in _ and _[TCP].seq == 12345678)
    729 
    730 = RadioTap Big-Small endian dissection
    731 data = b'\x00\x00\x1a\x00/H\x00\x00\xe1\xd3\xcb\x05\x00\x00\x00\x00@0x\x14@\x01\xac\x00\x00\x00'
    732 r = RadioTap(data)
    733 r.show()
    734 assert r.present == 18479
    735 
    736 
    737 ############
    738 ############
    739 + SNMP tests
    740 
    741 = SNMP assembling
    742 ~ SNMP ASN1
    743 raw(SNMP())
    744 assert(_ == b'0\x18\x02\x01\x01\x04\x06public\xa0\x0b\x02\x01\x00\x02\x01\x00\x02\x01\x000\x00')
    745 SNMP(version="v2c", community="ABC", PDU=SNMPbulk(id=4,varbindlist=[SNMPvarbind(oid="1.2.3.4",value=ASN1_INTEGER(7)),SNMPvarbind(oid="4.3.2.1.2.3",value=ASN1_IA5_STRING("testing123"))]))
    746 raw(_)
    747 assert(_ == b'05\x02\x01\x01\x04\x03ABC\xa5+\x02\x01\x04\x02\x01\x00\x02\x01\x000 0\x08\x06\x03*\x03\x04\x02\x01\x070\x14\x06\x06\x81#\x02\x01\x02\x03\x16\ntesting123')
    748 
    749 = SNMP disassembling
    750 ~ SNMP ASN1
    751 x=SNMP(b'0y\x02\x01\x00\x04\x06public\xa2l\x02\x01)\x02\x01\x00\x02\x01\x000a0!\x06\x12+\x06\x01\x04\x01\x81}\x08@\x04\x02\x01\x07\n\x86\xde\xb78\x04\x0b172.31.19.20#\x06\x12+\x06\x01\x04\x01\x81}\x08@\x04\x02\x01\x07\n\x86\xde\xb76\x04\r255.255.255.00\x17\x06\x12+\x06\x01\x04\x01\x81}\x08@\x04\x02\x01\x05\n\x86\xde\xb9`\x02\x01\x01')
    752 x.show()
    753 assert(x.community==b"public" and x.version == 0)
    754 assert(x.PDU.id == 41 and len(x.PDU.varbindlist) == 3)
    755 assert(x.PDU.varbindlist[0].oid == "1.3.6.1.4.1.253.8.64.4.2.1.7.10.14130104")
    756 assert(x.PDU.varbindlist[0].value == b"172.31.19.2")
    757 assert(x.PDU.varbindlist[2].oid == "1.3.6.1.4.1.253.8.64.4.2.1.5.10.14130400")
    758 assert(x.PDU.varbindlist[2].value == 1)
    759 
    760 = ASN1 - ASN1_Object
    761 assert ASN1_Object(1) == ASN1_Object(1)
    762 assert ASN1_Object(1) > ASN1_Object(0)
    763 assert ASN1_Object(1) >= ASN1_Object(1)
    764 assert ASN1_Object(0) < ASN1_Object(1)
    765 assert ASN1_Object(1) <= ASN1_Object(2)
    766 assert ASN1_Object(1) != ASN1_Object(2)
    767 ASN1_Object(2).show()
    768 
    769 = ASN1 - RandASN1Object
    770 ~ random_weird_py3
    771 a = RandASN1Object()
    772 random.seed(0x2807)
    773 assert raw(a) in [b'A\x02\x07q', b'C\x02\xfe\x92', b'\x1e\x023V']
    774 
    775 = ASN1 - ASN1_BIT_STRING
    776 a = ASN1_BIT_STRING("test", "value")
    777 a
    778 assert raw(a) == b'test'
    779 
    780 a = ASN1_BIT_STRING(b"\xff"*16, "value")
    781 a
    782 assert raw(a) == b'\xff'*16
    783 
    784 = ASN1 - ASN1_SEQUENCE
    785 a = ASN1_SEQUENCE([ASN1_Object(1), ASN1_Object(0)])
    786 assert a.strshow() == '# ASN1_SEQUENCE:\n  <ASN1_Object[1]>\n  <ASN1_Object[0]>\n'
    787 
    788 = ASN1 - ASN1_DECODING_ERROR
    789 a = ASN1_DECODING_ERROR("error", exc=OSError(1))
    790 assert repr(a) == "<ASN1_DECODING_ERROR['error']{{1}}>"
    791 b = ASN1_DECODING_ERROR("error", exc=OSError(ASN1_BIT_STRING("0")))
    792 assert repr(b) == "<ASN1_DECODING_ERROR['error']{{<ASN1_BIT_STRING[0] (7 unused bits)>}}>"
    793 
    794 = ASN1 - ASN1_INTEGER
    795 a = ASN1_INTEGER(int("1"*23))
    796 assert repr(a) in ["0x25a55a46e5da99c71c7 <ASN1_INTEGER[1111111111...1111111111]>",
    797                    "0x25a55a46e5da99c71c7 <ASN1_INTEGER[1111111111...111111111L]>"]
    798 
    799 = RandASN1Object(), specific crashes
    800 
    801 import random
    802 
    803 # ASN1F_NUMERIC_STRING
    804 random.seed(1514315682)
    805 raw(RandASN1Object())
    806 
    807 # ASN1F_VIDEOTEX_STRING
    808 random.seed(1240186058)
    809 raw(RandASN1Object())
    810 
    811 # ASN1F_UTC_TIME & ASN1F_GENERALIZED_TIME
    812 random.seed(1873503288)
    813 raw(RandASN1Object())
    814 
    815 
    816 ############
    817 ############
    818 + Network tests
    819 
    820 * Those tests need network access
    821 
    822 = Sending and receiving an ICMP
    823 ~ netaccess IP ICMP
    824 old_debug_dissector = conf.debug_dissector
    825 conf.debug_dissector = False
    826 x = sr1(IP(dst="www.google.com")/ICMP(),timeout=3)
    827 conf.debug_dissector = old_debug_dissector
    828 x
    829 assert x[IP].ottl() in [32, 64, 128, 255]
    830 assert 0 <= x[IP].hops() <= 126
    831 x is not None and ICMP in x and x[ICMP].type == 0
    832 
    833 = Sending an ICMP message at layer 2 and layer 3
    834 ~ netaccess IP ICMP
    835 tmp = send(IP(dst="8.8.8.8")/ICMP(), return_packets=True, realtime=True)
    836 assert(len(tmp) == 1)
    837 
    838 tmp = sendp(Ether()/IP(dst="8.8.8.8")/ICMP(), return_packets=True, realtime=True)
    839 assert(len(tmp) == 1)
    840 
    841 = Sending an ICMP message 'forever' at layer 2 and layer 3
    842 ~ netaccess IP ICMP
    843 tmp = srloop(IP(dst="8.8.8.8")/ICMP(), count=1)
    844 assert(type(tmp) == tuple and len(tmp[0]) == 1)
    845 
    846 tmp = srploop(Ether()/IP(dst="8.8.8.8")/ICMP(), count=1)
    847 assert(type(tmp) == tuple and len(tmp[0]) == 1)
    848 
    849 = Sending and receiving an ICMP with flooding methods
    850 ~ netaccess IP ICMP
    851 from functools import partial
    852 # flooding methods do not support timeout. Packing the test for security
    853 def _test_flood(flood_function, add_ether=False):
    854     old_debug_dissector = conf.debug_dissector
    855     conf.debug_dissector = False
    856     p = IP(dst="www.google.com")/ICMP()
    857     if add_ether:
    858         p = Ether()/p
    859     x = flood_function(p)
    860     conf.debug_dissector = old_debug_dissector
    861     if type(x) == tuple:
    862         x = x[0][0][1]
    863     x
    864     assert x[IP].ottl() in [32, 64, 128, 255]
    865     assert 0 <= x[IP].hops() <= 126
    866     x is not None and ICMP in x and x[ICMP].type == 0
    867 
    868 _test_srflood = partial(_test_flood, srflood)
    869 t = Thread(target=_test_srflood)
    870 t.start()
    871 t.join(3)
    872 assert not t.is_alive()
    873 
    874 _test_sr1flood = partial(_test_flood, sr1flood)
    875 t = Thread(target=_test_sr1flood)
    876 t.start()
    877 t.join(3)
    878 assert not t.is_alive()
    879 
    880 _test_srpflood = partial(_test_flood, srpflood, True)
    881 t = Thread(target=_test_sr1flood)
    882 t.start()
    883 t.join(3)
    884 assert not t.is_alive()
    885 
    886 _test_srp1flood = partial(_test_flood, srp1flood, True)
    887 t = Thread(target=_test_sr1flood)
    888 t.start()
    889 t.join(3)
    890 assert not t.is_alive()
    891 
    892 = Sending and receiving an ICMPv6EchoRequest
    893 ~ netaccess ipv6
    894 old_debug_dissector = conf.debug_dissector
    895 conf.debug_dissector = False
    896 x = sr1(IPv6(dst="www.google.com")/ICMPv6EchoRequest(),timeout=3)
    897 conf.debug_dissector = old_debug_dissector
    898 x
    899 assert x[IPv6].ottl() in [32, 64, 128, 255]
    900 assert 0 <= x[IPv6].hops() <= 126
    901 x is not None and ICMPv6EchoReply in x and x[ICMPv6EchoReply].type == 129
    902 
    903 = DNS request
    904 ~ netaccess IP UDP DNS
    905 * A possible cause of failure could be that the open DNS (resolver1.opendns.com)
    906 * is not reachable or down.
    907 old_debug_dissector = conf.debug_dissector
    908 conf.debug_dissector = False
    909 dns_ans = sr1(IP(dst="resolver1.opendns.com")/UDP()/DNS(rd=1,qd=DNSQR(qname="www.slashdot.com")),timeout=5)
    910 conf.debug_dissector = old_debug_dissector
    911 DNS in dns_ans
    912 
    913 = Whois request
    914 ~ netaccess IP
    915 * This test retries on failure because it often fails
    916 import time
    917 import socket
    918 success = False
    919 for i in six.moves.range(5):
    920     try:
    921         IP(src="8.8.8.8").whois()
    922     except socket.error:
    923         time.sleep(2)
    924     else:
    925         success = True
    926         break
    927 
    928 assert success
    929 
    930 = AS resolvers
    931 ~ netaccess IP
    932 * This test retries on failure because it often fails
    933 
    934 ret = list()
    935 success = False
    936 for i in six.moves.range(5):
    937     try:
    938         ret = conf.AS_resolver.resolve("8.8.8.8", "8.8.4.4")
    939     except RuntimeError:
    940         time.sleep(2)
    941     else:
    942         success = True
    943         break
    944 
    945 assert (len(ret) == 2)
    946 all(x[1] == "AS15169" for x in ret)
    947 
    948 ret = list()
    949 success = False
    950 for i in six.moves.range(5):
    951     try:
    952         ret = AS_resolver_riswhois().resolve("8.8.8.8")
    953     except socket.error:
    954         time.sleep(2)
    955     else:
    956         success = True
    957         break
    958 
    959 assert (len(ret) == 1)
    960 assert all(x[1] == "AS15169" for x in ret)
    961 
    962 # This test is too buggy, and is simulated below
    963 #ret = list()
    964 #success = False
    965 #for i in six.moves.range(5):
    966 #    try:
    967 #        ret = AS_resolver_cymru().resolve("8.8.8.8")
    968 #    except socket.error:
    969 #        time.sleep(2)
    970 #    else:
    971 #        success = True
    972 #        break
    973 #
    974 #assert (len(ret) == 1)
    975 #
    976 #all(x[1] == "AS15169" for x in ret)
    977 
    978 cymru_bulk_data = """
    979 Bulk mode; whois.cymru.com [2017-10-03 08:38:08 +0000]
    980 24776   | 217.25.178.5     | INFOCLIP-AS, FR
    981 36459   | 192.30.253.112   | GITHUB - GitHub, Inc., US
    982 26496   | 68.178.213.61    | AS-26496-GO-DADDY-COM-LLC - GoDaddy.com, LLC, US
    983 """
    984 tmp = AS_resolver_cymru().parse(cymru_bulk_data)
    985 assert(len(tmp) == 3)
    986 assert([l[1] for l in tmp] == ['AS24776', 'AS36459', 'AS26496'])
    987 
    988 = AS resolver - IPv6
    989 ~ netaccess IP
    990 * This test retries on failure because it often fails
    991 
    992 ret = list()
    993 success = False
    994 as_resolver6 = AS_resolver6()
    995 for i in six.moves.range(5):
    996     try:
    997         ret = as_resolver6.resolve("2001:4860:4860::8888", "2001:4860:4860::4444")
    998     except socket.error:
    999         time.sleep(2)
   1000     else:
   1001         success = True
   1002         break
   1003 
   1004 assert (len(ret) == 2)
   1005 assert all(x[1] == 15169 for x in ret)
   1006 
   1007 = sendpfast
   1008 
   1009 old_interactive = conf.interactive
   1010 conf.interactive = False
   1011 try:
   1012     sendpfast([])
   1013     assert False
   1014 except Exception:
   1015     assert True
   1016 
   1017 conf.interactive = old_interactive
   1018 assert True
   1019 
   1020 ############
   1021 ############
   1022 + More complex tests
   1023 
   1024 = Implicit logic
   1025 ~ IP TCP
   1026 a = Ether() / IP(ttl=(5, 10)) / TCP(dport=[80, 443])
   1027 ls(a)
   1028 ls(a, verbose=True)
   1029 [p for p in a]
   1030 len(_) == 12
   1031 
   1032 
   1033 ############
   1034 ############
   1035 + Real usages
   1036 
   1037 = Port scan
   1038 ~ netaccess IP TCP
   1039 old_debug_dissector = conf.debug_dissector
   1040 conf.debug_dissector = False
   1041 ans,unans=sr(IP(dst="www.google.com/30")/TCP(dport=[80,443]),timeout=2)
   1042 conf.debug_dissector = old_debug_dissector
   1043 ans.make_table(lambda s_r: (s_r[0].dst, s_r[0].dport, s_r[1].sprintf("{TCP:%TCP.flags%}{ICMP:%ICMP.code%}")))
   1044 
   1045 = Send & receive with retry
   1046 ~ netaccess IP ICMP
   1047 old_debug_dissector = conf.debug_dissector
   1048 conf.debug_dissector = False
   1049 ans, unans = sr(IP(dst=["8.8.8.8", "1.2.3.4"]) / ICMP(), timeout=2, retry=1)
   1050 conf.debug_dissector = old_debug_dissector
   1051 len(ans) == 1 and len(unans) == 1
   1052 
   1053 = Traceroute function
   1054 ~ netaccess
   1055 * Let's test traceroute
   1056 traceroute("www.slashdot.org")
   1057 ans,unans=_
   1058 
   1059 = Result manipulation
   1060 ~ netaccess
   1061 ans.nsummary()
   1062 s,r=ans[0]
   1063 s.show()
   1064 s.show(2)
   1065 
   1066 = DNS packet manipulation
   1067 ~ netaccess IP UDP DNS
   1068 dns_ans.show()
   1069 dns_ans.show2()
   1070 dns_ans[DNS].an.show()
   1071 dns_ans2 = IP(raw(dns_ans))
   1072 DNS in dns_ans2
   1073 assert(raw(dns_ans2) == raw(dns_ans))
   1074 dns_ans2.qd.qname = "www.secdev.org."
   1075 * We need to recalculate these values
   1076 del(dns_ans2[IP].len)
   1077 del(dns_ans2[IP].chksum)
   1078 del(dns_ans2[UDP].len)
   1079 del(dns_ans2[UDP].chksum)
   1080 assert(b"\x03www\x06secdev\x03org\x00" in raw(dns_ans2))
   1081 assert(DNS in IP(raw(dns_ans2)))
   1082 
   1083 = Arping
   1084 ~ netaccess
   1085 * This test assumes the local network is a /24. This is bad.
   1086 conf.route.route("0.0.0.0")[2]
   1087 arping(_+"/24")
   1088 
   1089 = send() and sniff()
   1090 ~ netaccess
   1091 import time
   1092 import os
   1093 
   1094 from scapy.modules.six.moves.queue import Queue
   1095 
   1096 def _send_or_sniff(pkt, timeout, flt, pid, fork, t_other=None, opened_socket=None):
   1097     assert pid != -1
   1098     if pid == 0:
   1099         time.sleep(1)
   1100         (sendp if isinstance(pkt, (Ether, Dot3)) else send)(pkt)
   1101         if fork:
   1102             os._exit(0)
   1103         else:
   1104             return
   1105     else:
   1106         spkt = raw(pkt)
   1107         # We do not want to crash when a packet cannot be parsed
   1108         old_debug_dissector = conf.debug_dissector
   1109         conf.debug_dissector = False
   1110         pkts = sniff(
   1111             timeout=timeout, filter=flt, opened_socket=opened_socket,
   1112             stop_filter=lambda p: pkt.__class__ in p and raw(p[pkt.__class__]) == spkt
   1113         )
   1114         conf.debug_dissector = old_debug_dissector
   1115         if fork:
   1116             os.waitpid(pid, 0)
   1117         else:
   1118             t_other.join()
   1119     assert raw(pkt) in (raw(p[pkt.__class__]) for p in pkts if pkt.__class__ in p)
   1120 
   1121 def send_and_sniff(pkt, timeout=2, flt=None, opened_socket=None):
   1122     """Send a packet, sniff, and check the packet has been seen"""
   1123     if hasattr(os, "fork"):
   1124         _send_or_sniff(pkt, timeout, flt, os.fork(), True)
   1125     else:
   1126         from threading import Thread
   1127         def run_function(pkt, timeout, flt, pid, thread, results, opened_socket):
   1128             _send_or_sniff(pkt, timeout, flt, pid, False, t_other=thread, opened_socket=opened_socket)
   1129             results.put(True)
   1130         results = Queue()
   1131         t_parent = Thread(target=run_function, args=(pkt, timeout, flt, 0, None, results, None))
   1132         t_child = Thread(target=run_function, args=(pkt, timeout, flt, 1, t_parent, results, opened_socket))
   1133         t_parent.start()
   1134         t_child.start()
   1135         t_parent.join()
   1136         t_child.join()
   1137         assert results.qsize() >= 2
   1138         while not results.empty():
   1139             assert results.get()
   1140 
   1141 send_and_sniff(IP(dst="secdev.org")/ICMP())
   1142 send_and_sniff(IP(dst="secdev.org")/ICMP(), flt="icmp")
   1143 send_and_sniff(Ether()/IP(dst="secdev.org")/ICMP())
   1144 
   1145 = Test L2ListenTcpdump socket
   1146 ~ netaccess FIXME_py3
   1147 
   1148 # Often (but not always) fails with Python 3
   1149 import time
   1150 for i in range(10):
   1151     read_s = L2ListenTcpdump(iface=conf.iface)
   1152     out_s = conf.L2socket(iface=conf.iface)
   1153     time.sleep(5)  # wait for read_s to be ready
   1154     icmp_r = Ether()/IP(dst="secdev.org")/ICMP()
   1155     res = sndrcv(out_s, icmp_r, timeout=5, rcv_pks=read_s)[0]
   1156     read_s.close()
   1157     out_s.close()
   1158     time.sleep(5)
   1159     if res:
   1160         break
   1161 
   1162 response = res[0][1]
   1163 assert response[ICMP].type == 0
   1164 
   1165 ############
   1166 ############
   1167 + ManuFDB tests
   1168 
   1169 = __repr__
   1170 
   1171 if conf.manufdb:
   1172     len(conf.manufdb)
   1173 else:
   1174     True
   1175 
   1176 = check _resolve_MAC
   1177 
   1178 if conf.manufdb:
   1179     assert conf.manufdb._resolve_MAC("00:00:63") == "HP"
   1180 else:
   1181     True
   1182 
   1183 ############
   1184 ############
   1185 + Automaton tests
   1186 
   1187 = Simple automaton
   1188 ~ automaton
   1189 class ATMT1(Automaton):
   1190     def parse_args(self, init, *args, **kargs):
   1191         Automaton.parse_args(self, *args, **kargs)
   1192         self.init = init
   1193     @ATMT.state(initial=1)
   1194     def BEGIN(self):
   1195         raise self.MAIN(self.init)
   1196     @ATMT.state()
   1197     def MAIN(self, s):
   1198         return s
   1199     @ATMT.condition(MAIN, prio=-1)
   1200     def go_to_END(self, s):
   1201         if len(s) > 20:
   1202             raise self.END(s).action_parameters(s)
   1203     @ATMT.condition(MAIN)
   1204     def trA(self, s):
   1205         if s.endswith("b"):
   1206             raise self.MAIN(s+"a")
   1207     @ATMT.condition(MAIN)
   1208     def trB(self, s):
   1209         if s.endswith("a"):
   1210             raise self.MAIN(s*2+"b")
   1211     @ATMT.state(final=1)
   1212     def END(self, s):
   1213         return s
   1214     @ATMT.action(go_to_END)
   1215     def action_test(self, s):
   1216         self.result = s
   1217     
   1218 = Simple automaton Tests
   1219 ~ automaton
   1220 
   1221 a=ATMT1(init="a", ll=lambda: None, recvsock=lambda: None)
   1222 a.run()
   1223 assert( _ == 'aabaaababaaabaaababab' )
   1224 a.result
   1225 assert( _ == 'aabaaababaaabaaababab' )
   1226 a=ATMT1(init="b", ll=lambda: None, recvsock=lambda: None)
   1227 a.run()
   1228 assert( _ == 'babababababababababababababab' )
   1229 a.result
   1230 assert( _ == 'babababababababababababababab' )
   1231 
   1232 = Simple automaton stuck test
   1233 ~ automaton
   1234 
   1235 try:    
   1236     ATMT1(init="", ll=lambda: None, recvsock=lambda: None).run()
   1237 except Automaton.Stuck:
   1238     True
   1239 else:
   1240     False
   1241 
   1242 
   1243 = Automaton state overloading
   1244 ~ automaton
   1245 class ATMT2(ATMT1):
   1246     @ATMT.state()
   1247     def MAIN(self, s):
   1248         return "c"+ATMT1.MAIN(self, s).run()
   1249 
   1250 a=ATMT2(init="a", ll=lambda: None, recvsock=lambda: None)
   1251 a.run()
   1252 assert( _ == 'ccccccacabacccacababacccccacabacccacababab' )
   1253 
   1254 
   1255 a.result
   1256 assert( _ == 'ccccccacabacccacababacccccacabacccacababab' )
   1257 a=ATMT2(init="b", ll=lambda: None, recvsock=lambda: None)
   1258 a.run()
   1259 assert( _ == 'cccccbaccbabaccccbaccbabab')
   1260 a.result
   1261 assert( _ == 'cccccbaccbabaccccbaccbabab')
   1262 
   1263 
   1264 = Automaton condition overloading
   1265 ~ automaton
   1266 class ATMT3(ATMT2):
   1267     @ATMT.condition(ATMT1.MAIN)
   1268     def trA(self, s):
   1269         if s.endswith("b"):
   1270             raise self.MAIN(s+"da")
   1271 
   1272 
   1273 a=ATMT3(init="a", debug=2, ll=lambda: None, recvsock=lambda: None)
   1274 a.run()
   1275 assert( _ == 'cccccacabdacccacabdabda')
   1276 a.result
   1277 assert( _ == 'cccccacabdacccacabdabda')
   1278 a=ATMT3(init="b", ll=lambda: None, recvsock=lambda: None)
   1279 a.run()
   1280 assert( _ == 'cccccbdaccbdabdaccccbdaccbdabdab' )
   1281 
   1282 a.result
   1283 assert( _ == 'cccccbdaccbdabdaccccbdaccbdabdab' )
   1284 
   1285 
   1286 = Automaton action overloading
   1287 ~ automaton
   1288 class ATMT4(ATMT3):
   1289     @ATMT.action(ATMT1.go_to_END)
   1290     def action_test(self, s):
   1291         self.result = "e"+s+"e"
   1292 
   1293 a=ATMT4(init="a", ll=lambda: None, recvsock=lambda: None)
   1294 a.run()
   1295 assert( _ == 'cccccacabdacccacabdabda')
   1296 a.result
   1297 assert( _ == 'ecccccacabdacccacabdabdae')
   1298 a=ATMT4(init="b", ll=lambda: None, recvsock=lambda: None)
   1299 a.run()
   1300 assert( _ == 'cccccbdaccbdabdaccccbdaccbdabdab' )
   1301 a.result
   1302 assert( _ == 'ecccccbdaccbdabdaccccbdaccbdabdabe' )
   1303 
   1304 
   1305 = Automaton priorities
   1306 ~ automaton
   1307 class ATMT5(Automaton):
   1308     @ATMT.state(initial=1)
   1309     def BEGIN(self):
   1310         self.res = "J"
   1311     @ATMT.condition(BEGIN, prio=1)
   1312     def tr1(self):
   1313         self.res += "i"
   1314         raise self.END()
   1315     @ATMT.condition(BEGIN)
   1316     def tr2(self):
   1317         self.res += "p"
   1318     @ATMT.condition(BEGIN, prio=-1)
   1319     def tr3(self):
   1320         self.res += "u"
   1321     
   1322     @ATMT.action(tr1)
   1323     def ac1(self):
   1324         self.res += "e"
   1325     @ATMT.action(tr1, prio=-1)
   1326     def ac2(self):
   1327         self.res += "t"
   1328     @ATMT.action(tr1, prio=1)
   1329     def ac3(self):
   1330         self.res += "r"
   1331    
   1332     @ATMT.state(final=1)
   1333     def END(self):
   1334         return self.res
   1335 
   1336 a=ATMT5(ll=lambda: None, recvsock=lambda: None)
   1337 a.run()
   1338 assert( _ == 'Jupiter' )
   1339 
   1340 = Automaton test same action for many conditions
   1341 ~ automaton
   1342 class ATMT6(Automaton):
   1343     @ATMT.state(initial=1)
   1344     def BEGIN(self):
   1345         self.res="M"
   1346     @ATMT.condition(BEGIN)
   1347     def tr1(self):
   1348         raise self.MIDDLE()
   1349     @ATMT.action(tr1) # default prio=0
   1350     def add_e(self):
   1351         self.res += "e"
   1352     @ATMT.action(tr1, prio=2)
   1353     def add_c(self):
   1354         self.res += "c"
   1355     @ATMT.state()
   1356     def MIDDLE(self):
   1357         self.res += "u"
   1358     @ATMT.condition(MIDDLE)
   1359     def tr2(self):
   1360         raise self.END()
   1361     @ATMT.action(tr2, prio=2)
   1362     def add_y(self):
   1363         self.res += "y"
   1364     @ATMT.action(tr1, prio=1)
   1365     @ATMT.action(tr2)
   1366     def add_r(self):
   1367         self.res += "r"
   1368     @ATMT.state(final=1)
   1369     def END(self):
   1370         return self.res
   1371 
   1372 a=ATMT6(ll=lambda: None, recvsock=lambda: None)
   1373 a.run()
   1374 assert( _ == 'Mercury' )
   1375 
   1376 a.restart()
   1377 a.run()
   1378 assert( _ == 'Mercury' )
   1379 
   1380 = Automaton test io event
   1381 ~ automaton
   1382 
   1383 class ATMT7(Automaton):
   1384     @ATMT.state(initial=1)
   1385     def BEGIN(self):
   1386         self.res = "S"
   1387     @ATMT.ioevent(BEGIN, name="tst")
   1388     def tr1(self, fd):
   1389         self.res += fd.recv()
   1390         raise self.NEXT_STATE()
   1391     @ATMT.state()
   1392     def NEXT_STATE(self):
   1393         self.oi.tst.send("ur")
   1394     @ATMT.ioevent(NEXT_STATE, name="tst")
   1395     def tr2(self, fd):
   1396         self.res += fd.recv()
   1397         raise self.END()
   1398     @ATMT.state(final=1)
   1399     def END(self):
   1400         self.res += "n"
   1401         return self.res
   1402 
   1403 a=ATMT7(ll=lambda: None, recvsock=lambda: None)
   1404 a.run(wait=False)
   1405 a.io.tst.send("at")
   1406 a.io.tst.recv()
   1407 a.io.tst.send(_)
   1408 a.run()
   1409 assert( _ == "Saturn" )
   1410 
   1411 a.restart()
   1412 a.run(wait=False)
   1413 a.io.tst.send("at")
   1414 a.io.tst.recv()
   1415 a.io.tst.send(_)
   1416 a.run()
   1417 assert( _ == "Saturn" )
   1418 
   1419 = Automaton test io event from external fd
   1420 ~ automaton
   1421 import os
   1422 
   1423 class ATMT8(Automaton):
   1424     @ATMT.state(initial=1)
   1425     def BEGIN(self):
   1426         self.res = b"U"
   1427     @ATMT.ioevent(BEGIN, name="extfd")
   1428     def tr1(self, fd):
   1429         self.res += fd.read(2)
   1430         raise self.NEXT_STATE()
   1431     @ATMT.state()
   1432     def NEXT_STATE(self):
   1433         pass
   1434     @ATMT.ioevent(NEXT_STATE, name="extfd")
   1435     def tr2(self, fd):
   1436         self.res += fd.read(2)
   1437         raise self.END()
   1438     @ATMT.state(final=1)
   1439     def END(self):
   1440         self.res += b"s"
   1441         return self.res
   1442 
   1443 if WINDOWS:
   1444     r = w = ObjectPipe()
   1445 else:
   1446     r,w = os.pipe()
   1447 
   1448 def writeOn(w, msg):
   1449     if WINDOWS:
   1450         w.write(msg)
   1451     else:
   1452         os.write(w, msg)
   1453 
   1454 a=ATMT8(external_fd={"extfd":r}, ll=lambda: None, recvsock=lambda: None)
   1455 a.run(wait=False)
   1456 writeOn(w, b"ra")
   1457 writeOn(w, b"nu")
   1458 
   1459 a.run()
   1460 assert( _ == b"Uranus" )
   1461 
   1462 a.restart()
   1463 a.run(wait=False)
   1464 writeOn(w, b"ra")
   1465 writeOn(w, b"nu")
   1466 a.run()
   1467 assert( _ == b"Uranus" )
   1468 
   1469 = Automaton test interception_points, and restart
   1470 ~ automaton
   1471 class ATMT9(Automaton):
   1472     def my_send(self, x):
   1473         self.io.loop.send(x)
   1474     @ATMT.state(initial=1)
   1475     def BEGIN(self):
   1476         self.res = "V"
   1477         self.send(Raw("ENU"))
   1478     @ATMT.ioevent(BEGIN, name="loop")
   1479     def received_sth(self, fd):
   1480         self.res += plain_str(fd.recv().load)
   1481         raise self.END()
   1482     @ATMT.state(final=1)
   1483     def END(self):
   1484         self.res += "s"
   1485         return self.res
   1486 
   1487 a=ATMT9(debug=5, ll=lambda: None, recvsock=lambda: None)
   1488 a.run()
   1489 assert( _ == "VENUs" )
   1490 
   1491 a.restart()
   1492 a.run()
   1493 assert( _ == "VENUs" )
   1494 
   1495 a.restart()
   1496 a.BEGIN.intercepts()
   1497 while True:
   1498     try:
   1499         x = a.run()
   1500     except Automaton.InterceptionPoint as p:
   1501         a.accept_packet(Raw(p.packet.load.lower()), wait=False)
   1502     else:
   1503         break
   1504 
   1505 x
   1506 assert( _ == "Venus" )
   1507 
   1508 
   1509 ############
   1510 ############
   1511 + Test IP options
   1512 
   1513 = IP options individual assembly
   1514 ~ IP options
   1515 raw(IPOption())
   1516 assert(_ == b'\x00\x02')
   1517 raw(IPOption_NOP())
   1518 assert(_ == b'\x01')
   1519 raw(IPOption_EOL())
   1520 assert(_ == b'\x00')
   1521 raw(IPOption_LSRR(routers=["1.2.3.4","5.6.7.8"]))
   1522 assert(_ == b'\x83\x0b\x04\x01\x02\x03\x04\x05\x06\x07\x08')
   1523 
   1524 = IP options individual dissection
   1525 ~ IP options
   1526 IPOption(b"\x00")
   1527 assert(_.option == 0 and isinstance(_, IPOption_EOL))
   1528 IPOption(b"\x01")
   1529 assert(_.option == 1 and isinstance(_, IPOption_NOP))
   1530 lsrr=b'\x83\x0b\x04\x01\x02\x03\x04\x05\x06\x07\x08'
   1531 p=IPOption_LSRR(lsrr)
   1532 p
   1533 q=IPOption(lsrr)
   1534 q
   1535 assert(p == q)
   1536 
   1537 = IP assembly and dissection with options
   1538 ~ IP options
   1539 p = IP(src="9.10.11.12",dst="13.14.15.16",options=IPOption_SDBM(addresses=["1.2.3.4","5.6.7.8"]))/TCP()
   1540 raw(p)
   1541 assert(_ == b'H\x00\x004\x00\x01\x00\x00@\x06\xa2q\t\n\x0b\x0c\r\x0e\x0f\x10\x95\n\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00_K\x00\x00')
   1542 q=IP(_)
   1543 q
   1544 assert( isinstance(q.options[0],IPOption_SDBM) )
   1545 assert( q[IPOption_SDBM].addresses[1] == "5.6.7.8" )
   1546 p.options[0].addresses[0] = '5.6.7.8'
   1547 assert( IP(raw(p)).options[0].addresses[0] == '5.6.7.8' )
   1548 IP(src="9.10.11.12", dst="13.14.15.16", options=[IPOption_NOP(),IPOption_LSRR(routers=["1.2.3.4","5.6.7.8"]),IPOption_Security(transmission_control_code="XYZ")])/TCP()
   1549 raw(_)
   1550 assert(_ == b'K\x00\x00@\x00\x01\x00\x00@\x06\xf3\x83\t\n\x0b\x0c\r\x0e\x0f\x10\x01\x83\x0b\x04\x01\x02\x03\x04\x05\x06\x07\x08\x82\x0b\x00\x00\x00\x00\x00\x00XYZ\x00\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00_K\x00\x00')
   1551 IP(_)
   1552 q=_
   1553 assert(q[IPOption_LSRR].get_current_router() == "1.2.3.4")
   1554 assert(q[IPOption_Security].transmission_control_code == b"XYZ")
   1555 assert(q[TCP].flags == 2)
   1556 
   1557 
   1558 ############
   1559 ############
   1560 + Test PPP
   1561 
   1562 = PPP/HDLC
   1563 ~ ppp hdlc
   1564 HDLC()/PPP()/PPP_IPCP()
   1565 raw(_)
   1566 s=_
   1567 assert(s == b'\xff\x03\x80!\x01\x00\x00\x04')
   1568 PPP(s)
   1569 p=_
   1570 assert(HDLC in p)
   1571 assert(p[HDLC].control==3)
   1572 assert(p[PPP].proto==0x8021)
   1573 PPP(s[2:])
   1574 q=_
   1575 assert(HDLC not in q)
   1576 assert(q[PPP].proto==0x8021)
   1577 
   1578 
   1579 = PPP IPCP
   1580 ~ ppp ipcp
   1581 PPP(b'\x80!\x01\x01\x00\x10\x03\x06\xc0\xa8\x01\x01\x02\x06\x00-\x0f\x01')
   1582 p=_
   1583 assert(p[PPP_IPCP].code == 1)
   1584 assert(p[PPP_IPCP_Option_IPAddress].data=="192.168.1.1")
   1585 assert(p[PPP_IPCP_Option].data == b'\x00-\x0f\x01')
   1586 p=PPP()/PPP_IPCP(options=[PPP_IPCP_Option_DNS1(data="1.2.3.4"),PPP_IPCP_Option_DNS2(data="5.6.7.8"),PPP_IPCP_Option_NBNS2(data="9.10.11.12")])
   1587 raw(p)
   1588 assert(_ == b'\x80!\x01\x00\x00\x16\x81\x06\x01\x02\x03\x04\x83\x06\x05\x06\x07\x08\x84\x06\t\n\x0b\x0c')
   1589 PPP(_)
   1590 q=_
   1591 assert(raw(p) == raw(q))
   1592 assert(PPP(raw(q))==q)
   1593 PPP()/PPP_IPCP(options=[PPP_IPCP_Option_DNS1(data="1.2.3.4"),PPP_IPCP_Option_DNS2(data="5.6.7.8"),PPP_IPCP_Option(type=123,data="ABCDEFG"),PPP_IPCP_Option_NBNS2(data="9.10.11.12")])
   1594 p=_
   1595 raw(p)
   1596 assert(_ == b'\x80!\x01\x00\x00\x1f\x81\x06\x01\x02\x03\x04\x83\x06\x05\x06\x07\x08{\tABCDEFG\x84\x06\t\n\x0b\x0c')
   1597 PPP(_)
   1598 q=_
   1599 assert( q[PPP_IPCP_Option].type == 123 )
   1600 assert( q[PPP_IPCP_Option].data == b"ABCDEFG" )
   1601 assert( q[PPP_IPCP_Option_NBNS2].data == '9.10.11.12' )
   1602 
   1603 
   1604 = PPP ECP
   1605 ~ ppp ecp
   1606 
   1607 PPP()/PPP_ECP(options=[PPP_ECP_Option_OUI(oui="XYZ")])
   1608 p=_
   1609 raw(p)
   1610 assert(_ == b'\x80S\x01\x00\x00\n\x00\x06XYZ\x00')
   1611 PPP(_)
   1612 q=_
   1613 assert( raw(p)==raw(q) )
   1614 PPP()/PPP_ECP(options=[PPP_ECP_Option_OUI(oui="XYZ"),PPP_ECP_Option(type=1,data="ABCDEFG")])
   1615 p=_
   1616 raw(p)
   1617 assert(_ == b'\x80S\x01\x00\x00\x13\x00\x06XYZ\x00\x01\tABCDEFG')
   1618 PPP(_)
   1619 q=_
   1620 assert( raw(p) == raw(q) )
   1621 assert( q[PPP_ECP_Option].data == b"ABCDEFG" )
   1622 
   1623 
   1624 # Scapy6 Regression Test Campaign 
   1625 
   1626 ############
   1627 ############
   1628 + Test IPv6 Class 
   1629 = IPv6 Class basic Instantiation
   1630 a=IPv6() 
   1631 
   1632 = IPv6 Class basic build (default values)
   1633 raw(IPv6()) == b'`\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'
   1634 
   1635 = IPv6 Class basic dissection (default values)
   1636 a=IPv6(raw(IPv6())) 
   1637 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"
   1638 
   1639 = IPv6 Class with basic TCP stacked - build
   1640 raw(IPv6()/TCP()) == b'`\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'
   1641 
   1642 = IPv6 Class with basic TCP stacked - dissection
   1643 a=IPv6(raw(IPv6()/TCP()))
   1644 a.nh == 6 and a.plen == 20 and isinstance(a.payload, TCP) and a.payload.chksum == 0x8f7d
   1645 
   1646 = IPv6 Class with TCP and TCP data - build
   1647 raw(IPv6()/TCP()/Raw(load="somedata")) == b'`\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'
   1648 
   1649 = IPv6 Class with TCP and TCP data - dissection
   1650 a=IPv6(raw(IPv6()/TCP()/Raw(load="somedata")))
   1651 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 == b"somedata"
   1652 
   1653 = IPv6 Class binding with Ethernet - build
   1654 raw(Ether(src="00:00:00:00:00:00", dst="ff:ff:ff:ff:ff:ff")/IPv6()/TCP()) == b'\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'
   1655 
   1656 = IPv6 Class binding with Ethernet - dissection
   1657 a=Ether(raw(Ether()/IPv6()/TCP()))
   1658 a.type == 0x86dd
   1659 
   1660 = IPv6 Class binding with GRE - build
   1661 s = raw(IP(src="127.0.0.1")/GRE()/Ether(dst="ff:ff:ff:ff:ff:ff", src="00:00:00:00:00:00")/IP()/GRE()/IPv6(src="::1"))
   1662 s == b'E\x00\x00f\x00\x01\x00\x00@/|f\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x00eX\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x00@\x00\x01\x00\x00@/|\x8c\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x00\x86\xdd`\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'
   1663 
   1664 = IPv6 Class binding with GRE - dissection
   1665 p = IP(s)
   1666 GRE in p and p[GRE:1].proto == 0x6558 and p[GRE:2].proto == 0x86DD and IPv6 in p
   1667 
   1668 
   1669 ########### IPv6ExtHdrRouting Class ###########################
   1670 
   1671 = IPv6ExtHdrRouting Class - No address - build
   1672 raw(IPv6(src="2048::deca", dst="2047::cafe")/IPv6ExtHdrRouting(addresses=[])/TCP(dport=80)) ==b'`\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' 
   1673 
   1674 = IPv6ExtHdrRouting Class - One address - build
   1675 raw(IPv6(src="2048::deca", dst="2047::cafe")/IPv6ExtHdrRouting(addresses=["2022::deca"])/TCP(dport=80)) == b'`\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'
   1676 
   1677 = IPv6ExtHdrRouting Class - Multiple Addresses - build
   1678 raw(IPv6(src="2048::deca", dst="2047::cafe")/IPv6ExtHdrRouting(addresses=["2001::deca", "2022::deca"])/TCP(dport=80)) == b'`\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'
   1679 
   1680 = IPv6ExtHdrRouting Class - Specific segleft (2->1) - build
   1681 raw(IPv6(src="2048::deca", dst="2047::cafe")/IPv6ExtHdrRouting(addresses=["2001::deca", "2022::deca"], segleft=1)/TCP(dport=80)) == b'`\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'
   1682 
   1683 = IPv6ExtHdrRouting Class - Specific segleft (2->0) - build
   1684 raw(IPv6(src="2048::deca", dst="2047::cafe")/IPv6ExtHdrRouting(addresses=["2001::deca", "2022::deca"], segleft=0)/TCP(dport=80)) == b'`\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'
   1685 
   1686 ########### IPv6ExtHdrSegmentRouting Class ###########################
   1687 
   1688 = IPv6ExtHdrSegmentRouting Class - default - build & dissect
   1689 s = raw(IPv6()/IPv6ExtHdrSegmentRouting()/UDP())
   1690 assert(s == b'`\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\x11\x02\x04\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x005\x005\x00\x08\xffr')
   1691 
   1692 p = IPv6(s)
   1693 assert(UDP in p and IPv6ExtHdrSegmentRouting in p)
   1694 assert(len(p[IPv6ExtHdrSegmentRouting].addresses) == 1 and len(p[IPv6ExtHdrSegmentRouting].tlv_objects) == 0)
   1695 
   1696 = IPv6ExtHdrSegmentRouting Class - empty lists - build & dissect
   1697 
   1698 s = raw(IPv6()/IPv6ExtHdrSegmentRouting(addresses=[], tlv_objects=[])/UDP())
   1699 assert(s == b'`\x00\x00\x00\x00\x10+@\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\x11\x00\x04\x00\x00\x00\x00\x00\x005\x005\x00\x08\xffr')
   1700 
   1701 p = IPv6(s)
   1702 assert(UDP in p and IPv6ExtHdrSegmentRouting in p)
   1703 assert(len(p[IPv6ExtHdrSegmentRouting].addresses) == 0 and len(p[IPv6ExtHdrSegmentRouting].tlv_objects) == 0)
   1704 
   1705 = IPv6ExtHdrSegmentRouting Class - addresses list - build & dissect
   1706 
   1707 s = raw(IPv6()/IPv6ExtHdrSegmentRouting(addresses=["::1", "::2", "::3"])/UDP())
   1708 assert(s == b'`\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\x11\x06\x04\x02\x03\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\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x005\x005\x00\x08\xffr')
   1709 
   1710 p = IPv6(s)
   1711 assert(UDP in p and IPv6ExtHdrSegmentRouting in p)
   1712 assert(len(p[IPv6ExtHdrSegmentRouting].addresses) == 3 and len(p[IPv6ExtHdrSegmentRouting].tlv_objects) == 0)
   1713 
   1714 = IPv6ExtHdrSegmentRouting Class - TLVs list - build & dissect
   1715 
   1716 s = raw(IPv6()/IPv6ExtHdrSegmentRouting(addresses=[], tlv_objects=[IPv6ExtHdrSegmentRoutingTLV()])/TCP())
   1717 assert(s == b'`\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\x06\x01\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x02\x00\x00\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x8f}\x00\x00')
   1718 
   1719 p = IPv6(s)
   1720 assert(TCP in p and IPv6ExtHdrSegmentRouting in p)
   1721 assert(len(p[IPv6ExtHdrSegmentRouting].addresses) == 0 and len(p[IPv6ExtHdrSegmentRouting].tlv_objects) == 2)
   1722 assert(isinstance(p[IPv6ExtHdrSegmentRouting].tlv_objects[1], IPv6ExtHdrSegmentRoutingTLVPadding))
   1723 
   1724 = IPv6ExtHdrSegmentRouting Class - both lists - build & dissect
   1725 
   1726 s = raw(IPv6()/IPv6ExtHdrSegmentRouting(addresses=["::1", "::2", "::3"], tlv_objects=[IPv6ExtHdrSegmentRoutingTLVIngressNode(),IPv6ExtHdrSegmentRoutingTLVEgressNode()])/ICMPv6EchoRequest())
   1727 assert(s == b'`\x00\x00\x00\x00h+@\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:\x0b\x04\x02\x03\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\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x01\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x80\x00\x7f\xbb\x00\x00\x00\x00')
   1728 
   1729 p = IPv6(s)
   1730 assert(ICMPv6EchoRequest in p and IPv6ExtHdrSegmentRouting in p)
   1731 assert(len(p[IPv6ExtHdrSegmentRouting].addresses) == 3 and len(p[IPv6ExtHdrSegmentRouting].tlv_objects) == 2)
   1732 
   1733 = IPv6ExtHdrSegmentRouting Class - UDP pseudo-header checksum - build & dissect
   1734 
   1735 s= raw(IPv6(src="fc00::1", dst="fd00::42")/IPv6ExtHdrSegmentRouting(addresses=["fd00::42", "fc13::1337"][::-1], segleft=1, lastentry=1) / UDP(sport=11000, dport=4242) / Raw('foobar'))
   1736 assert(s == b'`\x00\x00\x00\x006+@\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B\x11\x04\x04\x01\x01\x00\x00\x00\xfc\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x137\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B*\xf8\x10\x92\x00\x0e\x81\xb7foobar')
   1737 
   1738 
   1739 ############
   1740 ############
   1741 + Test in6_get6to4Prefix()
   1742 
   1743 = Test in6_get6to4Prefix() - 0.0.0.0 address
   1744 in6_get6to4Prefix("0.0.0.0") == "2002::"
   1745 
   1746 = Test in6_get6to4Prefix() - 255.255.255.255 address
   1747 in6_get6to4Prefix("255.255.255.255") == "2002:ffff:ffff::"
   1748 
   1749 = Test in6_get6to4Prefix() - 1.1.1.1 address
   1750 in6_get6to4Prefix("1.1.1.1") == "2002:101:101::"
   1751 
   1752 = Test in6_get6to4Prefix() - invalid address
   1753 in6_get6to4Prefix("somebadrawing") is None
   1754 
   1755 
   1756 ############
   1757 ############
   1758 + Test in6_6to4ExtractAddr()
   1759 
   1760 = Test in6_6to4ExtractAddr() - 2002:: address
   1761 in6_6to4ExtractAddr("2002::") == "0.0.0.0"
   1762 
   1763 = Test in6_6to4ExtractAddr() - 255.255.255.255 address
   1764 in6_6to4ExtractAddr("2002:ffff:ffff::") == "255.255.255.255"
   1765 
   1766 = Test in6_6to4ExtractAddr() - "2002:101:101::" address
   1767 in6_6to4ExtractAddr("2002:101:101::") == "1.1.1.1"
   1768 
   1769 = Test in6_6to4ExtractAddr() - invalid address
   1770 in6_6to4ExtractAddr("somebadrawing") is None
   1771 
   1772 
   1773 ########### RFC 4489 - Link-Scoped IPv6 Multicast address ###########
   1774 
   1775 = in6_getLinkScopedMcastAddr() : default generation
   1776 a = in6_getLinkScopedMcastAddr(addr="FE80::") 
   1777 a == 'ff32:ff::'
   1778 
   1779 = in6_getLinkScopedMcastAddr() : different valid scope values
   1780 a = in6_getLinkScopedMcastAddr(addr="FE80::", scope=0) 
   1781 b = in6_getLinkScopedMcastAddr(addr="FE80::", scope=1) 
   1782 c = in6_getLinkScopedMcastAddr(addr="FE80::", scope=2) 
   1783 d = in6_getLinkScopedMcastAddr(addr="FE80::", scope=3) 
   1784 a == 'ff30:ff::' and b == 'ff31:ff::' and c == 'ff32:ff::' and d is None
   1785 
   1786 = in6_getLinkScopedMcastAddr() : grpid in different formats
   1787 a = in6_getLinkScopedMcastAddr(addr="FE80::A12:34FF:FE56:7890", grpid=b"\x12\x34\x56\x78") 
   1788 b = in6_getLinkScopedMcastAddr(addr="FE80::A12:34FF:FE56:7890", grpid="12345678")
   1789 c = in6_getLinkScopedMcastAddr(addr="FE80::A12:34FF:FE56:7890", grpid=305419896)
   1790 a == b and b == c 
   1791 
   1792 
   1793 ########### ethernet address to iface ID conversion #################
   1794 
   1795 = in6_mactoifaceid() conversion function (test 1)
   1796 in6_mactoifaceid("FD:00:00:00:00:00", ulbit=0) == 'FD00:00FF:FE00:0000'
   1797 
   1798 = in6_mactoifaceid() conversion function (test 2)
   1799 in6_mactoifaceid("FD:00:00:00:00:00", ulbit=1) == 'FF00:00FF:FE00:0000'
   1800 
   1801 = in6_mactoifaceid() conversion function (test 3)
   1802 in6_mactoifaceid("FD:00:00:00:00:00") == 'FF00:00FF:FE00:0000'
   1803 
   1804 = in6_mactoifaceid() conversion function (test 4)
   1805 in6_mactoifaceid("FF:00:00:00:00:00") == 'FD00:00FF:FE00:0000'
   1806 
   1807 = in6_mactoifaceid() conversion function (test 5)
   1808 in6_mactoifaceid("FF:00:00:00:00:00", ulbit=1) == 'FF00:00FF:FE00:0000'
   1809 
   1810 = in6_mactoifaceid() conversion function (test 6)
   1811 in6_mactoifaceid("FF:00:00:00:00:00", ulbit=0) == 'FD00:00FF:FE00:0000'
   1812 
   1813 ########### iface ID conversion #################
   1814 
   1815 = in6_mactoifaceid() conversion function (test 1)
   1816 in6_ifaceidtomac(in6_mactoifaceid("FD:00:00:00:00:00", ulbit=0)) == 'ff:00:00:00:00:00'
   1817 
   1818 = in6_mactoifaceid() conversion function (test 2)
   1819 in6_ifaceidtomac(in6_mactoifaceid("FD:00:00:00:00:00", ulbit=1)) == 'fd:00:00:00:00:00'
   1820 
   1821 = in6_mactoifaceid() conversion function (test 3)
   1822 in6_ifaceidtomac(in6_mactoifaceid("FD:00:00:00:00:00")) == 'fd:00:00:00:00:00'
   1823 
   1824 = in6_mactoifaceid() conversion function (test 4)
   1825 in6_ifaceidtomac(in6_mactoifaceid("FF:00:00:00:00:00")) == 'ff:00:00:00:00:00'
   1826 
   1827 = in6_mactoifaceid() conversion function (test 5)
   1828 in6_ifaceidtomac(in6_mactoifaceid("FF:00:00:00:00:00", ulbit=1)) == 'fd:00:00:00:00:00'
   1829 
   1830 = in6_mactoifaceid() conversion function (test 6)
   1831 in6_ifaceidtomac(in6_mactoifaceid("FF:00:00:00:00:00", ulbit=0)) == 'ff:00:00:00:00:00'
   1832 
   1833 
   1834 = in6_addrtomac() conversion function (test 1)
   1835 in6_addrtomac("FE80::" + in6_mactoifaceid("FD:00:00:00:00:00", ulbit=0)) == 'ff:00:00:00:00:00'
   1836 
   1837 = in6_addrtomac() conversion function (test 2)
   1838 in6_addrtomac("FE80::" + in6_mactoifaceid("FD:00:00:00:00:00", ulbit=1)) == 'fd:00:00:00:00:00'
   1839 
   1840 = in6_addrtomac() conversion function (test 3)
   1841 in6_addrtomac("FE80::" + in6_mactoifaceid("FD:00:00:00:00:00")) == 'fd:00:00:00:00:00'
   1842 
   1843 = in6_addrtomac() conversion function (test 4)
   1844 in6_addrtomac("FE80::" + in6_mactoifaceid("FF:00:00:00:00:00")) == 'ff:00:00:00:00:00'
   1845 
   1846 = in6_addrtomac() conversion function (test 5)
   1847 in6_addrtomac("FE80::" + in6_mactoifaceid("FF:00:00:00:00:00", ulbit=1)) == 'fd:00:00:00:00:00'
   1848 
   1849 = in6_addrtomac() conversion function (test 6)
   1850 in6_addrtomac("FE80::" + in6_mactoifaceid("FF:00:00:00:00:00", ulbit=0)) == 'ff:00:00:00:00:00'
   1851 
   1852 ########### RFC 3041 related function ###############################
   1853 = Test in6_getRandomizedIfaceId
   1854 import socket
   1855 
   1856 res=True
   1857 for a in six.moves.range(10):
   1858     s1,s2 = in6_getRandomizedIfaceId('20b:93ff:feeb:2d3')
   1859     inet_pton(socket.AF_INET6, '::'+s1)
   1860     tmp2 = inet_pton(socket.AF_INET6, '::'+s2)
   1861     res = res and ((orb(s1[0]) & 0x04) == 0x04)
   1862     s1,s2 = in6_getRandomizedIfaceId('20b:93ff:feeb:2d3', previous=tmp2)
   1863     tmp = inet_pton(socket.AF_INET6, '::'+s1)
   1864     inet_pton(socket.AF_INET6, '::'+s2)
   1865     res = res and ((orb(s1[0]) & 0x04) == 0x04)
   1866 
   1867 ########### RFC 1924 related function ###############################
   1868 = Test RFC 1924 function - in6_ctop() basic test
   1869 in6_ctop("4)+k&C#VzJ4br>0wv%Yp") == '1080::8:800:200c:417a'
   1870 
   1871 = Test RFC 1924 function - in6_ctop() with character outside charset
   1872 in6_ctop("4)+k&C#VzJ4br>0wv%Y'") == None
   1873 
   1874 = Test RFC 1924 function - in6_ctop() with bad length address
   1875 in6_ctop("4)+k&C#VzJ4br>0wv%Y") == None
   1876 
   1877 = Test RFC 1924 function - in6_ptoc() basic test
   1878 in6_ptoc('1080::8:800:200c:417a') == '4)+k&C#VzJ4br>0wv%Yp'
   1879 
   1880 = Test RFC 1924 function - in6_ptoc() basic test
   1881 in6_ptoc('1080::8:800:200c:417a') == '4)+k&C#VzJ4br>0wv%Yp'
   1882 
   1883 = Test RFC 1924 function - in6_ptoc() with bad input
   1884 in6_ptoc('1080:::8:800:200c:417a') == None
   1885 
   1886 ########### in6_getAddrType #########################################
   1887 
   1888 = in6_getAddrType - 6to4 addresses
   1889 in6_getAddrType("2002::1") == (IPV6_ADDR_UNICAST | IPV6_ADDR_GLOBAL | IPV6_ADDR_6TO4)
   1890 
   1891 = in6_getAddrType - Assignable Unicast global address
   1892 in6_getAddrType("2001:db8::1") == (IPV6_ADDR_UNICAST | IPV6_ADDR_GLOBAL)
   1893 
   1894 = in6_getAddrType - Multicast global address
   1895 in6_getAddrType("FF0E::1") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_MULTICAST)
   1896 
   1897 = in6_getAddrType - Multicast local address
   1898 in6_getAddrType("FF02::1") == (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_MULTICAST)
   1899 
   1900 = in6_getAddrType - Unicast Link-Local address
   1901 in6_getAddrType("FE80::") == (IPV6_ADDR_UNICAST | IPV6_ADDR_LINKLOCAL)
   1902 
   1903 = in6_getAddrType - Loopback address
   1904 in6_getAddrType("::1") == IPV6_ADDR_LOOPBACK
   1905 
   1906 = in6_getAddrType - Unspecified address
   1907 in6_getAddrType("::") == IPV6_ADDR_UNSPECIFIED
   1908 
   1909 = in6_getAddrType - Unassigned Global Unicast address
   1910 in6_getAddrType("4000::") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST)
   1911 
   1912 = in6_getAddrType - Weird address (FE::1)
   1913 in6_getAddrType("FE::") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST)
   1914 
   1915 = in6_getAddrType - Weird address (FE8::1)
   1916 in6_getAddrType("FE8::1") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST)
   1917 
   1918 = in6_getAddrType - Weird address (1::1)
   1919 in6_getAddrType("1::1") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST)
   1920 
   1921 = in6_getAddrType - Weird address (1000::1)
   1922 in6_getAddrType("1000::1") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST)
   1923 
   1924 ########### ICMPv6DestUnreach Class #################################
   1925 
   1926 = ICMPv6DestUnreach Class - Basic Build (no argument)
   1927 raw(ICMPv6DestUnreach()) == b'\x01\x00\x00\x00\x00\x00\x00\x00'
   1928 
   1929 = ICMPv6DestUnreach Class - Basic Build over IPv6 (for cksum and overload)
   1930 raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6DestUnreach()) == b'`\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'
   1931 
   1932 = ICMPv6DestUnreach Class - Basic Build over IPv6 with some payload
   1933 raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6DestUnreach()/IPv6(src="2047::cafe", dst="2048::deca")) == b'`\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'
   1934 
   1935 = ICMPv6DestUnreach Class - Dissection with default values and some payload
   1936 a = IPv6(raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6DestUnreach()/IPv6(src="2047::cafe", dst="2048::deca")))
   1937 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
   1938 
   1939 = ICMPv6DestUnreach Class - Dissection with specific values
   1940 a=IPv6(raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6DestUnreach(code=1, cksum=0x6666, unused=0x7777)/IPv6(src="2047::cafe", dst="2048::deca")))
   1941 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]
   1942 
   1943 = ICMPv6DestUnreach Class - checksum computation related stuff
   1944 a=IPv6(raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6DestUnreach(code=1, cksum=0x6666, unused=0x7777)/IPv6(src="2047::cafe", dst="2048::deca")/TCP()))
   1945 b=IPv6(raw(IPv6(src="2047::cafe", dst="2048::deca")/TCP()))
   1946 a[ICMPv6DestUnreach][TCPerror].chksum == b.chksum
   1947 
   1948 
   1949 ########### ICMPv6PacketTooBig Class ################################
   1950 
   1951 = ICMPv6PacketTooBig Class - Basic Build (no argument)
   1952 raw(ICMPv6PacketTooBig()) == b'\x02\x00\x00\x00\x00\x00\x05\x00'
   1953 
   1954 = ICMPv6PacketTooBig Class - Basic Build over IPv6 (for cksum and overload)
   1955 raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6PacketTooBig()) == b'`\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'
   1956 
   1957 = ICMPv6PacketTooBig Class - Basic Build over IPv6 with some payload
   1958 raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6PacketTooBig()/IPv6(src="2047::cafe", dst="2048::deca")) == b'`\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'
   1959 
   1960 = ICMPv6PacketTooBig Class - Dissection with default values and some payload
   1961 a = IPv6(raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6PacketTooBig()/IPv6(src="2047::cafe", dst="2048::deca")))
   1962 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
   1963 True
   1964 
   1965 = ICMPv6PacketTooBig Class - Dissection with specific values
   1966 a=IPv6(raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6PacketTooBig(code=2, cksum=0x6666, mtu=1460)/IPv6(src="2047::cafe", dst="2048::deca")))
   1967 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
   1968 
   1969 = ICMPv6PacketTooBig Class - checksum computation related stuff
   1970 a=IPv6(raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6PacketTooBig(code=1, cksum=0x6666, mtu=0x7777)/IPv6(src="2047::cafe", dst="2048::deca")/TCP()))
   1971 b=IPv6(raw(IPv6(src="2047::cafe", dst="2048::deca")/TCP()))
   1972 a[ICMPv6PacketTooBig][TCPerror].chksum == b.chksum
   1973 
   1974 
   1975 ########### ICMPv6TimeExceeded Class ################################
   1976 # To be done but not critical. Same mechanisms and format as 
   1977 # previous ones.
   1978 
   1979 ########### ICMPv6ParamProblem Class ################################
   1980 # See previous note
   1981 
   1982 ############
   1983 ############
   1984 + Test ICMPv6EchoRequest Class
   1985 
   1986 = ICMPv6EchoRequest - Basic Instantiation
   1987 raw(ICMPv6EchoRequest()) == b'\x80\x00\x00\x00\x00\x00\x00\x00'
   1988 
   1989 = ICMPv6EchoRequest - Instantiation with specific values
   1990 raw(ICMPv6EchoRequest(code=0xff, cksum=0x1111, id=0x2222, seq=0x3333, data="thisissomestring")) == b'\x80\xff\x11\x11""33thisissomestring'
   1991 
   1992 = ICMPv6EchoRequest - Basic dissection
   1993 a=ICMPv6EchoRequest(b'\x80\x00\x00\x00\x00\x00\x00\x00')
   1994 a.type == 128 and a.code == 0 and a.cksum == 0 and a.id == 0 and a.seq == 0 and a.data == b""
   1995 
   1996 = ICMPv6EchoRequest - Dissection with specific values 
   1997 a=ICMPv6EchoRequest(b'\x80\xff\x11\x11""33thisissomerawing')
   1998 a.type == 128 and a.code == 0xff and a.cksum == 0x1111 and a.id == 0x2222 and a.seq == 0x3333 and a.data == b"thisissomerawing"
   1999 
   2000 = ICMPv6EchoRequest - Automatic checksum computation and field overloading (build)
   2001 raw(IPv6(dst="2001::cafe", src="2001::deca", hlim=64)/ICMPv6EchoRequest()) == b'`\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'
   2002 
   2003 = ICMPv6EchoRequest - Automatic checksum computation and field overloading (dissection)
   2004 a=IPv6(b'`\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')
   2005 isinstance(a, IPv6) and a.nh == 58 and isinstance(a.payload, ICMPv6EchoRequest) and a.payload.cksum == 0x95f1
   2006 
   2007 
   2008 ############
   2009 ############
   2010 + Test ICMPv6EchoReply Class
   2011 
   2012 = ICMPv6EchoReply - Basic Instantiation
   2013 raw(ICMPv6EchoReply()) == b'\x81\x00\x00\x00\x00\x00\x00\x00'
   2014 
   2015 = ICMPv6EchoReply - Instantiation with specific values
   2016 raw(ICMPv6EchoReply(code=0xff, cksum=0x1111, id=0x2222, seq=0x3333, data="thisissomestring")) == b'\x81\xff\x11\x11""33thisissomestring'
   2017 
   2018 = ICMPv6EchoReply - Basic dissection
   2019 a=ICMPv6EchoReply(b'\x80\x00\x00\x00\x00\x00\x00\x00')
   2020 a.type == 128 and a.code == 0 and a.cksum == 0 and a.id == 0 and a.seq == 0 and a.data == b""
   2021 
   2022 = ICMPv6EchoReply - Dissection with specific values 
   2023 a=ICMPv6EchoReply(b'\x80\xff\x11\x11""33thisissomerawing')
   2024 a.type == 128 and a.code == 0xff and a.cksum == 0x1111 and a.id == 0x2222 and a.seq == 0x3333 and a.data == b"thisissomerawing"
   2025 
   2026 = ICMPv6EchoReply - Automatic checksum computation and field overloading (build)
   2027 raw(IPv6(dst="2001::cafe", src="2001::deca", hlim=64)/ICMPv6EchoReply()) == b'`\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'
   2028 
   2029 = ICMPv6EchoReply - Automatic checksum computation and field overloading (dissection)
   2030 a=IPv6(b'`\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')
   2031 isinstance(a, IPv6) and a.nh == 58 and isinstance(a.payload, ICMPv6EchoRequest) and a.payload.cksum == 0x95f1
   2032 
   2033 ########### ICMPv6EchoReply/Request answers() and hashret() #########
   2034 
   2035 = ICMPv6EchoRequest and ICMPv6EchoReply - hashret() test 1
   2036 b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(data="somedata")
   2037 a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(data="somedata")
   2038 b.hashret() == a.hashret()
   2039 
   2040 # data are not taken into account for hashret
   2041 = ICMPv6EchoRequest and ICMPv6EchoReply - hashret() test 2
   2042 b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(data="somedata")
   2043 a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(data="otherdata")
   2044 b.hashret() == a.hashret()
   2045 
   2046 = ICMPv6EchoRequest and ICMPv6EchoReply - hashret() test 3
   2047 b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(id=0x6666, seq=0x7777,data="somedata")
   2048 a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(id=0x6666, seq=0x8888, data="somedata")
   2049 b.hashret() != a.hashret()
   2050 
   2051 = ICMPv6EchoRequest and ICMPv6EchoReply - hashret() test 4
   2052 b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(id=0x6666, seq=0x7777,data="somedata")
   2053 a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(id=0x8888, seq=0x7777, data="somedata")
   2054 b.hashret() != a.hashret()
   2055 
   2056 = ICMPv6EchoRequest and ICMPv6EchoReply - answers() test 5
   2057 b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(data="somedata")
   2058 a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(data="somedata")
   2059 (a > b) == True
   2060 
   2061 = ICMPv6EchoRequest and ICMPv6EchoReply - answers() test 6
   2062 b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(id=0x6666, seq=0x7777, data="somedata")
   2063 a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(id=0x6666, seq=0x7777, data="somedata")
   2064 (a > b) == True
   2065 
   2066 = ICMPv6EchoRequest and ICMPv6EchoReply - live answers() use Net6
   2067 ~ netaccess ipv6
   2068 
   2069 a = IPv6(dst="www.google.com")/ICMPv6EchoRequest()
   2070 b = IPv6(src="www.google.com", dst=a.src)/ICMPv6EchoReply()
   2071 assert b.answers(a)
   2072 assert (a > b)
   2073 
   2074 
   2075 ########### ICMPv6MRD* Classes ######################################
   2076 
   2077 = ICMPv6MRD_Advertisement - Basic instantiation
   2078 raw(ICMPv6MRD_Advertisement()) == b'\x97\x14\x00\x00\x00\x00\x00\x00'
   2079 
   2080 = ICMPv6MRD_Advertisement - Instantiation with specific values
   2081 raw(ICMPv6MRD_Advertisement(advinter=0xdd, queryint=0xeeee, robustness=0xffff)) == b'\x97\xdd\x00\x00\xee\xee\xff\xff'
   2082 
   2083 = ICMPv6MRD_Advertisement - Basic Dissection and overloading mechanisms
   2084 a=Ether(raw(Ether()/IPv6()/ICMPv6MRD_Advertisement()))
   2085 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
   2086 
   2087 
   2088 = ICMPv6MRD_Solicitation - Basic dissection
   2089 raw(ICMPv6MRD_Solicitation()) == b'\x98\x00\x00\x00'
   2090 
   2091 = ICMPv6MRD_Solicitation - Instantiation with specific values 
   2092 raw(ICMPv6MRD_Solicitation(res=0xbb)) == b'\x98\xbb\x00\x00'
   2093 
   2094 = ICMPv6MRD_Solicitation - Basic Dissection and overloading mechanisms
   2095 a=Ether(raw(Ether()/IPv6()/ICMPv6MRD_Solicitation()))
   2096 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
   2097 
   2098 
   2099 = ICMPv6MRD_Termination Basic instantiation
   2100 raw(ICMPv6MRD_Termination()) == b'\x99\x00\x00\x00'
   2101 
   2102 = ICMPv6MRD_Termination - Instantiation with specific values 
   2103 raw(ICMPv6MRD_Termination(res=0xbb)) == b'\x99\xbb\x00\x00'
   2104 
   2105 = ICMPv6MRD_Termination - Basic Dissection and overloading mechanisms
   2106 a=Ether(raw(Ether()/IPv6()/ICMPv6MRD_Termination()))
   2107 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
   2108 
   2109 
   2110 ############
   2111 ############
   2112 + Test HBHOptUnknown Class
   2113 
   2114 = HBHOptUnknown - Basic Instantiation 
   2115 raw(HBHOptUnknown()) == b'\x01\x00'
   2116 
   2117 = HBHOptUnknown - Basic Dissection 
   2118 a=HBHOptUnknown(b'\x01\x00')
   2119 a.otype == 0x01 and a.optlen == 0 and a.optdata == b""
   2120 
   2121 = HBHOptUnknown - Automatic optlen computation
   2122 raw(HBHOptUnknown(optdata="B"*10)) == b'\x01\nBBBBBBBBBB'
   2123 
   2124 = HBHOptUnknown - Instantiation with specific values
   2125 raw(HBHOptUnknown(optlen=9, optdata="B"*10)) == b'\x01\tBBBBBBBBBB'
   2126 
   2127 = HBHOptUnknown - Dissection with specific values 
   2128 a=HBHOptUnknown(b'\x01\tBBBBBBBBBB')
   2129 a.otype == 0x01 and a.optlen == 9 and a.optdata == b"B"*9 and isinstance(a.payload, Raw) and a.payload.load == b"B"
   2130 
   2131 
   2132 ############
   2133 ############
   2134 + Test Pad1 Class
   2135 
   2136 = Pad1 - Basic Instantiation
   2137 raw(Pad1()) == b'\x00'
   2138 
   2139 = Pad1 - Basic Dissection
   2140 raw(Pad1(b'\x00')) == b'\x00'
   2141 
   2142 
   2143 ############
   2144 ############
   2145 + Test PadN Class
   2146 
   2147 = PadN - Basic Instantiation
   2148 raw(PadN()) == b'\x01\x00'
   2149 
   2150 = PadN - Optlen Automatic computation
   2151 raw(PadN(optdata="B"*10)) == b'\x01\nBBBBBBBBBB'
   2152 
   2153 = PadN - Basic Dissection
   2154 a=PadN(b'\x01\x00')
   2155 a.otype == 1 and a.optlen == 0 and a.optdata == b""
   2156 
   2157 = PadN - Dissection with specific values 
   2158 a=PadN(b'\x01\x0cBBBBBBBBBB')
   2159 a.otype == 1 and a.optlen == 12 and a.optdata == b'BBBBBBBBBB'
   2160 
   2161 = PadN - Instantiation with forced optlen 
   2162 raw(PadN(optdata="B"*10, optlen=9)) == b'\x01\x09BBBBBBBBBB'
   2163 
   2164 
   2165 ############
   2166 ############
   2167 + Test RouterAlert Class (RFC 2711)
   2168 
   2169 = RouterAlert - Basic Instantiation 
   2170 raw(RouterAlert()) == b'\x05\x02\x00\x00'
   2171 
   2172 = RouterAlert - Basic Dissection 
   2173 a=RouterAlert(b'\x05\x02\x00\x00')
   2174 a.otype == 0x05 and a.optlen == 2 and a.value == 00
   2175 
   2176 = RouterAlert - Instantiation with specific values 
   2177 raw(RouterAlert(optlen=3, value=0xffff)) == b'\x05\x03\xff\xff' 
   2178 
   2179 = RouterAlert - Instantiation with specific values
   2180 a=RouterAlert(b'\x05\x03\xff\xff')
   2181 a.otype == 0x05 and a.optlen == 3 and a.value == 0xffff
   2182 
   2183 
   2184 ############
   2185 ############
   2186 + Test Jumbo Class (RFC 2675)
   2187 
   2188 = Jumbo - Basic Instantiation 
   2189 raw(Jumbo()) == b'\xc2\x04\x00\x00\x00\x00'
   2190 
   2191 = Jumbo - Basic Dissection 
   2192 a=Jumbo(b'\xc2\x04\x00\x00\x00\x00')
   2193 a.otype == 0xC2 and a.optlen == 4 and a.jumboplen == 0
   2194 
   2195 = Jumbo - Instantiation with specific values
   2196 raw(Jumbo(optlen=6, jumboplen=0xffffffff)) == b'\xc2\x06\xff\xff\xff\xff'
   2197 
   2198 = Jumbo - Dissection with specific values 
   2199 a=Jumbo(b'\xc2\x06\xff\xff\xff\xff')
   2200 a.otype == 0xc2 and a.optlen == 6 and a.jumboplen == 0xffffffff
   2201 
   2202 
   2203 ############
   2204 ############
   2205 + Test HAO Class (RFC 3775)
   2206 
   2207 = HAO - Basic Instantiation 
   2208 raw(HAO()) == b'\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   2209 
   2210 = HAO - Basic Dissection 
   2211 a=HAO(b'\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
   2212 a.otype == 0xC9 and a.optlen == 16 and a.hoa == "::"
   2213 
   2214 = HAO - Instantiation with specific values
   2215 raw(HAO(optlen=9, hoa="2001::ffff")) == b'\xc9\t \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff'
   2216 
   2217 = HAO - Dissection with specific values 
   2218 a=HAO(b'\xc9\t \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff')
   2219 a.otype == 0xC9 and a.optlen == 9 and a.hoa == "2001::ffff"
   2220 
   2221 = HAO - hashret
   2222 
   2223 p = IPv6()/IPv6ExtHdrDestOpt(options=HAO(hoa="2001:db8::1"))/ICMPv6EchoRequest()
   2224 p.hashret() == b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00:\x00\x00\x00\x00"
   2225 
   2226 
   2227 ############
   2228 ############
   2229 + Test IPv6ExtHdrHopByHop()
   2230 
   2231 = IPv6ExtHdrHopByHop - Basic Instantiation 
   2232 raw(IPv6ExtHdrHopByHop()) ==  b';\x00\x01\x04\x00\x00\x00\x00'
   2233 
   2234 = IPv6ExtHdrHopByHop - Instantiation with HAO option
   2235 raw(IPv6ExtHdrHopByHop(options=[HAO()])) == b';\x02\x01\x02\x00\x00\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   2236 
   2237 = IPv6ExtHdrHopByHop - Instantiation with RouterAlert option
   2238 raw(IPv6ExtHdrHopByHop(options=[RouterAlert()])) == b';\x00\x05\x02\x00\x00\x01\x00'
   2239  
   2240 = IPv6ExtHdrHopByHop - Instantiation with Jumbo option
   2241 raw(IPv6ExtHdrHopByHop(options=[Jumbo()])) == b';\x00\xc2\x04\x00\x00\x00\x00'
   2242 
   2243 = IPv6ExtHdrHopByHop - Instantiation with Pad1 option
   2244 raw(IPv6ExtHdrHopByHop(options=[Pad1()])) == b';\x00\x00\x01\x03\x00\x00\x00'
   2245 
   2246 = IPv6ExtHdrHopByHop - Instantiation with PadN option
   2247 raw(IPv6ExtHdrHopByHop(options=[Pad1()])) == b';\x00\x00\x01\x03\x00\x00\x00'
   2248 
   2249 = IPv6ExtHdrHopByHop - Instantiation with Jumbo, RouterAlert, HAO
   2250 raw(IPv6ExtHdrHopByHop(options=[Jumbo(), RouterAlert(), HAO()])) == b';\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'
   2251 
   2252 = IPv6ExtHdrHopByHop - Instantiation with HAO, Jumbo, RouterAlert
   2253 raw(IPv6ExtHdrHopByHop(options=[HAO(), Jumbo(), RouterAlert()])) == b';\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'
   2254 
   2255 = IPv6ExtHdrHopByHop - Instantiation with RouterAlert, HAO, Jumbo
   2256 raw(IPv6ExtHdrHopByHop(options=[RouterAlert(), HAO(), Jumbo()])) == b';\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'
   2257 
   2258 = IPv6ExtHdrHopByHop - Basic Dissection
   2259 a=IPv6ExtHdrHopByHop(b';\x00\x01\x04\x00\x00\x00\x00')
   2260 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 == b'\x00'*4
   2261 
   2262 #= IPv6ExtHdrHopByHop - Automatic length computation
   2263 #raw(IPv6ExtHdrHopByHop(options=["toto"])) == b'\x00\x00toto'
   2264 #= IPv6ExtHdrHopByHop - Automatic length computation
   2265 #raw(IPv6ExtHdrHopByHop(options=["toto"])) == b'\x00\x00tototo'
   2266 
   2267 
   2268 ############
   2269 ############
   2270 + Test ICMPv6ND_RS() class - ICMPv6 Type 133 Code 0
   2271 
   2272 = ICMPv6ND_RS - Basic instantiation
   2273 raw(ICMPv6ND_RS()) == b'\x85\x00\x00\x00\x00\x00\x00\x00'
   2274 
   2275 = ICMPv6ND_RS - Basic instantiation with empty dst in IPv6 underlayer
   2276 raw(IPv6(src="2001:db8::1")/ICMPv6ND_RS()) == b'`\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'
   2277 
   2278 = ICMPv6ND_RS - Basic dissection
   2279 a=ICMPv6ND_RS(b'\x85\x00\x00\x00\x00\x00\x00\x00')
   2280 a.type == 133 and a.code == 0 and a.cksum == 0 and a.res == 0 
   2281 
   2282 = ICMPv6ND_RS - Basic instantiation with empty dst in IPv6 underlayer
   2283 a=IPv6(b'`\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')
   2284 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
   2285 
   2286 
   2287 ############
   2288 ############
   2289 + Test ICMPv6ND_RA() class - ICMPv6 Type 134 Code 0
   2290 
   2291 = ICMPv6ND_RA - Basic Instantiation 
   2292 raw(ICMPv6ND_RA()) == b'\x86\x00\x00\x00\x00\x08\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00'
   2293 
   2294 = ICMPv6ND_RA - Basic instantiation with empty dst in IPv6 underlayer
   2295 raw(IPv6(src="2001:db8::1")/ICMPv6ND_RA()) == b'`\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'
   2296 
   2297 = ICMPv6ND_RA - Basic dissection
   2298 a=ICMPv6ND_RA(b'\x86\x00\x00\x00\x00\x08\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00')
   2299 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
   2300 
   2301 = ICMPv6ND_RA - Basic instantiation with empty dst in IPv6 underlayer
   2302 a=IPv6(b'`\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')
   2303 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 
   2304 
   2305 = ICMPv6ND_RA - Answers
   2306 assert ICMPv6ND_RA().answers(ICMPv6ND_RS())
   2307 a=IPv6(b'`\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')
   2308 b = IPv6(b"`\x00\x00\x00\x00\x10:\xff\xff\x02\x00\x00\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\x01\x85\x00M\xff\x00\x00\x00\x00")
   2309 assert a.answers(b)
   2310 
   2311 ############
   2312 ############
   2313 + ICMPv6ND_NS Class Test
   2314 
   2315 = ICMPv6ND_NS - Basic Instantiation
   2316 raw(ICMPv6ND_NS()) == b'\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   2317 
   2318 = ICMPv6ND_NS - Instantiation with specific values
   2319 raw(ICMPv6ND_NS(code=0x11, res=3758096385, tgt="ffff::1111")) == b'\x87\x11\x00\x00\xe0\x00\x00\x01\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11'
   2320 
   2321 = ICMPv6ND_NS - Basic Dissection
   2322 a=ICMPv6ND_NS(b'\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
   2323 a.code==0 and a.res==0 and a.tgt=="::"
   2324 
   2325 = ICMPv6ND_NS - Dissection with specific values
   2326 a=ICMPv6ND_NS(b'\x87\x11\x00\x00\xe0\x00\x00\x01\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11')
   2327 a.code==0x11 and a.res==3758096385 and a.tgt=="ffff::1111"
   2328 
   2329 = ICMPv6ND_NS - IPv6 layer fields overloading
   2330 a=IPv6(raw(IPv6()/ICMPv6ND_NS()))
   2331 a.nh == 58 and a.dst=="ff02::1" and a.hlim==255
   2332 
   2333 ############
   2334 ############
   2335 + ICMPv6ND_NA Class Test
   2336 
   2337 = ICMPv6ND_NA - Basic Instantiation
   2338 raw(ICMPv6ND_NA()) == b'\x88\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   2339 
   2340 = ICMPv6ND_NA - Instantiation with specific values
   2341 raw(ICMPv6ND_NA(code=0x11, R=0, S=1, O=0, res=1, tgt="ffff::1111")) == b'\x88\x11\x00\x00@\x00\x00\x01\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11'
   2342 
   2343 = ICMPv6ND_NA - Basic Dissection
   2344 a=ICMPv6ND_NA(b'\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
   2345 a.code==0 and a.R==0 and a.S==0 and a.O==0 and a.res==0 and a.tgt=="::"
   2346 
   2347 = ICMPv6ND_NA - Dissection with specific values
   2348 a=ICMPv6ND_NA(b'\x88\x11\x00\x00@\x00\x00\x01\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11')
   2349 a.code==0x11 and a.R==0 and a.S==1 and a.O==0 and a.res==1 and a.tgt=="ffff::1111"
   2350 assert a.hashret() == b'ffff::1111'
   2351 
   2352 = ICMPv6ND_NS - IPv6 layer fields overloading
   2353 a=IPv6(raw(IPv6()/ICMPv6ND_NS()))
   2354 a.nh == 58 and a.dst=="ff02::1" and a.hlim==255
   2355 
   2356 
   2357 ############
   2358 ############
   2359 + ICMPv6ND_ND/ICMPv6ND_ND matching test
   2360 
   2361 =  ICMPv6ND_ND/ICMPv6ND_ND matching - test 1
   2362 # Sent NS 
   2363 a=IPv6(b'`\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')
   2364 # Received NA 
   2365 b=IPv6(b'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')
   2366 b.answers(a)
   2367 
   2368 
   2369 ############
   2370 ############
   2371 + ICMPv6NDOptUnknown Class Test
   2372 
   2373 = ICMPv6NDOptUnknown - Basic Instantiation
   2374 raw(ICMPv6NDOptUnknown()) == b'\x00\x02'
   2375 
   2376 = ICMPv6NDOptUnknown - Instantiation with specific values
   2377 raw(ICMPv6NDOptUnknown(len=4, data="somestring")) == b'\x00\x04somestring'
   2378 
   2379 = ICMPv6NDOptUnknown - Basic Dissection
   2380 a=ICMPv6NDOptUnknown(b'\x00\x02')
   2381 a.type == 0 and a.len == 2
   2382 
   2383 = ICMPv6NDOptUnknown - Dissection with specific values 
   2384 a=ICMPv6NDOptUnknown(b'\x00\x04somerawing')
   2385 a.type == 0 and a.len==4 and a.data == b"so" and isinstance(a.payload, Raw) and a.payload.load == b"merawing"
   2386 
   2387 
   2388 ############
   2389 ############
   2390 + ICMPv6NDOptSrcLLAddr Class Test
   2391 
   2392 = ICMPv6NDOptSrcLLAddr - Basic Instantiation
   2393 raw(ICMPv6NDOptSrcLLAddr()) == b'\x01\x01\x00\x00\x00\x00\x00\x00'
   2394 
   2395 = ICMPv6NDOptSrcLLAddr - Instantiation with specific values
   2396 raw(ICMPv6NDOptSrcLLAddr(len=2, lladdr="11:11:11:11:11:11")) == b'\x01\x02\x11\x11\x11\x11\x11\x11'
   2397 
   2398 = ICMPv6NDOptSrcLLAddr - Basic Dissection
   2399 a=ICMPv6NDOptSrcLLAddr(b'\x01\x01\x00\x00\x00\x00\x00\x00')
   2400 a.type == 1 and a.len == 1 and a.lladdr == "00:00:00:00:00:00"
   2401 
   2402 = ICMPv6NDOptSrcLLAddr - Instantiation with specific values
   2403 a=ICMPv6NDOptSrcLLAddr(b'\x01\x02\x11\x11\x11\x11\x11\x11') 
   2404 a.type == 1 and a.len == 2 and a.lladdr == "11:11:11:11:11:11"
   2405 
   2406 
   2407 ############
   2408 ############
   2409 + ICMPv6NDOptDstLLAddr Class Test
   2410 
   2411 = ICMPv6NDOptDstLLAddr - Basic Instantiation
   2412 raw(ICMPv6NDOptDstLLAddr()) == b'\x02\x01\x00\x00\x00\x00\x00\x00'
   2413 
   2414 = ICMPv6NDOptDstLLAddr - Instantiation with specific values
   2415 raw(ICMPv6NDOptDstLLAddr(len=2, lladdr="11:11:11:11:11:11")) == b'\x02\x02\x11\x11\x11\x11\x11\x11'
   2416 
   2417 = ICMPv6NDOptDstLLAddr - Basic Dissection
   2418 a=ICMPv6NDOptDstLLAddr(b'\x02\x01\x00\x00\x00\x00\x00\x00')
   2419 a.type == 2 and a.len == 1 and a.lladdr == "00:00:00:00:00:00"
   2420 
   2421 = ICMPv6NDOptDstLLAddr - Instantiation with specific values
   2422 a=ICMPv6NDOptDstLLAddr(b'\x02\x02\x11\x11\x11\x11\x11\x11') 
   2423 a.type == 2 and a.len == 2 and a.lladdr == "11:11:11:11:11:11"
   2424 
   2425 
   2426 ############
   2427 ############
   2428 + ICMPv6NDOptPrefixInfo Class Test
   2429 
   2430 = ICMPv6NDOptPrefixInfo - Basic Instantiation
   2431 raw(ICMPv6NDOptPrefixInfo()) == b'\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'
   2432 
   2433 = ICMPv6NDOptPrefixInfo - Instantiation with specific values
   2434 raw(ICMPv6NDOptPrefixInfo(len=5, prefixlen=64, L=0, A=0, R=1, res1=1, validlifetime=0x11111111, preferredlifetime=0x22222222, res2=0x33333333, prefix="2001:db8::1")) == b'\x03\x05@!\x11\x11\x11\x11""""3333 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
   2435 
   2436 = ICMPv6NDOptPrefixInfo - Basic Dissection
   2437 a=ICMPv6NDOptPrefixInfo(b'\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')
   2438 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 == "::"
   2439 
   2440 = ICMPv6NDOptPrefixInfo - Instantiation with specific values
   2441 a=ICMPv6NDOptPrefixInfo(b'\x03\x05@!\x11\x11\x11\x11""""3333 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
   2442 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"
   2443 
   2444 
   2445 ############
   2446 ############
   2447 + ICMPv6NDOptRedirectedHdr Class Test 
   2448 
   2449 = ICMPv6NDOptRedirectedHdr - Basic Instantiation
   2450 ~ ICMPv6NDOptRedirectedHdr
   2451 raw(ICMPv6NDOptRedirectedHdr()) == b'\x04\x01\x00\x00\x00\x00\x00\x00'
   2452 
   2453 = ICMPv6NDOptRedirectedHdr - Instantiation with specific values 
   2454 ~ ICMPv6NDOptRedirectedHdr
   2455 raw(ICMPv6NDOptRedirectedHdr(len=0xff, res="abcdef", pkt="somestringthatisnotanipv6packet")) == b'\x04\xffabcdefsomestringthatisnotanipv'
   2456 
   2457 = ICMPv6NDOptRedirectedHdr - Instantiation with simple IPv6 packet (no upper layer)
   2458 ~ ICMPv6NDOptRedirectedHdr
   2459 raw(ICMPv6NDOptRedirectedHdr(pkt=IPv6())) == b'\x04\x06\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\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
   2460 
   2461 = ICMPv6NDOptRedirectedHdr - Basic Dissection
   2462 ~ ICMPv6NDOptRedirectedHdr
   2463 a=ICMPv6NDOptRedirectedHdr(b'\x04\x00\x00\x00')
   2464 assert(a.type == 4)
   2465 assert(a.len == 0)
   2466 assert(a.res == b"\x00\x00")
   2467 assert(a.pkt == b"")
   2468 
   2469 = ICMPv6NDOptRedirectedHdr - Disssection with specific values
   2470 ~ ICMPv6NDOptRedirectedHdr
   2471 a=ICMPv6NDOptRedirectedHdr(b'\x04\xff\x11\x11\x00\x00\x00\x00somerawingthatisnotanipv6pac')
   2472 a.type == 4 and a.len == 255 and a.res == b'\x11\x11\x00\x00\x00\x00' and isinstance(a.pkt, Raw) and a.pkt.load == b"somerawingthatisnotanipv6pac"
   2473 
   2474 = ICMPv6NDOptRedirectedHdr - Dissection with cut IPv6 Header
   2475 ~ ICMPv6NDOptRedirectedHdr
   2476 a=ICMPv6NDOptRedirectedHdr(b'\x04\x06\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\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
   2477 a.type == 4 and a.len == 6 and a.res == b"\x00\x00\x00\x00\x00\x00" and isinstance(a.pkt, Raw) and a.pkt.load == b'`\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'
   2478 
   2479 = ICMPv6NDOptRedirectedHdr - Complete dissection
   2480 ~ ICMPv6NDOptRedirectedHdr
   2481 x=ICMPv6NDOptRedirectedHdr(b'\x04\x06\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\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
   2482 y=x.copy()
   2483 del(y.len)
   2484 x == ICMPv6NDOptRedirectedHdr(raw(y))
   2485 
   2486 # Add more tests
   2487 
   2488 
   2489 ############
   2490 ############
   2491 + ICMPv6NDOptMTU Class Test 
   2492 
   2493 = ICMPv6NDOptMTU - Basic Instantiation
   2494 raw(ICMPv6NDOptMTU()) == b'\x05\x01\x00\x00\x00\x00\x05\x00'
   2495 
   2496 = ICMPv6NDOptMTU - Instantiation with specific values
   2497 raw(ICMPv6NDOptMTU(len=2, res=0x1111, mtu=1500)) == b'\x05\x02\x11\x11\x00\x00\x05\xdc'
   2498  
   2499 = ICMPv6NDOptMTU - Basic dissection
   2500 a=ICMPv6NDOptMTU(b'\x05\x01\x00\x00\x00\x00\x05\x00')
   2501 a.type == 5 and a.len == 1 and a.res == 0 and a.mtu == 1280
   2502 
   2503 = ICMPv6NDOptMTU - Dissection with specific values
   2504 a=ICMPv6NDOptMTU(b'\x05\x02\x11\x11\x00\x00\x05\xdc')
   2505 a.type == 5 and a.len == 2 and a.res == 0x1111 and a.mtu == 1500
   2506 
   2507 
   2508 ############
   2509 ############
   2510 + ICMPv6NDOptShortcutLimit Class Test (RFC2491)
   2511 
   2512 = ICMPv6NDOptShortcutLimit - Basic Instantiation
   2513 raw(ICMPv6NDOptShortcutLimit()) == b'\x06\x01(\x00\x00\x00\x00\x00'
   2514 
   2515 = ICMPv6NDOptShortcutLimit - Instantiation with specific values
   2516 raw(ICMPv6NDOptShortcutLimit(len=2, shortcutlim=0x11, res1=0xee, res2=0xaaaaaaaa)) == b'\x06\x02\x11\xee\xaa\xaa\xaa\xaa'
   2517 
   2518 = ICMPv6NDOptShortcutLimit - Basic Dissection
   2519 a=ICMPv6NDOptShortcutLimit(b'\x06\x01(\x00\x00\x00\x00\x00')
   2520 a.type == 6 and a.len == 1 and a.shortcutlim == 40 and a.res1 == 0 and a.res2 == 0
   2521 
   2522 = ICMPv6NDOptShortcutLimit - Dissection with specific values
   2523 a=ICMPv6NDOptShortcutLimit(b'\x06\x02\x11\xee\xaa\xaa\xaa\xaa')
   2524 a.len==2 and a.shortcutlim==0x11 and a.res1==0xee and a.res2==0xaaaaaaaa
   2525 
   2526 
   2527 ############
   2528 ############
   2529 + ICMPv6NDOptAdvInterval Class Test 
   2530 
   2531 = ICMPv6NDOptAdvInterval - Basic Instantiation
   2532 raw(ICMPv6NDOptAdvInterval()) == b'\x07\x01\x00\x00\x00\x00\x00\x00'
   2533 
   2534 = ICMPv6NDOptAdvInterval - Instantiation with specific values
   2535 raw(ICMPv6NDOptAdvInterval(len=2, res=0x1111, advint=0xffffffff)) == b'\x07\x02\x11\x11\xff\xff\xff\xff'
   2536  
   2537 = ICMPv6NDOptAdvInterval - Basic dissection
   2538 a=ICMPv6NDOptAdvInterval(b'\x07\x01\x00\x00\x00\x00\x00\x00')
   2539 a.type == 7 and a.len == 1 and a.res == 0 and a.advint == 0
   2540 
   2541 = ICMPv6NDOptAdvInterval - Dissection with specific values
   2542 a=ICMPv6NDOptAdvInterval(b'\x07\x02\x11\x11\xff\xff\xff\xff')
   2543 a.type == 7 and a.len == 2 and a.res == 0x1111 and a.advint == 0xffffffff
   2544 
   2545 
   2546 ############
   2547 ############
   2548 + ICMPv6NDOptHAInfo Class Test
   2549 
   2550 = ICMPv6NDOptHAInfo - Basic Instantiation
   2551 raw(ICMPv6NDOptHAInfo()) == b'\x08\x01\x00\x00\x00\x00\x00\x01'
   2552 
   2553 = ICMPv6NDOptHAInfo - Instantiation with specific values
   2554 raw(ICMPv6NDOptHAInfo(len=2, res=0x1111, pref=0x2222, lifetime=0x3333)) == b'\x08\x02\x11\x11""33'
   2555  
   2556 = ICMPv6NDOptHAInfo - Basic dissection
   2557 a=ICMPv6NDOptHAInfo(b'\x08\x01\x00\x00\x00\x00\x00\x01')
   2558 a.type == 8 and a.len == 1 and a.res == 0 and a.pref == 0 and a.lifetime == 1
   2559 
   2560 = ICMPv6NDOptHAInfo - Dissection with specific values
   2561 a=ICMPv6NDOptHAInfo(b'\x08\x02\x11\x11""33')
   2562 a.type == 8 and a.len == 2 and a.res == 0x1111 and a.pref == 0x2222 and a.lifetime == 0x3333
   2563 
   2564 
   2565 ############
   2566 ############
   2567 + ICMPv6NDOptSrcAddrList Class Test 
   2568 
   2569 = ICMPv6NDOptSrcAddrList - Basic Instantiation
   2570 raw(ICMPv6NDOptSrcAddrList()) == b'\t\x01\x00\x00\x00\x00\x00\x00'
   2571 
   2572 = ICMPv6NDOptSrcAddrList - Instantiation with specific values (auto len)
   2573 raw(ICMPv6NDOptSrcAddrList(res="BBBBBB", addrlist=["ffff::ffff", "1111::1111"])) == b'\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'
   2574 
   2575 = ICMPv6NDOptSrcAddrList - Instantiation with specific values 
   2576 raw(ICMPv6NDOptSrcAddrList(len=3, res="BBBBBB", addrlist=["ffff::ffff", "1111::1111"])) == b'\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'
   2577 
   2578 = ICMPv6NDOptSrcAddrList - Basic Dissection
   2579 a=ICMPv6NDOptSrcAddrList(b'\t\x01\x00\x00\x00\x00\x00\x00')
   2580 a.type == 9 and a.len == 1 and a.res == b'\x00\x00\x00\x00\x00\x00' and not a.addrlist
   2581 
   2582 = ICMPv6NDOptSrcAddrList - Dissection with specific values (auto len)
   2583 a=ICMPv6NDOptSrcAddrList(b'\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')
   2584 a.type == 9 and a.len == 5 and a.res == b'BBBBBB' and len(a.addrlist) == 2 and a.addrlist[0] == "ffff::ffff" and a.addrlist[1] == "1111::1111"
   2585 
   2586 = ICMPv6NDOptSrcAddrList - Dissection with specific values 
   2587 conf.debug_dissector = False
   2588 a=ICMPv6NDOptSrcAddrList(b'\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')
   2589 conf.debug_dissector = True
   2590 a.type == 9 and a.len == 3 and a.res == b'BBBBBB' and len(a.addrlist) == 1 and a.addrlist[0] == "ffff::ffff" and isinstance(a.payload, Raw) and a.payload.load == b'\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11'
   2591 
   2592 
   2593 ############
   2594 ############
   2595 + ICMPv6NDOptTgtAddrList Class Test 
   2596 
   2597 = ICMPv6NDOptTgtAddrList - Basic Instantiation
   2598 raw(ICMPv6NDOptTgtAddrList()) == b'\n\x01\x00\x00\x00\x00\x00\x00'
   2599 
   2600 = ICMPv6NDOptTgtAddrList - Instantiation with specific values (auto len)
   2601 raw(ICMPv6NDOptTgtAddrList(res="BBBBBB", addrlist=["ffff::ffff", "1111::1111"])) == b'\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'
   2602 
   2603 = ICMPv6NDOptTgtAddrList - Instantiation with specific values 
   2604 raw(ICMPv6NDOptTgtAddrList(len=3, res="BBBBBB", addrlist=["ffff::ffff", "1111::1111"])) == b'\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'
   2605 
   2606 = ICMPv6NDOptTgtAddrList - Basic Dissection
   2607 a=ICMPv6NDOptTgtAddrList(b'\n\x01\x00\x00\x00\x00\x00\x00')
   2608 a.type == 10 and a.len == 1 and a.res == b'\x00\x00\x00\x00\x00\x00' and not a.addrlist
   2609 
   2610 = ICMPv6NDOptTgtAddrList - Dissection with specific values (auto len)
   2611 a=ICMPv6NDOptTgtAddrList(b'\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')
   2612 a.type == 10 and a.len == 5 and a.res == b'BBBBBB' and len(a.addrlist) == 2 and a.addrlist[0] == "ffff::ffff" and a.addrlist[1] == "1111::1111"
   2613 
   2614 = ICMPv6NDOptTgtAddrList - Instantiation with specific values 
   2615 conf.debug_dissector = False
   2616 a=ICMPv6NDOptTgtAddrList(b'\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')
   2617 conf.debug_dissector = True
   2618 a.type == 10 and a.len == 3 and a.res == b'BBBBBB' and len(a.addrlist) == 1 and a.addrlist[0] == "ffff::ffff" and isinstance(a.payload, Raw) and a.payload.load == b'\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11'
   2619 
   2620 
   2621 ############
   2622 ############
   2623 + ICMPv6NDOptIPAddr Class Test (RFC 4068)
   2624 
   2625 = ICMPv6NDOptIPAddr - Basic Instantiation 
   2626 raw(ICMPv6NDOptIPAddr()) == b'\x11\x03\x01@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   2627 
   2628 = ICMPv6NDOptIPAddr - Instantiation with specific values
   2629 raw(ICMPv6NDOptIPAddr(len=5, optcode=0xff, plen=40, res=0xeeeeeeee, addr="ffff::1111")) == b'\x11\x05\xff(\xee\xee\xee\xee\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11'
   2630 
   2631 = ICMPv6NDOptIPAddr - Basic Dissection 
   2632 a=ICMPv6NDOptIPAddr(b'\x11\x03\x01@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
   2633 a.type == 17 and a.len == 3 and a.optcode == 1 and a.plen == 64 and a.res == 0 and a.addr == "::"
   2634 
   2635 = ICMPv6NDOptIPAddr - Dissection with specific values
   2636 a=ICMPv6NDOptIPAddr(b'\x11\x05\xff(\xee\xee\xee\xee\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11')
   2637 a.type == 17 and a.len == 5 and a.optcode == 0xff and a.plen == 40 and a.res == 0xeeeeeeee and a.addr == "ffff::1111"
   2638 
   2639 
   2640 ############
   2641 ############
   2642 + ICMPv6NDOptNewRtrPrefix Class Test (RFC 4068)
   2643 
   2644 = ICMPv6NDOptNewRtrPrefix - Basic Instantiation 
   2645 raw(ICMPv6NDOptNewRtrPrefix()) == b'\x12\x03\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   2646 
   2647 = ICMPv6NDOptNewRtrPrefix - Instantiation with specific values
   2648 raw(ICMPv6NDOptNewRtrPrefix(len=5, optcode=0xff, plen=40, res=0xeeeeeeee, prefix="ffff::1111")) == b'\x12\x05\xff(\xee\xee\xee\xee\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11'
   2649 
   2650 = ICMPv6NDOptNewRtrPrefix - Basic Dissection 
   2651 a=ICMPv6NDOptNewRtrPrefix(b'\x12\x03\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
   2652 a.type == 18 and a.len == 3 and a.optcode == 0 and a.plen == 64 and a.res == 0 and a.prefix == "::"
   2653 
   2654 = ICMPv6NDOptNewRtrPrefix - Dissection with specific values
   2655 a=ICMPv6NDOptNewRtrPrefix(b'\x12\x05\xff(\xee\xee\xee\xee\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11')
   2656 a.type == 18 and a.len == 5 and a.optcode == 0xff and a.plen == 40 and a.res == 0xeeeeeeee and a.prefix == "ffff::1111"
   2657 
   2658 
   2659 ############
   2660 ############
   2661 + ICMPv6NDOptLLA Class Test (RFC 4068)
   2662 
   2663 = ICMPv6NDOptLLA - Basic Instantiation 
   2664 raw(ICMPv6NDOptLLA()) == b'\x13\x01\x00\x00\x00\x00\x00\x00\x00'
   2665 
   2666 = ICMPv6NDOptLLA - Instantiation with specific values
   2667 raw(ICMPv6NDOptLLA(len=2, optcode=3, lla="ff:11:ff:11:ff:11")) == b'\x13\x02\x03\xff\x11\xff\x11\xff\x11'
   2668 
   2669 = ICMPv6NDOptLLA - Basic Dissection 
   2670 a=ICMPv6NDOptLLA(b'\x13\x01\x00\x00\x00\x00\x00\x00\x00')
   2671 a.type == 19 and a.len == 1 and a.optcode == 0 and a.lla == "00:00:00:00:00:00"
   2672 
   2673 = ICMPv6NDOptLLA - Dissection with specific values
   2674 a=ICMPv6NDOptLLA(b'\x13\x02\x03\xff\x11\xff\x11\xff\x11')
   2675 a.type == 19 and a.len == 2 and a.optcode == 3 and a.lla == "ff:11:ff:11:ff:11"
   2676 
   2677 
   2678 ############
   2679 ############
   2680 + ICMPv6NDOptRouteInfo Class Test
   2681 
   2682 = ICMPv6NDOptRouteInfo - Basic Instantiation
   2683 raw(ICMPv6NDOptRouteInfo()) == b'\x18\x01\x00\x00\xff\xff\xff\xff'
   2684 
   2685 = ICMPv6NDOptRouteInfo - Instantiation with forced prefix but no length
   2686 raw(ICMPv6NDOptRouteInfo(prefix="2001:db8:1:1:1:1:1:1")) == b'\x18\x03\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01'
   2687 
   2688 = ICMPv6NDOptRouteInfo - Instantiation with forced length values (1/4)
   2689 raw(ICMPv6NDOptRouteInfo(len=1, prefix="2001:db8:1:1:1:1:1:1")) == b'\x18\x01\x00\x00\xff\xff\xff\xff'
   2690 
   2691 = ICMPv6NDOptRouteInfo - Instantiation with forced length values (2/4)
   2692 raw(ICMPv6NDOptRouteInfo(len=2, prefix="2001:db8:1:1:1:1:1:1")) == b'\x18\x02\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x01\x00\x01'
   2693 
   2694 = ICMPv6NDOptRouteInfo - Instantiation with forced length values (3/4)
   2695 raw(ICMPv6NDOptRouteInfo(len=3, prefix="2001:db8:1:1:1:1:1:1")) == b'\x18\x03\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01'
   2696 
   2697 = ICMPv6NDOptRouteInfo - Instantiation with forced length values (4/4)
   2698 raw(ICMPv6NDOptRouteInfo(len=4, prefix="2001:db8:1:1:1:1:1:1")) == b'\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'
   2699 
   2700 = ICMPv6NDOptRouteInfo - Instantiation with specific values 
   2701 raw(ICMPv6NDOptRouteInfo(len=6, plen=0x11, res1=1, prf=3, res2=1, rtlifetime=0x22222222, prefix="2001:db8::1")) == b'\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'
   2702 
   2703 = ICMPv6NDOptRouteInfo - Basic dissection
   2704 a=ICMPv6NDOptRouteInfo(b'\x18\x03\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
   2705 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 == "::"
   2706 
   2707 = ICMPv6NDOptRouteInfo - Dissection with specific values 
   2708 a=ICMPv6NDOptRouteInfo(b'\x18\x04\x119"""" \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
   2709 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" 
   2710 
   2711 
   2712 ############
   2713 ############
   2714 + ICMPv6NDOptMAP Class Test
   2715 
   2716 = ICMPv6NDOptMAP - Basic Instantiation
   2717 raw(ICMPv6NDOptMAP()) == b'\x17\x03\x1f\x80\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   2718 
   2719 = ICMPv6NDOptMAP - Instantiation with specific values
   2720 raw(ICMPv6NDOptMAP(len=5, dist=3, pref=10, R=0, res=1, validlifetime=0x11111111, addr="ffff::1111")) == b'\x17\x05:\x01\x11\x11\x11\x11\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11'
   2721 
   2722 = ICMPv6NDOptMAP - Basic Dissection
   2723 a=ICMPv6NDOptMAP(b'\x17\x03\x1f\x80\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
   2724 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=="::"
   2725 
   2726 = ICMPv6NDOptMAP - Dissection with specific values
   2727 a=ICMPv6NDOptMAP(b'\x17\x05:\x01\x11\x11\x11\x11\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11')
   2728 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"
   2729 
   2730 
   2731 ############
   2732 ############
   2733 + ICMPv6NDOptRDNSS Class Test
   2734 
   2735 = ICMPv6NDOptRDNSS - Basic Instantiation
   2736 raw(ICMPv6NDOptRDNSS()) == b'\x19\x01\x00\x00\xff\xff\xff\xff'
   2737 
   2738 = ICMPv6NDOptRDNSS - Basic instantiation with 1 DNS address
   2739 raw(ICMPv6NDOptRDNSS(dns=["2001:db8::1"])) == b'\x19\x03\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
   2740 
   2741 = ICMPv6NDOptRDNSS - Basic instantiation with 2 DNS addresses
   2742 raw(ICMPv6NDOptRDNSS(dns=["2001:db8::1", "2001:db8::2"])) == b'\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'
   2743 
   2744 = ICMPv6NDOptRDNSS - Instantiation with specific values
   2745 raw(ICMPv6NDOptRDNSS(len=43, res=0xaaee, lifetime=0x11111111, dns=["2001:db8::2"])) == b'\x19+\xaa\xee\x11\x11\x11\x11 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02'
   2746 
   2747 = ICMPv6NDOptRDNSS - Basic Dissection
   2748 a=ICMPv6NDOptRDNSS(b'\x19\x01\x00\x00\xff\xff\xff\xff')
   2749 a.type==25 and a.len==1 and a.res == 0 and a.dns==[]
   2750 
   2751 = ICMPv6NDOptRDNSS - Dissection (with 1 DNS address)
   2752 a=ICMPv6NDOptRDNSS(b'\x19\x03\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
   2753 a.type==25 and a.len==3 and a.res ==0 and len(a.dns) == 1 and a.dns[0] == "2001:db8::1"
   2754 
   2755 = ICMPv6NDOptRDNSS - Dissection (with 2 DNS addresses)
   2756 a=ICMPv6NDOptRDNSS(b'\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')
   2757 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"
   2758 
   2759 
   2760 ############
   2761 ############
   2762 + ICMPv6NDOptDNSSL Class Test
   2763 
   2764 = ICMPv6NDOptDNSSL - Basic Instantiation
   2765 raw(ICMPv6NDOptDNSSL()) == b'\x1f\x01\x00\x00\xff\xff\xff\xff'
   2766 
   2767 = ICMPv6NDOptDNSSL - Instantiation with 1 search domain, as seen in the wild
   2768 raw(ICMPv6NDOptDNSSL(lifetime=60, searchlist=["home."])) == b'\x1f\x02\x00\x00\x00\x00\x00<\x04home\x00\x00\x00'
   2769 
   2770 = ICMPv6NDOptDNSSL - Basic instantiation with 2 search domains
   2771 raw(ICMPv6NDOptDNSSL(searchlist=["home.", "office."])) == b'\x1f\x03\x00\x00\xff\xff\xff\xff\x04home\x00\x06office\x00\x00\x00'
   2772 
   2773 = ICMPv6NDOptDNSSL - Basic instantiation with 3 search domains
   2774 raw(ICMPv6NDOptDNSSL(searchlist=["home.", "office.", "here.there."])) == b'\x1f\x05\x00\x00\xff\xff\xff\xff\x04home\x00\x06office\x00\x04here\x05there\x00\x00\x00\x00\x00\x00\x00'
   2775 
   2776 = ICMPv6NDOptDNSSL - Basic Dissection
   2777 p = ICMPv6NDOptDNSSL(b'\x1f\x01\x00\x00\xff\xff\xff\xff')
   2778 p.type == 31 and p.len == 1 and p.res == 0 and p.searchlist == []
   2779 
   2780 = ICMPv6NDOptDNSSL - Basic Dissection with specific values
   2781 p = ICMPv6NDOptDNSSL(b'\x1f\x02\x00\x00\x00\x00\x00<\x04home\x00\x00\x00')
   2782 p.type == 31 and p.len == 2 and p.res == 0 and p.lifetime == 60 and p.searchlist == ["home."]
   2783 
   2784 
   2785 ############
   2786 ############
   2787 + ICMPv6NDOptEFA Class Test
   2788 
   2789 = ICMPv6NDOptEFA - Basic Instantiation
   2790 raw(ICMPv6NDOptEFA()) == b'\x1a\x01\x00\x00\x00\x00\x00\x00'
   2791 
   2792 = ICMPv6NDOptEFA - Basic Dissection
   2793 a=ICMPv6NDOptEFA(b'\x1a\x01\x00\x00\x00\x00\x00\x00')
   2794 a.type==26 and a.len==1 and a.res == 0
   2795 
   2796 
   2797 ############
   2798 ############
   2799 + Test Node Information Query - ICMPv6NIQueryNOOP
   2800 
   2801 = ICMPv6NIQueryNOOP - Basic Instantiation
   2802 raw(ICMPv6NIQueryNOOP(nonce=b"\x00"*8)) == b'\x8b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   2803 
   2804 = ICMPv6NIQueryNOOP - Basic Dissection
   2805 a = ICMPv6NIQueryNOOP(b'\x8b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
   2806 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 == b"\x00"*8 and a.data == b""
   2807 
   2808 
   2809 ############
   2810 ############
   2811 + Test Node Information Query - ICMPv6NIQueryName
   2812 
   2813 = ICMPv6NIQueryName - single label DNS name (internal)
   2814 a=ICMPv6NIQueryName(data="abricot").getfieldval("data")
   2815 type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == b'\x07abricot\x00\x00'
   2816 
   2817 = ICMPv6NIQueryName - single label DNS name
   2818 ICMPv6NIQueryName(data="abricot").data == b"abricot"
   2819 
   2820 = ICMPv6NIQueryName - fqdn (internal)
   2821 a=ICMPv6NIQueryName(data="n.d.org").getfieldval("data")
   2822 type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == b'\x01n\x01d\x03org\x00'
   2823 
   2824 = ICMPv6NIQueryName - fqdn
   2825 ICMPv6NIQueryName(data="n.d.org").data == b"n.d.org"
   2826 
   2827 = ICMPv6NIQueryName - IPv6 address (internal)
   2828 a=ICMPv6NIQueryName(data="2001:db8::1").getfieldval("data")
   2829 type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == '2001:db8::1'
   2830 
   2831 = ICMPv6NIQueryName - IPv6 address 
   2832 ICMPv6NIQueryName(data="2001:db8::1").data == "2001:db8::1"
   2833 
   2834 = ICMPv6NIQueryName - IPv4 address (internal)
   2835 a=ICMPv6NIQueryName(data="169.254.253.252").getfieldval("data")
   2836 type(a) is tuple and len(a) == 2 and a[0] == 2 and a[1] == '169.254.253.252'
   2837 
   2838 = ICMPv6NIQueryName - IPv4 address
   2839 ICMPv6NIQueryName(data="169.254.253.252").data == '169.254.253.252'
   2840 
   2841 = ICMPv6NIQueryName - build & dissection
   2842 s = raw(IPv6()/ICMPv6NIQueryName(data="n.d.org"))
   2843 p = IPv6(s)
   2844 ICMPv6NIQueryName in p and p[ICMPv6NIQueryName].data == b"n.d.org"
   2845 
   2846 
   2847 ############
   2848 ############
   2849 + Test Node Information Query - ICMPv6NIQueryIPv6
   2850 
   2851 = ICMPv6NIQueryIPv6 - single label DNS name (internal)
   2852 a = ICMPv6NIQueryIPv6(data="abricot")
   2853 ls(a)
   2854 a = a.getfieldval("data")
   2855 type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == b'\x07abricot\x00\x00'
   2856 
   2857 = ICMPv6NIQueryIPv6 - single label DNS name
   2858 ICMPv6NIQueryIPv6(data="abricot").data == b"abricot"
   2859 
   2860 = ICMPv6NIQueryIPv6 - fqdn (internal)
   2861 a=ICMPv6NIQueryIPv6(data="n.d.org").getfieldval("data")
   2862 type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == b'\x01n\x01d\x03org\x00'
   2863 
   2864 = ICMPv6NIQueryIPv6 - fqdn
   2865 ICMPv6NIQueryIPv6(data="n.d.org").data == b"n.d.org"
   2866 
   2867 = ICMPv6NIQueryIPv6 - IPv6 address (internal)
   2868 a=ICMPv6NIQueryIPv6(data="2001:db8::1").getfieldval("data")
   2869 type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == '2001:db8::1'
   2870 
   2871 = ICMPv6NIQueryIPv6 - IPv6 address 
   2872 ICMPv6NIQueryIPv6(data="2001:db8::1").data == "2001:db8::1"
   2873 
   2874 = ICMPv6NIQueryIPv6 - IPv4 address (internal)
   2875 a=ICMPv6NIQueryIPv6(data="169.254.253.252").getfieldval("data")
   2876 type(a) is tuple and len(a) == 2 and a[0] == 2 and a[1] == '169.254.253.252'
   2877 
   2878 = ICMPv6NIQueryIPv6 - IPv4 address
   2879 ICMPv6NIQueryIPv6(data="169.254.253.252").data == '169.254.253.252'
   2880 
   2881 
   2882 ############
   2883 ############
   2884 + Test Node Information Query - ICMPv6NIQueryIPv4
   2885 
   2886 = ICMPv6NIQueryIPv4 - single label DNS name (internal)
   2887 a=ICMPv6NIQueryIPv4(data="abricot").getfieldval("data")
   2888 type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == b'\x07abricot\x00\x00'
   2889 
   2890 = ICMPv6NIQueryIPv4 - single label DNS name
   2891 ICMPv6NIQueryIPv4(data="abricot").data == b"abricot"
   2892 
   2893 = ICMPv6NIQueryIPv4 - fqdn (internal)
   2894 a=ICMPv6NIQueryIPv4(data="n.d.org").getfieldval("data")
   2895 type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == b'\x01n\x01d\x03org\x00'
   2896 
   2897 = ICMPv6NIQueryIPv4 - fqdn
   2898 ICMPv6NIQueryIPv4(data="n.d.org").data == b"n.d.org"
   2899 
   2900 = ICMPv6NIQueryIPv4 - IPv6 address (internal)
   2901 a=ICMPv6NIQueryIPv4(data="2001:db8::1").getfieldval("data")
   2902 type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == '2001:db8::1'
   2903 
   2904 = ICMPv6NIQueryIPv4 - IPv6 address 
   2905 ICMPv6NIQueryIPv4(data="2001:db8::1").data == "2001:db8::1"
   2906 
   2907 = ICMPv6NIQueryIPv4 - IPv4 address (internal)
   2908 a=ICMPv6NIQueryIPv4(data="169.254.253.252").getfieldval("data")
   2909 type(a) is tuple and len(a) == 2 and a[0] == 2 and a[1] == '169.254.253.252'
   2910 
   2911 = ICMPv6NIQueryIPv4 - IPv4 address
   2912 ICMPv6NIQueryIPv4(data="169.254.253.252").data == '169.254.253.252'
   2913 
   2914 
   2915 ############
   2916 ############
   2917 + Test Node Information Query - Flags tests
   2918 
   2919 = ICMPv6NIQuery* - flags handling (Test 1)
   2920 t = ICMPv6NIQueryIPv6(flags="T")
   2921 a = ICMPv6NIQueryIPv6(flags="A")
   2922 c = ICMPv6NIQueryIPv6(flags="C")
   2923 l = ICMPv6NIQueryIPv6(flags="L")
   2924 s = ICMPv6NIQueryIPv6(flags="S")
   2925 g = ICMPv6NIQueryIPv6(flags="G")
   2926 allflags = ICMPv6NIQueryIPv6(flags="TALCLSG")
   2927 t.flags == 1 and a.flags == 2 and c.flags == 4 and l.flags == 8 and s.flags == 16 and g.flags == 32 and allflags.flags == 63
   2928 
   2929 
   2930 = ICMPv6NIQuery* - flags handling (Test 2)
   2931 t = raw(ICMPv6NIQueryNOOP(flags="T", nonce="A"*8))[6:8]
   2932 a = raw(ICMPv6NIQueryNOOP(flags="A", nonce="A"*8))[6:8]
   2933 c = raw(ICMPv6NIQueryNOOP(flags="C", nonce="A"*8))[6:8]
   2934 l = raw(ICMPv6NIQueryNOOP(flags="L", nonce="A"*8))[6:8]
   2935 s = raw(ICMPv6NIQueryNOOP(flags="S", nonce="A"*8))[6:8]
   2936 g = raw(ICMPv6NIQueryNOOP(flags="G", nonce="A"*8))[6:8]
   2937 allflags = raw(ICMPv6NIQueryNOOP(flags="TALCLSG", nonce="A"*8))[6:8]
   2938 t == b'\x00\x01' and a == b'\x00\x02' and c == b'\x00\x04' and l == b'\x00\x08' and s == b'\x00\x10' and g == b'\x00\x20' and allflags == b'\x00\x3F'
   2939 
   2940 
   2941 = ICMPv6NIReply* - flags handling (Test 1)
   2942 t = ICMPv6NIReplyIPv6(flags="T")
   2943 a = ICMPv6NIReplyIPv6(flags="A")
   2944 c = ICMPv6NIReplyIPv6(flags="C")
   2945 l = ICMPv6NIReplyIPv6(flags="L")
   2946 s = ICMPv6NIReplyIPv6(flags="S")
   2947 g = ICMPv6NIReplyIPv6(flags="G")
   2948 allflags = ICMPv6NIReplyIPv6(flags="TALCLSG")
   2949 t.flags == 1 and a.flags == 2 and c.flags == 4 and l.flags == 8 and s.flags == 16 and g.flags == 32 and allflags.flags == 63
   2950 
   2951 
   2952 = ICMPv6NIReply* - flags handling (Test 2)
   2953 t = raw(ICMPv6NIReplyNOOP(flags="T", nonce="A"*8))[6:8]
   2954 a = raw(ICMPv6NIReplyNOOP(flags="A", nonce="A"*8))[6:8]
   2955 c = raw(ICMPv6NIReplyNOOP(flags="C", nonce="A"*8))[6:8]
   2956 l = raw(ICMPv6NIReplyNOOP(flags="L", nonce="A"*8))[6:8]
   2957 s = raw(ICMPv6NIReplyNOOP(flags="S", nonce="A"*8))[6:8]
   2958 g = raw(ICMPv6NIReplyNOOP(flags="G", nonce="A"*8))[6:8]
   2959 allflags = raw(ICMPv6NIReplyNOOP(flags="TALCLSG", nonce="A"*8))[6:8]
   2960 t == b'\x00\x01' and a == b'\x00\x02' and c == b'\x00\x04' and l == b'\x00\x08' and s == b'\x00\x10' and g == b'\x00\x20' and allflags == b'\x00\x3F'
   2961 
   2962 
   2963 = ICMPv6NIQuery* - Flags Default values
   2964 a = ICMPv6NIQueryNOOP()
   2965 b = ICMPv6NIQueryName()
   2966 c = ICMPv6NIQueryIPv4()
   2967 d = ICMPv6NIQueryIPv6()
   2968 a.flags == 0 and b.flags == 0 and c.flags == 0 and d.flags == 62
   2969 
   2970 = ICMPv6NIReply* - Flags Default values
   2971 a = ICMPv6NIReplyIPv6()
   2972 b = ICMPv6NIReplyName()
   2973 c = ICMPv6NIReplyIPv6()
   2974 d = ICMPv6NIReplyIPv4()
   2975 e = ICMPv6NIReplyRefuse()
   2976 f = ICMPv6NIReplyUnknown()
   2977 a.flags == 0 and b.flags == 0 and c.flags == 0 and d.flags == 0 and e.flags == 0 and f.flags == 0
   2978 
   2979 
   2980 
   2981 # Nonces 
   2982 # hashret and answers
   2983 # payload guess
   2984 # automatic destination address computation when integrated in scapy6
   2985 # at least computeNIGroupAddr
   2986 
   2987 
   2988 ############
   2989 ############
   2990 + Test Node Information Query - Dispatching
   2991 
   2992 = ICMPv6NIQueryIPv6 - dispatch with nothing in data
   2993 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv6())
   2994 p = IPv6(s)
   2995 isinstance(p.payload, ICMPv6NIQueryIPv6)
   2996 
   2997 = ICMPv6NIQueryIPv6 - dispatch with IPv6 address in data
   2998 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv6(data="2001::db8::1"))
   2999 p = IPv6(s)
   3000 isinstance(p.payload, ICMPv6NIQueryIPv6)
   3001 
   3002 = ICMPv6NIQueryIPv6 - dispatch with IPv4 address in data
   3003 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv6(data="192.168.0.1"))
   3004 p = IPv6(s)
   3005 isinstance(p.payload, ICMPv6NIQueryIPv6)
   3006 
   3007 = ICMPv6NIQueryIPv6 - dispatch with name in data
   3008 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv6(data="alfred"))
   3009 p = IPv6(s)
   3010 isinstance(p.payload, ICMPv6NIQueryIPv6)
   3011 
   3012 = ICMPv6NIQueryName - dispatch with nothing in data
   3013 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryName())
   3014 p = IPv6(s)
   3015 isinstance(p.payload, ICMPv6NIQueryName)
   3016 
   3017 = ICMPv6NIQueryName - dispatch with IPv6 address in data
   3018 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryName(data="2001:db8::1"))
   3019 p = IPv6(s)
   3020 isinstance(p.payload, ICMPv6NIQueryName)
   3021 
   3022 = ICMPv6NIQueryName - dispatch with IPv4 address in data
   3023 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryName(data="192.168.0.1"))
   3024 p = IPv6(s)
   3025 isinstance(p.payload, ICMPv6NIQueryName)
   3026 
   3027 = ICMPv6NIQueryName - dispatch with name in data
   3028 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryName(data="alfred"))
   3029 p = IPv6(s)
   3030 isinstance(p.payload, ICMPv6NIQueryName)
   3031 
   3032 = ICMPv6NIQueryIPv4 - dispatch with nothing in data
   3033 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv4())
   3034 p = IPv6(s)
   3035 isinstance(p.payload, ICMPv6NIQueryIPv4)
   3036 
   3037 = ICMPv6NIQueryIPv4 - dispatch with IPv6 address in data
   3038 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv4(data="2001:db8::1"))
   3039 p = IPv6(s)
   3040 isinstance(p.payload, ICMPv6NIQueryIPv4)
   3041 
   3042 = ICMPv6NIQueryIPv4 - dispatch with IPv6 address in data
   3043 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv4(data="192.168.0.1"))
   3044 p = IPv6(s)
   3045 isinstance(p.payload, ICMPv6NIQueryIPv4)
   3046 
   3047 = ICMPv6NIQueryIPv4 - dispatch with name in data
   3048 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv4(data="alfred"))
   3049 p = IPv6(s)
   3050 isinstance(p.payload, ICMPv6NIQueryIPv4)
   3051 
   3052 = ICMPv6NIReplyName - dispatch
   3053 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyName())
   3054 p = IPv6(s)
   3055 isinstance(p.payload, ICMPv6NIReplyName)
   3056 
   3057 = ICMPv6NIReplyIPv6 - dispatch
   3058 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyIPv6())
   3059 p = IPv6(s)
   3060 isinstance(p.payload, ICMPv6NIReplyIPv6)
   3061 
   3062 = ICMPv6NIReplyIPv4 - dispatch
   3063 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyIPv4())
   3064 p = IPv6(s)
   3065 isinstance(p.payload, ICMPv6NIReplyIPv4)
   3066 
   3067 = ICMPv6NIReplyRefuse - dispatch
   3068 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyRefuse())
   3069 p = IPv6(s)
   3070 isinstance(p.payload, ICMPv6NIReplyRefuse)
   3071 
   3072 = ICMPv6NIReplyUnknown - dispatch
   3073 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyUnknown())
   3074 p = IPv6(s)
   3075 isinstance(p.payload, ICMPv6NIReplyUnknown)
   3076 
   3077 
   3078 ############
   3079 ############
   3080 + Test Node Information Query - ICMPv6NIReplyNOOP
   3081 
   3082 = ICMPv6NIReplyNOOP - single DNS name without hint => understood as string (internal)
   3083 a=ICMPv6NIReplyNOOP(data="abricot").getfieldval("data")
   3084 type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == b"abricot"
   3085 
   3086 = ICMPv6NIReplyNOOP - single DNS name without hint => understood as string
   3087 ICMPv6NIReplyNOOP(data="abricot").data == b"abricot"
   3088 
   3089 = ICMPv6NIReplyNOOP - fqdn without hint => understood as string (internal)
   3090 a=ICMPv6NIReplyNOOP(data="n.d.tld").getfieldval("data")
   3091 type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == b"n.d.tld"
   3092 
   3093 = ICMPv6NIReplyNOOP - fqdn without hint => understood as string 
   3094 ICMPv6NIReplyNOOP(data="n.d.tld").data == b"n.d.tld"
   3095 
   3096 = ICMPv6NIReplyNOOP - IPv6 address without hint => understood as string (internal)
   3097 a=ICMPv6NIReplyNOOP(data="2001:0db8::1").getfieldval("data")
   3098 type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == b"2001:0db8::1"
   3099 
   3100 = ICMPv6NIReplyNOOP - IPv6 address without hint => understood as string
   3101 ICMPv6NIReplyNOOP(data="2001:0db8::1").data == b"2001:0db8::1"
   3102 
   3103 = ICMPv6NIReplyNOOP - IPv4 address without hint => understood as string (internal)
   3104 a=ICMPv6NIReplyNOOP(data="169.254.253.010").getfieldval("data")
   3105 type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == b"169.254.253.010"
   3106 
   3107 = ICMPv6NIReplyNOOP - IPv4 address without hint => understood as string
   3108 ICMPv6NIReplyNOOP(data="169.254.253.010").data == b"169.254.253.010"
   3109 
   3110 
   3111 ############
   3112 ############
   3113 + Test Node Information Query - ICMPv6NIReplyName
   3114 
   3115 = ICMPv6NIReplyName - single label DNS name as a rawing (without ttl) (internal)
   3116 a=ICMPv6NIReplyName(data="abricot").getfieldval("data")
   3117 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] == b'\x07abricot\x00\x00'
   3118 
   3119 = ICMPv6NIReplyName - single label DNS name as a rawing (without ttl)
   3120 ICMPv6NIReplyName(data="abricot").data == [0, b"abricot"]
   3121 
   3122 = ICMPv6NIReplyName - fqdn name as a rawing (without ttl) (internal)
   3123 a=ICMPv6NIReplyName(data="n.d.tld").getfieldval("data")
   3124 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] == b'\x01n\x01d\x03tld\x00'
   3125 
   3126 = ICMPv6NIReplyName - fqdn name as a rawing (without ttl)
   3127 ICMPv6NIReplyName(data="n.d.tld").data == [0, b'n.d.tld']
   3128 
   3129 = ICMPv6NIReplyName - list of 2 single label DNS names (without ttl) (internal)
   3130 a=ICMPv6NIReplyName(data=["abricot", "poire"]).getfieldval("data")
   3131 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] == b'\x07abricot\x00\x00\x05poire\x00\x00'
   3132 
   3133 = ICMPv6NIReplyName - list of 2 single label DNS names (without ttl)
   3134 ICMPv6NIReplyName(data=["abricot", "poire"]).data == [0, b"abricot", b"poire"]
   3135 
   3136 = ICMPv6NIReplyName - [ttl, single-label, single-label, fqdn] (internal)
   3137 a=ICMPv6NIReplyName(data=[42, "abricot", "poire", "n.d.tld"]).getfieldval("data")
   3138 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] == b'\x07abricot\x00\x00\x05poire\x00\x00\x01n\x01d\x03tld\x00'
   3139 
   3140 = ICMPv6NIReplyName - [ttl, single-label, single-label, fqdn]
   3141 ICMPv6NIReplyName(data=[42, "abricot", "poire", "n.d.tld"]).data == [42, b"abricot", b"poire", b"n.d.tld"]
   3142 
   3143 
   3144 ############
   3145 ############
   3146 + Test Node Information Query - ICMPv6NIReplyIPv6
   3147 
   3148 = ICMPv6NIReplyIPv6 - one IPv6 address without TTL (internal)
   3149 a=ICMPv6NIReplyIPv6(data="2001:db8::1").getfieldval("data")
   3150 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" 
   3151 
   3152 = ICMPv6NIReplyIPv6 - one IPv6 address without TTL
   3153 ICMPv6NIReplyIPv6(data="2001:db8::1").data == [(0, '2001:db8::1')]
   3154 
   3155 = ICMPv6NIReplyIPv6 - one IPv6 address without TTL (as a list)  (internal)
   3156 a=ICMPv6NIReplyIPv6(data=["2001:db8::1"]).getfieldval("data")
   3157 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" 
   3158 
   3159 = ICMPv6NIReplyIPv6 - one IPv6 address without TTL (as a list) 
   3160 ICMPv6NIReplyIPv6(data=["2001:db8::1"]).data == [(0, '2001:db8::1')]
   3161 
   3162 = ICMPv6NIReplyIPv6 - one IPv6 address with TTL  (internal)
   3163 a=ICMPv6NIReplyIPv6(data=[(0, "2001:db8::1")]).getfieldval("data")
   3164 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" 
   3165 
   3166 = ICMPv6NIReplyIPv6 - one IPv6 address with TTL
   3167 ICMPv6NIReplyIPv6(data=[(0, "2001:db8::1")]).data == [(0, '2001:db8::1')]
   3168 
   3169 = ICMPv6NIReplyIPv6 - two IPv6 addresses as a list of rawings (without TTL) (internal)
   3170 a=ICMPv6NIReplyIPv6(data=["2001:db8::1", "2001:db8::2"]).getfieldval("data")
   3171 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" 
   3172 
   3173 = ICMPv6NIReplyIPv6 - two IPv6 addresses as a list of rawings (without TTL)
   3174 ICMPv6NIReplyIPv6(data=["2001:db8::1", "2001:db8::2"]).data == [(0, '2001:db8::1'), (0, '2001:db8::2')]
   3175 
   3176 = ICMPv6NIReplyIPv6 - two IPv6 addresses as a list (first with ttl, second without) (internal)
   3177 a=ICMPv6NIReplyIPv6(data=[(42, "2001:db8::1"), "2001:db8::2"]).getfieldval("data")
   3178 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" 
   3179 
   3180 = ICMPv6NIReplyIPv6 - two IPv6 addresses as a list (first with ttl, second without)
   3181 ICMPv6NIReplyIPv6(data=[(42, "2001:db8::1"), "2001:db8::2"]).data == [(42, "2001:db8::1"), (0, "2001:db8::2")]
   3182 
   3183 = ICMPv6NIReplyIPv6 - build & dissection
   3184 
   3185 s = raw(IPv6()/ICMPv6NIReplyIPv6(data="2001:db8::1"))
   3186 p = IPv6(s)
   3187 ICMPv6NIReplyIPv6 in p and p.data == [(0, '2001:db8::1')]
   3188 
   3189 ############
   3190 ############
   3191 + Test Node Information Query - ICMPv6NIReplyIPv4
   3192 
   3193 = ICMPv6NIReplyIPv4 - one IPv4 address without TTL (internal)
   3194 a=ICMPv6NIReplyIPv4(data="169.254.253.252").getfieldval("data")
   3195 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" 
   3196 
   3197 = ICMPv6NIReplyIPv4 - one IPv4 address without TTL
   3198 ICMPv6NIReplyIPv4(data="169.254.253.252").data == [(0, '169.254.253.252')]
   3199 
   3200 = ICMPv6NIReplyIPv4 - one IPv4 address without TTL (as a list) (internal)
   3201 a=ICMPv6NIReplyIPv4(data=["169.254.253.252"]).getfieldval("data")
   3202 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" 
   3203 
   3204 = ICMPv6NIReplyIPv4 - one IPv4 address without TTL (as a list)
   3205 ICMPv6NIReplyIPv4(data=["169.254.253.252"]).data == [(0, '169.254.253.252')]
   3206 
   3207 = ICMPv6NIReplyIPv4 - one IPv4 address with TTL (internal)
   3208 a=ICMPv6NIReplyIPv4(data=[(0, "169.254.253.252")]).getfieldval("data")
   3209 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" 
   3210 
   3211 = ICMPv6NIReplyIPv4 - one IPv4 address with TTL (internal)
   3212 ICMPv6NIReplyIPv4(data=[(0, "169.254.253.252")]).data == [(0, '169.254.253.252')]
   3213 
   3214 = ICMPv6NIReplyIPv4 - two IPv4 addresses as a list of rawings (without TTL)
   3215 a=ICMPv6NIReplyIPv4(data=["169.254.253.252", "169.254.253.253"]).getfieldval("data")
   3216 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" 
   3217 
   3218 = ICMPv6NIReplyIPv4 - two IPv4 addresses as a list of rawings (without TTL) (internal)
   3219 ICMPv6NIReplyIPv4(data=["169.254.253.252", "169.254.253.253"]).data == [(0, '169.254.253.252'), (0, '169.254.253.253')]
   3220 
   3221 = ICMPv6NIReplyIPv4 - two IPv4 addresses as a list (first with ttl, second without)
   3222 a=ICMPv6NIReplyIPv4(data=[(42, "169.254.253.252"), "169.254.253.253"]).getfieldval("data")
   3223 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" 
   3224 
   3225 = ICMPv6NIReplyIPv4 - two IPv4 addresses as a list (first with ttl, second without) (internal)
   3226 ICMPv6NIReplyIPv4(data=[(42, "169.254.253.252"), "169.254.253.253"]).data == [(42, "169.254.253.252"), (0, "169.254.253.253")]
   3227 
   3228 = ICMPv6NIReplyIPv4 - build & dissection
   3229 
   3230 s = raw(IPv6()/ICMPv6NIReplyIPv4(data="192.168.0.1"))
   3231 p = IPv6(s)
   3232 ICMPv6NIReplyIPv4 in p and p.data == [(0, '192.168.0.1')]
   3233 
   3234 s = raw(IPv6()/ICMPv6NIReplyIPv4(data=[(2807, "192.168.0.1")]))
   3235 p = IPv6(s)
   3236 ICMPv6NIReplyIPv4 in p and p.data == [(2807, "192.168.0.1")]
   3237 
   3238 
   3239 ############
   3240 ############
   3241 + Test Node Information Query - ICMPv6NIReplyRefuse
   3242 = ICMPv6NIReplyRefuse - basic instantiation
   3243 raw(ICMPv6NIReplyRefuse())[:8] == b'\x8c\x01\x00\x00\x00\x00\x00\x00'
   3244 
   3245 = ICMPv6NIReplyRefuse - basic dissection
   3246 a=ICMPv6NIReplyRefuse(b'\x8c\x01\x00\x00\x00\x00\x00\x00\xf1\xe9\xab\xc9\x8c\x0by\x18')
   3247 a.type == 140 and a.code == 1 and a.cksum == 0 and a.unused == 0 and a.flags == 0 and a.nonce == b'\xf1\xe9\xab\xc9\x8c\x0by\x18' and a.data ==  None
   3248 
   3249 
   3250 ############
   3251 ############
   3252 + Test Node Information Query - ICMPv6NIReplyUnknown
   3253 
   3254 = ICMPv6NIReplyUnknown - basic instantiation
   3255 raw(ICMPv6NIReplyUnknown(nonce=b'\x00'*8)) == b'\x8c\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   3256 
   3257 = ICMPv6NIReplyRefuse - basic dissection
   3258 a=ICMPv6NIReplyRefuse(b'\x8c\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
   3259 a.type == 140 and a.code == 2 and a.cksum == 0 and a.unused == 0 and a.flags == 0 and a.nonce == b'\x00'*8 and a.data ==  None
   3260 
   3261 
   3262 ############
   3263 ############
   3264 + Test Node Information Query - utilities
   3265 
   3266 = computeNIGroupAddr
   3267 computeNIGroupAddr("scapy") == "ff02::2:f886:2f66"
   3268 
   3269 
   3270 ############
   3271 ############
   3272 + IPv6ExtHdrFragment Class Test
   3273 
   3274 = IPv6ExtHdrFragment - Basic Instantiation
   3275 raw(IPv6ExtHdrFragment()) == b';\x00\x00\x00\x00\x00\x00\x00'
   3276 
   3277 = IPv6ExtHdrFragment - Instantiation with specific values
   3278 raw(IPv6ExtHdrFragment(nh=0xff, res1=0xee, offset=0x1fff, res2=1, m=1, id=0x11111111)) == b'\xff\xee\xff\xfb\x11\x11\x11\x11'
   3279 
   3280 = IPv6ExtHdrFragment - Basic Dissection 
   3281 a=IPv6ExtHdrFragment(b';\x00\x00\x00\x00\x00\x00\x00')
   3282 a.nh == 59 and a.res1 == 0 and a.offset == 0 and a.res2 == 0 and a.m == 0 and a.id == 0
   3283 
   3284 = IPv6ExtHdrFragment - Instantiation with specific values
   3285 a=IPv6ExtHdrFragment(b'\xff\xee\xff\xfb\x11\x11\x11\x11')
   3286 a.nh == 0xff and a.res1 == 0xee and a.offset==0x1fff and a.res2==1 and a.m == 1 and a.id == 0x11111111
   3287 
   3288 
   3289 ############
   3290 ############
   3291 + Test fragment6 function
   3292 
   3293 = fragment6 - test against a long TCP packet with a 1280 MTU
   3294 l=fragment6(IPv6()/IPv6ExtHdrFragment()/TCP()/Raw(load="A"*40000), 1280) 
   3295 len(l) == 33 and len(raw(l[-1])) == 644
   3296 
   3297 
   3298 ############
   3299 ############
   3300 + Test defragment6 function
   3301 
   3302 = defragment6 - test against a long TCP packet fragmented with a 1280 MTU
   3303 l=fragment6(IPv6()/IPv6ExtHdrFragment()/TCP()/Raw(load="A"*40000), 1280) 
   3304 raw(defragment6(l)) == (b'`\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' + b'A'*40000)
   3305 
   3306 
   3307 = defragment6 - test against a large TCP packet fragmented with a 1280 bytes MTU and missing fragments
   3308 l=fragment6(IPv6()/IPv6ExtHdrFragment()/TCP()/Raw(load="A"*40000), 1280) 
   3309 del(l[2])
   3310 del(l[4])
   3311 del(l[12])
   3312 del(l[18])
   3313 raw(defragment6(l)) == (b'`\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*b'A' + 1232*b'X' + 2464*b'A' + 1232*b'X' + 9856*b'A' + 1232*b'X' + 7392*b'A' + 1232*b'X' + 12916*b'A')
   3314 
   3315 
   3316 = defragment6 - test against a TCP packet fragmented with a 800 bytes MTU and missing fragments
   3317 l=fragment6(IPv6()/IPv6ExtHdrFragment()/TCP()/Raw(load="A"*4000), 800) 
   3318 del(l[4])
   3319 del(l[2])
   3320 raw(defragment6(l)) == b'`\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'
   3321 
   3322 
   3323 ############
   3324 ############
   3325 + Test Route6 class
   3326 
   3327 = Route6 - Route6 flushing
   3328 conf.route6.routes=[
   3329 (                               '::1', 128,                       '::',   'lo', ['::1'], 1), 
   3330 (          'fe80::20f:1fff:feca:4650', 128,                       '::',   'lo', ['::1'], 1)]
   3331 conf.route6.flush()
   3332 not conf.route6.routes
   3333 
   3334 = Route6 - Route6.route
   3335 conf.route6.flush()
   3336 conf.route6.routes=[
   3337 (                               '::1', 128,                       '::',   'lo', ['::1'], 1), 
   3338 (          'fe80::20f:1fff:feca:4650', 128,                       '::',   'lo', ['::1'], 1), 
   3339 (                            'fe80::',  64,                       '::', 'eth0', ['fe80::20f:1fff:feca:4650'], 1),
   3340 ('2001:db8:0:4444:20f:1fff:feca:4650', 128,                       '::',   'lo', ['::1'], 1), 
   3341 (                 '2001:db8:0:4444::',  64,                       '::', 'eth0', ['2001:db8:0:4444:20f:1fff:feca:4650'], 1), 
   3342 (                                '::',   0, 'fe80::20f:34ff:fe8a:8aa1', 'eth0', ['2001:db8:0:4444:20f:1fff:feca:4650', '2002:db8:0:4444:20f:1fff:feca:4650'], 1)
   3343 ]
   3344 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') and conf.route6.route('ff00::') == ('eth0', '2001:db8:0:4444:20f:1fff:feca:4650', 'fe80::20f:34ff:fe8a:8aa1')
   3345 conf.route6.resync()
   3346 if not len(conf.route6.routes):
   3347     # IPv6 seems disabled. Force a route to ::1
   3348     conf.route6.routes.append(("::1", 128, "::", LOOPBACK_NAME, ["::1"], 1))
   3349     True
   3350 
   3351 = Route6 - Route6.make_route
   3352 
   3353 r6 = Route6()
   3354 r6.make_route("2001:db8::1", dev=LOOPBACK_NAME) == ("2001:db8::1", 128, "::", LOOPBACK_NAME, [], 1)
   3355 len_r6 = len(r6.routes)
   3356 
   3357 = Route6 - Route6.add & Route6.delt
   3358 
   3359 r6.add(dst="2001:db8:cafe:f000::/64", gw="2001:db8:cafe::1", dev="eth0")
   3360 assert(len(r6.routes) == len_r6 + 1)
   3361 r6.delt(dst="2001:db8:cafe:f000::/64", gw="2001:db8:cafe::1")
   3362 assert(len(r6.routes) == len_r6)
   3363 
   3364 = Route6 - Route6.ifadd & Route6.ifdel
   3365 r6.ifadd("scapy0", "2001:bd8:cafe:1::1/64")
   3366 r6.ifdel("scapy0")
   3367 
   3368 = IPv6 - utils
   3369 
   3370 @mock.patch("scapy.layers.inet6.get_if_hwaddr")
   3371 @mock.patch("scapy.layers.inet6.srp1")
   3372 def test_neighsol(mock_srp1, mock_get_if_hwaddr):
   3373     mock_srp1.return_value = Ether()/IPv6()/ICMPv6ND_NA()/ICMPv6NDOptDstLLAddr(lladdr="05:04:03:02:01:00")
   3374     mock_get_if_hwaddr.return_value = "00:01:02:03:04:05"
   3375     return neighsol("fe80::f6ce:46ff:fea9:e04b", "fe80::f6ce:46ff:fea9:e04b", "scapy0")
   3376 
   3377 p = test_neighsol()
   3378 ICMPv6NDOptDstLLAddr in p and p[ICMPv6NDOptDstLLAddr].lladdr == "05:04:03:02:01:00"
   3379 
   3380 
   3381 @mock.patch("scapy.layers.inet6.neighsol")
   3382 @mock.patch("scapy.layers.inet6.conf.route6.route")
   3383 def test_getmacbyip6(mock_route6, mock_neighsol):
   3384     mock_route6.return_value = ("scapy0", "fe80::baca:3aff:fe72:b08b", "::")
   3385     mock_neighsol.return_value = test_neighsol()
   3386     return getmacbyip6("fe80::704:3ff:fe2:100")
   3387 
   3388 test_getmacbyip6() == "05:04:03:02:01:00"
   3389 
   3390 = IPv6 - IPerror6 & UDPerror & _ICMPv6Error
   3391 
   3392 query = IPv6(dst="2001:db8::1", src="2001:db8::2", hlim=1)/UDP()/DNS()
   3393 answer = IPv6(dst="2001:db8::2", src="2001:db8::1", hlim=1)/ICMPv6TimeExceeded()/IPerror6(dst="2001:db8::1", src="2001:db8::2", hlim=0)/UDPerror()/DNS()
   3394 answer.answers(query) == True
   3395 
   3396 # Test _ICMPv6Error
   3397 from scapy.layers.inet6 import _ICMPv6Error
   3398 assert _ICMPv6Error().guess_payload_class(None) == IPerror6
   3399 
   3400 ############
   3401 ############
   3402 + ICMPv6ML
   3403 
   3404 = ICMPv6MLQuery - build & dissection
   3405 s = raw(IPv6()/ICMPv6MLQuery())
   3406 s == b"`\x00\x00\x00\x00\x18:\x01\xfe\x80\x00\x00\x00\x00\x00\x00\xba\xca:\xff\xfer\xb0\x8b\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x82\x00\xb4O'\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
   3407 
   3408 p = IPv6(s)
   3409 ICMPv6MLQuery in p and p[IPv6].dst == "ff02::1"
   3410 
   3411 ############
   3412 ############
   3413 + Ether tests with IPv6
   3414 
   3415 = Ether IPv6 checking for dst
   3416 ~ netaccess ipv6
   3417 
   3418 p = Ether()/IPv6(dst="www.google.com")/TCP()
   3419 assert p.dst != p[IPv6].dst
   3420 p.show()
   3421 
   3422 ############
   3423 ############
   3424 + TracerouteResult6
   3425 
   3426 = get_trace()
   3427 ip6_hlim = [("2001:db8::%d" % i, i) for i in six.moves.range(1, 12)]
   3428 
   3429 tr6_packets = [ (IPv6(dst="2001:db8::1", src="2001:db8::254", hlim=hlim)/UDP()/"scapy",
   3430                  IPv6(dst="2001:db8::254", src=ip)/ICMPv6TimeExceeded()/IPerror6(dst="2001:db8::1", src="2001:db8::254", hlim=0)/UDPerror()/"scapy")
   3431                    for (ip, hlim) in ip6_hlim ]
   3432 
   3433 tr6 = TracerouteResult6(tr6_packets)
   3434 tr6.get_trace() == {'2001:db8::1': {1: ('2001:db8::1', False), 2: ('2001:db8::2', False), 3: ('2001:db8::3', False), 4: ('2001:db8::4', False), 5: ('2001:db8::5', False), 6: ('2001:db8::6', False), 7: ('2001:db8::7', False), 8: ('2001:db8::8', False), 9: ('2001:db8::9', False), 10: ('2001:db8::10', False), 11: ('2001:db8::11', False)}}
   3435 
   3436 = show()
   3437 def test_show():
   3438     with ContextManagerCaptureOutput() as cmco:
   3439         tr6 = TracerouteResult6(tr6_packets)
   3440         tr6.show()
   3441         result = cmco.get_output()
   3442     expected = "  2001:db8::1                               :udpdomain \n"
   3443     expected += "1  2001:db8::1                                3         \n"
   3444     expected += "2  2001:db8::2                                3         \n"
   3445     expected += "3  2001:db8::3                                3         \n"
   3446     expected += "4  2001:db8::4                                3         \n"
   3447     expected += "5  2001:db8::5                                3         \n"
   3448     expected += "6  2001:db8::6                                3         \n"
   3449     expected += "7  2001:db8::7                                3         \n"
   3450     expected += "8  2001:db8::8                                3         \n"
   3451     expected += "9  2001:db8::9                                3         \n"
   3452     expected += "10 2001:db8::10                               3         \n"
   3453     expected += "11 2001:db8::11                               3         \n"
   3454     index_result = result.index("\n1")
   3455     index_expected = expected.index("\n1")
   3456     assert(result[index_result:] == expected[index_expected:])
   3457 
   3458 test_show()
   3459 
   3460 = graph()
   3461 saved_AS_resolver = conf.AS_resolver
   3462 conf.AS_resolver = None
   3463 tr6.make_graph()
   3464 len(tr6.graphdef) == 492
   3465 tr6.graphdef.startswith("digraph trace {") == True
   3466 '"2001:db8::1 53/udp";' in tr6.graphdef
   3467 conf.AS_resolver = conf.AS_resolver
   3468 
   3469 
   3470 # Below is our Homework : here is the mountain ...
   3471 #
   3472 
   3473 ########### ICMPv6MLReport Class ####################################
   3474 ########### ICMPv6MLDone Class ######################################
   3475 ########### ICMPv6ND_Redirect Class #################################
   3476 ########### ICMPv6NDOptSrcAddrList Class ############################
   3477 ########### ICMPv6NDOptTgtAddrList Class ############################
   3478 ########### ICMPv6ND_INDSol Class ###################################
   3479 ########### ICMPv6ND_INDAdv Class ###################################
   3480 
   3481 
   3482 
   3483 
   3484 
   3485 #####################################################################
   3486 #####################################################################
   3487 ##########################     DHCPv6      ##########################
   3488 #####################################################################
   3489 #####################################################################
   3490 
   3491 
   3492 ############
   3493 ############
   3494 + Test DHCP6 DUID_LLT
   3495 
   3496 = DUID_LLT basic instantiation
   3497 a=DUID_LLT() 
   3498 
   3499 = DUID_LLT basic build
   3500 raw(DUID_LLT()) == b'\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   3501 
   3502 = DUID_LLT build with specific values
   3503 raw(DUID_LLT(lladdr="ff:ff:ff:ff:ff:ff", timeval=0x11111111, hwtype=0x2222)) == b'\x00\x01""\x11\x11\x11\x11\xff\xff\xff\xff\xff\xff'
   3504 
   3505 = DUID_LLT basic dissection 
   3506 a=DUID_LLT(raw(DUID_LLT()))
   3507 a.type == 1 and a.hwtype == 1 and a.timeval == 0 and a.lladdr == "00:00:00:00:00:00"
   3508 
   3509 = DUID_LLT dissection with specific values
   3510 a=DUID_LLT(b'\x00\x01""\x11\x11\x11\x11\xff\xff\xff\xff\xff\xff') 
   3511 a.type == 1 and a.hwtype == 0x2222 and a.timeval == 0x11111111 and a.lladdr == "ff:ff:ff:ff:ff:ff"
   3512 
   3513 
   3514 ############
   3515 ############
   3516 + Test DHCP6 DUID_EN
   3517 
   3518 = DUID_EN basic instantiation
   3519 a=DUID_EN() 
   3520 
   3521 = DUID_EN basic build
   3522 raw(DUID_EN()) == b'\x00\x02\x00\x00\x017'
   3523 
   3524 = DUID_EN build with specific values
   3525 raw(DUID_EN(enterprisenum=0x11111111, id="iamastring")) == b'\x00\x02\x11\x11\x11\x11iamastring'
   3526 
   3527 = DUID_EN basic dissection 
   3528 a=DUID_EN(b'\x00\x02\x00\x00\x017')
   3529 a.type == 2 and a.enterprisenum == 311 
   3530 
   3531 = DUID_EN dissection with specific values 
   3532 a=DUID_EN(b'\x00\x02\x11\x11\x11\x11iamarawing')
   3533 a.type == 2 and a.enterprisenum == 0x11111111 and a.id == b"iamarawing"
   3534 
   3535 
   3536 ############
   3537 ############
   3538 + Test DHCP6 DUID_LL
   3539 
   3540 = DUID_LL basic instantiation
   3541 a=DUID_LL() 
   3542 
   3543 = DUID_LL basic build
   3544 raw(DUID_LL()) == b'\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00'
   3545 
   3546 = DUID_LL build with specific values
   3547 raw(DUID_LL(hwtype=1, lladdr="ff:ff:ff:ff:ff:ff")) == b'\x00\x03\x00\x01\xff\xff\xff\xff\xff\xff'
   3548 
   3549 = DUID_LL basic dissection
   3550 a=DUID_LL(raw(DUID_LL()))
   3551 a.type == 3 and a.hwtype == 1 and a.lladdr == "00:00:00:00:00:00"
   3552 
   3553 = DUID_LL with specific values 
   3554 a=DUID_LL(b'\x00\x03\x00\x01\xff\xff\xff\xff\xff\xff')
   3555 a.hwtype == 1 and a.lladdr == "ff:ff:ff:ff:ff:ff"
   3556 
   3557 
   3558 ############
   3559 ############
   3560 + Test DHCP6 Opt Unknown
   3561 
   3562 = DHCP6 Opt Unknown basic instantiation 
   3563 a=DHCP6OptUnknown()
   3564 
   3565 = DHCP6 Opt Unknown basic build (default values)
   3566 raw(DHCP6OptUnknown()) == b'\x00\x00\x00\x00'
   3567 
   3568 = DHCP6 Opt Unknown - len computation test
   3569 raw(DHCP6OptUnknown(data="shouldbe9")) == b'\x00\x00\x00\tshouldbe9'
   3570 
   3571 
   3572 ############
   3573 ############
   3574 + Test DHCP6 Client Identifier option
   3575 
   3576 = DHCP6OptClientId basic instantiation
   3577 a=DHCP6OptClientId()
   3578 
   3579 = DHCP6OptClientId basic build
   3580 raw(DHCP6OptClientId()) == b'\x00\x01\x00\x00'
   3581 
   3582 = DHCP6OptClientId instantiation with specific values 
   3583 raw(DHCP6OptClientId(duid="toto")) == b'\x00\x01\x00\x04toto'
   3584 
   3585 = DHCP6OptClientId instantiation with DUID_LL
   3586 raw(DHCP6OptClientId(duid=DUID_LL())) == b'\x00\x01\x00\n\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00'
   3587 
   3588 = DHCP6OptClientId instantiation with DUID_LLT
   3589 raw(DHCP6OptClientId(duid=DUID_LLT())) == b'\x00\x01\x00\x0e\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   3590 
   3591 = DHCP6OptClientId instantiation with DUID_EN
   3592 raw(DHCP6OptClientId(duid=DUID_EN())) == b'\x00\x01\x00\x06\x00\x02\x00\x00\x017'
   3593 
   3594 = DHCP6OptClientId instantiation with specified length
   3595 raw(DHCP6OptClientId(optlen=80, duid="somestring")) == b'\x00\x01\x00Psomestring'
   3596 
   3597 = DHCP6OptClientId basic dissection
   3598 a=DHCP6OptClientId(b'\x00\x01\x00\x00') 
   3599 a.optcode == 1 and a.optlen == 0
   3600 
   3601 = DHCP6OptClientId instantiation with specified length
   3602 raw(DHCP6OptClientId(optlen=80, duid="somestring")) == b'\x00\x01\x00Psomestring'
   3603 
   3604 = DHCP6OptClientId basic dissection
   3605 a=DHCP6OptClientId(b'\x00\x01\x00\x00') 
   3606 a.optcode == 1 and a.optlen == 0
   3607 
   3608 = DHCP6OptClientId dissection with specific duid value
   3609 a=DHCP6OptClientId(b'\x00\x01\x00\x04somerawing')
   3610 a.optcode == 1 and a.optlen == 4 and isinstance(a.duid, Raw) and a.duid.load == b'some' and isinstance(a.payload, DHCP6OptUnknown)
   3611 
   3612 = DHCP6OptClientId dissection with specific DUID_LL as duid value
   3613 a=DHCP6OptClientId(b'\x00\x01\x00\n\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00')
   3614 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"
   3615 
   3616 = DHCP6OptClientId dissection with specific DUID_LLT as duid value
   3617 a=DHCP6OptClientId(b'\x00\x01\x00\x0e\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
   3618 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"
   3619 
   3620 = DHCP6OptClientId dissection with specific DUID_EN as duid value
   3621 a=DHCP6OptClientId(b'\x00\x01\x00\x06\x00\x02\x00\x00\x017')
   3622 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 == b""
   3623 
   3624 
   3625 ############
   3626 ############
   3627 + Test DHCP6 Server Identifier option
   3628 
   3629 = DHCP6OptServerId basic instantiation
   3630 a=DHCP6OptServerId()
   3631 
   3632 = DHCP6OptServerId basic build 
   3633 raw(DHCP6OptServerId()) == b'\x00\x02\x00\x00'
   3634 
   3635 = DHCP6OptServerId basic build with specific values
   3636 raw(DHCP6OptServerId(duid="toto")) == b'\x00\x02\x00\x04toto'
   3637 
   3638 = DHCP6OptServerId instantiation with DUID_LL
   3639 raw(DHCP6OptServerId(duid=DUID_LL())) == b'\x00\x02\x00\n\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00'
   3640 
   3641 = DHCP6OptServerId instantiation with DUID_LLT
   3642 raw(DHCP6OptServerId(duid=DUID_LLT())) == b'\x00\x02\x00\x0e\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   3643 
   3644 = DHCP6OptServerId instantiation with DUID_EN
   3645 raw(DHCP6OptServerId(duid=DUID_EN())) == b'\x00\x02\x00\x06\x00\x02\x00\x00\x017'
   3646 
   3647 = DHCP6OptServerId instantiation with specified length
   3648 raw(DHCP6OptServerId(optlen=80, duid="somestring")) == b'\x00\x02\x00Psomestring'
   3649 
   3650 = DHCP6OptServerId basic dissection
   3651 a=DHCP6OptServerId(b'\x00\x02\x00\x00') 
   3652 a.optcode == 2 and a.optlen == 0
   3653 
   3654 = DHCP6OptServerId dissection with specific duid value
   3655 a=DHCP6OptServerId(b'\x00\x02\x00\x04somerawing')
   3656 a.optcode == 2 and a.optlen == 4 and isinstance(a.duid, Raw) and a.duid.load == b'some' and isinstance(a.payload, DHCP6OptUnknown)
   3657 
   3658 = DHCP6OptServerId dissection with specific DUID_LL as duid value
   3659 a=DHCP6OptServerId(b'\x00\x02\x00\n\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00')
   3660 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"
   3661 
   3662 = DHCP6OptServerId dissection with specific DUID_LLT as duid value
   3663 a=DHCP6OptServerId(b'\x00\x02\x00\x0e\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
   3664 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"
   3665 
   3666 = DHCP6OptServerId dissection with specific DUID_EN as duid value
   3667 a=DHCP6OptServerId(b'\x00\x02\x00\x06\x00\x02\x00\x00\x017')
   3668 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 == b""
   3669 
   3670 
   3671 ############
   3672 ############
   3673 + Test DHCP6 IA Address Option (IA_TA or IA_NA suboption)
   3674 
   3675 = DHCP6OptIAAddress - Basic Instantiation
   3676 raw(DHCP6OptIAAddress()) == b'\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'
   3677 
   3678 = DHCP6OptIAAddress - Basic Dissection
   3679 a = DHCP6OptIAAddress(b'\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')
   3680 a.optcode == 5 and a.optlen == 24 and a.addr == "::" and a.preflft == 0 and a. validlft == 0 and a.iaaddropts == b""
   3681 
   3682 = DHCP6OptIAAddress - Instantiation with specific values
   3683 raw(DHCP6OptIAAddress(optlen=0x1111, addr="2222:3333::5555", preflft=0x66666666, validlft=0x77777777, iaaddropts="somestring")) == b'\x00\x05\x11\x11""33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00UUffffwwwwsomestring'
   3684 
   3685 = DHCP6OptIAAddress - Instantiation with specific values (default optlen computation)
   3686 raw(DHCP6OptIAAddress(addr="2222:3333::5555", preflft=0x66666666, validlft=0x77777777, iaaddropts="somestring")) == b'\x00\x05\x00"""33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00UUffffwwwwsomestring'
   3687 
   3688 = DHCP6OptIAAddress - Dissection with specific values 
   3689 a = DHCP6OptIAAddress(b'\x00\x05\x00"""33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00UUffffwwwwsomerawing')
   3690 a.optcode == 5 and a.optlen == 34 and a.addr == "2222:3333::5555" and a.preflft == 0x66666666 and a. validlft == 0x77777777 and a.iaaddropts == b"somerawing"
   3691 
   3692 
   3693 ############
   3694 ############
   3695 + Test DHCP6 Identity Association for Non-temporary Addresses Option
   3696 
   3697 = DHCP6OptIA_NA - Basic Instantiation
   3698 raw(DHCP6OptIA_NA()) == b'\x00\x03\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   3699 
   3700 = DHCP6OptIA_NA - Basic Dissection
   3701 a = DHCP6OptIA_NA(b'\x00\x03\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
   3702 a.optcode == 3 and a.optlen == 12 and a.iaid == 0 and a.T1 == 0 and a.T2==0 and a.ianaopts == []
   3703 
   3704 = DHCP6OptIA_NA - Instantiation with specific values (keep automatic length computation) 
   3705 raw(DHCP6OptIA_NA(iaid=0x22222222, T1=0x33333333, T2=0x44444444)) == b'\x00\x03\x00\x0c""""3333DDDD'
   3706 
   3707 = DHCP6OptIA_NA - Instantiation with specific values (forced optlen)
   3708 raw(DHCP6OptIA_NA(optlen=0x1111, iaid=0x22222222, T1=0x33333333, T2=0x44444444)) == b'\x00\x03\x11\x11""""3333DDDD'
   3709 
   3710 = DHCP6OptIA_NA - Instantiation with a list of IA Addresses (optlen automatic computation)
   3711 raw(DHCP6OptIA_NA(iaid=0x22222222, T1=0x33333333, T2=0x44444444, ianaopts=[DHCP6OptIAAddress(), DHCP6OptIAAddress()])) == b'\x00\x03\x00D""""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\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'
   3712 
   3713 = DHCP6OptIA_NA - Dissection with specific values
   3714 a = DHCP6OptIA_NA(b'\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\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')
   3715 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)
   3716 
   3717 
   3718 ############
   3719 ############
   3720 + Test DHCP6 Identity Association for Temporary Addresses Option
   3721 
   3722 = DHCP6OptIA_TA - Basic Instantiation
   3723 raw(DHCP6OptIA_TA()) == b'\x00\x04\x00\x04\x00\x00\x00\x00'
   3724 
   3725 = DHCP6OptIA_TA - Basic Dissection
   3726 a = DHCP6OptIA_TA(b'\x00\x04\x00\x04\x00\x00\x00\x00')
   3727 a.optcode == 4 and a.optlen == 4 and a.iaid == 0 and a.iataopts == []
   3728 
   3729 = DHCP6OptIA_TA - Instantiation with specific values
   3730 raw(DHCP6OptIA_TA(optlen=0x1111, iaid=0x22222222, iataopts=[DHCP6OptIAAddress(), DHCP6OptIAAddress()])) == b'\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\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'
   3731 
   3732 = DHCP6OptIA_TA - Dissection with specific values
   3733 a = DHCP6OptIA_TA(b'\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\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')
   3734 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)
   3735 
   3736 
   3737 ############
   3738 ############
   3739 + Test DHCP6 Option Request Option
   3740 
   3741 = DHCP6OptOptReq - Basic Instantiation
   3742 raw(DHCP6OptOptReq()) ==  b'\x00\x06\x00\x04\x00\x17\x00\x18'
   3743 
   3744 = DHCP6OptOptReq - optlen field computation
   3745 raw(DHCP6OptOptReq(reqopts=[1,2,3,4])) == b'\x00\x06\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04'
   3746 
   3747 = DHCP6OptOptReq - instantiation with empty list
   3748 raw(DHCP6OptOptReq(reqopts=[])) == b'\x00\x06\x00\x00'
   3749 
   3750 = DHCP6OptOptReq - Basic dissection
   3751 a=DHCP6OptOptReq(b'\x00\x06\x00\x00')
   3752 a.optcode == 6 and a.optlen == 0 and a.reqopts == [23,24]
   3753 
   3754 = DHCP6OptOptReq - Dissection with specific value
   3755 a=DHCP6OptOptReq(b'\x00\x06\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04')
   3756 a.optcode == 6 and a.optlen == 8 and a.reqopts == [1,2,3,4]
   3757 
   3758 = DHCP6OptOptReq - repr
   3759 a.show()
   3760 
   3761 
   3762 ############
   3763 ############
   3764 + Test DHCP6 Option - Preference option
   3765 
   3766 = DHCP6OptPref - Basic instantiation
   3767 raw(DHCP6OptPref()) == b'\x00\x07\x00\x01\xff'
   3768 
   3769 = DHCP6OptPref - Instantiation with specific values 
   3770 raw(DHCP6OptPref(optlen=0xffff, prefval= 0x11)) == b'\x00\x07\xff\xff\x11'
   3771 
   3772 = DHCP6OptPref - Basic Dissection
   3773 a=DHCP6OptPref(b'\x00\x07\x00\x01\xff')
   3774 a.optcode == 7 and a.optlen == 1 and a.prefval == 255
   3775 
   3776 = DHCP6OptPref - Dissection with specific values
   3777 a=DHCP6OptPref(b'\x00\x07\xff\xff\x11')
   3778 a.optcode == 7 and a.optlen == 0xffff and a.prefval == 0x11
   3779 
   3780 
   3781 ############
   3782 ############
   3783 + Test DHCP6 Option - Elapsed Time
   3784 
   3785 = DHCP6OptElapsedTime - Basic Instantiation
   3786 raw(DHCP6OptElapsedTime()) == b'\x00\x08\x00\x02\x00\x00'
   3787 
   3788 = DHCP6OptElapsedTime - Instantiation with specific elapsedtime value
   3789 raw(DHCP6OptElapsedTime(elapsedtime=421)) == b'\x00\x08\x00\x02\x01\xa5'
   3790 
   3791 = DHCP6OptElapsedTime - Basic Dissection
   3792 a=DHCP6OptElapsedTime(b'\x00\x08\x00\x02\x00\x00') 
   3793 a.optcode == 8 and a.optlen == 2 and a.elapsedtime == 0
   3794 
   3795 = DHCP6OptElapsedTime - Dissection with specific values
   3796 a=DHCP6OptElapsedTime(b'\x00\x08\x00\x02\x01\xa5')
   3797 a.optcode == 8 and a.optlen == 2 and a.elapsedtime == 421
   3798 
   3799 = DHCP6OptElapsedTime - Repr
   3800 a.show()
   3801 
   3802 
   3803 ############
   3804 ############
   3805 + Test DHCP6 Option - Server Unicast Address
   3806 
   3807 = DHCP6OptServerUnicast - Basic Instantiation
   3808 raw(DHCP6OptServerUnicast()) == b'\x00\x0c\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   3809 
   3810 = DHCP6OptServerUnicast - Instantiation with specific values (test 1)
   3811 raw(DHCP6OptServerUnicast(srvaddr="2001::1")) == b'\x00\x0c\x00\x10 \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
   3812 
   3813 = DHCP6OptServerUnicast - Instantiation with specific values (test 2)
   3814 raw(DHCP6OptServerUnicast(srvaddr="2001::1", optlen=42)) == b'\x00\x0c\x00* \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
   3815 
   3816 = DHCP6OptServerUnicast - Dissection with default values
   3817 a=DHCP6OptServerUnicast(b'\x00\x0c\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
   3818 a.optcode == 12 and a.optlen == 16 and a.srvaddr == "::"
   3819 
   3820 = DHCP6OptServerUnicast - Dissection with specific values (test 1)
   3821 a=DHCP6OptServerUnicast(b'\x00\x0c\x00\x10 \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
   3822 a.optcode == 12 and a.optlen == 16 and a.srvaddr == "2001::1"
   3823 
   3824 = DHCP6OptServerUnicast - Dissection with specific values (test 2)
   3825 a=DHCP6OptServerUnicast(b'\x00\x0c\x00* \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
   3826 a.optcode == 12 and a.optlen == 42 and a.srvaddr == "2001::1"
   3827 
   3828 
   3829 ############
   3830 ############
   3831 + Test DHCP6 Option - Status Code
   3832 
   3833 = DHCP6OptStatusCode - Basic Instantiation
   3834 raw(DHCP6OptStatusCode()) == b'\x00\r\x00\x02\x00\x00' 
   3835 
   3836 = DHCP6OptStatusCode - Instantiation with specific values
   3837 raw(DHCP6OptStatusCode(optlen=42, statuscode=0xff, statusmsg="Hello")) == b'\x00\r\x00*\x00\xffHello'
   3838 
   3839 = DHCP6OptStatusCode - Automatic Length computation
   3840 raw(DHCP6OptStatusCode(statuscode=0xff, statusmsg="Hello")) == b'\x00\r\x00\x07\x00\xffHello'
   3841 
   3842 # Add tests to verify Unicode behavior
   3843 
   3844 
   3845 ############
   3846 ############
   3847 + Test DHCP6 Option - Rapid Commit
   3848 
   3849 = DHCP6OptRapidCommit - Basic Instantiation
   3850 raw(DHCP6OptRapidCommit()) == b'\x00\x0e\x00\x00'
   3851 
   3852 = DHCP6OptRapidCommit - Basic Dissection
   3853 a=DHCP6OptRapidCommit(b'\x00\x0e\x00\x00')
   3854 a.optcode == 14 and a.optlen == 0
   3855 
   3856 
   3857 ############
   3858 ############
   3859 + Test DHCP6 Option - User class
   3860 
   3861 = DHCP6OptUserClass - Basic Instantiation
   3862 raw(DHCP6OptUserClass()) == b'\x00\x0f\x00\x00'
   3863 
   3864 = DHCP6OptUserClass - Basic Dissection
   3865 a = DHCP6OptUserClass(b'\x00\x0f\x00\x00')
   3866 a.optcode == 15 and a.optlen == 0 and a.userclassdata == []
   3867 
   3868 = DHCP6OptUserClass - Instantiation with one user class data rawucture
   3869 raw(DHCP6OptUserClass(userclassdata=[USER_CLASS_DATA(data="something")])) == b'\x00\x0f\x00\x0b\x00\tsomething'
   3870 
   3871 = DHCP6OptUserClass - Dissection with one user class data rawucture
   3872 a = DHCP6OptUserClass(b'\x00\x0f\x00\x0b\x00\tsomething')
   3873 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 == b'something'
   3874 
   3875 = DHCP6OptUserClass - Instantiation with two user class data rawuctures
   3876 raw(DHCP6OptUserClass(userclassdata=[USER_CLASS_DATA(data="something"), USER_CLASS_DATA(data="somethingelse")])) == b'\x00\x0f\x00\x1a\x00\tsomething\x00\rsomethingelse'
   3877 
   3878 = DHCP6OptUserClass - Dissection with two user class data rawuctures
   3879 a = DHCP6OptUserClass(b'\x00\x0f\x00\x1a\x00\tsomething\x00\rsomethingelse')
   3880 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 == b'something' and a.userclassdata[1].len == 13 and a.userclassdata[1].data == b'somethingelse'
   3881 
   3882 
   3883 ############
   3884 ############
   3885 + Test DHCP6 Option - Vendor class
   3886 
   3887 = DHCP6OptVendorClass - Basic Instantiation
   3888 raw(DHCP6OptVendorClass()) == b'\x00\x10\x00\x04\x00\x00\x00\x00'
   3889 
   3890 = DHCP6OptVendorClass - Basic Dissection
   3891 a = DHCP6OptVendorClass(b'\x00\x10\x00\x04\x00\x00\x00\x00')
   3892 a.optcode == 16 and a.optlen == 4 and a.enterprisenum == 0 and a.vcdata == []
   3893 
   3894 = DHCP6OptVendorClass - Instantiation with one vendor class data rawucture
   3895 raw(DHCP6OptVendorClass(vcdata=[VENDOR_CLASS_DATA(data="something")])) == b'\x00\x10\x00\x0f\x00\x00\x00\x00\x00\tsomething'
   3896 
   3897 = DHCP6OptVendorClass - Dissection with one vendor class data rawucture
   3898 a = DHCP6OptVendorClass(b'\x00\x10\x00\x0f\x00\x00\x00\x00\x00\tsomething')
   3899 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 == b'something'
   3900 
   3901 = DHCP6OptVendorClass - Instantiation with two vendor class data rawuctures
   3902 raw(DHCP6OptVendorClass(vcdata=[VENDOR_CLASS_DATA(data="something"), VENDOR_CLASS_DATA(data="somethingelse")])) == b'\x00\x10\x00\x1e\x00\x00\x00\x00\x00\tsomething\x00\rsomethingelse'
   3903 
   3904 = DHCP6OptVendorClass - Dissection with two vendor class data rawuctures
   3905 a = DHCP6OptVendorClass(b'\x00\x10\x00\x1e\x00\x00\x00\x00\x00\tsomething\x00\rsomethingelse')
   3906 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 == b'something' and a.vcdata[1].len == 13 and a.vcdata[1].data == b'somethingelse'
   3907 
   3908 
   3909 ############
   3910 ############
   3911 + Test DHCP6 Option - Vendor-specific information
   3912 
   3913 = DHCP6OptVendorSpecificInfo - Basic Instantiation
   3914 raw(DHCP6OptVendorSpecificInfo()) == b'\x00\x11\x00\x04\x00\x00\x00\x00'
   3915 
   3916 = DHCP6OptVendorSpecificInfo - Basic Dissection
   3917 a = DHCP6OptVendorSpecificInfo(b'\x00\x11\x00\x04\x00\x00\x00\x00')
   3918 a.optcode == 17 and a.optlen == 4 and a.enterprisenum == 0
   3919 
   3920 = DHCP6OptVendorSpecificInfo - Instantiation with specific values (one option)
   3921 raw(DHCP6OptVendorSpecificInfo(enterprisenum=0xeeeeeeee, vso=[VENDOR_SPECIFIC_OPTION(optcode=43, optdata="something")])) == b'\x00\x11\x00\x11\xee\xee\xee\xee\x00+\x00\tsomething'
   3922 
   3923 = DHCP6OptVendorSpecificInfo - Dissection with with specific values (one option)
   3924 a = DHCP6OptVendorSpecificInfo(b'\x00\x11\x00\x11\xee\xee\xee\xee\x00+\x00\tsomething')
   3925 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 == b'something'
   3926 
   3927 = DHCP6OptVendorSpecificInfo - Instantiation with specific values (two options)
   3928 raw(DHCP6OptVendorSpecificInfo(enterprisenum=0xeeeeeeee, vso=[VENDOR_SPECIFIC_OPTION(optcode=43, optdata="something"), VENDOR_SPECIFIC_OPTION(optcode=42, optdata="somethingelse")])) == b'\x00\x11\x00"\xee\xee\xee\xee\x00+\x00\tsomething\x00*\x00\rsomethingelse'
   3929 
   3930 = DHCP6OptVendorSpecificInfo - Dissection with with specific values (two options)
   3931 a = DHCP6OptVendorSpecificInfo(b'\x00\x11\x00"\xee\xee\xee\xee\x00+\x00\tsomething\x00*\x00\rsomethingelse')
   3932 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 == b'something' and a.vso[1].optlen == 13 and a.vso[1].optdata == b'somethingelse'
   3933 
   3934 
   3935 ############
   3936 ############
   3937 + Test DHCP6 Option - Interface-Id 
   3938 
   3939 = DHCP6OptIfaceId - Basic Instantiation
   3940 raw(DHCP6OptIfaceId()) == b'\x00\x12\x00\x00'
   3941 
   3942 = DHCP6OptIfaceId - Basic Dissection
   3943 a = DHCP6OptIfaceId(b'\x00\x12\x00\x00')
   3944 a.optcode == 18 and a.optlen == 0
   3945 
   3946 = DHCP6OptIfaceId - Instantiation with specific value
   3947 raw(DHCP6OptIfaceId(ifaceid="something")) == b'\x00\x12\x00\x09something'
   3948 
   3949 = DHCP6OptIfaceId - Dissection with specific value
   3950 a = DHCP6OptIfaceId(b'\x00\x12\x00\x09something')
   3951 a.optcode == 18 and a.optlen == 9 and a.ifaceid == b"something"
   3952 
   3953 
   3954 ############
   3955 ############
   3956 + Test DHCP6 Option - Reconfigure Message
   3957 
   3958 = DHCP6OptReconfMsg - Basic Instantiation
   3959 raw(DHCP6OptReconfMsg()) == b'\x00\x13\x00\x01\x0b'
   3960 
   3961 = DHCP6OptReconfMsg - Basic Dissection
   3962 a = DHCP6OptReconfMsg(b'\x00\x13\x00\x01\x0b')
   3963 a.optcode == 19 and a.optlen == 1 and a.msgtype == 11
   3964 
   3965 = DHCP6OptReconfMsg - Instantiation with specific values
   3966 raw(DHCP6OptReconfMsg(optlen=4, msgtype=5)) == b'\x00\x13\x00\x04\x05'
   3967 
   3968 = DHCP6OptReconfMsg - Dissection with specific values
   3969 a = DHCP6OptReconfMsg(b'\x00\x13\x00\x04\x05')
   3970 a.optcode == 19 and a.optlen == 4 and a.msgtype == 5
   3971 
   3972 
   3973 ############
   3974 ############
   3975 + Test DHCP6 Option - Reconfigure Accept
   3976 
   3977 = DHCP6OptReconfAccept - Basic Instantiation
   3978 raw(DHCP6OptReconfAccept()) == b'\x00\x14\x00\x00'
   3979 
   3980 = DHCP6OptReconfAccept - Basic Dissection
   3981 a = DHCP6OptReconfAccept(b'\x00\x14\x00\x00')
   3982 a.optcode == 20 and a.optlen == 0
   3983 
   3984 = DHCP6OptReconfAccept - Instantiation with specific values
   3985 raw(DHCP6OptReconfAccept(optlen=23)) == b'\x00\x14\x00\x17'
   3986 
   3987 = DHCP6OptReconfAccept - Dssection with specific values
   3988 a = DHCP6OptReconfAccept(b'\x00\x14\x00\x17')
   3989 a.optcode == 20 and a.optlen == 23
   3990 
   3991 
   3992 ############
   3993 ############
   3994 + Test DHCP6 Option - SIP Servers Domain Name List
   3995 
   3996 = DHCP6OptSIPDomains - Basic Instantiation
   3997 raw(DHCP6OptSIPDomains()) == b'\x00\x15\x00\x00'
   3998 
   3999 = DHCP6OptSIPDomains - Basic Dissection
   4000 a = DHCP6OptSIPDomains(b'\x00\x15\x00\x00') 
   4001 a.optcode == 21 and a.optlen == 0 and a.sipdomains == []
   4002 
   4003 = DHCP6OptSIPDomains - Instantiation with one domain
   4004 raw(DHCP6OptSIPDomains(sipdomains=["toto.example.org"])) == b'\x00\x15\x00\x12\x04toto\x07example\x03org\x00'
   4005 
   4006 = DHCP6OptSIPDomains - Dissection with one domain
   4007 a = DHCP6OptSIPDomains(b'\x00\x15\x00\x12\x04toto\x07example\x03org\x00')
   4008 a.optcode == 21 and a.optlen == 18 and len(a.sipdomains) == 1 and a.sipdomains[0] == "toto.example.org."
   4009 
   4010 = DHCP6OptSIPDomains - Instantiation with two domains
   4011 raw(DHCP6OptSIPDomains(sipdomains=["toto.example.org", "titi.example.org"])) == b'\x00\x15\x00$\x04toto\x07example\x03org\x00\x04titi\x07example\x03org\x00'
   4012 
   4013 = DHCP6OptSIPDomains - Dissection with two domains
   4014 a = DHCP6OptSIPDomains(b'\x00\x15\x00$\x04toto\x07example\x03org\x00\x04TITI\x07example\x03org\x00')
   4015 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."
   4016 
   4017 = DHCP6OptSIPDomains - Enforcing only one dot at end of domain
   4018 raw(DHCP6OptSIPDomains(sipdomains=["toto.example.org."])) == b'\x00\x15\x00\x12\x04toto\x07example\x03org\x00'
   4019 
   4020 
   4021 ############
   4022 ############
   4023 + Test DHCP6 Option - SIP Servers IPv6 Address List
   4024 
   4025 = DHCP6OptSIPServers - Basic Instantiation
   4026 raw(DHCP6OptSIPServers()) == b'\x00\x16\x00\x00'
   4027 
   4028 = DHCP6OptSIPServers - Basic Dissection
   4029 a = DHCP6OptSIPServers(b'\x00\x16\x00\x00')
   4030 a.optcode == 22 and a. optlen == 0 and a.sipservers == []
   4031 
   4032 = DHCP6OptSIPServers - Instantiation with specific values (1 address)
   4033 raw(DHCP6OptSIPServers(sipservers = ["2001:db8::1"] )) == b'\x00\x16\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
   4034 
   4035 = DHCP6OptSIPServers - Dissection with specific values (1 address)
   4036 a = DHCP6OptSIPServers(b'\x00\x16\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
   4037 a.optcode == 22 and a.optlen == 16 and len(a.sipservers) == 1 and a.sipservers[0] == "2001:db8::1" 
   4038 
   4039 = DHCP6OptSIPServers - Instantiation with specific values (2 addresses)
   4040 raw(DHCP6OptSIPServers(sipservers = ["2001:db8::1", "2001:db8::2"] )) == b'\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'
   4041 
   4042 = DHCP6OptSIPServers - Dissection with specific values (2 addresses)
   4043 a = DHCP6OptSIPServers(b'\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')
   4044 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"
   4045 
   4046 
   4047 ############
   4048 ############
   4049 + Test DHCP6 Option - DNS Recursive Name Server
   4050 
   4051 = DHCP6OptDNSServers - Basic Instantiation
   4052 raw(DHCP6OptDNSServers()) == b'\x00\x17\x00\x00'
   4053 
   4054 = DHCP6OptDNSServers - Basic Dissection
   4055 a = DHCP6OptDNSServers(b'\x00\x17\x00\x00')
   4056 a.optcode == 23 and a. optlen == 0 and a.dnsservers == []
   4057 
   4058 = DHCP6OptDNSServers - Instantiation with specific values (1 address)
   4059 raw(DHCP6OptDNSServers(dnsservers = ["2001:db8::1"] )) == b'\x00\x17\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
   4060 
   4061 = DHCP6OptDNSServers - Dissection with specific values (1 address)
   4062 a = DHCP6OptDNSServers(b'\x00\x17\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
   4063 a.optcode == 23 and a.optlen == 16 and len(a.dnsservers) == 1 and a.dnsservers[0] == "2001:db8::1" 
   4064 
   4065 = DHCP6OptDNSServers - Instantiation with specific values (2 addresses)
   4066 raw(DHCP6OptDNSServers(dnsservers = ["2001:db8::1", "2001:db8::2"] )) == b'\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'
   4067 
   4068 = DHCP6OptDNSServers - Dissection with specific values (2 addresses)
   4069 a = DHCP6OptDNSServers(b'\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')
   4070 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"
   4071 
   4072 
   4073 ############
   4074 ############
   4075 + Test DHCP6 Option - DNS Domain Search List Option
   4076 
   4077 = DHCP6OptDNSDomains - Basic Instantiation
   4078 raw(DHCP6OptDNSDomains()) == b'\x00\x18\x00\x00'
   4079 
   4080 = DHCP6OptDNSDomains - Basic Dissection
   4081 a = DHCP6OptDNSDomains(b'\x00\x18\x00\x00')
   4082 a.optcode == 24 and a.optlen == 0 and a.dnsdomains == []
   4083 
   4084 = DHCP6OptDNSDomains - Instantiation with specific values (1 domain) 
   4085 raw(DHCP6OptDNSDomains(dnsdomains=["toto.example.com."])) == b'\x00\x18\x00\x12\x04toto\x07example\x03com\x00'
   4086 
   4087 = DHCP6OptDNSDomains - Dissection with specific values (1 domain) 
   4088 a = DHCP6OptDNSDomains(b'\x00\x18\x00\x12\x04toto\x07example\x03com\x00')
   4089 a.optcode == 24 and a.optlen == 18 and len(a.dnsdomains) == 1 and a.dnsdomains[0] == "toto.example.com."
   4090 
   4091 = DHCP6OptDNSDomains - Instantiation with specific values (2 domains) 
   4092 raw(DHCP6OptDNSDomains(dnsdomains=["toto.example.com.", "titi.example.com."])) == b'\x00\x18\x00$\x04toto\x07example\x03com\x00\x04titi\x07example\x03com\x00'
   4093 
   4094 = DHCP6OptDNSDomains - Dissection with specific values (2 domains) 
   4095 a = DHCP6OptDNSDomains(b'\x00\x18\x00$\x04toto\x07example\x03com\x00\x04titi\x07example\x03com\x00')
   4096 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."
   4097 
   4098 
   4099 ############
   4100 ############
   4101 + Test DHCP6 Option - IA_PD Prefix Option
   4102 
   4103 = DHCP6OptIAPrefix - Basic Instantiation
   4104 raw(DHCP6OptIAPrefix()) == b'\x00\x1a\x00\x19\x00\x00\x00\x00\x00\x00\x00\x000 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   4105 
   4106 #TODO : finish me
   4107 
   4108 
   4109 ############
   4110 ############
   4111 + Test DHCP6 Option - Identity Association for Prefix Delegation
   4112 
   4113 = DHCP6OptIA_PD - Basic Instantiation
   4114 raw(DHCP6OptIA_PD()) == b'\x00\x19\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   4115 
   4116 #TODO : finish me
   4117 
   4118 
   4119 ############
   4120 ############
   4121 + Test DHCP6 Option - NIS Servers
   4122 
   4123 = DHCP6OptNISServers - Basic Instantiation
   4124 raw(DHCP6OptNISServers()) == b'\x00\x1b\x00\x00'
   4125 
   4126 = DHCP6OptNISServers - Basic Dissection
   4127 a = DHCP6OptNISServers(b'\x00\x1b\x00\x00')
   4128 a.optcode == 27 and a. optlen == 0 and a.nisservers == []
   4129 
   4130 = DHCP6OptNISServers - Instantiation with specific values (1 address)
   4131 raw(DHCP6OptNISServers(nisservers = ["2001:db8::1"] )) == b'\x00\x1b\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
   4132 
   4133 = DHCP6OptNISServers - Dissection with specific values (1 address)
   4134 a = DHCP6OptNISServers(b'\x00\x1b\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
   4135 a.optcode == 27 and a.optlen == 16 and len(a.nisservers) == 1 and a.nisservers[0] == "2001:db8::1" 
   4136 
   4137 = DHCP6OptNISServers - Instantiation with specific values (2 addresses)
   4138 raw(DHCP6OptNISServers(nisservers = ["2001:db8::1", "2001:db8::2"] )) == b'\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'
   4139 
   4140 = DHCP6OptNISServers - Dissection with specific values (2 addresses)
   4141 a = DHCP6OptNISServers(b'\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')
   4142 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"
   4143 
   4144 
   4145 ############
   4146 ############
   4147 + Test DHCP6 Option - NIS+ Servers
   4148 
   4149 = DHCP6OptNISPServers - Basic Instantiation
   4150 raw(DHCP6OptNISPServers()) == b'\x00\x1c\x00\x00'
   4151 
   4152 = DHCP6OptNISPServers - Basic Dissection
   4153 a = DHCP6OptNISPServers(b'\x00\x1c\x00\x00')
   4154 a.optcode == 28 and a. optlen == 0 and a.nispservers == []
   4155 
   4156 = DHCP6OptNISPServers - Instantiation with specific values (1 address)
   4157 raw(DHCP6OptNISPServers(nispservers = ["2001:db8::1"] )) == b'\x00\x1c\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
   4158 
   4159 = DHCP6OptNISPServers - Dissection with specific values (1 address)
   4160 a = DHCP6OptNISPServers(b'\x00\x1c\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
   4161 a.optcode == 28 and a.optlen == 16 and len(a.nispservers) == 1 and a.nispservers[0] == "2001:db8::1" 
   4162 
   4163 = DHCP6OptNISPServers - Instantiation with specific values (2 addresses)
   4164 raw(DHCP6OptNISPServers(nispservers = ["2001:db8::1", "2001:db8::2"] )) == b'\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'
   4165 
   4166 = DHCP6OptNISPServers - Dissection with specific values (2 addresses)
   4167 a = DHCP6OptNISPServers(b'\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')
   4168 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"
   4169 
   4170 
   4171 ############
   4172 ############
   4173 + Test DHCP6 Option - NIS Domain Name
   4174 
   4175 = DHCP6OptNISDomain - Basic Instantiation
   4176 raw(DHCP6OptNISDomain()) == b'\x00\x1d\x00\x00'
   4177 
   4178 = DHCP6OptNISDomain - Basic Dissection
   4179 a = DHCP6OptNISDomain(b'\x00\x1d\x00\x00')
   4180 a.optcode == 29 and a.optlen == 0 and a.nisdomain == b""
   4181 
   4182 = DHCP6OptNISDomain - Instantiation with one domain name
   4183 raw(DHCP6OptNISDomain(nisdomain="toto.example.org")) == b'\x00\x1d\x00\x11\x04toto\x07example\x03org'
   4184 
   4185 = DHCP6OptNISDomain - Dissection with one domain name
   4186 a = DHCP6OptNISDomain(b'\x00\x1d\x00\x11\x04toto\x07example\x03org\x00')
   4187 a.optcode == 29 and a.optlen == 17 and a.nisdomain == b"toto.example.org"
   4188 
   4189 = DHCP6OptNISDomain - Instantiation with one domain with trailing dot
   4190 raw(DHCP6OptNISDomain(nisdomain="toto.example.org.")) == b'\x00\x1d\x00\x12\x04toto\x07example\x03org\x00'
   4191 
   4192 
   4193 ############
   4194 ############
   4195 + Test DHCP6 Option - NIS+ Domain Name
   4196 
   4197 = DHCP6OptNISPDomain - Basic Instantiation
   4198 raw(DHCP6OptNISPDomain()) == b'\x00\x1e\x00\x00'
   4199 
   4200 = DHCP6OptNISPDomain - Basic Dissection
   4201 a = DHCP6OptNISPDomain(b'\x00\x1e\x00\x00')
   4202 a.optcode == 30 and a.optlen == 0 and a.nispdomain == b""
   4203 
   4204 = DHCP6OptNISPDomain - Instantiation with one domain name
   4205 raw(DHCP6OptNISPDomain(nispdomain="toto.example.org")) == b'\x00\x1e\x00\x11\x04toto\x07example\x03org'
   4206 
   4207 = DHCP6OptNISPDomain - Dissection with one domain name
   4208 a = DHCP6OptNISPDomain(b'\x00\x1e\x00\x11\x04toto\x07example\x03org\x00')
   4209 a.optcode == 30 and a.optlen == 17 and a.nispdomain == b"toto.example.org"
   4210 
   4211 = DHCP6OptNISPDomain - Instantiation with one domain with trailing dot
   4212 raw(DHCP6OptNISPDomain(nispdomain="toto.example.org.")) == b'\x00\x1e\x00\x12\x04toto\x07example\x03org\x00'
   4213 
   4214 
   4215 ############
   4216 ############
   4217 + Test DHCP6 Option - SNTP Servers
   4218 
   4219 = DHCP6OptSNTPServers - Basic Instantiation
   4220 raw(DHCP6OptSNTPServers()) == b'\x00\x1f\x00\x00'
   4221 
   4222 = DHCP6OptSNTPServers - Basic Dissection
   4223 a = DHCP6OptSNTPServers(b'\x00\x1f\x00\x00')
   4224 a.optcode == 31 and a. optlen == 0 and a.sntpservers == []
   4225 
   4226 = DHCP6OptSNTPServers - Instantiation with specific values (1 address)
   4227 raw(DHCP6OptSNTPServers(sntpservers = ["2001:db8::1"] )) == b'\x00\x1f\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
   4228 
   4229 = DHCP6OptSNTPServers - Dissection with specific values (1 address)
   4230 a = DHCP6OptSNTPServers(b'\x00\x1f\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
   4231 a.optcode == 31 and a.optlen == 16 and len(a.sntpservers) == 1 and a.sntpservers[0] == "2001:db8::1" 
   4232 
   4233 = DHCP6OptSNTPServers - Instantiation with specific values (2 addresses)
   4234 raw(DHCP6OptSNTPServers(sntpservers = ["2001:db8::1", "2001:db8::2"] )) == b'\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'
   4235 
   4236 = DHCP6OptSNTPServers - Dissection with specific values (2 addresses)
   4237 a = DHCP6OptSNTPServers(b'\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')
   4238 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"
   4239 
   4240 ############
   4241 ############
   4242 + Test DHCP6 Option - Information Refresh Time
   4243 
   4244 = DHCP6OptInfoRefreshTime - Basic Instantiation
   4245 raw(DHCP6OptInfoRefreshTime()) == b'\x00 \x00\x04\x00\x01Q\x80'
   4246 
   4247 = DHCP6OptInfoRefreshTime - Basic Dissction
   4248 a = DHCP6OptInfoRefreshTime(b'\x00 \x00\x04\x00\x01Q\x80')
   4249 a.optcode == 32 and a.optlen == 4 and a.reftime == 86400
   4250 
   4251 = DHCP6OptInfoRefreshTime - Instantiation with specific values
   4252 raw(DHCP6OptInfoRefreshTime(optlen=7, reftime=42)) == b'\x00 \x00\x07\x00\x00\x00*'
   4253 
   4254 ############
   4255 ############
   4256 + Test DHCP6 Option - BCMCS Servers
   4257 
   4258 = DHCP6OptBCMCSServers - Basic Instantiation
   4259 raw(DHCP6OptBCMCSServers()) == b'\x00"\x00\x00'
   4260 
   4261 = DHCP6OptBCMCSServers - Basic Dissection
   4262 a = DHCP6OptBCMCSServers(b'\x00"\x00\x00')
   4263 a.optcode == 34 and a. optlen == 0 and a.bcmcsservers == []
   4264 
   4265 = DHCP6OptBCMCSServers - Instantiation with specific values (1 address)
   4266 raw(DHCP6OptBCMCSServers(bcmcsservers = ["2001:db8::1"] )) == b'\x00"\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
   4267 
   4268 = DHCP6OptBCMCSServers - Dissection with specific values (1 address)
   4269 a = DHCP6OptBCMCSServers(b'\x00"\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
   4270 a.optcode == 34 and a.optlen == 16 and len(a.bcmcsservers) == 1 and a.bcmcsservers[0] == "2001:db8::1" 
   4271 
   4272 = DHCP6OptBCMCSServers - Instantiation with specific values (2 addresses)
   4273 raw(DHCP6OptBCMCSServers(bcmcsservers = ["2001:db8::1", "2001:db8::2"] )) == b'\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'
   4274 
   4275 = DHCP6OptBCMCSServers - Dissection with specific values (2 addresses)
   4276 a = DHCP6OptBCMCSServers(b'\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')
   4277 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"
   4278 
   4279 
   4280 ############
   4281 ############
   4282 + Test DHCP6 Option - BCMCS Domains
   4283 
   4284 = DHCP6OptBCMCSDomains - Basic Instantiation
   4285 raw(DHCP6OptBCMCSDomains()) == b'\x00!\x00\x00'
   4286 
   4287 = DHCP6OptBCMCSDomains - Basic Dissection
   4288 a = DHCP6OptBCMCSDomains(b'\x00!\x00\x00')
   4289 a.optcode == 33 and a.optlen == 0 and a.bcmcsdomains == []
   4290 
   4291 = DHCP6OptBCMCSDomains - Instantiation with specific values (1 domain) 
   4292 raw(DHCP6OptBCMCSDomains(bcmcsdomains=["toto.example.com."])) == b'\x00!\x00\x12\x04toto\x07example\x03com\x00'
   4293 
   4294 = DHCP6OptBCMCSDomains - Dissection with specific values (1 domain) 
   4295 a = DHCP6OptBCMCSDomains(b'\x00!\x00\x12\x04toto\x07example\x03com\x00')
   4296 a.optcode == 33 and a.optlen == 18 and len(a.bcmcsdomains) == 1 and a.bcmcsdomains[0] == "toto.example.com."
   4297 
   4298 = DHCP6OptBCMCSDomains - Instantiation with specific values (2 domains) 
   4299 raw(DHCP6OptBCMCSDomains(bcmcsdomains=["toto.example.com.", "titi.example.com."])) == b'\x00!\x00$\x04toto\x07example\x03com\x00\x04titi\x07example\x03com\x00'
   4300 
   4301 = DHCP6OptBCMCSDomains - Dissection with specific values (2 domains) 
   4302 a = DHCP6OptBCMCSDomains(b'\x00!\x00$\x04toto\x07example\x03com\x00\x04titi\x07example\x03com\x00')
   4303 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."
   4304 
   4305 
   4306 ############
   4307 ############
   4308 + Test DHCP6 Option - Relay Agent Remote-ID
   4309 
   4310 = DHCP6OptRemoteID - Basic Instantiation
   4311 raw(DHCP6OptRemoteID()) == b'\x00%\x00\x04\x00\x00\x00\x00'
   4312 
   4313 = DHCP6OptRemoteID - Basic Dissection
   4314 a = DHCP6OptRemoteID(b'\x00%\x00\x04\x00\x00\x00\x00')
   4315 a.optcode == 37 and a.optlen == 4 and a.enterprisenum == 0 and a.remoteid == b""
   4316 
   4317 = DHCP6OptRemoteID - Instantiation with specific values 
   4318 raw(DHCP6OptRemoteID(enterprisenum=0xeeeeeeee, remoteid="someid")) == b'\x00%\x00\n\xee\xee\xee\xeesomeid'
   4319 
   4320 = DHCP6OptRemoteID - Dissection with specific values
   4321 a = DHCP6OptRemoteID(b'\x00%\x00\n\xee\xee\xee\xeesomeid')
   4322 a.optcode == 37 and a.optlen == 10 and a.enterprisenum == 0xeeeeeeee and a.remoteid == b"someid"
   4323 
   4324 
   4325 ############
   4326 ############
   4327 + Test DHCP6 Option - Subscriber ID
   4328 
   4329 = DHCP6OptSubscriberID - Basic Instantiation
   4330 raw(DHCP6OptSubscriberID()) == b'\x00&\x00\x00'
   4331 
   4332 = DHCP6OptSubscriberID - Basic Dissection
   4333 a = DHCP6OptSubscriberID(b'\x00&\x00\x00')
   4334 a.optcode == 38 and a.optlen == 0 and a.subscriberid == b""
   4335 
   4336 = DHCP6OptSubscriberID - Instantiation with specific values
   4337 raw(DHCP6OptSubscriberID(subscriberid="someid")) == b'\x00&\x00\x06someid'
   4338 
   4339 = DHCP6OptSubscriberID - Dissection with specific values
   4340 a = DHCP6OptSubscriberID(b'\x00&\x00\x06someid')
   4341 a.optcode == 38 and a.optlen == 6 and a.subscriberid == b"someid"
   4342 
   4343 
   4344 ############
   4345 ############
   4346 + Test DHCP6 Option - Client FQDN
   4347 
   4348 = DHCP6OptClientFQDN - Basic Instantiation
   4349 raw(DHCP6OptClientFQDN()) == b"\x00'\x00\x01\x00"
   4350 
   4351 = DHCP6OptClientFQDN - Basic Dissection
   4352 a = DHCP6OptClientFQDN(b"\x00'\x00\x01\x00")
   4353 a.optcode == 39 and a.optlen == 1 and a.res == 0 and a.flags == 0 and a.fqdn == b""
   4354 
   4355 = DHCP6OptClientFQDN - Instantiation with various flags combinations
   4356 raw(DHCP6OptClientFQDN(flags="S")) == b"\x00'\x00\x01\x01" and raw(DHCP6OptClientFQDN(flags="O")) == b"\x00'\x00\x01\x02" and raw(DHCP6OptClientFQDN(flags="N")) == b"\x00'\x00\x01\x04" and raw(DHCP6OptClientFQDN(flags="SON")) == b"\x00'\x00\x01\x07" and raw(DHCP6OptClientFQDN(flags="ON")) == b"\x00'\x00\x01\x06"
   4357 
   4358 = DHCP6OptClientFQDN - Instantiation with one fqdn 
   4359 raw(DHCP6OptClientFQDN(fqdn="toto.example.org")) == b"\x00'\x00\x12\x00\x04toto\x07example\x03org"
   4360 
   4361 = DHCP6OptClientFQDN - Dissection with one fqdn 
   4362 a = DHCP6OptClientFQDN(b"\x00'\x00\x12\x00\x04toto\x07example\x03org\x00")
   4363 a.optcode == 39 and a.optlen == 18 and a.res == 0 and a.flags == 0 and a.fqdn == b"toto.example.org"
   4364 
   4365 
   4366 ############
   4367 ############
   4368 + Test DHCP6 Option Relay Agent Echo Request Option
   4369 
   4370 = DHCP6OptRelayAgentERO - Basic Instantiation
   4371 raw(DHCP6OptRelayAgentERO()) ==  b'\x00+\x00\x04\x00\x17\x00\x18'
   4372 
   4373 = DHCP6OptRelayAgentERO - optlen field computation
   4374 raw(DHCP6OptRelayAgentERO(reqopts=[1,2,3,4])) == b'\x00+\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04'
   4375 
   4376 = DHCP6OptRelayAgentERO - instantiation with empty list
   4377 raw(DHCP6OptRelayAgentERO(reqopts=[])) == b'\x00+\x00\x00'
   4378 
   4379 = DHCP6OptRelayAgentERO - Basic dissection
   4380 a=DHCP6OptRelayAgentERO(b'\x00+\x00\x00')
   4381 a.optcode == 43 and a.optlen == 0 and a.reqopts == [23,24]
   4382 
   4383 = DHCP6OptRelayAgentERO - Dissection with specific value
   4384 a=DHCP6OptRelayAgentERO(b'\x00+\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04')
   4385 a.optcode == 43 and a.optlen == 8 and a.reqopts == [1,2,3,4]
   4386 
   4387 
   4388 ############
   4389 ############
   4390 + Test DHCP6 Option Client Link Layer address
   4391 
   4392 = Basic build & dissect
   4393 s = raw(DHCP6OptClientLinkLayerAddr())
   4394 assert(s == b"\x00O\x00\x07\x00\x01\x00\x00\x00\x00\x00\x00")
   4395 
   4396 p = DHCP6OptClientLinkLayerAddr(s)
   4397 assert(p.clladdr == "00:00:00:00:00:00")
   4398 
   4399 
   4400 ############
   4401 ############
   4402 + Test DHCP6 Option Virtual Subnet Selection
   4403 
   4404 = Basic build & dissect
   4405 s = raw(DHCP6OptVSS())
   4406 assert(s == b"\x00D\x00\x01\xff")
   4407 
   4408 p = DHCP6OptVSS(s)
   4409 assert(p.type == 255)
   4410 
   4411 
   4412 ############
   4413 ############
   4414 + Test DHCP6 Messages - DHCP6_Solicit
   4415 
   4416 = DHCP6_Solicit - Basic Instantiation
   4417 raw(DHCP6_Solicit()) == b'\x01\x00\x00\x00'
   4418 
   4419 = DHCP6_Solicit - Basic Dissection
   4420 a = DHCP6_Solicit(b'\x01\x00\x00\x00')
   4421 a.msgtype == 1 and a.trid == 0
   4422 
   4423 = DHCP6_Solicit - Basic test of DHCP6_solicit.hashret() 
   4424 DHCP6_Solicit().hashret() == b'\x00\x00\x00'
   4425 
   4426 = DHCP6_Solicit - Test of DHCP6_solicit.hashret() with specific values
   4427 DHCP6_Solicit(trid=0xbbccdd).hashret() == b'\xbb\xcc\xdd'
   4428 
   4429 = DHCP6_Solicit - UDP ports overload
   4430 a=UDP()/DHCP6_Solicit()
   4431 a.sport == 546 and a.dport == 547
   4432 
   4433 = DHCP6_Solicit - Dispatch based on UDP port 
   4434 a=UDP(raw(UDP()/DHCP6_Solicit()))
   4435 isinstance(a.payload, DHCP6_Solicit)
   4436 
   4437 
   4438 ############
   4439 ############
   4440 + Test DHCP6 Messages - DHCP6_Advertise
   4441 
   4442 = DHCP6_Advertise - Basic Instantiation
   4443 raw(DHCP6_Advertise()) == b'\x02\x00\x00\x00'
   4444 
   4445 = DHCP6_Advertise - Basic test of DHCP6_solicit.hashret() 
   4446 DHCP6_Advertise().hashret() == b'\x00\x00\x00'
   4447 
   4448 = DHCP6_Advertise - Test of DHCP6_Advertise.hashret() with specific values
   4449 DHCP6_Advertise(trid=0xbbccdd).hashret() == b'\xbb\xcc\xdd'
   4450 
   4451 = DHCP6_Advertise - Basic test of answers() with solicit message
   4452 a = DHCP6_Solicit()
   4453 b = DHCP6_Advertise()
   4454 a > b
   4455 
   4456 = DHCP6_Advertise - Test of answers() with solicit message
   4457 a = DHCP6_Solicit(trid=0xbbccdd)
   4458 b = DHCP6_Advertise(trid=0xbbccdd)
   4459 a > b
   4460 
   4461 = DHCP6_Advertise - UDP ports overload
   4462 a=UDP()/DHCP6_Advertise()
   4463 a.sport == 547 and a.dport == 546
   4464 
   4465 
   4466 ############
   4467 ############
   4468 + Test DHCP6 Messages - DHCP6_Request
   4469 
   4470 = DHCP6_Request - Basic Instantiation
   4471 raw(DHCP6_Request()) == b'\x03\x00\x00\x00'
   4472 
   4473 = DHCP6_Request - Basic Dissection
   4474 a=DHCP6_Request(b'\x03\x00\x00\x00')
   4475 a.msgtype == 3 and a.trid == 0 
   4476 
   4477 = DHCP6_Request - UDP ports overload
   4478 a=UDP()/DHCP6_Request()
   4479 a.sport == 546 and a.dport == 547
   4480 
   4481 
   4482 ############
   4483 ############
   4484 + Test DHCP6 Messages - DHCP6_Confirm
   4485 
   4486 = DHCP6_Confirm - Basic Instantiation
   4487 raw(DHCP6_Confirm()) == b'\x04\x00\x00\x00'
   4488 
   4489 = DHCP6_Confirm - Basic Dissection
   4490 a=DHCP6_Confirm(b'\x04\x00\x00\x00')
   4491 a.msgtype == 4 and a.trid == 0
   4492 
   4493 = DHCP6_Confirm - UDP ports overload
   4494 a=UDP()/DHCP6_Confirm()
   4495 a.sport == 546 and a.dport == 547
   4496 
   4497 
   4498 ############
   4499 ############
   4500 + Test DHCP6 Messages - DHCP6_Renew
   4501 
   4502 = DHCP6_Renew - Basic Instantiation
   4503 raw(DHCP6_Renew()) == b'\x05\x00\x00\x00'
   4504 
   4505 = DHCP6_Renew - Basic Dissection
   4506 a=DHCP6_Renew(b'\x05\x00\x00\x00')
   4507 a.msgtype == 5 and a.trid == 0
   4508 
   4509 = DHCP6_Renew - UDP ports overload
   4510 a=UDP()/DHCP6_Renew()
   4511 a.sport == 546 and a.dport == 547
   4512 
   4513 
   4514 ############
   4515 ############
   4516 + Test DHCP6 Messages - DHCP6_Rebind
   4517 
   4518 = DHCP6_Rebind - Basic Instantiation
   4519 raw(DHCP6_Rebind()) == b'\x06\x00\x00\x00'
   4520 
   4521 = DHCP6_Rebind - Basic Dissection
   4522 a=DHCP6_Rebind(b'\x06\x00\x00\x00')
   4523 a.msgtype == 6 and a.trid == 0
   4524 
   4525 = DHCP6_Rebind - UDP ports overload
   4526 a=UDP()/DHCP6_Rebind()
   4527 a.sport == 546 and a.dport == 547
   4528 
   4529 
   4530 ############
   4531 ############
   4532 + Test DHCP6 Messages - DHCP6_Reply
   4533 
   4534 = DHCP6_Reply - Basic Instantiation
   4535 raw(DHCP6_Reply()) == b'\x07\x00\x00\x00'
   4536 
   4537 = DHCP6_Reply - Basic Dissection
   4538 a=DHCP6_Reply(b'\x07\x00\x00\x00')
   4539 a.msgtype == 7 and a.trid == 0
   4540 
   4541 = DHCP6_Reply - UDP ports overload
   4542 a=UDP()/DHCP6_Reply()
   4543 a.sport == 547 and a.dport == 546
   4544 
   4545 = DHCP6_Reply - Answers
   4546 
   4547 assert not DHCP6_Reply(trid=0).answers(DHCP6_Request(trid=1))
   4548 assert DHCP6_Reply(trid=1).answers(DHCP6_Request(trid=1))
   4549 
   4550 
   4551 ############
   4552 ############
   4553 + Test DHCP6 Messages - DHCP6_Release
   4554 
   4555 = DHCP6_Release - Basic Instantiation
   4556 raw(DHCP6_Release()) == b'\x08\x00\x00\x00'
   4557 
   4558 = DHCP6_Release - Basic Dissection
   4559 a=DHCP6_Release(b'\x08\x00\x00\x00')
   4560 a.msgtype == 8 and a.trid == 0
   4561 
   4562 = DHCP6_Release - UDP ports overload
   4563 a=UDP()/DHCP6_Release()
   4564 a.sport == 546 and a.dport == 547
   4565 
   4566 
   4567 ############
   4568 ############
   4569 + Test DHCP6 Messages - DHCP6_Decline
   4570 
   4571 = DHCP6_Decline - Basic Instantiation
   4572 raw(DHCP6_Decline()) == b'\x09\x00\x00\x00'
   4573 
   4574 = DHCP6_Confirm - Basic Dissection
   4575 a=DHCP6_Confirm(b'\x09\x00\x00\x00')
   4576 a.msgtype == 9 and a.trid == 0
   4577 
   4578 = DHCP6_Decline - UDP ports overload
   4579 a=UDP()/DHCP6_Decline()
   4580 a.sport == 546 and a.dport == 547
   4581 
   4582 
   4583 ############
   4584 ############
   4585 + Test DHCP6 Messages - DHCP6_Reconf
   4586 
   4587 = DHCP6_Reconf - Basic Instantiation
   4588 raw(DHCP6_Reconf()) == b'\x0A\x00\x00\x00'
   4589 
   4590 = DHCP6_Reconf - Basic Dissection
   4591 a=DHCP6_Reconf(b'\x0A\x00\x00\x00')
   4592 a.msgtype == 10 and a.trid == 0
   4593 
   4594 = DHCP6_Reconf - UDP ports overload
   4595 a=UDP()/DHCP6_Reconf()
   4596 a.sport == 547 and a.dport == 546
   4597 
   4598 
   4599 ############
   4600 ############
   4601 + Test DHCP6 Messages - DHCP6_InfoRequest
   4602 
   4603 = DHCP6_InfoRequest - Basic Instantiation
   4604 raw(DHCP6_InfoRequest()) == b'\x0B\x00\x00\x00'
   4605 
   4606 = DHCP6_InfoRequest - Basic Dissection
   4607 a=DHCP6_InfoRequest(b'\x0B\x00\x00\x00')
   4608 a.msgtype == 11 and a.trid == 0
   4609 
   4610 = DHCP6_InfoRequest - UDP ports overload
   4611 a=UDP()/DHCP6_InfoRequest()
   4612 a.sport == 546 and a.dport == 547
   4613 
   4614 
   4615 ############
   4616 ############
   4617 + Test DHCP6 Messages - DHCP6_RelayForward
   4618 
   4619 = DHCP6_RelayForward - Basic Instantiation
   4620 raw(DHCP6_RelayForward()) == b'\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'
   4621 
   4622 = DHCP6_RelayForward - Basic Dissection
   4623 a=DHCP6_RelayForward(b'\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')
   4624 a.msgtype == 12 and a.hopcount == 0 and a.linkaddr == "::" and a.peeraddr == "::"
   4625 
   4626 = DHCP6_RelayForward - Dissection with options
   4627 a = DHCP6_RelayForward(b'\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\x00\t\x00\x04\x00\x01\x00\x00')
   4628 a.msgtype == 12 and DHCP6OptRelayMsg in a and isinstance(a.message, DHCP6)
   4629 
   4630 
   4631 ############
   4632 ############
   4633 + Test DHCP6 Messages - DHCP6OptRelayMsg
   4634 
   4635 = DHCP6OptRelayMsg - Basic Instantiation
   4636 raw(DHCP6OptRelayMsg(optcode=37)) == b'\x00%\x00\x04\x00\x00\x00\x00'
   4637 
   4638 = DHCP6OptRelayMsg - Basic Dissection
   4639 a=DHCP6OptRelayMsg(b'\x00\r\x00\x00')
   4640 assert a.optcode == 13
   4641 
   4642 = DHCP6OptRelayMsg - Embedded DHCP6 packet
   4643 p = DHCP6OptRelayMsg(b'\x00\t\x00\x04\x00\x00\x00\x00')
   4644 isinstance(p.message, DHCP6)
   4645 
   4646 ############
   4647 ############
   4648 + Test DHCP6 Messages - DHCP6_RelayReply
   4649 
   4650 = DHCP6_RelayReply - Basic Instantiation
   4651 raw(DHCP6_RelayReply()) == b'\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'
   4652 
   4653 = DHCP6_RelayReply - Basic Dissection
   4654 a=DHCP6_RelayReply(b'\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')
   4655 a.msgtype == 13 and a.hopcount == 0 and a.linkaddr == "::" and a.peeraddr == "::"
   4656 
   4657 
   4658 ############
   4659 ############
   4660 + Home Agent Address Discovery
   4661 
   4662 = in6_getha()
   4663 in6_getha('2001:db8::') == '2001:db8::fdff:ffff:ffff:fffe'
   4664 
   4665 = ICMPv6HAADRequest - build/dissection
   4666 p = IPv6(raw(IPv6(dst=in6_getha('2001:db8::'), src='2001:db8::1')/ICMPv6HAADRequest(id=42)))
   4667 p.cksum == 0x9620 and p.dst == '2001:db8::fdff:ffff:ffff:fffe' and p.R == 1
   4668 
   4669 = ICMPv6HAADReply - build/dissection
   4670 p = IPv6(raw(IPv6(dst='2001:db8::1', src='2001:db8::42')/ICMPv6HAADReply(id=42, addresses=['2001:db8::2', '2001:db8::3'])))
   4671 p.cksum = 0x3747 and p.addresses == [ '2001:db8::2', '2001:db8::3' ]
   4672 
   4673 = ICMPv6HAADRequest / ICMPv6HAADReply - build/dissection
   4674 a=ICMPv6HAADRequest(id=42) 
   4675 b=ICMPv6HAADReply(id=42)
   4676 not a < b and a > b
   4677 
   4678 
   4679 ############
   4680 ############
   4681 + Mobile Prefix Solicitation/Advertisement
   4682 
   4683 = ICMPv6MPSol - build (default values)
   4684 
   4685 s = b'`\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'
   4686 raw(IPv6()/ICMPv6MPSol()) == s
   4687 
   4688 = ICMPv6MPSol - dissection (default values)
   4689 p = IPv6(s)
   4690 p[ICMPv6MPSol].type == 146 and p[ICMPv6MPSol].cksum == 0x6dbb and p[ICMPv6MPSol].id == 0
   4691 
   4692 = ICMPv6MPSol - build
   4693 s = b'`\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'
   4694 raw(IPv6()/ICMPv6MPSol(cksum=0x2808, id=8)) == s
   4695 
   4696 = ICMPv6MPSol - dissection
   4697 p = IPv6(s)
   4698 p[ICMPv6MPSol].cksum == 0x2808 and p[ICMPv6MPSol].id == 8
   4699 
   4700 = ICMPv6MPAdv - build (default values)
   4701 s = b'`\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'
   4702 raw(IPv6()/ICMPv6MPAdv()/ICMPv6NDOptPrefixInfo()) == s
   4703 
   4704 = ICMPv6MPAdv - dissection (default values)
   4705 p = IPv6(s)
   4706 p[ICMPv6MPAdv].type == 147 and p[ICMPv6MPAdv].cksum == 0xe8d6 and p[ICMPv6NDOptPrefixInfo].prefix == '::'
   4707 
   4708 = ICMPv6MPAdv - build
   4709 s = b'`\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'
   4710 raw(IPv6()/ICMPv6MPAdv(cksum=0x2807, flags=1, id=42)/ICMPv6NDOptPrefixInfo(prefix='2001:db8::1', L=0, preferredlifetime=12)) == s
   4711 
   4712 = ICMPv6MPAdv - dissection
   4713 p = IPv6(s)
   4714 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
   4715 
   4716 
   4717 ############
   4718 ############
   4719 + Type 2 Routing Header
   4720 
   4721 = IPv6ExtHdrRouting - type 2 - build/dissection
   4722 p = IPv6(raw(IPv6(dst='2001:db8::1', src='2001:db8::2')/IPv6ExtHdrRouting(type=2, addresses=['2001:db8::3'])/ICMPv6EchoRequest()))
   4723 p.type == 2 and len(p.addresses) == 1 and p.cksum == 0x2446
   4724 
   4725 = IPv6ExtHdrRouting - type 2 - hashret
   4726 
   4727 p = IPv6()/IPv6ExtHdrRouting(addresses=["2001:db8::1", "2001:db8::2"])/ICMPv6EchoRequest()
   4728 p.hashret() == b" \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00:\x00\x00\x00\x00"
   4729 
   4730 
   4731 ############
   4732 ############
   4733 + Mobility Options - Binding Refresh Advice
   4734 
   4735 = MIP6OptBRAdvice - build (default values)
   4736 s = b'\x02\x02\x00\x00'
   4737 raw(MIP6OptBRAdvice()) == s
   4738 
   4739 = MIP6OptBRAdvice - dissection (default values)
   4740 p = MIP6OptBRAdvice(s)
   4741 p.otype == 2 and p.olen == 2 and p.rinter == 0
   4742 
   4743 = MIP6OptBRAdvice - build
   4744 s = b'\x03*\n\xf7'
   4745 raw(MIP6OptBRAdvice(otype=3, olen=42, rinter=2807)) == s
   4746 
   4747 = MIP6OptBRAdvice - dissection
   4748 p = MIP6OptBRAdvice(s)
   4749 p.otype == 3 and p.olen == 42 and p.rinter == 2807
   4750 
   4751 
   4752 ############
   4753 ############
   4754 + Mobility Options - Alternate Care-of Address
   4755 
   4756 = MIP6OptAltCoA - build (default values)
   4757 s = b'\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   4758 raw(MIP6OptAltCoA()) == s
   4759 
   4760 = MIP6OptAltCoA - dissection (default values)
   4761 p = MIP6OptAltCoA(s)
   4762 p.otype == 3 and p.olen == 16 and p.acoa == '::'
   4763 
   4764 = MIP6OptAltCoA - build
   4765 s = b'*\x08 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
   4766 raw(MIP6OptAltCoA(otype=42, olen=8, acoa='2001:db8::1')) == s
   4767 
   4768 = MIP6OptAltCoA - dissection
   4769 p = MIP6OptAltCoA(s)
   4770 p.otype == 42 and p.olen == 8 and p.acoa == '2001:db8::1'
   4771 
   4772 
   4773 ############
   4774 ############
   4775 + Mobility Options - Nonce Indices
   4776 
   4777 = MIP6OptNonceIndices - build (default values)
   4778 s = b'\x04\x10\x00\x00\x00\x00'
   4779 raw(MIP6OptNonceIndices()) == s
   4780 
   4781 = MIP6OptNonceIndices - dissection (default values)
   4782 p = MIP6OptNonceIndices(s)
   4783 p.otype == 4 and p.olen == 16 and p.hni == 0 and p.coni == 0
   4784 
   4785 = MIP6OptNonceIndices - build
   4786 s = b'\x04\x12\x00\x13\x00\x14'
   4787 raw(MIP6OptNonceIndices(olen=18, hni=19, coni=20)) == s
   4788 
   4789 = MIP6OptNonceIndices - dissection
   4790 p = MIP6OptNonceIndices(s)
   4791 p.hni == 19 and p.coni == 20
   4792 
   4793 
   4794 ############
   4795 ############
   4796 + Mobility Options - Binding Authentication Data
   4797 
   4798 = MIP6OptBindingAuthData - build (default values)
   4799 s = b'\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   4800 raw(MIP6OptBindingAuthData()) == s
   4801 
   4802 = MIP6OptBindingAuthData - dissection (default values)
   4803 p = MIP6OptBindingAuthData(s)
   4804 p.otype == 5 and p.olen == 16 and p.authenticator == 0
   4805 
   4806 = MIP6OptBindingAuthData - build
   4807 s = b'\x05*\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\xf7'
   4808 raw(MIP6OptBindingAuthData(olen=42, authenticator=2807)) == s
   4809 
   4810 = MIP6OptBindingAuthData - dissection
   4811 p = MIP6OptBindingAuthData(s)
   4812 p.otype == 5 and p.olen == 42 and p.authenticator == 2807
   4813 
   4814 
   4815 ############
   4816 ############
   4817 + Mobility Options - Mobile Network Prefix
   4818 
   4819 = MIP6OptMobNetPrefix - build (default values)
   4820 s = b'\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   4821 raw(MIP6OptMobNetPrefix()) == s
   4822 
   4823 = MIP6OptMobNetPrefix - dissection (default values)
   4824 p = MIP6OptMobNetPrefix(s)
   4825 p.otype == 6 and p.olen == 18 and p.plen == 64 and p.prefix == '::'
   4826 
   4827 = MIP6OptMobNetPrefix - build
   4828 s = b'\x06*\x02  \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   4829 raw(MIP6OptMobNetPrefix(olen=42, reserved=2, plen=32, prefix='2001:db8::')) == s
   4830 
   4831 = MIP6OptMobNetPrefix - dissection
   4832 p = MIP6OptMobNetPrefix(s)
   4833 p.olen ==  42 and p.reserved  == 2 and p.plen == 32 and p.prefix == '2001:db8::'
   4834 
   4835 
   4836 ############
   4837 ############
   4838 + Mobility Options - Link-Layer Address (MH-LLA)
   4839 
   4840 = MIP6OptLLAddr - basic build
   4841 raw(MIP6OptLLAddr()) == b'\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00'
   4842 
   4843 = MIP6OptLLAddr - basic dissection
   4844 p = MIP6OptLLAddr(b'\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00')
   4845 p.otype == 7 and p.olen == 7 and p.ocode == 2 and p.pad == 0 and p.lla == "00:00:00:00:00:00"
   4846 
   4847 = MIP6OptLLAddr - build with specific values
   4848 raw(MIP6OptLLAddr(olen=42, ocode=4, pad=0xff, lla='EE:EE:EE:EE:EE:EE')) == b'\x07*\x04\xff\xee\xee\xee\xee\xee\xee'
   4849 
   4850 = MIP6OptLLAddr - dissection with specific values
   4851 p = MIP6OptLLAddr(b'\x07*\x04\xff\xee\xee\xee\xee\xee\xee')
   4852 
   4853 raw(MIP6OptLLAddr(olen=42, ocode=4, pad=0xff, lla='EE:EE:EE:EE:EE:EE'))
   4854 p.otype == 7 and p.olen == 42 and p.ocode == 4 and p.pad == 0xff and p.lla == "ee:ee:ee:ee:ee:ee"
   4855 
   4856 
   4857 ############
   4858 ############
   4859 + Mobility Options - Mobile Node Identifier
   4860 
   4861 = MIP6OptMNID - basic build
   4862 raw(MIP6OptMNID()) == b'\x08\x01\x01'
   4863 
   4864 = MIP6OptMNID - basic dissection
   4865 p = MIP6OptMNID(b'\x08\x01\x01')
   4866 p.otype == 8 and p.olen == 1 and p.subtype == 1 and p.id == b""
   4867 
   4868 = MIP6OptMNID - build with specific values
   4869 raw(MIP6OptMNID(subtype=42, id="someid")) == b'\x08\x07*someid'
   4870 
   4871 = MIP6OptMNID - dissection with specific values
   4872 p = MIP6OptMNID(b'\x08\x07*someid')
   4873 p.otype == 8 and p.olen == 7 and p.subtype == 42 and p.id == b"someid"
   4874 
   4875 
   4876 
   4877 ############
   4878 ############
   4879 + Mobility Options - Message Authentication
   4880 
   4881 = MIP6OptMsgAuth - basic build
   4882 raw(MIP6OptMsgAuth()) == b'\x09\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA'
   4883 
   4884 = MIP6OptMsgAuth - basic dissection
   4885 p = MIP6OptMsgAuth(b'\x09\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA')
   4886 p.otype == 9 and p.olen == 17 and p.subtype == 1 and p.mspi == 0 and p.authdata == b"A"*12
   4887 
   4888 = MIP6OptMsgAuth - build with specific values
   4889 raw(MIP6OptMsgAuth(authdata="B"*16, mspi=0xeeeeeeee, subtype=0xff)) == b'\t\x15\xff\xee\xee\xee\xeeBBBBBBBBBBBBBBBB'
   4890 
   4891 = MIP6OptMsgAuth - dissection with specific values
   4892 p = MIP6OptMsgAuth(b'\t\x15\xff\xee\xee\xee\xeeBBBBBBBBBBBBBBBB')
   4893 p.otype == 9 and p.olen == 21 and p.subtype == 255 and p.mspi == 0xeeeeeeee and p.authdata == b"B"*16
   4894 
   4895 
   4896 ############
   4897 ############
   4898 + Mobility Options - Replay Protection
   4899 
   4900 = MIP6OptReplayProtection - basic build
   4901 raw(MIP6OptReplayProtection()) == b'\n\x08\x00\x00\x00\x00\x00\x00\x00\x00'
   4902 
   4903 = MIP6OptReplayProtection - basic dissection
   4904 p = MIP6OptReplayProtection(b'\n\x08\x00\x00\x00\x00\x00\x00\x00\x00')
   4905 p.otype == 10 and p.olen == 8 and p.timestamp == 0
   4906 
   4907 = MIP6OptReplayProtection - build with specific values
   4908 s = raw(MIP6OptReplayProtection(olen=42, timestamp=(72*31536000)<<32))
   4909 s == b'\n*\x87V|\x00\x00\x00\x00\x00'
   4910 
   4911 = MIP6OptReplayProtection - dissection with specific values
   4912 p = MIP6OptReplayProtection(s)
   4913 p.otype == 10 and p.olen == 42 and p.timestamp == 9752118382559232000
   4914 p.fields_desc[-1].i2repr("", p.timestamp) == 'Mon, 13 Dec 1971 23:50:39 +0000 (9752118382559232000)'
   4915 
   4916 
   4917 ############
   4918 ############
   4919 + Mobility Options - CGA Parameters
   4920 = MIP6OptCGAParams
   4921 
   4922 
   4923 ############
   4924 ############
   4925 + Mobility Options - Signature
   4926 = MIP6OptSignature
   4927 
   4928 
   4929 ############
   4930 ############
   4931 + Mobility Options - Permanent Home Keygen Token
   4932 = MIP6OptHomeKeygenToken
   4933 
   4934 
   4935 ############
   4936 ############
   4937 + Mobility Options - Care-of Test Init
   4938 = MIP6OptCareOfTestInit
   4939 
   4940 
   4941 ############
   4942 ############
   4943 + Mobility Options - Care-of Test
   4944 = MIP6OptCareOfTest
   4945 
   4946 
   4947 ############
   4948 ############
   4949 + Mobility Options - Automatic Padding - MIP6OptBRAdvice
   4950 =  Mobility Options - Automatic Padding - MIP6OptBRAdvice
   4951 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptBRAdvice()]))                        ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x02\x02\x00\x00'
   4952 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptBRAdvice()]))                 ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x00\x02\x02\x00\x00\x01\x04\x00\x00\x00\x00'
   4953 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptBRAdvice()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x02\x02\x00\x00\x01\x04\x00\x00\x00\x00'
   4954 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptBRAdvice()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x00\x02\x02\x00\x00\x01\x02\x00\x00'
   4955 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptBRAdvice()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x02\x02\x00\x00\x01\x02\x00\x00'
   4956 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptBRAdvice()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x00\x02\x02\x00\x00\x01\x00'
   4957 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptBRAdvice()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x02\x02\x00\x00\x01\x00'
   4958 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptBRAdvice()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x00\x02\x02\x00\x00'
   4959 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptBRAdvice()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x02\x02\x00\x00'
   4960 a and b and c and d and e and g and h and i and j
   4961                                                 
   4962 ############
   4963 ############
   4964 + Mobility Options - Automatic Padding - MIP6OptAltCoA           
   4965 =  Mobility Options - Automatic Padding - MIP6OptAltCoA          
   4966 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptAltCoA()]))                        ==b';\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'
   4967 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptAltCoA()]))                 ==b';\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'
   4968 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptAltCoA()])) ==b';\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'
   4969 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptAltCoA()])) ==b';\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'
   4970 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptAltCoA()])) ==b';\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'
   4971 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptAltCoA()])) ==b';\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'
   4972 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptAltCoA()])) ==b';\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'
   4973 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptAltCoA()])) ==b';\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'
   4974 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptAltCoA()])) ==b';\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'
   4975 a and b and c and d and e and g and h and i and j
   4976 
   4977                                                 
   4978 ############
   4979 ############
   4980 + Mobility Options - Automatic Padding - MIP6OptNonceIndices                             
   4981 =  Mobility Options - Automatic Padding - MIP6OptNonceIndices                            
   4982 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptNonceIndices()]))                        ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x04\x10\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00'
   4983 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptNonceIndices()]))                 ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x00\x04\x10\x00\x00\x00\x00\x01\x02\x00\x00'
   4984 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptNonceIndices()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x04\x10\x00\x00\x00\x00\x01\x02\x00\x00'
   4985 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptNonceIndices()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x00\x04\x10\x00\x00\x00\x00\x01\x00'
   4986 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptNonceIndices()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x04\x10\x00\x00\x00\x00\x01\x00'
   4987 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptNonceIndices()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x00\x04\x10\x00\x00\x00\x00'
   4988 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptNonceIndices()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x04\x10\x00\x00\x00\x00'
   4989 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptNonceIndices()])) ==b';\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'
   4990 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptNonceIndices()])) ==b';\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'
   4991 a and b and c and d and e and g and h and i and j
   4992 
   4993                                                 
   4994 ############
   4995 ############
   4996 + Mobility Options - Automatic Padding - MIP6OptBindingAuthData                          
   4997 =  Mobility Options - Automatic Padding - MIP6OptBindingAuthData                                 
   4998 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptBindingAuthData()]))                        ==b';\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'
   4999 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptBindingAuthData()]))                 ==b';\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'
   5000 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptBindingAuthData()])) ==b';\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'
   5001 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptBindingAuthData()])) ==b';\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'
   5002 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptBindingAuthData()])) ==b';\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'
   5003 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptBindingAuthData()])) ==b';\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'
   5004 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptBindingAuthData()])) ==b';\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'
   5005 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptBindingAuthData()])) ==b';\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'
   5006 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptBindingAuthData()])) ==b';\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'
   5007 a and b and c and d and e and g and h and i and j
   5008 
   5009                                                 
   5010 ############
   5011 ############
   5012 + Mobility Options - Automatic Padding - MIP6OptMobNetPrefix                             
   5013 =  Mobility Options - Automatic Padding - MIP6OptMobNetPrefix                            
   5014 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptMobNetPrefix()]))                        == b';\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'
   5015 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptMobNetPrefix()]))                 == b';\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'
   5016 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptMobNetPrefix()])) == b';\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'
   5017 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptMobNetPrefix()])) == b';\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'
   5018 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptMobNetPrefix()])) == b';\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'
   5019 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptMobNetPrefix()])) == b';\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'
   5020 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptMobNetPrefix()])) == b';\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'
   5021 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptMobNetPrefix()])) == b';\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'
   5022 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptMobNetPrefix()])) == b';\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'
   5023 a and b and c and d and e and g and h and i and j
   5024 
   5025                                                 
   5026 ############
   5027 ############
   5028 + Mobility Options - Automatic Padding - MIP6OptLLAddr                           
   5029 =  Mobility Options - Automatic Padding - MIP6OptLLAddr                          
   5030 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptLLAddr()]))                        ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00'
   5031 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptLLAddr()]))                 ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x00'
   5032 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptLLAddr()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00'
   5033 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptLLAddr()])) ==b';\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'
   5034 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptLLAddr()])) ==b';\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'
   5035 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptLLAddr()])) ==b';\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'
   5036 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptLLAddr()])) ==b';\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'
   5037 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptLLAddr()])) ==b';\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'
   5038 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptLLAddr()])) ==b';\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'
   5039 a and b and c and d and e and g and h and i and j
   5040 
   5041                                                 
   5042 ############
   5043 ############
   5044 + Mobility Options - Automatic Padding - MIP6OptMNID                             
   5045 =  Mobility Options - Automatic Padding - MIP6OptMNID                            
   5046 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptMNID()]))                        ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x08\x01\x01\x00'
   5047 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptMNID()]))                 ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x08\x01\x01'
   5048 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptMNID()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x08\x01\x01\x01\x05\x00\x00\x00\x00\x00'
   5049 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptMNID()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x08\x01\x01\x01\x04\x00\x00\x00\x00'
   5050 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptMNID()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x08\x01\x01\x01\x03\x00\x00\x00'
   5051 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptMNID()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x08\x01\x01\x01\x02\x00\x00'
   5052 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptMNID()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x08\x01\x01\x01\x01\x00'
   5053 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptMNID()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x08\x01\x01\x01\x00'
   5054 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptMNID()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x08\x01\x01\x00'
   5055 a and b and c and d and e and g and h and i and j
   5056 
   5057                                                 
   5058 ############
   5059 ############
   5060 + Mobility Options - Automatic Padding - MIP6OptMsgAuth                          
   5061 =  Mobility Options - Automatic Padding - MIP6OptMsgAuth                                 
   5062 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptMsgAuth()]))                        ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA'
   5063 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptMsgAuth()]))                 ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA'
   5064 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptMsgAuth()])) ==b';\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'
   5065 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptMsgAuth()])) ==b';\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'
   5066 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptMsgAuth()])) ==b';\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'
   5067 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptMsgAuth()])) ==b';\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'
   5068 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptMsgAuth()])) ==b';\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'
   5069 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptMsgAuth()])) ==b';\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'
   5070 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptMsgAuth()])) ==b';\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'
   5071 a and b and c and d and e and g and h and i and j
   5072 
   5073                                                 
   5074 ############
   5075 ############
   5076 + Mobility Options - Automatic Padding - MIP6OptReplayProtection                                 
   5077 =  Mobility Options - Automatic Padding - MIP6OptReplayProtection                                
   5078 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptReplayProtection()]))                        ==b';\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'
   5079 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptReplayProtection()]))                 ==b';\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'
   5080 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptReplayProtection()])) ==b';\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'
   5081 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptReplayProtection()])) ==b';\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'
   5082 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptReplayProtection()])) ==b';\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'
   5083 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptReplayProtection()])) ==b';\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'
   5084 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptReplayProtection()])) ==b';\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'
   5085 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptReplayProtection()])) ==b';\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'
   5086 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptReplayProtection()])) ==b';\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'
   5087 a and b and c and d and e and g and h and i and j
   5088 
   5089                                                 
   5090 ############
   5091 ############
   5092 + Mobility Options - Automatic Padding - MIP6OptCGAParamsReq                             
   5093 =  Mobility Options - Automatic Padding - MIP6OptCGAParamsReq                            
   5094 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptCGAParamsReq()]))                        ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x0b\x00\x01\x00'
   5095 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptCGAParamsReq()]))                 ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x0b\x00\x00'
   5096 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptCGAParamsReq()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x0b\x00'
   5097 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptCGAParamsReq()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x0b\x00\x01\x05\x00\x00\x00\x00\x00'
   5098 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptCGAParamsReq()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x0b\x00\x01\x04\x00\x00\x00\x00'
   5099 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptCGAParamsReq()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x0b\x00\x01\x03\x00\x00\x00'
   5100 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptCGAParamsReq()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x0b\x00\x01\x02\x00\x00'
   5101 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptCGAParamsReq()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x0b\x00\x01\x01\x00'
   5102 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptCGAParamsReq()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x0b\x00\x01\x00'
   5103 a and b and c and d and e and g and h and i and j
   5104                                                 
   5105 
   5106 ############
   5107 ############
   5108 + Mobility Options - Automatic Padding - MIP6OptCGAParams                                
   5109 =  Mobility Options - Automatic Padding - MIP6OptCGAParams                               
   5110 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptCGAParams()]))                        ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x0c\x00\x01\x00'
   5111 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptCGAParams()]))                 ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x0c\x00\x00'
   5112 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptCGAParams()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x0c\x00'
   5113 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptCGAParams()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x0c\x00\x01\x05\x00\x00\x00\x00\x00'
   5114 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptCGAParams()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x0c\x00\x01\x04\x00\x00\x00\x00'
   5115 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptCGAParams()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x0c\x00\x01\x03\x00\x00\x00'
   5116 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptCGAParams()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x0c\x00\x01\x02\x00\x00'
   5117 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptCGAParams()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x0c\x00\x01\x01\x00'
   5118 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptCGAParams()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x0c\x00\x01\x00'
   5119 a and b and c and d and e and g and h and i and j
   5120 
   5121                                                 
   5122 ############
   5123 ############
   5124 + Mobility Options - Automatic Padding - MIP6OptSignature                                
   5125 =  Mobility Options - Automatic Padding - MIP6OptSignature                               
   5126 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptSignature()]))                        ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\r\x00\x01\x00'
   5127 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptSignature()]))                 ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\r\x00\x00'
   5128 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptSignature()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\r\x00'
   5129 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptSignature()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\r\x00\x01\x05\x00\x00\x00\x00\x00'
   5130 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptSignature()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\r\x00\x01\x04\x00\x00\x00\x00'
   5131 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptSignature()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\r\x00\x01\x03\x00\x00\x00'
   5132 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptSignature()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\r\x00\x01\x02\x00\x00'
   5133 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptSignature()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\r\x00\x01\x01\x00'
   5134 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptSignature()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\r\x00\x01\x00'
   5135 a and b and c and d and e and g and h and i and j
   5136 
   5137                                                 
   5138 ############
   5139 ############
   5140 + Mobility Options - Automatic Padding - MIP6OptHomeKeygenToken                          
   5141 =  Mobility Options - Automatic Padding - MIP6OptHomeKeygenToken                                 
   5142 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptHomeKeygenToken()]))                        ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x0e\x00\x01\x00'
   5143 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptHomeKeygenToken()]))                 ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x0e\x00\x00'
   5144 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptHomeKeygenToken()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x0e\x00'
   5145 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptHomeKeygenToken()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x0e\x00\x01\x05\x00\x00\x00\x00\x00'
   5146 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptHomeKeygenToken()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x0e\x00\x01\x04\x00\x00\x00\x00'
   5147 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptHomeKeygenToken()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x0e\x00\x01\x03\x00\x00\x00'
   5148 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptHomeKeygenToken()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x0e\x00\x01\x02\x00\x00'
   5149 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptHomeKeygenToken()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x0e\x00\x01\x01\x00'
   5150 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptHomeKeygenToken()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x0e\x00\x01\x00'
   5151 a and b and c and d and e and g and h and i and j
   5152 
   5153                                                 
   5154 ############
   5155 ############
   5156 + Mobility Options - Automatic Padding - MIP6OptCareOfTestInit                           
   5157 =  Mobility Options - Automatic Padding - MIP6OptCareOfTestInit                          
   5158 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptCareOfTestInit()]))                        ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x0f\x00\x01\x00'
   5159 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptCareOfTestInit()]))                 ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x0f\x00\x00'
   5160 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptCareOfTestInit()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x0f\x00'
   5161 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptCareOfTestInit()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x0f\x00\x01\x05\x00\x00\x00\x00\x00'
   5162 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptCareOfTestInit()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x0f\x00\x01\x04\x00\x00\x00\x00'
   5163 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptCareOfTestInit()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x0f\x00\x01\x03\x00\x00\x00'
   5164 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptCareOfTestInit()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x0f\x00\x01\x02\x00\x00'
   5165 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptCareOfTestInit()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x0f\x00\x01\x01\x00'
   5166 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptCareOfTestInit()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x0f\x00\x01\x00'
   5167 a and b and c and d and e and g and h and i and j
   5168 
   5169                                                 
   5170 ############
   5171 ############
   5172 + Mobility Options - Automatic Padding - MIP6OptCareOfTest                               
   5173 =  Mobility Options - Automatic Padding - MIP6OptCareOfTest                              
   5174 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptCareOfTest()]))                        ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00'
   5175 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptCareOfTest()]))                 ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   5176 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptCareOfTest()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00'
   5177 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptCareOfTest()])) ==b';\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'
   5178 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptCareOfTest()])) ==b';\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'
   5179 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptCareOfTest()])) ==b';\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'
   5180 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptCareOfTest()])) ==b';\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'
   5181 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptCareOfTest()])) ==b';\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'
   5182 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptCareOfTest()])) ==b';\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'
   5183 a and b and c and d and e and g and h and i and j
   5184 
   5185 
   5186 ############
   5187 ############
   5188 + Binding Refresh Request Message
   5189 = MIP6MH_BRR - Build (default values)
   5190 raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_BRR()) == b'`\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'
   5191 
   5192 = MIP6MH_BRR - Build with specific values
   5193 raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_BRR(nh=0xff, res=0xee, res2=0xaaaa, options=[MIP6OptLLAddr(), MIP6OptAltCoA()])) == b'`\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'
   5194 
   5195 = MIP6MH_BRR - Basic dissection
   5196 a=IPv6(b'`\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')
   5197 b=a.payload
   5198 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 == []
   5199 
   5200 = MIP6MH_BRR - Dissection with specific values
   5201 a=IPv6(b'`\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')
   5202 b=a.payload
   5203 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)
   5204 
   5205 = MIP6MH_BRR / MIP6MH_BU / MIP6MH_BA hashret() and answers()
   5206 hoa="2001:db8:9999::1"
   5207 coa="2001:db8:7777::1"
   5208 cn="2001:db8:8888::1"
   5209 ha="2001db8:6666::1"
   5210 a=IPv6(raw(IPv6(src=cn, dst=hoa)/MIP6MH_BRR()))
   5211 b=IPv6(raw(IPv6(src=coa, dst=cn)/IPv6ExtHdrDestOpt(options=HAO(hoa=hoa))/MIP6MH_BU(flags=0x01)))
   5212 b2=IPv6(raw(IPv6(src=coa, dst=cn)/IPv6ExtHdrDestOpt(options=HAO(hoa=hoa))/MIP6MH_BU(flags=~0x01)))
   5213 c=IPv6(raw(IPv6(src=cn, dst=coa)/IPv6ExtHdrRouting(type=2, addresses=[hoa])/MIP6MH_BA()))
   5214 b.answers(a) and not a.answers(b) and c.answers(b) and not b.answers(c) and not c.answers(b2)
   5215 
   5216 len(b[IPv6ExtHdrDestOpt].options) == 2
   5217 
   5218 
   5219 ############
   5220 ############
   5221 + Home Test Init Message
   5222 
   5223 = MIP6MH_HoTI - Build (default values)
   5224 raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_HoTI()) == b'`\x00\x00\x00\x00\x10\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;\x01\x01\x00g\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   5225 
   5226 = MIP6MH_HoTI - Dissection (default values)
   5227 a=IPv6(b'`\x00\x00\x00\x00\x10\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;\x01\x01\x00g\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
   5228 b = a.payload
   5229 a.nh == 135 and isinstance(b, MIP6MH_HoTI) and b.nh==59 and b.mhtype == 1 and b.len== 1 and b.res == 0 and b.cksum == 0x67f2 and b.cookie == b'\x00'*8
   5230 
   5231 
   5232 = MIP6MH_HoTI - Build (specific values)
   5233 raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_HoTI(res=0x77, cksum=0x8899, cookie=b"\xAA"*8)) == b'`\x00\x00\x00\x00\x10\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;\x01\x01w\x88\x99\x00\x00\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'
   5234 
   5235 = MIP6MH_HoTI - Dissection (specific values)
   5236 a=IPv6(b'`\x00\x00\x00\x00\x10\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;\x01\x01w\x88\x99\x00\x00\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa')
   5237 b=a.payload
   5238 a.nh == 135 and isinstance(b, MIP6MH_HoTI) and b.nh==59 and b.mhtype == 1 and b.len == 1 and b.res == 0x77 and b.cksum == 0x8899 and b.cookie == b'\xAA'*8
   5239 
   5240 
   5241 ############
   5242 ############
   5243 + Care-of Test Init Message
   5244 
   5245 = MIP6MH_CoTI - Build (default values)
   5246 raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_CoTI()) == b'`\x00\x00\x00\x00\x10\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;\x01\x02\x00f\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   5247 
   5248 = MIP6MH_CoTI - Dissection (default values)
   5249 a=IPv6(b'`\x00\x00\x00\x00\x10\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;\x01\x02\x00f\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
   5250 b = a.payload
   5251 a.nh == 135 and isinstance(b, MIP6MH_CoTI) and b.nh==59 and b.mhtype == 2 and b.len== 1 and b.res == 0 and b.cksum == 0x66f2 and b.cookie == b'\x00'*8
   5252 
   5253 = MIP6MH_CoTI - Build (specific values)
   5254 raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_CoTI(res=0x77, cksum=0x8899, cookie=b"\xAA"*8)) == b'`\x00\x00\x00\x00\x10\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;\x01\x02w\x88\x99\x00\x00\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'
   5255 
   5256 = MIP6MH_CoTI - Dissection (specific values)
   5257 a=IPv6(b'`\x00\x00\x00\x00\x10\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;\x01\x02w\x88\x99\x00\x00\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa')
   5258 b=a.payload
   5259 a.nh == 135 and isinstance(b, MIP6MH_CoTI) and b.nh==59 and b.mhtype == 2 and b.len == 1 and b.res == 0x77 and b.cksum == 0x8899 and b.cookie == b'\xAA'*8
   5260 
   5261 
   5262 ############
   5263 ############
   5264 + Home Test Message
   5265 
   5266 = MIP6MH_HoT - Build (default values)
   5267 raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_HoT()) == b'`\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'
   5268 
   5269 = MIP6MH_HoT - Dissection (default values)
   5270 a=IPv6(b'`\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')
   5271 b = a.payload
   5272 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 == b'\x00'*8 and b.token == b'\x00'*8
   5273 
   5274 = MIP6MH_HoT - Build (specific values)
   5275 raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_HoT(res=0x77, cksum=0x8899, cookie=b"\xAA"*8, index=0xAABB, token=b'\xCC'*8)) == b'`\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'
   5276 
   5277 = MIP6MH_HoT - Dissection (specific values)
   5278 a=IPv6(b'`\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')
   5279 b = a.payload
   5280 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 == b'\xAA'*8 and b.token == b'\xCC'*8
   5281 
   5282 = MIP6MH_HoT answers
   5283 a1, a2 = "2001:db8::1", "2001:db8::2"
   5284 cookie = RandString(8)._fix()
   5285 p1 = IPv6(src=a1, dst=a2)/MIP6MH_HoTI(cookie=cookie)
   5286 p2 = IPv6(src=a2, dst=a1)/MIP6MH_HoT(cookie=cookie)
   5287 p2_ko = IPv6(src=a2, dst=a1)/MIP6MH_HoT(cookie="".join(chr((orb(b'\xff') + 1) % 256)))
   5288 assert p1.hashret() == p2.hashret() and p2.answers(p1) and not p1.answers(p2)
   5289 assert p1.hashret() != p2_ko.hashret() and not p2_ko.answers(p1) and not p1.answers(p2_ko)
   5290 
   5291 
   5292 ############
   5293 ############
   5294 + Care-of Test Message
   5295 
   5296 = MIP6MH_CoT - Build (default values)
   5297 raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_CoT()) == b'`\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'
   5298 
   5299 = MIP6MH_CoT - Dissection (default values)
   5300 a=IPv6(b'`\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')
   5301 b = a.payload
   5302 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 == b'\x00'*8 and b.token == b'\x00'*8
   5303 
   5304 = MIP6MH_CoT - Build (specific values)
   5305 raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_CoT(res=0x77, cksum=0x8899, cookie=b"\xAA"*8, index=0xAABB, token=b'\xCC'*8)) == b'`\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'
   5306 
   5307 = MIP6MH_CoT - Dissection (specific values)
   5308 a=IPv6(b'`\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')
   5309 b = a.payload
   5310 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 == b'\xAA'*8 and b.token == b'\xCC'*8
   5311 
   5312 
   5313 ############
   5314 ############
   5315 + Binding Update Message
   5316 
   5317 = MIP6MH_BU - build (default values)
   5318 s= b'`\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'
   5319 raw(IPv6()/IPv6ExtHdrDestOpt(options=[HAO()])/MIP6MH_BU()) == s
   5320 
   5321 = MIP6MH_BU - dissection (default values)
   5322 p = IPv6(s)
   5323 p[MIP6MH_BU].len == 1
   5324 
   5325 = MIP6MH_BU - build
   5326 s = b'`\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'
   5327 raw(IPv6()/IPv6ExtHdrDestOpt(options=[HAO(hoa='2001:db8::cafe')])/MIP6MH_BU(mhtime=42, options=[MIP6OptAltCoA(),MIP6OptMobNetPrefix()])) == s
   5328 
   5329 = MIP6MH_BU - dissection
   5330 p = IPv6(s)
   5331 p[MIP6MH_BU].cksum == 0xeaf2 and p[MIP6MH_BU].len == 6 and len(p[MIP6MH_BU].options) == 4 and p[MIP6MH_BU].mhtime == 42
   5332 
   5333 
   5334 ############
   5335 ############
   5336 + Binding ACK Message
   5337 
   5338 =  MIP6MH_BA - build
   5339 s = b'`\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'
   5340 raw(IPv6()/MIP6MH_BA(mhtime=42)) == s
   5341 
   5342 =  MIP6MH_BA - dissection
   5343 p = IPv6(s)
   5344 p[MIP6MH_BA].cksum == 0xbcb9 and p[MIP6MH_BA].len == 1 and len(p[MIP6MH_BA].options) == 1 and p[MIP6MH_BA].mhtime == 42
   5345 
   5346 
   5347 ############
   5348 ############
   5349 + Binding ERR Message
   5350 
   5351 =  MIP6MH_BE - build
   5352 s = b'`\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'
   5353 raw(IPv6()/MIP6MH_BE(status=2, ha='1::2')) == s
   5354 
   5355 =  MIP6MH_BE - dissection
   5356 p = IPv6(s)
   5357 p[MIP6MH_BE].cksum=0xba10 and p[MIP6MH_BE].len == 1 and len(p[MIP6MH_BE].options) == 1
   5358 
   5359 
   5360 ############
   5361 ############
   5362 + Netflow v5
   5363 
   5364 = NetflowHeaderV5 - basic building
   5365 
   5366 raw(NetflowHeader()/NetflowHeaderV5()) == b'\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   5367 
   5368 raw(NetflowHeaderV5(engineID=42)) == b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00*\x00\x00'
   5369 
   5370 raw(NetflowRecordV5(dst="192.168.0.1")) == b'\x7f\x00\x00\x01\xc0\xa8\x00\x01\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\x02\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   5371 
   5372 raw(NetflowHeader()/NetflowHeaderV5(count=1)/NetflowRecordV5(dst="192.168.0.1")) == b'\x00\x05\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x01\xc0\xa8\x00\x01\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\x02\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   5373 
   5374 
   5375 = NetflowHeaderV5 - basic dissection
   5376 
   5377 nf5 = NetflowHeader(b'\x00\x05\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x01\x7f\x00\x00\x01\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\x02\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x01\x7f\x00\x00\x01\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\x02\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00')
   5378 nf5.version == 5 and nf5[NetflowHeaderV5].count == 2 and isinstance(nf5[NetflowRecordV5].payload, NetflowRecordV5)
   5379 
   5380 ############
   5381 ############
   5382 + Netflow v9
   5383 
   5384 = NetflowHeaderV9 - advanced building
   5385 
   5386 import time
   5387 
   5388 pkt = NetflowHeader()/\
   5389     NetflowHeaderV9(unixSecs=int(time.time()))/\
   5390     NetflowFlowsetV9(templates=[
   5391         NetflowTemplateV9(templateID=258, template_fields=[
   5392             NetflowTemplateFieldV9(fieldType=1),
   5393             NetflowTemplateFieldV9(fieldType=62),
   5394         ]),
   5395         NetflowTemplateV9(templateID=257, template_fields=[
   5396             NetflowTemplateFieldV9(fieldType=1),
   5397             NetflowTemplateFieldV9(fieldType=62),
   5398         ]),
   5399     ])/NetflowDataflowsetV9(templateID=258, records=[
   5400         NetflowRecordV9(fieldValue=b"\x01\x02\x03\x05"),
   5401         NetflowRecordV9(fieldValue=b"\x05\x03\x02\x01\x04\x03\x02\x01\x04\x03\x02\x01\x04\x03\x02\x01"),
   5402     ])/NetflowDataflowsetV9(templateID=257, records=[
   5403         NetflowRecordV9(fieldValue=b"\x01\x02\x03\x04"),
   5404         NetflowRecordV9(fieldValue=b"\x04\x03\x02\x01\x04\x03\x02\x01\x04\x03\x02\x01\x04\x03\x02\x01"),
   5405     ])/NetflowOptionsFlowsetV9(templateID=256, scopes=[NetflowOptionsFlowsetScopeV9(scopeFieldType=1, scopeFieldlength=4),
   5406                                                        NetflowOptionsFlowsetScopeV9(scopeFieldType=1, scopeFieldlength=3)], 
   5407                                                options=[NetflowOptionsFlowsetOptionV9(optionFieldType=1, optionFieldlength=2),
   5408                                                         NetflowOptionsFlowsetOptionV9(optionFieldType=1, optionFieldlength=1)])/\
   5409     NetflowOptionsDataRecordV9(templateID=256, records=[NetflowOptionsRecordScopeV9(fieldValue=b"\x01\x02\x03\x04"),
   5410                                                         NetflowOptionsRecordScopeV9(fieldValue=b"\x01\x02\x03"),
   5411                                                         NetflowOptionsRecordOptionV9(fieldValue=b"\x01\x02"),
   5412                                                         NetflowOptionsRecordOptionV9(fieldValue=b"\x01")])
   5413 
   5414 assert pkt[NetflowFlowsetV9].templates[0].template_fields[0].fieldLength == 4
   5415 assert pkt[NetflowFlowsetV9].templates[0].template_fields[1].fieldLength == 16
   5416 
   5417 = NetflowHeaderV9 - advanced dissection
   5418 
   5419 d = NetflowHeader(raw(pkt))
   5420 d.show()
   5421 assert len(d[NetflowDataflowsetV9].records) == 2
   5422 assert d.getlayer(NetflowDataflowsetV9, templateID=257).records[0].fieldValue == b"\x01\x02\x03\x04"
   5423 assert d.getlayer(NetflowDataflowsetV9, templateID=257).records[1].fieldValue == b"\x04\x03\x02\x01\x04\x03\x02\x01\x04\x03\x02\x01\x04\x03\x02\x01"
   5424 
   5425 assert d.getlayer(NetflowDataflowsetV9, templateID=258).records[0].fieldValue == b"\x01\x02\x03\x05"
   5426 assert d.getlayer(NetflowDataflowsetV9, templateID=258).records[1].fieldValue == b"\x05\x03\x02\x01\x04\x03\x02\x01\x04\x03\x02\x01\x04\x03\x02\x01"
   5427 
   5428 assert d[NetflowOptionsFlowsetV9].scopes[0].scopeFieldType == 1
   5429 assert d[NetflowOptionsDataRecordV9].records[1].fieldValue == b"\x01\x02\x03"
   5430 assert d[NetflowOptionsDataRecordV9].records[3].fieldValue == b"\x01"
   5431 
   5432 ############
   5433 ############
   5434 + pcap / pcapng format support
   5435 
   5436 = Variable creations
   5437 from io import BytesIO
   5438 pcapfile = BytesIO(b'\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00e\x00\x00\x00\xcf\xc5\xacVo*\n\x00(\x00\x00\x00(\x00\x00\x00E\x00\x00(\x00\x01\x00\x00@\x06|\xcd\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91|\x00\x00\xcf\xc5\xacV_-\n\x00\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x11|\xce\x7f\x00\x00\x01\x7f\x00\x00\x01\x005\x005\x00\x08\x01r\xcf\xc5\xacV\xf90\n\x00\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x01|\xde\x7f\x00\x00\x01\x7f\x00\x00\x01\x08\x00\xf7\xff\x00\x00\x00\x00')
   5439 pcapngfile = BytesIO(b'\n\r\r\n\\\x00\x00\x00M<+\x1a\x01\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00,\x00File created by merging: \nFile1: test.pcap \n\x04\x00\x08\x00mergecap\x00\x00\x00\x00\\\x00\x00\x00\x01\x00\x00\x00\\\x00\x00\x00e\x00\x00\x00\xff\xff\x00\x00\x02\x006\x00Unknown/not available in original file format(libpcap)\x00\x00\t\x00\x01\x00\x06\x00\x00\x00\x00\x00\x00\x00\\\x00\x00\x00\x06\x00\x00\x00H\x00\x00\x00\x00\x00\x00\x00\x8d*\x05\x00/\xfc[\xcd(\x00\x00\x00(\x00\x00\x00E\x00\x00(\x00\x01\x00\x00@\x06|\xcd\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91|\x00\x00H\x00\x00\x00\x06\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x8d*\x05\x00\x1f\xff[\xcd\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x11|\xce\x7f\x00\x00\x01\x7f\x00\x00\x01\x005\x005\x00\x08\x01r<\x00\x00\x00\x06\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x8d*\x05\x00\xb9\x02\\\xcd\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x01|\xde\x7f\x00\x00\x01\x7f\x00\x00\x01\x08\x00\xf7\xff\x00\x00\x00\x00<\x00\x00\x00')
   5440 pcapnanofile = BytesIO(b"M<\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00e\x00\x00\x00\xcf\xc5\xacV\xc9\xc1\xb5'(\x00\x00\x00(\x00\x00\x00E\x00\x00(\x00\x01\x00\x00@\x06|\xcd\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91|\x00\x00\xcf\xc5\xacV-;\xc1'\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x11|\xce\x7f\x00\x00\x01\x7f\x00\x00\x01\x005\x005\x00\x08\x01r\xcf\xc5\xacV\x9aL\xcf'\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x01|\xde\x7f\x00\x00\x01\x7f\x00\x00\x01\x08\x00\xf7\xff\x00\x00\x00\x00")
   5441 
   5442 = Read a pcap file
   5443 pktpcap = rdpcap(pcapfile)
   5444 
   5445 = Read a pcapng file
   5446 pktpcapng = rdpcap(pcapngfile)
   5447 
   5448 = Read a pcap file with nanosecond precision
   5449 pktpcapnano = rdpcap(pcapnanofile)
   5450 
   5451 = Check all packet lists are the same
   5452 assert list(pktpcap) == list(pktpcapng) == list(pktpcapnano)
   5453 assert [p.time for p in pktpcap] == [p.time for p in pktpcapng] == [p.time for p in pktpcapnano]
   5454 
   5455 = Check packets from pcap file
   5456 assert all(IP in pkt for pkt in pktpcap)
   5457 assert all(any(proto in pkt for pkt in pktpcap) for proto in [ICMP, UDP, TCP])
   5458 
   5459 = Check wrpcap()
   5460 import os, tempfile
   5461 fdesc, filename = tempfile.mkstemp()
   5462 fdesc = os.fdopen(fdesc, "wb")
   5463 wrpcap(fdesc, pktpcap)
   5464 fdesc.close()
   5465 
   5466 = Check offline sniff() (by filename)
   5467 assert list(pktpcap) == list(sniff(offline=filename))
   5468 
   5469 = Check offline sniff() (by file object)
   5470 fdesc = open(filename, "rb")
   5471 assert list(pktpcap) == list(sniff(offline=fdesc))
   5472 fdesc.close()
   5473 
   5474 = Check offline sniff() with a filter (by filename)
   5475 ~ tcpdump
   5476 pktpcap_flt = [(proto, sniff(offline=filename, filter=proto.__name__.lower()))
   5477                for proto in [ICMP, UDP, TCP]]
   5478 assert all(list(pktpcap[proto]) == list(packets) for proto, packets in pktpcap_flt)
   5479 
   5480 = Check offline sniff() with a filter (by file object)
   5481 ~ tcpdump
   5482 fdesc = open(filename, "rb")
   5483 pktpcap_tcp = sniff(offline=fdesc, filter="tcp")
   5484 fdesc.close()
   5485 assert list(pktpcap[TCP]) == list(pktpcap_tcp)
   5486 os.unlink(filename)
   5487 
   5488 = Check wrpcap(nano=True)
   5489 fdesc, filename = tempfile.mkstemp()
   5490 fdesc = os.fdopen(fdesc, "wb")
   5491 pktpcapnano[0].time += 0.000000001
   5492 wrpcap(fdesc, pktpcapnano, nano=True)
   5493 fdesc.close()
   5494 pktpcapnanoread = rdpcap(filename)
   5495 assert pktpcapnanoread[0].time == pktpcapnano[0].time
   5496 assert pktpcapnanoread[0].time == pktpcap[0].time + 0.000000001
   5497 os.unlink(filename)
   5498 
   5499 = Check PcapNg with nanosecond precision using obsolete packet block
   5500 * first packet from capture file icmp2.ntar -- https://wiki.wireshark.org/Development/PcapNg?action=AttachFile&do=view&target=icmp2.ntar
   5501 pcapngfile = BytesIO(b'\n\r\r\n\x1c\x00\x00\x00M<+\x1a\x01\x00\x00\x00\xa8\x03\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x01\x00\x00\x00(\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00\r\x00\x01\x00\x04\x04K\x00\t\x00\x01\x00\tK=N\x00\x00\x00\x00(\x00\x00\x00\x02\x00\x00\x00n\x00\x00\x00\x00\x00\x00\x00e\x14\x00\x00)4\'ON\x00\x00\x00N\x00\x00\x00\x00\x12\xf0\x11h\xd6\x00\x13r\t{\xea\x08\x00E\x00\x00<\x90\xa1\x00\x00\x80\x01\x8e\xad\xc0\xa8M\x07\xc0\xa8M\x1a\x08\x00r[\x03\x00\xd8\x00abcdefghijklmnopqrstuvwabcdefghi\xeay$\xf6\x00\x00n\x00\x00\x00')
   5502 pktpcapng = rdpcap(pcapngfile)
   5503 assert len(pktpcapng) == 1
   5504 pkt = pktpcapng[0]
   5505 # weird, but wireshark agrees
   5506 assert pkt.time == 22425.352221737
   5507 assert isinstance(pkt, Ether)
   5508 pkt = pkt.payload
   5509 assert isinstance(pkt, IP)
   5510 pkt = pkt.payload
   5511 assert isinstance(pkt, ICMP)
   5512 pkt = pkt.payload
   5513 assert isinstance(pkt, Raw) and pkt.load == b'abcdefghijklmnopqrstuvwabcdefghi'
   5514 pkt = pkt.payload
   5515 assert isinstance(pkt, Padding) and pkt.load == b'\xeay$\xf6'
   5516 pkt = pkt.payload
   5517 assert isinstance(pkt, NoPayload)
   5518 
   5519 = Check PcapNg using Simple Packet Block
   5520 * previous file with the (obsolete) packet block replaced by a Simple Packet Block
   5521 pcapngfile = BytesIO(b'\n\r\r\n\x1c\x00\x00\x00M<+\x1a\x01\x00\x00\x00\xa8\x03\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x01\x00\x00\x00(\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00\r\x00\x01\x00\x04\x04K\x00\t\x00\x01\x00\tK=N\x00\x00\x00\x00(\x00\x00\x00\x03\x00\x00\x00`\x00\x00\x00N\x00\x00\x00\x00\x12\xf0\x11h\xd6\x00\x13r\t{\xea\x08\x00E\x00\x00<\x90\xa1\x00\x00\x80\x01\x8e\xad\xc0\xa8M\x07\xc0\xa8M\x1a\x08\x00r[\x03\x00\xd8\x00abcdefghijklmnopqrstuvwabcdefghi\xeay$\xf6\x00\x00`\x00\x00\x00')
   5522 pktpcapng = rdpcap(pcapngfile)
   5523 assert len(pktpcapng) == 1
   5524 pkt = pktpcapng[0]
   5525 assert isinstance(pkt, Ether)
   5526 pkt = pkt.payload
   5527 assert isinstance(pkt, IP)
   5528 pkt = pkt.payload
   5529 assert isinstance(pkt, ICMP)
   5530 pkt = pkt.payload
   5531 assert isinstance(pkt, Raw) and pkt.load == b'abcdefghijklmnopqrstuvwabcdefghi'
   5532 pkt = pkt.payload
   5533 assert isinstance(pkt, Padding) and pkt.load == b'\xeay$\xf6'
   5534 pkt = pkt.payload
   5535 assert isinstance(pkt, NoPayload)
   5536 
   5537 = Check tcpdump()
   5538 ~ tcpdump
   5539 * No very specific tests because we do not want to depend on tcpdump output
   5540 pcapfile = BytesIO(b'\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00e\x00\x00\x00\xcf\xc5\xacVo*\n\x00(\x00\x00\x00(\x00\x00\x00E\x00\x00(\x00\x01\x00\x00@\x06|\xcd\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91|\x00\x00\xcf\xc5\xacV_-\n\x00\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x11|\xce\x7f\x00\x00\x01\x7f\x00\x00\x01\x005\x005\x00\x08\x01r\xcf\xc5\xacV\xf90\n\x00\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x01|\xde\x7f\x00\x00\x01\x7f\x00\x00\x01\x08\x00\xf7\xff\x00\x00\x00\x00')
   5541 data = tcpdump(pcapfile, dump=True, args=['-n']).split(b'\n')
   5542 print(data)
   5543 assert b'IP 127.0.0.1.20 > 127.0.0.1.80:' in data[0]
   5544 assert b'IP 127.0.0.1.53 > 127.0.0.1.53:' in data[1]
   5545 assert b'IP 127.0.0.1 > 127.0.0.1:' in data[2]
   5546 
   5547 = Check tcpdump() command with tshark
   5548 ~ tshark
   5549 pcapfile = BytesIO(b'\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00e\x00\x00\x00\xcf\xc5\xacVo*\n\x00(\x00\x00\x00(\x00\x00\x00E\x00\x00(\x00\x01\x00\x00@\x06|\xcd\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91|\x00\x00\xcf\xc5\xacV_-\n\x00\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x11|\xce\x7f\x00\x00\x01\x7f\x00\x00\x01\x005\x005\x00\x08\x01r\xcf\xc5\xacV\xf90\n\x00\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x01|\xde\x7f\x00\x00\x01\x7f\x00\x00\x01\x08\x00\xf7\xff\x00\x00\x00\x00')
   5550 values = [tuple(int(val) for val in line[:-1].split(b'\t')) for line in tcpdump(pcapfile, prog=conf.prog.tshark, getfd=True, args=['-T', 'fields', '-e', 'ip.ttl', '-e', 'ip.proto'])]
   5551 assert values == [(64, 6), (64, 17), (64, 1)]
   5552 
   5553 = Run scapy's tshark command
   5554 ~ netaccess
   5555 tshark(count=1, timeout=3)
   5556 
   5557 = Check Raw IP pcap files
   5558 
   5559 import tempfile
   5560 filename = tempfile.mktemp(suffix=".pcap")
   5561 wrpcap(filename, [IP()/UDP(), IPv6()/UDP()], linktype=DLT_RAW)
   5562 packets = rdpcap(filename)
   5563 assert(isinstance(packets[0], IP) and isinstance(packets[1], IPv6))
   5564 
   5565 ############
   5566 ############
   5567 + LLMNR protocol
   5568 
   5569 = Simple packet dissection
   5570 pkt = Ether(b'\x11\x11\x11\x11\x11\x11\x99\x99\x99\x99\x99\x99\x08\x00E\x00\x00(\x00\x01\x00\x00@\x11:\xa4\xc0\xa8\x00w\x7f\x00\x00\x01\x14\xeb\x14\xeb\x00\x14\x95\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
   5571 assert pkt.sport == 5355
   5572 assert pkt.dport == 5355
   5573 assert pkt[LLMNRQuery].opcode == 0
   5574 
   5575 = Packet build / dissection
   5576 pkt = UDP(raw(UDP()/LLMNRResponse()))
   5577 assert LLMNRResponse in pkt
   5578 assert pkt.qr == 1
   5579 assert pkt.c == 0
   5580 assert pkt.tc == 0
   5581 assert pkt.z == 0
   5582 assert pkt.rcode == 0
   5583 assert pkt.qdcount == 0
   5584 assert pkt.arcount == 0
   5585 assert pkt.nscount == 0
   5586 assert pkt.ancount == 0
   5587 
   5588 = Answers - building
   5589 a = UDP()/LLMNRResponse(id=12)
   5590 b = UDP()/LLMNRQuery(id=12)
   5591 assert a.answers(b)
   5592 assert not b.answers(a)
   5593 assert b.hashret() == b'\x00\x0c'
   5594 
   5595 = Answers - dissecting
   5596 a = Ether(b'\xd0P\x99V\xdd\xf9\x14\x0cv\x8f\xfe(\x08\x00E\x00\x00(\x00\x01\x00\x00@\x11:\xa4\x7f\x00\x00\x01\xc0\xa8\x00w\x14\xeb\x14\xeb\x00\x14\x95\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
   5597 b = Ether(b'\x14\x0cv\x8f\xfe(\xd0P\x99V\xdd\xf9\x08\x00E\x00\x00(\x00\x01\x00\x00@\x11:\xa4\xc0\xa8\x00w\x7f\x00\x00\x01\x14\xeb\x14\xeb\x00\x14\x15\xcf\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00')
   5598 assert b.answers(a)
   5599 assert not a.answers(b)
   5600 
   5601 ############
   5602 ############
   5603 + LLTD protocol
   5604 
   5605 = Simple packet dissection
   5606 pkt = Ether(b'\xff\xff\xff\xff\xff\xff\x86\x14\xf0\xc7[.\x88\xd9\x01\x00\x00\x01\xff\xff\xff\xff\xff\xff\x86\x14\xf0\xc7[.\x00\x00\xfe\xe9[\xa9\xaf\xc1\x0bS[\xa9\xaf\xc1\x0bS\x01\x06}[G\x8f\xec.\x02\x04p\x00\x00\x00\x03\x04\x00\x00\x00\x06\x07\x04\xac\x19\x88\xe4\t\x02\x00l\n\x08\x00\x00\x00\x00\x00\x0fB@\x0c\x04\x00\x08=`\x0e\x00\x0f\x0eT\x00E\x00S\x00T\x00-\x00A\x00P\x00\x12\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x04\x00\x00\x00\x00\x15\x01\x02\x18\x00\x19\x02\x04\x00\x1a\x00\x00')
   5607 assert pkt.dst == pkt.real_dst
   5608 assert pkt.src == pkt.real_src
   5609 assert pkt.current_mapper_address == pkt.apparent_mapper_address
   5610 assert pkt.mac == '7d:5b:47:8f:ec:2e'
   5611 assert pkt.hostname == "TEST-AP"
   5612 assert isinstance(pkt[LLTDAttributeEOP].payload, NoPayload)
   5613 
   5614 = Packet build / dissection
   5615 pkt = Ether(raw(Ether(dst=ETHER_BROADCAST, src=RandMAC()) / LLTD(tos=0, function=0)))
   5616 assert LLTD in pkt
   5617 assert pkt.dst == pkt.real_dst
   5618 assert pkt.src == pkt.real_src
   5619 assert pkt.tos == 0
   5620 assert pkt.function == 0
   5621 
   5622 = Attribute build / dissection
   5623 assert isinstance(LLTDAttribute(), LLTDAttribute)
   5624 assert isinstance(LLTDAttribute(raw(LLTDAttribute())), LLTDAttribute)
   5625 assert all(isinstance(LLTDAttribute(type=i), LLTDAttribute) for i in six.moves.range(256))
   5626 assert all(isinstance(LLTDAttribute(raw(LLTDAttribute(type=i))), LLTDAttribute) for i in six.moves.range(256))
   5627 
   5628 = Large TLV
   5629 m1, m2, seq = RandMAC()._fix(), RandMAC()._fix(), 123
   5630 preqbase = Ether(src=m1, dst=m2) / LLTD() / \
   5631            LLTDQueryLargeTlv(type="Detailed Icon Image")
   5632 prespbase = Ether(src=m2, dst=m1) / LLTD() / \
   5633             LLTDQueryLargeTlvResp()
   5634 plist = []
   5635 pkt = preqbase.copy()
   5636 pkt.seq = seq
   5637 plist.append(Ether(raw(pkt)))
   5638 pkt = prespbase.copy()
   5639 pkt.seq = seq
   5640 pkt.flags = "M"
   5641 pkt.value = "abcd"
   5642 plist.append(Ether(raw(pkt)))
   5643 pkt = preqbase.copy()
   5644 pkt.seq = seq + 1
   5645 pkt.offset = 4
   5646 plist.append(Ether(raw(pkt)))
   5647 pkt = prespbase.copy()
   5648 pkt.seq = seq + 1
   5649 pkt.value = "efg"
   5650 plist.append(Ether(raw(pkt)))
   5651 builder = LargeTlvBuilder()
   5652 builder.parse(plist)
   5653 data = builder.get_data()
   5654 assert len(data) == 1
   5655 key, value = data.popitem()
   5656 assert key.endswith(' [Detailed Icon Image]')
   5657 assert value == 'abcdefg'
   5658 
   5659 
   5660 ############
   5661 ############
   5662 + Test fragment() / defragment() functions
   5663 
   5664 = fragment()
   5665 payloadlen, fragsize = 100, 8
   5666 assert fragsize % 8 == 0
   5667 fragcount = (payloadlen // fragsize) + bool(payloadlen % fragsize)
   5668 * create the packet
   5669 pkt = IP() / ("X" * payloadlen)
   5670 * create the fragments
   5671 frags = fragment(pkt, fragsize)
   5672 * count the fragments
   5673 assert len(frags) == fragcount
   5674 * each fragment except the last one should have MF set
   5675 assert all(p.flags == 1 for p in frags[:-1])
   5676 assert frags[-1].flags == 0
   5677 * each fragment except the last one should have a payload of fragsize bytes
   5678 assert all(len(p.payload) == 8 for p in frags[:-1])
   5679 assert len(frags[-1].payload) == ((payloadlen % fragsize) or fragsize)
   5680 
   5681 = fragment() and overloaded_fields
   5682 pkt1 = Ether() / IP() / UDP()
   5683 pkt2 = fragment(pkt1)[0]
   5684 pkt3 = pkt2.__class__(raw(pkt2))
   5685 assert pkt1[IP].proto == pkt2[IP].proto == pkt3[IP].proto
   5686 
   5687 = fragment() already fragmented packets
   5688 payloadlen = 1480 * 3
   5689 ffrags = fragment(IP() / ("X" * payloadlen), 1480)
   5690 ffrags = fragment(ffrags, 1400)
   5691 len(ffrags) == 6
   5692 * each fragment except the last one should have MF set
   5693 assert all(p.flags == 1 for p in ffrags[:-1])
   5694 assert ffrags[-1].flags == 0
   5695 * fragment offset should be well computed
   5696 plen = 0
   5697 for p in ffrags:
   5698     assert p.frag == plen // 8
   5699     plen += len(p.payload)
   5700 
   5701 assert plen == payloadlen
   5702 
   5703 = defrag()
   5704 nonfrag, unfrag, badfrag = defrag(frags)
   5705 assert not nonfrag
   5706 assert not badfrag
   5707 assert len(unfrag) == 1
   5708 
   5709 = defragment()
   5710 defrags = defragment(frags)
   5711 * we should have one single packet
   5712 assert len(defrags) == 1
   5713 * which should be the same as pkt reconstructed
   5714 assert defrags[0] == IP(raw(pkt))
   5715 
   5716 = defrag() / defragment() - Real DNS packets
   5717 
   5718 import base64
   5719 
   5720 a = base64.b64decode('bnmYJ63mREVTUwEACABFAAV0U8UgADIR+u0EAgIECv0DxAA1sRIL83Z7gbCBgAABAB0AAAANA255YwNnb3YAAP8AAcAMAAYAAQAAA4QAKgZ2d2FsbDDADApob3N0bWFzdGVywAx4Og5wAAA4QAAADhAAJOoAAAACWMAMAC4AAQAAA4QAmwAGCAIAAAOEWWm9jVlgdP0mfQNueWMDZ292AHjCDBL0C1rEKUjsuG6Zg3+Rs6gj6llTABm9UZnWk+rRu6nPqW4N7AEllTYqNK+r6uFJ2KhfG3MDPS1F/M5QCVR8qkcbgrqPVRBJAG67/ZqpGORppQV6ib5qqo4ST5KyrgKpa8R1fWH8Fyp881NWLOZekM3TQyczcLFrvw9FFjdRwAwAAQABAAADhAAEobkenMAMAC4AAQAAA4QAmwABCAIAAAOEWWm9jVlgdP0mfQNueWMDZ292ABW8t5tEv9zTLdB6UsoTtZIF6Kx/c4ukIud8UIGM0XdXnJYx0ZDyPDyLVy2rfwmXdEph3KBWAi5dpRT16nthlMmWPQxD1ecg9rc8jcaTGo8z833fYJjzPT8MpMTxhapu4ANSBVbv3LRBnce2abu9QaoCdlHPFHdNphp6JznCLt4jwAwAMAABAAADhAEIAQEDCAMBAAF77useCfI+6T+m6Tsf2ami8/q5XDtgS0Ae7F0jUZ0cpyYxy/28DLFjJaS57YiwAYaabkkugxsoSv9roqBNZjD+gjoUB+MK8fmfaqqkSOgQuIQLZJeOORWD0gAj8mekw+S84DECylbKyYEGf8CB3/59IfV+YkTcHhXBYrMNxhMK1Eiypz4cgYxXiYUSz7jbOmqE3hU2GinhRmNW4Trt4ImUruSO+iQbTTj6LtCtIsScOF4vn4gcLJURLHOs+mf1NU9Yqq9mPC9wlYZk+8rwqcjVIiRpDmmv83huv4be1x1kkz2YqTFwtc33Fzt6SZk96Qtk2wCgg8ZQqLKGx5uwIIyrwAwAMAABAAADhAEIAQEDCAMBAAGYc7SWbSinSc3u8ZcYlO0+yZcJD1vqC5JARxZjKNzszHxc9dpabBtR9covySVu1YaBVrlxNBzfyFd4PKyjvPcBER5sQImoCikC+flD5NwXJbnrO1SG0Kzp8XXDCZpBASxuBF0vjUSU9yMqp0FywCrIfrbfCcOGAFIVP0M2u8dVuoI4nWbkRFc0hiRefoxc1O2IdpR22GAp2OYeeN2/tnFBz/ZMQitU2IZIKBMybKmWLC96tPcqVdWJX6+M1an1ox0+NqBZuPjsCx0/lZbuB/rLHppJOmkRc7q2Fw/tpHOyWHV+ulCfXem9Up/sbrMcP7uumFz0FeNhBPtg3u5kA5OVwAwAMAABAAADhACIAQADCAMBAAF5mlzmmq8cs6Hff0qZLlGKYCGPlG23HZw2qAd7N2FmrLRqPQ0R/hbnw54MYiIs18zyfm2J+ZmzUvGd+gjHGx3ooRRffQQ4RFLq6g6oxaLTbtvqPFbWt4Kr2GwX3UslgZCzH5mXLNpPI2QoetIcQCNRdcxn5QpWxPppCVXbKdNvvcAMADAAAQAAA4QAiAEAAwgDAQABqeGHtNFc0Yh6Pp/aM+ntlDW1fLwuAWToGQhmnQFBTiIUZlH7QMjwh5oMExNp5/ABUb3qBsyk9CLanRfateRgFJCYCNYofrI4S2yqT5X9vvtCXeIoG/QqMSl3PJk4ClYufIKjMPgl5IyN6yBIMNmmsATlMMu5TxM68a/CLCh92L3ADAAuAAEAAAOEAJsAMAgCAAADhFlpvY1ZYHT9Jn0DbnljA2dvdgAViVpFoYwy9dMUbOPDHTKt/LOtoicvtQbHeXiUSQeBkGWTLyiPc/NTW9ZC4WK5AuSj/0+V')
   5721 b = base64.b64decode('bnmYJ63mREVTUwEACABFAAV0U8UgrDIR+kEEAgIECv0DxApz1F5olFRytjhNlG/JbdW0NSAFeUUF4rBRqsly/h6nFWKoQfih35Lm+BFLE0FoMaikWCjGJQIuf0CXiElMSQifiDM+KTeecNkCgTXADAAuAAEAAAOEARsAMAgCAAADhFlpvY1ZYHT9VwUDbnljA2dvdgAdRZxvC6VlbYUVarYjan0/PlP70gSz1SiYCDZyw5dsGo9vrZd+lMcAm5GFjtKYDXeCb5gVuegzHSNzxDQOa5lVKLQZfXgVHsl3jguCpYwKAygRR3mLBGtnhPrbYcPGMOzIxO6/UE5Hltx9SDqKNe2+rtVeZs5FyHQE5pTVGVjNED9iaauEW9UF3bwEP3K+wLgxWeVycjNry/l4vt9Z0fyTU15kogCZG8MXyStJlzIgdzVZRB96gTJbGBDRFQJfbE2Af+INl0HRY4p+bqQYwFomWg6Tzs30LcqAnkptknb5peUNmQTBI/MU00A6NeVJxkKK3+lf2EuuiJl+nFpfWiKpwAwAMwABAAADhAAJAQAADASqu8zdwAwALgABAAADhACbADMIAgAAA4RZab2NWWB0/SZ9A255YwNnb3YAVhcqgSl33lqjLLFR8pQ2cNhdX7dKZ2gRy0vUHOa+980Nljcj4I36rfjEVJCLKodpbseQl0OeTsbfNfqOmi1VrsypDl+YffyPMtHferm02xBK0agcTMdP/glpuKzdKHTiHTlnSOuBpPnEpgxYPNeBGx8yzMvIaU5rOCxuO49Sh/PADAACAAEAAAOEAAoHdndhbGw0YcAMwAwAAgABAAADhAAKB3Z3YWxsMmHADMAMAAIAAQAAA4QACgd2d2FsbDNhwAzADAACAAEAAAOEAAoHdndhbGwxYcAMwAwALgABAAADhACbAAIIAgAAA4RZab2NWWB0/SZ9A255YwNnb3YANn7LVY7YsKLtpH7LKhUz0SVsM/Gk3T/V8I9wIEZ4vEklM9hI92D2aYe+9EKxOts+/py6itZfANXU197pCufktASDxlH5eWSc9S2uqrRnUNnMUe4p3Jy9ZCGhiHDemgFphKGWYTNZUJoML2+SDzbv9tXo4sSbZiKJCDkNdzSv2lfADAAQAAEAAAOEAEVEZ29vZ2xlLXNpdGUtdmVyaWZpY2F0aW9uPWMycnhTa2VPZUxpSG5iY24tSXhZZm5mQjJQcTQzU3lpeEVka2k2ODZlNDTADAAQAAEAAAOEADc2dj1zcGYxIGlwNDoxNjEuMTg1LjIuMC8yNSBpcDQ6MTY3LjE1My4xMzIuMC8yNSBteCAtYWxswAwALgABAAADhACbABAIAgAAA4RZab2NWWB0/SZ9A255YwNnb3YAjzLOj5HUtVGhi/emNG90g2zK80hrI6gh2d+twgVLYgWebPeTI2D2ylobevXeq5rK5RQgbg2iG1UiTBnlKPgLPYt8ZL+bi+/v5NTaqHfyHFYdKzZeL0dhrmebRbYzG7tzOllcAOOqieeO29Yr4gz1rpiU6g75vkz6yQoHNfmNVMXADAAPAAEAAAOEAAsAZAZ2d2FsbDLADMAMAA8AAQAAA4QACwBkBnZ3YWxsNMAMwAwADwABAAADhAALAAoGdndhbGwzwAzADAAPAAEAAAOEAAsACgZ2d2FsbDXADMAMAA8AAQAAA4QACwAKBnZ3YWxsNsAMwAwADwABAAADhAALAAoGdndhbGw3wAzADAAPAAEAAAOEAAsACgZ2d2FsbDjADMAMAA8AAQAAA4QACwBkBnZ3YWxsMcAMwAwALgABAAADhACbAA8IAgAAA4RZab2NWWB0/SZ9A255YwNnb3YAooXBSj6PfsdBd8sEN/2AA4cvOl2bcioO')
   5722 c = base64.b64decode('bnmYJ63mREVTUwEACABFAAFHU8UBWDIRHcMEAgIECv0DxDtlufeCT1zQktat4aEVA8MF0FO1sNbpEQtqfu5Al//OJISaRvtaArR/tLUj2CoZjS7uEnl7QpP/Ui/gR0YtyLurk9yTw7Vei0lSz4cnaOJqDiTGAKYwzVxjnoR1F3n8lplgQaOalVsHx9UAAQABAAADLAAEobkBA8epAAEAAQAAAywABKG5AQzHvwABAAEAAAMsAASnmYIMx5MAAQABAAADLAAEp5mCDcn9AAEAAQAAAqUABKeZhAvKFAABAAEAAAOEAAShuQIfyisAAQABAAADhAAEobkCKcpCAAEAAQAAA4QABKG5AjPKWQABAAEAAAOEAAShuQI9ynAAAQABAAADhAAEobkCC8nPAAEAAQAAA4QABKG5AgzJ5gABAAEAAAOEAASnmYQMAAApIAAAAAAAAAA=')
   5723 d = base64.b64decode('////////REVTUwEACABFAABOawsAAIARtGoK/QExCv0D/wCJAIkAOry/3wsBEAABAAAAAAAAIEVKRkRFQkZFRUJGQUNBQ0FDQUNBQ0FDQUNBQ0FDQUFBAAAgAAEAABYP/WUAAB6N4XIAAB6E4XsAAACR/24AADyEw3sAABfu6BEAAAkx9s4AABXB6j4AAANe/KEAAAAT/+wAAB7z4QwAAEuXtGgAAB304gsAABTB6z4AAAdv+JAAACCu31EAADm+xkEAABR064sAABl85oMAACTw2w8AADrKxTUAABVk6psAABnF5joAABpA5b8AABjP5zAAAAqV9WoAAAUW+ukAACGS3m0AAAEP/vAAABoa5eUAABYP6fAAABX/6gAAABUq6tUAADXIyjcAABpy5Y0AABzb4yQAABqi5V0AAFXaqiUAAEmRtm4AACrL1TQAAESzu0wAAAzs8xMAAI7LcTQAABxN47IAAAbo+RcAABLr7RQAAB3Q4i8AAAck+NsAABbi6R0AAEdruJQAAJl+ZoEAABDH7zgAACOA3H8AAAB5/4YAABQk69sAAEo6tcUAABJU7asAADO/zEAAABGA7n8AAQ9L8LMAAD1DwrwAAB8F4PoAABbG6TkAACmC1n0AAlHErjkAABG97kIAAELBvT4AAEo0tcsAABtC5L0AAA9u8JEAACBU36sAAAAl/9oAABBO77EAAA9M8LMAAA8r8NQAAAp39YgAABB874MAAEDxvw4AAEgyt80AAGwsk9MAAB1O4rEAAAxL87QAADtmxJkAAATo+xcAAAM8/MMAABl55oYAACKh3V4AACGj3lwAAE5ssZMAAC1x0o4AAAO+/EEAABNy7I0AACYp2dYAACb+2QEAABB974IAABc36MgAAA1c8qMAAAf++AEAABDo7xcAACLq3RUAAA8L8PQAAAAV/+oAACNU3KsAABBv75AAABFI7rcAABuH5HgAABAe7+EAAB++4EEAACBl35oAAB7c4SMAADgJx/YAADeVyGoAACKN3XIAAA/C8D0AAASq+1UAAOHPHjAAABRI67cAAABw/48=')
   5724 
   5725 old_debug_dissector = conf.debug_dissector
   5726 conf.debug_dissector = 0
   5727 plist = PacketList([Ether(x) for x in [a, b, c, d]])
   5728 conf.debug_dissector = old_debug_dissector
   5729 
   5730 left, defragmented, errored = defrag(plist)
   5731 assert len(left) == 1
   5732 assert left[0] == Ether(d)
   5733 assert len(defragmented) == 1
   5734 assert len(defragmented[0]) == 3093
   5735 assert defragmented[0][DNSRR].rrname == b'nyc.gov.'
   5736 assert len(errored) == 0
   5737 
   5738 plist_def = defragment(plist)
   5739 assert len(plist_def) == 2
   5740 assert len(plist_def[0]) == 3093
   5741 assert plist_def[0][DNSRR].rrname == b'nyc.gov.'
   5742 
   5743 = Packet().fragment()
   5744 payloadlen, fragsize = 100, 8
   5745 assert fragsize % 8 == 0
   5746 fragcount = (payloadlen // fragsize) + bool(payloadlen % fragsize)
   5747 * create the packet
   5748 pkt = IP() / ("X" * payloadlen)
   5749 * create the fragments
   5750 frags = pkt.fragment(fragsize)
   5751 * count the fragments
   5752 assert len(frags) == fragcount
   5753 * each fragment except the last one should have MF set
   5754 assert all(p.flags == 1 for p in frags[:-1])
   5755 assert frags[-1].flags == 0
   5756 * each fragment except the last one should have a payload of fragsize bytes
   5757 assert all(len(p.payload) == 8 for p in frags[:-1])
   5758 assert len(frags[-1].payload) == ((payloadlen % fragsize) or fragsize)
   5759 
   5760 = Packet().fragment() and overloaded_fields
   5761 pkt1 = Ether() / IP() / UDP()
   5762 pkt2 = pkt1.fragment()[0]
   5763 pkt3 = pkt2.__class__(raw(pkt2))
   5764 assert pkt1[IP].proto == pkt2[IP].proto == pkt3[IP].proto
   5765 
   5766 = Packet().fragment() already fragmented packets
   5767 payloadlen = 1480 * 3
   5768 ffrags = (IP() / ("X" * payloadlen)).fragment(1480)
   5769 ffrags = reduce(lambda x, y: x + y, (pkt.fragment(1400) for pkt in ffrags))
   5770 len(ffrags) == 6
   5771 * each fragment except the last one should have MF set
   5772 assert all(p.flags == 1 for p in ffrags[:-1])
   5773 assert ffrags[-1].flags == 0
   5774 * fragment offset should be well computed
   5775 plen = 0
   5776 for p in ffrags:
   5777     assert p.frag == plen / 8
   5778     plen += len(p.payload)
   5779 
   5780 assert plen == payloadlen
   5781 
   5782 
   5783 ############
   5784 ############
   5785 + TCP/IP tests
   5786 
   5787 = TCP options: UTO - basic build
   5788 raw(TCP(options=[("UTO", 0xffff)])) == b"\x00\x14\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x60\x02\x20\x00\x00\x00\x00\x00\x1c\x04\xff\xff"
   5789 
   5790 = TCP options: UTO - basic dissection
   5791 uto = TCP(b"\x00\x14\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x60\x02\x20\x00\x00\x00\x00\x00\x1c\x04\xff\xff")
   5792 uto[TCP].options[0][0] == "UTO" and uto[TCP].options[0][1] == 0xffff
   5793 
   5794 = TCP options: SAck - basic build
   5795 raw(TCP(options=[(5, "abcdefgh")])) == b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00\x80\x02 \x00\x00\x00\x00\x00\x05\nabcdefgh\x00\x00"
   5796 
   5797 = TCP options: SAck - basic dissection
   5798 sack = TCP(b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00\x80\x02 \x00\x00\x00\x00\x00\x05\nabcdefgh\x00\x00")
   5799 sack[TCP].options[0][0] == "SAck" and sack[TCP].options[0][1] == (1633837924, 1701209960)
   5800 
   5801 = TCP options: SAckOK - basic build
   5802 raw(TCP(options=[('SAckOK', '')])) == b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00`\x02 \x00\x00\x00\x00\x00\x04\x02\x00\x00"
   5803 
   5804 = TCP options: SAckOK - basic dissection
   5805 sackok = TCP(b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00`\x02 \x00\x00\x00\x00\x00\x04\x02\x00\x00")
   5806 sackok[TCP].options[0][0] == "SAckOK" and sackok[TCP].options[0][1] == b''
   5807 
   5808 = TCP options: EOL - basic build
   5809 raw(TCP(options=[(0, '')])) == b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00`\x02 \x00\x00\x00\x00\x00\x00\x02\x00\x00"
   5810 
   5811 = TCP options: EOL - basic dissection
   5812 eol = TCP(b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00`\x02 \x00\x00\x00\x00\x00\x00\x02\x00\x00")
   5813 eol[TCP].options[0][0] == "EOL" and eol[TCP].options[0][1] == None
   5814 
   5815 = TCP options: malformed - build
   5816 raw(TCP(options=[('unknown', '')])) == raw(TCP())
   5817 
   5818 = TCP options: malformed - dissection
   5819 raw(TCP(b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00`\x02 \x00\x00\x00\x00\x00\x03\x00\x00\x00")) == b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00`\x02 \x00\x00\x00\x00\x00\x03\x00\x00\x00"
   5820 
   5821 = IP, TCP & UDP checksums (these tests highly depend on default values)
   5822 pkt = IP() / TCP()
   5823 bpkt = IP(raw(pkt))
   5824 assert bpkt.chksum == 0x7ccd and bpkt.payload.chksum == 0x917c
   5825 
   5826 pkt = IP(len=40) / TCP()
   5827 bpkt = IP(raw(pkt))
   5828 assert bpkt.chksum == 0x7ccd and bpkt.payload.chksum == 0x917c
   5829 
   5830 pkt = IP(len=40, ihl=5) / TCP()
   5831 bpkt = IP(raw(pkt))
   5832 assert bpkt.chksum == 0x7ccd and bpkt.payload.chksum == 0x917c
   5833 
   5834 pkt = IP() / TCP() / ("A" * 10)
   5835 bpkt = IP(raw(pkt))
   5836 assert bpkt.chksum == 0x7cc3 and bpkt.payload.chksum == 0x4b2c
   5837 
   5838 pkt = IP(len=50) / TCP() / ("A" * 10)
   5839 bpkt = IP(raw(pkt))
   5840 assert bpkt.chksum == 0x7cc3 and bpkt.payload.chksum == 0x4b2c
   5841 
   5842 pkt = IP(len=50, ihl=5) / TCP() / ("A" * 10)
   5843 bpkt = IP(raw(pkt))
   5844 assert bpkt.chksum == 0x7cc3 and bpkt.payload.chksum == 0x4b2c
   5845 
   5846 pkt = IP(options=[IPOption_RR()]) / TCP() / ("A" * 10)
   5847 bpkt = IP(raw(pkt))
   5848 assert bpkt.chksum == 0x70bc and bpkt.payload.chksum == 0x4b2c
   5849 
   5850 pkt = IP(len=54, options=[IPOption_RR()]) / TCP() / ("A" * 10)
   5851 bpkt = IP(raw(pkt))
   5852 assert bpkt.chksum == 0x70bc and bpkt.payload.chksum == 0x4b2c
   5853 
   5854 pkt = IP(len=54, ihl=6, options=[IPOption_RR()]) / TCP() / ("A" * 10)
   5855 bpkt = IP(raw(pkt))
   5856 assert bpkt.chksum == 0x70bc and bpkt.payload.chksum == 0x4b2c
   5857 
   5858 pkt = IP() / UDP()
   5859 bpkt = IP(raw(pkt))
   5860 assert bpkt.chksum == 0x7cce and bpkt.payload.chksum == 0x0172
   5861 
   5862 pkt = IP(len=28) / UDP()
   5863 bpkt = IP(raw(pkt))
   5864 assert bpkt.chksum == 0x7cce and bpkt.payload.chksum == 0x0172
   5865 
   5866 pkt = IP(len=28, ihl=5) / UDP()
   5867 bpkt = IP(raw(pkt))
   5868 assert bpkt.chksum == 0x7cce and bpkt.payload.chksum == 0x0172
   5869 
   5870 pkt = IP() / UDP() / ("A" * 10)
   5871 bpkt = IP(raw(pkt))
   5872 assert bpkt.chksum == 0x7cc4 and bpkt.payload.chksum == 0xbb17
   5873 
   5874 pkt = IP(len=38) / UDP() / ("A" * 10)
   5875 bpkt = IP(raw(pkt))
   5876 assert bpkt.chksum == 0x7cc4 and bpkt.payload.chksum == 0xbb17
   5877 
   5878 pkt = IP(len=38, ihl=5) / UDP() / ("A" * 10)
   5879 bpkt = IP(raw(pkt))
   5880 assert bpkt.chksum == 0x7cc4 and bpkt.payload.chksum == 0xbb17
   5881 
   5882 pkt = IP(options=[IPOption_RR()]) / UDP() / ("A" * 10)
   5883 bpkt = IP(raw(pkt))
   5884 assert bpkt.chksum == 0x70bd and bpkt.payload.chksum == 0xbb17
   5885 
   5886 pkt = IP(len=42, options=[IPOption_RR()]) / UDP() / ("A" * 10)
   5887 bpkt = IP(raw(pkt))
   5888 assert bpkt.chksum == 0x70bd and bpkt.payload.chksum == 0xbb17
   5889 
   5890 pkt = IP(len=42, ihl=6, options=[IPOption_RR()]) / UDP() / ("A" * 10)
   5891 bpkt = IP(raw(pkt))
   5892 assert bpkt.chksum == 0x70bd and bpkt.payload.chksum == 0xbb17
   5893 
   5894 = DNS
   5895 
   5896 * DNS over UDP
   5897 pkt = IP(raw(IP(src="10.0.0.1", dst="8.8.8.8")/UDP(sport=RandShort(), dport=53)/DNS(qd=DNSQR(qname="secdev.org."))))
   5898 assert UDP in pkt and isinstance(pkt[UDP].payload, DNS)
   5899 assert pkt[UDP].dport == 53 and pkt[UDP].length is None
   5900 assert pkt[DNS].qdcount == 1 and pkt[DNS].qd.qname == b"secdev.org."
   5901 
   5902 * DNS over TCP
   5903 pkt = IP(raw(IP(src="10.0.0.1", dst="8.8.8.8")/TCP(sport=RandShort(), dport=53, flags="P")/DNS(qd=DNSQR(qname="secdev.org."))))
   5904 assert TCP in pkt and isinstance(pkt[TCP].payload, DNS)
   5905 assert pkt[TCP].dport == 53 and pkt[DNS].length is not None
   5906 assert pkt[DNS].qdcount == 1 and pkt[DNS].qd.qname == b"secdev.org."
   5907 
   5908 = DNS frame with advanced decompression
   5909 
   5910 a = b'\x01\x00^\x00\x00\xfb$\xa2\xe1\x90\xa9]\x08\x00E\x00\x01P\\\xdd\x00\x00\xff\x11\xbb\x93\xc0\xa8\x00\x88\xe0\x00\x00\xfb\x14\xe9\x14\xe9\x01<*\x81\x00\x00\x84\x00\x00\x00\x00\x03\x00\x00\x00\x04\x01B\x019\x015\x019\x013\x014\x017\x013\x016\x017\x010\x012\x010\x01D\x018\x011\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x018\x01E\x01F\x03ip6\x04arpa\x00\x00\x0c\x80\x01\x00\x00\x00x\x00\x0f\x07Zalmoid\x05local\x00\x011\x01A\x019\x014\x017\x01E\x01A\x014\x01B\x01A\x01F\x01B\x012\x011\x014\x010\x010\x016\x01E\x01F\x017\x011\x01F\x012\x015\x013\x01E\x010\x011\x010\x01A\x012\xc0L\x00\x0c\x80\x01\x00\x00\x00x\x00\x02\xc0`\x03136\x010\x03168\x03192\x07in-addr\xc0P\x00\x0c\x80\x01\x00\x00\x00x\x00\x02\xc0`\xc0\x0c\x00/\x80\x01\x00\x00\x00x\x00\x06\xc0\x0c\x00\x02\x00\x08\xc0o\x00/\x80\x01\x00\x00\x00x\x00\x06\xc0o\x00\x02\x00\x08\xc0\xbd\x00/\x80\x01\x00\x00\x00x\x00\x06\xc0\xbd\x00\x02\x00\x08\x00\x00)\x05\xa0\x00\x00\x11\x94\x00\x12\x00\x04\x00\x0e\x00\xc1&\xa2\xe1\x90\xa9]$\xa2\xe1\x90\xa9]'
   5911 pkt = Ether(a)
   5912 assert pkt.ancount == 3
   5913 assert pkt.arcount == 4
   5914 assert pkt.an[1].rdata == b'Zalmoid.local.'
   5915 assert pkt.an[2].rdata == b'Zalmoid.local.'
   5916 assert pkt.ar[1].nextname == b'1.A.9.4.7.E.A.4.B.A.F.B.2.1.4.0.0.6.E.F.7.1.F.2.5.3.E.0.1.0.A.2.ip6.arpa.'
   5917 assert pkt.ar[2].nextname == b'136.0.168.192.in-addr.arpa.'
   5918 pkt.show()
   5919 
   5920 = DNS frame with DNSRRSRV
   5921 
   5922 b = Ether(b'33\x00\x00\x00\xfb$\xe3\x14M\x84\xc0\x86\xdd`\t\xc0f\x02b\x11\xff\xfe\x80\x00\x00\x00\x00\x00\x00\x04*,\x03\xab+/\x14\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfb\x14\xe9\x14\xe9\x02b_\xd8\x00\x00\x84\x00\x00\x00\x00\x0b\x00\x00\x00\x06\x014\x011\x01F\x012\x01B\x012\x01B\x01A\x013\x010\x01C\x012\x01A\x012\x014\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x018\x01E\x01F\x03ip6\x04arpa\x00\x00\x0c\x80\x01\x00\x00\x00x\x00\x14\x0csCapys-fLuff\x05local\x00\x03177\x010\x03168\x03192\x07in-addr\xc0P\x00\x0c\x80\x01\x00\x00\x00x\x00\x02\xc0`\x01E\x01F\x017\x01D\x01B\x018\x014\x01C\x014\x01B\x016\x01E\x015\x017\x018\x010\x010\x016\x01E\x01F\x017\x011\x01F\x012\x015\x013\x01E\x010\x011\x010\x01A\x012\xc0L\x00\x0c\x80\x01\x00\x00\x00x\x00\x02\xc0`+24:e3:14:4d:84:c0@fe80::26e3:14ff:fe4d:84c0\x0e_apple-mobdev2\x04_tcp\xc0m\x00\x10\x80\x01\x00\x00\x11\x94\x00\x01\x00\t_services\x07_dns-sd\x04_udp\xc0m\x00\x0c\x00\x01\x00\x00\x11\x94\x00\x02\xc1\x12\x08521805b3\x04_sub\xc1\x12\x00\x0c\x00\x01\x00\x00\x11\x94\x00\x02\xc0\xe6\xc1\x12\x00\x0c\x00\x01\x00\x00\x11\x94\x00\x02\xc0\xe6\xc0\xe6\x00!\x80\x01\x00\x00\x00x\x00\x08\x00\x00\x00\x00~\xf2\xc0`\xc0`\x00\x1c\x80\x01\x00\x00\x00x\x00\x10\xfe\x80\x00\x00\x00\x00\x00\x00\x04*,\x03\xab+/\x14\xc0`\x00\x01\x80\x01\x00\x00\x00x\x00\x04\xc0\xa8\x00\xb1\xc0`\x00\x1c\x80\x01\x00\x00\x00x\x00\x10*\x01\x0e5/\x17\xfe`\x08u\xe6\xb4\xc4\x8b\xd7\xfe\xc0\x0c\x00/\x80\x01\x00\x00\x00x\x00\x06\xc0\x0c\x00\x02\x00\x08\xc0t\x00/\x80\x01\x00\x00\x00x\x00\x06\xc0t\x00\x02\x00\x08\xc0\x98\x00/\x80\x01\x00\x00\x00x\x00\x06\xc0\x98\x00\x02\x00\x08\xc0\xe6\x00/\x80\x01\x00\x00\x11\x94\x00\t\xc0\xe6\x00\x05\x00\x00\x80\x00@\xc0`\x00/\x80\x01\x00\x00\x00x\x00\x08\xc0`\x00\x04@\x00\x00\x08\x00\x00)\x05\xa0\x00\x00\x11\x94\x00\x12\x00\x04\x00\x0e\x00\xcf&\xe3\x14M\x84\xc0$\xe3\x14M\x84\xc0')
   5923 assert isinstance(b.an[7], DNSRRSRV)
   5924 assert b.an[7].target == b'sCapys-fLuff.local.'
   5925 assert b.an[6].rrname == b'_apple-mobdev2._tcp.local.'
   5926 assert b.an[6].rdata == b'24:e3:14:4d:84:c0@fe80::26e3:14ff:fe4d:84c0._apple-mobdev2._tcp.local.'
   5927 
   5928 = DNS frame with decompression hidden args
   5929 
   5930 c = b'\x01\x00^\x00\x00\xfb\x14\x0cv\x8f\xfe(\x08\x00E\x00\x01C\xe3\x91@\x00\xff\x11\xf4u\xc0\xa8\x00\xfe\xe0\x00\x00\xfb\x14\xe9\x14\xe9\x01/L \x00\x00\x84\x00\x00\x00\x00\x04\x00\x00\x00\x00\x05_raop\x04_tcp\x05local\x00\x00\x0c\x00\x01\x00\x00\x11\x94\x00\x1e\x1b140C768FFE28@Freebox Server\xc0\x0c\xc0(\x00\x10\x80\x01\x00\x00\x11\x94\x00\xa0\ttxtvers=1\x08vs=190.9\x04ch=2\x08sr=44100\x05ss=16\x08pw=false\x06et=0,1\x04ek=1\ntp=TCP,UDP\x13am=FreeboxServer1,2\ncn=0,1,2,3\x06md=0,2\x07sf=0x44\x0bft=0xBF0A00\x08sv=false\x07da=true\x08vn=65537\x04vv=2\xc0(\x00!\x80\x01\x00\x00\x00x\x00\x19\x00\x00\x00\x00\x13\x88\x10Freebox-Server-3\xc0\x17\xc1\x04\x00\x01\x80\x01\x00\x00\x00x\x00\x04\xc0\xa8\x00\xfe'
   5931 pkt = Ether(c)
   5932 assert DNS in pkt
   5933 assert pkt.an.rdata == b'140C768FFE28@Freebox Server._raop._tcp.local.'
   5934 assert pkt.an.getlayer(DNSRR, type=1).rrname == b'Freebox-Server-3.local.'
   5935 assert pkt.an.getlayer(DNSRR, type=1).rdata == '192.168.0.254'
   5936 
   5937 = Layer binding
   5938 
   5939 * Test DestMACField & DestIPField
   5940 pkt = Ether(raw(Ether()/IP()/UDP(dport=5353)/DNS()))
   5941 assert isinstance(pkt, Ether) and pkt.dst == '01:00:5e:00:00:fb'
   5942 pkt = pkt.payload
   5943 assert isinstance(pkt, IP) and pkt.dst == '224.0.0.251'
   5944 pkt = pkt.payload
   5945 assert isinstance(pkt, UDP) and pkt.dport == 5353
   5946 pkt = pkt.payload
   5947 assert isinstance(pkt, DNS) and isinstance(pkt.payload, NoPayload)
   5948 
   5949 * Same with IPv6
   5950 pkt = Ether(raw(Ether()/IPv6()/UDP(dport=5353)/DNS()))
   5951 assert isinstance(pkt, Ether) and pkt.dst == '33:33:00:00:00:fb'
   5952 pkt = pkt.payload
   5953 assert isinstance(pkt, IPv6) and pkt.dst == 'ff02::fb'
   5954 pkt = pkt.payload
   5955 assert isinstance(pkt, UDP) and pkt.dport == 5353
   5956 pkt = pkt.payload
   5957 assert isinstance(pkt, DNS) and isinstance(pkt.payload, NoPayload)
   5958 
   5959 
   5960 ############
   5961 ############
   5962 + Mocked read_routes() calls
   5963 
   5964 = Truncated netstat -rn output on OS X
   5965 ~ mock_read_routes6_bsd
   5966 
   5967 import mock
   5968 from io import StringIO
   5969 
   5970 @mock.patch("scapy.arch.unix.get_if_addr")
   5971 @mock.patch("scapy.arch.unix.os")
   5972 def test_osx_netstat_truncated(mock_os, mock_get_if_addr):
   5973     """Test read_routes() on OS X 10.? with a long interface name"""
   5974     # netstat & ifconfig outputs from https://github.com/secdev/scapy/pull/119
   5975     netstat_output = u"""
   5976 Routing tables
   5977 
   5978 Internet:
   5979 Destination        Gateway            Flags        Refs      Use   Netif Expire
   5980 default            192.168.1.1        UGSc          460        0     en1
   5981 default            link#11            UCSI            1        0 bridge1
   5982 127                127.0.0.1          UCS             1        0     lo0
   5983 127.0.0.1          127.0.0.1          UH             10  2012351     lo0
   5984 """
   5985     ifconfig_output = u"lo0 en1 bridge10\n"
   5986     # Mocked file descriptors
   5987     def se_popen(command):
   5988         """Perform specific side effects"""
   5989         if command.startswith("netstat -rn"):
   5990             return StringIO(netstat_output)
   5991         elif command == "ifconfig -l":
   5992             ret = StringIO(ifconfig_output)
   5993             def unit():
   5994                 return ret
   5995             ret.__call__ = unit
   5996             ret.__enter__ = unit
   5997             ret.__exit__ = lambda x,y,z: None
   5998             return ret
   5999         raise Exception("Command not mocked: %s" % command)
   6000     mock_os.popen.side_effect = se_popen
   6001     # Mocked get_if_addr() behavior
   6002     def se_get_if_addr(iface):
   6003         """Perform specific side effects"""
   6004         if iface == "bridge1":
   6005             oserror_exc = OSError()
   6006             oserror_exc.message = "Device not configured"
   6007             raise oserror_exc
   6008         return "1.2.3.4"
   6009     mock_get_if_addr.side_effect = se_get_if_addr
   6010     # Test the function
   6011     from scapy.arch.unix import read_routes
   6012     routes = read_routes()
   6013     assert(len(routes) == 4)
   6014     assert([r for r in routes if r[3] == "bridge10"])
   6015 
   6016 
   6017 test_osx_netstat_truncated()
   6018 
   6019 
   6020 ############
   6021 ############
   6022 + Mocked read_routes6() calls
   6023 
   6024 = Preliminary definitions
   6025 ~ mock_read_routes6_bsd
   6026 
   6027 import mock
   6028 from io import StringIO
   6029 
   6030 def valid_output_read_routes6(routes):
   6031     """"Return True if 'routes' contains correctly formatted entries, False otherwise"""
   6032     for destination, plen, next_hop, dev, cset, me  in routes:
   6033         if not in6_isvalid(destination) or not type(plen) == int:
   6034             return False
   6035         if not in6_isvalid(next_hop) or not isinstance(dev, six.string_types):
   6036             return False
   6037         for address in cset:
   6038             if not in6_isvalid(address):
   6039                 return False
   6040     return True
   6041 
   6042 def check_mandatory_ipv6_routes(routes6):
   6043     """Ensure that mandatory IPv6 routes are present"""
   6044     if len([r for r in routes6 if r[0] == "::1" and r[4] == ["::1"]]) < 1:
   6045         return False
   6046     if len([r for r in routes6 if r[0] == "fe80::" and r[1] == 64]) < 1:
   6047         return False
   6048     if len([r for r in routes6 if in6_islladdr(r[0]) and r[1] == 128 and \
   6049             r[4] == ["::1"]]) < 1:
   6050         return False
   6051     return True
   6052 
   6053 
   6054 = Mac OS X 10.9.5
   6055 ~ mock_read_routes6_bsd
   6056 
   6057 @mock.patch("scapy.arch.unix.in6_getifaddr")
   6058 @mock.patch("scapy.arch.unix.os")
   6059 def test_osx_10_9_5(mock_os, mock_in6_getifaddr):
   6060     """Test read_routes6() on OS X 10.9.5"""
   6061     # 'netstat -rn -f inet6' output
   6062     netstat_output = u"""
   6063 Routing tables
   6064 
   6065 Internet6:
   6066 Destination                             Gateway                         Flags         Netif Expire
   6067 ::1                                     ::1                             UHL             lo0
   6068 fe80::%lo0/64                           fe80::1%lo0                     UcI             lo0
   6069 fe80::1%lo0                             link#1                          UHLI            lo0
   6070 fe80::%en0/64                           link#4                          UCI             en0
   6071 fe80::ba26:6cff:fe5f:4eee%en0           b8:26:6c:5f:4e:ee               UHLWIi          en0
   6072 fe80::bae8:56ff:fe45:8ce6%en0           b8:e8:56:45:8c:e6               UHLI            lo0
   6073 ff01::%lo0/32                           ::1                             UmCI            lo0
   6074 ff01::%en0/32                           link#4                          UmCI            en0
   6075 ff02::%lo0/32                           ::1                             UmCI            lo0
   6076 ff02::%en0/32                           link#4                          UmCI            en0
   6077 """
   6078     # Mocked file descriptor
   6079     strio = StringIO(netstat_output)
   6080     mock_os.popen = mock.MagicMock(return_value=strio)
   6081     # Mocked in6_getifaddr() output
   6082     mock_in6_getifaddr.return_value = [("::1", IPV6_ADDR_LOOPBACK, "lo0"),
   6083                                        ("fe80::ba26:6cff:fe5f:4eee", IPV6_ADDR_LINKLOCAL, "en0")]
   6084     # Test the function
   6085     from scapy.arch.unix import read_routes6
   6086     routes = read_routes6()
   6087     for r in routes:
   6088         print(r)
   6089     assert(len(routes) == 6)
   6090     assert(check_mandatory_ipv6_routes(routes))
   6091 
   6092 test_osx_10_9_5()
   6093 
   6094 
   6095 = Mac OS X 10.9.5 with global IPv6 connectivity
   6096 ~ mock_read_routes6_bsd
   6097 @mock.patch("scapy.arch.unix.in6_getifaddr")
   6098 @mock.patch("scapy.arch.unix.os")
   6099 def test_osx_10_9_5_global(mock_os, mock_in6_getifaddr):
   6100     """Test read_routes6() on OS X 10.9.5 with an IPv6 connectivity"""
   6101     # 'netstat -rn -f inet6' output
   6102     netstat_output = u"""
   6103 Routing tables
   6104 
   6105 Internet6:
   6106 Destination                             Gateway                         Flags         Netif Expire
   6107 default                                 fe80::ba26:8aff:fe5f:4eef%en0   UGc             en0
   6108 ::1                                     ::1                             UHL             lo0
   6109 2a01:ab09:7d:1f01::/64                  link#4                          UC              en0
   6110 2a01:ab09:7d:1f01:420:205c:9fab:5be7    b8:e9:55:44:7c:e5               UHL             lo0
   6111 2a01:ab09:7d:1f01:ba26:8aff:fe5f:4eef   b8:26:8a:5f:4e:ef               UHLWI           en0
   6112 2a01:ab09:7d:1f01:bae9:55ff:fe44:7ce5   b8:e9:55:44:7c:e5               UHL             lo0
   6113 fe80::%lo0/64                           fe80::1%lo0                     UcI             lo0
   6114 fe80::1%lo0                             link#1                          UHLI            lo0
   6115 fe80::%en0/64                           link#4                          UCI             en0
   6116 fe80::5664:d9ff:fe79:4e00%en0           54:64:d9:79:4e:0                UHLWI           en0
   6117 fe80::6ead:f8ff:fe74:945a%en0           6c:ad:f8:74:94:5a               UHLWI           en0
   6118 fe80::a2f3:c1ff:fec4:5b50%en0           a0:f3:c1:c4:5b:50               UHLWI           en0
   6119 fe80::ba26:8aff:fe5f:4eef%en0           b8:26:8a:5f:4e:ef               UHLWIir         en0
   6120 fe80::bae9:55ff:fe44:7ce5%en0           b8:e9:55:44:7c:e5               UHLI            lo0
   6121 ff01::%lo0/32                           ::1                             UmCI            lo0
   6122 ff01::%en0/32                           link#4                          UmCI            en0
   6123 ff02::%lo0/32                           ::1                             UmCI            lo
   6124 """
   6125     # Mocked file descriptor
   6126     strio = StringIO(netstat_output)
   6127     mock_os.popen = mock.MagicMock(return_value=strio)
   6128     # Mocked in6_getifaddr() output
   6129     mock_in6_getifaddr.return_value = [("::1", IPV6_ADDR_LOOPBACK, "lo0"),
   6130                                        ("fe80::ba26:6cff:fe5f:4eee", IPV6_ADDR_LINKLOCAL, "en0")]
   6131     # Test the function
   6132     from scapy.arch.unix import read_routes6
   6133     routes = read_routes6()
   6134     print(routes)
   6135     assert(valid_output_read_routes6(routes))
   6136     for r in routes:
   6137         print(r)
   6138     assert(len(routes) == 11)
   6139     assert(check_mandatory_ipv6_routes(routes))
   6140 
   6141 test_osx_10_9_5_global()
   6142 
   6143 
   6144 = Mac OS X 10.10.4
   6145 ~ mock_read_routes6_bsd
   6146 
   6147 @mock.patch("scapy.arch.unix.in6_getifaddr")
   6148 @mock.patch("scapy.arch.unix.os")
   6149 def test_osx_10_10_4(mock_os, mock_in6_getifaddr):
   6150     """Test read_routes6() on OS X 10.10.4"""
   6151     # 'netstat -rn -f inet6' output
   6152     netstat_output = u"""
   6153 Routing tables
   6154 
   6155 Internet6:
   6156 Destination                             Gateway                         Flags         Netif Expire
   6157 ::1                                     ::1                             UHL             lo0
   6158 fe80::%lo0/64                           fe80::1%lo0                     UcI             lo0
   6159 fe80::1%lo0                             link#1                          UHLI            lo0
   6160 fe80::%en0/64                           link#4                          UCI             en0
   6161 fe80::a00:27ff:fe9b:c965%en0            8:0:27:9b:c9:65                 UHLI            lo0
   6162 ff01::%lo0/32                           ::1                             UmCI            lo0
   6163 ff01::%en0/32                           link#4                          UmCI            en0
   6164 ff02::%lo0/32                           ::1                             UmCI            lo0
   6165 ff02::%en0/32                           link#4                          UmCI            en0
   6166 """
   6167     # Mocked file descriptor
   6168     strio = StringIO(netstat_output)
   6169     mock_os.popen = mock.MagicMock(return_value=strio)
   6170     # Mocked in6_getifaddr() output
   6171     mock_in6_getifaddr.return_value = [("::1", IPV6_ADDR_LOOPBACK, "lo0"),
   6172                                        ("fe80::a00:27ff:fe9b:c965", IPV6_ADDR_LINKLOCAL, "en0")]
   6173     # Test the function
   6174     from scapy.arch.unix import read_routes6
   6175     routes = read_routes6()
   6176     for r in routes:
   6177         print(r)
   6178     assert(len(routes) == 5)
   6179     assert(check_mandatory_ipv6_routes(routes))
   6180 
   6181 test_osx_10_10_4()
   6182 
   6183 
   6184 = FreeBSD 10.2
   6185 ~ mock_read_routes6_bsd
   6186 
   6187 @mock.patch("scapy.arch.unix.in6_getifaddr")
   6188 @mock.patch("scapy.arch.unix.os")
   6189 def test_freebsd_10_2(mock_os, mock_in6_getifaddr):
   6190     """Test read_routes6() on FreeBSD 10.2"""
   6191     # 'netstat -rn -f inet6' output
   6192     netstat_output = u"""
   6193 Routing tables
   6194 
   6195 Internet6:
   6196 Destination                       Gateway                       Flags      Netif Expire
   6197 ::/96                             ::1                           UGRS        lo0
   6198 ::1                               link#2                        UH          lo0
   6199 ::ffff:0.0.0.0/96                 ::1                           UGRS        lo0
   6200 fe80::/10                         ::1                           UGRS        lo0
   6201 fe80::%lo0/64                     link#2                        U           lo0
   6202 fe80::1%lo0                       link#2                        UHS         lo0
   6203 ff01::%lo0/32                     ::1                           U           lo0
   6204 ff02::/16                         ::1                           UGRS        lo0
   6205 ff02::%lo0/32                     ::1                           U           lo0
   6206 """
   6207     # Mocked file descriptor
   6208     strio = StringIO(netstat_output)
   6209     mock_os.popen = mock.MagicMock(return_value=strio)
   6210     # Mocked in6_getifaddr() output
   6211     mock_in6_getifaddr.return_value = [("::1", IPV6_ADDR_LOOPBACK, "lo0")]
   6212     # Test the function
   6213     from scapy.arch.unix import read_routes6
   6214     routes = read_routes6()
   6215     for r in routes:
   6216         print(r)
   6217     assert(len(routes) == 3)
   6218     assert(check_mandatory_ipv6_routes(routes))
   6219 
   6220 test_freebsd_10_2()
   6221 
   6222 
   6223 = OpenBSD 5.5
   6224 ~ mock_read_routes6_bsd
   6225 
   6226 @mock.patch("scapy.arch.unix.OPENBSD")
   6227 @mock.patch("scapy.arch.unix.in6_getifaddr")
   6228 @mock.patch("scapy.arch.unix.os")
   6229 def test_openbsd_5_5(mock_os, mock_in6_getifaddr, mock_openbsd):
   6230     """Test read_routes6() on OpenBSD 5.5"""
   6231     # 'netstat -rn -f inet6' output
   6232     netstat_output = u"""
   6233 Routing tables
   6234 
   6235 Internet6:
   6236 Destination                        Gateway                        Flags   Refs      Use   Mtu  Prio Iface
   6237 ::/104                             ::1                            UGRS       0        0     -     8 lo0  
   6238 ::/96                              ::1                            UGRS       0        0     -     8 lo0  
   6239 ::1                                ::1                            UH        14        0 33144     4 lo0  
   6240 ::127.0.0.0/104                    ::1                            UGRS       0        0     -     8 lo0  
   6241 ::224.0.0.0/100                    ::1                            UGRS       0        0     -     8 lo0  
   6242 ::255.0.0.0/104                    ::1                            UGRS       0        0     -     8 lo0  
   6243 ::ffff:0.0.0.0/96                  ::1                            UGRS       0        0     -     8 lo0  
   6244 2002::/24                          ::1                            UGRS       0        0     -     8 lo0  
   6245 2002:7f00::/24                     ::1                            UGRS       0        0     -     8 lo0  
   6246 2002:e000::/20                     ::1                            UGRS       0        0     -     8 lo0  
   6247 2002:ff00::/24                     ::1                            UGRS       0        0     -     8 lo0  
   6248 fe80::/10                          ::1                            UGRS       0        0     -     8 lo0  
   6249 fe80::%em0/64                      link#1                         UC         0        0     -     4 em0  
   6250 fe80::a00:27ff:fe04:59bf%em0       08:00:27:04:59:bf              UHL        0        0     -     4 lo0  
   6251 fe80::%lo0/64                      fe80::1%lo0                    U          0        0     -     4 lo0  
   6252 fe80::1%lo0                        link#3                         UHL        0        0     -     4 lo0  
   6253 fec0::/10                          ::1                            UGRS       0        0     -     8 lo0  
   6254 ff01::/16                          ::1                            UGRS       0        0     -     8 lo0  
   6255 ff01::%em0/32                      link#1                         UC         0        0     -     4 em0  
   6256 ff01::%lo0/32                      fe80::1%lo0                    UC         0        0     -     4 lo0  
   6257 ff02::/16                          ::1                            UGRS       0        0     -     8 lo0  
   6258 ff02::%em0/32                      link#1                         UC         0        0     -     4 em0  
   6259 ff02::%lo0/32                      fe80::1%lo0                    UC         0        0     -     4 lo0 
   6260 """
   6261     # Mocked file descriptor
   6262     strio = StringIO(netstat_output)
   6263     mock_os.popen = mock.MagicMock(return_value=strio)
   6264     
   6265     # Mocked in6_getifaddr() output
   6266     mock_in6_getifaddr.return_value = [("::1", IPV6_ADDR_LOOPBACK, "lo0"),
   6267                                        ("fe80::a00:27ff:fe04:59bf", IPV6_ADDR_LINKLOCAL, "em0")]
   6268     # Mocked OpenBSD parsing behavior
   6269     mock_openbsd = True
   6270     # Test the function
   6271     from scapy.arch.unix import read_routes6
   6272     routes = read_routes6()
   6273     for r in routes:
   6274         print(r)
   6275     assert(len(routes) == 5)
   6276     assert(check_mandatory_ipv6_routes(routes))
   6277 
   6278 test_openbsd_5_5()
   6279 
   6280 
   6281 = NetBSD 7.0
   6282 ~ mock_read_routes6_bsd
   6283 
   6284 @mock.patch("scapy.arch.unix.NETBSD")
   6285 @mock.patch("scapy.arch.unix.in6_getifaddr")
   6286 @mock.patch("scapy.arch.unix.os")
   6287 def test_netbsd_7_0(mock_os, mock_in6_getifaddr, mock_netbsd):
   6288     """Test read_routes6() on NetBSD 7.0"""
   6289     # 'netstat -rn -f inet6' output
   6290     netstat_output = u"""
   6291 Routing tables
   6292 
   6293 Internet6:
   6294 Destination                        Gateway                        Flags    Refs      Use    Mtu Interface
   6295 ::/104                             ::1                            UGRS        -        -      -  lo0
   6296 ::/96                              ::1                            UGRS        -        -      -  lo0
   6297 ::1                                ::1                            UH          -        -  33648  lo0
   6298 ::127.0.0.0/104                    ::1                            UGRS        -        -      -  lo0
   6299 ::224.0.0.0/100                    ::1                            UGRS        -        -      -  lo0
   6300 ::255.0.0.0/104                    ::1                            UGRS        -        -      -  lo0
   6301 ::ffff:0.0.0.0/96                  ::1                            UGRS        -        -      -  lo0
   6302 2001:db8::/32                      ::1                            UGRS        -        -      -  lo0
   6303 2002::/24                          ::1                            UGRS        -        -      -  lo0
   6304 2002:7f00::/24                     ::1                            UGRS        -        -      -  lo0
   6305 2002:e000::/20                     ::1                            UGRS        -        -      -  lo0
   6306 2002:ff00::/24                     ::1                            UGRS        -        -      -  lo0
   6307 fe80::/10                          ::1                            UGRS        -        -      -  lo0
   6308 fe80::%wm0/64                      link#1                         UC          -        -      -  wm0
   6309 fe80::acd1:3989:180e:fde0          08:00:27:a1:64:d8              UHL         -        -      -  lo0
   6310 fe80::%lo0/64                      fe80::1                        U           -        -      -  lo0
   6311 fe80::1                            link#2                         UHL         -        -      -  lo0
   6312 ff01:1::/32                        link#1                         UC          -        -      -  wm0
   6313 ff01:2::/32                        ::1                            UC          -        -      -  lo0
   6314 ff02::%wm0/32                      link#1                         UC          -        -      -  wm0
   6315 ff02::%lo0/32                      ::1                            UC          -        -      -  lo0
   6316 """
   6317     # Mocked file descriptor
   6318     strio = StringIO(netstat_output)
   6319     mock_os.popen = mock.MagicMock(return_value=strio)
   6320     # Mocked in6_getifaddr() output
   6321     mock_in6_getifaddr.return_value = [("::1", IPV6_ADDR_LOOPBACK, "lo0"),
   6322                                        ("fe80::acd1:3989:180e:fde0", IPV6_ADDR_LINKLOCAL, "wm0")]
   6323     # Test the function
   6324     from scapy.arch.unix import read_routes6
   6325     routes = read_routes6()
   6326     for r in routes:
   6327         print(r)
   6328     assert(len(routes) == 5)
   6329     assert(check_mandatory_ipv6_routes(routes))
   6330 
   6331 test_netbsd_7_0()
   6332 
   6333 ############
   6334 ############
   6335 + STP tests
   6336 
   6337 = STP - Basic Instantiation
   6338 assert raw(STP()) == b'\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\x01\x00\x14\x00\x02\x00\x0f\x00'
   6339 
   6340 = STP - Basic Dissection
   6341 
   6342 s = STP(b'\x00\x00\x00\x00\x00\x00\x00\x12\x13\x14\x15\x16\x17\x00\x00\x00\x00\x00\x00\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x01\x00\x14\x00\x05\x00\x0f\x00')
   6343 assert s.rootmac == "12:13:14:15:16:17"
   6344 assert s.bridgemac == "aa:aa:aa:aa:aa:aa"
   6345 assert s.hellotime == 5
   6346 
   6347 ############
   6348 ############
   6349 + EAPOL class tests
   6350 
   6351 = EAPOL - Basic Instantiation
   6352 raw(EAPOL()) == b'\x01\x00\x00\x00'
   6353 
   6354 = EAPOL - Instantiation with specific values
   6355 raw(EAPOL(version = 3, type = 5)) == b'\x03\x05\x00\x00'
   6356 
   6357 = EAPOL - Dissection (1)
   6358 s = b'\x03\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   6359 eapol = EAPOL(s)
   6360 assert(eapol.version == 3)
   6361 assert(eapol.type == 1)
   6362 assert(eapol.len == 0)
   6363 
   6364 = EAPOL - Dissection (2)
   6365 s = b'\x03\x00\x00\x05\x01\x01\x00\x05\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   6366 eapol = EAPOL(s)
   6367 assert(eapol.version == 3)
   6368 assert(eapol.type == 0)
   6369 assert(eapol.len == 5)
   6370 
   6371 = EAPOL - Dissection (3)
   6372 s = b'\x03\x00\x00\x0e\x02\x01\x00\x0e\x01anonymous\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'
   6373 eapol = EAPOL(s)
   6374 assert(eapol.version == 3)
   6375 assert(eapol.type == 0)
   6376 assert(eapol.len == 14)
   6377 
   6378 = EAPOL - Dissection (4)
   6379 req = EAPOL(b'\x03\x00\x00\x05\x01\x01\x00\x05\x01')
   6380 ans = EAPOL(b'\x03\x00\x00\x0e\x02\x01\x00\x0e\x01anonymous')
   6381 ans.answers(req)
   6382 
   6383 = EAPOL - Dissection (5)
   6384 s = b'\x02\x00\x00\x06\x01\x01\x00\x06\r '
   6385 eapol = EAPOL(s)
   6386 assert(eapol.version == 2)
   6387 assert(eapol.type == 0)
   6388 assert(eapol.len == 6)
   6389 assert(eapol.haslayer(EAP_TLS))
   6390 
   6391 = EAPOL - Dissection (6)
   6392 s = b'\x03\x00\x00<\x02\x9e\x00<+\x01\x16\x03\x01\x001\x01\x00\x00-\x03\x01dr1\x93ZS\x0en\xad\x1f\xbaH\xbb\xfe6\xe6\xd0\xcb\xec\xd7\xc0\xd7\xb9\xa5\xc9\x0c\xfd\x98o\xa7T \x00\x00\x04\x004\x00\x00\x01\x00\x00\x00'
   6393 eapol = EAPOL(s)
   6394 assert(eapol.version == 3)
   6395 assert(eapol.type == 0)
   6396 assert(eapol.len == 60)
   6397 assert(eapol.haslayer(EAP_FAST))
   6398 
   6399 
   6400 ############
   6401 ############
   6402 + EAPOL-MKA class tests
   6403 
   6404 = EAPOL-MKA - With Basic parameter set - Dissection
   6405 eapol = None
   6406 s = b'\x03\x05\x00T\x01\xff\xf0<\x00Bh\xa8\x1e\x03\x00\n\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7\x00\x00\x00\x01\x00\x80\xc2\x01\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\xff\x00\x00\x10\xe5\xf5j\x86V\\\xb1\xcc\xa9\xb95\x04m*Cj'
   6407 eapol = EAPOL(s)
   6408 assert(eapol.version == 3)
   6409 assert(eapol.type == 5)
   6410 assert(eapol.len == 84)
   6411 assert(eapol.haslayer(MKAPDU))
   6412 assert(eapol[MKAPDU].basic_param_set.actor_member_id == b"\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7")
   6413 assert(eapol[MKAPDU].haslayer(MKAICVSet))
   6414 assert(eapol[MKAPDU][MKAICVSet].icv == b"\xe5\xf5j\x86V\\\xb1\xcc\xa9\xb95\x04m*Cj")
   6415 
   6416 
   6417 = EAPOL-MKA - With Potential Peer List parameter set - Dissection
   6418 eapol = None
   6419 s = b'\x03\x05\x00h\x01\x10\xe0<\xccN$\xc4\xf7\x7f\x00\x80q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6\x00\x00\x00}\x00\x80\xc2\x01\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x02\x00\x00\x10\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7\x00\x00\x00\x01\xff\x00\x00\x105\x01\xdc)\xfd\xd1\xff\xd55\x9c_o\xc9\x9c\xca\xc0'
   6420 eapol = EAPOL(s)
   6421 assert(eapol.version == 3)
   6422 assert(eapol.type == 5)
   6423 assert(eapol.len == 104)
   6424 assert(eapol.haslayer(MKAPDU))
   6425 assert(eapol[MKAPDU].basic_param_set.actor_member_id == b"q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6")
   6426 assert(eapol.haslayer(MKAPotentialPeerListParamSet))
   6427 assert(eapol[MKAPDU][MKAPotentialPeerListParamSet].member_id_message_num[0].member_id == b"\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7")
   6428 assert(eapol[MKAPDU].haslayer(MKAICVSet))
   6429 assert(eapol[MKAPDU][MKAICVSet].icv == b"5\x01\xdc)\xfd\xd1\xff\xd55\x9c_o\xc9\x9c\xca\xc0")
   6430 
   6431 = EAPOL-MKA - With Live Peer List parameter set - Dissection
   6432 eapol = None
   6433 s = b"\x03\x05\x00h\x01\xffp<\x00Bh\xa8\x1e\x03\x00\n\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7\x00\x00\x00\x02\x00\x80\xc2\x01\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x01\x00\x00\x10q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6\x00\x00\x00\x80\xff\x00\x00\x10\xf4\xa1d\x18\tD\xa2}\x8e'\x0c/\xda,\xea\xb7"
   6434 eapol = EAPOL(s)
   6435 assert(eapol.version == 3)
   6436 assert(eapol.type == 5)
   6437 assert(eapol.len == 104)
   6438 assert(eapol.haslayer(MKAPDU))
   6439 assert(eapol[MKAPDU].basic_param_set.actor_member_id == b'\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7')
   6440 assert(eapol.haslayer(MKALivePeerListParamSet))
   6441 assert(eapol[MKAPDU][MKALivePeerListParamSet].member_id_message_num[0].member_id == b"q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6")
   6442 assert(eapol[MKAPDU].haslayer(MKAICVSet))
   6443 assert(eapol[MKAPDU][MKAICVSet].icv == b"\xf4\xa1d\x18\tD\xa2}\x8e'\x0c/\xda,\xea\xb7")
   6444 
   6445 = EAPOL-MKA - With SAK Use parameter set - Dissection
   6446 eapol = None
   6447 s = b'\x03\x05\x00\x94\x01\xffp<\x00Bh\xa8\x1e\x03\x00\n\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7\x00\x00\x00\x03\x00\x80\xc2\x01\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x03\x10\x00(q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6\x00\x00\x00\x01\x00\x00\x00\x00q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6\x00\x00\x00\x01\x00\x00\x00\x00\x01\x00\x00\x10q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6\x00\x00\x00\x83\xff\x00\x00\x10OF\x84\xf1@%\x95\xe6Fw9\x1a\xfa\x03(\xae'
   6448 eapol = EAPOL(s)
   6449 assert(eapol.version == 3)
   6450 assert(eapol.type == 5)
   6451 assert(eapol.len == 148)
   6452 assert(eapol.haslayer(MKAPDU))
   6453 assert(eapol[MKAPDU].basic_param_set.actor_member_id == b'\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7')
   6454 assert(eapol.haslayer(MKASAKUseParamSet))
   6455 assert(eapol[MKAPDU][MKASAKUseParamSet].latest_key_key_server_member_id == b"q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6")
   6456 assert(eapol.haslayer(MKALivePeerListParamSet))
   6457 assert(eapol[MKAPDU][MKALivePeerListParamSet].member_id_message_num[0].member_id == b"q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6")
   6458 assert(eapol[MKAPDU].haslayer(MKAICVSet))
   6459 assert(eapol[MKAPDU][MKAICVSet].icv == b"OF\x84\xf1@%\x95\xe6Fw9\x1a\xfa\x03(\xae")
   6460 
   6461 = EAPOL-MKA - With Distributed SAK parameter set - Dissection
   6462 eapol = None
   6463 s = b"\x03\x05\x00\xb4\x01\x10\xe0<\xccN$\xc4\xf7\x7f\x00\x80q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6\x00\x00\x00\x81\x00\x80\xc2\x01\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x01\x00\x00\x10\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7\x00\x00\x00\x02\x03\x10\x00(q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6\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\x04\x10\x00\x1c\x00\x00\x00\x01Cz\x05\x88\x9f\xe8-\x94W+?\x13~\xfb\x016yVB?\xbd\xa1\x9fu\xff\x00\x00\x10\xb0H\xcf\xe0:\xa1\x94RD'\x03\xe67\xe1Ur"
   6464 eapol = EAPOL(s)
   6465 assert(eapol.version == 3)
   6466 assert(eapol.type == 5)
   6467 assert(eapol.len == 180)
   6468 assert(eapol.haslayer(MKAPDU))
   6469 assert(eapol[MKAPDU].basic_param_set.actor_member_id == b"q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6")
   6470 assert(eapol.haslayer(MKASAKUseParamSet))
   6471 assert(eapol[MKAPDU][MKASAKUseParamSet].latest_key_key_server_member_id == b"q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6")
   6472 assert(eapol.haslayer(MKALivePeerListParamSet))
   6473 assert(eapol[MKAPDU][MKALivePeerListParamSet].member_id_message_num[0].member_id == b"\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7")
   6474 assert(eapol.haslayer(MKADistributedSAKParamSet))
   6475 assert(eapol[MKADistributedSAKParamSet].sak_aes_key_wrap == b"Cz\x05\x88\x9f\xe8-\x94W+?\x13~\xfb\x016yVB?\xbd\xa1\x9fu")
   6476 assert(eapol[MKAPDU].haslayer(MKAICVSet))
   6477 assert(eapol[MKAPDU][MKAICVSet].icv == b"\xb0H\xcf\xe0:\xa1\x94RD'\x03\xe67\xe1Ur")
   6478 
   6479 
   6480 ############
   6481 ############
   6482 ############
   6483 + EAP class tests
   6484 
   6485 = EAP - Basic Instantiation
   6486 raw(EAP()) == b'\x04\x00\x00\x04'
   6487 
   6488 = EAP - Instantiation with specific values
   6489 raw(EAP(code = 1, id = 1, len = 5, type = 1)) == b'\x01\x01\x00\x05\x01'
   6490 
   6491 = EAP - Dissection (1)
   6492 s = b'\x01\x01\x00\x05\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   6493 eap = EAP(s)
   6494 assert(eap.code == 1)
   6495 assert(eap.id == 1)
   6496 assert(eap.len == 5)
   6497 assert(hasattr(eap, "type"))
   6498 assert(eap.type == 1)
   6499 
   6500 = EAP - Dissection (2)
   6501 s = b'\x02\x01\x00\x0e\x01anonymous\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'
   6502 eap = EAP(s)
   6503 assert(eap.code == 2)
   6504 assert(eap.id == 1)
   6505 assert(eap.len == 14)
   6506 assert(eap.type == 1)
   6507 assert(hasattr(eap, 'identity'))
   6508 assert(eap.identity == b'anonymous')
   6509 
   6510 = EAP - Dissection (3)
   6511 s = b'\x01\x01\x00\x06\r '
   6512 eap = EAP(s)
   6513 assert(eap.code == 1)
   6514 assert(eap.id == 1)
   6515 assert(eap.len == 6)
   6516 assert(eap.type == 13)
   6517 assert(eap.haslayer(EAP_TLS))
   6518 assert(eap[EAP_TLS].L == 0)
   6519 assert(eap[EAP_TLS].M == 0)
   6520 assert(eap[EAP_TLS].S == 1)
   6521 
   6522 = EAP - Dissection (4)
   6523 s = b'\x02\x01\x00\xd1\r\x00\x16\x03\x01\x00\xc6\x01\x00\x00\xc2\x03\x01UK\x02\xdf\x1e\xde5\xab\xfa[\x15\xef\xbe\xa2\xe4`\xc6g\xb9\xa8\xaa%vAs\xb2\x1cXt\x1c0\xb7\x00\x00P\xc0\x14\xc0\n\x009\x008\x00\x88\x00\x87\xc0\x0f\xc0\x05\x005\x00\x84\xc0\x12\xc0\x08\x00\x16\x00\x13\xc0\r\xc0\x03\x00\n\xc0\x13\xc0\t\x003\x002\x00\x9a\x00\x99\x00E\x00D\xc0\x0e\xc0\x04\x00/\x00\x96\x00A\xc0\x11\xc0\x07\xc0\x0c\xc0\x02\x00\x05\x00\x04\x00\x15\x00\x12\x00\t\x00\xff\x01\x00\x00I\x00\x0b\x00\x04\x03\x00\x01\x02\x00\n\x004\x002\x00\x0e\x00\r\x00\x19\x00\x0b\x00\x0c\x00\x18\x00\t\x00\n\x00\x16\x00\x17\x00\x08\x00\x06\x00\x07\x00\x14\x00\x15\x00\x04\x00\x05\x00\x12\x00\x13\x00\x01\x00\x02\x00\x03\x00\x0f\x00\x10\x00\x11\x00#\x00\x00\x00\x0f\x00\x01\x01'
   6524 eap = EAP(s)
   6525 assert(eap.code == 2)
   6526 assert(eap.id == 1)
   6527 assert(eap.len == 209)
   6528 assert(eap.type == 13)
   6529 assert(eap.haslayer(EAP_TLS))
   6530 assert(eap[EAP_TLS].L == 0)
   6531 assert(eap[EAP_TLS].M == 0)
   6532 assert(eap[EAP_TLS].S == 0)
   6533 
   6534 = EAP - Dissection (5)
   6535 s = b'\x02\x9e\x00<+\x01\x16\x03\x01\x001\x01\x00\x00-\x03\x01dr1\x93ZS\x0en\xad\x1f\xbaH\xbb\xfe6\xe6\xd0\xcb\xec\xd7\xc0\xd7\xb9\xa5\xc9\x0c\xfd\x98o\xa7T \x00\x00\x04\x004\x00\x00\x01\x00\x00\x00'
   6536 eap = EAP(s)
   6537 assert(eap.code == 2)
   6538 assert(eap.id == 158)
   6539 assert(eap.len == 60)
   6540 assert(eap.type == 43)
   6541 assert(eap.haslayer(EAP_FAST))
   6542 assert(eap[EAP_FAST].L == 0)
   6543 assert(eap[EAP_FAST].M == 0)
   6544 assert(eap[EAP_FAST].S == 0)
   6545 assert(eap[EAP_FAST].version == 1)
   6546 
   6547 = EAP - Dissection (6)
   6548 s = b'\x02\x9f\x01L+\x01\x16\x03\x01\x01\x06\x10\x00\x01\x02\x01\x00Y\xc9\x8a\tcw\t\xdcbU\xfd\x035\xcd\x1a\t\x10f&[(9\xf6\x88W`\xc6\x0f\xb3\x84\x15\x19\xf5\tk\xbd\x8fp&0\xb0\xa4B\x85\x0c<:s\xf2zT\xc3\xbd\x8a\xe4D{m\xe7\x97\xfe>\xda\x14\xb8T1{\xd7H\x9c\xa6\xcb\xe3,u\xdf\xe0\x82\xe5R\x1e<\xe5\x03}\xeb\x98\xe2\xf7\x8d3\xc6\x83\xac"\x8f\xd7\x12\xe5{:"\x84A\xd9\x14\xc2cZF\xd4\t\xab\xdar\xc7\xe0\x0e\x00o\xce\x05g\xdc?\xcc\xf7\xe83\x83E\xb3>\xe8<3-QB\xfd$C/\x1be\xcf\x03\xd6Q4\xbe\\h\xba)<\x99N\x89\xd9\xb1\xfa!\xd7a\xef\xa3\xd3o\xed8Uz\xb5k\xb0`\xfeC\xbc\xb3aS,d\xe6\xdc\x13\xa4A\x1e\x9b\r{\xd6s \xd0cQ\x95y\xc8\x1d\xc3\xd9\x87\xf2=\x81\x96q~\x99E\xc3\x97\xa8px\xe2\xc7\x92\xeb\xff/v\x84\x1e\xfb\x00\x95#\xba\xfb\xd88h\x90K\xa7\xbd9d\xb4\xf2\xf2\x14\x02vtW\xaa\xadY\x14\x03\x01\x00\x01\x01\x16\x03\x01\x000\x97\xc5l\xd6\xef\xffcM\x81\x90Q\x96\xf6\xfeX1\xf7\xfc\x84\xc6\xa0\xf6Z\xcd\xb6\xe1\xd4\xdb\x88\xf9t%Q!\xe7,~#2G-\xdf\x83\xbf\x86Q\xa2$'
   6549 eap = EAP(s)
   6550 assert(eap.code == 2)
   6551 assert(eap.id == 159)
   6552 assert(eap.len == 332)
   6553 assert(eap.type == 43)
   6554 assert(eap.haslayer(EAP_FAST))
   6555 assert(eap[EAP_FAST].L == 0)
   6556 assert(eap[EAP_FAST].M == 0)
   6557 assert(eap[EAP_FAST].S == 0)
   6558 assert(eap[EAP_FAST].version == 1)
   6559 
   6560 = EAP - Dissection (7)
   6561 s = b'\x02\xf1\x00\x06\x03+'
   6562 eap = EAP(s)
   6563 assert(eap.code == 2)
   6564 assert(eap.id == 241)
   6565 assert(eap.len == 6)
   6566 assert(eap.type == 3)
   6567 assert(hasattr(eap, 'desired_auth_type'))
   6568 assert(eap.desired_auth_type == 43)
   6569 
   6570 = EAP - Dissection (8)
   6571 s = b"\x02\x03\x01\x15\x15\x00\x16\x03\x01\x01\n\x01\x00\x01\x06\x03\x03\xd5\xd9\xd5rT\x9e\xb8\xbe,>\xcf!\xcf\xc7\x02\x8c\xb1\x1e^F\xf7\xc84\x8c\x01t4\x91[\x02\xc8/\x00\x00\x8c\xc00\xc0,\xc0(\xc0$\xc0\x14\xc0\n\x00\xa5\x00\xa3\x00\xa1\x00\x9f\x00k\x00j\x00i\x00h\x009\x008\x007\x006\x00\x88\x00\x87\x00\x86\x00\x85\xc02\xc0.\xc0*\xc0&\xc0\x0f\xc0\x05\x00\x9d\x00=\x005\x00\x84\xc0/\xc0+\xc0'\xc0#\xc0\x13\xc0\t\x00\xa4\x00\xa2\x00\xa0\x00\x9e\x00g\x00@\x00?\x00>\x003\x002\x001\x000\x00\x9a\x00\x99\x00\x98\x00\x97\x00E\x00D\x00C\x00B\xc01\xc0-\xc0)\xc0%\xc0\x0e\xc0\x04\x00\x9c\x00<\x00/\x00\x96\x00A\x00\xff\x01\x00\x00Q\x00\x0b\x00\x04\x03\x00\x01\x02\x00\n\x00\x1c\x00\x1a\x00\x17\x00\x19\x00\x1c\x00\x1b\x00\x18\x00\x1a\x00\x16\x00\x0e\x00\r\x00\x0b\x00\x0c\x00\t\x00\n\x00\r\x00 \x00\x1e\x06\x01\x06\x02\x06\x03\x05\x01\x05\x02\x05\x03\x04\x01\x04\x02\x04\x03\x03\x01\x03\x02\x03\x03\x02\x01\x02\x02\x02\x03\x00\x0f\x00\x01\x01"
   6572 eap = EAP(s)
   6573 assert(eap.code == 2)
   6574 assert(eap.id == 3)
   6575 assert(eap.len == 277)
   6576 assert(eap.type == 21)
   6577 assert(eap.haslayer(EAP_TTLS))
   6578 assert(eap[EAP_TTLS].L == 0)
   6579 assert(eap[EAP_TTLS].M == 0)
   6580 assert(eap[EAP_TTLS].S == 0)
   6581 assert(eap[EAP_TTLS].version == 0)
   6582 
   6583 = EAP - EAP_TLS - Basic Instantiation
   6584 raw(EAP_TLS()) == b'\x01\x00\x00\x06\r\x00'
   6585 
   6586 = EAP - EAP_FAST - Basic Instantiation
   6587 raw(EAP_FAST()) == b'\x01\x00\x00\x06+\x00'
   6588 
   6589 = EAP - EAP_TTLS - Basic Instantiation
   6590 raw(EAP_TTLS()) == b'\x01\x00\x00\x06\x15\x00'
   6591 
   6592 = EAP - EAP_MD5 - Basic Instantiation
   6593 raw(EAP_MD5()) == b'\x01\x00\x00\x06\x04\x00'
   6594 
   6595 = EAP - EAP_MD5 - Request - Dissection (8)
   6596 s = b'\x01\x02\x00\x16\x04\x10\x86\xf9\x89\x94\x81\x01\xb3 nHh\x1b\x8d\xe7^\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   6597 eap = EAP(s)
   6598 assert(eap.code == 1)
   6599 assert(eap.id == 2)
   6600 assert(eap.len == 22)
   6601 assert(eap.type == 4)
   6602 assert(eap.haslayer(EAP_MD5))
   6603 assert(eap[EAP_MD5].value_size == 16)
   6604 assert(eap[EAP_MD5].value == b'\x86\xf9\x89\x94\x81\x01\xb3 nHh\x1b\x8d\xe7^\xdb')
   6605 assert(eap[EAP_MD5].optional_name == b'')
   6606 
   6607 = EAP - EAP_MD5 - Response - Dissection (9)
   6608 s = b'\x02\x02\x00\x16\x04\x10\xfd\x1e\xffe\xf5\x80y\xa8\xe3\xc8\xf1\xbd\xc2\x85\xae\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   6609 eap = EAP(s)
   6610 assert(eap.code == 2)
   6611 assert(eap.id == 2)
   6612 assert(eap.len == 22)
   6613 assert(eap.type == 4)
   6614 assert(eap.haslayer(EAP_MD5))
   6615 assert(eap[EAP_MD5].value_size == 16)
   6616 assert(eap[EAP_MD5].value == b'\xfd\x1e\xffe\xf5\x80y\xa8\xe3\xc8\xf1\xbd\xc2\x85\xae\xcf')
   6617 assert(eap[EAP_MD5].optional_name == b'')
   6618 
   6619 = EAP - LEAP - Basic Instantiation
   6620 raw(LEAP()) == b'\x01\x00\x00\x08\x11\x01\x00\x00'
   6621 
   6622 = EAP - LEAP - Request - Dissection (10)
   6623 s = b'\x01D\x00\x1c\x11\x01\x00\x088\xb6\xd7\xa1E<!\x15supplicant-1'
   6624 eap = LEAP(s)
   6625 assert(eap.code == 1)
   6626 assert(eap.id == 68)
   6627 assert(eap.len == 28)
   6628 assert(eap.type == 17)
   6629 assert(eap.haslayer(LEAP))
   6630 assert(eap[LEAP].version == 1)
   6631 assert(eap[LEAP].count == 8)
   6632 assert(eap[LEAP].challenge_response == b'8\xb6\xd7\xa1E<!\x15')
   6633 assert(eap[LEAP].username == b"supplicant-1")
   6634 
   6635 = EAP - LEAP - Response - Dissection (11)
   6636 s = b'\x02D\x00,\x11\x01\x00\x18\xb3\x82[\x82\x8a\xc8M*\xf3\xe7\xb3\xad,7\x8b\xbfG\x81\xda\xbf\xe6\xc1\x9b\x95supplicant-1'
   6637 eap = LEAP(s)
   6638 assert(eap.code == 2)
   6639 assert(eap.id == 68)
   6640 assert(eap.len == 44)
   6641 assert(eap.type == 17)
   6642 assert(eap.haslayer(LEAP))
   6643 assert(eap[LEAP].version == 1)
   6644 assert(eap[LEAP].count == 24)
   6645 assert(eap[LEAP].challenge_response == b'\xb3\x82[\x82\x8a\xc8M*\xf3\xe7\xb3\xad,7\x8b\xbfG\x81\xda\xbf\xe6\xc1\x9b\x95')
   6646 assert(eap[LEAP].username == b"supplicant-1")
   6647 
   6648 = EAP - Layers (1)
   6649 eap = EAP_MD5()
   6650 assert(EAP_MD5 in eap)
   6651 assert(not EAP_TLS in eap)
   6652 assert(not EAP_FAST in eap)
   6653 assert(not LEAP in eap)
   6654 assert(EAP in eap)
   6655 eap = EAP_TLS()
   6656 assert(EAP_TLS in eap)
   6657 assert(not EAP_MD5 in eap)
   6658 assert(not EAP_FAST in eap)
   6659 assert(not LEAP in eap)
   6660 assert(EAP in eap)
   6661 eap = EAP_FAST()
   6662 assert(EAP_FAST in eap)
   6663 assert(not EAP_MD5 in eap)
   6664 assert(not EAP_TLS in eap)
   6665 assert(not LEAP in eap)
   6666 assert(EAP in eap)
   6667 eap = EAP_TTLS()
   6668 assert(EAP_TTLS in eap)
   6669 assert(not EAP_MD5 in eap)
   6670 assert(not EAP_TLS in eap)
   6671 assert(not EAP_FAST in eap)
   6672 assert(not LEAP in eap)
   6673 assert(EAP in eap)
   6674 eap = LEAP()
   6675 assert(not EAP_MD5 in eap)
   6676 assert(not EAP_TLS in eap)
   6677 assert(not EAP_FAST in eap)
   6678 assert(LEAP in eap)
   6679 assert(EAP in eap)
   6680 
   6681 = EAP - Layers (2)
   6682 eap = EAP_MD5()
   6683 assert(type(eap[EAP]) == EAP_MD5)
   6684 eap = EAP_TLS()
   6685 assert(type(eap[EAP]) == EAP_TLS)
   6686 eap = EAP_FAST()
   6687 assert(type(eap[EAP]) == EAP_FAST)
   6688 eap = EAP_TTLS()
   6689 assert(type(eap[EAP]) == EAP_TTLS)
   6690 eap = LEAP()
   6691 assert(type(eap[EAP]) == LEAP)
   6692 
   6693 
   6694 
   6695 ############
   6696 ############
   6697 + NTP module tests
   6698 
   6699 = NTP - Layers (1)
   6700 p = NTPHeader()
   6701 assert(NTPHeader in p)
   6702 assert(not NTPControl in p)
   6703 assert(not NTPPrivate in p)
   6704 assert(NTP in p)
   6705 p = NTPControl()
   6706 assert(not NTPHeader in p)
   6707 assert(NTPControl in p)
   6708 assert(not NTPPrivate in p)
   6709 assert(NTP in p)
   6710 p = NTPPrivate()
   6711 assert(not NTPHeader in p)
   6712 assert(not NTPControl in p)
   6713 assert(NTPPrivate in p)
   6714 assert(NTP in p)
   6715 
   6716 
   6717 = NTP - Layers (2)
   6718 p = NTPHeader()
   6719 assert(type(p[NTP]) == NTPHeader)
   6720 p = NTPControl()
   6721 assert(type(p[NTP]) == NTPControl)
   6722 p = NTPPrivate()
   6723 assert(type(p[NTP]) == NTPPrivate)
   6724 
   6725 
   6726 ############
   6727 ############
   6728 + NTPHeader tests
   6729 
   6730 = NTPHeader - Basic checks
   6731 len(raw(NTP())) == 48
   6732 
   6733 
   6734 = NTPHeader - Dissection
   6735 s = b"!\x0b\x06\xea\x00\x00\x00\x00\x00\x00\xf2\xc1\x7f\x7f\x01\x00\xdb9\xe8\xa21\x02\xe6\xbc\xdb9\xe8\x81\x02U8\xef\xdb9\xe8\x80\xdcl+\x06\xdb9\xe8\xa91\xcbI\xbf\x00\x00\x00\x01\xady\xf3\xa1\xe5\xfc\xd02\xd2j\x1e'\xc3\xc1\xb6\x0e"
   6736 p = NTP(s)
   6737 assert(isinstance(p, NTPHeader))
   6738 assert(p[NTPAuthenticator].key_id == 1)
   6739 assert(bytes_hex(p[NTPAuthenticator].dgst) == b'ad79f3a1e5fcd032d26a1e27c3c1b60e')
   6740 
   6741 
   6742 = NTPHeader - KoD
   6743 s = b'\xe4\x00\x06\xe8\x00\x00\x00\x00\x00\x00\x02\xcaINIT\x00\x00\x00\x00\x00\x00\x00\x00\xdb@\xe3\x9eH\xa3pj\xdb@\xe3\x9eH\xf0\xc3\\\xdb@\xe3\x9eH\xfaL\xac\x00\x00\x00\x01B\x86)\xc1Q4\x8bW8\xe7Q\xda\xd0Z\xbc\xb8'
   6744 p = NTP(s)
   6745 assert(isinstance(p, NTPHeader))
   6746 assert(p.leap == 3)
   6747 assert(p.version == 4)
   6748 assert(p.mode == 4)
   6749 assert(p.stratum == 0)
   6750 assert(p.ref_id == b'INIT')
   6751 
   6752 
   6753 = NTPHeader - Extension dissection test
   6754 s = b'#\x02\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\xdbM\xdf\x19e\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdbM\xdf\x19e\x89\xf0\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\x00\x00\x00\x00'
   6755 p = NTP(s)
   6756 assert(isinstance(p, NTPHeader))
   6757 assert(p.leap == 0)
   6758 assert(p.version == 4)
   6759 assert(p.mode == 3)
   6760 assert(p.stratum == 2)
   6761 
   6762 
   6763 ############
   6764 ############
   6765 + NTP Control (mode 6) tests
   6766 
   6767 = NTP Control (mode 6) - CTL_OP_READSTAT (1) - request
   6768 s = b'\x16\x01\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00'
   6769 p = NTP(s)
   6770 assert(isinstance(p, NTPControl))
   6771 assert(p.version == 2)
   6772 assert(p.mode == 6)
   6773 assert(p.response == 0)
   6774 assert(p.err == 0)
   6775 assert(p.more == 0)
   6776 assert(p.op_code == 1)
   6777 assert(p.sequence == 12)
   6778 assert(p.status == 0)
   6779 assert(p.association_id == 0)
   6780 assert(p.offset == 0)
   6781 assert(p.count == 0)
   6782 assert(p.data == b'')
   6783 
   6784 
   6785 = NTP Control (mode 6) - CTL_OP_READSTAT (2) - response
   6786 s = b'\x16\x81\x00\x0c\x06d\x00\x00\x00\x00\x00\x04\xe5\xfc\xf6$'
   6787 p = NTP(s)
   6788 assert(isinstance(p, NTPControl))
   6789 assert(p.version == 2)
   6790 assert(p.mode == 6)
   6791 assert(p.response == 1)
   6792 assert(p.err == 0)
   6793 assert(p.more == 0)
   6794 assert(p.op_code == 1)
   6795 assert(p.sequence == 12)
   6796 assert(isinstance(p.status_word, NTPSystemStatusPacket))
   6797 assert(p.status_word.leap_indicator == 0)
   6798 assert(p.status_word.clock_source == 6)
   6799 assert(p.status_word.system_event_counter == 6)
   6800 assert(p.status_word.system_event_code == 4)
   6801 assert(p.association_id == 0)
   6802 assert(p.offset == 0)
   6803 assert(p.count == 4)
   6804 assert(isinstance(p.data, NTPPeerStatusDataPacket))
   6805 assert(p.data.association_id == 58876)
   6806 assert(isinstance(p.data.peer_status, NTPPeerStatusPacket))
   6807 assert(p.data.peer_status.configured == 1)
   6808 assert(p.data.peer_status.auth_enabled == 1)
   6809 assert(p.data.peer_status.authentic == 1)
   6810 assert(p.data.peer_status.reachability == 1)
   6811 assert(p.data.peer_status.reserved == 0)
   6812 assert(p.data.peer_status.peer_sel == 6)
   6813 assert(p.data.peer_status.peer_event_counter == 2)
   6814 assert(p.data.peer_status.peer_event_code == 4)
   6815 
   6816 
   6817 = NTP Control (mode 6) - CTL_OP_READVAR (1) - request
   6818 s = b'\x16\x02\x00\x12\x00\x00\xfc\x8f\x00\x00\x00\x00'
   6819 p = NTP(s)
   6820 assert(isinstance(p, NTPControl))
   6821 assert(p.version == 2)
   6822 assert(p.mode == 6)
   6823 assert(p.response == 0)
   6824 assert(p.op_code == 2)
   6825 assert(p.sequence == 18)
   6826 assert(p.status == 0)
   6827 assert(p.association_id == 64655)
   6828 assert(p.data == b'')
   6829 
   6830 
   6831 = NTP Control (mode 6) - CTL_OP_READVAR (2) - reponse (1st packet)
   6832 s = b'\xd6\xa2\x00\x12\xc0\x11\xfc\x8f\x00\x00\x01\xd4srcadr=192.168.122.1, srcport=123, dstadr=192.168.122.100, dstport=123,\r\nleap=3, stratum=16, precision=-24, rootdelay=0.000, rootdisp=0.000,\r\nrefid=INIT, reftime=0x00000000.00000000, rec=0x00000000.00000000,\r\nreach=0x0, unreach=5, hmode=1, pmode=0, hpoll=6, ppoll=10, headway=62,\r\nflash=0x1200, keyid=1, offset=0.000, delay=0.000, dispersion=15937.500,\r\njitter=0.000, xleave=0.240,\r\nfiltdelay= 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00,\r\nfiltoffset= 0.00 0.00 0.00 0.00 '
   6833 p = NTP(s)
   6834 assert(isinstance(p, NTPControl))
   6835 assert(p.version == 2)
   6836 assert(p.mode == 6)
   6837 assert(p.response == 1)
   6838 assert(p.err == 0)
   6839 assert(p.more == 1)
   6840 assert(p.op_code == 2)
   6841 assert(p.sequence == 18)
   6842 assert(isinstance(p.status_word, NTPPeerStatusPacket))
   6843 assert(p.status_word.configured == 1)
   6844 assert(p.status_word.auth_enabled == 1)
   6845 assert(p.status_word.authentic == 0)
   6846 assert(p.status_word.reachability == 0)
   6847 assert(p.status_word.peer_sel == 0)
   6848 assert(p.status_word.peer_event_counter == 1)
   6849 assert(p.status_word.peer_event_code == 1)
   6850 assert(p.association_id == 64655)
   6851 assert(p.offset == 0)
   6852 assert(p.count == 468)
   6853 assert(p.data.load == b'srcadr=192.168.122.1, srcport=123, dstadr=192.168.122.100, dstport=123,\r\nleap=3, stratum=16, precision=-24, rootdelay=0.000, rootdisp=0.000,\r\nrefid=INIT, reftime=0x00000000.00000000, rec=0x00000000.00000000,\r\nreach=0x0, unreach=5, hmode=1, pmode=0, hpoll=6, ppoll=10, headway=62,\r\nflash=0x1200, keyid=1, offset=0.000, delay=0.000, dispersion=15937.500,\r\njitter=0.000, xleave=0.240,\r\nfiltdelay= 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00,\r\nfiltoffset= 0.00 0.00 0.00 0.00 ')
   6854  
   6855 
   6856 = NTP Control (mode 6) - CTL_OP_READVAR (3) - reponse (2nd packet)
   6857 s = b'\xd6\x82\x00\x12\xc0\x11\xfc\x8f\x01\xd4\x00i0.00 0.00 0.00 0.00,\r\nfiltdisp= 16000.00 16000.00 16000.00 16000.00 16000.00 16000.00 16000.00 16000.00\r\n\x00\x00\x00'
   6858 p = NTP(s)
   6859 assert(isinstance(p, NTPControl))
   6860 assert(p.version == 2)
   6861 assert(p.mode == 6)
   6862 assert(p.response == 1)
   6863 assert(p.err == 0)
   6864 assert(p.more == 0)
   6865 assert(p.op_code == 2)
   6866 assert(p.sequence == 18)
   6867 assert(isinstance(p.status_word, NTPPeerStatusPacket))
   6868 assert(p.association_id == 64655)
   6869 assert(p.offset == 468)
   6870 assert(p.count == 105)
   6871 assert(p.data.load == b'0.00 0.00 0.00 0.00,\r\nfiltdisp= 16000.00 16000.00 16000.00 16000.00 16000.00 16000.00 16000.00 16000.00\r\n\x00\x00\x00')
   6872 
   6873 
   6874 = NTP Control (mode 6) - CTL_OP_READVAR (4) - request
   6875 s = b'\x16\x02\x00\x13\x00\x00s\xb5\x00\x00\x00\x0btest1,test2\x00\x00\x00\x00\x01=\xc2;\xc7\xed\xb9US9\xd6\x89\x08\xc8\xaf\xa6\x12'
   6876 p = NTP(s)
   6877 assert(isinstance(p, NTPControl))
   6878 assert(p.version == 2)
   6879 assert(p.mode == 6)
   6880 assert(p.response == 0)
   6881 assert(p.err == 0)
   6882 assert(p.more == 0)
   6883 assert(p.op_code == 2)
   6884 assert(len(p.data.load) == 12)
   6885 assert(p.authenticator.key_id == 1)
   6886 assert(bytes_hex(p.authenticator.dgst) == b'3dc23bc7edb9555339d68908c8afa612')
   6887 
   6888 
   6889 = NTP Control (mode 6) - CTL_OP_READVAR (5) - response
   6890 s = b'\xd6\xc2\x00\x13\x05\x00s\xb5\x00\x00\x00\x00\x00\x00\x00\x01\x97(\x02I\xdb\xa0s8\xedr(`\xdbJX\n'
   6891 p = NTP(s)
   6892 assert(isinstance(p, NTPControl))
   6893 assert(p.version == 2)
   6894 assert(p.mode == 6)
   6895 assert(p.response == 1)
   6896 assert(p.err == 1)
   6897 assert(p.more == 0)
   6898 assert(p.op_code == 2)
   6899 assert(len(p.data.load) == 0)
   6900 assert(p.authenticator.key_id == 1)
   6901 assert(bytes_hex(p.authenticator.dgst) == b'97280249dba07338ed722860db4a580a')
   6902 
   6903 
   6904 = NTP Control (mode 6) - CTL_OP_WRITEVAR (1) - request
   6905 s = b'\x16\x03\x00\x11\x00\x00\x00\x00\x00\x00\x00\x0btest1,test2\x00\x00\x00\x00\x01\xaf\xf1\x0c\xb4\xc9\x94m\xfcM\x90\tJ\xa1p\x94J'
   6906 p = NTP(s)
   6907 assert(isinstance(p, NTPControl))
   6908 assert(p.version == 2)
   6909 assert(p.mode == 6)
   6910 assert(p.response == 0)
   6911 assert(p.err == 0)
   6912 assert(p.more == 0)
   6913 assert(p.op_code == 3)
   6914 assert(len(p.data.load) == 12)
   6915 assert(p.authenticator.key_id == 1)
   6916 assert(bytes_hex(p.authenticator.dgst) == b'aff10cb4c9946dfc4d90094aa170944a')
   6917 
   6918 
   6919 = NTP Control (mode 6) - CTL_OP_WRITEVAR (2) - response
   6920 s = b'\xd6\xc3\x00\x11\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x80z\x80\xfb\xaf\xc4pg\x98S\xa8\xe5xe\x81\x1c'
   6921 p = NTP(s)
   6922 assert(isinstance(p, NTPControl))
   6923 assert(p.version == 2)
   6924 assert(p.mode == 6)
   6925 assert(p.response == 1)
   6926 assert(p.err == 1)
   6927 assert(p.more == 0)
   6928 assert(p.op_code == 3)
   6929 assert(hasattr(p, 'status_word'))
   6930 assert(isinstance(p.status_word, NTPErrorStatusPacket))
   6931 assert(p.status_word.error_code == 5)
   6932 assert(len(p.data.load) == 0)
   6933 assert(p.authenticator.key_id == 1)
   6934 assert(bytes_hex(p.authenticator.dgst) == b'807a80fbafc470679853a8e57865811c')
   6935 
   6936 
   6937 = NTP Control (mode 6) - CTL_OP_CONFIGURE (1) - request
   6938 s = b'\x16\x08\x00\x16\x00\x00\x00\x00\x00\x00\x00\x0ccontrolkey 1\x00\x00\x00\x01\xea\xa7\xac\xa8\x1bj\x9c\xdbX\xe1S\r6\xfb\xef\xa4'
   6939 p = NTP(s)
   6940 assert(isinstance(p, NTPControl))
   6941 assert(p.version == 2)
   6942 assert(p.mode == 6)
   6943 assert(p.response == 0)
   6944 assert(p.err == 0)
   6945 assert(p.more == 0)
   6946 assert(p.op_code == 8)
   6947 assert(p.count == 12)
   6948 assert(p.data.load == b'controlkey 1')
   6949 assert(p.authenticator.key_id == 1)
   6950 assert(bytes_hex(p.authenticator.dgst) == b'eaa7aca81b6a9cdb58e1530d36fbefa4')
   6951 
   6952 
   6953 = NTP Control (mode 6) - CTL_OP_CONFIGURE (2) - response
   6954 s = b'\xd6\x88\x00\x16\x00\x00\x00\x00\x00\x00\x00\x12Config Succeeded\r\n\x00\x00\x00\x00\x00\x01\xbf\xa6\xd8_\xf9m\x1e2l)<\xac\xee\xc2\xa59'
   6955 p = NTP(s)
   6956 assert(isinstance(p, NTPControl))
   6957 assert(p.version == 2)
   6958 assert(p.mode == 6)
   6959 assert(p.response == 1)
   6960 assert(p.err == 0)
   6961 assert(p.more == 0)
   6962 assert(p.op_code == 8)
   6963 assert(p.count == 18)
   6964 assert(p.data.load == b'Config Succeeded\r\n\x00\x00')
   6965 assert(p.authenticator.key_id == 1)
   6966 assert(bytes_hex(p.authenticator.dgst) == b'bfa6d85ff96d1e326c293caceec2a539')
   6967 
   6968 
   6969 = NTP Control (mode 6) - CTL_OP_SAVECONFIG (1) - request
   6970 s = b'\x16\t\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x0fntp.test.2.conf\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc9\xfb\x8a\xbe<`_\xfa6\xd2\x18\xc3\xb7d\x89#'
   6971 p = NTP(s)
   6972 assert(isinstance(p, NTPControl))
   6973 assert(p.version == 2)
   6974 assert(p.mode == 6)
   6975 assert(p.response == 0)
   6976 assert(p.err == 0)
   6977 assert(p.more == 0)
   6978 assert(p.op_code == 9)
   6979 assert(p.count == 15)
   6980 assert(p.data.load == b'ntp.test.2.conf\x00')
   6981 assert(p.authenticator.key_id == 1)
   6982 assert(bytes_hex(p.authenticator.dgst) == b'c9fb8abe3c605ffa36d218c3b7648923')
   6983 
   6984 
   6985 = NTP Control (mode 6) - CTL_OP_SAVECONFIG (2) - response
   6986 s = b"\xd6\x89\x00\x1d\x00\x00\x00\x00\x00\x00\x00*Configuration saved to 'ntp.test.2.conf'\r\n\x00\x00\x00\x00\x00\x012\xc2\xbaY\xc53\xfe(\xf5P\xe5\xa0\x86\x02\x95\xd9"
   6987 p = NTP(s)
   6988 assert(isinstance(p, NTPControl))
   6989 assert(p.version == 2)
   6990 assert(p.mode == 6)
   6991 assert(p.response == 1)
   6992 assert(p.err == 0)
   6993 assert(p.more == 0)
   6994 assert(p.op_code == 9)
   6995 assert(p.count == 42)
   6996 assert(p.data.load == b"Configuration saved to 'ntp.test.2.conf'\r\n\x00\x00")
   6997 assert(p.authenticator.key_id == 1)
   6998 assert(bytes_hex(p.authenticator.dgst) == b'32c2ba59c533fe28f550e5a0860295d9')
   6999 
   7000 
   7001 = NTP Control (mode 6) - CTL_OP_REQ_NONCE (1) - request
   7002 s = b'\x16\x0c\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00'
   7003 p = NTP(s)
   7004 assert(isinstance(p, NTPControl))
   7005 assert(p.version == 2)
   7006 assert(p.mode == 6)
   7007 assert(p.response == 0)
   7008 assert(p.err == 0)
   7009 assert(p.more == 0)
   7010 assert(p.op_code == 12)
   7011 assert(p.data == b'')
   7012 assert(p.authenticator == b'')
   7013 
   7014 
   7015 = NTP Control (mode 6) - CTL_OP_REQ_NONCE (2) - response
   7016 s = b'\xd6\x8c\x00\x07\x00\x00\x00\x00\x00\x00\x00 nonce=db4186a2e1d9022472e24bc9\r\n'
   7017 p = NTP(s)
   7018 assert(isinstance(p, NTPControl))
   7019 assert(p.version == 2)
   7020 assert(p.mode == 6)
   7021 assert(p.response == 1)
   7022 assert(p.err == 0)
   7023 assert(p.more == 0)
   7024 assert(p.op_code == 12)
   7025 assert(p.data.load == b'nonce=db4186a2e1d9022472e24bc9\r\n')
   7026 assert(p.authenticator == b'')
   7027 
   7028 
   7029 = NTP Control (mode 6) - CTL_OP_READ_MRU (1) - request
   7030 s = b'\x16\n\x00\x08\x00\x00\x00\x00\x00\x00\x00(nonce=db4186a2e1d9022472e24bc9, frags=32'
   7031 p = NTP(s)
   7032 assert(isinstance(p, NTPControl))
   7033 assert(p.version == 2)
   7034 assert(p.mode == 6)
   7035 assert(p.response == 0)
   7036 assert(p.err == 0)
   7037 assert(p.op_code == 10)
   7038 assert(p.count == 40)
   7039 assert(p.data.load == b'nonce=db4186a2e1d9022472e24bc9, frags=32')
   7040 assert(p.authenticator == b'')
   7041 
   7042 = NTP Control (mode 6) - CTL_OP_READ_MRU (2) - response
   7043 s = b'\xd6\x8a\x00\x08\x00\x00\x00\x00\x00\x00\x00\xe9nonce=db4186a2e2073198b93c6419, addr.0=192.168.122.100:123,\r\nfirst.0=0xdb418673.323e1a89, last.0=0xdb418673.323e1a89, ct.0=1,\r\nmv.0=36, rs.0=0x0, WWQ.0=18446744073709509383, now=0xdb4186a2.e20ff8f4,\r\nlast.newest=0xdb418673.323e1a89\r\n\x00\x00\x00'
   7044 p = NTP(s)
   7045 assert(isinstance(p, NTPControl))
   7046 assert(p.version == 2)
   7047 assert(p.mode == 6)
   7048 assert(p.response == 1)
   7049 assert(p.err == 0)
   7050 assert(p.op_code == 10)
   7051 assert(p.count == 233)
   7052 assert(p.data.load == b'nonce=db4186a2e2073198b93c6419, addr.0=192.168.122.100:123,\r\nfirst.0=0xdb418673.323e1a89, last.0=0xdb418673.323e1a89, ct.0=1,\r\nmv.0=36, rs.0=0x0, WWQ.0=18446744073709509383, now=0xdb4186a2.e20ff8f4,\r\nlast.newest=0xdb418673.323e1a89\r\n\x00\x00\x00')
   7053 assert(p.authenticator == b'')
   7054 
   7055 
   7056 ############
   7057 ############
   7058 + NTP Private (mode 7) tests
   7059 
   7060 = NTP Private (mode 7) - error - Dissection
   7061 s = b'\x97\x00\x03\x1d@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   7062 p = NTP(s)
   7063 assert(isinstance(p, NTPPrivate))
   7064 assert(p.response == 1)
   7065 assert(p.version == 2)
   7066 assert(p.mode == 7)
   7067 assert(p.request_code == 29)
   7068 assert(p.err == 4)
   7069 assert(p.nb_items == 0)
   7070 assert(p.data_item_size == 0)
   7071 
   7072 
   7073 = NTP Private (mode 7) - REQ_PEER_LIST (1) - request
   7074 s = b'\x17\x00\x03\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\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\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\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\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   7075 p = NTP(s)
   7076 assert(isinstance(p, NTPPrivate))
   7077 assert(p.response == 0)
   7078 assert(p.version == 2)
   7079 assert(p.mode == 7)
   7080 assert(p.request_code == 0)
   7081 assert(p.nb_items == 0)
   7082 assert(p.data_item_size == 0)
   7083 
   7084 
   7085 = NTP Private (mode 7) - REQ_PEER_LIST (2) - response
   7086 s = b'\x97\x00\x03\x00\x00\x01\x00 \x7f\x7f\x01\x00\x00{\x03\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   7087 p = NTP(s)
   7088 assert(isinstance(p, NTPPrivate))
   7089 assert(p.response == 1)
   7090 assert(p.version == 2)
   7091 assert(p.mode == 7)
   7092 assert(p.request_code == 0)
   7093 assert(p.nb_items == 1)
   7094 assert(p.data_item_size == 32)
   7095 assert(type(p.data[0]) == NTPInfoPeerList)
   7096 assert(p.data[0].addr) == "127.127.1.0"
   7097 assert(p.data[0].port) == 123
   7098 
   7099 
   7100 = NTP Private (mode 7) - REQ_PEER_INFO (1) - request
   7101 s = b'\x17\x00\x03\x02\x00\x01\x00 \xc0\xa8zf\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\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\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\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\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   7102 p = NTP(s)
   7103 assert(isinstance(p, NTPPrivate))
   7104 assert(p.response == 0)
   7105 assert(p.version == 2)
   7106 assert(p.mode == 7)
   7107 assert(p.request_code == 2)
   7108 assert(p.nb_items == 1)
   7109 assert(p.data_item_size == 32)
   7110 assert(isinstance(p.req_data[0], NTPInfoPeerList))
   7111 assert(p.req_data[0].addr == "192.168.122.102")
   7112 assert(p.req_data[0].port == 123)
   7113 
   7114 
   7115 = NTP Private (mode 7) - REQ_PEER_INFO (2) - response
   7116 s = b'\x97\x00\x03\x02\x00\x01\x01\x18\xc0\xa8zf\xc0\xa8ze\x00{\x01\x03\x01\x00\x10\x06\n\xea\x04\x00\x00\xaf"\x00"\x16\x04\xb3\x01\x00\x00\x00\x00\x00\x00\x00INIT\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x82\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb<\x8d\xc5\xde\x7fB\x89\xdb<\x8d\xc5\xde\x7fB\x89\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\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\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\x01\x02\x03\x04\x05\x06\x07\x00\x00\x00\x00\x00\x03\xfd\xff\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\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   7117 p = NTP(s)
   7118 assert(isinstance(p, NTPPrivate))
   7119 assert(p.response == 1)
   7120 assert(p.version == 2)
   7121 assert(p.mode == 7)
   7122 assert(p.request_code == 2)
   7123 assert(isinstance(p.data[0], NTPInfoPeer))
   7124 assert(p.data[0].dstaddr == "192.168.122.102")
   7125 assert(p.data[0].srcaddr == "192.168.122.101")
   7126 assert(p.data[0].srcport == 123)
   7127 assert(p.data[0].associd == 1203)
   7128 assert(p.data[0].keyid == 1)
   7129 
   7130 
   7131 = NTP Private (mode 7) - REQ_PEER_LIST_SUM (1) - request
   7132 s = b'\x17\x00\x03\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\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\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\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\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\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'
   7133 p = NTP(s)
   7134 assert(isinstance(p, NTPPrivate))
   7135 assert(p.response == 0)
   7136 assert(p.version == 2)
   7137 assert(p.mode == 7)
   7138 assert(p.request_code == 1)
   7139 
   7140 
   7141 = NTP Private (mode 7) - REQ_PEER_LIST_SUM (2) - response (1st packet)
   7142 s = b'\xd7\x00\x03\x01\x00\x06\x00H\n\x00\x02\x0f\xc0\x00\x02\x01\x00{\x10\x06\n\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\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\x00\x00\x00\x00\x00\x00\x00\n\x00\x02\x0f\xc0\x00\x02\x02\x00{\x10\x06\n\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x01\x02\x01\x01\x01\x01\x01\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\x00\x00\n\x00\x02\x0f\xc0\xa8d\x01\x00{\x10\x07\n\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01eth0\xc0\xa8zg\x00{\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x02\x0f\xc0\xa8d\x02\x00{\x10\x07\n\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x00\x02\xc0\xa8zh\x00{\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\n\x00\x02\x0f\xc0\xa8d\r\x00{\x10\x07\n\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00{\x01\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\xc0\xa8zk\x00{\x01\x01\xc0\xa8ze\xc0\xa8zf\x00{\x0b\x06\x07\xf4\x83\x01\x00\x00\x07\x89\x00\x00\x00\x007\xb1\x00h\x00\x00o?\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8zm\x00{\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00'
   7143 p = NTP(s)
   7144 assert(isinstance(p, NTPPrivate))
   7145 assert(p.response == 1)
   7146 assert(p.more == 1)
   7147 assert(p.version == 2)
   7148 assert(p.mode == 7)
   7149 assert(p.request_code == 1)
   7150 assert(isinstance(x, NTPInfoPeerSummary) for x in p.data)
   7151 assert(p.data[0].srcaddr == "192.0.2.1")
   7152 
   7153 
   7154 = NTP Private (mode 7) - REQ_PEER_LIST_SUM (3) - response (2nd packet)
   7155 s = b'\xd7\x01\x03\x01\x00\x06\x00H\xc0\xa8ze\xc0\xa8zg\x00{\x10\x08\n\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01eth1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8ze\xc0\xa8zg\x00{\x10\x08\n\x00\x11\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x01\x02\x01\x01\x01\x01\x01\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\x00\x00\xc0\xa8ze\xc0\xa8zh\x00{\x10\x08\n\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01eth0\xc0\xa8zg\x00{\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8ze\xc0\xa8zi\x00{\x10\x07\n\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x00\x02\xc0\xa8zh\x00{\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc0\xa8ze\xc0\xa8zj\x00{\x10\x07\n\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00{\x01\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\xc0\xa8zk\x00{\x01\x01\xc0\xa8ze\xc0\xa8zk\x00{\x10\x07\n\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8zm\x00{\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00'
   7156 p = NTP(s)
   7157 
   7158 assert(isinstance(p, NTPPrivate))
   7159 assert(p.response == 1)
   7160 assert(p.more == 1)
   7161 assert(p.version == 2)
   7162 assert(p.mode == 7)
   7163 assert(p.request_code == 1)
   7164 assert(isinstance(x, NTPInfoPeerSummary) for x in p.data)
   7165 assert(p.data[0].srcaddr == "192.168.122.103")
   7166 
   7167 
   7168 = NTP Private (mode 7) - REQ_PEER_LIST_SUM (3) - response (3rd packet)
   7169 s = b'\x97\x02\x03\x01\x00\x02\x00H\xc0\xa8ze\xc0\xa8zl\x00{\x10\x07\n\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01eth1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8ze\xc0\xa8zm\x00{\x10\x07\n\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x01\x02\x01\x01\x01\x01\x01\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\x00\x00'
   7170 p = NTP(s)
   7171 
   7172 assert(isinstance(p, NTPPrivate))
   7173 assert(p.response == 1)
   7174 assert(p.more == 0)
   7175 assert(p.version == 2)
   7176 assert(p.mode == 7)
   7177 assert(p.request_code == 1)
   7178 assert(isinstance(x, NTPInfoPeerSummary) for x in p.data)
   7179 assert(p.data[0].srcaddr == "192.168.122.108")
   7180 
   7181 
   7182 = NTP Private (mode 7) - REQ_PEER_STATS (1) - request
   7183 s = b'\x17\x00\x03\x03\x00\x01\x00 \xc0\xa8ze\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\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\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\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\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   7184 p = NTP(s)
   7185 assert(isinstance(p, NTPPrivate))
   7186 assert(p.response == 0)
   7187 assert(p.more == 0)
   7188 assert(p.version == 2)
   7189 assert(p.mode == 7)
   7190 assert(p.request_code == 3)
   7191 assert(isinstance(p.req_data[0], NTPInfoPeerList))
   7192 
   7193 
   7194 = NTP Private (mode 7) - REQ_PEER_STATS (2) - response
   7195 s = b'\x97\x00\x03\x03\x00\x01\x00x\xc0\xa8zf\xc0\xa8ze\x00{\x00\x01\x01\x00\x10\x06\x00\x00\x00)\x00\x00\x00\x1e\x00\x02\xda|\x00\x00\x00\xbc\x00\x00\x00\x00\x00\x00\x0b\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\nJ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x07\x00\x00\x00\x00\xde\x7fB\x89\x00<\x8d\xc5\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\x00\x00\x00\x00\x00\x00\x00'
   7196 p = NTP(s)
   7197 
   7198 assert(isinstance(p, NTPPrivate))
   7199 assert(p.response == 1)
   7200 assert(p.more == 0)
   7201 assert(p.version == 2)
   7202 assert(p.mode == 7)
   7203 assert(p.request_code == 3)
   7204 assert(isinstance(x, NTPInfoPeerStats) for x in p.data)
   7205 
   7206 
   7207 = NTP Private (mode 7) - REQ_SYS_INFO (1) - request
   7208 s = b'\x17\x00\x03\x04\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\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\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\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\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   7209 p = NTP(s)
   7210 
   7211 assert(isinstance(p, NTPPrivate))
   7212 assert(p.response == 0)
   7213 assert(p.more == 0)
   7214 assert(p.version == 2)
   7215 assert(p.mode == 7)
   7216 assert(p.request_code == 4)
   7217 
   7218 
   7219 = NTP Private (mode 7) - REQ_SYS_INFO (2) - response
   7220 s = b'\x97\x00\x03\x04\x00\x01\x00P\x7f\x7f\x01\x00\x03\x00\x0b\xf0\x00\x00\x00\x00\x00\x00\x03\x06\x7f\x7f\x01\x00\xdb<\xca\xf3\xa1\x92\xe1\xf7\x06\x00\x00\x00\xce\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\x0b\x07\x00\x00\x00\x00\xde\x7fB\x89\x00<\x8d\xc5'
   7221 p = NTP(s)
   7222 
   7223 assert(isinstance(p, NTPPrivate))
   7224 assert(p.response == 1)
   7225 assert(p.more == 0)
   7226 assert(p.version == 2)
   7227 assert(p.mode == 7)
   7228 assert(p.request_code == 4)
   7229 assert(isinstance(p.data[0], NTPInfoSys))
   7230 assert(p.data[0].peer == "127.127.1.0")
   7231 assert(p.data[0].peer_mode == 3)
   7232 assert(p.data[0].leap == 0)
   7233 assert(p.data[0].stratum == 11)
   7234 assert(p.data[0].precision == 240)
   7235 assert(p.data[0].refid == "127.127.1.0")
   7236 
   7237 
   7238 = NTP Private (mode 7) - REQ_SYS_STATS (1) - request
   7239 s = b'\x17\x00\x03\x05\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\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\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\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\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   7240 p = NTP(s)
   7241 assert(isinstance(p, NTPPrivate))
   7242 assert(p.response == 0)
   7243 assert(p.more == 0)
   7244 assert(p.version == 2)
   7245 assert(p.mode == 7)
   7246 assert(p.request_code == 5)
   7247 
   7248 
   7249 = NTP Private (mode 7) - REQ_SYS_STATS (2) - response
   7250 s = b'\x97\x00\x03\x05\x00\x01\x00,\x00\x02\xe2;\x00\x02\xe2;\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b%\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b%\x00\x00\x00\x00\x00\x00\x0b=\x00\x00\x00\x00'
   7251 p = NTP(s)
   7252 assert(isinstance(p, NTPPrivate))
   7253 assert(p.response == 1)
   7254 assert(p.more == 0)
   7255 assert(p.version == 2)
   7256 assert(p.mode == 7)
   7257 assert(p.request_code == 5)
   7258 assert(isinstance(p.data[0], NTPInfoSysStats))
   7259 assert(p.data[0].timeup == 188987)
   7260 assert(p.data[0].received == 2877)
   7261 
   7262 
   7263 = NTP Private (mode 7) - REQ_IO_STATS (1) - request
   7264 s = b'\x17\x00\x03\x06\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\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\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\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\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   7265 p = NTP(s)
   7266 assert(isinstance(p, NTPPrivate))
   7267 assert(p.response == 0)
   7268 assert(p.more == 0)
   7269 assert(p.version == 2)
   7270 assert(p.mode == 7)
   7271 assert(p.request_code == 6)
   7272 
   7273 
   7274 = NTP Private (mode 7) - REQ_IO_STATS (2) - response
   7275 s = b'\x97\x00\x03\x06\x00\x01\x00(\x00\x00\x03\x04\x00\n\x00\t\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00J\x00\x00\x00\xd9\x00\x00\x00\x00\x00\x00\x00J\x00\x00\x00J'
   7276 p = NTP(s)
   7277 assert(isinstance(p, NTPPrivate))
   7278 assert(p.response == 1)
   7279 assert(p.more == 0)
   7280 assert(p.version == 2)
   7281 assert(p.mode == 7)
   7282 assert(p.request_code == 6)
   7283 assert(p.data[0].timereset == 772)
   7284 assert(p.data[0].sent == 217)
   7285 
   7286 
   7287 = NTP Private (mode 7) - REQ_MEM_STATS (1) - request
   7288 s = b'\x17\x00\x03\x07\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\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\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\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\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   7289 p = NTP(s)
   7290 assert(isinstance(p, NTPPrivate))
   7291 assert(p.response == 0)
   7292 assert(p.more == 0)
   7293 assert(p.version == 2)
   7294 assert(p.mode == 7)
   7295 assert(p.request_code == 7)
   7296 
   7297 
   7298 = NTP Private (mode 7) - REQ_MEM_STATS (2) - response
   7299 s = b'\x97\x00\x03\x07\x00\x01\x00\x94\x00\x00\n\xee\x00\x0f\x00\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\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\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\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   7300 p = NTP(s)
   7301 assert(isinstance(p, NTPPrivate))
   7302 assert(p.response == 1)
   7303 assert(p.more == 0)
   7304 assert(p.version == 2)
   7305 assert(p.mode == 7)
   7306 assert(p.request_code == 7)
   7307 assert(p.data[0].timereset == 2798)
   7308 assert(p.data[0].totalpeermem == 15)
   7309 assert(p.data[0].freepeermem == 13)
   7310 assert(p.data[0].findpeer_calls == 60)
   7311 assert(p.data[0].hashcount[25] == 1 and p.data[0].hashcount[89] == 1)
   7312 
   7313 
   7314 = NTP Private (mode 7) - REQ_LOOP_INFO (1) - request
   7315 s = b'\x17\x00\x03\x08\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\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\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\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\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   7316 p = NTP(s)
   7317 assert(isinstance(p, NTPPrivate))
   7318 assert(p.response == 0)
   7319 assert(p.more == 0)
   7320 assert(p.version == 2)
   7321 assert(p.mode == 7)
   7322 assert(p.request_code == 8)
   7323 
   7324 
   7325 = NTP Private (mode 7) - REQ_LOOP_INFO (2) - response
   7326 s = b'\x97\x00\x03\x08\x00\x01\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x04'
   7327 p = NTP(s)
   7328 assert(isinstance(p, NTPPrivate))
   7329 assert(p.response == 1)
   7330 assert(p.more == 0)
   7331 assert(p.version == 2)
   7332 assert(p.mode == 7)
   7333 assert(p.request_code == 8)
   7334 assert(p.data[0].last_offset == 0.0)
   7335 assert(p.data[0].watchdog_timer == 4)
   7336 
   7337 
   7338 
   7339 = NTP Private (mode 7) - REQ_TIMER_STATS (1) - request
   7340 s = b'\x17\x00\x03\t\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\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\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\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\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   7341 p = NTP(s)
   7342 assert(isinstance(p, NTPPrivate))
   7343 assert(p.response == 0)
   7344 assert(p.more == 0)
   7345 assert(p.version == 2)
   7346 assert(p.mode == 7)
   7347 assert(p.request_code == 9)
   7348 
   7349 
   7350 = NTP Private (mode 7) - REQ_TIMER_STATS (2) - response
   7351 s = b'\x97\x00\x03\t\x00\x01\x00\x10\x00\x00\x01h\x00\x00\x01h\x00\x00\x00\x00\x00\x00\x00\x00'
   7352 p = NTP(s)
   7353 assert(isinstance(p, NTPPrivate))
   7354 assert(p.response == 1)
   7355 assert(p.more == 0)
   7356 assert(p.version == 2)
   7357 assert(p.mode == 7)
   7358 assert(p.request_code == 9)
   7359 assert(p.data[0].timereset == 360)
   7360 assert(p.data[0].alarms == 360)
   7361 
   7362 
   7363 = NTP Private (mode 7) - REQ_CONFIG (1) - request
   7364 s = b'\x17\x80\x03\n\x00\x01\x00\xa8\xc0\xa8zm\x01\x03\x06\n\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\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\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\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\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\x00\x00\x00\xdb9\xec\x93\xb1\xa8\xa0a\x00\x00\x00\x01Z\xba\xfe\x01\x1cr\x05d\xa1\x14\xb1)\xe9vD\x8d'
   7365 p = NTP(s)
   7366 assert(isinstance(p, NTPPrivate))
   7367 assert(p.response == 0)
   7368 assert(p.more == 0)
   7369 assert(p.version == 2)
   7370 assert(p.mode == 7)
   7371 assert(p.request_code == 10)
   7372 assert(p.nb_items == 1)
   7373 assert(p.data_item_size == 168)
   7374 assert(hasattr(p, 'req_data'))
   7375 assert(isinstance(p.req_data[0], NTPConfPeer))
   7376 assert(p.req_data[0].peeraddr == "192.168.122.109")
   7377 assert(p.req_data[0].hmode == 1)
   7378 assert(p.req_data[0].version == 3)
   7379 assert(p.req_data[0].minpoll == 6)
   7380 assert(p.req_data[0].maxpoll == 10)
   7381 assert(hasattr(p, 'authenticator'))
   7382 assert(p.authenticator.key_id == 1)
   7383 assert(bytes_hex(p.authenticator.dgst) == b'5abafe011c720564a114b129e976448d')
   7384 
   7385 
   7386 = NTP Private (mode 7) - REQ_CONFIG (2) - response
   7387 s = b'\x97\x00\x03\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   7388 p = NTP(s)
   7389 assert(isinstance(p, NTPPrivate))
   7390 assert(p.response == 1)
   7391 assert(p.more == 0)
   7392 assert(p.version == 2)
   7393 assert(p.mode == 7)
   7394 assert(p.auth == 0)
   7395 assert(p.request_code == 10)
   7396 assert(p.err == 0)
   7397 assert(p.nb_items == 0)
   7398 assert(p.data_item_size == 0)
   7399 
   7400 
   7401 = NTP Private (mode 7) - REQ_UNCONFIG (1) - request
   7402 s = b'\x17\x80\x03\x0b\x00\x01\x00\x18\xc0\xa8zk\x00\x00\x00\x00X\x88P\xb1\xff\x7f\x00\x008\x88P\xb1\xff\x7f\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\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\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\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb9\xf0\x1bq\xc8\xe5\xa6\x00\x00\x00\x01\x1dM;\xfeZ~]Z\xe3Ea\x92\x9aE\xd8%'
   7403 p = NTP(s)
   7404 assert(isinstance(p, NTPPrivate))
   7405 assert(p.response == 0)
   7406 assert(p.more == 0)
   7407 assert(p.version == 2)
   7408 assert(p.mode == 7)
   7409 assert(p.request_code == 11)
   7410 assert(p.nb_items == 1)
   7411 assert(p.data_item_size == 24)
   7412 assert(hasattr(p, 'req_data'))
   7413 assert(isinstance(p.req_data[0], NTPConfUnpeer))
   7414 assert(p.req_data[0].peeraddr == "192.168.122.107")
   7415 assert(p.req_data[0].v6_flag == 0)
   7416 assert(hasattr(p, 'authenticator'))
   7417 assert(p.authenticator.key_id == 1)
   7418 assert(bytes_hex(p.authenticator.dgst) == b'1d4d3bfe5a7e5d5ae34561929a45d825')
   7419 
   7420 
   7421 = NTP Private (mode 7) - REQ_UNCONFIG (2) - response
   7422 s = b'\x97\x00\x03\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   7423 p = NTP(s)
   7424 assert(isinstance(p, NTPPrivate))
   7425 assert(p.response == 1)
   7426 assert(p.more == 0)
   7427 assert(p.version == 2)
   7428 assert(p.mode == 7)
   7429 assert(p.auth == 0)
   7430 assert(p.request_code == 11)
   7431 assert(p.err == 0)
   7432 assert(p.nb_items == 0)
   7433 assert(p.data_item_size == 0)
   7434 
   7435 
   7436 = NTP Private (mode 7) - REQ_RESADDFLAGS (1) - request
   7437 s = b'\x17\x80\x03\x11\x00\x01\x000\xc0\xa8zi\xff\xff\xff\xff\x04\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\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\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\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\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\x00\xdb9\xf0V\xa9"\xe6_\x00\x00\x00\x01>=\xb70Tp\xee\xae\xe1\xad4b\xef\xe3\x80\xc8'
   7438 p = NTP(s)
   7439 assert(isinstance(p, NTPPrivate))
   7440 assert(p.response == 0)
   7441 assert(p.more == 0)
   7442 assert(p.version == 2)
   7443 assert(p.mode == 7)
   7444 assert(p.request_code == 17)
   7445 assert(p.nb_items == 1)
   7446 assert(p.data_item_size == 48)
   7447 assert(hasattr(p, 'req_data'))
   7448 assert(isinstance(p.req_data[0], NTPConfRestrict))
   7449 assert(p.req_data[0].addr == "192.168.122.105")
   7450 assert(p.req_data[0].mask == "255.255.255.255")
   7451 assert(hasattr(p, 'authenticator'))
   7452 assert(p.authenticator.key_id == 1)
   7453 assert(bytes_hex(p.authenticator.dgst) == b'3e3db7305470eeaee1ad3462efe380c8')
   7454 
   7455 
   7456 = NTP Private (mode 7) - REQ_RESSUBFLAGS (1) - request
   7457 s = b'\x17\x80\x03\x12\x00\x01\x000\xc0\xa8zi\xff\xff\xff\xff\x00\x10\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\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\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\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\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\xdb9\xf0F\xe0C\xa9@\x00\x00\x00\x01>e\r\xdf\xdb\x1e1h\xd0\xca)L\x07k\x90\n'
   7458 p = NTP(s)
   7459 assert(isinstance(p, NTPPrivate))
   7460 assert(p.response == 0)
   7461 assert(p.more == 0)
   7462 assert(p.version == 2)
   7463 assert(p.mode == 7)
   7464 assert(p.request_code == 18)
   7465 assert(p.nb_items == 1)
   7466 assert(p.data_item_size == 48)
   7467 assert(hasattr(p, 'req_data'))
   7468 assert(isinstance(p.req_data[0], NTPConfRestrict))
   7469 assert(p.req_data[0].addr == "192.168.122.105")
   7470 assert(p.req_data[0].mask == "255.255.255.255")
   7471 assert(hasattr(p, 'authenticator'))
   7472 assert(p.authenticator.key_id == 1)
   7473 assert(bytes_hex(p.authenticator.dgst) == b'3e650ddfdb1e3168d0ca294c076b900a')
   7474 
   7475 
   7476 = NTP Private (mode 7) - REQ_RESET_PEER (1) - request
   7477 s = b"\x17\x80\x03\x16\x00\x01\x00\x18\xc0\xa8zf\x00\x00\x00\x00X\x88P\xb1\xff\x7f\x00\x008\x88P\xb1\xff\x7f\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\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\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\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb9\xef!\x99\x88\xa3\xf1\x00\x00\x00\x01\xb1\xff\xe8\xefB=\xa9\x96\xdc\xe3\x13'\xb3\xfc\xc2\xf5"
   7478 p = NTP(s)
   7479 assert(isinstance(p, NTPPrivate))
   7480 assert(p.response == 0)
   7481 assert(p.more == 0)
   7482 assert(p.version == 2)
   7483 assert(p.mode == 7)
   7484 assert(p.request_code == 22)
   7485 assert(p.nb_items == 1)
   7486 assert(p.data_item_size == 24)
   7487 assert(hasattr(p, 'req_data'))
   7488 assert(isinstance(p.req_data[0], NTPConfUnpeer))
   7489 assert(p.req_data[0].peeraddr == "192.168.122.102")
   7490 assert(p.req_data[0].v6_flag == 0)
   7491 
   7492 
   7493 = NTP Private (mode 7) - REQ_AUTHINFO (1) - response
   7494 s = b'\x97\x00\x03\x1c\x00\x01\x00$\x00\x00\x01\xdd\x00\x00\x00\x02\x00\x00\x00\n\x00\x00\x00`\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00/\x00\x00\x00\x00\x00\x00\x00\x01'
   7495 p = NTP(s)
   7496 assert(isinstance(p, NTPPrivate))
   7497 assert(p.response == 1)
   7498 assert(p.more == 0)
   7499 assert(p.version == 2)
   7500 assert(p.mode == 7)
   7501 assert(p.auth == 0)
   7502 assert(p.request_code == 28)
   7503 assert(p.err == 0)
   7504 assert(p.nb_items == 1)
   7505 assert(p.data_item_size == 36)
   7506 assert(hasattr(p, 'data'))
   7507 assert(isinstance(p.data[0], NTPInfoAuth))
   7508 assert(p.data[0].timereset == 477)
   7509 assert(p.data[0].numkeys == 2)
   7510 assert(p.data[0].numfreekeys == 10)
   7511 assert(p.data[0].keylookups == 96)
   7512 assert(p.data[0].keynotfound == 0)
   7513 assert(p.data[0].encryptions == 9)
   7514 assert(p.data[0].decryptions == 47)
   7515 assert(p.data[0].expired == 0)
   7516 assert(p.data[0].keyuncached == 1)
   7517 
   7518 
   7519 = NTP Private (mode 7) - REQ_ADD_TRAP (1) - request
   7520 s = b'\x17\x80\x03\x1e\x00\x01\x000\x00\x00\x00\x00\xc0\x00\x02\x03H\x0f\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\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\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\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\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\xdb9\xedB\xdd\xda\x7f\x97\x00\x00\x00\x01b$\xb8IM.\xa61\xd0\x85I\x8f\xa7\'\x89\x92'
   7521 p = NTP(s)
   7522 assert(isinstance(p, NTPPrivate))
   7523 assert(p.response == 0)
   7524 assert(p.more == 0)
   7525 assert(p.version == 2)
   7526 assert(p.mode == 7)
   7527 assert(p.auth == 1)
   7528 assert(p.request_code == 30)
   7529 assert(p.err == 0)
   7530 assert(p.nb_items == 1)
   7531 assert(hasattr(p, 'req_data'))
   7532 assert(isinstance(p.req_data[0], NTPConfTrap))
   7533 assert(p.req_data[0].trap_address == '192.0.2.3')
   7534 assert(hasattr(p, 'authenticator'))
   7535 assert(p.authenticator.key_id == 1)
   7536 assert(bytes_hex(p.authenticator.dgst) == b'6224b8494d2ea631d085498fa7278992')
   7537 
   7538 
   7539 = NTP Private (mode 7) - REQ_ADD_TRAP (2) - response
   7540 s = b'\x97\x00\x03\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   7541 p = NTP(s)
   7542 assert(isinstance(p, NTPPrivate))
   7543 assert(p.response == 1)
   7544 assert(p.more == 0)
   7545 assert(p.version == 2)
   7546 assert(p.mode == 7)
   7547 assert(p.auth == 0)
   7548 assert(p.request_code == 30)
   7549 assert(p.err == 0)
   7550 assert(p.nb_items == 0)
   7551 assert(p.data_item_size == 0)
   7552 
   7553 
   7554 = NTP Private (mode 7) - REQ_CLR_TRAP (1) - request
   7555 s = b'\x17\x80\x03\x1f\x00\x01\x000\x00\x00\x00\x00\xc0\x00\x02\x03H\x0f\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\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\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\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\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\xdb9\xedb\xb3\x18\x1c\x00\x00\x00\x00\x01\xa5_V\x9e\xb8qD\x92\x1b\x1c>Z\xad]*\x89'
   7556 p = NTP(s)
   7557 assert(isinstance(p, NTPPrivate))
   7558 assert(p.response == 0)
   7559 assert(p.more == 0)
   7560 assert(p.version == 2)
   7561 assert(p.mode == 7)
   7562 assert(p.auth == 1)
   7563 assert(p.request_code == 31)
   7564 assert(p.err == 0)
   7565 assert(p.nb_items == 1)
   7566 assert(hasattr(p, 'req_data'))
   7567 assert(isinstance(p.req_data[0], NTPConfTrap))
   7568 assert(p.req_data[0].trap_address == '192.0.2.3')
   7569 assert(hasattr(p, 'authenticator'))
   7570 assert(p.authenticator.key_id == 1)
   7571 assert(bytes_hex(p.authenticator.dgst) == b'a55f569eb87144921b1c3e5aad5d2a89')
   7572 
   7573 
   7574 = NTP Private (mode 7) - REQ_CLR_TRAP (2) - response
   7575 s = b'\x97\x00\x03\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   7576 p = NTP(s)
   7577 assert(isinstance(p, NTPPrivate))
   7578 assert(p.response == 1)
   7579 assert(p.more == 0)
   7580 assert(p.version == 2)
   7581 assert(p.mode == 7)
   7582 assert(p.auth == 0)
   7583 assert(p.request_code == 31)
   7584 assert(p.err == 0)
   7585 assert(p.nb_items == 0)
   7586 assert(p.data_item_size == 0)
   7587 
   7588 
   7589 = NTP Private (mode 7) - REQ_GET_CTLSTATS - response
   7590 s = b'\x97\x00\x03"\x00\x01\x00<\x00\x00\x00\xed\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   7591 p = NTP(s)
   7592 assert(isinstance(p, NTPPrivate))
   7593 assert(p.response == 1)
   7594 assert(p.more == 0)
   7595 assert(p.version == 2)
   7596 assert(p.mode == 7)
   7597 assert(p.auth == 0)
   7598 assert(p.request_code == 34)
   7599 assert(p.nb_items == 1)
   7600 assert(p.data_item_size == 60)
   7601 assert(type(p.data[0]) == NTPInfoControl)
   7602 assert(p.data[0].ctltimereset == 237)
   7603 
   7604 
   7605 = NTP Private (mode 7) - REQ_GET_KERNEL (1) - request
   7606 s = b'\x17\x00\x03&\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\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\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\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\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   7607 p = NTP(s)
   7608 assert(isinstance(p, NTPPrivate))
   7609 assert(p.response == 0)
   7610 assert(p.more == 0)
   7611 assert(p.version == 2)
   7612 assert(p.mode == 7)
   7613 assert(p.auth == 0)
   7614 assert(p.request_code == 38)
   7615 assert(p.nb_items == 0)
   7616 assert(p.data_item_size == 0)
   7617 
   7618 
   7619 = NTP Private (mode 7) - REQ_GET_KERNEL (2) - response
   7620 s = b'\x97\x00\x03&\x00\x01\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4$\x00\x00\xf4$\x00 A\x00\x00\x00\x00\x00\x03\x00\x00\x00\x01\x01\xf4\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'
   7621 p = NTP(s)
   7622 assert(isinstance(p, NTPPrivate))
   7623 assert(p.response == 1)
   7624 assert(p.more == 0)
   7625 assert(p.version == 2)
   7626 assert(p.mode == 7)
   7627 assert(p.auth == 0)
   7628 assert(p.request_code == 38)
   7629 assert(p.nb_items == 1)
   7630 assert(p.data_item_size == 60)
   7631 assert(isinstance(p.data[0], NTPInfoKernel))
   7632 assert(p.data[0].maxerror == 16000000)
   7633 assert(p.data[0].esterror == 16000000)
   7634 assert(p.data[0].status == 8257)
   7635 assert(p.data[0].constant == 3)
   7636 assert(p.data[0].precision == 1)
   7637 assert(p.data[0].tolerance == 32768000)
   7638 
   7639 
   7640 
   7641 = NTP Private (mode 7) - REQ_MON_GETLIST_1 (1) - request
   7642 s = b'\x17\x00\x03*\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\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\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\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\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   7643 p = NTP(s)
   7644 assert(isinstance(p, NTPPrivate))
   7645 assert(p.response == 0)
   7646 assert(p.more == 0)
   7647 assert(p.version == 2)
   7648 assert(p.mode == 7)
   7649 assert(p.request_code == 42)
   7650 assert(p.nb_items == 0)
   7651 assert(p.data_item_size == 0)
   7652 
   7653 
   7654 = NTP Private (mode 7) - REQ_MON_GETLIST_1 (2) - response
   7655 s = b'\xd7\x00\x03*\x00\x06\x00H\x00\x00\x00;\x00\x00\x00;\x00\x00\x01\xd0\x00\x00\x00\x01\x94mw\xe9\xc0\xa8zg\x00\x00\x00\x01\x00{\x03\x04\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;\x00\x00\x00;\x00\x00\x01\xd0\x00\x00\x00\x01\x13\xb6\xa9J\xc0\xa8zg\x00\x00\x00\x01\x00{\x03\x04\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;\x00\x00\x00;\x00\x00\x01\xd0\x00\x00\x00\x01\xbb]\x81\xea\xc0\xa8zg\x00\x00\x00\x01\x00{\x03\x04\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;\x00\x00\x00;\x00\x00\x01\xd0\x00\x00\x00\x01\xfc\xbf\xd5a\xc0\xa8zg\x00\x00\x00\x01\x00{\x03\x04\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;\x00\x00\x00;\x00\x00\x01\xd0\x00\x00\x00\x01\xbe\x10x\xa8\xc0\xa8zg\x00\x00\x00\x01\x00{\x03\x04\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;\x00\x00\x00;\x00\x00\x01\xd0\x00\x00\x00\x01\xde[ng\xc0\xa8zg\x00\x00\x00\x01\x00{\x03\x04\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\x00\x00\x00\x00\x00\x00\x00'
   7656 p = NTP(s)
   7657 assert(isinstance(p, NTPPrivate))
   7658 assert(p.response == 1)
   7659 assert(p.more == 1)
   7660 assert(p.version == 2)
   7661 assert(p.mode == 7)
   7662 assert(p.request_code == 42)
   7663 assert(p.nb_items == 6)
   7664 assert(p.data_item_size == 72)
   7665 
   7666 
   7667 = NTP Private (mode 7) - REQ_IF_STATS (1) - request
   7668 s = b'\x17\x80\x03,\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\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\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\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\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb9\xeb\xdd\x8cH\xefe\x00\x00\x00\x01\x8b\xfb\x90u\xa8ad\xe8\x87\xca\xbf\x96\xd2\x9d\xddI'
   7669 p = NTP(s)
   7670 assert(isinstance(p, NTPPrivate))
   7671 assert(p.response == 0)
   7672 assert(p.more == 0)
   7673 assert(p.version == 2)
   7674 assert(p.mode == 7)
   7675 assert(p.auth == 1)
   7676 assert(p.request_code == 44)
   7677 assert(p.nb_items == 0)
   7678 assert(p.data_item_size == 0)
   7679 assert(hasattr(p, 'authenticator'))
   7680 assert(p.authenticator.key_id == 1)
   7681 assert(bytes_hex(p.authenticator.dgst) == b'8bfb9075a86164e887cabf96d29ddd49')
   7682 
   7683 
   7684 = NTP Private (mode 7) - REQ_IF_STATS (2) - response
   7685 s = b"\xd7\x00\x03,\x00\x03\x00\x88\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\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x01lo\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\x05\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\x01\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00\x00\x00\n\x00\x01\x00\x00\x00\x00\xfe\x80\x00\x00\x00\x00\x00\x00\n\x00'\xff\xfe\xe3\x81r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01eth0\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\x11\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\x02\x00\x00\x00\x02\x00\x00\x00\x06\x00\x00\x00\x00\x00\n\x00\x01\x00\x00\x00\x00\xfe\x80\x00\x00\x00\x00\x00\x00\n\x00'\xff\xfe\xa0\x1d\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01eth1\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\x11\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\x03\x00\x00\x00\x03\x00\x00\x00\x05\x00\x00\x00\x00\x00\n\x00\x01\x00\x00\x00\x00"
   7686 p = NTP(s)
   7687 assert(isinstance(p, NTPPrivate))
   7688 assert(p.response == 1)
   7689 assert(p.more == 1)
   7690 assert(p.version == 2)
   7691 assert(p.mode == 7)
   7692 assert(p.auth == 0)
   7693 assert(p.request_code == 44)
   7694 assert(p.err == 0)
   7695 assert(p.nb_items == 3)
   7696 assert(p.data_item_size == 136)
   7697 assert(isinstance(p.data[0], NTPInfoIfStatsIPv6))
   7698 assert(p.data[0].unaddr == "::1")
   7699 assert(p.data[0].unmask == "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")
   7700 assert(p.data[0].ifname.startswith(b"lo"))
   7701 
   7702 
   7703 = NTP Private (mode 7) - REQ_IF_STATS (3) - response
   7704 s = b'\xd7\x01\x03,\x00\x03\x00\x88\xc0\xa8ze\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8z\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00eth1\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\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x02\x00\x02\x00\x01\x00\x00\x00\x00\n\x00\x02\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x02\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00eth0\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\x19\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\x00\x03\x00\x00\x00\x00\x00\x02\x00\x01\x00\x00\x00\x00\x7f\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\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00lo\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\x05\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\x00\x02\x00\x00\x00\x00\x00\x02\x00\x01\x00\x00\x00\x00'
   7705 p = NTP(s)
   7706 assert(isinstance(p, NTPPrivate))
   7707 assert(p.response == 1)
   7708 assert(p.more == 1)
   7709 assert(p.version == 2)
   7710 assert(p.mode == 7)
   7711 assert(p.auth == 0)
   7712 assert(p.request_code == 44)
   7713 assert(p.err == 0)
   7714 assert(p.nb_items == 3)
   7715 assert(p.data_item_size == 136)
   7716 assert(isinstance(p.data[0], NTPInfoIfStatsIPv4))
   7717 assert(p.data[0].unaddr == "192.168.122.101")
   7718 assert(p.data[0].unmask == "255.255.255.0")
   7719 assert(p.data[0].ifname.startswith(b"eth1"))
   7720 
   7721 
   7722 = NTP Private (mode 7) - REQ_IF_RELOAD (1) - request
   7723 s = b'\x17\x80\x03-\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\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\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\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\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb9\xed\xa3\xdc\x7f\xc6\x11\x00\x00\x00\x01\xfb>\x96*\xe7O\xf7\x8feh\xd4\x07L\xc0\x08\xcb'
   7724 p = NTP(s)
   7725 assert(isinstance(p, NTPPrivate))
   7726 assert(p.response == 0)
   7727 assert(p.more == 0)
   7728 assert(p.version == 2)
   7729 assert(p.mode == 7)
   7730 assert(p.auth == 1)
   7731 assert(p.request_code == 45)
   7732 assert(p.nb_items == 0)
   7733 assert(p.data_item_size == 0)
   7734 assert(hasattr(p, 'authenticator'))
   7735 assert(p.authenticator.key_id == 1)
   7736 assert(bytes_hex(p.authenticator.dgst) == b'fb3e962ae74ff78f6568d4074cc008cb')
   7737 
   7738 
   7739 = NTP Private (mode 7) - REQ_IF_RELOAD (2) - response
   7740 s = b'\xd7\x00\x03-\x00\x03\x00\x88\x7f\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\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00lo\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\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x02\x00\x01\x00\x00\x00\x00\n\x00\x02\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x02\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00eth0\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\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x01\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x05\x00\x02\x00\x01\x00\x00\x00\x00\xc0\xa8ze\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8z\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00eth1\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\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=\x00\x00\x00}\x00\x00\x00\x00\x00\x00\x01\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\t\x00\x02\x00\x01\x00\x00\x00\x00'
   7741 p = NTP(s)
   7742 assert(isinstance(p, NTPPrivate))
   7743 assert(p.response == 1)
   7744 assert(p.more == 1)
   7745 assert(p.version == 2)
   7746 assert(p.mode == 7)
   7747 assert(p.auth == 0)
   7748 assert(p.request_code == 45)
   7749 assert(p.err == 0)
   7750 assert(p.nb_items == 3)
   7751 assert(p.data_item_size == 136)
   7752 assert(isinstance(p.data[0], NTPInfoIfStatsIPv4))
   7753 assert(p.data[0].unaddr == "127.0.0.1")
   7754 assert(p.data[0].unmask == "255.0.0.0")
   7755 assert(p.data[0].ifname.startswith(b"lo"))
   7756 
   7757 
   7758 ############
   7759 ############
   7760 + VXLAN layer
   7761 
   7762 = Build a VXLAN packet with VNI of 42
   7763 raw(UDP(sport=1024, dport=4789, len=None, chksum=None)/VXLAN(flags=0x08, vni=42)) == b'\x04\x00\x12\xb5\x00\x10\x00\x00\x08\x00\x00\x00\x00\x00\x2a\x00'
   7764 
   7765 = Verify VXLAN Ethernet Binding
   7766 pkt = VXLAN(raw(VXLAN(vni=23)/Ether(dst="11:11:11:11:11:11", src="11:11:11:11:11:11", type=0x800)))
   7767 pkt.flags.NextProtocol and pkt.NextProtocol == 3
   7768 
   7769 = Verify UDP dport overloading
   7770 p = Ether(dst="11:11:11:11:11:11", src="22:22:22:22:22:22")
   7771 p /= IP(src="1.1.1.1", dst="2.2.2.2") / UDP(sport=1111)
   7772 p /= VXLAN(flags=0x8, vni=42) / Ether() / IP()
   7773 p = Ether(raw(p))
   7774 assert(p[UDP].dport == 4789)
   7775 assert(p[Ether:2].type == 0x800)
   7776 
   7777 = Build a VXLAN packet with next protocol field
   7778 p = Ether(dst="11:11:11:11:11:11", src="22:22:22:22:22:22")
   7779 p /= IP(src="1.1.1.1", dst="2.2.2.2") / UDP(sport=1111)
   7780 p /= VXLAN(flags=0xC, vni=42, NextProtocol=3) / Ether() / IP()
   7781 p = Ether(raw(p))
   7782 assert(p[UDP].dport == 4789)
   7783 assert(p[VXLAN].reserved0 == 0x0)
   7784 assert(p[VXLAN].NextProtocol == 3)
   7785 assert(p[Ether:2].type == 0x800)
   7786 
   7787 = Build a VXLAN packet with no group policy ID
   7788 p = Ether(dst="11:11:11:11:11:11", src="22:22:22:22:22:22")
   7789 p /= IP(src="1.1.1.1", dst="2.2.2.2") / UDP(sport=1111)
   7790 p /= VXLAN(flags=0x8, vni=42) / Ether() / IP()
   7791 p = Ether(raw(p))
   7792 assert(p[VXLAN].reserved1 == 0x0)
   7793 assert(p[VXLAN].gpid is None)
   7794 assert(p[Ether:2].type == 0x800)
   7795 
   7796 = Build a VXLAN packet with group policy ID = 42
   7797 p = Ether(dst="11:11:11:11:11:11", src="22:22:22:22:22:22")
   7798 p /= IP(src="1.1.1.1", dst="2.2.2.2") / UDP(sport=1111)
   7799 p /= VXLAN(flags=0x88, gpid=42, vni=42) / Ether() / IP()
   7800 p = Ether(raw(p))
   7801 assert(p[VXLAN].gpid == 42)
   7802 assert(p[VXLAN].reserved1 is None)
   7803 assert(p[Ether:2].type == 0x800)
   7804 
   7805 
   7806 ############
   7807 ############
   7808 ############
   7809 + Tests of StreamSocket
   7810 
   7811 = Test with DNS over TCP
   7812 ~ netaccess
   7813 
   7814 import socket
   7815 sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   7816 sck.connect(("8.8.8.8", 53))
   7817 
   7818 class DNSTCP(Packet):
   7819     name = "DNS over TCP"
   7820     fields_desc = [ FieldLenField("len", None, fmt="!H", length_of="dns"),
   7821                     PacketLenField("dns", 0, DNS, length_from=lambda p: p.len)]
   7822 
   7823 ssck = StreamSocket(sck)
   7824 ssck.basecls = DNSTCP
   7825 
   7826 r = ssck.sr1(DNSTCP(dns=DNS(rd=1, qd=DNSQR(qname="www.example.com"))))
   7827 sck.close()
   7828 assert(DNSTCP in r and len(r.dns.an))
   7829 
   7830 ############
   7831 + Tests of SSLStreamContext
   7832 
   7833 = Test with recv() calls that return exact packet-length rawings
   7834 ~ sslraweamsocket
   7835 
   7836 import socket
   7837 class MockSocket(object):
   7838     def __init__(self):
   7839         self.l = [ b'\x00\x00\x00\x01', b'\x00\x00\x00\x02', b'\x00\x00\x00\x03' ]
   7840     def recv(self, x):
   7841         if len(self.l) == 0:
   7842             raise socket.error(100, 'EOF')
   7843         return self.l.pop(0)
   7844 
   7845 class TestPacket(Packet):
   7846     name = 'TestPacket'
   7847     fields_desc = [
   7848         IntField('data', 0)
   7849     ]
   7850     def guess_payload_class(self, p):
   7851         return conf.padding_layer
   7852 
   7853 s = MockSocket()
   7854 ss = SSLStreamSocket(s, basecls=TestPacket)
   7855 
   7856 p = ss.recv()
   7857 assert(p.data == 1)
   7858 p = ss.recv()
   7859 assert(p.data == 2)
   7860 p = ss.recv()
   7861 assert(p.data == 3)
   7862 try:
   7863     ss.recv()
   7864     ret = False
   7865 except socket.error:
   7866     ret = True
   7867 
   7868 assert(ret)
   7869 
   7870 = Test with recv() calls that return twice as much data as the exact packet-length
   7871 ~ sslraweamsocket
   7872 
   7873 import socket
   7874 class MockSocket(object):
   7875     def __init__(self):
   7876         self.l = [ b'\x00\x00\x00\x01\x00\x00\x00\x02', b'\x00\x00\x00\x03\x00\x00\x00\x04' ]
   7877     def recv(self, x):
   7878         if len(self.l) == 0:
   7879             raise socket.error(100, 'EOF')
   7880         return self.l.pop(0)
   7881 
   7882 class TestPacket(Packet):
   7883     name = 'TestPacket'
   7884     fields_desc = [
   7885         IntField('data', 0)
   7886     ]
   7887     def guess_payload_class(self, p):
   7888         return conf.padding_layer
   7889 
   7890 s = MockSocket()
   7891 ss = SSLStreamSocket(s, basecls=TestPacket)
   7892 
   7893 p = ss.recv()
   7894 assert(p.data == 1)
   7895 p = ss.recv()
   7896 assert(p.data == 2)
   7897 p = ss.recv()
   7898 assert(p.data == 3)
   7899 p = ss.recv()
   7900 assert(p.data == 4)
   7901 try:
   7902     ss.recv()
   7903     ret = False
   7904 except socket.error:
   7905     ret = True
   7906 
   7907 assert(ret)
   7908 
   7909 = Test with recv() calls that return not enough data
   7910 ~ sslraweamsocket
   7911 
   7912 import socket
   7913 class MockSocket(object):
   7914     def __init__(self):
   7915         self.l = [ b'\x00\x00', b'\x00\x01', b'\x00\x00\x00', b'\x02', b'\x00\x00', b'\x00', b'\x03' ]
   7916     def recv(self, x):
   7917         if len(self.l) == 0:
   7918             raise socket.error(100, 'EOF')
   7919         return self.l.pop(0)
   7920 
   7921 class TestPacket(Packet):
   7922     name = 'TestPacket'
   7923     fields_desc = [
   7924         IntField('data', 0)
   7925     ]
   7926     def guess_payload_class(self, p):
   7927         return conf.padding_layer
   7928 
   7929 s = MockSocket()
   7930 ss = SSLStreamSocket(s, basecls=TestPacket)
   7931 
   7932 try:
   7933     p = ss.recv()
   7934     ret = False
   7935 except:
   7936     ret = True
   7937 
   7938 assert(ret)
   7939 p = ss.recv()
   7940 assert(p.data == 1)
   7941 try:
   7942     p = ss.recv()
   7943     ret = False
   7944 except:
   7945     ret = True
   7946 
   7947 assert(ret)
   7948 p = ss.recv()
   7949 assert(p.data == 2)
   7950 try:
   7951     p = ss.recv()
   7952     ret = False
   7953 except:
   7954     ret = True
   7955 
   7956 assert(ret)
   7957 try:
   7958     p = ss.recv()
   7959     ret = False
   7960 except:
   7961     ret = True
   7962 
   7963 assert(ret)
   7964 p = ss.recv()
   7965 assert(p.data == 3)
   7966 
   7967 
   7968 ############
   7969 ############
   7970 + Test correct conversion from binary to rawing of IPv6 addresses
   7971 
   7972 = IPv6 bin to rawing conversion
   7973 from scapy.pton_ntop import _inet6_ntop, inet_ntop
   7974 import socket
   7975 for binfrm, address in [
   7976         (b'\x00' * 16, '::'),
   7977         (b'\x11\x11\x22\x22\x33\x33\x44\x44\x55\x55\x66\x66\x77\x77\x88\x88',
   7978          '1111:2222:3333:4444:5555:6666:7777:8888'),
   7979         (b'\x11\x11\x22\x22\x33\x33\x44\x44\x55\x55\x00\x00\x00\x00\x00\x00',
   7980          '1111:2222:3333:4444:5555::'),
   7981         (b'\x00\x00\x00\x00\x00\x00\x44\x44\x55\x55\x66\x66\x77\x77\x88\x88',
   7982          '::4444:5555:6666:7777:8888'),
   7983         (b'\x00\x00\x00\x00\x33\x33\x44\x44\x00\x00\x00\x00\x00\x00\x88\x88',
   7984          '0:0:3333:4444::8888'),
   7985         (b'\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
   7986          '1::'),
   7987         (b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01',
   7988          '::1'),
   7989         (b'\x11\x11\x00\x00\x00\x00\x44\x44\x00\x00\x00\x00\x77\x77\x88\x88',
   7990          '1111::4444:0:0:7777:8888'),
   7991         (b'\x10\x00\x02\x00\x00\x30\x00\x04\x00\x05\x00\x60\x07\x00\x80\x00',
   7992          '1000:200:30:4:5:60:700:8000'),
   7993 ]:
   7994     addr1 = inet_ntop(socket.AF_INET6, binfrm)
   7995     addr2 = _inet6_ntop(binfrm)
   7996     assert address == addr1 == addr2
   7997 
   7998 = IPv6 bin to rawing conversion - Zero-block of length 1
   7999 binfrm = b'\x11\x11\x22\x22\x33\x33\x44\x44\x55\x55\x66\x66\x00\x00\x88\x88'
   8000 addr1, addr2 = inet_ntop(socket.AF_INET6, binfrm), _inet6_ntop(binfrm)
   8001 # On Mac OS socket.inet_ntop is not fully compliant with RFC 5952 and
   8002 # shortens the single zero block to '::'. This is a valid IPv6 address
   8003 # representation anyway.
   8004 assert(addr1 in ['1111:2222:3333:4444:5555:6666:0:8888',
   8005                  '1111:2222:3333:4444:5555:6666::8888'])
   8006 assert(addr2 == '1111:2222:3333:4444:5555:6666:0:8888')
   8007 
   8008 = IPv6 bin to rawing conversion - Illegal sizes
   8009 for binfrm in ["\x00" * 15, b"\x00" * 17]:
   8010     rc = False
   8011     try:
   8012         inet_ntop(socket.AF_INET6, binfrm)
   8013     except Exception as exc1:
   8014         _exc1 = exc1
   8015         rc = True
   8016     assert rc
   8017     try:
   8018         _inet6_ntop(binfrm)
   8019     except Exception as exc2:
   8020         rc = isinstance(exc2, type(_exc1))
   8021     assert rc
   8022 
   8023 
   8024 ############
   8025 ############
   8026 + VRRP tests
   8027 
   8028 = VRRP - build
   8029 s = raw(IP()/VRRP())
   8030 s == b'E\x00\x00$\x00\x01\x00\x00@p|g\x7f\x00\x00\x01\x7f\x00\x00\x01!\x01d\x00\x00\x01z\xfd\x00\x00\x00\x00\x00\x00\x00\x00'
   8031 
   8032 = VRRP - dissection
   8033 p = IP(s)
   8034 VRRP in p and p[VRRP].chksum == 0x7afd
   8035 
   8036 = VRRP - chksums
   8037 # VRRPv3
   8038 p = Ether(src="00:00:5e:00:02:02",dst="01:00:5e:00:00:12")/IP(src="20.0.0.3", dst="224.0.0.18",ttl=255)/VRRPv3(priority=254,vrid=2,version=3,adv=1,addrlist=["20.0.1.2","20.0.1.3"])
   8039 a = Ether(raw(p))
   8040 assert a[VRRPv3].chksum == 0xb25e
   8041 # VRRPv1
   8042 p = Ether(src="00:00:5e:00:02:02",dst="01:00:5e:00:00:12")/IP(src="20.0.0.3", dst="224.0.0.18",ttl=255)/VRRP(priority=254,vrid=2,version=1,adv=1,addrlist=["20.0.1.2","20.0.1.3"])
   8043 b = Ether(raw(p))
   8044 assert b[VRRP].chksum == 0xc6f4
   8045 
   8046 ############
   8047 ############
   8048 + L2TP tests
   8049 
   8050 = L2TP - build
   8051 s = raw(IP()/UDP()/L2TP())
   8052 s == b'E\x00\x00"\x00\x01\x00\x00@\x11|\xc8\x7f\x00\x00\x01\x7f\x00\x00\x01\x06\xa5\x06\xa5\x00\x0e\xf4\x83\x00\x02\x00\x00\x00\x00'
   8053 
   8054 = L2TP - dissection
   8055 p = IP(s)
   8056 L2TP in p and len(p[L2TP]) == 6 and p.tunnel_id == 0 and p.session_id == 0 and p[UDP].chksum == 0xf483
   8057 
   8058 
   8059 ############
   8060 ############
   8061 + HSRP tests
   8062 
   8063 = HSRP - build & dissection
   8064 defaddr = conf.route.route('0.0.0.0')[1]
   8065 pkt = IP(raw(IP()/UDP(dport=1985, sport=1985)/HSRP()/HSRPmd5()))
   8066 assert pkt[IP].dst == "224.0.0.2" and pkt[UDP].sport == pkt[UDP].dport == 1985
   8067 assert pkt[HSRP].opcode == 0 and pkt[HSRP].state == 16
   8068 assert pkt[HSRPmd5].type == 4 and pkt[HSRPmd5].sourceip == defaddr
   8069 
   8070 
   8071 ############
   8072 ############
   8073 + RIP tests
   8074 
   8075 = RIP - build
   8076 s = raw(IP()/UDP(sport=520)/RIP()/RIPEntry()/RIPAuth(authtype=2, password="scapy"))
   8077 s == b'E\x00\x00H\x00\x01\x00\x00@\x11|\xa2\x7f\x00\x00\x01\x7f\x00\x00\x01\x02\x08\x02\x08\x004\xae\x99\x01\x01\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\xff\x00\x02scapy\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   8078 
   8079 = RIP - dissection
   8080 p = IP(s)
   8081 RIPEntry in p and RIPAuth in p and p[RIPAuth].password.startswith(b"scapy")
   8082 
   8083 
   8084 ############
   8085 ############
   8086 + RADIUS tests
   8087 
   8088 = IP/UDP/RADIUS - Build
   8089 s = raw(IP()/UDP(sport=1812)/Radius(authenticator="scapy")/RadiusAttribute(value="scapy"))
   8090 s == b'E\x00\x007\x00\x01\x00\x00@\x11|\xb3\x7f\x00\x00\x01\x7f\x00\x00\x01\x07\x14\x07\x15\x00#U\xb2\x01\x00\x00\x1bscapy\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x07scapy'
   8091 
   8092 = IP/UDP/RADIUS - Dissection
   8093 p = IP(s)
   8094 Radius in p and len(p[Radius].attributes) == 1 and p[Radius].attributes[0].value == b"scapy"
   8095 
   8096 = RADIUS - Access-Request - Dissection (1)
   8097 s = b'\x01\xae\x01\x17>k\xd4\xc4\x19V\x0b*1\x99\xc8D\xea\xc2\x94Z\x01\x06leap\x06\x06\x00\x00\x00\x02\x1a\x1b\x00\x00\x00\t\x01\x15service-type=Framed\x0c\x06\x00\x00#\xee\x1e\x13AC-7E-8A-4E-E2-92\x1f\x1300-26-73-9E-0F-D3O\x0b\x02\x01\x00\t\x01leapP\x12U\xbc\x12\xcdM\x00\xf8\xdb4\xf1\x18r\xca_\x8c\xf6f\x02\x1a1\x00\x00\x00\t\x01+audit-session-id=0AC8090E0000001A0354CA00\x1a\x14\x00\x00\x00\t\x01\x0emethod=dot1x\x08\x06\xc0\xa8\n\xb9\x04\x06\xc0\xa8\n\x80\x1a\x1d\x00\x00\x00\t\x02\x17GigabitEthernet1/0/18W\x17GigabitEthernet1/0/18=\x06\x00\x00\x00\x0f\x05\x06\x00\x00\xc3\xc6'
   8098 radius_packet = Radius(s)
   8099 assert(radius_packet.id == 174)
   8100 assert(radius_packet.len == 279)
   8101 assert(radius_packet.authenticator == b'>k\xd4\xc4\x19V\x0b*1\x99\xc8D\xea\xc2\x94Z')
   8102 assert(len(radius_packet.attributes) == 17)
   8103 assert(radius_packet.attributes[0].type == 1)
   8104 assert(type(radius_packet.attributes[0]) == RadiusAttribute)
   8105 assert(radius_packet.attributes[0].len == 6)
   8106 assert(radius_packet.attributes[0].value == b"leap")
   8107 assert(radius_packet.attributes[1].type == 6)
   8108 assert(type(radius_packet.attributes[1]) == RadiusAttr_Service_Type)
   8109 assert(radius_packet.attributes[1].len == 6)
   8110 assert(radius_packet.attributes[1].value == 2)
   8111 assert(radius_packet.attributes[2].type == 26)
   8112 assert(type(radius_packet.attributes[2]) == RadiusAttr_Vendor_Specific)
   8113 assert(radius_packet.attributes[2].len == 27)
   8114 assert(radius_packet.attributes[2].vendor_id == 9)
   8115 assert(radius_packet.attributes[2].vendor_type == 1)
   8116 assert(radius_packet.attributes[2].vendor_len == 21)
   8117 assert(radius_packet.attributes[2].value == b"service-type=Framed")
   8118 assert(radius_packet.attributes[6].type == 79)
   8119 assert(type(radius_packet.attributes[6]) == RadiusAttr_EAP_Message)
   8120 assert(radius_packet.attributes[6].len == 11)
   8121 assert(radius_packet.attributes[6].value.haslayer(EAP))
   8122 assert(radius_packet.attributes[6].value[EAP].code == 2)
   8123 assert(radius_packet.attributes[6].value[EAP].id == 1)
   8124 assert(radius_packet.attributes[6].value[EAP].len == 9)
   8125 assert(radius_packet.attributes[6].value[EAP].type == 1)
   8126 assert(hasattr(radius_packet.attributes[6].value[EAP], "identity"))
   8127 assert(radius_packet.attributes[6].value[EAP].identity == b"leap")
   8128 assert(radius_packet.attributes[7].type == 80)
   8129 assert(type(radius_packet.attributes[7]) == RadiusAttr_Message_Authenticator)
   8130 assert(radius_packet.attributes[7].len == 18)
   8131 assert(radius_packet.attributes[7].value == b'U\xbc\x12\xcdM\x00\xf8\xdb4\xf1\x18r\xca_\x8c\xf6')
   8132 assert(radius_packet.attributes[11].type == 8)
   8133 assert(type(radius_packet.attributes[11]) == RadiusAttr_Framed_IP_Address)
   8134 assert(radius_packet.attributes[11].len == 6)
   8135 assert(radius_packet.attributes[11].value == '192.168.10.185')
   8136 assert(radius_packet.attributes[16].type == 5)
   8137 assert(type(radius_packet.attributes[16]) == RadiusAttr_NAS_Port)
   8138 assert(radius_packet.attributes[16].len == 6)
   8139 assert(radius_packet.attributes[16].value == 50118)
   8140 
   8141 = RADIUS - compute_message_authenticator()
   8142 ram = radius_packet[RadiusAttr_Message_Authenticator]
   8143 assert ram.compute_message_authenticator(radius_packet, b"dummy bytes", b"scapy") == b'\x19\xa4\x0e*Y4\xe0l?,\x94\x9f \xb8Jb'
   8144 
   8145 = RADIUS - Access-Challenge - Dissection (2)
   8146 s = b'\x0b\xae\x00[\xc7\xae\xfc6\xa1=\xb5\x99&^\xdf=\xe9\x00\xa6\xe8\x12\rHello, leapO\x16\x01\x02\x00\x14\x11\x01\x00\x08\xb8\xc4\x1a4\x97x\xd3\x82leapP\x12\xd3\x12\x17\xa6\x0c.\x94\x85\x03]t\xd1\xdb\xd0\x13\x8c\x18\x12iQs\xf7iSb@k\x9d,\xa0\x99\x8ehO'
   8147 radius_packet = Radius(s)
   8148 assert(radius_packet.id == 174)
   8149 assert(radius_packet.len == 91)
   8150 assert(radius_packet.authenticator == b'\xc7\xae\xfc6\xa1=\xb5\x99&^\xdf=\xe9\x00\xa6\xe8')
   8151 assert(len(radius_packet.attributes) == 4)
   8152 assert(radius_packet.attributes[0].type == 18)
   8153 assert(type(radius_packet.attributes[0]) == RadiusAttribute)
   8154 assert(radius_packet.attributes[0].len == 13)
   8155 assert(radius_packet.attributes[0].value == b"Hello, leap")
   8156 assert(radius_packet.attributes[1].type == 79)
   8157 assert(type(radius_packet.attributes[1]) == RadiusAttr_EAP_Message)
   8158 assert(radius_packet.attributes[1].len == 22)
   8159 assert(radius_packet.attributes[1][EAP].code == 1)
   8160 assert(radius_packet.attributes[1][EAP].id == 2)
   8161 assert(radius_packet.attributes[1][EAP].len == 20)
   8162 assert(radius_packet.attributes[1][EAP].type == 17)
   8163 assert(radius_packet.attributes[2].type == 80)
   8164 assert(type(radius_packet.attributes[2]) == RadiusAttr_Message_Authenticator)
   8165 assert(radius_packet.attributes[2].len == 18)
   8166 assert(radius_packet.attributes[2].value == b'\xd3\x12\x17\xa6\x0c.\x94\x85\x03]t\xd1\xdb\xd0\x13\x8c')
   8167 assert(radius_packet.attributes[3].type == 24)
   8168 assert(type(radius_packet.attributes[3]) == RadiusAttr_State)
   8169 assert(radius_packet.attributes[3].len == 18)
   8170 assert(radius_packet.attributes[3].value == b'iQs\xf7iSb@k\x9d,\xa0\x99\x8ehO')
   8171 
   8172 = RADIUS - Access-Request - Dissection (3)
   8173 s = b'\x01\xaf\x01DC\xbe!J\x08\xdf\xcf\x9f\x00v~,\xfb\x8e`\xc8\x01\x06leap\x06\x06\x00\x00\x00\x02\x1a\x1b\x00\x00\x00\t\x01\x15service-type=Framed\x0c\x06\x00\x00#\xee\x1e\x13AC-7E-8A-4E-E2-92\x1f\x1300-26-73-9E-0F-D3O&\x02\x02\x00$\x11\x01\x00\x18\rE\xc9\x92\xf6\x9ae\x04\xa2\x06\x13\x8f\x0b#\xf1\xc56\x8eU\xd9\x89\xe5\xa1)leapP\x12|\x1c\x9d[dv\x9c\x19\x96\xc6\xec\xb82\x8f\n f\x02\x1a1\x00\x00\x00\t\x01+audit-session-id=0AC8090E0000001A0354CA00\x1a\x14\x00\x00\x00\t\x01\x0emethod=dot1x\x08\x06\xc0\xa8\n\xb9\x04\x06\xc0\xa8\n\x80\x1a\x1d\x00\x00\x00\t\x02\x17GigabitEthernet1/0/18W\x17GigabitEthernet1/0/18=\x06\x00\x00\x00\x0f\x05\x06\x00\x00\xc3\xc6\x18\x12iQs\xf7iSb@k\x9d,\xa0\x99\x8ehO'
   8174 radius_packet = Radius(s)
   8175 assert(radius_packet.id == 175)
   8176 assert(radius_packet.len == 324)
   8177 assert(radius_packet.authenticator == b'C\xbe!J\x08\xdf\xcf\x9f\x00v~,\xfb\x8e`\xc8')
   8178 assert(len(radius_packet.attributes) == 18)
   8179 assert(radius_packet.attributes[0].type == 1)
   8180 assert(type(radius_packet.attributes[0]) == RadiusAttribute)
   8181 assert(radius_packet.attributes[0].len == 6)
   8182 assert(radius_packet.attributes[0].value == b"leap")
   8183 assert(radius_packet.attributes[1].type == 6)
   8184 assert(type(radius_packet.attributes[1]) == RadiusAttr_Service_Type)
   8185 assert(radius_packet.attributes[1].len == 6)
   8186 assert(radius_packet.attributes[1].value == 2)
   8187 assert(radius_packet.attributes[2].type == 26)
   8188 assert(type(radius_packet.attributes[2]) == RadiusAttr_Vendor_Specific)
   8189 assert(radius_packet.attributes[2].len == 27)
   8190 assert(radius_packet.attributes[2].vendor_id == 9)
   8191 assert(radius_packet.attributes[2].vendor_type == 1)
   8192 assert(radius_packet.attributes[2].vendor_len == 21)
   8193 assert(radius_packet.attributes[2].value == b"service-type=Framed")
   8194 assert(radius_packet.attributes[6].type == 79)
   8195 assert(type(radius_packet.attributes[6]) == RadiusAttr_EAP_Message)
   8196 assert(radius_packet.attributes[6].len == 38)
   8197 assert(radius_packet.attributes[6].value.haslayer(EAP))
   8198 assert(radius_packet.attributes[6].value[EAP].code == 2)
   8199 assert(radius_packet.attributes[6].value[EAP].id == 2)
   8200 assert(radius_packet.attributes[6].value[EAP].len == 36)
   8201 assert(radius_packet.attributes[6].value[EAP].type == 17)
   8202 assert(radius_packet.attributes[7].type == 80)
   8203 assert(type(radius_packet.attributes[7]) == RadiusAttr_Message_Authenticator)
   8204 assert(radius_packet.attributes[7].len == 18)
   8205 assert(radius_packet.attributes[7].value == b'|\x1c\x9d[dv\x9c\x19\x96\xc6\xec\xb82\x8f\n ')
   8206 assert(radius_packet.attributes[11].type == 8)
   8207 assert(type(radius_packet.attributes[11]) == RadiusAttr_Framed_IP_Address)
   8208 assert(radius_packet.attributes[11].len == 6)
   8209 assert(radius_packet.attributes[11].value == '192.168.10.185')
   8210 assert(radius_packet.attributes[16].type == 5)
   8211 assert(type(radius_packet.attributes[16]) == RadiusAttr_NAS_Port)
   8212 assert(radius_packet.attributes[16].len == 6)
   8213 assert(radius_packet.attributes[16].value == 50118)
   8214 assert(radius_packet.attributes[17].type == 24)
   8215 assert(type(radius_packet.attributes[17]) == RadiusAttr_State)
   8216 assert(radius_packet.attributes[17].len == 18)
   8217 assert(radius_packet.attributes[17].value == b'iQs\xf7iSb@k\x9d,\xa0\x99\x8ehO')
   8218 
   8219 = RADIUS - Access-Challenge - Dissection (4)
   8220 s = b'\x0b\xaf\x00K\x82 \x95=\xfd\x80\x05 -l}\xab)\xa5kU\x12\rHello, leapO\x06\x03\x03\x00\x04P\x12l0\xb9\x8d\xca\xfc!\xf3\xa7\x08\x80\xe1\xf6}\x84\xff\x18\x12iQs\xf7hRb@k\x9d,\xa0\x99\x8ehO'
   8221 radius_packet = Radius(s)
   8222 assert(radius_packet.id == 175)
   8223 assert(radius_packet.len == 75)
   8224 assert(radius_packet.authenticator == b'\x82 \x95=\xfd\x80\x05 -l}\xab)\xa5kU')
   8225 assert(len(radius_packet.attributes) == 4)
   8226 assert(radius_packet.attributes[0].type == 18)
   8227 assert(type(radius_packet.attributes[0]) == RadiusAttribute)
   8228 assert(radius_packet.attributes[0].len == 13)
   8229 assert(radius_packet.attributes[0].value == b"Hello, leap")
   8230 assert(radius_packet.attributes[1].type == 79)
   8231 assert(type(radius_packet.attributes[1]) == RadiusAttr_EAP_Message)
   8232 assert(radius_packet.attributes[1].len == 6)
   8233 assert(radius_packet.attributes[1][EAP].code == 3)
   8234 assert(radius_packet.attributes[1][EAP].id == 3)
   8235 assert(radius_packet.attributes[1][EAP].len == 4)
   8236 assert(radius_packet.attributes[2].type == 80)
   8237 assert(type(radius_packet.attributes[2]) == RadiusAttr_Message_Authenticator)
   8238 assert(radius_packet.attributes[2].len == 18)
   8239 assert(radius_packet.attributes[2].value == b'l0\xb9\x8d\xca\xfc!\xf3\xa7\x08\x80\xe1\xf6}\x84\xff')
   8240 assert(radius_packet.attributes[3].type == 24)
   8241 assert(type(radius_packet.attributes[3]) == RadiusAttr_State)
   8242 assert(radius_packet.attributes[3].len == 18)
   8243 assert(radius_packet.attributes[3].value == b'iQs\xf7hRb@k\x9d,\xa0\x99\x8ehO')
   8244 
   8245 = RADIUS - Response Authenticator computation
   8246 s = b'\x01\xae\x01\x17>k\xd4\xc4\x19V\x0b*1\x99\xc8D\xea\xc2\x94Z\x01\x06leap\x06\x06\x00\x00\x00\x02\x1a\x1b\x00\x00\x00\t\x01\x15service-type=Framed\x0c\x06\x00\x00#\xee\x1e\x13AC-7E-8A-4E-E2-92\x1f\x1300-26-73-9E-0F-D3O\x0b\x02\x01\x00\t\x01leapP\x12U\xbc\x12\xcdM\x00\xf8\xdb4\xf1\x18r\xca_\x8c\xf6f\x02\x1a1\x00\x00\x00\t\x01+audit-session-id=0AC8090E0000001A0354CA00\x1a\x14\x00\x00\x00\t\x01\x0emethod=dot1x\x08\x06\xc0\xa8\n\xb9\x04\x06\xc0\xa8\n\x80\x1a\x1d\x00\x00\x00\t\x02\x17GigabitEthernet1/0/18W\x17GigabitEthernet1/0/18=\x06\x00\x00\x00\x0f\x05\x06\x00\x00\xc3\xc6'
   8247 access_request = Radius(s)
   8248 s = b'\x0b\xae\x00[\xc7\xae\xfc6\xa1=\xb5\x99&^\xdf=\xe9\x00\xa6\xe8\x12\rHello, leapO\x16\x01\x02\x00\x14\x11\x01\x00\x08\xb8\xc4\x1a4\x97x\xd3\x82leapP\x12\xd3\x12\x17\xa6\x0c.\x94\x85\x03]t\xd1\xdb\xd0\x13\x8c\x18\x12iQs\xf7iSb@k\x9d,\xa0\x99\x8ehO'
   8249 access_challenge = Radius(s)
   8250 access_challenge.compute_authenticator(access_request.authenticator, b"radiuskey") == access_challenge.authenticator
   8251 
   8252 = RADIUS - Layers (1)
   8253 radius_attr = RadiusAttr_EAP_Message(value = EAP())
   8254 assert(RadiusAttr_EAP_Message in radius_attr)
   8255 assert(RadiusAttribute in radius_attr)
   8256 type(radius_attr[RadiusAttribute])
   8257 assert(type(radius_attr[RadiusAttribute]) == RadiusAttr_EAP_Message)
   8258 assert(EAP in radius_attr.value)
   8259 
   8260 
   8261 ############
   8262 ############
   8263 + Addresses generators
   8264 
   8265 = Net
   8266 
   8267 n1 = Net("192.168.0.0/31")
   8268 [ip for ip in n1] == ["192.168.0.0", "192.168.0.1"]
   8269 
   8270 n2 = Net("192.168.0.*")
   8271 len([ip for ip in n2]) == 256
   8272 
   8273 n3 = Net("192.168.0.1-5")
   8274 len([ip for ip in n3]) == 5
   8275 
   8276 (n1 == n3) == False
   8277 
   8278 (n3 in n2) == True
   8279 
   8280 = Net using web address
   8281 
   8282 ip = IP(dst="www.google.com")
   8283 n1 = ip.dst
   8284 assert isinstance(n1, Net)
   8285 assert n1.ip_regex.match(str(n1))
   8286 ip.show()
   8287 
   8288 = OID
   8289 
   8290 oid = OID("1.2.3.4.5.6-8")
   8291 len([ o for o in oid ]) == 3
   8292 
   8293 = Net6
   8294 
   8295 n1 = Net6("2001:db8::/127")
   8296 len([ip for ip in n1]) == 2
   8297 
   8298 = Net6 using web address
   8299 ~ netaccess ipv6
   8300 
   8301 ip = IPv6(dst="www.google.com")
   8302 n1 = ip.dst
   8303 assert isinstance(n1, Net6)
   8304 assert n1.ip_regex.match(str(n1))
   8305 ip.show()
   8306 
   8307 ############
   8308 ############
   8309 + IPv6 helpers
   8310 
   8311 = in6_getLocalUniquePrefix()
   8312 
   8313 p = in6_getLocalUniquePrefix()
   8314 len(inet_pton(socket.AF_INET6, p)) == 16 and p.startswith("fd")
   8315 
   8316 = Misc addresses manipulation functions
   8317 
   8318 teredoAddrExtractInfo("2001:0:0a0b:0c0d:0028:f508:f508:08f5") == ("10.11.12.13", 40, "10.247.247.10", 2807)
   8319 
   8320 ip6 = IP6Field("test", None)
   8321 ip6.i2repr("", "2001:0:0a0b:0c0d:0028:f508:f508:08f5") == "2001:0:0a0b:0c0d:0028:f508:f508:08f5 [Teredo srv: 10.11.12.13 cli: 10.247.247.10:2807]"
   8322 ip6.i2repr("", "2002:0102:0304::1") == "2002:0102:0304::1 [6to4 GW: 1.2.3.4]"
   8323 
   8324 in6_iseui64("fe80::bae8:58ff:fed4:e5f6") == True
   8325 
   8326 in6_isanycast("2001:db8::fdff:ffff:ffff:ff80") == True
   8327 
   8328 a = inet_pton(socket.AF_INET6, "2001:db8::2807")
   8329 in6_xor(a, a) == b"\x00" * 16
   8330 
   8331 a = inet_pton(socket.AF_INET6, "fe80::bae8:58ff:fed4:e5f6")
   8332 r = inet_ntop(socket.AF_INET6, in6_getnsma(a)) 
   8333 r == "ff02::1:ffd4:e5f6"
   8334 
   8335 in6_isllsnmaddr(r) == True
   8336 
   8337 in6_isdocaddr("2001:db8::2807") == True
   8338 
   8339 in6_isaddrllallnodes("ff02::1") == True
   8340 
   8341 in6_isaddrllallservers("ff02::2") == True
   8342 
   8343 = in6_getscope()
   8344 
   8345 assert in6_getscope("2001:db8::2807") == IPV6_ADDR_GLOBAL
   8346 assert in6_getscope("fec0::2807") == IPV6_ADDR_SITELOCAL
   8347 assert in6_getscope("fe80::2807") == IPV6_ADDR_LINKLOCAL
   8348 assert in6_getscope("ff02::2807") == IPV6_ADDR_LINKLOCAL
   8349 assert in6_getscope("ff0e::2807") == IPV6_ADDR_GLOBAL
   8350 assert in6_getscope("ff05::2807") == IPV6_ADDR_SITELOCAL
   8351 assert in6_getscope("ff01::2807") == IPV6_ADDR_LOOPBACK
   8352 assert in6_getscope("::1") == IPV6_ADDR_LOOPBACK
   8353 
   8354 = construct_source_candidate_set()
   8355 
   8356 dev_addresses = [('fe80::', IPV6_ADDR_LINKLOCAL, "linklocal"),('fec0::', IPV6_ADDR_SITELOCAL, "sitelocal"),('ff0e::', IPV6_ADDR_GLOBAL, "global")]
   8357 
   8358 assert construct_source_candidate_set("2001:db8::2807", 0, dev_addresses) == ["ff0e::"]
   8359 assert construct_source_candidate_set("fec0::2807", 0, dev_addresses) == ["fec0::"]
   8360 assert construct_source_candidate_set("fe80::2807", 0, dev_addresses) == ["fe80::"]
   8361 assert construct_source_candidate_set("ff02::2807", 0, dev_addresses) == ["fe80::"]
   8362 assert construct_source_candidate_set("ff0e::2807", 0, dev_addresses) == ["ff0e::"]
   8363 assert construct_source_candidate_set("ff05::2807", 0, dev_addresses) == ["fec0::"]
   8364 assert construct_source_candidate_set("ff01::2807", 0, dev_addresses) == ["::1"]
   8365 assert construct_source_candidate_set("::", 0, dev_addresses) == ["ff0e::"]
   8366 
   8367 = inet_pton()
   8368 
   8369 from scapy.pton_ntop import _inet6_pton, inet_pton
   8370 import socket
   8371 
   8372 ip6_bad_addrs = ["fe80::2e67:ef2d:7eca::ed8a",
   8373                  "fe80:1234:abcd::192.168.40.12:abcd",
   8374                  "fe80:1234:abcd::192.168.40",
   8375                  "fe80:1234:abcd::192.168.400.12",
   8376                  "1234:5678:9abc:def0:1234:5678:9abc:def0:",
   8377                  "1234:5678:9abc:def0:1234:5678:9abc:def0:1234"]
   8378 for ip6 in ip6_bad_addrs:
   8379     rc = False
   8380     exc1 = None
   8381     try:
   8382         res1 = inet_pton(socket.AF_INET6, ip6)
   8383     except Exception as e:
   8384         rc = True
   8385         exc1 = e
   8386     assert rc
   8387     rc = False
   8388     try:
   8389         res2 = _inet6_pton(ip6)
   8390     except Exception as exc2:
   8391         rc = isinstance(exc2, type(exc1))
   8392     assert rc
   8393 
   8394 ip6_good_addrs = [("fe80:1234:abcd::192.168.40.12",
   8395                    b'\xfe\x80\x124\xab\xcd\x00\x00\x00\x00\x00\x00\xc0\xa8(\x0c'),
   8396                   ("fe80:1234:abcd::fe06",
   8397                    b'\xfe\x80\x124\xab\xcd\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x06'),
   8398                   ("fe80::2e67:ef2d:7ece:ed8a",
   8399                    b'\xfe\x80\x00\x00\x00\x00\x00\x00.g\xef-~\xce\xed\x8a'),
   8400                   ("::ffff",
   8401                    b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff'),
   8402                   ("ffff::",
   8403                    b'\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'),
   8404                   ('::', b'\x00' * 16)]
   8405 for ip6, res in ip6_good_addrs:
   8406     res1 = inet_pton(socket.AF_INET6, ip6)
   8407     res2 = _inet6_pton(ip6)
   8408     assert res == res1 == res2
   8409 
   8410 
   8411 ############
   8412 ############
   8413 + Test Route class
   8414 
   8415 = make_route()
   8416 
   8417 r4 = Route()
   8418 tmp_route = r4.make_route(host="10.12.13.14")
   8419 (tmp_route[0], tmp_route[1], tmp_route[2]) == (168561934, 4294967295, '0.0.0.0')
   8420 
   8421 tmp_route = r4.make_route(net="10.12.13.0/24")
   8422 (tmp_route[0], tmp_route[1], tmp_route[2]) == (168561920, 4294967040, '0.0.0.0')
   8423 
   8424 = add() & delt()
   8425 
   8426 r4 = Route()
   8427 len_r4 = len(r4.routes)
   8428 r4.add(net="192.168.1.0/24", gw="1.2.3.4")
   8429 len(r4.routes) == len_r4 + 1
   8430 r4.delt(net="192.168.1.0/24", gw="1.2.3.4")
   8431 len(r4.routes) == len_r4
   8432 
   8433 = ifchange()
   8434 
   8435 r4.add(net="192.168.1.0/24", gw="1.2.3.4", dev=get_dummy_interface())
   8436 r4.ifchange(get_dummy_interface(), "5.6.7.8")
   8437 r4.routes[-1][4] == "5.6.7.8"
   8438 
   8439 = ifdel()
   8440 
   8441 r4.ifdel(get_dummy_interface())
   8442 len(r4.routes) == len_r4
   8443 
   8444 = ifadd() & get_if_bcast()
   8445 
   8446 r4 = Route()
   8447 len_r4 = len(r4.routes)
   8448 
   8449 r4.ifadd(get_dummy_interface(), "1.2.3.4/24")
   8450 len(r4.routes) == len_r4 +1 
   8451 
   8452 r4.get_if_bcast(get_dummy_interface()) == "1.2.3.255"
   8453 
   8454 r4.ifdel(get_dummy_interface())
   8455 len(r4.routes) == len_r4
   8456 
   8457 
   8458 ############
   8459 ############
   8460 + Random objects
   8461 
   8462 = RandomEnumeration
   8463 
   8464 re = RandomEnumeration(0, 7, seed=0x2807, forever=False)
   8465 [x for x in re] == ([3, 4, 2, 5, 1, 6, 0, 7] if six.PY2 else [5, 0, 2, 7, 6, 3, 1, 4])
   8466 
   8467 = RandIP6
   8468 
   8469 random.seed(0x2807)
   8470 r6 = RandIP6()
   8471 assert(r6 == ("d279:1205:e445:5a9f:db28:efc9:afd7:f594" if six.PY2 else
   8472               "240b:238f:b53f:b727:d0f9:bfc4:2007:e265"))
   8473 
   8474 random.seed(0x2807)
   8475 r6 = RandIP6("2001:db8::-") 
   8476 assert(r6 == ("2001:0db8::e445" if six.PY2 else "2001:0db8::b53f"))
   8477 
   8478 r6 = RandIP6("2001:db8::*")
   8479 assert(r6 == ("2001:0db8::efc9" if six.PY2 else "2001:0db8::bfc4"))
   8480 
   8481 = RandMAC
   8482 
   8483 random.seed(0x2807)
   8484 rm = RandMAC() 
   8485 assert(rm == ("d2:12:e4:5a:db:ef" if six.PY2 else "24:23:b5:b7:d0:bf"))
   8486 
   8487 rm = RandMAC("00:01:02:03:04:0-7")
   8488 assert(rm == ("00:01:02:03:04:05" if six.PY2 else "00:01:02:03:04:01"))
   8489 
   8490 
   8491 = RandOID
   8492 
   8493 random.seed(0x2807)
   8494 ro = RandOID()
   8495 assert(ro == "7.222.44.194.276.116.320.6.84.97.31.5.25.20.13.84.104.18")
   8496 
   8497 ro = RandOID("1.2.3.*")
   8498 assert(ro == "1.2.3.41")
   8499 
   8500 ro = RandOID("1.2.3.0-28")
   8501 assert(ro == ("1.2.3.11" if six.PY2 else "1.2.3.12"))
   8502 
   8503 = RandRegExp
   8504 
   8505 random.seed(0x2807)
   8506 re = RandRegExp("[g-v]* @? [0-9]{3} . (g|v)")
   8507 bytes(re) == ('vmuvr @ 906 \x9e g' if six.PY2 else b'irrtv @ 517 \xc2\xb8 v')
   8508 
   8509 = Corrupted(Bytes|Bits)
   8510 
   8511 random.seed(0x2807)
   8512 cb = CorruptedBytes("ABCDE", p=0.5)
   8513 assert(sane(raw(cb)) in [".BCD)", "&BCDW"])
   8514 
   8515 cb = CorruptedBits("ABCDE", p=0.2)
   8516 assert(sane(raw(cb)) in ["ECk@Y", "QB.P."])
   8517 
   8518 = RandEnumKeys
   8519 ~ not_pypy random_weird_py3
   8520 random.seed(0x2807)
   8521 rek = RandEnumKeys({'a': 1, 'b': 2, 'c': 3}, seed=0x2807)
   8522 rek.enum.sort()
   8523 assert(rek == ('c' if six.PY2 else 'a'))
   8524 
   8525 = RandSingNum
   8526 ~ not_pypy random_weird_py3
   8527 random.seed(0x2807)
   8528 rs = RandSingNum(-28, 7)
   8529 assert(rs == (3 if six.PY2 else 2))
   8530 assert(rs == (-27 if six.PY2 else -17))
   8531 
   8532 = Rand*
   8533 random.seed(0x2807)
   8534 rss = RandSingString()
   8535 assert(rss == ("CON:" if six.PY2 else "foo.exe:"))
   8536 
   8537 random.seed(0x2807)
   8538 rts = RandTermString(4, "scapy")
   8539 assert(sane(raw(rts)) in ["...[scapy", "......scapy"])
   8540 
   8541 
   8542 ############
   8543 ############
   8544 + Flags
   8545 
   8546 = IP flags
   8547 ~ IP
   8548 
   8549 pkt = IP(flags="MF")
   8550 assert pkt.flags.MF
   8551 assert not pkt.flags.DF
   8552 assert not pkt.flags.evil
   8553 assert repr(pkt.flags) == '<Flag 1 (MF)>'
   8554 pkt.flags.MF = 0
   8555 pkt.flags.DF = 1
   8556 assert not pkt.flags.MF
   8557 assert pkt.flags.DF
   8558 assert not pkt.flags.evil
   8559 assert repr(pkt.flags) == '<Flag 2 (DF)>'
   8560 pkt.flags |= 'evil+MF'
   8561 pkt.flags &= 'DF+MF'
   8562 assert pkt.flags.MF
   8563 assert pkt.flags.DF
   8564 assert not pkt.flags.evil
   8565 assert repr(pkt.flags) == '<Flag 3 (MF+DF)>'
   8566 
   8567 pkt = IP(flags=3)
   8568 assert pkt.flags.MF
   8569 assert pkt.flags.DF
   8570 assert not pkt.flags.evil
   8571 assert repr(pkt.flags) == '<Flag 3 (MF+DF)>'
   8572 pkt.flags = 6
   8573 assert not pkt.flags.MF
   8574 assert pkt.flags.DF
   8575 assert pkt.flags.evil
   8576 assert repr(pkt.flags) == '<Flag 6 (DF+evil)>'
   8577 
   8578 assert len({IP().flags, IP().flags}) == 1
   8579 
   8580 = TCP flags
   8581 ~ TCP
   8582 
   8583 pkt = TCP(flags="SA")
   8584 assert pkt.flags == 18
   8585 assert pkt.flags.S
   8586 assert pkt.flags.A
   8587 assert pkt.flags.SA
   8588 assert not any(getattr(pkt.flags, f) for f in 'FRPUECN')
   8589 assert repr(pkt.flags) == '<Flag 18 (SA)>'
   8590 pkt.flags.U = True
   8591 pkt.flags.S = False
   8592 assert pkt.flags.A
   8593 assert pkt.flags.U
   8594 assert pkt.flags.AU
   8595 assert not any(getattr(pkt.flags, f) for f in 'FSRPECN')
   8596 assert repr(pkt.flags) == '<Flag 48 (AU)>'
   8597 pkt.flags &= 'SFA'
   8598 pkt.flags |= 'P'
   8599 assert pkt.flags.P
   8600 assert pkt.flags.A
   8601 assert pkt.flags.PA
   8602 assert not any(getattr(pkt.flags, f) for f in 'FSRUECN')
   8603 
   8604 pkt = TCP(flags=56)
   8605 assert all(getattr(pkt.flags, f) for f in 'PAU')
   8606 assert pkt.flags.PAU
   8607 assert not any(getattr(pkt.flags, f) for f in 'FSRECN')
   8608 assert repr(pkt.flags) == '<Flag 56 (PAU)>'
   8609 pkt.flags = 50
   8610 assert all(getattr(pkt.flags, f) for f in 'SAU')
   8611 assert pkt.flags.SAU
   8612 assert not any(getattr(pkt.flags, f) for f in 'FRPECN')
   8613 assert repr(pkt.flags) == '<Flag 50 (SAU)>'
   8614 
   8615 = Flag values mutation with .raw_packet_cache
   8616 ~ IP TCP
   8617 
   8618 pkt = IP(raw(IP(flags="MF")/TCP(flags="SA")))
   8619 assert pkt.raw_packet_cache is not None
   8620 assert pkt[TCP].raw_packet_cache is not None
   8621 assert pkt.flags.MF
   8622 assert not pkt.flags.DF
   8623 assert not pkt.flags.evil
   8624 assert repr(pkt.flags) == '<Flag 1 (MF)>'
   8625 assert pkt[TCP].flags.S
   8626 assert pkt[TCP].flags.A
   8627 assert pkt[TCP].flags.SA
   8628 assert not any(getattr(pkt[TCP].flags, f) for f in 'FRPUECN')
   8629 assert repr(pkt[TCP].flags) == '<Flag 18 (SA)>'
   8630 pkt.flags.MF = 0
   8631 pkt.flags.DF = 1
   8632 pkt[TCP].flags.U = True
   8633 pkt[TCP].flags.S = False
   8634 pkt = IP(raw(pkt))
   8635 assert not pkt.flags.MF
   8636 assert pkt.flags.DF
   8637 assert not pkt.flags.evil
   8638 assert repr(pkt.flags) == '<Flag 2 (DF)>'
   8639 assert pkt[TCP].flags.A
   8640 assert pkt[TCP].flags.U
   8641 assert pkt[TCP].flags.AU
   8642 assert not any(getattr(pkt[TCP].flags, f) for f in 'FSRPECN')
   8643 assert repr(pkt[TCP].flags) == '<Flag 48 (AU)>'
   8644 
   8645 = Operations on flag values
   8646 ~ TCP
   8647 
   8648 p1, p2 = TCP(flags="SU"), TCP(flags="AU")
   8649 assert (p1.flags & p2.flags).U
   8650 assert not any(getattr(p1.flags & p2.flags, f) for f in 'FSRPAECN')
   8651 assert all(getattr(p1.flags | p2.flags, f) for f in 'SAU')
   8652 assert (p1.flags | p2.flags).SAU
   8653 assert not any(getattr(p1.flags | p2.flags, f) for f in 'FRPECN')
   8654 
   8655 assert TCP(flags="SA").flags & TCP(flags="S").flags == TCP(flags="S").flags
   8656 assert TCP(flags="SA").flags | TCP(flags="S").flags == TCP(flags="SA").flags
   8657 
   8658 = Using tuples and lists as flag values
   8659 ~ IP TCP
   8660 
   8661 plist = PacketList(list(IP()/TCP(flags=(0, 2**9 - 1))))
   8662 assert [p[TCP].flags for p in plist] == [x for x in range(512)]
   8663 
   8664 plist = PacketList(list(IP()/TCP(flags=["S", "SA", "A"])))
   8665 assert [p[TCP].flags for p in plist] == [2, 18, 16]
   8666 
   8667 
   8668 ############
   8669 ############
   8670 + SCTP
   8671 
   8672 = SCTP - Chunk Init - build
   8673 s = raw(IP()/SCTP()/SCTPChunkInit(params=[SCTPChunkParamIPv4Addr()]))
   8674 s == b'E\x00\x00<\x00\x01\x00\x00@\x84|;\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00@,\x0b_\x01\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x08\x7f\x00\x00\x01'
   8675 
   8676 = SCTP - Chunk Init - dissection
   8677 p = IP(s)
   8678 SCTPChunkParamIPv4Addr in p and p[SCTP].chksum == 0x402c0b5f and p[SCTPChunkParamIPv4Addr].addr == "127.0.0.1"
   8679 
   8680 = SCTP - SCTPChunkSACK - build
   8681 s = raw(IP()/SCTP()/SCTPChunkSACK(gap_ack_list=["7:28"]))
   8682 s == b'E\x00\x004\x00\x01\x00\x00@\x84|C\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00;\x01\xd4\x04\x03\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x07\x00\x1c'
   8683 
   8684 = SCTP - SCTPChunkSACK - dissection
   8685 p = IP(s)
   8686 SCTPChunkSACK in p and p[SCTP].chksum == 0x3b01d404 and p[SCTPChunkSACK].gap_ack_list[0] == "7:28"
   8687 
   8688 = SCTP - answers
   8689 (IP()/SCTP()).answers(IP()/SCTP()) == True
   8690 
   8691 = SCTP basic header - Dissection
   8692 ~ sctp
   8693 blob = b"\x1A\x85\x26\x94\x00\x00\x00\x0D\x00\x00\x04\xD2"
   8694 p = SCTP(blob)
   8695 assert(p.dport == 9876)
   8696 assert(p.sport == 6789)
   8697 assert(p.tag == 13)
   8698 assert(p.chksum == 1234)
   8699 
   8700 = basic SCTPChunkData - Dissection
   8701 ~ sctp
   8702 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x61\x74\x61"
   8703 p = SCTP(blob).lastlayer()
   8704 assert(isinstance(p, SCTPChunkData))
   8705 assert(p.reserved == 0)
   8706 assert(p.delay_sack == 0)
   8707 assert(p.unordered == 0)
   8708 assert(p.beginning == 0)
   8709 assert(p.ending == 0)
   8710 assert(p.tsn == 0)
   8711 assert(p.stream_id == 0)
   8712 assert(p.stream_seq == 0)
   8713 assert(p.len == (len("data") + 16))
   8714 assert(p.data == b"data")
   8715 
   8716 = basic SCTPChunkInit - Dissection
   8717 ~ sctp
   8718 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
   8719 p = SCTP(blob).lastlayer()
   8720 assert(isinstance(p, SCTPChunkInit))
   8721 assert(p.flags == 0)
   8722 assert(p.len == 20)
   8723 assert(p.init_tag == 0)
   8724 assert(p.a_rwnd == 0)
   8725 assert(p.n_out_streams == 0)
   8726 assert(p.n_in_streams == 0)
   8727 assert(p.init_tsn == 0)
   8728 assert(p.params == [])
   8729 
   8730 = SCTPChunkInit multiple valid parameters - Dissection
   8731 ~ sctp
   8732 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x5C\x00\x00\x00\x65\x00\x00\x00\x66\x00\x67\x00\x68\x00\x00\x00\x69\x00\x0C\x00\x06\x00\x05\x00\x00\x80\x00\x00\x04\xC0\x00\x00\x04\x80\x08\x00\x07\x0F\xC1\x80\x00\x80\x03\x00\x04\x80\x02\x00\x24\x87\x77\x21\x29\x3F\xDA\x62\x0C\x06\x6F\x10\xA5\x39\x58\x60\x98\x4C\xD4\x59\xD8\x8A\x00\x85\xFB\x9E\x2E\x66\xBA\x3A\x23\x54\xEF\x80\x04\x00\x06\x00\x01\x00\x00"
   8733 p = SCTP(blob).lastlayer()
   8734 assert(isinstance(p, SCTPChunkInit))
   8735 assert(p.flags == 0)
   8736 assert(p.len == 92)
   8737 assert(p.init_tag == 101)
   8738 assert(p.a_rwnd == 102)
   8739 assert(p.n_out_streams == 103)
   8740 assert(p.n_in_streams == 104)
   8741 assert(p.init_tsn == 105)
   8742 assert(len(p.params) == 7)
   8743 params = {type(param): param for param in p.params}
   8744 assert(set(params.keys()) == {SCTPChunkParamECNCapable, SCTPChunkParamFwdTSN,
   8745                               SCTPChunkParamSupportedExtensions, SCTPChunkParamChunkList,
   8746                               SCTPChunkParamRandom, SCTPChunkParamRequestedHMACFunctions,
   8747                               SCTPChunkParamSupportedAddrTypes})
   8748 assert(params[SCTPChunkParamECNCapable] == SCTPChunkParamECNCapable())
   8749 assert(params[SCTPChunkParamFwdTSN] == SCTPChunkParamFwdTSN())
   8750 assert(params[SCTPChunkParamSupportedExtensions] == SCTPChunkParamSupportedExtensions(len=7))
   8751 assert(params[SCTPChunkParamChunkList] == SCTPChunkParamChunkList(len=4))
   8752 assert(params[SCTPChunkParamRandom].len == 4+32)
   8753 assert(len(params[SCTPChunkParamRandom].random) == 32)
   8754 assert(params[SCTPChunkParamRequestedHMACFunctions] == SCTPChunkParamRequestedHMACFunctions(len=6))
   8755 assert(params[SCTPChunkParamSupportedAddrTypes] == SCTPChunkParamSupportedAddrTypes(len=6))
   8756 
   8757 = basic SCTPChunkInitAck - Dissection
   8758 ~ sctp
   8759 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
   8760 p = SCTP(blob).lastlayer()
   8761 assert(isinstance(p, SCTPChunkInitAck))
   8762 assert(p.flags == 0)
   8763 assert(p.len == 20)
   8764 assert(p.init_tag == 0)
   8765 assert(p.a_rwnd == 0)
   8766 assert(p.n_out_streams == 0)
   8767 assert(p.n_in_streams == 0)
   8768 assert(p.init_tsn == 0)
   8769 assert(p.params == [])
   8770 
   8771 = SCTPChunkInitAck with state cookie - Dissection
   8772 ~ sctp
   8773 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x4C\x00\x00\x00\x65\x00\x00\x00\x66\x00\x67\x00\x68\x00\x00\x00\x69\x80\x00\x00\x04\x00\x0B\x00\x0D\x6C\x6F\x63\x61\x6C\x68\x6F\x73\x74\x00\x00\x00\xC0\x00\x00\x04\x80\x08\x00\x07\x0F\xC1\x80\x00\x00\x07\x00\x14\x00\x10\x9E\xB2\x86\xCE\xE1\x7D\x0F\x6A\xAD\xFD\xB3\x5D\xBC\x00"
   8774 p = SCTP(blob).lastlayer()
   8775 assert(isinstance(p, SCTPChunkInitAck))
   8776 assert(p.flags == 0)
   8777 assert(p.len == 76)
   8778 assert(p.init_tag == 101)
   8779 assert(p.a_rwnd == 102)
   8780 assert(p.n_out_streams == 103)
   8781 assert(p.n_in_streams == 104)
   8782 assert(p.init_tsn == 105)
   8783 assert(len(p.params) == 5)
   8784 params = {type(param): param for param in p.params}
   8785 assert(set(params.keys()) == {SCTPChunkParamECNCapable, SCTPChunkParamHostname,
   8786                               SCTPChunkParamFwdTSN, SCTPChunkParamSupportedExtensions,
   8787                               SCTPChunkParamStateCookie})
   8788 assert(params[SCTPChunkParamECNCapable] == SCTPChunkParamECNCapable())
   8789 assert(raw(params[SCTPChunkParamHostname]) == raw(SCTPChunkParamHostname(len=13, hostname="localhost")))
   8790 assert(params[SCTPChunkParamFwdTSN] == SCTPChunkParamFwdTSN())
   8791 assert(params[SCTPChunkParamSupportedExtensions] == SCTPChunkParamSupportedExtensions(len=7))
   8792 assert(params[SCTPChunkParamStateCookie].len == 4+16)
   8793 assert(len(params[SCTPChunkParamStateCookie].cookie) == 16)
   8794 
   8795 = basic SCTPChunkSACK - Dissection
   8796 ~ sctp
   8797 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
   8798 p = SCTP(blob).lastlayer()
   8799 assert(isinstance(p, SCTPChunkSACK))
   8800 assert(p.flags == 0)
   8801 assert(p.len == 16)
   8802 assert(p.cumul_tsn_ack == 0)
   8803 assert(p.a_rwnd == 0)
   8804 assert(p.n_gap_ack == 0)
   8805 assert(p.n_dup_tsn == 0)
   8806 assert(p.gap_ack_list == [])
   8807 assert(p.dup_tsn_list == [])
   8808 
   8809 = basic SCTPChunkHeartbeatReq - Dissection
   8810 ~ sctp
   8811 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x04"
   8812 p = SCTP(blob).lastlayer()
   8813 assert(isinstance(p, SCTPChunkHeartbeatReq))
   8814 assert(p.flags == 0)
   8815 assert(p.len == 4)
   8816 assert(p.params == [])
   8817 
   8818 = basic SCTPChunkHeartbeatAck - Dissection
   8819 ~ sctp
   8820 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x04"
   8821 p = SCTP(blob).lastlayer()
   8822 assert(isinstance(p, SCTPChunkHeartbeatAck))
   8823 assert(p.flags == 0)
   8824 assert(p.len == 4)
   8825 assert(p.params == [])
   8826 
   8827 = basic SCTPChunkAbort - Dissection
   8828 ~ sctp
   8829 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x04"
   8830 p = SCTP(blob).lastlayer()
   8831 assert(isinstance(p, SCTPChunkAbort))
   8832 assert(p.reserved == 0)
   8833 assert(p.TCB == 0)
   8834 assert(p.len == 4)
   8835 assert(p.error_causes == b"")
   8836 
   8837 = basic SCTPChunkShutDown - Dissection
   8838 ~ sctp
   8839 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x08\x00\x00\x00\x00"
   8840 p = SCTP(blob).lastlayer()
   8841 assert(isinstance(p, SCTPChunkShutdown))
   8842 assert(p.flags == 0)
   8843 assert(p.len == 8)
   8844 assert(p.cumul_tsn_ack == 0)
   8845 
   8846 = basic SCTPChunkShutDownAck - Dissection
   8847 ~ sctp
   8848 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x04"
   8849 p = SCTP(blob).lastlayer()
   8850 assert(isinstance(p, SCTPChunkShutdownAck))
   8851 assert(p.flags == 0)
   8852 assert(p.len == 4)
   8853 
   8854 = basic SCTPChunkError - Dissection
   8855 ~ sctp
   8856 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x04"
   8857 p = SCTP(blob).lastlayer()
   8858 assert(isinstance(p, SCTPChunkError))
   8859 assert(p.flags == 0)
   8860 assert(p.len == 4)
   8861 assert(p.error_causes == b"")
   8862 
   8863 = basic SCTPChunkCookieEcho - Dissection
   8864 ~ sctp
   8865 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0A\x00\x00\x04"
   8866 p = SCTP(blob).lastlayer()
   8867 assert(isinstance(p, SCTPChunkCookieEcho))
   8868 assert(p.flags == 0)
   8869 assert(p.len == 4)
   8870 assert(p.cookie == b"")
   8871 
   8872 = basic SCTPChunkCookieAck - Dissection
   8873 ~ sctp
   8874 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0B\x00\x00\x04"
   8875 p = SCTP(blob).lastlayer()
   8876 assert(isinstance(p, SCTPChunkCookieAck))
   8877 assert(p.flags == 0)
   8878 assert(p.len == 4)
   8879 
   8880 = basic SCTPChunkShutdownComplete - Dissection
   8881 ~ sctp
   8882 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0E\x00\x00\x04"
   8883 p = SCTP(blob).lastlayer()
   8884 assert(isinstance(p, SCTPChunkShutdownComplete))
   8885 assert(p.reserved == 0)
   8886 assert(p.TCB == 0)
   8887 assert(p.len == 4)
   8888 
   8889 = basic SCTPChunkAuthentication - Dissection
   8890 ~ sctp
   8891 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x08\x00\x00\x00\x00"
   8892 p = SCTP(blob).lastlayer()
   8893 assert(isinstance(p, SCTPChunkAuthentication))
   8894 assert(p.flags == 0)
   8895 assert(p.len == 8)
   8896 assert(p.shared_key_id == 0)
   8897 assert(p.HMAC_function == 0)
   8898 
   8899 = basic SCTPChunkAddressConf - Dissection
   8900 ~ sctp
   8901 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x00\x00\x08\x00\x00\x00\x00"
   8902 p = SCTP(blob).lastlayer()
   8903 assert(isinstance(p, SCTPChunkAddressConf))
   8904 assert(p.flags == 0)
   8905 assert(p.len == 8)
   8906 assert(p.seq == 0)
   8907 assert(p.params == [])
   8908 
   8909 = basic SCTPChunkAddressConfAck - Dissection
   8910 ~ sctp
   8911 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x08\x00\x00\x00\x00"
   8912 p = SCTP(blob).lastlayer()
   8913 assert(isinstance(p, SCTPChunkAddressConfAck))
   8914 assert(p.flags == 0)
   8915 assert(p.len == 8)
   8916 assert(p.seq == 0)
   8917 assert(p.params == [])
   8918 
   8919 = SCTPChunkParamRandom - Consecutive calls
   8920 ~ sctp
   8921 param1, param2 = SCTPChunkParamRandom(), SCTPChunkParamRandom()
   8922 assert(param1.random != param2.random)
   8923 
   8924 ############
   8925 ############
   8926 + DHCP
   8927 
   8928 = BOOTP - misc
   8929 BOOTP().answers(BOOTP()) == True
   8930 BOOTP().hashret() == b"\x00\x00\x00\x00"
   8931 
   8932 import random
   8933 random.seed(0x2807)
   8934 str(RandDHCPOptions()) == "[('WWW_server', '90.219.239.175')]"
   8935 
   8936 value = ("hostname", "scapy")
   8937 dof = DHCPOptionsField("options", value)
   8938 dof.i2repr("", value) == '[hostname scapy]'
   8939 dof.i2m("", value) == b'\x0cscapy'
   8940 
   8941 unknown_value_end = b"\xfe" + b"\xff"*257
   8942 udof = DHCPOptionsField("options", unknown_value_end)
   8943 udof.m2i("", unknown_value_end) == [(254, b'\xff'*255), 'end']
   8944 
   8945 unknown_value_pad = b"\xfe" + b"\xff"*256 + b"\x00"
   8946 udof = DHCPOptionsField("options", unknown_value_pad)
   8947 udof.m2i("", unknown_value_pad) == [(254, b'\xff'*255), 'pad']
   8948 
   8949 = DHCP - build
   8950 s = raw(IP(src="127.0.0.1")/UDP()/BOOTP(chaddr="00:01:02:03:04:05")/DHCP(options=[("message-type","discover"),"end"]))
   8951 assert s == b'E\x00\x01\x10\x00\x01\x00\x00@\x11{\xda\x7f\x00\x00\x01\x7f\x00\x00\x01\x00C\x00D\x00\xfcf\xea\x01\x01\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0000:01:02:03:04:0\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\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\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\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\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\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\x00c\x82Sc5\x01\x01\xff'
   8952 
   8953 s2 = raw(IP(src="127.0.0.1")/UDP()/BOOTP(chaddr="05:04:03:02:01:00")/DHCP(options=[("param_req_list",[12,57,45,254]),("requested_addr", "192.168.0.1"),"end"]))
   8954 assert s2 == b'E\x00\x01\x19\x00\x01\x00\x00@\x11{\xd1\x7f\x00\x00\x01\x7f\x00\x00\x01\x00C\x00D\x01\x058\xeb\x01\x01\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0005:04:03:02:01:0\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\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\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\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\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\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\x00c\x82Sc7\x04\x0c9-\xfe2\x04\xc0\xa8\x00\x01\xff'
   8955 
   8956 = DHCP - dissection
   8957 p = IP(s)
   8958 assert DHCP in p and p[DHCP].options[0] == ('message-type', 1)
   8959 
   8960 p2 = IP(s2)
   8961 assert DHCP in p2
   8962 assert p2[DHCP].options[0] == ("param_req_list",[12,57,45,254])
   8963 assert p2[DHCP].options[1] == ("requested_addr", "192.168.0.1")
   8964 
   8965 ############
   8966 ############
   8967 + 802.11
   8968 
   8969 = 802.11 - misc
   8970 PrismHeader().answers(PrismHeader()) == True
   8971 
   8972 dpl = Dot11PacketList([Dot11()/LLC()/SNAP()/IP()/UDP()])
   8973 len(dpl) == 1
   8974 
   8975 dpl_ether = dpl.toEthernet()
   8976 len(dpl_ether) == 1 and Ether in dpl_ether[0]
   8977 
   8978 = Dot11 - build
   8979 s = raw(Dot11())
   8980 s == b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
   8981 
   8982 = Dot11 - dissection
   8983 p = Dot11(s)
   8984 Dot11 in p and p.addr3 == "00:00:00:00:00:00"
   8985 p.mysummary() == '802.11 Management 0 00:00:00:00:00:00 > 00:00:00:00:00:00'
   8986 
   8987 = Dot11QoS - build
   8988 s = raw(Dot11(type=2, subtype=8)/Dot11QoS(TID=4))
   8989 s == b'\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00'
   8990 
   8991 = Dot11 - binary in SSID
   8992 pkt = Dot11() / Dot11Beacon() / Dot11Elt(ID=0, info=b"".join(chb(i) for i in range(32)))
   8993 pkt.show()
   8994 pkt.summary()
   8995 assert pkt[Dot11Elt::{"ID": 0}].summary() in [
   8996     "SSID='%s'" % "".join(repr(chr(d))[1:-1] for d in range(32)),
   8997     'SSID="%s"' % "".join(repr(chr(d))[1:-1] for d in range(32)),
   8998 ]
   8999 pkt = Dot11(raw(pkt))
   9000 pkt.show()
   9001 pkt.summary()
   9002 assert pkt[Dot11Elt::{"ID": 0}].summary() in [
   9003     "SSID='%s'" % "".join(repr(chr(d))[1:-1] for d in range(32)),
   9004     'SSID="%s"' % "".join(repr(chr(d))[1:-1] for d in range(32)),
   9005 ]
   9006 
   9007 = Dot11QoS - dissection
   9008 p = Dot11(s)
   9009 Dot11QoS in p
   9010 
   9011 = Dot11 - answers
   9012 query = Dot11(type=0, subtype=0)
   9013 Dot11(type=0, subtype=1).answers(query) == True
   9014 
   9015 = Dot11 - misc
   9016 assert Dot11Elt(info="scapy").summary() == "SSID='scapy'"
   9017 assert Dot11Elt(ID=1).mysummary() == ""
   9018 
   9019 = Multiple Dot11Elt layers
   9020 pkt = Dot11() / Dot11Beacon() / Dot11Elt(ID="Rates") / Dot11Elt(ID="SSID", info="Scapy")
   9021 assert pkt[Dot11Elt::{"ID": 0}].info == b"Scapy"
   9022 assert pkt.getlayer(Dot11Elt, ID=0).info == b"Scapy"
   9023 
   9024 = Dot11WEP - build
   9025 ~ crypto
   9026 conf.wepkey = ""
   9027 assert raw(PPI()/Dot11(FCfield=0x40)/Dot11WEP()) == b'\x00\x00\x08\x00i\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'
   9028 conf.wepkey = "test123"
   9029 assert raw(PPI()/Dot11(type=2, subtype=8, FCfield=0x40)/Dot11QoS()/Dot11WEP()) == b'\x00\x00\x08\x00i\x00\x00\x00\x88@\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\x008(^a'
   9030 
   9031 = Dot11WEP - dissect
   9032 ~ crypto
   9033 conf.wepkey = "test123"
   9034 a = PPI(b'\x00\x00\x08\x00i\x00\x00\x00\x88@\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\x008(^a')
   9035 assert a[Dot11QoS][Dot11WEP].icv == 942169697
   9036 
   9037 = Dot11 - answers
   9038 a = Dot11()/Dot11Auth(seqnum=1)
   9039 b = Dot11()/Dot11Auth(seqnum=2)
   9040 assert b.answers(a)
   9041 assert not a.answers(b)
   9042 
   9043 assert not (Dot11()/Dot11Ack()).answers(Dot11())
   9044 assert (Dot11()/LLC(dsap=2, ctrl=4)).answers(Dot11()/LLC(dsap=1, ctrl=5))
   9045 
   9046 
   9047 ############
   9048 ############
   9049 + 802.3
   9050 
   9051 = Test detection
   9052 
   9053 assert isinstance(Dot3(raw(Ether())),Ether)
   9054 assert isinstance(Ether(raw(Dot3())),Dot3)
   9055 
   9056 a = Ether(b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00')
   9057 assert isinstance(a,Dot3)
   9058 assert a.dst == 'ff:ff:ff:ff:ff:ff'
   9059 assert a.src == '00:00:00:00:00:00'
   9060 
   9061 a = Dot3(b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x90\x00')
   9062 assert isinstance(a,Ether)
   9063 assert a.dst == 'ff:ff:ff:ff:ff:ff'
   9064 assert a.src == '00:00:00:00:00:00'
   9065 
   9066 
   9067 ############
   9068 ############
   9069 + ASN.1
   9070 
   9071 = MIB
   9072 
   9073 import tempfile
   9074 fd, fname = tempfile.mkstemp()
   9075 os.write(fd, b"-- MIB test\nscapy       OBJECT IDENTIFIER ::= {test 2807}\n")
   9076 os.close(fd)
   9077 
   9078 load_mib(fname)
   9079 assert(len([k for k in conf.mib.iterkeys() if "scapy" in k]) == 1)
   9080 
   9081 assert(len([oid for oid in conf.mib]) > 100)
   9082 
   9083 assert(conf.mib._my_find("MIB", "keyUsage"))
   9084 
   9085 assert(len(conf.mib._find("MIB", "keyUsage")))
   9086 
   9087 assert(len(conf.mib._recurs_find_all((), "MIB", "keyUsage")))
   9088 
   9089 = MIB - graph
   9090 
   9091 @mock.patch("scapy.asn1.mib.do_graph")
   9092 def get_mib_graph(do_graph):
   9093     def store_graph(graph, **kargs):
   9094         assert graph.startswith("""digraph "mib" {""")
   9095         assert """"test.2807" [ label="scapy"  ];""" in graph
   9096     do_graph.side_effect = store_graph
   9097     conf.mib._make_graph()
   9098 
   9099 get_mib_graph()
   9100 
   9101 = DADict tests
   9102 
   9103 a = DADict("test")
   9104 a.test_value = "scapy"
   9105 with ContextManagerCaptureOutput() as cmco:
   9106     a._show()
   9107     assert(cmco.get_output() == "test_value = 'scapy'\n")
   9108 
   9109 b = DADict("test2")
   9110 b.test_value_2 = "hello_world"
   9111 
   9112 a._branch(b, 1)
   9113 try:
   9114     a._branch(b, 1)
   9115     assert False
   9116 except DADict_Exception:
   9117     pass
   9118 
   9119 assert(len(a._find("test2")))
   9120 
   9121 assert(len(a._find(test_value_2="hello_world")))
   9122 
   9123 assert(len(a._find_all("test2")))
   9124 
   9125 assert(not a._recurs_find((a,)))
   9126 
   9127 assert(not a._recurs_find_all((a,)))
   9128 
   9129 = BER tests
   9130 
   9131 BER_id_enc(42) == '*'
   9132 BER_id_enc(2807) == b'\xbfw'
   9133 
   9134 b = BERcodec_IPADDRESS()
   9135 r1 = b.enc("8.8.8.8")
   9136 r1 == b'@\x04\x08\x08\x08\x08'
   9137 
   9138 r2 = b.dec(r1)[0]
   9139 r2.val == '8.8.8.8'
   9140 
   9141 
   9142 ############
   9143 ############
   9144 + inet.py
   9145 
   9146 = IPv4 - ICMPTimeStampField
   9147 test = ICMPTimeStampField("test", None)
   9148 value = test.any2i("", "07:28:28.07")
   9149 value == 26908070
   9150 test.i2repr("", value) == '7:28:28.70'
   9151 
   9152 = IPv4 - UDP null checksum
   9153 IP(raw(IP()/UDP()/Raw(b"\xff\xff\x01\x6a")))[UDP].chksum == 0xFFFF
   9154 
   9155 = IPv4 - (IP|UDP|TCP|ICMP)Error
   9156 query = IP(dst="192.168.0.1", src="192.168.0.254", ttl=1)/UDP()/DNS()
   9157 answer = IP(dst="192.168.0.254", src="192.168.0.2", ttl=1)/ICMP()/IPerror(dst="192.168.0.1", src="192.168.0.254", ttl=0)/UDPerror()/DNS()
   9158 
   9159 query = IP(dst="192.168.0.1", src="192.168.0.254", ttl=1)/UDP()/DNS()
   9160 answer = IP(dst="192.168.0.254", src="192.168.0.2")/ICMP(type=11)/IPerror(dst="192.168.0.1", src="192.168.0.254", ttl=0)/UDPerror()/DNS()
   9161 assert(answer.answers(query) == True)
   9162 
   9163 query = IP(dst="192.168.0.1", src="192.168.0.254", ttl=1)/TCP()
   9164 answer = IP(dst="192.168.0.254", src="192.168.0.2")/ICMP(type=11)/IPerror(dst="192.168.0.1", src="192.168.0.254", ttl=0)/TCPerror()
   9165 
   9166 assert(answer.answers(query) == True)
   9167 
   9168 query = IP(dst="192.168.0.1", src="192.168.0.254", ttl=1)/ICMP()/"scapy"
   9169 answer = IP(dst="192.168.0.254", src="192.168.0.2")/ICMP(type=11)/IPerror(dst="192.168.0.1", src="192.168.0.254", ttl=0)/ICMPerror()/"scapy"
   9170 assert(answer.answers(query) == True)
   9171 
   9172 = IPv4 - mDNS
   9173 a = IP(dst="224.0.0.251")
   9174 assert a.hashret() == b"\x00"
   9175 
   9176 # TODO add real case here
   9177 
   9178 = IPv4 - utilities
   9179 l = overlap_frag(IP(dst="1.2.3.4")/ICMP()/("AB"*8), ICMP()/("CD"*8))
   9180 assert(len(l) == 6)
   9181 assert([len(raw(p[IP].payload)) for p in l] == [8, 8, 8, 8, 8, 8])
   9182 assert([(p.frag, p.flags.MF) for p in [IP(raw(p)) for p in l]] == [(0, True), (1, True), (2, True), (0, True), (1, True), (2, False)])
   9183 
   9184 = IPv4 - traceroute utilities
   9185 ip_ttl = [("192.168.0.%d" % i, i) for i in six.moves.range(1, 10)]
   9186 
   9187 tr_packets = [ (IP(dst="192.168.0.1", src="192.168.0.254", ttl=ttl)/TCP(options=[("Timestamp", "00:00:%.2d.00" % ttl)])/"scapy",
   9188                 IP(dst="192.168.0.254", src=ip)/ICMP(type=11)/IPerror(dst="192.168.0.1", src="192.168.0.254", ttl=0)/TCPerror()/"scapy")
   9189                for (ip, ttl) in ip_ttl ]
   9190 
   9191 tr = TracerouteResult(tr_packets)
   9192 assert(tr.get_trace() == {'192.168.0.1': {1: ('192.168.0.1', False), 2: ('192.168.0.2', False), 3: ('192.168.0.3', False), 4: ('192.168.0.4', False), 5: ('192.168.0.5', False), 6: ('192.168.0.6', False), 7: ('192.168.0.7', False), 8: ('192.168.0.8', False), 9: ('192.168.0.9', False)}})
   9193 
   9194 def test_show():
   9195     with ContextManagerCaptureOutput() as cmco:
   9196         tr = TracerouteResult(tr_packets)
   9197         tr.show()
   9198         result_show = cmco.get_output()
   9199     expected = "  192.168.0.1:tcp80  \n"
   9200     expected += "1 192.168.0.1     11 \n"
   9201     expected += "2 192.168.0.2     11 \n"
   9202     expected += "3 192.168.0.3     11 \n"
   9203     expected += "4 192.168.0.4     11 \n"
   9204     expected += "5 192.168.0.5     11 \n"
   9205     expected += "6 192.168.0.6     11 \n"
   9206     expected += "7 192.168.0.7     11 \n"
   9207     expected += "8 192.168.0.8     11 \n"
   9208     expected += "9 192.168.0.9     11 \n"
   9209     index_result = result_show.index("\n1")
   9210     index_expected = expected.index("\n1")
   9211     assert(result_show[index_result:] == expected[index_expected:])
   9212 
   9213 test_show()
   9214 
   9215 def test_summary():
   9216     with ContextManagerCaptureOutput() as cmco:
   9217         tr = TracerouteResult(tr_packets)
   9218         tr.summary()
   9219         result_summary = cmco.get_output()
   9220     assert(len(result_summary.split('\n')) == 10)
   9221     assert(any(
   9222         "IP / TCP 192.168.0.254:%s > 192.168.0.1:%s S / Raw ==> "
   9223         "IP / ICMP 192.168.0.9 > 192.168.0.254 time-exceeded "
   9224         "ttl-zero-during-transit / IPerror / TCPerror / "
   9225         "Raw" % (ftp_data, http) in result_summary
   9226         for ftp_data in ['21', 'ftp_data']
   9227         for http in ['80', 'http', 'www_http', 'www']
   9228     ))
   9229 
   9230 test_summary()
   9231 
   9232 @mock.patch("scapy.layers.inet.plt")
   9233 def test_timeskew_graph(mock_plt):
   9234     def fake_plot(data, **kwargs):
   9235         return data
   9236     mock_plt.plot = fake_plot
   9237     srl = SndRcvList([(a, a) for a in [IP(raw(p[0])) for p in tr_packets]])
   9238     ret = srl.timeskew_graph("192.168.0.254")
   9239     assert(len(ret) == 9)
   9240     assert(ret[0][1] == 0.0)
   9241 
   9242 test_timeskew_graph()
   9243 
   9244 tr = TracerouteResult(tr_packets)
   9245 saved_AS_resolver = conf.AS_resolver
   9246 conf.AS_resolver = None
   9247 tr.make_graph()
   9248 assert(len(tr.graphdef) == 491)
   9249 tr.graphdef.startswith("digraph trace {") == True
   9250 assert(('"192.168.0.9" ->' in tr.graphdef) == True)
   9251 conf.AS_resolver = conf.AS_resolver
   9252 
   9253 pl = PacketList(list([Ether()/x for x in itertools.chain(*tr_packets)]))
   9254 srl, ul = pl.sr()
   9255 assert(len(srl) == 9 and len(ul) == 0)
   9256 
   9257 conf_color_theme = conf.color_theme
   9258 conf.color_theme = BlackAndWhite()
   9259 assert(len(pl.sessions().keys()) == 10)
   9260 conf.color_theme = conf_color_theme
   9261 
   9262 new_pl = pl.replace(IP.src, "192.168.0.254", "192.168.0.42")
   9263 assert("192.168.0.254" not in [p[IP].src for p in new_pl])
   9264 
   9265 = IPv4 - reporting
   9266 
   9267 @mock.patch("scapy.layers.inet.sr")
   9268 def test_report_ports(mock_sr):
   9269     def sr(*args, **kargs):
   9270         return [(IP()/TCP(dport=65081, flags="S"), IP()/TCP(sport=65081, flags="SA")),
   9271                 (IP()/TCP(dport=65082, flags="S"), IP()/ICMP(type=3, code=1)),
   9272                 (IP()/TCP(dport=65083, flags="S"), IP()/TCP(sport=65083, flags="R"))], [IP()/TCP(dport=65084, flags="S")]
   9273     mock_sr.side_effect = sr
   9274     report = "\\begin{tabular}{|r|l|l|}\n\hline\n65081 & open & SA \\\\\n\hline\n?? & closed & ICMP type dest-unreach/host-unreachable from 127.0.0.1 \\\\\n65083 & closed & TCP R \\\\\n\hline\n65084 & ? & unanswered \\\\\n\hline\n\end{tabular}\n"
   9275     assert(report_ports("www.secdev.org", [65081,65082,65083,65084]) == report)
   9276 
   9277 test_report_ports()
   9278 
   9279 def test_IPID_count():
   9280     with ContextManagerCaptureOutput() as cmco:
   9281         random.seed(0x2807)
   9282         IPID_count([(IP()/UDP(), IP(id=random.randint(0, 65535))/UDP()) for i in range(3)])
   9283         result_IPID_count = cmco.get_output()
   9284     lines = result_IPID_count.split("\n")
   9285     assert(len(lines) == 5)
   9286     assert(lines[0] in ["Probably 3 classes: [4613, 53881, 58437]",
   9287                         "Probably 3 classes: [9103, 9227, 46399]"])
   9288 
   9289 test_IPID_count()
   9290 
   9291 
   9292 ############
   9293 ############
   9294 + Fields
   9295 
   9296 = FieldLenField with BitField
   9297 class Test(Packet):
   9298     name = "Test"
   9299     fields_desc = [
   9300         FieldLenField("BitCount", None, fmt="H", count_of="Values"),
   9301         FieldLenField("ByteCount", None, fmt="B", length_of="Values"),
   9302         FieldListField("Values", [], BitField("data", 0x0, size=1),
   9303                        count_from=lambda pkt: pkt.BitCount),
   9304     ]
   9305 
   9306 pkt = Test(raw(Test(Values=[0, 0, 0, 0, 1, 1, 1, 1])))
   9307 assert(pkt.BitCount == 8)
   9308 assert(pkt.ByteCount == 1)
   9309 
   9310 ############
   9311 ############
   9312 + MPLS tests
   9313 
   9314 = MPLS - build/dissection
   9315 from scapy.contrib.mpls import MPLS
   9316 p1 = MPLS()/IP()/UDP()
   9317 assert(p1[MPLS].s == 1)
   9318 p2 = MPLS()/MPLS()/IP()/UDP()
   9319 assert(p2[MPLS].s == 0)
   9320 
   9321 p1[MPLS]
   9322 p1[IP]
   9323 p2[MPLS]
   9324 p2[MPLS:1]
   9325 p2[IP]
   9326 
   9327 
   9328 + Restore normal routes & Ifaces
   9329 
   9330 = Windows
   9331 
   9332 if WINDOWS:
   9333     IFACES.reload()
   9334     conf.route.resync()
   9335     conf.route6.resync()
   9336 
   9337 True
   9338 
   9339 
   9340 ############
   9341 ############
   9342 + PacketList methods
   9343 
   9344 = plot()
   9345 
   9346 import mock
   9347 @mock.patch("scapy.plist.plt")
   9348 def test_plot(mock_plt):
   9349     def fake_plot(data, **kwargs):
   9350         return data
   9351     mock_plt.plot = fake_plot
   9352     plist = PacketList([IP(id=i)/TCP() for i in range(10)])
   9353     lines = plist.plot(lambda p: (p.time, p.id))
   9354     assert(len(lines) == 10)
   9355 
   9356 test_plot()
   9357 
   9358 = diffplot()
   9359 
   9360 import mock
   9361 @mock.patch("scapy.plist.plt")
   9362 def test_diffplot(mock_plt):
   9363     def fake_plot(data, **kwargs):
   9364         return data
   9365     mock_plt.plot = fake_plot
   9366     plist = PacketList([IP(id=i)/TCP() for i in range(10)])
   9367     lines = plist.diffplot(lambda x,y: (x.time, y.id-x.id))
   9368     assert(len(lines) == 9)
   9369 
   9370 test_diffplot()
   9371 
   9372 = multiplot()
   9373 
   9374 import mock
   9375 @mock.patch("scapy.plist.plt")
   9376 def test_multiplot(mock_plt):
   9377     def fake_plot(data, **kwargs):
   9378         return data
   9379     mock_plt.plot = fake_plot
   9380     tmp = [IP(id=i)/TCP() for i in range(10)]
   9381     plist = PacketList([tuple(tmp[i-2:i]) for i in range(2, 10, 2)])
   9382     lines = plist.multiplot(lambda x: (x[1][IP].src, (x[1].time, x[1][IP].id)))
   9383     assert(len(lines) == 1)
   9384     assert(len(lines[0]) == 4)
   9385 
   9386 test_multiplot()
   9387 
   9388 = rawhexdump()
   9389 
   9390 def test_rawhexdump():
   9391     with ContextManagerCaptureOutput() as cmco:
   9392         p = PacketList([IP()/TCP() for i in range(2)])
   9393         p.rawhexdump()
   9394         result_pl_rawhexdump = cmco.get_output()
   9395     assert(len(result_pl_rawhexdump.split('\n')) == 7)
   9396     assert(result_pl_rawhexdump.startswith("0000  45000028"))
   9397 
   9398 test_rawhexdump()
   9399 
   9400 = hexraw()
   9401 
   9402 def test_hexraw():
   9403     with ContextManagerCaptureOutput() as cmco:
   9404         p = PacketList([IP()/Raw(str(i)) for i in range(2)])
   9405         p.hexraw()
   9406         result_pl_hexraw = cmco.get_output()
   9407     assert(len(result_pl_hexraw.split('\n')) == 5)
   9408     assert("0000  30" in result_pl_hexraw)
   9409 
   9410 test_hexraw()
   9411 
   9412 = hexdump()
   9413 
   9414 def test_hexdump():
   9415     with ContextManagerCaptureOutput() as cmco:
   9416         p = PacketList([IP()/Raw(str(i)) for i in range(2)])
   9417         p.hexdump()
   9418         result_pl_hexdump = cmco.get_output()
   9419     assert(len(result_pl_hexdump.split('\n')) == 7)
   9420     assert("0010  7F00000131" in result_pl_hexdump)
   9421 
   9422 test_hexdump()
   9423 
   9424 = padding()
   9425 
   9426 def test_padding():
   9427     with ContextManagerCaptureOutput() as cmco:
   9428         p = PacketList([IP()/conf.padding_layer(str(i)) for i in range(2)])
   9429         p.padding()
   9430         result_pl_padding = cmco.get_output()
   9431     assert(len(result_pl_padding.split('\n')) == 5)
   9432     assert("0000  30" in result_pl_padding)
   9433 
   9434 test_padding()
   9435 
   9436 = nzpadding()
   9437 
   9438 def test_nzpadding():
   9439     with ContextManagerCaptureOutput() as cmco:
   9440         p = PacketList([IP()/conf.padding_layer("A%s" % i) for i in range(2)])
   9441         p.nzpadding()
   9442         result_pl_nzpadding = cmco.get_output()
   9443     assert(len(result_pl_nzpadding.split('\n')) == 5)
   9444     assert("0000  4130" in result_pl_nzpadding)
   9445 
   9446 test_nzpadding()
   9447 
   9448 = conversations()
   9449 
   9450 import mock
   9451 @mock.patch("scapy.plist.do_graph")
   9452 def test_conversations(mock_do_graph):
   9453     def fake_do_graph(graph, **kwargs):
   9454         return graph
   9455     mock_do_graph.side_effect = fake_do_graph
   9456     plist = PacketList([IP(dst="127.0.0.2")/TCP(dport=i) for i in range(2)])
   9457     plist.extend([IP(src="127.0.0.2")/TCP(sport=i) for i in range(2)])
   9458     result_conversations = plist.conversations()
   9459     assert(len(result_conversations.split('\n')) == 5)
   9460     assert(result_conversations.startswith('digraph "conv" {'))
   9461 
   9462 test_conversations()
   9463 
   9464 = afterglow()
   9465 
   9466 import mock
   9467 @mock.patch("scapy.plist.do_graph")
   9468 def test_afterglow(mock_do_graph):
   9469     def fake_do_graph(graph, **kwargs):
   9470         return graph
   9471     mock_do_graph.side_effect = fake_do_graph
   9472     plist = PacketList([IP(dst="127.0.0.2")/TCP(dport=i) for i in range(2)])
   9473     plist.extend([IP(src="127.0.0.2")/TCP(sport=i) for i in range(2)])
   9474     result_afterglow = plist.afterglow()
   9475     assert(len(result_afterglow.split('\n')) == 19)
   9476     assert(result_afterglow.startswith('digraph "afterglow" {'))
   9477 
   9478 test_afterglow()
   9479 
   9480 = psdump()
   9481 
   9482 print("PYX: %d" % PYX)
   9483 if PYX:
   9484     import tempfile
   9485     import os
   9486     filename = tempfile.mktemp(suffix=".ps")
   9487     plist = PacketList([IP()/TCP()])
   9488     plist.psdump(filename)
   9489     assert(os.path.exists(filename))
   9490     os.unlink(filename)
   9491 
   9492 = pdfdump()
   9493 
   9494 print("PYX: %d" % PYX)
   9495 if PYX:
   9496     import tempfile
   9497     import os
   9498     filename = tempfile.mktemp(suffix=".pdf")
   9499     plist = PacketList([IP()/TCP()])
   9500     plist.pdfdump(filename)
   9501     assert(os.path.exists(filename))
   9502     os.unlink(filename)
   9503 
   9504 ############
   9505 ############
   9506 + Scapy version
   9507 
   9508 = _version()
   9509 
   9510 import os
   9511 version_filename = os.path.join(scapy._SCAPY_PKG_DIR, "VERSION")
   9512 
   9513 version = scapy._version()
   9514 assert(os.path.exists(version_filename))
   9515 
   9516 import mock
   9517 with mock.patch("scapy._version_from_git_describe") as version_mocked:
   9518   version_mocked.side_effect = Exception()
   9519   assert(scapy._version() == version)
   9520   os.unlink(version_filename)
   9521   assert(scapy._version() == "git-archive.dev$Format:%h")
   9522 
   9523 
   9524 ############
   9525 # RTP
   9526 ############
   9527 
   9528 + RTP tests
   9529 
   9530 = test rtp with extension header
   9531 ~ rtp
   9532 
   9533 data = b'\x90o\x14~YY\xf5h\xcc#\xd7\xcfUH\x00\x03\x167116621 \x000\x00'
   9534 pkt = RTP(data)
   9535 assert "RTP" in pkt
   9536 parsed = pkt["RTP"]
   9537 assert parsed.version == 2
   9538 assert parsed.extension
   9539 assert parsed.numsync == 0
   9540 assert not parsed.marker
   9541 assert parsed.payload_type == 111
   9542 assert parsed.sequence == 5246
   9543 assert parsed.timestamp == 1499067752
   9544 assert parsed.sourcesync == 0xcc23d7cf
   9545 assert "RTPExtension" in parsed, parsed.show()
   9546 assert parsed["RTPExtension"].header_id == 0x5548
   9547 assert parsed["RTPExtension"].header == [0x16373131,0x36363231,0x20003000]
   9548 
   9549 = test layer creation
   9550 
   9551 created = RTP(extension=True, payload_type="PCMA", sequence=0x1234, timestamp=12345678, sourcesync=0xabcdef01)
   9552 created /= RTPExtension(header_id=0x4321, header=[0x11223344])
   9553 assert raw(created) == b'\x90\x08\x124\x00\xbcaN\xab\xcd\xef\x01C!\x00\x01\x11"3D'
   9554 parsed = RTP(raw(created))
   9555 assert parsed.payload_type == 8
   9556 assert "RTPExtension" in parsed, parsed.show()
   9557 assert parsed["RTPExtension"].header == [0x11223344]
   9558 
   9559 = test RTP without extension
   9560 
   9561 created = RTP(extension=False, payload_type="DVI4", sequence=0x1234, timestamp=12345678, sourcesync=0xabcdef01)
   9562 assert raw(created) == b'\x80\x11\x124\x00\xbcaN\xab\xcd\xef\x01'
   9563 parsed = RTP(raw(created))
   9564 assert parsed.sourcesync == 0xabcdef01
   9565 assert "RTPExtension" not in parsed
   9566