Skip to contentSkip to conversation

xfrm: Accept XFRM_STATE_AF_UNSPEC SAs on IPv4/IPv6 only hosts

RFC PATCH In review Martin Willi 2 participants 4 messages Nov 25, 2008 – Dec 3, 2008

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

RFC PATCH 1/1 xfrm: Accept XFRM_STATE_AF_UNSPEC SAs on IPv4/IPv6 only hosts

Installing SAs using the XFRM_STATE_AF_UNSPEC fails on hosts with support for one address family only. This patch accepts such SAs, even if the processing of not supported packets will fail.

---
For me the meaning of that flag is not really clear. If it means "I-want-to-run-v6-in-v4-or-vice-versa" then the current behavior (reject SA) is probably ok.
However, in my understanding ("accept-any-inner-address-family"), the kernel should accept such SAs. Otherwise userspace has to query the supported address families.

net/xfrm/xfrm_state.c +11 -15
index 508337f..456782b 100644
@@ -2032,8 +2032,9 @@ int xfrm_init_state(struct xfrm_state *x)
 		x->inner_mode = inner_mode;
 	} else {
 		struct xfrm_mode *inner_mode_iaf;
+		int iafamily = AF_INET;
 
-		inner_mode = xfrm_get_mode(x->props.mode, AF_INET);
+		inner_mode = xfrm_get_mode(x->props.mode, x->props.family);
 		if (inner_mode == NULL)
 			goto error;
 
@@ -2041,22 +2042,17 @@ int xfrm_init_state(struct xfrm_state *x)
 			xfrm_put_mode(inner_mode);
 			goto error;
 		}
+		x->inner_mode = inner_mode;
 
-		inner_mode_iaf = xfrm_get_mode(x->props.mode, AF_INET6);
-		if (inner_mode_iaf == NULL)
-			goto error;
+		if (x->props.family == AF_INET)
+			iafamily = AF_INET6;
 
-		if (!(inner_mode_iaf->flags & XFRM_MODE_FLAG_TUNNEL)) {
-			xfrm_put_mode(inner_mode_iaf);
-			goto error;
-		}
-
-		if (x->props.family == AF_INET) {
-			x->inner_mode = inner_mode;
-			x->inner_mode_iaf = inner_mode_iaf;
-		} else {
-			x->inner_mode = inner_mode_iaf;
-			x->inner_mode_iaf = inner_mode;
+		inner_mode_iaf = xfrm_get_mode(x->props.mode, iafamily);
+		if (inner_mode_iaf) {
+			if (inner_mode_iaf->flags & XFRM_MODE_FLAG_TUNNEL)
+				x->inner_mode_iaf = inner_mode_iaf;
+			else
+				xfrm_put_mode(inner_mode_iaf);
 		}
 	}
 
#1 lore raw

I'm wondering what's the state of this patch. Should I resubmit without [RFC]? Something else wrong with it?

It has been tagged as "Accepted" in patchworks, but isn't gone anywhere so far.

Thanks
Martin

Quoted 67 lines · Martin Willi

Installing SAs using the XFRM_STATE_AF_UNSPEC fails on hosts with support for one address family only. This patch accepts such SAs, even if the processing of not supported packets will fail.

---
For me the meaning of that flag is not really clear. If it means "I-want-to-run-v6-in-v4-or-vice-versa" then the current behavior (reject SA) is probably ok.
However, in my understanding ("accept-any-inner-address-family"), the kernel should accept such SAs. Otherwise userspace has to query the supported address families.

net/xfrm/xfrm_state.c +11 -16
index 508337f..456782b 100644
@@ -2032,8 +2032,9 @@ int xfrm_init_state(struct xfrm_state *x)
 		x->inner_mode = inner_mode;
 	} else {
 		struct xfrm_mode *inner_mode_iaf;
+		int iafamily = AF_INET;
 
-		inner_mode = xfrm_get_mode(x->props.mode, AF_INET);
+		inner_mode = xfrm_get_mode(x->props.mode, x->props.family);
 		if (inner_mode == NULL)
 			goto error;
 
@@ -2041,22 +2042,17 @@ int xfrm_init_state(struct xfrm_state *x)
 			xfrm_put_mode(inner_mode);
 			goto error;
 		}
+		x->inner_mode = inner_mode;
 
-		inner_mode_iaf = xfrm_get_mode(x->props.mode, AF_INET6);
-		if (inner_mode_iaf == NULL)
-			goto error;
+		if (x->props.family == AF_INET)
+			iafamily = AF_INET6;
 
-		if (!(inner_mode_iaf->flags & XFRM_MODE_FLAG_TUNNEL)) {
-			xfrm_put_mode(inner_mode_iaf);
-			goto error;
-		}
-
-		if (x->props.family == AF_INET) {
-			x->inner_mode = inner_mode;
-			x->inner_mode_iaf = inner_mode_iaf;
-		} else {
-			x->inner_mode = inner_mode_iaf;
-			x->inner_mode_iaf = inner_mode;
+		inner_mode_iaf = xfrm_get_mode(x->props.mode, iafamily);
+		if (inner_mode_iaf) {
+			if (inner_mode_iaf->flags & XFRM_MODE_FLAG_TUNNEL)
+				x->inner_mode_iaf = inner_mode_iaf;
+			else
+				xfrm_put_mode(inner_mode_iaf);
 		}
 	}
 
 
 
--

To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

maintainer
#2 lore raw

From: Martin Willi <[email protected]>
Date: Tue, 02 Dec 2008 10:49:24 +0100

Quoted 5 lines

I'm wondering what's the state of this patch. Should I resubmit without [RFC]? Something else wrong with it?

It has been tagged as "Accepted" in patchworks, but isn't gone anywhere so far.

Sorry, I accidently advanced the state, it should still be in "under review". Let me fix that.

I want to do some research before I apply this patch, so please be patient.

Thanks!

maintainer
#3 lore raw
In reply to Martin Willi

From: Martin Willi <[email protected]>
Date: Tue, 25 Nov 2008 17:10:06 +0100

Quoted 6 lines

Installing SAs using the XFRM_STATE_AF_UNSPEC fails on hosts with support for one address family only. This patch accepts such SAs, even if the processing of not supported packets will fail.

Quoted 7 lines

---
For me the meaning of that flag is not really clear. If it means "I-want-to-run-v6-in-v4-or-vice-versa" then the current behavior (reject SA) is probably ok.
However, in my understanding ("accept-any-inner-address-family"), the kernel should accept such SAs. Otherwise userspace has to query the supported address families.

Ok, your interpretation works for me, I've applied this to net-next-2.6, thanks.