• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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