netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [UDP] Check encap_type at config time
@ 2004-06-25 12:11 Herbert Xu
  2004-06-25 12:35 ` [IPSEC] " Herbert Xu
  2004-06-25 17:37 ` [UDP] Check encap_type at config time David S. Miller
  0 siblings, 2 replies; 8+ messages in thread
From: Herbert Xu @ 2004-06-25 12:11 UTC (permalink / raw)
  To: David S. Miller, netdev

[-- Attachment #1: Type: text/plain, Size: 797 bytes --]

Hi Dave:

My foray into the TTL stuff is turning into an all-out assault on NAT-T :)

The following patch moves the udp->encap_type check from the per-packet
hot-path into udp_setsockopt().

As a consequence, this allows user space to detect whether the kernel
actually supports the encap type that they're requesting.  Pity no one
did this before the NON-IKE patch was applied.  As it is there is no
easy way to detect whether NON-IKE support is present.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

PS I will be doing a similar patch for the encap_type in xfrm.

Cheers,
-- 
Visit Openswan at http://www.openswan.org/
Email:  Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt

[-- Attachment #2: p --]
[-- Type: text/plain, Size: 1272 bytes --]

===== net/ipv4/udp.c 1.61 vs edited =====
--- 1.61/net/ipv4/udp.c	2004-06-05 06:59:36 +10:00
+++ edited/net/ipv4/udp.c	2004-06-25 21:56:34 +10:00
@@ -964,6 +964,7 @@
 	len = skb->tail - udpdata;
 
 	switch (encap_type) {
+	default:
 	case UDP_ENCAP_ESPINUDP:
 		/* Check if this is a keepalive packet.  If so, eat it. */
 		if (len == 1 && udpdata[0] == 0xff) {
@@ -1016,12 +1017,6 @@
 		} else
 			/* Must be an IKE packet.. pass it through */
 			return 1;
-
-	default:
-		if (net_ratelimit())
-			printk(KERN_INFO "udp_encap_rcv(): Unhandled UDP encap type: %u\n",
-			       encap_type);
-		return 1;
 	}
 #endif
 }
@@ -1297,7 +1292,16 @@
 		break;
 		
 	case UDP_ENCAP:
-		up->encap_type = val;
+		switch (val) {
+		case 0:
+		case UDP_ENCAP_ESPINUDP:
+		case UDP_ENCAP_ESPINUDP_NON_IKE:
+			up->encap_type = val;
+			break;
+		default:
+			err = -ENOPROTOOPT;
+			break;
+		}
 		break;
 
 	default:
===== net/ipv6/udp.c 1.67 vs edited =====
--- 1.67/net/ipv6/udp.c	2004-06-21 09:37:54 +10:00
+++ edited/net/ipv6/udp.c	2004-06-25 20:13:50 +10:00
@@ -1044,7 +1044,14 @@
 		break;
 		
 	case UDP_ENCAP:
-		up->encap_type = val;
+		switch (val) {
+		case 0:
+			up->encap_type = val;
+			break;
+		default:
+			err = -ENOPROTOOPT;
+			break;
+		}
 		break;
 
 	default:

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [IPSEC] Check encap_type at config time
  2004-06-25 12:11 [UDP] Check encap_type at config time Herbert Xu
