From 7c9a98ea702d76cbb026c467c56eaa5fbdee6d17 Mon Sep 17 00:00:00 2001
From: dowright <dowright@nationofnobodies.com>
Date: Mon, 23 Aug 2021 19:27:05 -0700
Subject: [PATCH] work on new packet

---
 new_packet.pxd | 113 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 113 insertions(+)

diff --git a/new_packet.pxd b/new_packet.pxd
index 9085941..abea666 100644
--- a/new_packet.pxd
+++ b/new_packet.pxd
@@ -54,6 +54,119 @@ cdef enum:
     IPPROTO_TCP = 6       # Transmission Control Protocol.
     IPPROTO_UDP = 17      # User Datagram Protocol.
 
+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":
+    ctypedef long time_t
+    struct timeval:
+        time_t tv_sec
+        time_t tv_usec
+    struct timezone:
+        pass
+
+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
+    u_int16_t htons (u_int16_t __hostshort) nogil
+
+cdef extern from "libnfnetlink/linux_nfnetlink.h":
+    struct nfgenmsg:
+        u_int8_t nfgen_family
+        u_int8_t version
+        u_int16_t res_id
+
+cdef extern from "libnfnetlink/libnfnetlink.h":
+    struct nfnl_handle:
+        pass
+    unsigned int nfnl_rcvbufsiz(nfnl_handle *h, unsigned int size)
+
+cdef extern from "libnetfilter_queue/linux_nfnetlink_queue.h":
+    enum nfqnl_config_mode:
+        NFQNL_COPY_NONE
+        NFQNL_COPY_META
+        NFQNL_COPY_PACKET
+    struct nfqnl_msg_packet_hdr:
+        u_int32_t packet_id
+        u_int16_t hw_protocol
+        u_int8_t hook
+
+cdef extern from "libnetfilter_queue/libnetfilter_queue.h":
+    struct nfq_handle:
+        pass
+    struct nfq_q_handle:
+        pass
+    struct nfq_data:
+        pass
+    struct nfqnl_msg_packet_hw:
+        u_int8_t hw_addr[8]
+
+    nfq_handle *nfq_open()
+    int nfq_close(nfq_handle *h)
+
+    int nfq_bind_pf(nfq_handle *h, u_int16_t pf)
+    int nfq_unbind_pf(nfq_handle *h, u_int16_t pf)
+    ctypedef int *nfq_callback(nfq_q_handle *gh, nfgenmsg *nfmsg,
+                       nfq_data *nfad, void *data)
+    nfq_q_handle *nfq_create_queue(nfq_handle *h,
+                                    u_int16_t num,
+                                    nfq_callback *cb,
+                                    void *data)
+    int nfq_destroy_queue(nfq_q_handle *qh)
+
+    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,
+                          u_int32_t verdict,
+                          u_int32_t data_len,
+                          unsigned char *buf) nogil
+
+    int nfq_set_verdict2(nfq_q_handle *qh,
+                            u_int32_t id,
+                            u_int32_t verdict,
+                            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_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
+
+cdef extern from "sys/socket.h":
+    ssize_t recv(int __fd, void *__buf, size_t __n, int __flags) nogil
+    int MSG_DONTWAIT
+
+# Dummy defines from linux/netfilter.h
+cdef enum:
+    NF_DROP
+    NF_ACCEPT
+    NF_STOLEN
+    NF_QUEUE
+    NF_REPEAT
+    NF_STOP
+    NF_MAX_VERDICT = NF_STOP
+
 
 cdef class CPacket:
     cdef nfq_q_handle *_qh