Skip to content

Commit 9622fed

Browse files
refactor: Preparing for IPv6
1 parent 9741dc0 commit 9622fed

5 files changed

Lines changed: 187 additions & 76 deletions

File tree

include/ipv4pkt.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,14 @@
2222

2323
#include <stdint.h>
2424
#include <stdlib.h>
25+
#include <netinet/tcp.h>
2526

26-
int fh_pkt4_make(char *buffer, size_t buffer_size, uint32_t saddr_be,
27-
uint32_t daddr_be, uint16_t sport_be, uint16_t dport_be,
27+
int fh_pkt4_parse(void *pkt_data, int pkt_len, struct sockaddr *saddr,
28+
struct sockaddr *daddr, struct tcphdr **tcph,
29+
int *tcp_payload_len);
30+
31+
int fh_pkt4_make(char *buffer, size_t buffer_size, struct sockaddr *saddr,
32+
struct sockaddr *daddr, uint16_t sport_be, uint16_t dport_be,
2833
uint32_t seq_be, uint32_t ackseq_be, int psh,
2934
char *tcp_payload, size_t tcp_payload_size);
3035

include/ipv6pkt.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,13 @@
2424
#include <stdlib.h>
2525

2626
/* TODO: NOT IMPLEMENTED */
27-
int fh_pkt6_make(char *buffer, size_t buffer_size, uint8_t *saddr_be,
28-
uint8_t *daddr_be, uint16_t sport_be, uint16_t dport_be,
27+
int fh_pkt6_parse(void *pkt_data, int pkt_len, struct sockaddr *saddr,
28+
struct sockaddr *daddr, struct tcphdr **tcph,
29+
int *tcp_payload_len);
30+
31+
/* TODO: NOT IMPLEMENTED */
32+
int fh_pkt6_make(char *buffer, size_t buffer_size, struct sockaddr *saddr,
33+
struct sockaddr *daddr, uint16_t sport_be, uint16_t dport_be,
2934
uint32_t seq_be, uint32_t ackseq_be, int psh,
3035
char *tcp_payload, size_t tcp_payload_size);
3136

src/ipv4pkt.c

Lines changed: 64 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,81 @@
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;

src/ipv6pkt.c

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,30 @@
3131
#include "globvar.h"
3232

3333
/* TODO: NOT IMPLEMENTED */
34-
int fh_pkt6_make(char *buffer, size_t buffer_size, uint8_t *saddr_be,
35-
uint8_t *daddr_be, uint16_t sport_be, uint16_t dport_be,
34+
int fh_pkt6_parse(void *pkt_data, int pkt_len, struct sockaddr *saddr,
35+
struct sockaddr *daddr, struct tcphdr **tcph,
36+
int *tcp_payload_len)
37+
{
38+
(void) pkt_data;
39+
(void) pkt_len;
40+
(void) saddr;
41+
(void) daddr;
42+
(void) tcph;
43+
(void) tcp_payload_len;
44+
45+
return -1;
46+
}
47+
48+
/* TODO: NOT IMPLEMENTED */
49+
int fh_pkt6_make(char *buffer, size_t buffer_size, struct sockaddr *saddr,
50+
struct sockaddr *daddr, uint16_t sport_be, uint16_t dport_be,
3651
uint32_t seq_be, uint32_t ackseq_be, int psh,
3752
char *tcp_payload, size_t tcp_payload_size)
3853
{
3954
(void) buffer;
4055
(void) buffer_size;
41-
(void) saddr_be;
42-
(void) daddr_be;
56+
(void) saddr;
57+
(void) daddr;
4358
(void) sport_be;
4459
(void) dport_be;
4560
(void) seq_be;

0 commit comments

Comments
 (0)