Skip to contentSkip to conversation

netfilter: add CHECKSUM target

PATCH In review Michael S. Tsirkin 5 participants 19 messages Jul 8, 2010 – Jul 15, 2010

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 netfilter: add CHECKSUM target

This adds a `CHECKSUM' target, which can be used in the iptables mangle table.

You can use this target to compute and fill in the checksum in an IP packet that lacks a checksum. This is particularly useful, if you need to work around old applications such as dhcp clients, that do not work well with checksum offloads, but don't want to disable checksum offload in your device.

The problem happens in the field with virtualized applications. For reference, see Red Hat bz 605555, as well as
http://www.spinics.net/lists/kvm/msg37660.html

Typical expected use (helps old dhclient binary running in a VM):
iptables -A POSTROUTING -t mangle -p udp --dport 68 -j CHECKSUM --checksum-fill

---

Lightly tested. Please review for 2.6.36. Thanks!

 include/linux/netfilter_ipv4/ipt_CHECKSUM.h |   18 +++++++
 net/ipv4/netfilter/Kconfig                  |   16 ++++++
 net/ipv4/netfilter/Makefile                 |    1 +
 net/ipv4/netfilter/ipt_CHECKSUM.c           |   72 +++++++++++++++++++++++++++
 4 files changed, 107 insertions(+), 0 deletions(-)
 create mode 100644 include/linux/netfilter_ipv4/ipt_CHECKSUM.h
 create mode 100644 net/ipv4/netfilter/ipt_CHECKSUM.c
include/linux/netfilter_ipv4/ipt_CHECKSUM.h new file +18 -0
new file mode 100644
index 0000000..0b0f660
@@ -0,0 +1,18 @@
+/* Header file for iptables ipt_CHECKSUM target
+ *
+ * (C) 2002 by Harald Welte <[email protected]>
+ * (C) 2010 Red Hat Inc
+ * Author: Michael S. Tsirkin <[email protected]>
+ *
+ * This software is distributed under GNU GPL v2, 1991
+*/
+#ifndef _IPT_CHECKSUM_TARGET_H
+#define _IPT_CHECKSUM_TARGET_H
+
+#define IPT_CHECKSUM_OP_FILL	0x01	/* fill in checksum in IPv4 header */
+
+struct ipt_CHECKSUM_info {
+	u_int8_t operation;	/* bitset of operations */
+};
+
+#endif /* _IPT_CHECKSUM_TARGET_H */
net/ipv4/netfilter/Kconfig +16 -0
index 1833bdb..2fb979b 100644
@@ -322,6 +322,22 @@ config IP_NF_TARGET_ECN
 
 	  To compile it as a module, choose M here.  If unsure, say N.
 
+config IP_NF_TARGET_CHECKSUM
+	tristate "CHECKSUM target support"
+	depends on IP_NF_MANGLE
+	depends on NETFILTER_ADVANCED
+	---help---
+	  This option adds a `CHECKSUM' target, which can be used in the iptables mangle
+	  table.  
+
+	  You can use this target to compute and fill in the checksum in
+	  an IP packet that lacks a checksum.  This is particularly useful,
+	  if you need to work around old applications such as dhcp clients,
+	  that do not work well with checksum offloads, but don't want to disable
+	  checksum offload in your device.
+
+	  To compile it as a module, choose M here.  If unsure, say N.
+
 config IP_NF_TARGET_TTL
 	tristate '"TTL" target support'
 	depends on NETFILTER_ADVANCED
net/ipv4/netfilter/Makefile +1 -0
index 4811159..d7047bb 100644
@@ -55,6 +55,7 @@ obj-$(CONFIG_IP_NF_MATCH_ECN) += ipt_ecn.o
 # targets
 obj-$(CONFIG_IP_NF_TARGET_CLUSTERIP) += ipt_CLUSTERIP.o
 obj-$(CONFIG_IP_NF_TARGET_ECN) += ipt_ECN.o
+obj-$(CONFIG_IP_NF_TARGET_CHECKSUM) += ipt_CHECKSUM.o
 obj-$(CONFIG_IP_NF_TARGET_LOG) += ipt_LOG.o
 obj-$(CONFIG_IP_NF_TARGET_MASQUERADE) += ipt_MASQUERADE.o
 obj-$(CONFIG_IP_NF_TARGET_NETMAP) += ipt_NETMAP.o
net/ipv4/netfilter/ipt_CHECKSUM.c new file +72 -0

72 lines not on this page · raw message

Signature · 1 line
1.7.2.rc0.14.g41c1c
#1 lore raw

PATCH 1/1 extensions: libipt_CHECKSUM extension

