1% EIGRP Tests 2* Tests for the Scapy EIGRP layer 3 4+ Basic Layer Tests 5* These are just some basic tests 6 7= EIGRP IPv4 Binding 8~ eigrp_ipv4_binding 9p = IP()/EIGRP() 10p[IP].proto == 88 11 12= EIGRP IPv6 Binding 13~ eigrp_ipv6_binding 14p = IPv6()/EIGRP() 15p[IPv6].nh == 88 16 17= EIGRP checksum field 18~ eigrp_chksum_field 19p = IP()/EIGRP(flags=0xa, seq=23, ack=42, asn=100) 20s = p[EIGRP].build() 21struct.unpack("!H", s[2:4])[0] == 64843 22 23+ Custom Field Tests 24* Test funciontally of custom made fields 25 26= ShortVersionField nice representation 27f = ShortVersionField("ver", 3072) 28f.i2repr(None, 3072) == "v12.0" and f.i2repr(None, 258) == "v1.2" 29 30= ShortVersionField h2i function 31f = ShortVersionField("ver", 0) 32f.h2i(None, 3073) == f.h2i(None, "v12.1") 33 34= ShortVersionField error 35try: 36 f = ShortVersionField("ver", None) 37 f.h2i(None, "Error") 38 assert False 39except Scapy_Exception: 40 assert True 41 42f = ShortVersionField("ver", "default") 43assert f.h2i(None, "Error") == "default" 44assert f.i2repr(None, "Error") == "unknown" 45assert f.randval() <= 65535 46 47= EigrpIPField length with prefix length of 8 bit 48f = EigrpIPField("ipaddr", "192.168.1.0", length=8) 49assert f.m2i(None, b"\x01") == '1.0.0.0' 50assert f.i2m(None, "1.0.0.0") == b"\x01" 51assert f.i2len(None, "") == 1 52 53= EigrpIPField length with prefix length of 12 bit 54f = EigrpIPField("ipaddr", "192.168.1.0", length=12) 55assert f.m2i(None, b"\x01\x02") == '1.2.0.0' 56assert f.i2len(None, "") == 2 57 58= EigrpIPField length with prefix length of 24 bit 59f = EigrpIPField("ipaddr", "192.168.1.0", length=24) 60assert f.m2i(None, b"\x01\x02\x03") == '1.2.3.0' 61assert f.i2len(None, "") == 3 62 63= EigrpIPField length with prefix length of 28 bit 64f = EigrpIPField("ipaddr", "192.168.1.0", length=28) 65assert f.m2i(None, b"\x01\x02\x03\x04") == '1.2.3.4' 66assert f.i2len(None, "") == 4 67 68= EigrpIPField randval 69assert inet_pton(socket.AF_INET, f.randval()) 70 71= EigrpIP6Field length with prefix length of 8 bit 72f = EigrpIP6Field("ipaddr", "2000::", length=8) 73f.i2len(None, "") == 2 74 75= EigrpIP6Field length with prefix length of 99 bit 76f = EigrpIP6Field("ipaddr", "2000::", length=99) 77f.i2len(None, "") == 13 78 79= EigrpIP6Field length with prefix length of 128 bit 80f = EigrpIP6Field("ipaddr", "2000::", length=128) 81f.i2len(None, "") == 16 82 83= EigrpIP6Field randval 84assert inet_pton(socket.AF_INET6, f.randval()) 85 86= EIGRPGuessPayloadClass function: Return Parameters TLV 87from scapy.contrib.eigrp import _EIGRPGuessPayloadClass 88isinstance(_EIGRPGuessPayloadClass(b"\x00\x01" + b"\x00" * 50), EIGRPParam) 89 90= EIGRPGuessPayloadClass function: Return Authentication Data TLV 91isinstance(_EIGRPGuessPayloadClass(b"\x00\x02" + b"\x00" * 50), EIGRPAuthData) 92 93= EIGRPGuessPayloadClass function: Return Sequence TLV 94isinstance(_EIGRPGuessPayloadClass(b"\x00\x03" + b"\x00" * 50), EIGRPSeq) 95 96= EIGRPGuessPayloadClass function: Return Software Version TLV 97isinstance(_EIGRPGuessPayloadClass(b"\x00\x04" + b"\x00" * 50), EIGRPSwVer) 98 99= EIGRPGuessPayloadClass function: Return Next Multicast Sequence TLV 100isinstance(_EIGRPGuessPayloadClass(b"\x00\x05" + b"\x00" * 50), EIGRPNms) 101 102= EIGRPGuessPayloadClass function: Return Stub Router TLV 103isinstance(_EIGRPGuessPayloadClass(b"\x00\x06" + b"\x00" * 50), EIGRPStub) 104 105= EIGRPGuessPayloadClass function: Return Internal Route TLV 106isinstance(_EIGRPGuessPayloadClass(b"\x01\x02" + b"\x00" * 50), EIGRPIntRoute) 107 108= EIGRPGuessPayloadClass function: Return External Route TLV 109isinstance(_EIGRPGuessPayloadClass(b"\x01\x03" + b"\x00" * 50), EIGRPExtRoute) 110 111= EIGRPGuessPayloadClass function: Return IPv6 Internal Route TLV 112isinstance(_EIGRPGuessPayloadClass(b"\x04\x02" + b"\x00" * 50), EIGRPv6IntRoute) 113 114= EIGRPGuessPayloadClass function: Return IPv6 External Route TLV 115isinstance(_EIGRPGuessPayloadClass(b"\x04\x03" + b"\x00" * 100), EIGRPv6ExtRoute) 116 117= EIGRPGuessPayloadClass function: Return EIGRPGeneric 118isinstance(_EIGRPGuessPayloadClass(b"\x23\x42" + b"\x00" * 50), EIGRPGeneric) 119 120+ TLV List 121 122= EIGRP parameters and software version 123p = IP()/EIGRP(tlvlist=[EIGRPParam()/EIGRPSwVer()]) 124s = b'\x45\x00\x00\x3C\x00\x01\x00\x00\x40\x58\x7C\x67\x7F\x00\x00\x01\x7F\x00\x00\x01\x02\x05\xEE\x6C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x01\x00\x0C\x01\x00\x01\x00\x00\x00\x00\x0F\x00\x04\x00\x08\x0C\x00\x01\x02' 125raw(p) == s 126 127= EIGRP Sequence 128p = EIGRP(tlvlist=[EIGRPSeq(addrlen=16, ip6addr="45e4:0ecf:cff3:7be2:6059:771e:a221:3342")]) 129assert raw(p) == b'\x02\x05\x881\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x03\x00\x15\x10E\xe4\x0e\xcf\xcf\xf3{\xe2`Yw\x1e\xa2!3B' 130p = EIGRP(raw(p)) 131assert p.tlvlist[0].ip6addr == "45e4:ecf:cff3:7be2:6059:771e:a221:3342" 132 133= EIGRP Generic 134p = EIGRP(opcode=5, ack=1, flags="init", tlvlist=[EIGRPGeneric(value=b"data"), EIGRPGeneric(value=b"doto")]) 135p = EIGRP(raw(p)) 136assert p.tlvlist[1].value == b"doto" 137assert p.tlvlist[1].len == 8 138assert p.summary() == 'EIGRP (AS=100 Opcode=Hello (ACK) Flags=init)' 139 140= EIGRP internal route length field 141p = IP()/EIGRP(tlvlist=[EIGRPIntRoute(prefixlen=24, dst="192.168.1.0")]) 142struct.unpack("!H", p[EIGRPIntRoute].build()[2:4])[0] == 28 143p = IP(raw(p)) 144assert p.tlvlist[0].prefixlen == 24 145assert p.tlvlist[0].dst == "192.168.1.0" 146 147= EIGRP external route length field 148p = IP()/EIGRP(tlvlist=[EIGRPExtRoute(prefixlen=16, dst="10.1.0.0")]) 149struct.unpack("!H", p[EIGRPExtRoute].build()[2:4])[0] == 47 150 151= EIGRPv6 internal route length field 152p = IP()/EIGRP(tlvlist=[EIGRPv6IntRoute(prefixlen=64, dst="2000::")]) 153struct.unpack("!H", p[EIGRPv6IntRoute].build()[2:4])[0] == 46 154p = IP(raw(p)) 155assert p.tlvlist[0].prefixlen == 64 156assert p.tlvlist[0].dst == "2000::" 157 158= EIGRPv6 external route length field 159p = IP()/EIGRP(tlvlist=[EIGRPv6ExtRoute(prefixlen=99, dst="2000::")]) 160struct.unpack("!H", p[EIGRPv6ExtRoute].build()[2:4])[0] == 70 161 162+ Stub Flags 163* The receive-only flag is always set, when a router announces itself as stub router. 164 165= Receive-Only 166p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="receive-only")]) 167p[EIGRPStub].flags == 0x0008 168 169= Connected 170p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="connected+receive-only")]) 171p[EIGRPStub].flags == 0x0009 172 173= Static 174p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="static+receive-only")]) 175p[EIGRPStub].flags == 0x000a 176 177= Summary 178p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="summary+receive-only")]) 179p[EIGRPStub].flags == 0x000c 180 181= Connected, Summary 182p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="connected+summary+receive-only")]) 183p[EIGRPStub].flags == 0x000d 184 185= Static, Summary 186p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="static+summary+receive-only")]) 187p[EIGRPStub].flags == 0x000e 188 189= Redistributed, Connected 190p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="redistributed+connected+receive-only")]) 191p[EIGRPStub].flags == 0x0019 192 193= Redistributed, Static 194p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="redistributed+static+receive-only")]) 195p[EIGRPStub].flags == 0x001a 196 197= Redistributed, Static, Connected 198p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="redistributed+static+connected+receive-only")]) 199p[EIGRPStub].flags == 0x001b 200 201= Redistributed, Summary 202p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="redistributed+summary+receive-only")]) 203p[EIGRPStub].flags == 0x001c 204 205= Redistributed, Connected, Summary 206p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="redistributed+connected+summary+receive-only")]) 207p[EIGRPStub].flags == 0x001d 208 209= Connected, Redistributed, Static, Summary 210p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="connected+redistributed+static+summary+receive-only")]) 211p[EIGRPStub].flags == 0x001f 212 213= Leak-Map 214p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="leak-map+receive-only")]) 215p[EIGRPStub].flags == 0x0028 216 217= Connected, Leak-Map 218p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="connected+leak-map+receive-only")]) 219p[EIGRPStub].flags == 0x0029 220 221+ Routing Updates 222 223= External route flag external 224p = EIGRPExtRoute(flags="external") 225p.flags == 0x1 226 227= External route flag candidate-default route 228p = EIGRPExtRoute(flags="candidate-default") 229p.flags == 0x2 230 231= Multiple internal routing updates 232p = IP()/EIGRP(tlvlist=[EIGRPIntRoute(), EIGRPIntRoute(hopcount=12), EIGRPIntRoute()]) 233p[EIGRPIntRoute:2].hopcount == 12 234 235= Multiple external routing updates 236p = IP()/EIGRP(tlvlist=[EIGRPExtRoute(), EIGRPExtRoute(mtu=23), EIGRPExtRoute()]) 237p[EIGRPExtRoute:2].mtu == 23 238 239+ Authentication Data TLV 240 241= Verify keysize calculation 242p = IP()/EIGRP(tlvlist=[EIGRPAuthData(authdata=b"\xaa\xbb\xcc")]) 243p[EIGRPAuthData].build()[6:8] == b"\x00\x03" 244 245= Verify length calculation 246p = IP()/EIGRP(tlvlist=[EIGRPAuthData(authdata=b"\xaa\xbb\xcc\xdd")]) 247p[EIGRPAuthData].build()[2:4] == b"\x00\x1c" 248