diff options
Diffstat (limited to 'src/extra/udp.c')
-rw-r--r-- | src/extra/udp.c | 23 |
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 |