diff --git a/ebpfcat/ebpfcat.py b/ebpfcat/ebpfcat.py index 42c32a1cebdb4b4f2e0d753ad7b86f198080c764..b2be0eef6c824a208f02611c83928969d3051c5b 100644 --- a/ebpfcat/ebpfcat.py +++ b/ebpfcat/ebpfcat.py @@ -28,31 +28,30 @@ from .bpf import ( class PacketDesc: - def __init__(self, position, size): + def __init__(self, sm, position, size): + self.sm = sm self.position = position self.size = size def __get__(self, instance, owner): if instance is None: return self - offset = instance.position_offset[self.position[0]] + offset = instance.position_offset[self.sm] if isinstance(instance, Struct): terminal = instance.terminal device = instance.device else: terminal = instance device = None - ret = PacketVar(terminal, (self.position[0], - self.position[1] + offset), self.size) + ret = PacketVar(terminal, self.sm, self.position + offset, self.size) if device is None: return ret else: return ret.get(device) def __set__(self, instance, value): - offset = instance.position_offset[self.position[0]] - ret = PacketVar(instance.terminal, - (self.position[0], self.position[1] + offset), + offset = instance.position_offset[self.sm] + ret = PacketVar(instance.terminal, self.sm, self.position + offset, self.size) return ret.set(instance.device, value) @@ -66,8 +65,9 @@ class PacketVar(MemoryDesc): else: return self.size - def __init__(self, terminal, position, size): + def __init__(self, terminal, sm, position, size): self.terminal = terminal + self.sm = sm self.position = position self.size = size @@ -119,8 +119,8 @@ class PacketVar(MemoryDesc): return unpack_from("<" + self.size, data, start)[0] def _start(self, device): - base, offset = self.position - return device.sync_group.terminals[self.terminal][base] + offset + return device.sync_group.terminals[self.terminal][self.sm] \ + + self.position def fmt_addr(self, device): return ("B" if isinstance(self.size, int) else self.size, @@ -135,9 +135,9 @@ class Struct: class StructDesc: - def __init__(self, struct, *position_offset): + def __init__(self, struct, sm3=0, sm2=0): self.struct = struct - self.position_offset = position_offset + self.position_offset = {2: sm2, 3: sm3} def __get__(self, instance, owner): if instance is None: @@ -209,7 +209,7 @@ class Device(SubProgram): class EBPFTerminal(Terminal): compatibility = None - position_offset = 0, 0 + position_offset = {2: 0, 3: 0} async def initialize(self, relative, absolute): await super().initialize(relative, absolute) @@ -220,14 +220,17 @@ class EBPFTerminal(Terminal): f"({relative}, {absolute})") def allocate(self, packet, readonly): + """allocate space in packet for the pdos of this terminal + + return a dict that contains the starting offset for each + sync manager""" + bases = {} if self.pdo_in_sz: - bases = [packet.size + packet.DATAGRAM_HEADER] + bases[3] = packet.size + packet.DATAGRAM_HEADER packet.append(ECCmd.FPRD, b"\0" * self.pdo_in_sz, 0, self.position, self.pdo_in_off) - else: - bases = [None] if self.pdo_out_sz: - bases.append(packet.size + packet.DATAGRAM_HEADER) + bases[2] = packet.size + packet.DATAGRAM_HEADER if readonly: packet.on_the_fly.append((packet.size, ECCmd.FPWR)) packet.append(ECCmd.NOP, b"\0" * self.pdo_out_sz, 0, diff --git a/ebpfcat/terminals.py b/ebpfcat/terminals.py index a6a8b00f8caa085c40caae3d0e291bafab77d768..331a15f786ac7963b1f50b9839394c41308b3057 100644 --- a/ebpfcat/terminals.py +++ b/ebpfcat/terminals.py @@ -30,40 +30,40 @@ class Skip(EBPFTerminal): class EL1808(EBPFTerminal): compatibility = {(2, 118501458)} - ch1 = PacketDesc((0, 0), 0) - ch2 = PacketDesc((0, 0), 1) - ch3 = PacketDesc((0, 0), 2) - ch4 = PacketDesc((0, 0), 3) - ch5 = PacketDesc((0, 0), 4) - ch6 = PacketDesc((0, 0), 5) - ch7 = PacketDesc((0, 0), 6) - ch8 = PacketDesc((0, 0), 7) + ch1 = PacketDesc(3, 0, 0) + ch2 = PacketDesc(3, 0, 1) + ch3 = PacketDesc(3, 0, 2) + ch4 = PacketDesc(3, 0, 3) + ch5 = PacketDesc(3, 0, 4) + ch6 = PacketDesc(3, 0, 5) + ch7 = PacketDesc(3, 0, 6) + ch8 = PacketDesc(3, 0, 7) class EL2808(EBPFTerminal): compatibility = {(2, 184037458)} - ch1 = PacketDesc((1, 0), 0) - ch2 = PacketDesc((1, 0), 1) - ch3 = PacketDesc((1, 0), 2) - ch4 = PacketDesc((1, 0), 3) - ch5 = PacketDesc((1, 0), 4) - ch6 = PacketDesc((1, 0), 5) - ch7 = PacketDesc((1, 0), 6) - ch8 = PacketDesc((1, 0), 7) + ch1 = PacketDesc(2, 0, 0) + ch2 = PacketDesc(2, 0, 1) + ch3 = PacketDesc(2, 0, 2) + ch4 = PacketDesc(2, 0, 3) + ch5 = PacketDesc(2, 0, 4) + ch6 = PacketDesc(2, 0, 5) + ch7 = PacketDesc(2, 0, 6) + ch8 = PacketDesc(2, 0, 7) class EL4104(EBPFTerminal): - ch1_value = PacketDesc((1, 0), 'H') - ch2_value = PacketDesc((1, 2), 'H') - ch3_value = PacketDesc((1, 4), 'H') - ch4_value = PacketDesc((1, 6), 'H') + ch1_value = PacketDesc(2, 0, 'H') + ch2_value = PacketDesc(2, 2, 'H') + ch3_value = PacketDesc(2, 4, 'H') + ch4_value = PacketDesc(2, 6, 'H') class EL3164(EBPFTerminal): class Channel(Struct): - attrs = PacketDesc((0, 0), 'H') - value = PacketDesc((0, 2), 'H') + attrs = PacketDesc(3, 0, 'H') + value = PacketDesc(3, 2, 'H') channel1 = Channel(0) channel2 = Channel(4) @@ -76,41 +76,41 @@ class EK1101(EBPFTerminal): class EK1814(EBPFTerminal): - ch1 = PacketDesc((0, 0), 0) - ch2 = PacketDesc((0, 0), 1) - ch3 = PacketDesc((0, 0), 2) - ch4 = PacketDesc((0, 0), 3) - ch5 = PacketDesc((1, 0), 0) - ch6 = PacketDesc((1, 0), 1) - ch7 = PacketDesc((1, 0), 2) - ch8 = PacketDesc((1, 0), 3) + ch1 = PacketDesc(3, 0, 0) + ch2 = PacketDesc(3, 0, 1) + ch3 = PacketDesc(3, 0, 2) + ch4 = PacketDesc(3, 0, 3) + ch5 = PacketDesc(2, 0, 0) + ch6 = PacketDesc(2, 0, 1) + ch7 = PacketDesc(2, 0, 2) + ch8 = PacketDesc(2, 0, 3) class EL5042(EBPFTerminal): compatibility = {(2, 330444882)} class Channel(Struct): - position = PacketDesc((0, 2), "q") - warning = PacketDesc((0, 0), 0) - error = PacketDesc((0, 0), 1) - status = PacketDesc((0, 0), "H") + position = PacketDesc(3, 2, "q") + warning = PacketDesc(3, 0, 0) + error = PacketDesc(3, 0, 1) + status = PacketDesc(3, 0, "H") - channel1 = Channel(0, None, 0) - channel2 = Channel(10, None, 0x10) + channel1 = Channel(0, 0) + channel2 = Channel(10, 0x10) class EL6022(EBPFTerminal): class Channel(Struct): - transmit_accept = PacketDesc((0, 0), 0) - receive_request = PacketDesc((0, 0), 1) - init_accept = PacketDesc((0, 0), 2) - status = PacketDesc((0, 0), "H") - in_string = PacketDesc((0, 1), "23p") - - transmit_request = PacketDesc((1, 0), 0) - receive_accept = PacketDesc((1, 0), 1) - init_request = PacketDesc((1, 0), 2) - control = PacketDesc((1, 0), "H") - out_string = PacketDesc((1, 1), "23p") + transmit_accept = PacketDesc(3, 0, 0) + receive_request = PacketDesc(3, 0, 1) + init_accept = PacketDesc(3, 0, 2) + status = PacketDesc(3, 0, "H") + in_string = PacketDesc(3, 1, "23p") + + transmit_request = PacketDesc(2, 0, 0) + receive_accept = PacketDesc(2, 0, 1) + init_request = PacketDesc(2, 0, 2) + control = PacketDesc(2, 0, "H") + out_string = PacketDesc(2, 1, "23p") channel1 = Channel(0, 0) channel2 = Channel(24, 24) @@ -118,8 +118,8 @@ class EL6022(EBPFTerminal): class EL7041(EBPFTerminal): compatibility = {(2, 461451346), (2, 461455442), (2, 460795986)} - velocity = PacketDesc((1, 6), "h") - enable = PacketDesc((1, 4), 0) - status = PacketDesc((0, 6), "H") - low_switch = PacketDesc((0, 1), 7) - high_switch = PacketDesc((0, 1), 8) + velocity = PacketDesc(2, 6, "h") + enable = PacketDesc(2, 4, 0) + status = PacketDesc(3, 6, "H") + low_switch = PacketDesc(3, 1, 7) + high_switch = PacketDesc(3, 1, 8)