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_ptr ,
38+ int * tcp_payload_len )
39+ {
40+ struct iphdr * iph ;
41+ struct tcphdr * tcph ;
42+ int iph_len , tcph_len ;
43+ struct sockaddr_in * saddr_in , * daddr_in ;
44+
45+ saddr_in = (struct sockaddr_in * ) saddr ;
46+ daddr_in = (struct sockaddr_in * ) daddr ;
47+
48+ if ((size_t ) pkt_len < sizeof (* iph )) {
49+ E ("ERROR: invalid packet length: %d" , pkt_len );
50+ return -1 ;
51+ }
52+
53+ iph = (struct iphdr * ) pkt_data ;
54+ iph_len = iph -> ihl * 4 ;
55+
56+ if ((size_t ) iph_len < sizeof (* iph )) {
57+ E ("ERROR: invalid IP header length: %d" , iph_len );
58+ return -1 ;
59+ }
60+
61+ if (iph -> protocol != IPPROTO_TCP ) {
62+ E ("ERROR: not a TCP packet (protocol %d)" , (int ) iph -> protocol );
63+ return -1 ;
64+ }
65+
66+ if ((size_t ) pkt_len < iph_len + sizeof (* tcph )) {
67+ E ("ERROR: invalid packet length: %d" , pkt_len );
68+ return -1 ;
69+ }
70+
71+ tcph = (struct tcphdr * ) ((uint8_t * ) pkt_data + iph_len );
72+ tcph_len = tcph -> doff * 4 ;
73+ if (pkt_len < iph_len + tcph_len ) {
74+ E ("ERROR: invalid packet length: %d" , pkt_len );
75+ return -1 ;
76+ }
77+
78+ memset (saddr_in , 0 , sizeof (* saddr_in ));
79+ saddr_in -> sin_family = AF_INET ;
80+ saddr_in -> sin_addr .s_addr = iph -> saddr ;
81+
82+ memset (daddr_in , 0 , sizeof (* daddr_in ));
83+ daddr_in -> sin_family = AF_INET ;
84+ daddr_in -> sin_addr .s_addr = iph -> daddr ;
85+
86+ * tcph_ptr = tcph ;
87+ * tcp_payload_len = pkt_len - iph_len - tcph_len ;
88+
89+ return 0 ;
90+ }
91+
92+
93+ int fh_pkt4_make (char * buffer , size_t buffer_size , struct sockaddr * saddr ,
94+ struct sockaddr * daddr , uint16_t sport_be , uint16_t dport_be ,
3795 uint32_t seq_be , uint32_t ackseq_be , int psh ,
3896 char * tcp_payload , size_t tcp_payload_size )
3997{
4098 size_t pkt_len ;
4199 struct iphdr * iph ;
42100 struct tcphdr * tcph ;
43101 char * tcppl ;
102+ struct sockaddr_in * saddr_in , * daddr_in ;
103+
104+ if (saddr -> sa_family != AF_INET || daddr -> sa_family != AF_INET ) {
105+ E ("ERROR: Invalid address family" );
106+ return -1 ;
107+ }
108+
109+ saddr_in = (struct sockaddr_in * ) saddr ;
110+ daddr_in = (struct sockaddr_in * ) daddr ;
44111
45112 pkt_len = sizeof (* iph ) + sizeof (* tcph ) + tcp_payload_size ;
46113 if (buffer_size < pkt_len + 1 ) {
@@ -62,8 +129,8 @@ int fh_pkt4_make(char *buffer, size_t buffer_size, uint32_t saddr_be,
62129 iph -> ttl = g_ctx .ttl ;
63130 iph -> protocol = IPPROTO_TCP ;
64131 iph -> check = 0 ;
65- iph -> saddr = saddr_be ;
66- iph -> daddr = daddr_be ;
132+ iph -> saddr = saddr_in -> sin_addr . s_addr ;
133+ iph -> daddr = daddr_in -> sin_addr . s_addr ;
67134
68135 memset (tcph , 0 , sizeof (* tcph ));
69136 tcph -> source = sport_be ;
0 commit comments