* [PATCH] xfrm: use gre key as flow upper protocol info
@ 2010-11-03 14:41 Timo Teräs
2010-11-03 20:16 ` Michał Mirosław
2010-11-15 18:43 ` David Miller
0 siblings, 2 replies; 7+ messages in thread
From: Timo Teräs @ 2010-11-03 14:41 UTC (permalink / raw)
To: netdev, Herbert Xu; +Cc: Timo Teräs
The GRE Key field is intended to be used for identifying an individual
traffic flow within a tunnel. It is useful to be able to have XFRM
policy selector matches to have different policies for different
GRE tunnels.
Signed-off-by: Timo Teräs <timo.teras@iki.fi>
---
Basic testing done, but more knowledgeable should check that I did
not miss anything essential.
include/net/flow.h | 2 ++
include/net/xfrm.h | 6 ++++++
net/ipv4/ip_gre.c | 12 +++++++-----
net/ipv4/xfrm4_policy.c | 15 +++++++++++++++
4 files changed, 30 insertions(+), 5 deletions(-)
diff --git a/include/net/flow.h b/include/net/flow.h
index 0ac3fb5..7196e68 100644
--- a/include/net/flow.h
+++ b/include/net/flow.h
@@ -67,6 +67,7 @@ struct flowi {
} dnports;
__be32 spi;
+ __be32 gre_key;
struct {
__u8 type;
@@ -78,6 +79,7 @@ struct flowi {
#define fl_icmp_code uli_u.icmpt.code
#define fl_ipsec_spi uli_u.spi
#define fl_mh_type uli_u.mht.type
+#define fl_gre_key uli_u.gre_key
__u32 secid; /* used by xfrm; see secid.txt */
} __attribute__((__aligned__(BITS_PER_LONG/8)));
diff --git a/include/net/xfrm.h b/include/net/xfrm.h
index bcfb6b2..54b2832 100644
--- a/include/net/xfrm.h
+++ b/include/net/xfrm.h
@@ -805,6 +805,9 @@ __be16 xfrm_flowi_sport(struct flowi *fl)
case IPPROTO_MH:
port = htons(fl->fl_mh_type);
break;
+ case IPPROTO_GRE:
+ port = htonl(fl->fl_gre_key) >> 16;
+ break;
default:
port = 0; /*XXX*/
}
@@ -826,6 +829,9 @@ __be16 xfrm_flowi_dport(struct flowi *fl)
case IPPROTO_ICMPV6:
port = htons(fl->fl_icmp_code);
break;
+ case IPPROTO_GRE:
+ port = htonl(fl->fl_gre_key) & 0xffff;
+ break;
default:
port = 0; /*XXX*/
}
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
index 70ff77f..ffc78e8 100644
--- a/net/ipv4/ip_gre.c
+++ b/net/ipv4/ip_gre.c
@@ -779,9 +779,9 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev
.tos = RT_TOS(tos)
}
},
- .proto = IPPROTO_GRE
- }
-;
+ .proto = IPPROTO_GRE,
+ .fl_gre_key = tunnel->parms.o_key
+ };
if (ip_route_output_key(dev_net(dev), &rt, &fl)) {
dev->stats.tx_carrier_errors++;
goto tx_error;
@@ -958,7 +958,8 @@ static int ipgre_tunnel_bind_dev(struct net_device *dev)
.tos = RT_TOS(iph->tos)
}
},
- .proto = IPPROTO_GRE
+ .proto = IPPROTO_GRE,
+ .fl_gre_key = tunnel->parms.o_key
};
struct rtable *rt;
@@ -1223,7 +1224,8 @@ static int ipgre_open(struct net_device *dev)
.tos = RT_TOS(t->parms.iph.tos)
}
},
- .proto = IPPROTO_GRE
+ .proto = IPPROTO_GRE,
+ .fl_gre_key = t->parms.o_key
};
struct rtable *rt;
diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c
index 4464f3b..57af4bd 100644
--- a/net/ipv4/xfrm4_policy.c
+++ b/net/ipv4/xfrm4_policy.c
@@ -11,6 +11,7 @@
#include <linux/err.h>
#include <linux/kernel.h>
#include <linux/inetdevice.h>
+#include <linux/if_tunnel.h>
#include <net/dst.h>
#include <net/xfrm.h>
#include <net/ip.h>
@@ -158,6 +159,20 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse)
fl->fl_ipsec_spi = htonl(ntohs(ipcomp_hdr[1]));
}
break;
+
+ case IPPROTO_GRE:
+ if (pskb_may_pull(skb, xprth + 12 - skb->data)) {
+ __be16 *greflags = (__be16 *)xprth;
+ __be32 *gre_hdr = (__be32 *)xprth;
+
+ if (greflags[0] & GRE_KEY) {
+ if (greflags[0] & GRE_CSUM)
+ gre_hdr++;
+ fl->fl_gre_key = gre_hdr[1];
+ }
+ }
+ break;
+
default:
fl->fl_ipsec_spi = 0;
break;
--
1.7.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] xfrm: use gre key as flow upper protocol info
2010-11-03 14:41 [PATCH] xfrm: use gre key as flow upper protocol info Timo Teräs
@ 2010-11-03 20:16 ` Michał Mirosław
2010-11-03 21:35 ` Jesse Gross
2010-11-15 18:43 ` David Miller
1 sibling, 1 reply; 7+ messages in thread
From: Michał Mirosław @ 2010-11-03 20:16 UTC (permalink / raw)
To: Timo Teräs; +Cc: netdev, Herbert Xu
2010/11/3 Timo Teräs <timo.teras@iki.fi>:
> The GRE Key field is intended to be used for identifying an individual
> traffic flow within a tunnel. It is useful to be able to have XFRM
> policy selector matches to have different policies for different
> GRE tunnels.
[...]
> diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c
> index 4464f3b..57af4bd 100644
> --- a/net/ipv4/xfrm4_policy.c
> +++ b/net/ipv4/xfrm4_policy.c
> @@ -158,6 +159,20 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse)
> fl->fl_ipsec_spi = htonl(ntohs(ipcomp_hdr[1]));
> }
> break;
> +
> + case IPPROTO_GRE:
> + if (pskb_may_pull(skb, xprth + 12 - skb->data)) {
> + __be16 *greflags = (__be16 *)xprth;
> + __be32 *gre_hdr = (__be32 *)xprth;
> +
> + if (greflags[0] & GRE_KEY) {
> + if (greflags[0] & GRE_CSUM)
> + gre_hdr++;
> + fl->fl_gre_key = gre_hdr[1];
> + }
> + }
> + break;
> +
> default:
> fl->fl_ipsec_spi = 0;
> break;
I would expect that keyless tunnel would be separate from key 0 tunnel.
Best Regards,
Michał Mirosław
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] xfrm: use gre key as flow upper protocol info
2010-11-03 20:16 ` Michał Mirosław
@ 2010-11-03 21:35 ` Jesse Gross
2010-11-03 21:46 ` Michał Mirosław
0 siblings, 1 reply; 7+ messages in thread
From: Jesse Gross @ 2010-11-03 21:35 UTC (permalink / raw)
To: Michał Mirosław; +Cc: Timo Teräs, netdev, Herbert Xu
2010/11/3 Michał Mirosław <mirqus@gmail.com>:
> 2010/11/3 Timo Teräs <timo.teras@iki.fi>:
>> The GRE Key field is intended to be used for identifying an individual
>> traffic flow within a tunnel. It is useful to be able to have XFRM
>> policy selector matches to have different policies for different
>> GRE tunnels.
> [...]
>> diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c
>> index 4464f3b..57af4bd 100644
>> --- a/net/ipv4/xfrm4_policy.c
>> +++ b/net/ipv4/xfrm4_policy.c
>> @@ -158,6 +159,20 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse)
>> fl->fl_ipsec_spi = htonl(ntohs(ipcomp_hdr[1]));
>> }
>> break;
>> +
>> + case IPPROTO_GRE:
>> + if (pskb_may_pull(skb, xprth + 12 - skb->data)) {
>> + __be16 *greflags = (__be16 *)xprth;
>> + __be32 *gre_hdr = (__be32 *)xprth;
>> +
>> + if (greflags[0] & GRE_KEY) {
>> + if (greflags[0] & GRE_CSUM)
>> + gre_hdr++;
>> + fl->fl_gre_key = gre_hdr[1];
>> + }
>> + }
>> + break;
>> +
>> default:
>> fl->fl_ipsec_spi = 0;
>> break;
>
> I would expect that keyless tunnel would be separate from key 0 tunnel.
No key and key 0 are generally treated the same. Both will match the
same tunnel when doing the lookup in the GRE receive path.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] xfrm: use gre key as flow upper protocol info
2010-11-03 21:35 ` Jesse Gross
@ 2010-11-03 21:46 ` Michał Mirosław
0 siblings, 0 replies; 7+ messages in thread
From: Michał Mirosław @ 2010-11-03 21:46 UTC (permalink / raw)
To: Jesse Gross; +Cc: Timo Teräs, netdev, Herbert Xu
W dniu 3 listopada 2010 22:35 użytkownik Jesse Gross <jesse@nicira.com> napisał:
> 2010/11/3 Michał Mirosław <mirqus@gmail.com>:
>> 2010/11/3 Timo Teräs <timo.teras@iki.fi>:
>>> The GRE Key field is intended to be used for identifying an individual
>>> traffic flow within a tunnel. It is useful to be able to have XFRM
>>> policy selector matches to have different policies for different
>>> GRE tunnels.
>> [...]
>>> diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c
>>> index 4464f3b..57af4bd 100644
>>> --- a/net/ipv4/xfrm4_policy.c
>>> +++ b/net/ipv4/xfrm4_policy.c
>>> @@ -158,6 +159,20 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse)
>>> fl->fl_ipsec_spi = htonl(ntohs(ipcomp_hdr[1]));
>>> }
>>> break;
>>> +
>>> + case IPPROTO_GRE:
>>> + if (pskb_may_pull(skb, xprth + 12 - skb->data)) {
>>> + __be16 *greflags = (__be16 *)xprth;
>>> + __be32 *gre_hdr = (__be32 *)xprth;
>>> +
>>> + if (greflags[0] & GRE_KEY) {
>>> + if (greflags[0] & GRE_CSUM)
>>> + gre_hdr++;
>>> + fl->fl_gre_key = gre_hdr[1];
>>> + }
>>> + }
>>> + break;
>>> +
>>> default:
>>> fl->fl_ipsec_spi = 0;
>>> break;
>> I would expect that keyless tunnel would be separate from key 0 tunnel.
> No key and key 0 are generally treated the same. Both will match the
> same tunnel when doing the lookup in the GRE receive path.
I read the code again, and indeed it is. I was sure that they were
treated separately some time ago, but git knows nothing about it.
Best Regards,
Michał Mirosław
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] xfrm: use gre key as flow upper protocol info
2010-11-03 14:41 [PATCH] xfrm: use gre key as flow upper protocol info Timo Teräs
2010-11-03 20:16 ` Michał Mirosław
@ 2010-11-15 18:43 ` David Miller
2010-11-23 14:03 ` Timo Teräs
1 sibling, 1 reply; 7+ messages in thread
From: David Miller @ 2010-11-15 18:43 UTC (permalink / raw)
To: timo.teras; +Cc: netdev, herbert
From: Timo Teräs <timo.teras@iki.fi>
Date: Wed, 3 Nov 2010 16:41:38 +0200
> The GRE Key field is intended to be used for identifying an individual
> traffic flow within a tunnel. It is useful to be able to have XFRM
> policy selector matches to have different policies for different
> GRE tunnels.
>
> Signed-off-by: Timo Teräs <timo.teras@iki.fi>
I'll apply this to net-next-2.6, thanks.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] xfrm: use gre key as flow upper protocol info
2010-11-15 18:43 ` David Miller
@ 2010-11-23 14:03 ` Timo Teräs
2010-11-28 19:22 ` David Miller
0 siblings, 1 reply; 7+ messages in thread
From: Timo Teräs @ 2010-11-23 14:03 UTC (permalink / raw)
To: David Miller; +Cc: netdev, herbert
On 11/15/2010 08:43 PM, David Miller wrote:
> From: Timo Teräs <timo.teras@iki.fi>
> Date: Wed, 3 Nov 2010 16:41:38 +0200
>
>> The GRE Key field is intended to be used for identifying an individual
>> traffic flow within a tunnel. It is useful to be able to have XFRM
>> policy selector matches to have different policies for different
>> GRE tunnels.
>>
>> Signed-off-by: Timo Teräs <timo.teras@iki.fi>
>
> I'll apply this to net-next-2.6, thanks.
Hmm.. I tested this with using the "ip xfrm" sport and dport manually
(without doing the actual userland support for this), and checking it in
kernel with printk's in various places that the stuff matches. In these
tests I checked the sport/dport by hand and apparently messed up the
byte order.
Now that I'm writing the GRE support for "ip xfrm" I think that missed
two htons() calls.
I was confused if xfrm_flowi_{s|d}port was supposed to return host or
net byte order for non-TCP/UDP packets.
I was under the assumption that host byte order since case IPPROTO_ICMP
swaps the byte order. But it would appear that the fl->fl_icmp_* is
actually host order and it's turned to network order; this is also
implied by using htons instead of ntohs. Since I decided to keep
fl_gre_key in network order, the return value would now be inconsistent,
and make userland abi endianess dependent.
I'll follow up with iproute2 patch soon.
So we probably would need to do:
xfrm: fix gre key endianess
fl->fl_gre_key is network byte order contrary to fl->fl_icmp_*.
Make xfrm_flowi_{s|d}port return network byte order values for gre
key too.
Signed-off-by: Timo Teräs <timo.teras@iki.fi>
diff --git a/include/net/xfrm.h b/include/net/xfrm.h
index 1a57ff9..916ac47 100644
--- a/include/net/xfrm.h
+++ b/include/net/xfrm.h
@@ -806,7 +806,7 @@ __be16 xfrm_flowi_sport(struct flowi *fl)
port = htons(fl->fl_mh_type);
break;
case IPPROTO_GRE:
- port = htonl(fl->fl_gre_key) >> 16;
+ port = htons(ntohl(fl->fl_gre_key) >> 16);
break;
default:
port = 0; /*XXX*/
@@ -830,7 +830,7 @@ __be16 xfrm_flowi_dport(struct flowi *fl)
port = htons(fl->fl_icmp_code);
break;
case IPPROTO_GRE:
- port = htonl(fl->fl_gre_key) & 0xffff;
+ port = htons(ntohl(fl->fl_gre_key) & 0xffff);
break;
default:
port = 0; /*XXX*/
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] xfrm: use gre key as flow upper protocol info
2010-11-23 14:03 ` Timo Teräs
@ 2010-11-28 19:22 ` David Miller
0 siblings, 0 replies; 7+ messages in thread
From: David Miller @ 2010-11-28 19:22 UTC (permalink / raw)
To: timo.teras; +Cc: netdev, herbert
From: Timo Teräs <timo.teras@iki.fi>
Date: Tue, 23 Nov 2010 16:03:45 +0200
> So we probably would need to do:
>
> xfrm: fix gre key endianess
>
> fl->fl_gre_key is network byte order contrary to fl->fl_icmp_*.
> Make xfrm_flowi_{s|d}port return network byte order values for gre
> key too.
>
> Signed-off-by: Timo Teräs <timo.teras@iki.fi>
Ok, applied, thanks Timo.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2010-11-28 19:22 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-11-03 14:41 [PATCH] xfrm: use gre key as flow upper protocol info Timo Teräs
2010-11-03 20:16 ` Michał Mirosław
2010-11-03 21:35 ` Jesse Gross
2010-11-03 21:46 ` Michał Mirosław
2010-11-15 18:43 ` David Miller
2010-11-23 14:03 ` Timo Teräs
2010-11-28 19:22 ` David 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).