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 9 p = IP()/EIGRP() 10 p[IP].proto == 88 11 12 = EIGRP IPv6 Binding 13 ~ eigrp_ipv6_binding 14 p = IPv6()/EIGRP() 15 p[IPv6].nh == 88 16 17 = EIGRP checksum field 18 ~ eigrp_chksum_field 19 p = IP()/EIGRP(flags=0xa, seq=23, ack=42, asn=100) 20 s = p[EIGRP].build() 21 struct.unpack("!H", s[2:4])[0] == 64843 22 23 + Custom Field Tests 24 * Test funciontally of custom made fields 25 26 = ShortVersionField nice representation 27 f = ShortVersionField("ver", 3072) 28 f.i2repr(None, 3072) == "v12.0" and f.i2repr(None, 258) == "v1.2" 29 30 = ShortVersionField h2i function 31 f = ShortVersionField("ver", 0) 32 f.h2i(None, 3073) == f.h2i(None, "v12.1") 33 34 = EigrpIPField length with prefix length of 8 bit 35 f = EigrpIPField("ipaddr", "192.168.1.0", length=8) 36 f.i2len(None, "") == 1 37 38 = EigrpIPField length with prefix length of 12 bit 39 f = EigrpIPField("ipaddr", "192.168.1.0", length=12) 40 f.i2len(None, "") == 2 41 42 = EigrpIPField length with prefix length of 24 bit 43 f = EigrpIPField("ipaddr", "192.168.1.0", length=24) 44 f.i2len(None, "") == 3 45 46 = EigrpIPField length with prefix length of 28 bit 47 f = EigrpIPField("ipaddr", "192.168.1.0", length=28) 48 f.i2len(None, "") == 4 49 50 = EigrpIP6Field length with prefix length of 8 bit 51 f = EigrpIP6Field("ipaddr", "2000::", length=8) 52 f.i2len(None, "") == 2 53 54 = EigrpIP6Field length with prefix length of 99 bit 55 f = EigrpIP6Field("ipaddr", "2000::", length=99) 56 f.i2len(None, "") == 13 57 58 = EigrpIP6Field length with prefix length of 128 bit 59 f = EigrpIP6Field("ipaddr", "2000::", length=128) 60 f.i2len(None, "") == 16 61 62 = EIGRPGuessPayloadClass function: Return Parameters TLV 63 from scapy.contrib.eigrp import _EIGRPGuessPayloadClass 64 isinstance(_EIGRPGuessPayloadClass(b"\x00\x01"), EIGRPParam) 65 66 = EIGRPGuessPayloadClass function: Return Authentication Data TLV 67 isinstance(_EIGRPGuessPayloadClass(b"\x00\x02"), EIGRPAuthData) 68 69 = EIGRPGuessPayloadClass function: Return Sequence TLV 70 isinstance(_EIGRPGuessPayloadClass(b"\x00\x03"), EIGRPSeq) 71 72 = EIGRPGuessPayloadClass function: Return Software Version TLV 73 isinstance(_EIGRPGuessPayloadClass(b"\x00\x04"), EIGRPSwVer) 74 75 = EIGRPGuessPayloadClass function: Return Next Multicast Sequence TLV 76 isinstance(_EIGRPGuessPayloadClass(b"\x00\x05"), EIGRPNms) 77 78 = EIGRPGuessPayloadClass function: Return Stub Router TLV 79 isinstance(_EIGRPGuessPayloadClass(b"\x00\x06"), EIGRPStub) 80 81 = EIGRPGuessPayloadClass function: Return Internal Route TLV 82 isinstance(_EIGRPGuessPayloadClass(b"\x01\x02"), EIGRPIntRoute) 83 84 = EIGRPGuessPayloadClass function: Return External Route TLV 85 isinstance(_EIGRPGuessPayloadClass(b"\x01\x03"), EIGRPExtRoute) 86 87 = EIGRPGuessPayloadClass function: Return IPv6 Internal Route TLV 88 isinstance(_EIGRPGuessPayloadClass(b"\x04\x02"), EIGRPv6IntRoute) 89 90 = EIGRPGuessPayloadClass function: Return IPv6 External Route TLV 91 isinstance(_EIGRPGuessPayloadClass(b"\x04\x03"), EIGRPv6ExtRoute) 92 93 = EIGRPGuessPayloadClass function: Return EIGRPGeneric 94 isinstance(_EIGRPGuessPayloadClass(b"\x23\x42"), EIGRPGeneric) 95 96 + TLV List 97 98 = EIGRP parameters and software version 99 p = IP()/EIGRP(tlvlist=[EIGRPParam()/EIGRPSwVer()]) 100 s = 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' 101 raw(p) == s 102 103 = EIGRP internal route length field 104 p = IP()/EIGRP(tlvlist=[EIGRPIntRoute(prefixlen=24, dst="192.168.1.0")]) 105 struct.unpack("!H", p[EIGRPIntRoute].build()[2:4])[0] == 28 106 107 = EIGRP external route length field 108 p = IP()/EIGRP(tlvlist=[EIGRPExtRoute(prefixlen=16, dst="10.1.0.0")]) 109 struct.unpack("!H", p[EIGRPExtRoute].build()[2:4])[0] == 47 110 111 = EIGRPv6 internal route length field 112 p = IP()/EIGRP(tlvlist=[EIGRPv6IntRoute(prefixlen=64, dst="2000::")]) 113 struct.unpack("!H", p[EIGRPv6IntRoute].build()[2:4])[0] == 46 114 115 = EIGRPv6 external route length field 116 p = IP()/EIGRP(tlvlist=[EIGRPv6ExtRoute(prefixlen=99, dst="2000::")]) 117 struct.unpack("!H", p[EIGRPv6ExtRoute].build()[2:4])[0] == 70 118 119 + Stub Flags 120 * The receive-only flag is always set, when a router anounces itself as stub router. 121 122 = Receive-Only 123 p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="receive-only")]) 124 p[EIGRPStub].flags == 0x0008 125 126 = Connected 127 p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="connected+receive-only")]) 128 p[EIGRPStub].flags == 0x0009 129 130 = Static 131 p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="static+receive-only")]) 132 p[EIGRPStub].flags == 0x000a 133 134 = Summary 135 p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="summary+receive-only")]) 136 p[EIGRPStub].flags == 0x000c 137 138 = Connected, Summary 139 p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="connected+summary+receive-only")]) 140 p[EIGRPStub].flags == 0x000d 141 142 = Static, Summary 143 p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="static+summary+receive-only")]) 144 p[EIGRPStub].flags == 0x000e 145 146 = Redistributed, Connected 147 p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="redistributed+connected+receive-only")]) 148 p[EIGRPStub].flags == 0x0019 149 150 = Redistributed, Static 151 p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="redistributed+static+receive-only")]) 152 p[EIGRPStub].flags == 0x001a 153 154 = Redistributed, Static, Connected 155 p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="redistributed+static+connected+receive-only")]) 156 p[EIGRPStub].flags == 0x001b 157 158 = Redistributed, Summary 159 p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="redistributed+summary+receive-only")]) 160 p[EIGRPStub].flags == 0x001c 161 162 = Redistributed, Connected, Summary 163 p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="redistributed+connected+summary+receive-only")]) 164 p[EIGRPStub].flags == 0x001d 165 166 = Connected, Redistributed, Static, Summary 167 p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="connected+redistributed+static+summary+receive-only")]) 168 p[EIGRPStub].flags == 0x001f 169 170 = Leak-Map 171 p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="leak-map+receive-only")]) 172 p[EIGRPStub].flags == 0x0028 173 174 = Connected, Leak-Map 175 p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="connected+leak-map+receive-only")]) 176 p[EIGRPStub].flags == 0x0029 177 178 + Routing Updates 179 180 = External route flag external 181 p = EIGRPExtRoute(flags="external") 182 p.flags == 0x1 183 184 = External route flag candidate-default route 185 p = EIGRPExtRoute(flags="candidate-default") 186 p.flags == 0x2 187 188 = Multiple internal routing updates 189 p = IP()/EIGRP(tlvlist=[EIGRPIntRoute(), EIGRPIntRoute(hopcount=12), EIGRPIntRoute()]) 190 p[EIGRPIntRoute:2].hopcount == 12 191 192 = Multiple external routing updates 193 p = IP()/EIGRP(tlvlist=[EIGRPExtRoute(), EIGRPExtRoute(mtu=23), EIGRPExtRoute()]) 194 p[EIGRPExtRoute:2].mtu == 23 195 196 + Authentication Data TLV 197 198 = Verify keysize calculation 199 p = IP()/EIGRP(tlvlist=[EIGRPAuthData(authdata=b"\xaa\xbb\xcc")]) 200 p[EIGRPAuthData].build()[6:8] == b"\x00\x03" 201 202 = Verify length calculation 203 p = IP()/EIGRP(tlvlist=[EIGRPAuthData(authdata=b"\xaa\xbb\xcc\xdd")]) 204 p[EIGRPAuthData].build()[2:4] == b"\x00\x1c" 205