Skip to content
Snippets Groups Projects
Commit 683ae19e authored by zer0@platinum's avatar zer0@platinum
Browse files

Support GRE RFC 1701

This includes: key, gre routing infos, sequence number, ...
parent f22acdc6
No related branches found
No related tags found
No related merge requests found
...@@ -348,22 +348,38 @@ class ARP(Packet): ...@@ -348,22 +348,38 @@ class ARP(Packet):
conf.neighbor.register_l3(Ether, ARP, lambda l2,l3: getmacbyip(l3.pdst)) conf.neighbor.register_l3(Ether, ARP, lambda l2,l3: getmacbyip(l3.pdst))
class GRErouting(Packet):
name = "GRE routing informations"
fields_desc = [ ShortField("address_family",0),
ByteField("SRE_offset", 0),
FieldLenField("SRE_len", None, "routing_info", "B"),
StrLenField("routing_info", "", "SRE_len"),
]
class GRE(Packet): class GRE(Packet):
name = "GRE" name = "GRE"
fields_desc = [ BitField("chksumpresent",0,1), fields_desc = [ BitField("chksum_present",0,1),
BitField("reserved0",0,12), BitField("routing_present",0,1),
BitField("key_present",0,1),
BitField("seqnum_present",0,1),
BitField("strict_route_source",0,1),
BitField("recursion control",0,3),
BitField("flags",0,5),
BitField("version",0,3), BitField("version",0,3),
XShortEnumField("proto", 0x0000, ETHER_TYPES), XShortEnumField("proto", 0x0000, ETHER_TYPES),
ConditionalField(XShortField("chksum",None),lambda pkt:pkt.chksumpresent==1), ConditionalField(XShortField("chksum",None), lambda pkt:pkt.chksum_present==1 or pkt.routing_present==1),
ConditionalField(XShortField("reserved1",None),lambda pkt:pkt.chksumpresent==1), ConditionalField(XShortField("offset",None), lambda pkt:pkt.chksum_present==1 or pkt.routing_present==1),
ConditionalField(XIntField("key",None), lambda pkt:pkt.key_present==1),
ConditionalField(XIntField("seqence_number",None), lambda pkt:pkt.seqnum_present==1),
] ]
def post_build(self, p, pay): def post_build(self, p, pay):
p += pay p += pay
if self.chksumpresent and self.chksum is None: if self.chksum_present and self.chksum is None:
c = checksum(p) c = checksum(p)
p = p[:4]+chr((c>>8)&0xff)+chr(c&0xff)+p[6:] p = p[:4]+chr((c>>8)&0xff)+chr(c&0xff)+p[6:]
return p return p
...@@ -384,6 +400,9 @@ bind_layers( GRE, Dot1Q, proto=33024) ...@@ -384,6 +400,9 @@ bind_layers( GRE, Dot1Q, proto=33024)
bind_layers( GRE, Ether, proto=1) bind_layers( GRE, Ether, proto=1)
bind_layers( GRE, ARP, proto=2054) bind_layers( GRE, ARP, proto=2054)
bind_layers( GRE, EAPOL, proto=34958) bind_layers( GRE, EAPOL, proto=34958)
bind_layers( GRE, GRErouting, { "routing_present" : 1 } )
bind_layers( GRErouting, Raw, { "address_family" : 0, "SRE_len" : 0 })
bind_layers( GRErouting, GRErouting, { } )
bind_layers( EAPOL, EAP, type=0) bind_layers( EAPOL, EAP, type=0)
bind_layers( LLC, STP, dsap=66, ssap=66, ctrl=3) bind_layers( LLC, STP, dsap=66, ssap=66, ctrl=3)
bind_layers( LLC, SNAP, dsap=170, ssap=170, ctrl=3) bind_layers( LLC, SNAP, dsap=170, ssap=170, ctrl=3)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment