From b441cffc18a3edbc6b6e23f4ab6410c43a52bfef Mon Sep 17 00:00:00 2001 From: Martin Teichmann <martin.teichmann@xfel.eu> Date: Wed, 30 Dec 2020 05:58:45 +0000 Subject: [PATCH] a local packet type --- xdp.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/xdp.py b/xdp.py index b9e0145..6c66043 100644 --- a/xdp.py +++ b/xdp.py @@ -57,6 +57,31 @@ class XDRFD(DatagramProtocol): if flags & 2 == 0: # not a multipart message self.future.set_result(0) pos += ln + +class Packet(Expression): + def __init__(self, ebpf, bits, addr): + self.ebpf = ebpf + self.bits = bits + self.address = addr + self.signed = False + + @contextmanager + def get_address(self, dst, long, signed, force=False): + e = self.ebpf + bits = Memory.bits_to_opcode[self.bits] + with e.get_free_register(dst) as reg: + e.r[reg] = e.m32[e.r1] + self.address + with e.If(e.r[reg] + int(self.bits // 8) <= e.m32[e.r1 + 4]) as c: + if force and dst != reg: + e.r[dst] = e.r[reg] + reg = dst + with c.Else(): + e.exit(2) + yield reg, bits + + def contains(self, no): + return no == 1 or (not isinstance(self.address, int) + and self.address.contains(no)) class PacketDesc(MemoryDesc): -- GitLab