class TailHeader(Packet): name = 'Tail Header' fields_desc = [ ByteField('next_proto', 0), ShortField('dest_port', 0), ByteField('dscp', 0), ]
class ShimHeader(Packet): name = 'Shim Header' fields_desc = [ ByteField('int_type', 0), ByteField('rsvd1', 0), ByteField('len', 0), ByteField('rsvd2', 0), ]
class NetChain(Packet): name = "KeyValue" fields_desc = [ LongField("preamble", 2), ByteField("mtype", 0), ByteField("dest", 0), IntField("key", 0), IntField("value", 0), ]
class CoLoR_Data(Packet): name = 'CoLoR_Data' fields_desc = [ BitField("Version", 7, 4, tot_size=1), BitField("Package", 3, 4, end_tot_size=1), ByteField("TTL", 64), LEShortField("pkg_length", None), XShortField("checksum", None), ByteField("header_length", None), ByteField("PID_pt", None), FieldLenField("PID_num", None, fmt="B", count_of="PIDs", adjust=lambda pkt, x: x - (pkt.Flags.R == True)), FlagsField("Flags", 0, 8, "rSCQMRBF"), ConditionalField(ShortField("Minimal_PID_CP", None), lambda pkt: pkt.Flags.M), StrFixedLenField("N_sid", "", 16), StrFixedLenField("L_sid", "", 20), StrFixedLenField("nid_cus", "", 16), ConditionalField( StrFixedLenField("nid_pro", "", 16), lambda pkt: pkt.Flags.B == False and pkt.Flags.R == True), ConditionalField( FieldLenField("QoS_len", None, fmt="B", length_of="QoS_requirements"), lambda pkt: pkt.Flags.Q == True), ConditionalField( StrLenField("QoS_requirements", "", length_from=lambda pkt: pkt.QoS_len), lambda pkt: pkt.Flags.Q == True), ConditionalField(IntField("HMAC", None), lambda pkt: pkt.Flags.C == True), ConditionalField(IntField("Seg_ID", None), lambda pkt: pkt.Flags.S == True), FieldListField("PIDs", [""], StrFixedLenField("", "", 4), count_from=lambda pkt: pkt.PID_num + (pkt.Flags.R == True)) ] def post_build(self, pkt, pay): if self.header_length is None: self.header_length = len(pkt) pkt = pkt[:6] + int2Bytes(self.header_length, 1) + pkt[7:] if self.pkg_length is None: self.pkg_length = len(pkt) + len(pay) pkt = pkt[:2] + int2BytesLE(self.pkg_length, 2) + pkt[4:] if self.checksum is None: self.checksum = CalcChecksum(pkt) pkt = pkt[:4] + int2Bytes(self.checksum, 2) + pkt[6:] # print(self.pkg_length, self.header_length, self.checksum) return pkt + pay
class INT_shim(Packet): name = "int shim" fields_desc = [ ByteField("type", 1), ByteField("reserved1", 1), ByteField("len", 3), BitField("dscp", 0, 6), BitField("reserved2", 0, 2) ]
class AxonRoute(Packet): name = "AxonRoute" fields_desc = [ LongField("preamble", 0), ByteField("axonType", 0), ShortField("axonLength", 0), ByteField("fwdHopCount", 0), ByteField("revHopCount", 0) ]
class Pegasus(Packet): name = "PEGASUS" fields_desc = [ ShortField("id", 0x5047), ByteField("op", None), IntField("keyhash", None), ByteField("node", 0), ShortField("load", 0) ]
class FitnessControlPage(Packet): fields_desc = [ByteField('data_page_number', None)] + [ ConditionalField(f, lambda p: p.data_page_number == 51) for f in [ FieldListField( 'reserved', 0, ByteField('x', 0), count_from=lambda p: 4), LEShortField('grade', 0), ByteField('coeff_roll', 0), ] ]
class KeyValue(Packet): name = "KeyValue" fields_desc = [ LongField("preamble", 1), IntField("num_valid", 0), ByteField("port", 1), ByteField("mtype", 0), IntField("key", 0), IntField("value", 0), ]
class DDoSD(Packet): name = "DDoSD Header" fields_desc = [IntField('pkt_num',0), IntField('src_ent',0), IntField('src_ewma',0), IntField('src_ewmmd',0), IntField('dst_ent',0), IntField('dst_ewma',0), IntField('dst_ewmmd',0), ByteField('alarm',0), ByteField('defcon',0), XShortField('ethertype',0)]
class HRMPayload(OptionalExtended): fields_desc = [ BitField('page_change_toggle', 0, 1), BitField('data_page_number', None, 7), # ignore differences between page types FieldListField('data', None, XByteField('x', 0), count_from=lambda p: 5), ByteField('beat_count', 0), ByteField('heart_rate', 0), ]
class MetadataHeader_qdepth(Packet): name = 'Metadata qdepth Header' fields_desc = [ ByteField('qid1', 0), BitField('qdepth1', 0, 24), ByteField('qid2', 0), BitField('qdepth2', 0, 24), ByteField('qid3', 0), BitField('qdepth3', 0, 24), ByteField('qid4', 0), BitField('qdepth4', 0, 24) ]
class VersionInfo(Tag): name = 'Tag - VersionInfo' fields_desc = [ LenField('len', None), XByteField('tag', 0x0a), ByteField('type', None), XShortField('unknown', None), ByteField('id', None), FieldLenField('name_len', None, fmt='B', length_of='name'), StrLenField('name', None, length_from=lambda pkt: pkt.name_len), FieldLenField('ver_len', None, fmt='B', length_of='version'), StrLenField('version', None, length_from=lambda pkt: pkt.ver_len) ]
class Dot11EltRates(Packet): """The rates member contains an array of supported rates""" name = '802.11 Rates Information Element' # Known rates come from table in 6.5.5.2 of the 802.11 spec known_rates = { 2: 1, 3: 1.5, 4: 2, 5: 2.5, 6: 3, 9: 4.5, 11: 5.5, 12: 6, 18: 9, 22: 11, 24: 12, 27: 13.5, 36: 18, 44: 22, 48: 24, 54: 27, 66: 33, 72: 36, 96: 48, 108: 54 } fields_desc = [ ByteField('ID', 0), FieldLenField("len", None, "info", "B"), FieldListField('supported_rates', None, ByteField('', 0), count_from=lambda pkt: pkt.len), ] def post_dissection(self, pkt): self.rates = [] for supported_rate in self.supported_rates: # check the msb for each rate rate_msb = supported_rate & 0x80 rate_value = supported_rate & 0x7F if rate_msb: # a value of 127 means HT PHY feature is required to join the BSS if 127 != rate_value: self.rates.append(rate_value / 2) elif rate_value in Dot11EltRates.known_rates: self.rates.append(Dot11EltRates.known_rates[rate_value])
class VersionInfo(Tag): name = 'Tag - VersionInfo' fields_desc = [ LenField("len", None), XByteField("tag", 0x0a), ByteField("type", None), XShortField("unknown", None), ByteField("id", None), FieldLenField("name_len", None, fmt='B', length_of='name'), StrLenField("name", None, length_from=lambda pkt:pkt.name_len), FieldLenField("ver_len", None, fmt='B', length_of='version'), StrLenField("version", None, length_from=lambda pkt:pkt.ver_len) ]
class OpenFlowFeaturesReply(Packet): name = "OpenFlowFeaturesReply" fields_desc = [ LongField("dpid", 1), IntField("nbuffers", 256), ByteField("ntables", 254), ByteField("auxilaryid", 0), ShortField("padding", 0), # the following will be bit fields set for each capability # supported by the switch. As of 1.3.2 (0x04), 7 flags are # supported (out of 32 available) # default here value is what mininet switch sends BitField("capabilities", 0x47, 32), IntField("reserved", 0), # reserved 32 bit field ]
class DDOSD(Packet): name = "DDOSD" fields_desc = [ IntField("pkt_num", None), IntField("src_entropy", None), IntField("src_ewma", None), IntField("src_ewmmd", None), IntField("dst_entropy", None), IntField("dst_ewma", None), IntField("dst_ewmmd", None), ByteField("alarm", None), ByteField("protocol", None), FieldLenField("count_ip", None, count_of="IPs"), PacketListField("IPs", [], alarm, count_from=lambda pkt: pkt.count_ip) ]
class Ann_unit(Packet): name = "CoLoR_Ann_unit" fields_desc = [ BitField("N", 1, 1, tot_size=1), BitField("L", 1, 1), BitField("I", 1, 1), BitField("AM", 1, 2), # 1注册,2更新,3取消 BitField("r", 0, 3, end_tot_size=1), ByteField("Unit_length", None), FieldLenField("Strategy_N", None, fmt="B", count_of="Strategy_unit_list"), ConditionalField(XStrFixedLenField("N_sid", "", 16), lambda pkt: pkt.N == 1), ConditionalField(XStrFixedLenField("L_sid", "", 20), lambda pkt: pkt.L == 1), ConditionalField(XStrFixedLenField("nid", "", 16), lambda pkt: pkt.I == 1), PacketListField("Strategy_unit_list", None, Strategy_unit, count_from=lambda pkt: pkt.Strategy_N) ] def post_build(self, pkt, pay): if self.Unit_length is None: self.Unit_length = len(pkt) pkt = pkt[:1] + int2Bytes(self.Unit_length, 1) + pkt[2:] return pkt + pay
class NMSG(Packet): """This is what you see if you grab the UDP packets. If you want to grab raw packets and have them automagically recognized, then you need to call bind_layers(), which looks something like this: # This is just a hack. It depends on the fact that sratunnel was terminated # on UDP port 5000. bind_layers(UDP, NMSG, dport=5000) If you're actually listening in layer 3 mode, then NMSG is what you'll see, you won't see the network layers (Ethernet, IP, UDP). NOT SUPPORTED: zlib compression and fragmentation are not supported. NOT TESTED: multiple payloads are not tested. """ fields_desc = [ StrFixedLenField("magic_value", "NMSG", 4), BitField("flag_zlib", 0, 1), BitField("flag_frag", 0, 1), BitField("flag_reserved", 0, 6), ByteField("version", 2), IntField("container_length", 0), NmsgContainer.Field("container", length_from=lambda pkt: pkt.container_length) ]
class switchml(Packet): """ Switchml Header. """ name = "switchml" fields_desc = [ BitField('msg_type', 0, 4), BitField('sign_packet_flag', 0, 1), BitField('size', 0, 3), ByteField('job_id', 0), BitField('tsi', 0, 32), XByteField('pool_index', 0), BitField('k', 1, 8), XByteField("packet_id", 0), # ++ ByteField("packet_type", 4) # CONSUME0 : 4 ]
class IPOption_QUERY(IPOption): name = "QUERY" option = 31 fields_desc = [ _IPOption_HDR, ShortField("count", 0), ByteField("flow_proto", 0) ]
class ResetPacket(Packet): name = "Reset" fields_desc = [ LEShortField("id", 0xDEAC), ByteField("type", 0x0), LEShortField("nodes", None), LEShortField("rkeys", None) ]
class SAINA_hdr(Packet): """ SAINA Header """ name = "SAINA" fields_desc = [ BitField('msg_type', 0, 4), BitField('round_end_flag', 1, 1), BitField('packet_size_t', 0, 3), ByteField('job_number', 0), BitField('packet_id', 0, 32), BitField('pool_index', 0, 16), BitField('packet_type', 0, 8), ByteField('k', 0), ByteField('round', 0), BitField('test1', 0, 32), BitField('test2', 0, 32), BitField('last_packet_flag', 0, 8), ]
class NSH(Packet): """Network Service Header. NSH MD-type 1 if there is no ContextHeaders""" name = "NSH" fields_desc = [ BitField('Ver', 0, 2), BitField('OAM', 0, 1), BitField('Un1', 0, 1), BitField('TTL', 0, 6), BitField('Len', None, 6), BitField('Un4', 1, 4), BitField('MDType', 1, 4), ByteField("NextProto", 0x65), ByteField("NextProto_2", 0x58), X3BytesField('NSP', 2), ByteField('NSI', 255) ]
class switchml(Packet): """ Switchml Header. """ name = "switchml" fields_desc = [ BitField('msg_type', 0, 4), # default / bit BitField('round_end_flag', args.ls_flag, 1), ##### BitField('packet_size', 0, 3), ByteField('job_id', 0), BitField('tsi', args.pkt_id, 32), BitField('pool_index', (args.pkt_id), 16), BitField('packet_type', 0, 8), ByteField('k', 0), ## ByteField('round', args.round), ## BitField('test1', 0, 32), BitField('test2', 0, 32), BitField('last_packet_flag', 0, 8), ]
class Strategy_unit(Packet): name = "CoLoR_Ann_Strategy_unit" fields_desc = [ ByteField("tag", 0), FieldLenField("length", None, fmt="B", length_of="value"), StrLenField("value", "", length_from=lambda pkt: pkt.length) ] def extract_padding(self, s): return "", s
class CFG(Packet): name = "Configuration Register" fields_desc = [ ByteField("unk0", 0), # R BitField("EVA", 0, 1), # RW BitField("IVA", 0, 1), # RW BitField("unk1", 0, 6), # R ByteField("unk2", 0), # R # LEND: initial value specified by the configuration BitField("LEND", 0, 1), # R # DSPL: initial value depends on the external signal value BitField("DSPL", 0, 1), # R BitField("unk3", 1, 1), # R BitField("EVM", 0, 1), # RW BitField("IVM", 1, 1), # RW BitField("unk4", 0, 1), # R BitField("ICE", 0, 1), # RW BitField("DCE", 0, 1) # RW ]
class MetadataHeader(Packet): name = 'Metadata Header' fields_desc = [ IntField('SwitchID', 0), #ShortField('IngressPort', 0), #ShortField('EgressPort', 0), # ShortField means 16 bytes IntField('Hop_Latency', 0), ByteField('qid', 0), BitField('qdepth', 0, 24) ]
class CoLoR_Ann(Packet): name = "CoLoR_Ann" fields_desc = [ BitField("Version", 7, 4, tot_size=1), BitField("Package", 1, 4, end_tot_size=1), ByteField("TTL", 64), LEShortField("pkg_length", None), XShortField("checksum", None), FlagsField("Flags", 0, 8, "rrrrrPKF"), BitField("unit_num", None, 4, tot_size=1), BitField("PX_num", None, 4, end_tot_size=1), PacketListField("Announce_unit_list", None, Ann_unit, count_from=lambda pkt: pkt.unit_num), ConditionalField( FieldLenField("Public_key_len", None, fmt="H", length_of="Public_key"), lambda pkt: pkt.Flags.K == True), ConditionalField( StrLenField("Public_key", "", length_from=lambda pkt: pkt.Public_key_len), lambda pkt: pkt.Flags.K == True), ConditionalField( FieldLenField("AS_PATH_len", None, fmt="B", count_of="AID_list"), lambda pkt: pkt.Flags.P == True), ConditionalField( FieldListField("AID_list", None, StrFixedLenField("", "", 1), count_from=lambda pkt: pkt.AS_PATH_len), lambda pkt: pkt.Flags.P == True), FieldListField("PX_list", None, StrFixedLenField("", "", 2), count_from=lambda pkt: pkt.PX_num) ] def post_build(self, pkt, pay): if self.pkg_length is None: self.pkg_length = len(pkt) pkt = pkt[:2] + int2BytesLE(self.pkg_length, 2) + pkt[4:] if self.checksum is None: self.checksum = CalcChecksum(pkt) pkt = pkt[:4] + int2Bytes(self.checksum, 2) + pkt[6:] if self.unit_num is None and self.PX_num is None: self.unit_num = len(self.Announce_unit_list) self.PX_num = len(self.PX_list) pkt = pkt[:7] + int2Bytes(self.unit_num << 4 | self.PX_num, 1) + pkt[8:] return pkt + pay
class CoLoR_Get(Packet): name = "CoLoR_Get" fields_desc = [ BitField("Version", 7, 4, tot_size=1), BitField("Package", 2, 4, end_tot_size=1), ByteField("TTL", 64), LEShortField("pkg_length", None), XShortField("checksum", None), ShortField("MTU", None), FieldLenField("PID_num", None, fmt="B", count_of="PIDs"), FlagsField("Flags", 8, 8, "rrrASQKF"), ShortField("Minimal_PID_CP", None), StrFixedLenField("N_sid", "", 16), StrFixedLenField("L_sid", "", 20), StrFixedLenField("nid", "", 16), ConditionalField( FieldLenField("Public_key_len", None, fmt="H", length_of="Public_key"), lambda pkt: pkt.Flags.K == True), ConditionalField( StrLenField("Public_key", "", length_from=lambda pkt: pkt.Public_key_len), lambda pkt: pkt.Flags.K == True), ConditionalField( FieldLenField("QoS_len", None, fmt="B", length_of="QoS_requirements"), lambda pkt: pkt.Flags.Q == True), ConditionalField( StrLenField("QoS_requirements", "", length_from=lambda pkt: pkt.QoS_len), lambda pkt: pkt.Flags.Q == True), ConditionalField(IntField("Seg_ID", None), lambda pkt: pkt.Flags.S == True), FieldListField("PIDs", None, StrFixedLenField("", "", 4), count_from=lambda pkt: pkt.PID_num) ] def post_build(self, pkt, pay): if self.pkg_length is None: self.pkg_length = len(pkt) pkt = pkt[:2] + int2BytesLE(self.pkg_length, 2) + pkt[4:] if self.checksum is None: self.checksum = CalcChecksum(pkt) pkt = pkt[:4] + int2Bytes(self.checksum, 2) + pkt[6:] return pkt + pay