diff options
author | Dmitry Popov <ixaphire@qrator.net> | 2014-06-07 19:03:08 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-06-11 03:43:37 -0400 |
commit | 5ce54af1fc9d2718d46c9fd92a161379fb197266 (patch) | |
tree | e34303a4c625ab15d9a1bb457181227973721461 /net | |
parent | 7c8e6b9c2811fd37702a9043eabea3545022011e (diff) |
ip_tunnel: fix i_key matching in ip_tunnel_find
Some tunnels (though only vti as for now) can use i_key just for internal use:
for example vti uses it for fwmark'ing incoming packets. So raw i_key value
shouldn't be treated as a distinguisher for them. ip_tunnel_key_match exists for
cases when we want to compare two ip_tunnel_parms' i_keys.
Example bug:
ip link add type vti ikey 1 local 1.0.0.1 remote 2.0.0.2
ip link add type vti ikey 2 local 1.0.0.1 remote 2.0.0.2
spawned two tunnels, although it doesn't make sense.
Signed-off-by: Dmitry Popov <ixaphire@qrator.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv4/ip_tunnel.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c index 3dbb550abb30..9b553157e556 100644 --- a/net/ipv4/ip_tunnel.c +++ b/net/ipv4/ip_tunnel.c | |||
@@ -268,6 +268,7 @@ static struct ip_tunnel *ip_tunnel_find(struct ip_tunnel_net *itn, | |||
268 | __be32 remote = parms->iph.daddr; | 268 | __be32 remote = parms->iph.daddr; |
269 | __be32 local = parms->iph.saddr; | 269 | __be32 local = parms->iph.saddr; |
270 | __be32 key = parms->i_key; | 270 | __be32 key = parms->i_key; |
271 | __be16 flags = parms->i_flags; | ||
271 | int link = parms->link; | 272 | int link = parms->link; |
272 | struct ip_tunnel *t = NULL; | 273 | struct ip_tunnel *t = NULL; |
273 | struct hlist_head *head = ip_bucket(itn, parms); | 274 | struct hlist_head *head = ip_bucket(itn, parms); |
@@ -275,9 +276,9 @@ static struct ip_tunnel *ip_tunnel_find(struct ip_tunnel_net *itn, | |||
275 | hlist_for_each_entry_rcu(t, head, hash_node) { | 276 | hlist_for_each_entry_rcu(t, head, hash_node) { |
276 | if (local == t->parms.iph.saddr && | 277 | if (local == t->parms.iph.saddr && |
277 | remote == t->parms.iph.daddr && | 278 | remote == t->parms.iph.daddr && |
278 | key == t->parms.i_key && | ||
279 | link == t->parms.link && | 279 | link == t->parms.link && |
280 | type == t->dev->type) | 280 | type == t->dev->type && |
281 | ip_tunnel_key_match(&t->parms, flags, key)) | ||
281 | break; | 282 | break; |
282 | } | 283 | } |
283 | return t; | 284 | return t; |