work on new packet

This commit is contained in:
dowright 2021-08-23 18:39:30 -07:00 committed by DOWRIGHT
parent 4d89c30aed
commit 5d874fe3a7
2 changed files with 28 additions and 13 deletions

View File

@ -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

View File

@ -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