summaryrefslogtreecommitdiffstats
path: root/src/extra/udp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/extra/udp.c')
-rw-r--r--src/extra/udp.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/extra/udp.c b/src/extra/udp.c
index c0b1b7d..5f7f9ec 100644
--- a/src/extra/udp.c
+++ b/src/extra/udp.c
@@ -10,6 +10,7 @@
*/
#include <stdio.h>
+#include <stdbool.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <netinet/ip6.h>
@@ -17,6 +18,7 @@
#include <libnetfilter_queue/libnetfilter_queue.h>
#include <libnetfilter_queue/libnetfilter_queue_udp.h>
+#include <libnetfilter_queue/libnetfilter_queue_ipv4.h>
#include <libnetfilter_queue/pktbuff.h>
#include "internal.h"
@@ -112,6 +114,27 @@ nfq_udp_compute_checksum_ipv6(struct udphdr *udph, struct ip6_hdr *ip6h)
}
EXPORT_SYMBOL(nfq_udp_compute_checksum_ipv6);
+int
+nfq_udp_mangle_ipv4(struct pkt_buff *pkt,
+ unsigned int match_offset, unsigned int match_len,
+ const char *rep_buffer, unsigned int rep_len)
+{
+ struct iphdr *iph;
+ struct udphdr *udph;
+
+ iph = (struct iphdr *)pkt->network_header;
+ udph = (struct udphdr *)(pkt->network_header + iph->ihl*4);
+
+ if (!nfq_ip_mangle(pkt, iph->ihl*4 + sizeof(struct udphdr),
+ match_offset, match_len, rep_buffer, rep_len))
+ return 0;
+
+ nfq_udp_compute_checksum_ipv4(udph, iph);
+
+ return 1;
+}
+EXPORT_SYMBOL(nfq_udp_mangle_ipv4);
+
/**
* nfq_pkt_snprintf_udp_hdr - print udp header into one buffer in a humnan
* readable way