@ 2004-06-25 12:35 ` Herbert Xu
  2004-06-25 17:39   ` David S. Miller
  2004-06-25 17:37 ` [UDP] Check encap_type at config time David S. Miller
  1 sibling, 1 reply; 8+ messages in thread
From: Herbert Xu @ 2004-06-25 12:35 UTC (permalink / raw)
  To: David S. Miller, netdev

[-- Attachment #1: Type: text/plain, Size: 531 bytes --]

On Fri, Jun 25, 2004 at 10:11:47PM +1000, herbert wrote:
> 
> PS I will be doing a similar patch for the encap_type in xfrm.

Here is the patch to check encap_type at the earliest possible
opportunity in xfrm_user/af_key.

This will allow us to assume in esp4 that the encap_type from x->encap
is always valid.

Cheers,
-- 
Visit Openswan at http://www.openswan.org/
Email:  Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt

[-- Attachment #2: p --]
[-- Type: text/plain, Size: 1007 bytes --]

===== net/key/af_key.c 1.61 vs edited =====
--- 1.61/net/key/af_key.c	2004-06-06 18:27:42 +10:00
+++ edited/net/key/af_key.c	2004-06-25 19:33:51 +10:00
@@ -1075,6 +1075,15 @@
 		n_type = ext_hdrs[SADB_X_EXT_NAT_T_TYPE-1];
 		natt->encap_type = n_type->sadb_x_nat_t_type_type;
 
+		switch (natt->encap_type) {
+		case UDP_ENCAP_ESPINUDP:
+		case UDP_ENCAP_ESPINUDP_NON_IKE:
+			break;
+		default:
+			err = -ENOPROTOOPT;
+			goto out;
+		}
+
 		if (ext_hdrs[SADB_X_EXT_NAT_T_SPORT-1]) {
 			struct sadb_x_nat_t_port* n_port =
 				ext_hdrs[SADB_X_EXT_NAT_T_SPORT-1];
===== net/xfrm/xfrm_user.c 1.42 vs edited =====
--- 1.42/net/xfrm/xfrm_user.c	2004-03-25 09:18:34 +11:00
+++ edited/net/xfrm/xfrm_user.c	2004-06-25 19:33:51 +10:00
@@ -78,6 +78,15 @@
 	if ((rt->rta_len - sizeof(*rt)) < sizeof(*encap))
 		return -EINVAL;
 
+	encap = RTA_DATA(rt);
+	switch (encap->encap_type) {
+	case UDP_ENCAP_ESPINUDP:
+	case UDP_ENCAP_ESPINUDP_NON_IKE:
+		break;
+	default:
+		return -ENOPROTOOPT;
+	}
+
 	return 0;
 }
 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [UDP] Check encap_type at config time
  2004-06-25 12:11 [UDP] Check encap_type at config time Herbert Xu
  2004-06-25 12:35 ` [IPSEC] " Herbert Xu
@ 2004-06-25 17:37 ` David S. Miller
  1 sibling, 0 replies; 8+ messages in thread
From: David S. Miller @ 2004-06-25 17:37 UTC (permalink / raw)
  To: Herbert Xu; +Cc: netdev

On Fri, 25 Jun 2004 22:11:47 +1000
Herbert Xu <herbert@gondor.apana.org.au> wrote:

> The following patch moves the udp->encap_type check from the per-packet
> hot-path into udp_setsockopt().
> 
> As a consequence, this allows user space to detect whether the kernel
> actually supports the encap type that they're requesting.  Pity no one
> did this before the NON-IKE patch was applied.  As it is there is no
> easy way to detect whether NON-IKE support is present.
> 
> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

Applied, looks great.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [IPSEC] Check encap_type at config time
  2004-06-25 12:35 ` [IPSEC] " Herbert Xu
@ 2004-06-25 17:39   ` David S. Miller
  2004-06-26  1:57     ` [IPSEC] Remove run-time encap_type checks in esp4 Herbert Xu
  0 siblings, 1 reply; 8+ messages in thread
From: David S. Miller @ 2004-06-25 17:39 UTC (permalink / raw)
  To: Herbert Xu; +Cc: netdev

On Fri, 25 Jun 2004 22:35:27 +1000
Herbert Xu <herbert@gondor.apana.org.au> wrote:

> Here is the patch to check encap_type at the earliest possible
> opportunity in xfrm_user/af_key.
> 
> This will allow us to assume in esp4 that the encap_type from x->encap
> is always valid.

Applied.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [IPSEC] Remove run-time encap_type checks in esp4
  2004-06-25 17:39   ` David S. Miller
@ 2004-06-26  1:57     ` Herbert Xu
  2004-06-26 10:07       ` [IPSEC] Drop bogus NAT-T printks in esp_input Herbert Xu
  2004-06-26 18:35       ` [IPSEC] Remove run-time encap_type checks in esp4 David S. Miller
  0 siblings, 2 replies; 8+ messages in thread
From: Herbert Xu @ 2004-06-26  1:57 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev

