From patchwork Wed Jun 15 14:27:53 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Alin_N=C4=83stac?= X-Patchwork-Id: 637049 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from arrakis.dune.hu (caladan.dune.hu [78.24.191.180]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3rWMR44V8dz9t1f for ; Sat, 18 Jun 2016 00:03:12 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=UcNkm51w; dkim-atps=neutral Received: from arrakis.dune.hu (localhost [127.0.0.1]) by arrakis.dune.hu (Postfix) with ESMTP id 369BBB91C92; Fri, 17 Jun 2016 16:00:18 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on arrakis.dune.hu X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.1 Received: from arrakis.dune.hu (localhost [127.0.0.1]) by arrakis.dune.hu (Postfix) with ESMTP; Fri, 17 Jun 2016 16:00:18 +0200 (CEST) Received: from arrakis.dune.hu (localhost [127.0.0.1]) by arrakis.dune.hu (Postfix) with ESMTP id A1165B923BE for ; Wed, 15 Jun 2016 16:27:59 +0200 (CEST) X-policyd-weight: using cached result; rate: -7 Received: from mail-lb0-f193.google.com (mail-lb0-f193.google.com [209.85.217.193]) by arrakis.dune.hu (Postfix) with ESMTPS for ; Wed, 15 Jun 2016 16:27:58 +0200 (CEST) Received: by mail-lb0-f193.google.com with SMTP id wy7so329337lbb.3 for ; Wed, 15 Jun 2016 07:27:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id; bh=e+n/ypGTmGZ4fZcYEt1ouGCHtCSK7xfKrSd9nnwXAp4=; b=UcNkm51wT7gJx50AGZuBTzEeOScITmVwI7Of1oaps035kEBKvdeyK1c4VSU87fOrJO KbcWxrhrVcexw4n3plxFMb8a/FadszDvysE20qcUNmaSpmliC0mUf2+4Fh53aemHx4A9 x2ISnPnXcnK63M6MSc1e6kk7FVojOj9YZV3yEkH4UfnFEsnODS5oN+OzMweSPN/mK1uP 1bsTQ4Dj3RJWOymay6LVyYsLLi7cTeOZ05bCSe+/x4aft72349V5e9Uxgn6Qsf4dqVOn bVRMrVtkU1gb92tdCg2qfgZaK21J4hDtPT1H4Sod8yd/m2Nrevwxb8BIQGqb8K2U+ko1 Yh4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id; bh=e+n/ypGTmGZ4fZcYEt1ouGCHtCSK7xfKrSd9nnwXAp4=; b=A1fzvFAJkY8+KbwZ6wyXhPmq+oEnT7U96wZOl6DfCFhj5uUMBqqxqa+31E31uDRafj hsHdm0pcIlF2KcQ/Cd6/W9AOwOtX6SHD/NvKLyUtvnTldnnOf8jO/DkvjDP/1wLVj4iP Ezyvbx5YyKpoCRQKve6SHGCtcY6NDPwckGUn0OOETNmNjYcrMKhFRUhSQRoa6dk0bE7j UInGRvacKIbgTH0Fsrz0PBRBj4SVMhCn1osp6dJc+p5X2eVOAjcgqvZJVb9P7UA69TDE GsZY2C9AP+aHaiCTQJG+InF8XvTmvE8YyMfxDnImWDo0rpKJ7Wb3+ntghz88epFk2lxO GT+g== X-Gm-Message-State: ALyK8tI+p2RgPZRiJJmneTE5XPe824KcAWvdKTfiGnlyqGyat6hkJsU+2xFJR28ml8LsOA== X-Received: by 10.28.31.140 with SMTP id f134mr9914150wmf.69.1466000878442; Wed, 15 Jun 2016 07:27:58 -0700 (PDT) Received: from cplx250.edegem.eu.thmulti.com (14.125.146.82.ipv4.evonet.be. [82.146.125.14]) by smtp.gmail.com with ESMTPSA id r129sm9986001wmr.20.2016.06.15.07.27.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 15 Jun 2016 07:27:57 -0700 (PDT) From: Alin Nastac To: openwrt-devel@lists.openwrt.org, lede-dev@lists.infradead.org Date: Wed, 15 Jun 2016 16:27:53 +0200 Message-Id: <1466000873-14857-1-git-send-email-alin.nastac@gmail.com> X-Mailer: git-send-email 1.7.12.4 Subject: [OpenWrt-Devel] [PATCH] libnetfilter_queue: fix UDP checksum computation X-BeenThere: openwrt-devel@lists.openwrt.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: OpenWrt Development List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: openwrt-devel-bounces@lists.openwrt.org Sender: "openwrt-devel" This patch was copied from http://www.spinics.net/lists/netfilter/msg56704.html . --- .../patches/100-udp_checksum_computation.patch | 95 ++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 package/libs/libnetfilter-queue/patches/100-udp_checksum_computation.patch diff --git a/package/libs/libnetfilter-queue/patches/100-udp_checksum_computation.patch b/package/libs/libnetfilter-queue/patches/100-udp_checksum_computation.patch new file mode 100644 index 0000000..9939b83 --- /dev/null +++ b/package/libs/libnetfilter-queue/patches/100-udp_checksum_computation.patch @@ -0,0 +1,95 @@ +--- libnetfilter_queue-1.0.2.orig/src/extra/checksum.c ++++ libnetfilter_queue-1.0.2/src/extra/checksum.c +@@ -35,7 +35,7 @@ uint16_t checksum(uint32_t sum, uint16_t + return (uint16_t)(~sum); + } + +-uint16_t checksum_tcpudp_ipv4(struct iphdr *iph) ++uint16_t checksum_tcpudp_ipv4(struct iphdr *iph, uint16_t protocol_id) + { + uint32_t sum = 0; + uint32_t iph_len = iph->ihl*4; +@@ -46,13 +46,13 @@ uint16_t checksum_tcpudp_ipv4(struct iph + sum += (iph->saddr) & 0xFFFF; + sum += (iph->daddr >> 16) & 0xFFFF; + sum += (iph->daddr) & 0xFFFF; +- sum += htons(IPPROTO_TCP); ++ sum += htons(protocol_id); + sum += htons(len); + + return checksum(sum, (uint16_t *)payload, len); + } + +-uint16_t checksum_tcpudp_ipv6(struct ip6_hdr *ip6h, void *transport_hdr) ++uint16_t checksum_tcpudp_ipv6(struct ip6_hdr *ip6h, void *transport_hdr, uint16_t protocol_id) + { + uint32_t sum = 0; + uint32_t hdr_len = (uint32_t *)transport_hdr - (uint32_t *)ip6h; +@@ -68,7 +68,7 @@ uint16_t checksum_tcpudp_ipv6(struct ip6 + sum += (ip6h->ip6_dst.s6_addr16[i] >> 16) & 0xFFFF; + sum += (ip6h->ip6_dst.s6_addr16[i]) & 0xFFFF; + } +- sum += htons(IPPROTO_TCP); ++ sum += htons(protocol_id); + sum += htons(ip6h->ip6_plen); + + return checksum(sum, (uint16_t *)payload, len); +Index: libnetfilter_queue-1.0.2/src/extra/tcp.c +=================================================================== +--- libnetfilter_queue-1.0.2.orig/src/extra/tcp.c ++++ libnetfilter_queue-1.0.2/src/extra/tcp.c +@@ -91,7 +91,7 @@ nfq_tcp_compute_checksum_ipv4(struct tcp + { + /* checksum field in header needs to be zero for calculation. */ + tcph->check = 0; +- tcph->check = checksum_tcpudp_ipv4(iph); ++ tcph->check = checksum_tcpudp_ipv4(iph, IPPROTO_TCP); + } + EXPORT_SYMBOL(nfq_tcp_compute_checksum_ipv4); + +@@ -105,7 +105,7 @@ nfq_tcp_compute_checksum_ipv6(struct tcp + { + /* checksum field in header needs to be zero for calculation. */ + tcph->check = 0; +- tcph->check = checksum_tcpudp_ipv6(ip6h, tcph); ++ tcph->check = checksum_tcpudp_ipv6(ip6h, tcph, IPPROTO_TCP); + } + EXPORT_SYMBOL(nfq_tcp_compute_checksum_ipv6); + +Index: libnetfilter_queue-1.0.2/src/extra/udp.c +=================================================================== +--- libnetfilter_queue-1.0.2.orig/src/extra/udp.c ++++ libnetfilter_queue-1.0.2/src/extra/udp.c +@@ -91,7 +91,7 @@ nfq_udp_compute_checksum_ipv4(struct udp + { + /* checksum field in header needs to be zero for calculation. */ + udph->check = 0; +- udph->check = checksum_tcpudp_ipv4(iph); ++ udph->check = checksum_tcpudp_ipv4(iph, IPPROTO_UDP); + } + EXPORT_SYMBOL(nfq_udp_compute_checksum_ipv4); + +@@ -110,7 +110,7 @@ nfq_udp_compute_checksum_ipv6(struct udp + { + /* checksum field in header needs to be zero for calculation. */ + udph->check = 0; +- udph->check = checksum_tcpudp_ipv6(ip6h, udph); ++ udph->check = checksum_tcpudp_ipv6(ip6h, udph, IPPROTO_UDP); + } + EXPORT_SYMBOL(nfq_udp_compute_checksum_ipv6); + +Index: libnetfilter_queue-1.0.2/src/internal.h +=================================================================== +--- libnetfilter_queue-1.0.2.orig/src/internal.h ++++ libnetfilter_queue-1.0.2/src/internal.h +@@ -13,8 +13,8 @@ struct iphdr; + struct ip6_hdr; + + uint16_t checksum(uint32_t sum, uint16_t *buf, int size); +-uint16_t checksum_tcpudp_ipv4(struct iphdr *iph); +-uint16_t checksum_tcpudp_ipv6(struct ip6_hdr *ip6h, void *transport_hdr); ++uint16_t checksum_tcpudp_ipv4(struct iphdr *iph, uint16_t protocol_id); ++uint16_t checksum_tcpudp_ipv6(struct ip6_hdr *ip6h, void *transport_hdr, uint16_t protocol_id); + + struct pkt_buff { + uint8_t *mac_header;