This adds a `CHECKSUM' target, which can be used in the iptables mangle table.

You can use this target to compute and fill in the checksum in an IP packet that lacks a checksum. This is particularly useful, if you need to work around old applications such as dhcp clients, that do not work well with checksum offloads, but don't want to disable checksum offload in your device.

The problem happens in the field with virtualized applications. For reference, see Red Hat bz 605555, as well as
http://www.spinics.net/lists/kvm/msg37660.html

---

This patch adds userspace support for the CHECKSUM kernel module I sent previously.

 extensions/libipt_CHECKSUM.c   |  100 ++++++++++++++++++++++++++++++++++++++++
 extensions/libipt_CHECKSUM.man |    8 +++
 2 files changed, 108 insertions(+), 0 deletions(-)
 create mode 100644 extensions/libipt_CHECKSUM.c
 create mode 100644 extensions/libipt_CHECKSUM.man
extensions/libipt_CHECKSUM.c new file +100 -0
new file mode 100644
index 0000000..93d3e3f
@@ -0,0 +1,100 @@
+/* Shared library add-on to iptables for CHECKSUM
+ *
+ * (C) 2002 by Harald Welte <[email protected]>
+ * (C) 2010 by Red Hat, Inc
+ * Author: Michael S. Tsirkin <[email protected]>
+ *
+ * This program is distributed under the terms of GNU GPL v2, 1991
+ *
+ * libipt_CHECKSUM.c borrowed heavily from libipt_ECN.c
+ *
+ * $Id$
+ */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <getopt.h>
+
+#include <xtables.h>
+#include <linux/netfilter_ipv4/ipt_CHECKSUM.h>
+
+static void CHECKSUM_help(void)
+{
+	printf(
+"CHECKSUM target options\n"
+"  --checksum-fill			Fill in packet checksum.\n");
+}
+
+static const struct option CHECKSUM_opts[] = {
+	{ "checksum-fill", 0, NULL, 'F' },
+	{ .name = NULL }
+};
+
+static int CHECKSUM_parse(int c, char **argv, int invert, unsigned int *flags,
+                     const void *entry, struct xt_entry_target **target)
+{
+	unsigned int result;
+	struct ipt_CHECKSUM_info *einfo
+		= (struct ipt_CHECKSUM_info *)(*target)->data;
+
+	switch (c) {
+	case 'F':
+		if (*flags)
+			xtables_error(PARAMETER_PROBLEM,
+			        "CHECKSUM target: Only use --checksum-fill ONCE!");
+		einfo->operation = IPT_CHECKSUM_OP_FILL;
+		*flags |= IPT_CHECKSUM_OP_FILL;
+		break;
+	default:
+		return 0;
+	}
+
+	return 1;
+}
+
+static void CHECKSUM_check(unsigned int flags)
+{
+	if (!flags)
+		xtables_error(PARAMETER_PROBLEM,
+		           "CHECKSUM target: Parameter --checksum-fill is required");
+}
+
+static void CHECKSUM_print(const void *ip, const struct xt_entry_target *target,
+                      int numeric)
+{
+	const struct ipt_CHECKSUM_info *einfo =
+		(const struct ipt_CHECKSUM_info *)target->data;
+
+	printf("CHECKSUM ");
+
+	if (einfo->operation & IPT_CHECKSUM_OP_FILL)
+		printf("fill ");
+}
+
+static void CHECKSUM_save(const void *ip, const struct xt_entry_target *target)
+{
+	const struct ipt_CHECKSUM_info *einfo =
+		(const struct ipt_CHECKSUM_info *)target->data;
+
+	if (einfo->operation & IPT_CHECKSUM_OP_FILL)
+		printf("--checksum-fill ");
+}
+
+static struct xtables_target checksum_tg_reg = {
+	.name		= "CHECKSUM",
+	.version	= XTABLES_VERSION,
+	.family		= NFPROTO_IPV4,
+	.size		= XT_ALIGN(sizeof(struct ipt_CHECKSUM_info)),
+	.userspacesize	= XT_ALIGN(sizeof(struct ipt_CHECKSUM_info)),
+	.help		= CHECKSUM_help,
+	.parse		= CHECKSUM_parse,
+	.final_check	= CHECKSUM_check,
+	.print		= CHECKSUM_print,
+	.save		= CHECKSUM_save,
+	.extra_opts	= CHECKSUM_opts,
+};
+
+void _init(void)
+{
+	xtables_register_target(&checksum_tg_reg);
+}
extensions/libipt_CHECKSUM.man new file +8 -0
new file mode 100644
index 0000000..4f83335
@@ -0,0 +1,8 @@
+This target allows to selectively work around broken/old applications.
+It can only be used in the mangle table.
+.TP
+\fB\-\-checksum\-fill\fP
+Compute and fill in the checksum in an IP packet that lacks a checksum.
+This is particularly useful, if you need to work around old applications
+such as dhcp clients, that do not work well with checksum offloads,
+but don't want to disable checksum offload in your device.
Signature · 1 line
1.7.2.rc0.14.g41c1c
#2 lore raw

PATCH 1/1 extensions: libipt_CHECKSUM extension

In reply to Michael S. Tsirkin

This adds a `CHECKSUM' target, which can be used in the iptables mangle table.

