From 505f6daf2c66caeb49a681f1c9339c2614308497 Mon Sep 17 00:00:00 2001 From: dowright Date: Mon, 23 Aug 2021 18:57:01 -0700 Subject: [PATCH] work on new packet --- new_packet.pxd | 5 ++-- new_packet.pyx | 62 +++++++++++++++++++++++++------------------------- 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/new_packet.pxd b/new_packet.pxd index 781d497..9085941 100644 --- a/new_packet.pxd +++ b/new_packet.pxd @@ -66,8 +66,8 @@ cdef class CPacket: cdef udphdr udp_header cdef icmphdr icmp_header - cdef u_int16_t __queue_num - cdef bint threaded + # cdef u_int16_t __queue_num + # cdef bint threaded cdef bint _verdict_is_set cdef u_int32_t _mark @@ -80,4 +80,5 @@ cdef class CPacket: cdef nf_callback(self, nfq_q_handle * qh, nfgenmsg * nfmsg, nfq_data * nfa, void * data) nogil cdef parse(self, nfq_q_handle * qh, nfq_data * nfa) + cdef _parse(self) cdef void verdict(self, u_int32_t verdict) diff --git a/new_packet.pyx b/new_packet.pyx index d112eb5..f2f486d 100644 --- a/new_packet.pyx +++ b/new_packet.pyx @@ -66,6 +66,37 @@ cdef class CPacket: return 0 + cdef _parse(self): + '''Index tcp/ip packet layers 3 & 4 for use as instance objects. + the before_exit method will be called before returning, which can be used to create + subclass specific objects like namedtuples or application layer data.''' + + cdef iphdr * ip_header = < iphdr * > self.data + + cdef u_int8_t iphdr_len = iphdr.tos & 15 * 4 + + cdef tcphdr * tcp_header + cdef udphdr * udp_header + cdef icmphdr * icmp_header + + if (iphdr.protocol == IPPROTO_TCP): + + self.tcp_header = < tcphdr * > self.data[iphdr_len:] + + return 0 + + if (iphdr.protocol == IPPROTO_UDP): + self.udp_header = < udphdr * > self.data[iphdr_len:] + + return 0 + + if (iphdr.protocol == IPPROTO_ICMP): + self.icmp_header = < icmphdr * > self.data[iphdr_len:] + + return 0 + + return 1 + cdef void verdict(self, u_int32_t verdict): '''Call appropriate set_verdict... function on packet.''' @@ -92,37 +123,6 @@ cdef class CPacket: self._verdict_is_set = True - cdef parse(self): - '''Index tcp/ip packet layers 3 & 4 for use as instance objects. - the before_exit method will be called before returning, which can be used to create - subclass specific objects like namedtuples or application layer data.''' - - cdef iphdr * ip_header = < iphdr * > self.payload - - cdef u_int8_t iphdr_len = iphdr.tos & 15 * 4 - - cdef tcphdr * tcp_header - cdef udphdr * udp_header - cdef icmphdr * icmp_header - - if (iphdr.protocol == IPPROTO_TCP): - - self.tcp_header = < tcphdr * > self.payload[iphdr_len:] - - return 0 - - if (iphdr.protocol == IPPROTO_UDP): - self.udp_header = < udphdr * > self.payload[iphdr_len:] - - return 0 - - if (iphdr.protocol == IPPROTO_ICMP): - self.icmp_header = < icmphdr * > self.payload[iphdr_len:] - - return 0 - - return 1 - # def _before_exit(self): # '''executes before returning from parse call. # May be overridden.