From 1c602981f0e8f91f9a6acd2a8e9b0dfc65603252 Mon Sep 17 00:00:00 2001 From: dowright Date: Wed, 25 Aug 2021 15:45:04 -0700 Subject: [PATCH] work on new packet --- new_packet.pxd | 4 ++-- new_packet.pyx | 34 ++++++++++++++++++++++++---------- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/new_packet.pxd b/new_packet.pxd index d68ad99..7204354 100644 --- a/new_packet.pxd +++ b/new_packet.pxd @@ -14,7 +14,7 @@ cdef enum: # cython define cdef struct iphdr: - u_int8_t ihl_ver + u_int8_t ver_ihl u_int8_t tos u_int16_t tot_len u_int16_t id @@ -32,7 +32,7 @@ cdef struct tcphdr: u_int32_t th_seq u_int32_t th_ack - u_int8_t th_off + u_int8_t th_off u_int8_t th_flags u_int16_t th_win diff --git a/new_packet.pyx b/new_packet.pyx index 3b300ad..2a28633 100644 --- a/new_packet.pyx +++ b/new_packet.pyx @@ -77,32 +77,46 @@ cdef class CPacket: self.ip_header = self.data - cdef u_int8_t iphdr_len = (self.ip_header.tos & 15) * 4 + cdef u_int8_t hdr_shift = 4 + cdef u_int8_t hdr_multiplier = 4 + cdef u_int8_t hdr_xand = 15 + cdef u_int8_t iphdr_len + + iphdr_len = self.ip_header.ver_ihl & hdr_xand + iphdr_len = iphdr_len * hdr_multiplier + + printf('ip header length=%f\n', iphdr_len) cdef u_int8_t tcphdr_len - cdef u_int8_t udphdr_len + cdef u_int8_t udphdr_len = 8 + cdef u_int8_t icmphdr_len = 4 cdef void *data = &self.data[iphdr_len] + cdef ptrdiff_t hdrptr = data - self.data if (self.ip_header.protocol == IPPROTO_TCP): - self.tcp_header = data + self.tcp_header = &hdrptr - tcphdr_len = (self.tcp_header.th_off & 15) * 4 + tcphdr_len = self.tcp_header.th_off >> hdr_shift + tcphdr_len = tcphdr_len & hdr_xand + tcphdr_len = tcphdr_len * hdr_multiplier + + printf('TCP HEADER LEN=%f\n', tcphdr_len) self.cmbhdr_len = iphdr_len + tcphdr_len elif (self.ip_header.protocol == IPPROTO_UDP): - self.udp_header = data - - udphdr_len = 8 + self.udp_header = &hdrptr self.cmbhdr_len = iphdr_len + udphdr_len elif (self.ip_header.protocol == IPPROTO_ICMP): - self.icmp_header = data + self.icmp_header = &hdrptr + + self.cmbhdr_len = iphdr_len + icmphdr_len cdef void verdict(self, u_int32_t verdict): '''Call appropriate set_verdict function on packet.''' @@ -245,7 +259,7 @@ cdef class CPacket: cdef tuple ip_header ip_header = ( - self.ip_header.ihl_ver, + self.ip_header.ver_ihl, self.ip_header.tos, ntohs(self.ip_header.tot_len), ntohs(self.ip_header.id), @@ -305,7 +319,7 @@ cdef class CPacket: cdef object payload - payload = self.data[self.cmbhdr_len:self.data_len] + payload = self.data[self.cmbhdr_len:self.data_len] return payload