2626#include <string.h>
2727#include <netinet/ip.h>
2828#include <netinet/tcp.h>
29+ #include <sys/socket.h>
2930#include <libnetfilter_queue/libnetfilter_queue_ipv4.h>
3031#include <libnetfilter_queue/libnetfilter_queue_tcp.h>
3132
3233#include "globvar.h"
3334#include "logging.h"
3435
35- int fh_pkt4_make (char * buffer , size_t buffer_size , uint32_t saddr_be ,
36- uint32_t daddr_be , uint16_t sport_be , uint16_t dport_be ,
36+ int fh_pkt4_parse (void * pkt_data , int pkt_len , struct sockaddr * saddr ,
37+ struct sockaddr * daddr , struct tcphdr * * tcph ,
38+ int * tcp_payload_len )
39+ {
40+ struct iphdr * iph ;
41+ int iph_len , tcph_len ;
42+ struct sockaddr_in * saddr_in , * daddr_in ;
43+
44+ saddr_in = (struct sockaddr_in * ) saddr ;
45+ daddr_in = (struct sockaddr_in * ) daddr ;
46+
47+ if ((size_t ) pkt_len < sizeof (* iph )) {
48+ E ("ERROR: invalid packet length: %d" , pkt_len );
49+ return -1 ;
50+ }
51+
52+ iph = (struct iphdr * ) pkt_data ;
53+ iph_len = iph -> ihl * 4 ;
54+
55+ if ((size_t ) iph_len < sizeof (* iph )) {
56+ E ("ERROR: invalid IP header length: %d" , iph_len );
57+ return -1 ;
58+ }
59+
60+ if (iph -> protocol != IPPROTO_TCP ) {
61+ E ("ERROR: not a TCP packet (protocol %d)" , (int ) iph -> protocol );
62+ return -1 ;
63+ }
64+
65+ if ((size_t ) pkt_len < iph_len + sizeof (* tcph )) {
66+ E ("ERROR: invalid packet length: %d" , pkt_len );
67+ return -1 ;
68+ }
69+
70+ memset (saddr_in , 0 , sizeof (* saddr_in ));
71+ saddr_in -> sin_family = AF_INET ;
72+ saddr_in -> sin_addr .s_addr = iph -> saddr ;
73+
74+ memset (daddr_in , 0 , sizeof (* daddr_in ));
75+ daddr_in -> sin_family = AF_INET ;
76+ daddr_in -> sin_addr .s_addr = iph -> daddr ;
77+
78+ * tcph = (struct tcphdr * ) ((uint8_t * )pkt_data + iph_len );
79+ tcph_len = (* tcph )-> doff * 4 ;
80+ * tcp_payload_len = pkt_len - iph_len - tcph_len ;
81+
82+ return 0 ;
83+ }
84+
85+
86+ int fh_pkt4_make (char * buffer , size_t buffer_size , struct sockaddr * saddr ,
87+ struct sockaddr * daddr , uint16_t sport_be , uint16_t dport_be ,
3788 uint32_t seq_be , uint32_t ackseq_be , int psh ,
3889 char * tcp_payload , size_t tcp_payload_size )
3990{
4091 size_t pkt_len ;
4192 struct iphdr * iph ;
4293 struct tcphdr * tcph ;
4394 char * tcppl ;
95+ struct sockaddr_in * saddr_in , * daddr_in ;
96+
97+ if (saddr -> sa_family != AF_INET || daddr -> sa_family != AF_INET ) {
98+ E ("ERROR: Invalid address family" );
99+ return -1 ;
100+ }
101+
102+ saddr_in = (struct sockaddr_in * ) saddr ;
103+ daddr_in = (struct sockaddr_in * ) daddr ;
44104
45105 pkt_len = sizeof (* iph ) + sizeof (* tcph ) + tcp_payload_size ;
46106 if (buffer_size < pkt_len + 1 ) {
@@ -62,8 +122,8 @@ int fh_pkt4_make(char *buffer, size_t buffer_size, uint32_t saddr_be,
62122 iph -> ttl = g_ctx .ttl ;
63123 iph -> protocol = IPPROTO_TCP ;
64124 iph -> check = 0 ;
65- iph -> saddr = saddr_be ;
66- iph -> daddr = daddr_be ;
125+ iph -> saddr = saddr_in -> sin_addr . s_addr ;
126+ iph -> daddr = daddr_in -> sin_addr . s_addr ;
67127
68128 memset (tcph , 0 , sizeof (* tcph ));
69129 tcph -> source = sport_be ;
0 commit comments