From 05be56c487c0a73855628c936aed155133b5d627 Mon Sep 17 00:00:00 2001 From: dowright <dowright@nationofnobodies.com> Date: Thu, 19 Aug 2021 16:48:47 -0700 Subject: [PATCH] type adjustments and bug fixes. --- netfilterqueue/_impl.pxd | 89 ++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 49 deletions(-) diff --git a/netfilterqueue/_impl.pxd b/netfilterqueue/_impl.pxd index be1db6f..d11aea8 100644 --- a/netfilterqueue/_impl.pxd +++ b/netfilterqueue/_impl.pxd @@ -1,22 +1,18 @@ -cdef extern from "<sys/types.h>": +cdef extern from "sys/types.h": ctypedef unsigned char u_int8_t ctypedef unsigned short int u_int16_t ctypedef unsigned int u_int32_t -cdef extern from "<unistd.h>": - int dup2(int oldfd, int newfd) - cdef extern from "<errno.h>": int errno # dummy defines from asm-generic/errno.h: cdef enum: - EINTR = 4 EAGAIN = 11 # Try again EWOULDBLOCK = EAGAIN ENOBUFS = 105 # No buffer space available -cdef extern from "<netinet/ip.h>": +cdef extern from "netinet/ip.h": struct iphdr: u_int8_t tos u_int16_t tot_len @@ -63,7 +59,7 @@ cdef extern from "Python.h": object PyBytes_FromStringAndSize(char *s, Py_ssize_t len) object PyString_FromStringAndSize(char *s, Py_ssize_t len) -cdef extern from "<sys/time.h>": +cdef extern from "sys/time.h": ctypedef long time_t struct timeval: time_t tv_sec @@ -71,7 +67,7 @@ cdef extern from "<sys/time.h>": struct timezone: pass -cdef extern from "<netinet/in.h>": +cdef extern from "netinet/in.h": u_int32_t ntohl (u_int32_t __netlong) nogil u_int16_t ntohs (u_int16_t __netshort) nogil u_int32_t htonl (u_int32_t __hostlong) nogil @@ -86,9 +82,6 @@ cdef extern from "libnfnetlink/linux_nfnetlink.h": cdef extern from "libnfnetlink/libnfnetlink.h": struct nfnl_handle: pass - nfnl_handle *nfnl_open() - void nfnl_close(nfnl_handle *h) - int nfnl_fd(nfnl_handle *h) unsigned int nfnl_rcvbufsiz(nfnl_handle *h, unsigned int size) cdef extern from "libnetfilter_queue/linux_nfnetlink_queue.h": @@ -112,7 +105,6 @@ cdef extern from "libnetfilter_queue/libnetfilter_queue.h": u_int8_t hw_addr[8] nfq_handle *nfq_open() - nfq_handle *nfq_open_nfnl(nfnl_handle *h) int nfq_close(nfq_handle *h) int nfq_bind_pf(nfq_handle *h, u_int16_t pf) @@ -123,17 +115,15 @@ cdef extern from "libnetfilter_queue/libnetfilter_queue.h": u_int16_t num, nfq_callback *cb, void *data) + int nfq_destroy_queue(nfq_q_handle *qh) - # Any function that parses Netlink replies might invoke the user - # callback and thus might need to propagate a Python exception. - # This includes nfq_handle_packet but is not limited to that -- - # other functions might send a query, read until they get the reply, - # and find a packet notification before the reply which they then - # must deal with. - int nfq_destroy_queue(nfq_q_handle *qh) except? -1 - int nfq_handle_packet(nfq_handle *h, char *buf, int len) except? -1 - int nfq_set_mode(nfq_q_handle *qh, u_int8_t mode, unsigned int len) except? -1 - int nfq_set_queue_maxlen(nfq_q_handle *qh, u_int32_t queuelen) except? -1 + int nfq_handle_packet(nfq_handle *h, char *buf, int len) + + int nfq_set_mode(nfq_q_handle *qh, + u_int8_t mode, unsigned int len) + + q_set_queue_maxlen(nfq_q_handle *qh, + u_int32_t queuelen) int nfq_set_verdict(nfq_q_handle *qh, u_int32_t id, @@ -147,24 +137,24 @@ cdef extern from "libnetfilter_queue/libnetfilter_queue.h": u_int32_t mark, u_int32_t datalen, unsigned char *buf) nogil + int nfq_set_queue_maxlen(nfq_q_handle *qh, u_int32_t queuelen) int nfq_fd(nfq_handle *h) nfqnl_msg_packet_hdr *nfq_get_msg_packet_hdr(nfq_data *nfad) - int nfq_get_payload(nfq_data *nfad, unsigned char **data) + int nfq_get_payload(nfq_data *nfad, char **data) int nfq_get_timestamp(nfq_data *nfad, timeval *tv) nfqnl_msg_packet_hw *nfq_get_packet_hw(nfq_data *nfad) int nfq_get_nfmark (nfq_data *nfad) u_int8_t nfq_get_indev(nfq_data *nfad) u_int8_t nfq_get_outdev(nfq_data *nfad) nfnl_handle *nfq_nfnlh(nfq_handle *h) - + # Dummy defines from linux/socket.h: cdef enum: # Protocol families, same as address families. PF_INET = 2 PF_INET6 = 10 - PF_NETLINK = 16 -cdef extern from "<sys/socket.h>": +cdef extern from "sys/socket.h": ssize_t recv(int __fd, void *__buf, size_t __n, int __flags) nogil int MSG_DONTWAIT @@ -178,22 +168,14 @@ cdef enum: NF_STOP NF_MAX_VERDICT = NF_STOP -cdef class NetfilterQueue: - cdef object __weakref__ - 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 class Packet: - cdef NetfilterQueue _queue - cdef bint _verdict_is_set # True if verdict has been issued, - # false otherwise - cdef bint _mark_is_set # True if a mark has been given, false otherwise - cdef bint _hwaddr_is_set - cdef bint _timestamp_is_set - cdef u_int32_t _given_mark # Mark given to packet + cdef nfq_q_handle *_qh + cdef nfq_data *_nfa + cdef nfqnl_msg_packet_hdr *_hdr + cdef nfqnl_msg_packet_hw *_hw + cdef bint _verdict_is_set # True if verdict has been issued, otherwise false + cdef u_int32_t _modified_mark # Mark given to packet cdef bytes _given_payload # New payload of packet, or null - cdef bytes _owned_payload # From NFQ packet header: cdef readonly u_int32_t id @@ -203,27 +185,36 @@ cdef class Packet: # Packet details: cdef Py_ssize_t payload_len - cdef unsigned char *payload + cdef readonly unsigned char *payload cdef timeval timestamp cdef u_int8_t hw_addr[8] - # TODO: implement these + # TODO: implement these | likely not using in this manner. + #cdef u_int8_t hw_addr[8] # A eui64-formatted address? #cdef readonly u_int32_t nfmark #cdef readonly u_int32_t indev #cdef readonly u_int32_t physindev #cdef readonly u_int32_t outdev #cdef readonly u_int32_t physoutdev - cdef set_nfq_data(self, NetfilterQueue queue, nfq_data *nfa) - cdef drop_refs(self) - cdef int verdict(self, u_int8_t verdict) except -1 + cdef set_nfq_data(self, nfq_q_handle *qh, nfq_data *nfa) + cdef void verdict(self, u_int8_t verdict) + cpdef get_inint(self, bint name=*) + cpdef get_outint(self, bint name=*) + cpdef update_mark(self, u_int32_t mark) cpdef Py_ssize_t get_payload_len(self) cpdef double get_timestamp(self) - cpdef bytes get_payload(self) cpdef set_payload(self, bytes payload) - cpdef set_mark(self, u_int32_t mark) - cpdef get_mark(self) - cpdef retain(self) + #cpdef get_mark(self) cpdef accept(self) cpdef drop(self) + cpdef forward(self, u_int16_t queue_num) 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 + cdef packet_copy_size # Amount of packet metadata + data copied to buffer +