Skip to content

Commit 37d614f

Browse files
refactor: Preparing for IPv6
1 parent 9741dc0 commit 37d614f

File tree

5 files changed

+199
-78
lines changed

5 files changed

+199
-78
lines changed

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_ptr,
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: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,16 @@
2222

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

2627
/* 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,
28+
int fh_pkt6_parse(void *pkt_data, int pkt_len, struct sockaddr *saddr,
29+
struct sockaddr *daddr, struct tcphdr **tcph_ptr,
30+
int *tcp_payload_len);
31+
32+
/* TODO: NOT IMPLEMENTED */
33+
int fh_pkt6_make(char *buffer, size_t buffer_size, struct sockaddr *saddr,
34+
struct sockaddr *daddr, uint16_t sport_be, uint16_t dport_be,
2935
uint32_t seq_be, uint32_t ackseq_be, int psh,
3036
char *tcp_payload, size_t tcp_payload_size);
3137

src/ipv4pkt.c

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

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)