You can use this target to compute and fill in the checksum in an IP packet that lacks a checksum. This is particularly useful, if you need to work around old applications such as dhcp clients, that do not work well with checksum offloads, but don't want to disable checksum offload in your device.

The problem happens in the field with virtualized applications. For reference, see Red Hat bz 605555, as well as
http://www.spinics.net/lists/kvm/msg37660.html

---

This patch adds userspace support for the CHECKSUM kernel module I sent previously.

 extensions/libipt_CHECKSUM.c   |  100 ++++++++++++++++++++++++++++++++++++++++
 extensions/libipt_CHECKSUM.man |    8 +++
 2 files changed, 108 insertions(+), 0 deletions(-)
 create mode 100644 extensions/libipt_CHECKSUM.c
 create mode 100644 extensions/libipt_CHECKSUM.man
extensions/libipt_CHECKSUM.c new file +100 -0
new file mode 100644
index 0000000..93d3e3f
@@ -0,0 +1,100 @@
+/* Shared library add-on to iptables for CHECKSUM
+ *
+ * (C) 2002 by Harald Welte <[email protected]>
+ * (C) 2010 by Red Hat, Inc
+ * Author: Michael S. Tsirkin <[email protected]>
+ *
+ * This program is distributed under the terms of GNU GPL v2, 1991
+ *
+ * libipt_CHECKSUM.c borrowed heavily from libipt_ECN.c
+ *
+ * $Id$
+ */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <getopt.h>
+
+#include <xtables.h>
+#include <linux/netfilter_ipv4/ipt_CHECKSUM.h>
+
+static void CHECKSUM_help(void)
+{
+	printf(
+"CHECKSUM target options\n"
+"  --checksum-fill			Fill in packet checksum.\n");
+}
+
+static const struct option CHECKSUM_opts[] = {
+	{ "checksum-fill", 0, NULL, 'F' },
+	{ .name = NULL }
+};
+
+static int CHECKSUM_parse(int c, char **argv, int invert, unsigned int *flags,
+                     const void *entry, struct xt_entry_target **target)
+{
+	unsigned int result;
+	struct ipt_CHECKSUM_info *einfo
+		= (struct ipt_CHECKSUM_info *)(*target)->data;
+
+	switch (c) {
+	case 'F':
+		if (*flags)
+			xtables_error(PARAMETER_PROBLEM,
+			        "CHECKSUM target: Only use --checksum-fill ONCE!");
+		einfo->operation = IPT_CHECKSUM_OP_FILL;
+		*flags |= IPT_CHECKSUM_OP_FILL;
+		break;
+	default:
+		return 0;
+	}
+
+	return 1;
+}
+
+static void CHECKSUM_check(unsigned int flags)
+{
+	if (!flags)
+		xtables_error(PARAMETER_PROBLEM,
+		           "CHECKSUM target: Parameter --checksum-fill is required");
+}
+
+static void CHECKSUM_print(const void *ip, const struct xt_entry_target *target,
+                      int numeric)
+{
+	const struct ipt_CHECKSUM_info *einfo =
+		(const struct ipt_CHECKSUM_info *)target->data;
+
+	printf("CHECKSUM ");
+
+	if (einfo->operation & IPT_CHECKSUM_OP_FILL)
+		printf("fill ");
+}
+
+static void CHECKSUM_save(const void *ip, const struct xt_entry_target *target)
+{
+	const struct ipt_CHECKSUM_info *einfo =
+		(const struct ipt_CHECKSUM_info *)target->data;
+
+	if (einfo->operation & IPT_CHECKSUM_OP_FILL)
+		printf("--checksum-fill ");
+}
+
+static struct xtables_target checksum_tg_reg = {
+	.name		= "CHECKSUM",
+	.version	= XTABLES_VERSION,
+	.family		= NFPROTO_IPV4,
+	.size		= XT_ALIGN(sizeof(struct ipt_CHECKSUM_info)),
+	.userspacesize	= XT_ALIGN(sizeof(struct ipt_CHECKSUM_info)),
+	.help		= CHECKSUM_help,
+	.parse		= CHECKSUM_parse,
+	.final_check	= CHECKSUM_check,
+	.print		= CHECKSUM_print,
+	.save		= CHECKSUM_save,
+	.extra_opts	= CHECKSUM_opts,
+};
+
+void _init(void)
+{
+	xtables_register_target(&checksum_tg_reg);
+}
extensions/libipt_CHECKSUM.man new file +8 -0
new file mode 100644
index 0000000..4f83335
@@ -0,0 +1,8 @@
+This target allows to selectively work around broken/old applications.
+It can only be used in the mangle table.
+.TP
+\fB\-\-checksum\-fill\fP
+Compute and fill in the checksum in an IP packet that lacks a checksum.
+This is particularly useful, if you need to work around old applications
+such as dhcp clients, that do not work well with checksum offloads,
+but don't want to disable checksum offload in your device.
Signature · 1 line
1.7.2.rc0.14.g41c1c
#3 lore raw

