Ticket #9: patch_vrrp.diff

File patch_vrrp.diff, 2.6 kB (added by zer0@droids-corp.org, 2 years ago)

Patch to implement VRRP

  • scapy.py

    old new  
    41284128            x = f.i2len(pkt,pkt.getfieldval(self.fld)) 
    41294129        return x 
    41304130 
     4131class IPListField(FieldListField): 
     4132    islist = 1 
     4133    def __init__(self, name, default, fld, shift=0): 
     4134        self.name = name 
     4135        self.default = default 
     4136        self.fld = fld 
     4137        self.shift=shift 
     4138         
     4139    def i2repr(self,pkt,x): 
     4140        s = [] 
     4141        if x == None: 
     4142            return "[]" 
     4143        for y in x: 
     4144           s.append('%s' % y) 
     4145        return "[ %s ]" % (", ".join(s)) 
     4146         
     4147    def addfield(self, pkt, s, val): 
     4148        val = self.i2m(pkt, val) 
     4149        return s + "".join(map(lambda x: socket.inet_pton(socket.AF_INET, x), val)) 
     4150 
     4151    def getfield(self, pkt, s): 
     4152        l = getattr(pkt, self.fld)         
     4153        l -= self.shift 
     4154        val = [] 
     4155        for i in range(l): 
     4156            s,v = s[4:], socket.inet_ntop(socket.AF_INET, s[:4]) 
     4157            val.append(v) 
     4158        return s, val 
     4159 
     4160 
    41314161# see http://www.iana.org/assignments/ipsec-registry for details 
    41324162ISAKMPAttributeTypes= { "Encryption":    (1, { "DES-CBS"  : 1, 
    41334163                                                "IDEA-CBC" : 2, 
     
    70717101         
    70727102 
    70737103 
     7104class VRRP(Packet): 
     7105    name = "VRRP" 
     7106    fields_desc = [ 
     7107        BitField("version" , 2, 4), 
     7108        BitField("type" , 1, 4), 
     7109        ByteField("vrid", 1), 
     7110        ByteField("priority", 100), 
     7111        FieldLenField("ipcount",None,"addrlist","B"), 
     7112        ByteField("authtype", 0), 
     7113        ByteField("adv", 1), 
     7114        XShortField("chksum", None), 
     7115        IPListField("addrlist", None, "ipcount"), 
     7116        IntField("auth1", 0), 
     7117        IntField("auth2", 0) ] 
     7118     
     7119    def post_build(self, p, pay): 
     7120        if self.chksum is None: 
     7121            ck = checksum(p) 
     7122            p = p[:6]+chr(ck>>8)+chr(ck&0xff)+p[8:] 
     7123        return p + pay 
     7124 
     7125 
    70747126 
    70757127ISAKMP_payload_type = ["None","SA","Proposal","Transform","KE","ID","CERT","CR","Hash", 
    70767128                       "SIG","Nonce","N","D","VendorID"] 
     
    83698421                ( IP,     TCP,      { "frag" : 0, "proto" : socket.IPPROTO_TCP  } ), 
    83708422                ( IP,     UDP,      { "frag" : 0, "proto" : socket.IPPROTO_UDP  } ), 
    83718423                ( IP,     GRE,      { "frag" : 0, "proto" : socket.IPPROTO_GRE  } ), 
     8424                ( IP,     VRRP,     { "frag" : 0, "proto" : 0x70 } ), 
    83728425                ( UDP,    MGCP,     { "dport" : 2727 } ), 
    83738426                ( UDP,    MGCP,     { "sport" : 2727 } ), 
    83748427                ( UDP,    DNS,      { "dport" : 53 } ),