xref: /aosp_15_r20/external/scapy/scapy/layers/hsrp.py (revision 7dc08ffc4802948ccbc861daaf1e81c405c2c4bd)
1*7dc08ffcSJunyu Lai## This file is part of Scapy
2*7dc08ffcSJunyu Lai## See http://www.secdev.org/projects/scapy for more informations
3*7dc08ffcSJunyu Lai## Copyright (C) Philippe Biondi <[email protected]>
4*7dc08ffcSJunyu Lai## This program is published under a GPLv2 license
5*7dc08ffcSJunyu Lai
6*7dc08ffcSJunyu Lai#############################################################################
7*7dc08ffcSJunyu Lai##                                                                         ##
8*7dc08ffcSJunyu Lai## hsrp.py --- HSRP  protocol support for Scapy                            ##
9*7dc08ffcSJunyu Lai##                                                                         ##
10*7dc08ffcSJunyu Lai## Copyright (C) 2010  Mathieu RENARD mathieu.renard(at)gmail.com          ##
11*7dc08ffcSJunyu Lai##                                                                         ##
12*7dc08ffcSJunyu Lai## This program is free software; you can redistribute it and/or modify it ##
13*7dc08ffcSJunyu Lai## under the terms of the GNU General Public License version 2 as          ##
14*7dc08ffcSJunyu Lai## published by the Free Software Foundation; version 2.                   ##
15*7dc08ffcSJunyu Lai##                                                                         ##
16*7dc08ffcSJunyu Lai## This program is distributed in the hope that it will be useful, but     ##
17*7dc08ffcSJunyu Lai## WITHOUT ANY WARRANTY; without even the implied warranty of              ##
18*7dc08ffcSJunyu Lai## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU       ##
19*7dc08ffcSJunyu Lai## General Public License for more details.                                ##
20*7dc08ffcSJunyu Lai##                                                                         ##
21*7dc08ffcSJunyu Lai#############################################################################
22*7dc08ffcSJunyu Lai## HSRP Version 1
23*7dc08ffcSJunyu Lai##  Ref. RFC 2281
24*7dc08ffcSJunyu Lai## HSRP Version 2
25*7dc08ffcSJunyu Lai##  Ref. http://www.smartnetworks.jp/2006/02/hsrp_8_hsrp_version_2.html
26*7dc08ffcSJunyu Lai##
27*7dc08ffcSJunyu Lai## $Log: hsrp.py,v $
28*7dc08ffcSJunyu Lai## Revision 0.2  2011/05/01 15:23:34  mrenard
29*7dc08ffcSJunyu Lai##   Cleanup code
30*7dc08ffcSJunyu Lai
31*7dc08ffcSJunyu Lai"""
32*7dc08ffcSJunyu LaiHSRP (Hot Standby Router Protocol): proprietary redundancy protocol for Cisco routers.
33*7dc08ffcSJunyu Lai"""
34*7dc08ffcSJunyu Lai
35*7dc08ffcSJunyu Laifrom scapy.fields import *
36*7dc08ffcSJunyu Laifrom scapy.packet import *
37*7dc08ffcSJunyu Laifrom scapy.layers.inet import DestIPField, UDP
38*7dc08ffcSJunyu Laifrom scapy.layers.inet6 import DestIP6Field
39*7dc08ffcSJunyu Lai
40*7dc08ffcSJunyu Lai
41*7dc08ffcSJunyu Laiclass HSRP(Packet):
42*7dc08ffcSJunyu Lai    name = "HSRP"
43*7dc08ffcSJunyu Lai    fields_desc = [
44*7dc08ffcSJunyu Lai        ByteField("version", 0),
45*7dc08ffcSJunyu Lai        ByteEnumField("opcode", 0, {0: "Hello", 1: "Coup", 2: "Resign", 3: "Advertise"}),
46*7dc08ffcSJunyu Lai        ByteEnumField("state", 16, {0: "Initial", 1: "Learn", 2: "Listen", 4: "Speak", 8: "Standby", 16: "Active"}),
47*7dc08ffcSJunyu Lai        ByteField("hellotime", 3),
48*7dc08ffcSJunyu Lai        ByteField("holdtime", 10),
49*7dc08ffcSJunyu Lai        ByteField("priority", 120),
50*7dc08ffcSJunyu Lai        ByteField("group", 1),
51*7dc08ffcSJunyu Lai        ByteField("reserved", 0),
52*7dc08ffcSJunyu Lai        StrFixedLenField("auth", b"cisco" + b"\00" * 3, 8),
53*7dc08ffcSJunyu Lai        IPField("virtualIP", "192.168.1.1")]
54*7dc08ffcSJunyu Lai
55*7dc08ffcSJunyu Lai    def guess_payload_class(self, payload):
56*7dc08ffcSJunyu Lai        if self.underlayer.len > 28:
57*7dc08ffcSJunyu Lai            return HSRPmd5
58*7dc08ffcSJunyu Lai        else:
59*7dc08ffcSJunyu Lai            return Packet.guess_payload_class(self, payload)
60*7dc08ffcSJunyu Lai
61*7dc08ffcSJunyu Lai
62*7dc08ffcSJunyu Laiclass HSRPmd5(Packet):
63*7dc08ffcSJunyu Lai    name = "HSRP MD5 Authentication"
64*7dc08ffcSJunyu Lai    fields_desc = [
65*7dc08ffcSJunyu Lai        ByteEnumField("type", 4, {4: "MD5 authentication"}),
66*7dc08ffcSJunyu Lai        ByteField("len", None),
67*7dc08ffcSJunyu Lai        ByteEnumField("algo", 0, {1: "MD5"}),
68*7dc08ffcSJunyu Lai        ByteField("padding", 0x00),
69*7dc08ffcSJunyu Lai        XShortField("flags", 0x00),
70*7dc08ffcSJunyu Lai        SourceIPField("sourceip", None),
71*7dc08ffcSJunyu Lai        XIntField("keyid", 0x00),
72*7dc08ffcSJunyu Lai        StrFixedLenField("authdigest", b"\00" * 16, 16)]
73*7dc08ffcSJunyu Lai
74*7dc08ffcSJunyu Lai    def post_build(self, p, pay):
75*7dc08ffcSJunyu Lai        if self.len is None and pay:
76*7dc08ffcSJunyu Lai            l = len(pay)
77*7dc08ffcSJunyu Lai            p = p[:1] + hex(l)[30:] + p[30:]
78*7dc08ffcSJunyu Lai        return p
79*7dc08ffcSJunyu Lai
80*7dc08ffcSJunyu Laibind_layers(UDP, HSRP, dport=1985, sport=1985)
81*7dc08ffcSJunyu Laibind_layers(UDP, HSRP, dport=2029, sport=2029)
82*7dc08ffcSJunyu LaiDestIPField.bind_addr(UDP, "224.0.0.2", dport=1985)
83*7dc08ffcSJunyu LaiDestIP6Field.bind_addr(UDP, "ff02::66", dport=2029)
84