PATCH 1/1 extensions: libipt_CHECKSUM extension

In reply to Michael S. Tsirkin

This adds a `CHECKSUM' target, which can be used in the iptables mangle table.

You can use this target to compute and fill in the checksum in an IP packet that lacks a checksum. This is particularly useful, if you need to work around old applications such as dhcp clients, that do not work well with checksum offloads, but don't want to disable checksum offload in your device.

The problem happens in the field with virtualized applications. For reference, see Red Hat bz 605555, as well as
http://www.spinics.net/lists/kvm/msg37660.html

---

This patch adds userspace support for the CHECKSUM kernel module I sent previously.

 extensions/libipt_CHECKSUM.c   |  100 ++++++++++++++++++++++++++++++++++++++++
 extensions/libipt_CHECKSUM.man |    8 +++
 2 files changed, 108 insertions(+), 0 deletions(-)
 create mode 100644 extensions/libipt_CHECKSUM.c
 create mode 100644 extensions/libipt_CHECKSUM.man
extensions/libipt_CHECKSUM.c new file +100 -0
new file mode 100644
index 0000000..93d3e3f
@@ -0,0 +1,100 @@
+/* Shared library add-on to iptables for CHECKSUM
+ *
+ * (C) 2002 by Harald Welte <[email protected]>
+ * (C) 2010 by Red Hat, Inc
+ * Author: Michael S. Tsirkin <[email protected]>
+ *
+ * This program is distributed under the terms of GNU GPL v2, 1991
+ *
+ * libipt_CHECKSUM.c borrowed heavily from libipt_ECN.c
+ *
+ * $Id$
+ */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <getopt.h>
+
+#include <xtables.h>
+#include <linux/netfilter_ipv4/ipt_CHECKSUM.h>
+
+static void CHECKSUM_help(void)
+{
+	printf(
+"CHECKSUM target options\n"
+"  --checksum-fill			Fill in packet checksum.\n");
+}
+
+static const struct option CHECKSUM_opts[] = {
+	{ "checksum-fill", 0, NULL, 'F' },
+	{ .name = NULL }
+};
+
+static int CHECKSUM_parse(int c, char **argv, int invert, unsigned int *flags,
+                     const void *entry, struct xt_entry_target **target)
+{
+	unsigned int result;
+	struct ipt_CHECKSUM_info *einfo
+		= (struct ipt_CHECKSUM_info *)(*target)->data;
+
+	switch (c) {
+	case 'F':
+		if (*flags)
+			xtables_error(PARAMETER_PROBLEM,
+			        "CHECKSUM target: Only use --checksum-fill ONCE!");
+		einfo->operation = IPT_CHECKSUM_OP_FILL;
+		*flags |= IPT_CHECKSUM_OP_FILL;
+		break;
+	default:
+		return 0;
+	}
+
+	return 1;
+}
+
+static void CHECKSUM_check(unsigned int flags)
+{
+	if (!flags)
+		xtables_error(PARAMETER_PROBLEM,
+		           "CHECKSUM target: Parameter --checksum-fill is required");
+}
+
+static void CHECKSUM_print(const void *ip, const struct xt_entry_target *target,
+                      int numeric)
+{
+	const struct ipt_CHECKSUM_info *einfo =
+		(const struct ipt_CHECKSUM_info *)target->data;
+
+	printf("CHECKSUM ");
+
+	if (einfo->operation & IPT_CHECKSUM_OP_FILL)
+		printf("fill ");
+}
+
+static void CHECKSUM_save(const void *ip, const struct xt_entry_target *target)
+{
+	const struct ipt_CHECKSUM_info *einfo =
+		(const struct ipt_CHECKSUM_info *)target->data;
+
+	if (einfo->operation & IPT_CHECKSUM_OP_FILL)
+		printf("--checksum-fill ");
+}
+
+static struct xtables_target checksum_tg_reg = {
+	.name		= "CHECKSUM",
+	.version	= XTABLES_VERSION,
+	.family		= NFPROTO_IPV4,
+	.size		= XT_ALIGN(sizeof(struct ipt_CHECKSUM_info)),
+	.userspacesize	= XT_ALIGN(sizeof(struct ipt_CHECKSUM_info)),
+	.help		= CHECKSUM_help,
+	.parse		= CHECKSUM_parse,
+	.final_check	= CHECKSUM_check,
+	.print		= CHECKSUM_print,
+	.save		= CHECKSUM_save,
+	.extra_opts	= CHECKSUM_opts,
+};
+
+void _init(void)
+{
+	xtables_register_target(&checksum_tg_reg);
+}
extensions/libipt_CHECKSUM.man new file +8 -0
new file mode 100644
index 0000000..4f83335
@@ -0,0 +1,8 @@
+This target allows to selectively work around broken/old applications.
+It can only be used in the mangle table.
+.TP
+\fB\-\-checksum\-fill\fP
+Compute and fill in the checksum in an IP packet that lacks a checksum.
+This is particularly useful, if you need to work around old applications
+such as dhcp clients, that do not work well with checksum offloads,
+but don't want to disable checksum offload in your device.
Signature · 1 line
1.7.2.rc0.14.g41c1c
#4 lore raw

PATCH 1/1 extensions: libipt_CHECKSUM extension

In reply to Michael S. Tsirkin

This adds a `CHECKSUM' target, which can be used in the iptables mangle table.

