diff --git a/xdp.py b/xdp.py index b9e014590c837ef1a958774b29ac1f69e874de12..6c66043d8d92f71b4c25dee1eeeb8a67f962f85f 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):