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 = 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, nf_callback, self) if self.qh == NULL: raise OSError(f'Failed to create queue {queue_num}')