[prev in list] [next in list] [prev in thread] [next in thread] 

List:       cipe
Subject:    [PATCH] enable UDP checksums
From:       Olaf Titz <olaf () bigred ! inka ! de>
Date:       2000-11-20 11:56:19
[Download RAW message or body]

Here is a patch to enable UDP checksums with a new "checksum" config
option (applies to 1.4 with some fuzz).
This is also in the current snapshot.

Short explanation: the sk->no_check flag found in cipe_attach() only
has its effects on control packets. Data packets are not sent via the
normal UDP sending mechanism, so cipe_xmit() has to compute their
checksum by itself.

Olaf

--- cipe.h	2000/11/16 16:45:00	1.35
+++ cipe.h	2000/11/19 23:08:34	1.36
@@ -94,6 +94,7 @@
 #define CIPF_MAY_CLEAR          0x0100
 #define CIPF_MAY_STKEY          0x0200
 #define CIPF_MAY_DYNIP          0x0400
+#define CIPF_DO_CSUM		0x0800

 /*** Key exchange related definitions ***/

--- ciped.c	2000/11/16 16:45:01	1.42
+++ ciped.c	2000/11/19 23:08:34	1.43
@@ -508,6 +509,8 @@
         p.flags|=CIPF_MAY_CLEAR;
     if (OI(dynip))
         p.flags|=CIPF_MAY_DYNIP;
+    if (OI(checksum))
+	p.flags|=CIPF_DO_CSUM;
     p.cttl=OI(cttl);
     if (ioctl_setpar(f, device, &p)<0)
 	err("opendev: setpar");
--- options.in	2000/09/15 13:12:35	1.3
+++ options.in	2000/11/19 23:08:35	1.4
@@ -67,3 +67,6 @@
  Default is no check for answers.
 dynip   bool
  Assume the carrier is on a dynamic IP address. @xref{Dynamic carrier}.
+checksum bool
+ Use checksummed UDP carrier packets. Only necessary if the network
+ does not like unchecksummed packets.
--- output.c	2000/11/08 23:59:08	1.36
+++ output.c	2000/11/19 23:55:16
@@ -14,6 +14,7 @@

 #include "cipe.h"

+#include <net/checksum.h>
 #include <net/ip.h>
 #include <net/icmp.h>
 #include <linux/if_arp.h>
@@ -311,8 +312,16 @@
         udph->dest   = tunnel->peerport;
         udph->len    = htons(length+sizeof(struct udphdr));
         /* Encrypted packets are checksummed already, so we can safely
-	   ignore the UDP checksum */
-        udph->check  = 0;
+	   ignore the UDP checksum. Provide a means to do it nonetheless */
+	udph->check  = 0;
+	if (tunnel->flags&CIPF_DO_CSUM) {
+	    udph->check=csum_tcpudp_magic(
+		iph->saddr, iph->daddr,
+		length+sizeof(struct udphdr), IPPROTO_UDP,
+		csum_partial((char *)udph, length+sizeof(struct udphdr), 0));
+	    if (!udph->check)
+		udph->check=-1;
+	}

 	tunnel->stat.tx_bytes += skb->len;
 	tunnel->stat.tx_packets++;
@@ -557,8 +566,16 @@
         udph->dest   = c->peerport;
         udph->len    = htons(length+sizeof(struct udphdr));
         /* Encrypted packets are checksummed already, so we can safely
-	   ignore the UDP checksum */
-        udph->check  = 0;
+	   ignore the UDP checksum. Provide a means to do it nonetheless */
+	udph->check  = 0;
+	if (tunnel->flags&CIPF_DO_CSUM) {
+	    udph->check=csum_tcpudp_magic(
+		iph->saddr, iph->daddr,
+		length+sizeof(struct udphdr), IPPROTO_UDP,
+		csum_partial((char *)udph, length+sizeof(struct udphdr), 0));
+	    if (!udph->check)
+		udph->check=-1;
+	}

 	skb->ip_hdr 		= skb->h.iph;
 	skb->protocol		=	htons(ETH_P_IP);
--- sock.c	2000/09/28 22:05:06	1.30
+++ sock.c	2000/11/19 23:57:32	1.31
@@ -552,7 +552,7 @@
     /* Fill an otherwise unused field in the sock struct with this info.
        This field is conveniently named and the kernel uses it only for RPC. */
     sk->user_data=c;
-    sk->no_check=1; /* our packets are checksummed internally */
+    sk->no_check=(c->flags&CIPF_DO_CSUM) ? 0 : 1;

     /* Set up new socket operations */
     c->udp_prot=sk->prot;
@@ -645,7 +645,7 @@
        Actually, this is very similar to a packet socket!
        The ugly cast saves us one deref in the actual ops */
     sk->protinfo.af_packet.bound_dev=(struct NET_DEVICE *)c;
-    sk->no_check=1; /* our packets are checksummed internally */
+    sk->no_check=(c->flags&CIPF_DO_CSUM) ? 0 : 1;

     sti();
     return 0;

=== end of patch ===

--
Message sent by the cipe-l@inka.de mailing list.
Unsubscribe: mail majordomo@inka.de, "unsubscribe cipe-l" in body
Other commands available with "help" in body to the same address.
CIPE info and list archive: <URL:http://sites.inka.de/~bigred/devel/cipe.html>

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic