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