You can use this target to compute and fill in the checksum in an IP packet that lacks a checksum. This is particularly useful, if you need to work around old applications such as dhcp clients, that do not work well with checksum offloads, but don't want to disable checksum offload in your device.

The problem happens in the field with virtualized applications. For reference, see Red Hat bz 605555, as well as
http://www.spinics.net/lists/kvm/msg37660.html

---

This patch adds userspace support for the CHECKSUM kernel module I sent previously.

 extensions/libipt_CHECKSUM.c   |  100 ++++++++++++++++++++++++++++++++++++++++
 extensions/libipt_CHECKSUM.man |    8 +++
 2 files changed, 108 insertions(+), 0 deletions(-)
 create mode 100644 extensions/libipt_CHECKSUM.c
 create mode 100644 extensions/libipt_CHECKSUM.man
extensions/libipt_CHECKSUM.c new file +100 -0
new file mode 100644
index 0000000..93d3e3f
@@ -0,0 +1,100 @@
+/* Shared library add-on to iptables for CHECKSUM
+ *
+ * (C) 2002 by Harald Welte <[email protected]>
+ * (C) 2010 by Red Hat, Inc
+ * Author: Michael S. Tsirkin <[email protected]>
+ *
+ * This program is distributed under the terms of GNU GPL v2, 1991
+ *
+ * libipt_CHECKSUM.c borrowed heavily from libipt_ECN.c
+ *
+ * $Id$
+ */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <getopt.h>
+
+#include <xtables.h>
+#include <linux/netfilter_ipv4/ipt_CHECKSUM.h>
+
+static void CHECKSUM_help(void)
+{
+	printf(
+"CHECKSUM target options\n"
+"  --checksum-fill			Fill in packet checksum.\n");
+}
+
+static const struct option CHECKSUM_opts[] = {
+	{ "checksum-fill", 0, NULL, 'F' },
+	{ .name = NULL }
+};
+
+static int CHECKSUM_parse(int c, char **argv, int invert, unsigned int *flags,
+                     const void *entry, struct xt_entry_target **target)
+{
+	unsigned int result;
+	struct ipt_CHECKSUM_info *einfo
+		= (struct ipt_CHECKSUM_info *)(*target)->data;
+
+	switch (c) {
+	case 'F':
+		if (*flags)
+			xtables_error(PARAMETER_PROBLEM,
+			        "CHECKSUM target: Only use --checksum-fill ONCE!");
+		einfo->operation = IPT_CHECKSUM_OP_FILL;
+		*flags |= IPT_CHECKSUM_OP_FILL;
+		break;
+	default:
+		return 0;
+	}
+
+	return 1;
+}
+
+static void CHECKSUM_check(unsigned int flags)
+{
+	if (!flags)
+		xtables_error(PARAMETER_PROBLEM,
+		           "CHECKSUM target: Parameter --checksum-fill is required");
+}
+
+static void CHECKSUM_print(const void *ip, const struct xt_entry_target *target,
+                      int numeric)
+{
+	const struct ipt_CHECKSUM_info *einfo =
+		(const struct ipt_CHECKSUM_info *)target->data;
+
+	printf("CHECKSUM ");
+
+	if (einfo->operation & IPT_CHECKSUM_OP_FILL)
+		printf("fill ");
+}
+
+static void CHECKSUM_save(const void *ip, const struct xt_entry_target *target)
+{
+	const struct ipt_CHECKSUM_info *einfo =
+		(const struct ipt_CHECKSUM_info *)target->data;
+
+	if (einfo->operation & IPT_CHECKSUM_OP_FILL)
+		printf("--checksum-fill ");
+}
+
+static struct xtables_target checksum_tg_reg = {
+	.name		= "CHECKSUM",
+	.version	= XTABLES_VERSION,
+	.family		= NFPROTO_IPV4,
+	.size		= XT_ALIGN(sizeof(struct ipt_CHECKSUM_info)),
+	.userspacesize	= XT_ALIGN(sizeof(struct ipt_CHECKSUM_info)),
+	.help		= CHECKSUM_help,
+	.parse		= CHECKSUM_parse,
+	.final_check	= CHECKSUM_check,
+	.print		= CHECKSUM_print,
+	.save		= CHECKSUM_save,
+	.extra_opts	= CHECKSUM_opts,
+};
+
+void _init(void)
+{
+	xtables_register_target(&checksum_tg_reg);
+}
extensions/libipt_CHECKSUM.man new file +8 -0
new file mode 100644
index 0000000..4f83335
@@ -0,0 +1,8 @@
+This target allows to selectively work around broken/old applications.
+It can only be used in the mangle table.
+.TP
+\fB\-\-checksum\-fill\fP
+Compute and fill in the checksum in an IP packet that lacks a checksum.
+This is particularly useful, if you need to work around old applications
+such as dhcp clients, that do not work well with checksum offloads,
+but don't want to disable checksum offload in your device.
Signature · 1 line
1.7.2.rc0.14.g41c1c
#5 lore raw
In reply to Michael S. Tsirkin
Quoted 13 lines · Michael S. Tsirkin

