diff --git a/ebpfcat/ebpfcat.py b/ebpfcat/ebpfcat.py index 5bb9e438ebf8d325500edbcaf4d67694ff42ce87..77a9abb6575f08b32ad1b85e5ae114b9e0da8815 100644 --- a/ebpfcat/ebpfcat.py +++ b/ebpfcat/ebpfcat.py @@ -24,7 +24,7 @@ from time import time from .arraymap import ArrayMap, ArrayGlobalVarDesc from .ethercat import ECCmd, EtherCat, Packet, Terminal from .ebpf import FuncId, MemoryDesc, SubProgram, prandom -from .xdp import XDP, XDPExitCode +from .xdp import XDP, XDPExitCode, PacketVar as XDPPacketVar from .bpf import ( ProgType, MapType, create_map, delete_elem, update_elem, prog_test_run, lookup_elem) @@ -255,42 +255,44 @@ class EBPFTerminal(Terminal): class EtherXDP(XDP): license = "GPL" + minimumPacketSize = 30 variables = ArrayMap() dropcounter = variables.globalVar("I") counters = variables.globalVar("64I") rate = 0 + DATA0 = 26 - def program(self): - ETHERTYPE = 12 - CMD0 = 16 - ADDR0 = 18 + ethertype = XDPPacketVar(12, "!H") + addr0 = XDPPacketVar(18, "I") + cmd0 = XDPPacketVar(16, "B") + data0 = XDPPacketVar(DATA0, "H") + def program(self): with prandom(self.ebpf) & 0xffff < self.rate: self.dropcounter += 1 self.ebpf.exit(XDPExitCode.DROP) - with self.packetSize > 30 as p, p.pH[ETHERTYPE] == 0xA488, \ - p.pB[CMD0] == 0: - self.r3 = p.pI[ADDR0] # use r3 for tail_call + with self.ethertype == 0x88A4, self.cmd0 == 0: + self.r3 = self.addr0 # use r3 for tail_call with self.counters.get_address(None, False, False) as (dst, _), \ self.r3 < FastEtherCat.MAX_PROGS: self.r[dst] += 4 * self.r3 self.r4 = self.mH[self.r[dst]] # we lost a packet - with p.pH[self.DATA0] == self.r4 as Else: + with self.data0 == self.r4 as Else: self.mI[self.r[dst]] += 1 + (self.r4 & 1) # normal case: two packets on the wire - with Else, ((p.pH[self.DATA0] + 1 & 0xffff) == self.r4) \ - | (p.pH[self.DATA0] == 0) as Else: + with Else, ((self.data0 + 1 & 0xffff) == self.r4) \ + | (self.data0 == 0) as Else: self.mI[self.r[dst]] += 1 with self.r4 & 1: # last one was active - p.pH[self.DATA0] = self.mH[self.r[dst]] + self.data0 = self.mH[self.r[dst]] self.exit(XDPExitCode.TX) with Else: self.exit(XDPExitCode.PASS) - p.pH[self.DATA0] = self.mH[self.r[dst]] + self.data0 = self.mH[self.r[dst]] self.r2 = self.get_fd(self.programs) self.call(FuncId.tail_call) self.exit(XDPExitCode.PASS)