From 5d874fe3a74cbe88ee967984bbf56c260f96f7f5 Mon Sep 17 00:00:00 2001 From: dowright Date: Mon, 23 Aug 2021 18:39:30 -0700 Subject: [PATCH] work on new packet --- new_packet.pxd | 7 ++++++- new_packet.pyx | 34 ++++++++++++++++++++++------------ 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/new_packet.pxd b/new_packet.pxd index 8f00b70..52fd639 100644 --- a/new_packet.pxd +++ b/new_packet.pxd @@ -61,6 +61,11 @@ cdef class CPacket: cdef nfqnl_msg_packet_hdr *_hdr cdef nfqnl_msg_packet_hw *_hw + # protocol headers + cdef tcphdr tcp_header + cdef udphdr udp_header + cdef icmphdr icmp_header + cdef u_int16_t __queue_num cdef bint threaded @@ -73,6 +78,6 @@ cdef class CPacket: cdef timeval timestamp cdef u_int8_t hw_addr[8] - cdef netfilter(nfq_q_handle * qh, nfgenmsg * nfmsg, nfq_data * nfa, void * data) + cdef netfilter(self, nfq_q_handle * qh, nfgenmsg * nfmsg, nfq_data * nfa, void * data) cdef void verdict(self, u_int32_t verdict) cdef def parse(self) nogil diff --git a/new_packet.pyx b/new_packet.pyx index e8f466a..529d0d9 100644 --- a/new_packet.pyx +++ b/new_packet.pyx @@ -21,15 +21,21 @@ cdef class CPacket: return "%s packet, %s bytes" % (protocol, self.payload_len) + @staticmethod + cdef nf_callback(self, nfq_q_handle * qh, nfgenmsg * nfmsg, nfq_data * nfa, void * data): + + # cdef NetfilterQueue nfqueue = < NetfilterQueue > data + # cdef object user_callback = < object > nfqueue.user_callback + + packet = CPacket() + packet.parse(qh, nfa) + # NOTE: this will be callback target for nfqueue - cdef netfilter(nfq_q_handle * qh, nfgenmsg * nfmsg, nfq_data * nfa, void * data): - '''alternate constructor. used to start listener/proxy instances using nfqueue bindings.''' + cdef parse(self, nfq_q_handle * qh, nfq_data * nfa) no gil: + '''Alternate constructor. Used to start listener/proxy instances using nfqueue bindings.''' '''Assign a packet from NFQ to this object. Parse the header and load local values.''' - self = cls() - self.parse() - self._qh = qh self._nfa = nfa self._hdr = nfq_get_msg_packet_hdr(nfa) @@ -39,14 +45,18 @@ cdef class CPacket: self.hook = self._hdr.hook self.payload_len = nfq_get_payload(self._nfa, & self.data) - if self.payload_len < 0: - raise OSError("Failed to get payload of packet.") + # TODO: figure this out. cant use no gil if its here. + # if self.payload_len < 0: + # raise OSError("Failed to get payload of packet.") # timestamp gets assigned via pointer/struct -> time_val: (t_sec, t_usec). nfq_get_timestamp(self._nfa, & self.timestamp) self._mark = nfq_get_nfmark(nfa) + # splitting packet by tcp/ip layers + cdef int error = parse() + # if (self.continue_condition): # self._before_exit() @@ -82,8 +92,8 @@ cdef class CPacket: self._verdict_is_set = True - cdef def parse(self) nogil: - '''index tcp/ip packet layers 3 & 4 for use as instance objects. + 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.''' @@ -97,17 +107,17 @@ cdef class CPacket: if (iphdr.protocol == IPPROTO_TCP): - tcp_header[0] = < tcphdr * > self.payload[iphdr_len:] + self.tcp_header = < tcphdr * > self.payload[iphdr_len:] return 0 if (iphdr.protocol == IPPROTO_UDP): - udp_header[0] = < udphdr * > self.payload[iphdr_len:] + self.udp_header = < udphdr * > self.payload[iphdr_len:] return 0 if (iphdr.protocol == IPPROTO_ICMP): - icmp_header[0] = < icmphdr * > self.payload[iphdr_len:] + self.icmp_header = < icmphdr * > self.payload[iphdr_len:] return 0