This adds a `CHECKSUM' target, which can be used in the iptables mangle table.

You can use this target to compute and fill in the checksum in an IP packet that lacks a checksum. This is particularly useful, if you need to work around old applications such as dhcp clients, that do not work well with checksum offloads, but don't want to disable checksum offload in your device.

The problem happens in the field with virtualized applications. For reference, see Red Hat bz 605555, as well as
http://www.spinics.net/lists/kvm/msg37660.html

Quoted 5 lines

Typical expected use (helps old dhclient binary running in a VM):
iptables -A POSTROUTING -t mangle -p udp --dport 68 -j CHECKSUM --checksum-fill

I'd think that this target would be protocol-agnostic, no?

Cheers,

Signature · 3 lines
Email: Herbert Xu <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
#6 lore raw
Quoted 14 lines · Herbert Xu
Quoted 13 lines · Michael S. Tsirkin

This adds a `CHECKSUM' target, which can be used in the iptables mangle table.

You can use this target to compute and fill in the checksum in an IP packet that lacks a checksum. This is particularly useful, if you need to work around old applications such as dhcp clients, that do not work well with checksum offloads, but don't want to disable checksum offload in your device.

The problem happens in the field with virtualized applications. For reference, see Red Hat bz 605555, as well as
http://www.spinics.net/lists/kvm/msg37660.html

Quoted 7 lines
Quoted 5 lines

Typical expected use (helps old dhclient binary running in a VM):
iptables -A POSTROUTING -t mangle -p udp --dport 68 -j CHECKSUM --checksum-fill

I'd think that this target would be protocol-agnostic, no?

Meaning it should go into net/netfilter/? Will do.

Quoted 5 lines

Cheers,

Signature · 3 lines
Email: Herbert Xu <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
#7 lore raw
Quoted 4 lines · Michael S. Tsirkin
Quoted 2 lines

I'd think that this target would be protocol-agnostic, no?

Meaning it should go into net/netfilter/? Will do.

Right, and you should get rid of any IPv4 dependencies.

Thanks,

Signature · 3 lines
Email: Herbert Xu <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
#8 lore raw
In reply to Michael S. Tsirkin
Quoted 5 lines · Michael S. Tsirkin
include/linux/netfilter_ipv4/ipt_CHECKSUM.h |   18 +++++++
net/ipv4/netfilter/Kconfig                  |   16 ++++++
net/ipv4/netfilter/Makefile                 |    1 +
net/ipv4/netfilter/ipt_CHECKSUM.c           |   72 +++++++++++++++++++++++++++

New modules should use xt.

net/ipv4/netfilter/ipt_CHECKSUM.c line 31