[-- Attachment #1: Type: text/plain, Size: 885 bytes --]

On Fri, Jun 25, 2004 at 10:39:28AM -0700, David S. Miller wrote:
> On Fri, 25 Jun 2004 22:35:27 +1000
> Herbert Xu <herbert@gondor.apana.org.au> wrote:
> 
> > Here is the patch to check encap_type at the earliest possible
> > opportunity in xfrm_user/af_key.
> 
> Applied.

Thanks.

This allows us to remove all the per-packet checks on x->encap->encap_type.
I've left the check in esp_input just in case someone adds a non-ESP encap
type in future.

However, printing a warning and then continuing is definitely wrong.
So expect a follow-up patch to drop the packet when encap_type is
unknown in esp_input.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

Cheers,
-- 
Visit Openswan at http://www.openswan.org/
Email:  Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt

[-- Attachment #2: p --]
[-- Type: text/plain, Size: 2875 bytes --]

===== net/ipv4/esp4.c 1.44 vs edited =====
--- 1.44/net/ipv4/esp4.c	2004-06-25 18:38:22 +10:00
+++ edited/net/ipv4/esp4.c	2004-06-26 11:47:15 +10:00
@@ -94,8 +94,9 @@
 	if (x->props.mode) {
 		top_iph = (struct iphdr*)skb_push(*pskb, x->props.header_len);
 		esph = (struct ip_esp_hdr*)(top_iph+1);
-		if (encap && encap->encap_type) {
+		if (encap) {
 			switch (encap->encap_type) {
+			default:
 			case UDP_ENCAP_ESPINUDP:
 				uh = (struct udphdr*) esph;
 				esph = (struct ip_esp_hdr*)(uh+1);
@@ -108,12 +109,6 @@
 				esph = (struct ip_esp_hdr*)(udpdata32+2);
 				top_iph->protocol = IPPROTO_UDP;
 				break;
-			default:
-				printk(KERN_INFO
-				       "esp_output(): Unhandled encap: %u\n",
-				       encap->encap_type);
-				top_iph->protocol = IPPROTO_ESP;
-				break;
 			}
 		} else
 			top_iph->protocol = IPPROTO_ESP;
@@ -136,8 +131,9 @@
 		esph = (struct ip_esp_hdr*)skb_push(*pskb, x->props.header_len);
 		top_iph = (struct iphdr*)skb_push(*pskb, iph->ihl*4);
 		memcpy(top_iph, &tmp_iph, iph->ihl*4);
-		if (encap && encap->encap_type) {
+		if (encap) {
 			switch (encap->encap_type) {
+			default:
 			case UDP_ENCAP_ESPINUDP:
 				uh = (struct udphdr*) esph;
 				esph = (struct ip_esp_hdr*)(uh+1);
@@ -150,12 +146,6 @@
 				esph = (struct ip_esp_hdr*)(udpdata32+2);
 				top_iph->protocol = IPPROTO_UDP;
 				break;
-			default:
-				printk(KERN_INFO
-				       "esp_output(): Unhandled encap: %u\n",
-				       encap->encap_type);
-				top_iph->protocol = IPPROTO_ESP;
-				break;
 			}
 		} else
 			top_iph->protocol = IPPROTO_ESP;
@@ -365,11 +355,8 @@
 		if (encap->encap_type != decap->decap_type)
 			return -EINVAL;
 
-		/* Next, if we don't have an encap type, then ignore it */
-		if (!encap->encap_type)
-			return 0;
-
 		switch (encap->encap_type) {
+		default:
 		case UDP_ENCAP_ESPINUDP:
 		case UDP_ENCAP_ESPINUDP_NON_IKE:
 			/*
@@ -406,11 +393,6 @@
 				skb->ip_summed = CHECKSUM_UNNECESSARY;
 
 			break;
-		default:
-			printk(KERN_INFO
-			       "esp4_post_input(): Unhandled encap type: %u\n",
-			       encap->encap_type);
-			break;
 		}
 	}
 	return 0;
@@ -547,20 +529,14 @@
 	if (x->encap) {
 		struct xfrm_encap_tmpl *encap = x->encap;
 
-		if (encap->encap_type) {
-			switch (encap->encap_type) {
-			case UDP_ENCAP_ESPINUDP:
-				x->props.header_len += sizeof(struct udphdr);
-				break;
-			case UDP_ENCAP_ESPINUDP_NON_IKE:
-				x->props.header_len += sizeof(struct udphdr) + 2 * sizeof(u32);
-				break;
-			default:
-				printk (KERN_INFO
-				"esp_init_state(): Unhandled encap type: %u\n",
-					encap->encap_type);
-				break;
-			}
+		switch (encap->encap_type) {
+		default:
+		case UDP_ENCAP_ESPINUDP:
+			x->props.header_len += sizeof(struct udphdr);
+			break;
+		case UDP_ENCAP_ESPINUDP_NON_IKE:
+			x->props.header_len += sizeof(struct udphdr) + 2 * sizeof(u32);
+			break;
 		}
 	}
 	x->data = esp;

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [IPSEC] Drop bogus NAT-T printks in esp_input
  2004-06-26  1:57     ` [IPSEC] Remove run-time encap_type checks in esp4 Herbert Xu
@ 2004-06-26 10:07       ` Herbert Xu
  2004-06-26 18:36         ` David S. Miller
  2004-06-26 18:35       ` [IPSEC] Remove run-time encap_type checks in esp4 David S. Miller
  1 sibling, 1 reply; 8+ messages in thread
From: Herbert Xu @ 2004-06-26 10:07 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev

[-- Attachment #1: Type: text/plain, Size: 712 bytes --]

On Sat, Jun 26, 2004 at 11:57:15AM +1000, herbert wrote:
> 
> However, printing a warning and then continuing is definitely wrong.
> So expect a follow-up patch to drop the packet when encap_type is
> unknown in esp_input.

Here is the patch to drop the packet if encap_type is unknown.
I've also removed the other two bogus printk's as they cannot
occur (printing a message is the last thing you want to do even
if they did occur :).

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

Cheers,
-- 
Visit Openswan at http://www.openswan.org/
Email:  Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt

[-- Attachment #2: p --]
[-- Type: text/plain, Size: 886 bytes --]

===== net/ipv4/esp4.c 1.45 vs edited =====
--- 1.45/net/ipv4/esp4.c	2004-06-26 15:42:21 +10:00
+++ edited/net/ipv4/esp4.c	2004-06-26 19:57:22 +10:00
@@ -301,28 +301,14 @@
 			switch (decap->decap_type) {
 			case UDP_ENCAP_ESPINUDP:
 			case UDP_ENCAP_ESPINUDP_NON_IKE:
-
-				if ((void*)uh == (void*)esph) {
-					printk(KERN_DEBUG
-					       "esp_input(): Got ESP; expecting ESPinUDP\n");
-					break;
-				}
-
 				encap_data->proto = AF_INET;
 				encap_data->saddr.a4 = iph->saddr;
 				encap_data->sport = uh->source;
 				encap_len = (void*)esph - (void*)uh;
-				if (encap_len != sizeof(*uh))
-				  printk(KERN_DEBUG
-					 "esp_input(): UDP -> ESP: too much room: %d\n",
-					 encap_len);
 				break;
 
 			default:
-				printk(KERN_INFO
-			       "esp_input(): processing unknown encap type: %u\n",
-				       decap->decap_type);
-				break;
+				goto out;
 			}
 		}
 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [IPSEC] Remove run-time encap_type checks in esp4
  2004-06-26  1:57     ` [IPSEC] Remove run-time encap_type checks in esp4 Herbert Xu
  2004-06-26 10:07       ` [IPSEC] Drop bogus NAT-T printks in esp_input Herbert Xu
@ 2004-06-26 18:35       ` David S. Miller
  1 sibling, 0 replies; 8+ messages in thread
From: David S. Miller @ 2004-06-26 18:35 UTC (permalink / raw)
  To: Herbert Xu; +Cc: netdev

On Sat, 26 Jun 2004 11:57:15 +1000
Herbert Xu <herbert@gondor.apana.org.au> wrote:

> This allows us to remove all the per-packet checks on x->encap->encap_type.
> I've left the check in esp_input just in case someone adds a non-ESP encap
> type in future.

Applied.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [IPSEC] Drop bogus NAT-T printks in esp_input
  2004-06-26 10:07       ` [IPSEC] Drop bogus NAT-T printks in esp_input Herbert Xu
@ 2004-06-26 18:36         ` David S. Miller
  0 siblings, 0 replies; 8+ messages in thread
From: David S. Miller @ 2004-06-26 18:36 UTC (permalink / raw)
  To: Herbert Xu; +Cc: netdev

On Sat, 26 Jun 2004 20:07:18 +1000
Herbert Xu <herbert@gondor.apana.org.au> wrote:

> On Sat, Jun 26, 2004 at 11:57:15AM +1000, herbert wrote:
> > 
> > However, printing a warning and then continuing is definitely wrong.
> > So expect a follow-up patch to drop the packet when encap_type is
> > unknown in esp_input.
> 
> Here is the patch to drop the packet if encap_type is unknown.
> I've also removed the other two bogus printk's as they cannot
> occur (printing a message is the last thing you want to do even
> if they did occur :).

Also applied, thanks.

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2004-06-26 18:36 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-06-25 12:11 [UDP] Check encap_type at config time Herbert Xu
2004-06-25 12:35 ` [IPSEC] " Herbert Xu
2004-06-25 17:39   ` David S. Miller
2004-06-26  1:57     ` [IPSEC] Remove run-time encap_type checks in esp4 Herbert Xu
2004-06-26 10:07       ` [IPSEC] Drop bogus NAT-T printks in esp_input Herbert Xu
2004-06-26 18:36         ` David S. Miller
2004-06-26 18:35       ` [IPSEC] Remove run-time encap_type checks in esp4 David S. Miller
2004-06-25 17:37 ` [UDP] Check encap_type at config time David S. Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).