@@ -32,3 +32,101 @@ assert raw(
3232 reserved2=0x6f000000,
3333 )
3434) == advertise_raw
35+
36+ = HSRPv2 - IPv4 Group State build & dissection
37+ virtual_ip4 = "192.0.2.1"
38+ virtual_ip4_raw = b"\xc0\x00\x02\x01" + b"\x00" * 12
39+ pkt = IP(raw(
40+ IP(dst="224.0.0.102") /
41+ UDP(dport=1985, sport=1985) /
42+ HSRPv2() /
43+ HSRPv2GroupStateTLV(
44+ group=2,
45+ identifier="00:05:73:a0:00:02",
46+ priority=110,
47+ hellotime=1000,
48+ holdtime=3000,
49+ virtualIP=virtual_ip4,
50+ )
51+ ))
52+ assert pkt[IP].dst == "224.0.0.102" and pkt[UDP].sport == pkt[UDP].dport == 1985
53+ assert HSRPv2 in pkt and HSRPv2GroupStateTLV in pkt and HSRP not in pkt
54+ assert pkt[HSRPv2GroupStateTLV].type == 1 and pkt[HSRPv2GroupStateTLV].len == 40
55+ assert pkt[HSRPv2GroupStateTLV].version == 2 and pkt[HSRPv2GroupStateTLV].state == 6
56+ assert pkt[HSRPv2GroupStateTLV].group == 2
57+ assert pkt[HSRPv2GroupStateTLV].identifier == "00:05:73:a0:00:02"
58+ assert pkt[HSRPv2GroupStateTLV].priority == 110
59+ assert pkt[HSRPv2GroupStateTLV].hellotime == 1000
60+ assert pkt[HSRPv2GroupStateTLV].holdtime == 3000
61+ assert pkt[HSRPv2GroupStateTLV].virtualIP == virtual_ip4
62+ assert raw(pkt[HSRPv2GroupStateTLV])[-16:] == virtual_ip4_raw
63+
64+ = HSRPv2 - IPv6 Group State build & dissection
65+ if conf.ipv6_enabled:
66+ virtual_ip6 = "2001:db8::1"
67+ virtual_ip6_raw = b"\x20\x01\x0d\xb8" + b"\x00" * 11 + b"\x01"
68+ pkt = IPv6(raw(
69+ IPv6() /
70+ UDP(dport=2029, sport=2029) /
71+ HSRPv2() /
72+ HSRPv2GroupStateTLV(
73+ ipversion=6,
74+ group=2,
75+ virtualIP=virtual_ip6,
76+ )
77+ ))
78+ assert pkt[IPv6].dst == "ff02::66" and pkt[UDP].sport == pkt[UDP].dport == 2029
79+ assert HSRPv2 in pkt and HSRPv2GroupStateTLV in pkt
80+ assert pkt[HSRPv2GroupStateTLV].len == 40
81+ assert pkt[HSRPv2GroupStateTLV].ipversion == 6
82+ assert pkt[HSRPv2GroupStateTLV].virtualIP == virtual_ip6
83+ assert raw(pkt[HSRPv2GroupStateTLV])[-16:] == virtual_ip6_raw
84+
85+ = HSRPv2 - multiple TLVs
86+ pkt = HSRPv2(raw(
87+ HSRPv2GroupStateTLV() /
88+ HSRPv2TextAuthTLV(auth=b"secret\x00\x00") /
89+ HSRPv2InterfaceStateTLV(activegroups=1, passivegroups=2)
90+ ))
91+ assert HSRPv2GroupStateTLV in pkt
92+ assert HSRPv2TextAuthTLV in pkt
93+ assert HSRPv2InterfaceStateTLV in pkt
94+ assert pkt[HSRPv2GroupStateTLV].len == 40
95+ assert pkt[HSRPv2TextAuthTLV].len == 8 and pkt[HSRPv2TextAuthTLV].auth == b"secret\x00\x00"
96+ assert pkt[HSRPv2InterfaceStateTLV].len == 4
97+ assert pkt[HSRPv2InterfaceStateTLV].activegroups == 1
98+ assert pkt[HSRPv2InterfaceStateTLV].passivegroups == 2
99+
100+ = HSRPv2 - Unknown TLV build & dissection
101+ unknown_raw = raw(HSRPv2UnknownTLV(type=99, value=b"abcd"))
102+ pkt = HSRPv2(unknown_raw)
103+ assert unknown_raw == b"\x63\x04abcd"
104+ assert HSRPv2UnknownTLV in pkt
105+ assert pkt[HSRPv2UnknownTLV].type == 99
106+ assert pkt[HSRPv2UnknownTLV].len == 4
107+ assert pkt[HSRPv2UnknownTLV].value == b"abcd"
108+
109+ = HSRPv2 - MD5 Auth TLV build & dissection
110+ digest = b"\x11" * 16
111+ pkt = HSRPv2(raw(
112+ HSRPv2MD5AuthTLV(
113+ sourceip="192.0.2.1",
114+ keyid=7,
115+ authdigest=digest,
116+ )
117+ ))
118+ assert HSRPv2MD5AuthTLV in pkt
119+ assert pkt[HSRPv2MD5AuthTLV].type == 4 and pkt[HSRPv2MD5AuthTLV].len == 28
120+ assert pkt[HSRPv2MD5AuthTLV].algo == 1
121+ assert pkt[HSRPv2MD5AuthTLV].sourceip == "192.0.2.1"
122+ assert pkt[HSRPv2MD5AuthTLV].keyid == 7
123+ assert pkt[HSRPv2MD5AuthTLV].authdigest == digest
124+
125+ = HSRPv2 - TLV length overflow
126+ try:
127+ raw(HSRPv2UnknownTLV(type=99, value=b"A" * 256))
128+ overflow_raised = False
129+ except ValueError:
130+ overflow_raised = True
131+
132+ assert overflow_raised
0 commit comments