Quoted 6 lines
net/ipv4/netfilter/ipt_CHECKSUM.c new file +6 -0
+static unsigned int
+checksum_tg(struct sk_buff *skb, const struct xt_action_param *par)
+{
+	if (skb->ip_summed == CHECKSUM_PARTIAL) {
+		skb_checksum_help(skb);
+	}

- {}

#9 lore raw
Quoted 9 lines · Jan Engelhardt
Quoted 5 lines · Michael S. Tsirkin
include/linux/netfilter_ipv4/ipt_CHECKSUM.h |   18 +++++++
net/ipv4/netfilter/Kconfig                  |   16 ++++++
net/ipv4/netfilter/Makefile                 |    1 +
net/ipv4/netfilter/ipt_CHECKSUM.c           |   72 +++++++++++++++++++++++++++

New modules should use xt.

I tried moving the module to xt_CHECKSUM but now

	iptables -A POSTROUTING -t mangle -p udp --dport 68 -j CHECKSUM --checksum-fill

does not to load the module.
It seems that xt_request_find_target in x_tables uses the prefix 'ip' for a module. What am I missing?

Quoted 8 lines

net/ipv4/netfilter/ipt_CHECKSUM.c line 31

Quoted 6 lines
net/ipv4/netfilter/ipt_CHECKSUM.c new file +6 -0
+static unsigned int
+checksum_tg(struct sk_buff *skb, const struct xt_action_param *par)
+{
+	if (skb->ip_summed == CHECKSUM_PARTIAL) {
+		skb_checksum_help(skb);
+	}

- {}

#10 lore raw
Quoted 9 lines · Michael S. Tsirkin
Quoted 8 lines · Jan Engelhardt
Quoted 5 lines · Michael S. Tsirkin

include/linux/netfilter_ipv4/ipt_CHECKSUM.h |   18 +++++++ net/ipv4/netfilter/Kconfig                  |   16 ++++++ net/ipv4/netfilter/Makefile                 |    1 + net/ipv4/netfilter/ipt_CHECKSUM.c           |   72 +++++++++++++++++++++++++++

Quoted 8 lines
Quoted 1 line

New modules should use xt.

I tried moving the module to xt_CHECKSUM but now
       iptables -A POSTROUTING -t mangle -p udp --dport 68 -j CHECKSUM --checksum-fill does not to load the module.
It seems that xt_request_find_target in x_tables uses the prefix 'ip' for a module. What am I missing?

You should add MODULE_ALIAS clause, i.e.

MODULE_ALIAS("ipt_CHECKSUM");

Signature · 2 lines
Regards,
Changli Gao([email protected])
#11 lore raw
Quoted 19 lines · Changli Gao
Quoted 9 lines · Michael S. Tsirkin
Quoted 8 lines · Jan Engelhardt
Quoted 5 lines · Michael S. Tsirkin

include/linux/netfilter_ipv4/ipt_CHECKSUM.h |   18 +++++++ net/ipv4/netfilter/Kconfig                  |   16 ++++++ net/ipv4/netfilter/Makefile                 |    1 + net/ipv4/netfilter/ipt_CHECKSUM.c           |   72 +++++++++++++++++++++++++++

Quoted 8 lines
Quoted 1 line

New modules should use xt.

I tried moving the module to xt_CHECKSUM but now
       iptables -A POSTROUTING -t mangle -p udp --dport 68 -j CHECKSUM --checksum-fill does not to load the module.
It seems that xt_request_find_target in x_tables uses the prefix 'ip' for a module. What am I missing?

Quoted 3 lines

You should add MODULE_ALIAS clause, i.e.

MODULE_ALIAS("ipt_CHECKSUM");

This worked, thanks!

Quoted 3 lines
Signature · 2 lines
Regards,
Changli Gao([email protected])
#12 lore raw
In reply to Michael S. Tsirkin
Quoted 6 lines · Michael S. Tsirkin
Quoted 6 lines
Quoted 5 lines
include/linux/netfilter_ipv4/ipt_CHECKSUM.h |   18 +++++++
net/ipv4/netfilter/Kconfig                  |   16 ++++++
net/ipv4/netfilter/Makefile                 |    1 +
net/ipv4/netfilter/ipt_CHECKSUM.c           |   72 +++++++++++++++++++++++++++
Quoted 7 lines
Quoted 1 line

New modules should use xt.

I tried moving the module to xt_CHECKSUM but now

	iptables -A POSTROUTING -t mangle -p udp --dport 68 -j CHECKSUM --checksum-fill

does not to load the module.
It seems that xt_request_find_target in x_tables uses the prefix 'ip' for a module. What am I missing?

MODULE_ALIAS like the others have.

#13 lore raw
Quoted 10 lines · Jan Engelhardt
Quoted 8 lines · Michael S. Tsirkin
Quoted 7 lines
Quoted 5 lines
include/linux/netfilter_ipv4/ipt_CHECKSUM.h |   18 +++++++
net/ipv4/netfilter/Kconfig                  |   16 ++++++
net/ipv4/netfilter/Makefile                 |    1 +
net/ipv4/netfilter/ipt_CHECKSUM.c           |   72 +++++++++++++++++++++++++++

New modules should use xt.

Quoted 7 lines
Quoted 5 lines

I tried moving the module to xt_CHECKSUM but now

	iptables -A POSTROUTING -t mangle -p udp --dport 68 -j CHECKSUM --checksum-fill

does not to load the module.
It seems that xt_request_find_target in x_tables uses the prefix 'ip' for a module. What am I missing?

MODULE_ALIAS like the others have.

Worked for me, thanks!

#14 lore raw
In reply to Michael S. Tsirkin

Am 09.07.2010 00:29, schrieb Michael S. Tsirkin:

Quoted 9 lines

This adds a `CHECKSUM' target, which can be used in the iptables mangle table.

You can use this target to compute and fill in the checksum in an IP packet that lacks a checksum. This is particularly useful, if you need to work around old applications such as dhcp clients, that do not work well with checksum offloads, but don't want to disable checksum offload in your device.

Quoted 7 lines

The problem happens in the field with virtualized applications. For reference, see Red Hat bz 605555, as well as
http://www.spinics.net/lists/kvm/msg37660.html

Typical expected use (helps old dhclient binary running in a VM):
iptables -A POSTROUTING -t mangle -p udp --dport 68 -j CHECKSUM --checksum-fill

I'm not sure this is something we want to merge upstream and support indefinitely. Dave suggested this as a temporary out-of-tree workaround until the majority of guest dhcp clients are fixed. Has anything changed that makes this course of action impractical?

#15 lore raw
Quoted 4 lines · Patrick McHardy
Quoted 4 lines

This adds a `CHECKSUM' target, which can be used in the iptables mangle table.

Quoted 8 lines
Quoted 5 lines

You can use this target to compute and fill in the checksum in an IP packet that lacks a checksum. This is particularly useful, if you need to work around old applications such as dhcp clients, that do not work well with checksum offloads, but don't want to disable checksum offload in your device.

I'm not sure this is something we want to merge upstream and support indefinitely.

We could put it into Xtables-addons. That would also be consistent with Dave's suggestion.

Quoted 4 lines

Dave suggested this as a temporary
out-of-tree workaround until the majority of guest dhcp clients are fixed. Has anything changed that makes this course of action impractical?

#16 lore raw

Am 09.07.2010 18:26, schrieb Jan Engelhardt:

Quoted 12 lines · Patrick McHardy
Quoted 10 lines
Quoted 9 lines

This adds a `CHECKSUM' target, which can be used in the iptables mangle table.

You can use this target to compute and fill in the checksum in an IP packet that lacks a checksum. This is particularly useful, if you need to work around old applications such as dhcp clients, that do not work well with checksum offloads, but don't want to disable checksum offload in your device.

Quoted 5 lines
Quoted 2 lines

I'm not sure this is something we want to merge upstream and support indefinitely.

We could put it into Xtables-addons. That would also be consistent with Dave's suggestion.

Sure, that would be fine with me.

#17 lore raw
In reply to Patrick McHardy
Quoted 18 lines · Patrick McHardy

Am 09.07.2010 00:29, schrieb Michael S. Tsirkin:

Quoted 9 lines

This adds a `CHECKSUM' target, which can be used in the iptables mangle table.

You can use this target to compute and fill in the checksum in an IP packet that lacks a checksum. This is particularly useful, if you need to work around old applications such as dhcp clients, that do not work well with checksum offloads, but don't want to disable checksum offload in your device.

Quoted 7 lines

The problem happens in the field with virtualized applications. For reference, see Red Hat bz 605555, as well as
http://www.spinics.net/lists/kvm/msg37660.html

Typical expected use (helps old dhclient binary running in a VM):
iptables -A POSTROUTING -t mangle -p udp --dport 68 -j CHECKSUM --checksum-fill

Quoted 5 lines

I'm not sure this is something we want to merge upstream and support indefinitely. Dave suggested this as a temporary out-of-tree workaround until the majority of guest dhcp clients are fixed. Has anything changed that makes this course of action impractical?

If I understand what Dave said correctly, it's up to you ...

The arguments for putting this upstream are:

Given the track record, I wouldn't hope for quick fix in the majority of guest dhcp clients, unfortunately :(. We are talking years here. Even after that, one of the uses of virtualization is
to keep old guests running. So yes, I think we'll
keep using work-arounds for this for a very long time.

Further, since we have to add the module and we have to teach management to program it, it will be much less painful for everyone involved if we can put the code upstream, rather than forking management code.

Signature · 1 line
MST
#18 lore raw

Am 11.07.2010 12:47, schrieb Michael S. Tsirkin:

Quoted 35 lines · Patrick McHardy
Quoted 18 lines

Am 09.07.2010 00:29, schrieb Michael S. Tsirkin:

Quoted 9 lines

This adds a `CHECKSUM' target, which can be used in the iptables mangle table.

You can use this target to compute and fill in the checksum in an IP packet that lacks a checksum. This is particularly useful, if you need to work around old applications such as dhcp clients, that do not work well with checksum offloads, but don't want to disable checksum offload in your device.

Quoted 7 lines

The problem happens in the field with virtualized applications. For reference, see Red Hat bz 605555, as well as
http://www.spinics.net/lists/kvm/msg37660.html

Typical expected use (helps old dhclient binary running in a VM):
iptables -A POSTROUTING -t mangle -p udp --dport 68 -j CHECKSUM --checksum-fill

Quoted 5 lines

I'm not sure this is something we want to merge upstream and support indefinitely. Dave suggested this as a temporary out-of-tree workaround until the majority of guest dhcp clients are fixed. Has anything changed that makes this course of action impractical?

If I understand what Dave said correctly, it's up to you ...

The arguments for putting this upstream are:

Given the track record, I wouldn't hope for quick fix in the majority of guest dhcp clients, unfortunately :(. We are talking years here. Even after that, one of the uses of virtualization is
to keep old guests running. So yes, I think we'll
keep using work-arounds for this for a very long time.

Quoted 4 lines

Further, since we have to add the module and we have to teach management to program it, it will be much less painful for everyone involved if we can put the code upstream, rather than forking management code.

Fair enough, its simple enough that I don't expect much maintenance overhead.