From 892a6bc1cfb51412f93e00e30830650a4c7eebb8 Mon Sep 17 00:00:00 2001
From: dowright <dowright@nationofnobodies.com>
Date: Wed, 25 Aug 2021 11:05:38 -0700
Subject: [PATCH] work on new packet

---
 new_packet.pxd |  1 -
 new_packet.pyx | 10 ++++++++--
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/new_packet.pxd b/new_packet.pxd
index 5460a15..d68ad99 100644
--- a/new_packet.pxd
+++ b/new_packet.pxd
@@ -214,7 +214,6 @@ cdef class CPacket:
     cpdef repeat(self)
 
 cdef class NetfilterQueue:
-    cdef object user_callback # User callback
     cdef nfq_handle *h # Handle to NFQueue library
     cdef nfq_q_handle *qh # A handle to the queue
     cdef u_int16_t af # Address family
diff --git a/new_packet.pyx b/new_packet.pyx
index 9a9acab..3635ac0 100644
--- a/new_packet.pyx
+++ b/new_packet.pyx
@@ -17,6 +17,13 @@ cdef u_int16_t MaxCopySize = 4096 - 80
 # formula: DEF_MAX_QUEUELEN * (MaxCopySize+SockOverhead) / 2
 cdef u_int32_t SockRcvSize = 1024 * 4796 // 2
 
+cdef object user_callback
+def set_user_callback(ref):
+    '''Set required reference which will be called after packet data is parsed into C structs.'''
+    global user_callback
+
+    user_callback = ref
+
 cdef int nf_callback(nfq_q_handle *qh, nfgenmsg *nfmsg, nfq_data *nfa, void *data) with gil:
 
     cdef NetfilterQueue nfqueue = <NetfilterQueue>data
@@ -330,13 +337,12 @@ cdef class NetfilterQueue:
         # processes using this libnetfilter_queue on this protocol family!
         nfq_close(self.h)
 
-    def bind(self, int queue_num, object user_callback, u_int16_t max_len=DEFAULT_MAX_QUEUELEN,
+    def bind(self, int queue_num, u_int16_t max_len=DEFAULT_MAX_QUEUELEN,
             u_int8_t mode=NFQNL_COPY_PACKET, u_int16_t range=MaxPacketSize, u_int32_t sock_len=SockRcvSize):
         '''Create and bind to a new queue.'''
 
         cdef unsigned int newsiz
 
-        self.user_callback = user_callback
         self.qh = nfq_create_queue(self.h, queue_num, <nfq_callback*>nf_callback, <void*>self)
         if self.qh == NULL:
             raise OSError(f'Failed to create queue {queue_num}')