class SCION(scapy.Packet): name = 'SCION' fields_desc = [ # Common header scapy.BitField('version', 0, 4), scapy.BitEnumField('dst_type', "ipv4", 6, SCION_ADDR_TYPE), scapy.BitEnumField('src_type', "ipv4", 6, SCION_ADDR_TYPE), scapy.BitField('total_len', None, 16), scapy.BitField('hdr_len', None, 8), scapy.BitField('curr_inf', None, 8), scapy.BitField('curr_hf', None, 8), scapy.BitEnumField('next_hdr', None, 8, scapy.IP_PROTOS), scapy.PacketField('addr', None, SCIONAddr), scapy.PacketListField('path', None, PathSegment, count_from=lambda _: 3), scapy.PacketField('ext', None, SecurityExtension) ] # this is terrible, but apparently that's how scapy works :-/ def post_build(self, pkt, pay): # compute lengths if self.total_len == None: self.total_len = len(pkt) + len(pay) pkt = pkt[:2] + struct.pack('!H', self.total_len) + pkt[4:] if self.hdr_len == None: self.hdr_len = len(pkt) - self.ext.hdr_len if self.hdr_len % 8 != 0: raise ValueError( "SCION packet header length not multiple of 8 bytes!") self.hdr_len = int(self.hdr_len / 8) #must divide by 8 pkt = pkt[:4] + struct.pack('B', self.hdr_len) + pkt[5:] return pkt + pay
class SWAT_P1_RIO_DO(scapy_all.Packet): name = "SWAT_P1_RIO_DO" fields_desc = [ scapy_all.LEShortField('counter', 0), scapy_all.ByteField('number', 0), scapy_all.StrFixedLenField('reserved', 0, length=5), scapy_all.BitField('spare', 0, 4), scapy_all.BitEnumField('valve_close', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('valve_open', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('pump2_start', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('pump1_start', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.FieldListField( "spare2", [], scapy_all.ByteField('', 0), length_from=lambda p: p.underlayer.length - 9), ]
class CIP_ConnectionParam(scapy_all.Packet): """CIP Connection parameters""" name = "CIP_ConnectionParam" fields_desc = [ scapy_all.BitEnumField("owner", 0, 1, {0: "exclusive", 1: "multiple"}), scapy_all.BitEnumField("connection_type", 2, 2, {0: "null", 1: "multicast", 2: "point-to-point", 3: "reserved"}), scapy_all.BitField("reserved", 0, 1), scapy_all.BitEnumField("priority", 0, 2, {0: "low", 1: "high", 2: "scheduled", 3: "urgent"}), scapy_all.BitEnumField("connection_size_type", 0, 1, {0: "fixed", 1: "variable"}), scapy_all.BitField("connection_size", 500, 9), ] def pre_dissect(self, s): b = struct.unpack('<H', s[:2])[0] return struct.pack('>H', int(b)) + s[2:] def do_build(self): # p = '' # Corrected issue of malformed packet construction when attempting to # communicate with PLC - MED p = super(CIP_ConnectionParam, self).do_build() return p[::-1] # we have to flip the output def extract_padding(self, s): return '', s
class CIP_LogicalSegment(scapy_all.Packet): name="CIP_LogicalSegment" LOGICAL_TYPE = { 0: "Class ID", 1: "Instance ID", 2: "Member ID", 3: "Connection Point", 4: "Attribute ID", 5: "Special", 6: "Service ID", 7: "Reserved" # The Special and Service ID Logical Types do not use the logical addressing definition for the Logical Format. } LOGICAL_FORMAT = { 0: "8 - bit logical address", 1: "16-bit logical address", 2: "32-bit logical address", 3: "Reserved for future use" } fields_desc = [ scapy_all.BitEnumField("logical_type", 0, 3, LOGICAL_TYPE), scapy_all.BitEnumField("logical_format", 0, 2, LOGICAL_FORMAT), # When the logical segment is included within a Padded Path, the 16 - bit and 32 - bit # logical formats shall have a pad inserted between the segment type byte and the Logical Value # (the 8 - bit format is identical to the Packed Path).The pad byte shall be set to zero. scapy_all.ConditionalField(scapy_all.ByteField("padding", 0), lambda p: p.logical_format > 0x0), # scapy_all.ByteField("value", 0), scapy_all.ConditionalField( scapy_all.ByteField("value8bit", 0), lambda p: p.logical_format >= 0x0 ), scapy_all.ConditionalField( scapy_all.LEShortField("value16bit", 0), lambda p: p.logical_format >= 0x1 ), scapy_all.ConditionalField( scapy_all.LELongField("value32bit", 0), lambda p: p.logical_format >= 0x2 ), ] def extract_padding(self, p): # print self.__class__.__name__ + ": P=" + str(p) return "", p
class SWAT_P1_RIO_DI(scapy_all.Packet): name = 'SWAT_P1_RIO_DI' fields_desc = [ scapy_all.LEShortField('counter', 0), scapy_all.LEIntField('padding', 0), scapy_all.BitEnumField('pump2_fault', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('pump2_run', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('pump2_auto', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('pump1_fault', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('pump1_run', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('pump1_auto', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('rio_wireless', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('plc_wireless', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitField('spare', 0, 6), scapy_all.BitEnumField('valve_close', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('valve_open', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.LEShortField('spare2', 0), ]
class SecurityExtension(scapy.Packet): name = "SCION Security Extension" fields_desc = [ scapy.BitEnumField('next_hdr', None, 8, scapy.IP_PROTOS), scapy.ByteField('hdr_len', None), scapy.XByteField('extType', 0x2), scapy.ByteEnumField("secMode", 0x0, { 0x0: "AES-CMAC", 0x1: "HMAC_SHA256", 0x2: "Ed25519", 0x3: "GCM_AES128" }), scapy.XBitField('metadata', 0xffffffff, 4 * 8), scapy.MultipleTypeField([ (scapy.XBitField('authenticator', None, 16 * 8), lambda pkt: pkt.secMode == 0x0), (scapy.XBitField('authenticator', None, 32 * 8), lambda pkt: pkt.secMode == 0x1), (scapy.XBitField('authenticator', None, 64 * 8), lambda pkt: pkt.secMode == 0x2), (scapy.XBitField('authenticator', None, 16 * 8), lambda pkt: pkt.secMode == 0x3), ], scapy.StrField("authenticator", None)), ] def extract_padding(self, p): # TODO fix when removing hard-coded v4 return "", p def post_build(self, pkt, pay): if self.hdr_len == None: self.hdr_len = len(pkt) pkt = pkt[:1] + struct.pack('B', int(self.hdr_len / 8)) + pkt[2:] return pkt + pay
class CIP_PortSegment(scapy_all.Packet): name="CIP_PortSegment" PORT_IDENT={ 0: "Reserved", 1: "Back-Plane", 15: "Extended", } fields_desc = [ scapy_all.BitField("extended_link_address_size", 0, 1), scapy_all.BitEnumField("port_identifier", 0, 4, PORT_IDENT), scapy_all.ByteField("link_address_size", 0), scapy_all.ConditionalField( scapy_all.LEIntField("extended_port_identifier", 0), lambda p: p.port_identifier == 0xf # If the Port Identifier is 15, then a 16-bit field, called the Extended Port Identifier, shall be the next part of the Port Segment ), scapy_all.ConditionalField( scapy_all.FieldListField("Link_Address", [], scapy_all.XByteField("",0), length_from=lambda p: p.link_address_size ), lambda p: p.extended_link_address_size == 0x1 # If the Port Identifier is 15, then a 16-bit field, called the Extended Port Identifier, shall be the next part of the Port Segment ) ] def extract_padding(self, p): print self.__class__.__name__ + ": P=" + str(p) return "", p
class CIP(scapy_all.Packet): name = "CIP" fields_desc = [ scapy_all.BitEnumField("direction", None, 1, { 0: "request", 1: "response" }), utils.XBitEnumField( "service", 0, 7, { 0x01: "Get_Attribute_All", 0x02: "Set_Attribute_All", 0x03: "Get_Attribute_List", 0x04: "Set_Attribute_List", 0x05: "Reset", 0x06: "Start", 0x07: "Stop", 0x08: "Create", 0x09: "Delete", 0x0a: "Multiple_Service_Packet", 0x0d: "Apply_attributes", 0x0e: "Get_Attribute_Single", 0x10: "Set_Attribute_Single", 0x4b: "Execute_PCCC_Service", # PCCC = Programmable Controller Communication Commands 0x4c: "Read_Tag_Service", 0x4d: "Write_Tag_Service", 0x4e: "Read_Modify_Write_Tag_Service", 0x4f: "Read_Other_Tag_Service", # ??? 0x52: "Read_Tag_Fragmented_Service", 0x53: "Write_Tag_Fragmented_Service", 0x54: "Forward_Open?", }), scapy_all.PacketListField("path", [], CIP_Path, count_from=lambda p: 1 if p.direction == 0 else 0), scapy_all.PacketListField("status", [], CIP_ResponseStatus, count_from=lambda p: 1 if p.direction == 1 else 0), ] def post_build(self, p, pay): is_response = (self.direction == 1) if self.direction is None and not self.path: # Transform the packet into a response p = "\x01" + p[1:] is_response = True if is_response: # Add a success status field if there was none if not self.status: p = p[0:1] + b"\0\0\0" + p[1:] return p + pay
class CIP_ConnectionParam(scapy_all.Packet): """CIP Connection parameters""" name = "CIP_ConnectionParam" fields_desc = [ scapy_all.BitEnumField("owner", 0, 1, { 0: "exclusive", 1: "multiple" }), scapy_all.BitEnumField("connection_type", 2, 2, { 0: "null", 1: "multicast", 2: "point-to-point", 3: "reserved" }), scapy_all.BitField("reserved", 0, 1), scapy_all.BitEnumField("priority", 0, 2, { 0: "low", 1: "high", 2: "scheduled", 3: "urgent" }), scapy_all.BitEnumField("connection_size_type", 0, 1, { 0: "fixed", 1: "variable" }), scapy_all.BitField("connection_size", 500, 9), ] def pre_dissect(self, s): b = struct.unpack('<H', s[:2])[0] return struct.pack('>H', int(b)) + s[2:] def do_build(self): p = '' return p def extract_padding(self, s): return '', s
class SWAT_TAGS(scapy_all.Packet): name = 'SWAT_TAGS' TAG_CODES = { 0xa002b3a2: "HMI_MV", 0xa002e1e2: "HMI_FIT", 0xa0020cb9: "HMI_LIT", 0xa0020cb9: "HMI_AIT", 0xa0020cb9: "HMI_P" } fields_desc = [ scapy_all.BitEnumField('tag', 0, 32, TAG_CODES) ]
class SWAT_MV(scapy_all.Packet): name = 'SWAT_MV' fields_desc = [ scapy_all.ByteEnumField('cmd', 0, {1: 'closed', 2: 'open'}), scapy_all.ByteField('spare2', 0), scapy_all.ByteEnumField('status', 0, {1: 'closed', 2: 'open'}), scapy_all.ByteField('spare3', 0), scapy_all.BitEnumField('spare4', 0, 1, {}), scapy_all.BitEnumField('spare5', 0, 1, {}), scapy_all.BitEnumField('spare6', 0, 1, {}), scapy_all.BitEnumField('Avl', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('FTC', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('FTO', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('Auto', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('Reset', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.X3BytesField('Spare7', 0) ]
class CIP_PathPadded(scapy_all.Packet): name="CIP_PathPadded" fields_desc = [ scapy_all.BitEnumField("segment_type", 0, 3, SEGMENT_TYPE), # scapy_all.PacketField("segment", CIP_PortSegment(),CIP_PortSegment), # scapy_all.BitEnumField("don't care", 0, 5, SEGMENT_TYPE), # scapy_all.LEShortField("zero", 0), # scapy_all.LEShortField("length", None), ] def extract_padding(self, p): print self.__class__.__name__+": P="+str(p) # print self.__class__.__name__+": Length="+str(self.length) q,w=p # return "",(q,8-w,) # return (w,q[:2]), (q, w,) # return p[:self.length], p[self.length:] return (q,w,),(q,8-w,)
class SWAT_AIT(scapy_all.Packet): name = 'SWAT_AIT' fields_desc = [ scapy_all.LEIntField('Pv', 0), scapy_all.LEIntField('Heu', 0), scapy_all.LEIntField('Leu', 0), scapy_all.LEIntField('SALL', 0), scapy_all.LEIntField('SAL', 0), scapy_all.LEIntField('SAH', 0), scapy_all.LEIntField('SAHH', 0), scapy_all.BitEnumField('status', 0, 1, {0: 'unhealthy', 1: 'healthy'}), scapy_all.BitEnumField('Rst_Totaliser', 0, 1, {0: 'unhealthy', 1: 'healthy'}), scapy_all.BitEnumField('WiFi', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('control', 0, 1, {0: 'actual', 1: 'simulation'}), scapy_all.BitEnumField('ALL', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('AL', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('AH', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('AHH', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.X3BytesField('Spare', 0), scapy_all.LEIntField('Sim_Pv', 0), ]
class SWAT_P(scapy_all.Packet): name = 'SWAT_P' fields_desc = [ scapy_all.ByteEnumField('cmd', 0, {1: 'closed', 2: 'open'}), scapy_all.ByteField('spare2', 0), scapy_all.ByteEnumField('status', 0, {1: 'closed', 2: 'open'}), scapy_all.ByteField('spare3', 0), scapy_all.LEIntField('RunMin', 0), scapy_all.LEIntField('Total_RunMin', 0), scapy_all.LEIntField('RunHr', 0), scapy_all.LEIntField('Total_RunHr', 0), scapy_all.LEIntField('Permissive', 0), scapy_all.LEIntField('Shutdown', 0), scapy_all.LEIntField('SD', 0), scapy_all.BitEnumField('Avl', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('Fault', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('Auto', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('Remote', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('FTS', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('FTR', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('Reset_RunHr', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('Reset', 0, 1, {0: 'disable', 1: 'enable'}), ]
class SWAT_P4_RIO_DO(scapy_all.Packet): name = "SWAT_P4_RIO_DO" fields_desc = [ scapy_all.LEShortField('counter', 0), scapy_all.ByteField('number', 0), scapy_all.StrFixedLenField('reserved', 0, length=5), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('UV_Start', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P404_Start', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P403_Start', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P402_Start', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P401_Start', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), ]
class SWAT_P4_RIO_DI(scapy_all.Packet): name = 'SWAT_P4_RIO_DI' fields_desc = [ scapy_all.LEShortField('counter', 0), scapy_all.LEIntField('padding', 0), scapy_all.BitEnumField('P402_Fault', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P402_Run', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P402_Auto', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P401_Fault', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P401_Run', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P401_Auto', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('RIO4_Wifi', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('PLC4_Wifi', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('UV401_Run', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('UV401_Auto', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P404_Fault', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P404_Run', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P404_Auto', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P403_Fault', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P403_Run', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P403_Auto', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('LS401_Low', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('UV401_Fault', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), ]
class SWAT_P2_RIO_DI(scapy_all.Packet): name = "SWAT_P2_RIO_DI" fields_desc =[ scapy_all.LEShortField('counter', 0), scapy_all.LEIntField('padding', 0), scapy_all.BitEnumField('P202_Fault', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P202_Run', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P202_Auto', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P201_Fault', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P201_Run', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P201_Auto', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('RIO2_Wifi', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('PLC2_Wifi', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P205_Run', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P205_Auto', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P204_Fault', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P204_Run', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P204_Auto', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P203_Fault', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P203_Run', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P203_Auto', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P208_Auto', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P207_Fault', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P207_Run', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P207_Auto', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P206_Fault', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P206_Run', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P206_Auto', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P205_Fault', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('spare', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('LS203_Low', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('LS202_Low', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('LS201_Low', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('MV201_Close', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('MV201_Open', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P208_Fault', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P208_Run', 0, 1, {0: 'disable', 1: 'enable'}), ]
class SWAT_P2_RIO_DO(scapy_all.Packet): name = "SWAT_P2_RIO_DO" fields_desc = [ scapy_all.LEShortField('counter', 0), scapy_all.ByteField('number', 0), scapy_all.StrFixedLenField('reserved', 0, length=5), scapy_all.BitEnumField('P208_Start', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P207_Start', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P206_Start', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P205_Start', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P204_Start', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P203_Start', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P202_Start', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('P201_Start', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('spare', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('spare', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('spare', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('spare', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('spare', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('LED_RED', 0, 1, {0: 'disable', 1: 'enable'}), #LED_RED scapy_all.BitEnumField('MV201_Close', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('MV201_Open', 0, 1, {0: 'disable', 1: 'enable'}), ]
class SWAT_P6_RIO_DI(scapy_all.Packet): name = 'SWAT_P6_RIO_DI' fields_desc = [ scapy_all.LEShortField('counter', 0), scapy_all.LEIntField('padding', 0), scapy_all.BitEnumField('P602_Fault', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P602_Run', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P602_Auto', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P601_Fault', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P601_Run', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P601_Auto', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('RIO6_Wifi', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('PLC6_Wifi', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('LS603_Low', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('LS602_High', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('LS602_Low', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('LS601_High', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('LS601_Low', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P603_Fault', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P603_Run', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P603_Auto', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('LS603_High', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), ]
class SWAT_P5_RIO_DI(scapy_all.Packet): name = 'SWAT_P5_RIO_DI' fields_desc = [ scapy_all.LEShortField('counter', 0), scapy_all.LEIntField('padding', 0), scapy_all.BitEnumField('P502_Fault', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P502_Run', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P502_Auto', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P501_Fault', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P501_Run', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('P501_Auto', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('RIO5_Wifi', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('PLC5_Wifi', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('MV504_Close', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('MV504_Open', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('MV503_Close', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('MV503_Open', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('MV502_Close', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('MV502_Open', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('MV501_Close', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('MV501_Open', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), #scapy_all.BitEnumField('VSD502_Start', 0, 1, {0: 'disable', 1: 'enable'}), #scapy_all.BitEnumField('VSD501_Start', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.LEShortField('VSD502_Start', 0), #VSD is pump scapy_all.LEShortField('VSD501_Start', 0), scapy_all.BitEnumField('PSH501_High', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('PSL501_Low', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), ]
class SWAT_P5_RIO_DO(scapy_all.Packet): name = "SWAT_P5_RIO_DO" fields_desc = [ scapy_all.LEShortField('counter', 0), scapy_all.ByteField('number', 0), scapy_all.StrFixedLenField('reserved', 0, length=5), scapy_all.BitEnumField('MV504_Close', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('MV504_Open', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('MV503_Close', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('MV503_Open', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('MV502_Close', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('MV502_Open', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('MV501_Close', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('MV501_Open', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), scapy_all.BitEnumField('spare', 0, 1, { 0: 'disable', 1: 'enable' }), ]
class SWAT_P1_ALL(scapy_all.Packet): name = 'SWAT_P1_ALL' fields_desc = [ scapy_all.LEIntField('FIT101_Pv', 0), scapy_all.LEIntField('LIT101_Pv', 0), scapy_all.ByteField('spare3', 0), scapy_all.ByteField('spare4', 0), scapy_all.ByteEnumField('P101_cmd', 0, {1: 'off', 2: 'on'}), scapy_all.ByteField('spare5', 0), scapy_all.ByteEnumField('P102_cmd', 0, {1: 'off', 2: 'on'}), scapy_all.ByteField('spare6', 0), scapy_all.ByteField('spare7', 0), scapy_all.ByteField('spare8', 0), scapy_all.BitEnumField('FIT101_status', 0, 1, {0: 'unhealthy', 1: 'healthy'}), scapy_all.BitEnumField('FIT101_Rst_Totaliser', 0, 1, {0: 'unhealthy', 1: 'healthy'}), scapy_all.BitEnumField('FIT101_WiFi', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('FIT101_control', 0, 1, {0: 'actual', 1: 'simulation'}), scapy_all.BitEnumField('FIT101_ALL', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('FIT101_AL', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('FIT101_AH', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('FIT101_AHH', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.ByteField('spare9', 0), scapy_all.LEIntField('FIT101_H', 0), scapy_all.LEIntField('FIT101_HH', 0), scapy_all.LEIntField('FIT101_L', 0), scapy_all.LEIntField('FIT101_LL', 0), scapy_all.BitEnumField('LIT101_spare', 0, 1, {}), scapy_all.BitEnumField('LIT101_control', 0, 1, {0: 'actual', 1: 'simulation'}), scapy_all.BitEnumField('LIT101_status', 0, 1, {0: 'unhealthy', 1: 'healthy'}), scapy_all.BitEnumField('LIT101_WiFi', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('LIT101_ALL', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('LIT101_AL', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('LIT101_AH', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('LIT101_AHH', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.LEIntField('LIT101_SALL', 0), scapy_all.LEIntField('LIT101_SAL', 0), scapy_all.LEIntField('LIT101_SAH', 0), scapy_all.LEIntField('LIT101_SAHH', 0), scapy_all.BitEnumField('spare10', 0, 1, {}), scapy_all.BitEnumField('spare11', 0, 1, {}), scapy_all.BitEnumField('spare12', 0, 1, {}), scapy_all.BitEnumField('MV101_Avl', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('MV101_FTC', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('MV101_FTO', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('MV101_Auto', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.BitEnumField('MV101_Reset', 0, 1, {0: 'disable', 1: 'enable'}), scapy_all.ByteEnumField('MV101_status', 0, {1: 'off', 2: 'on'}), scapy_all.ByteField('spare13', 0), scapy_all.ByteField('spare14', 0), scapy_all.ByteEnumField('P101_status', 0, {1: 'off', 2: 'on'}), scapy_all.X3BytesField('Spare', 0), scapy_all.LEIntField('spare15', 0), scapy_all.LEIntField('spare16', 0), scapy_all.LEIntField('spare17', 0), scapy_all.LEIntField('spare18', 0), scapy_all.LEIntField('P101_RunHr', 0), scapy_all.LEIntField('P101_RunHr2', 0), scapy_all.ByteField('spare19', 0), scapy_all.ByteField('spare20', 0), scapy_all.LEIntField('P101_Permissive', 0), scapy_all.LEIntField('spare21', 0) # scapy_all.ByteField('spare4', 0), # scapy_all.LEIntField('spare', 0), # scapy_all.LEIntField('LIT101_Sim_Pv', 0), # scapy_all.ByteField('spare4', 0), # scapy_all.ByteField('spare5', 0), # scapy_all.LEIntField('P102_RunHr', 0), # scapy_all.LEIntField('P102_RunHr', 0), # scapy_all.ByteField('spare4', 0), # scapy_all.ByteField('spare5', 0), # scapy_all.LEIntField('P102_Permissive', 0), # scapy_all.LEIntField('spare', 0) ]