Types to distinct file common for the entire program

This commit is contained in:
Vadim Vetrov 2024-08-13 01:59:04 +03:00
parent aafa1a728a
commit d5db8c18e5
No known key found for this signature in database
GPG Key ID: E8A308689D7A73A5
3 changed files with 84 additions and 62 deletions

102
mangle.c
View File

@ -1,25 +1,15 @@
#include <stdlib.h>
#define _GNU_SOURCE #define _GNU_SOURCE
#include "types.h" // IWYU pragma: keep
#include "mangle.h" #include "mangle.h"
#include "config.h" #include "config.h"
#ifdef KERNEL_SPACE #ifdef KERNEL_SPACE
#include <linux/printk.h>
#include <linux/ip.h> #include <linux/ip.h>
#define printf pr_info
#define perror pr_err
#define lgerror(msg, ret) (pr_err(msg ": %d\n", ret))
#else #else
#include <stdio.h> #include <stdlib.h>
#include <libnetfilter_queue/libnetfilter_queue_ipv4.h> #include <libnetfilter_queue/libnetfilter_queue_ipv4.h>
#include <libnetfilter_queue/libnetfilter_queue_tcp.h> #include <libnetfilter_queue/libnetfilter_queue_tcp.h>
typedef uint8_t __u8;
typedef uint32_t __u32;
typedef uint16_t __u16;
#define lgerror(msg, ret) __extension__ ({errno = -ret; perror(msg);})
#endif #endif
@ -365,9 +355,9 @@ void ip4_set_checksum(struct iphdr *iph)
} }
int ip4_payload_split(__u8 *pkt, __u32 buflen, int ip4_payload_split(uint8_t *pkt, uint32_t buflen,
struct iphdr **iph, __u32 *iph_len, struct iphdr **iph, uint32_t *iph_len,
__u8 **payload, __u32 *plen) { uint8_t **payload, uint32_t *plen) {
if (pkt == NULL || buflen < sizeof(struct iphdr)) { if (pkt == NULL || buflen < sizeof(struct iphdr)) {
lgerror("ip4_payload_split: pkt|buflen", -EINVAL); lgerror("ip4_payload_split: pkt|buflen", -EINVAL);
return -EINVAL; return -EINVAL;
@ -379,8 +369,8 @@ int ip4_payload_split(__u8 *pkt, __u32 buflen,
return -EINVAL; return -EINVAL;
} }
__u32 hdr_len = hdr->ihl * 4; uint32_t hdr_len = hdr->ihl * 4;
__u32 pktlen = ntohs(hdr->tot_len); uint32_t pktlen = ntohs(hdr->tot_len);
if (buflen < pktlen || hdr_len > pktlen) { if (buflen < pktlen || hdr_len > pktlen) {
lgerror("ip4_payload_split: buflen cmp pktlen", -EINVAL); lgerror("ip4_payload_split: buflen cmp pktlen", -EINVAL);
return -EINVAL; return -EINVAL;
@ -398,17 +388,17 @@ int ip4_payload_split(__u8 *pkt, __u32 buflen,
return 0; return 0;
} }
int tcp4_payload_split(__u8 *pkt, __u32 buflen, int tcp4_payload_split(uint8_t *pkt, uint32_t buflen,
struct iphdr **iph, __u32 *iph_len, struct iphdr **iph, uint32_t *iph_len,
struct tcphdr **tcph, __u32 *tcph_len, struct tcphdr **tcph, uint32_t *tcph_len,
__u8 **payload, __u32 *plen) { uint8_t **payload, uint32_t *plen) {
struct iphdr *hdr; struct iphdr *hdr;
__u32 hdr_len; uint32_t hdr_len;
struct tcphdr *thdr; struct tcphdr *thdr;
__u32 thdr_len; uint32_t thdr_len;
__u8 *tcph_pl; uint8_t *tcph_pl;
__u32 tcph_plen; uint32_t tcph_plen;
if (ip4_payload_split(pkt, buflen, &hdr, &hdr_len, if (ip4_payload_split(pkt, buflen, &hdr, &hdr_len,
&tcph_pl, &tcph_plen)){ &tcph_pl, &tcph_plen)){
@ -441,22 +431,22 @@ int tcp4_payload_split(__u8 *pkt, __u32 buflen,
} }
// split packet to two ipv4 fragments. // split packet to two ipv4 fragments.
int ip4_frag(const __u8 *pkt, __u32 buflen, __u32 payload_offset, int ip4_frag(const uint8_t *pkt, uint32_t buflen, uint32_t payload_offset,
__u8 *frag1, __u32 *f1len, uint8_t *frag1, uint32_t *f1len,
__u8 *frag2, __u32 *f2len) { uint8_t *frag2, uint32_t *f2len) {
struct iphdr *hdr; struct iphdr *hdr;
const __u8 *payload; const uint8_t *payload;
__u32 plen; uint32_t plen;
__u32 hdr_len; uint32_t hdr_len;
int ret; int ret;
if (!frag1 || !f1len || !frag2 || !f2len) if (!frag1 || !f1len || !frag2 || !f2len)
return -EINVAL; return -EINVAL;
if ((ret = ip4_payload_split( if ((ret = ip4_payload_split(
(__u8 *)pkt, buflen, (uint8_t *)pkt, buflen,
&hdr, &hdr_len, (__u8 **)&payload, &plen)) < 0) { &hdr, &hdr_len, (uint8_t **)&payload, &plen)) < 0) {
lgerror("ipv4_frag: TCP Header extract error", ret); lgerror("ipv4_frag: TCP Header extract error", ret);
return -EINVAL; return -EINVAL;
} }
@ -471,11 +461,11 @@ int ip4_frag(const __u8 *pkt, __u32 buflen, __u32 payload_offset,
return -EINVAL; return -EINVAL;
} }
__u32 f1_plen = payload_offset; uint32_t f1_plen = payload_offset;
__u32 f1_dlen = f1_plen + hdr_len; uint32_t f1_dlen = f1_plen + hdr_len;
__u32 f2_plen = plen - payload_offset; uint32_t f2_plen = plen - payload_offset;
__u32 f2_dlen = f2_plen + hdr_len; uint32_t f2_dlen = f2_plen + hdr_len;
if (*f1len < f1_dlen || *f2len < f2_dlen) { if (*f1len < f1_dlen || *f2len < f2_dlen) {
return -ENOMEM; return -ENOMEM;
@ -492,8 +482,8 @@ int ip4_frag(const __u8 *pkt, __u32 buflen, __u32 payload_offset,
struct iphdr *f1_hdr = (void *)frag1; struct iphdr *f1_hdr = (void *)frag1;
struct iphdr *f2_hdr = (void *)frag2; struct iphdr *f2_hdr = (void *)frag2;
__u16 f1_frag_off = ntohs(f1_hdr->frag_off); uint16_t f1_frag_off = ntohs(f1_hdr->frag_off);
__u16 f2_frag_off = ntohs(f2_hdr->frag_off); uint16_t f2_frag_off = ntohs(f2_hdr->frag_off);
f1_frag_off &= IP_OFFMASK; f1_frag_off &= IP_OFFMASK;
f1_frag_off |= IP_MF; f1_frag_off |= IP_MF;
@ -505,7 +495,7 @@ int ip4_frag(const __u8 *pkt, __u32 buflen, __u32 payload_offset,
f2_frag_off &= IP_OFFMASK; f2_frag_off &= IP_OFFMASK;
} }
f2_frag_off += (__u16)payload_offset / 8; f2_frag_off += (uint16_t)payload_offset / 8;
f1_hdr->frag_off = htons(f1_frag_off); f1_hdr->frag_off = htons(f1_frag_off);
f1_hdr->tot_len = htons(f1_dlen); f1_hdr->tot_len = htons(f1_dlen);
@ -524,25 +514,25 @@ int ip4_frag(const __u8 *pkt, __u32 buflen, __u32 payload_offset,
} }
// split packet to two tcp-on-ipv4 segments. // split packet to two tcp-on-ipv4 segments.
int tcp4_frag(const __u8 *pkt, __u32 buflen, __u32 payload_offset, int tcp4_frag(const uint8_t *pkt, uint32_t buflen, uint32_t payload_offset,
__u8 *seg1, __u32 *s1len, uint8_t *seg1, uint32_t *s1len,
__u8 *seg2, __u32 *s2len) { uint8_t *seg2, uint32_t *s2len) {
struct iphdr *hdr; struct iphdr *hdr;
__u32 hdr_len; uint32_t hdr_len;
struct tcphdr *tcph; struct tcphdr *tcph;
__u32 tcph_len; uint32_t tcph_len;
__u32 plen; uint32_t plen;
const __u8 *payload; const uint8_t *payload;
int ret; int ret;
if (!seg1 || !s1len || !seg2 || !s2len) if (!seg1 || !s1len || !seg2 || !s2len)
return -EINVAL; return -EINVAL;
if ((ret = tcp4_payload_split((__u8 *)pkt, buflen, if ((ret = tcp4_payload_split((uint8_t *)pkt, buflen,
&hdr, &hdr_len, &hdr, &hdr_len,
&tcph, &tcph_len, &tcph, &tcph_len,
(__u8 **)&payload, &plen)) < 0) { (uint8_t **)&payload, &plen)) < 0) {
lgerror("tcp4_frag: tcp4_payload_split", ret); lgerror("tcp4_frag: tcp4_payload_split", ret);
return -EINVAL; return -EINVAL;
@ -563,11 +553,11 @@ int tcp4_frag(const __u8 *pkt, __u32 buflen, __u32 payload_offset,
return -EINVAL; return -EINVAL;
} }
__u32 s1_plen = payload_offset; uint32_t s1_plen = payload_offset;
__u32 s1_dlen = s1_plen + hdr_len + tcph_len; uint32_t s1_dlen = s1_plen + hdr_len + tcph_len;
__u32 s2_plen = plen - payload_offset; uint32_t s2_plen = plen - payload_offset;
__u32 s2_dlen = s2_plen + hdr_len + tcph_len; uint32_t s2_dlen = s2_plen + hdr_len + tcph_len;
if (*s1len < s1_dlen || *s2len < s2_dlen) if (*s1len < s1_dlen || *s2len < s2_dlen)
return -ENOMEM; return -ENOMEM;
@ -609,9 +599,9 @@ int tcp4_frag(const __u8 *pkt, __u32 buflen, __u32 payload_offset,
#define TLS_EXTENSION_SNI 0x0000 #define TLS_EXTENSION_SNI 0x0000
#define TLS_EXTENSION_CLIENT_HELLO_ENCRYPTED 0xfe0d #define TLS_EXTENSION_CLIENT_HELLO_ENCRYPTED 0xfe0d
typedef __u8 uint8_t; typedef uint8_t uint8_t;
typedef __u32 uint32_t; typedef uint32_t uint32_t;
typedef __u16 uint16_t; typedef uint16_t uint16_t;
/** /**
* Processes tls payload of the tcp request. * Processes tls payload of the tcp request.

View File

@ -1,13 +1,10 @@
#ifndef YU_MANGLE_H #ifndef YU_MANGLE_H
#define YU_MANGLE_H #define YU_MANGLE_H
#ifdef KERNEL_SPACE #include "types.h"
#include <linux/types.h>
typedef __u8 uint8_t;
typedef __u32 uint32_t;
#ifdef KERNEL_SPACE
#include <linux/string.h> #include <linux/string.h>
#include <linux/errno.h>
#include <linux/stddef.h> #include <linux/stddef.h>
#include <linux/net.h> #include <linux/net.h>
#include <linux/in.h> #include <linux/in.h>
@ -25,7 +22,6 @@ typedef __u32 uint32_t;
#define USER_SPACE #define USER_SPACE
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
#include <errno.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <netinet/ip.h> #include <netinet/ip.h>
#include <netinet/tcp.h> #include <netinet/tcp.h>

36
types.h Normal file
View File

@ -0,0 +1,36 @@
#ifndef TYPES_H
#define TYPES_H
#include <bits/endian.h>
#ifdef KERNEL_SCOPE
#include <linux/errno.h> // IWYU pragma: export
#include <linux/string.h> // IWYU pragma: export
#include <linux/types.h>
typedef __u8 uint8_t;
typedef __u16 uint16_t;
typedef __u32 uint32_t;
typedef __u64 uint64_t;
typedef __i8 int8_t;
typedef __i16 int16_t;
typedef __i32 int32_t;
typedef __i64 int64_t;
#include <linux/printk.h>
#define printf pr_info
#define perror pr_err
#define lgerror(msg, ret) (pr_err(msg ": %d\n", ret))
#else /* USERSPACE_SCOPE */
#include <errno.h> // IWYU pragma: export
#include <stdint.h> // IWYU pragma: export
#include <string.h> // IWYU pragma: export
#include <stdio.h> // IWYU pragma: export
#define lgerror(msg, ret) __extension__ ({errno = -ret; perror(msg);})
#endif /* SCOPES */
#endif /* TYPES_H */