[PATCH 6/44] [XFRM] STATE: Search by address using source address list.

2006-08-23 Thread YOSHIFUJI Hideaki
From: Masahide NAKAMURA [EMAIL PROTECTED]

This is a support to search transformation states by its addresses
by using source address list for Mobile IPv6 usage.
To use it from user-space, it is also added a message type for
source address as a xfrm state option.
Based on MIPL2 kernel patch.

Signed-off-by: Masahide NAKAMURA [EMAIL PROTECTED]
Signed-off-by: YOSHIFUJI Hideaki [EMAIL PROTECTED]
---
 include/linux/xfrm.h   |1 +
 include/net/xfrm.h |2 ++
 net/ipv4/xfrm4_state.c |9 +++
 net/ipv6/xfrm6_state.c |   21 +
 net/xfrm/xfrm_state.c  |   37 +++---
 net/xfrm/xfrm_user.c   |   59 +++-
 6 files changed, 119 insertions(+), 10 deletions(-)

diff --git a/include/linux/xfrm.h b/include/linux/xfrm.h
index 5154064..66343d3 100644
--- a/include/linux/xfrm.h
+++ b/include/linux/xfrm.h
@@ -234,6 +234,7 @@ enum xfrm_attr_type_t {
XFRMA_REPLAY_VAL,
XFRMA_REPLAY_THRESH,
XFRMA_ETIMER_THRESH,
+   XFRMA_SRCADDR,  /* xfrm_address_t */
__XFRMA_MAX
 
 #define XFRMA_MAX (__XFRMA_MAX - 1)
diff --git a/include/net/xfrm.h b/include/net/xfrm.h
index 4933f46..bd51224 100644
--- a/include/net/xfrm.h
+++ b/include/net/xfrm.h
@@ -245,6 +245,7 @@ struct xfrm_state_afinfo {
struct xfrm_tmpl *tmpl,
xfrm_address_t *daddr, 
xfrm_address_t *saddr);
struct xfrm_state   *(*state_lookup)(xfrm_address_t *daddr, u32 
spi, u8 proto);
+   struct xfrm_state   *(*state_lookup_byaddr)(xfrm_address_t *daddr, 
xfrm_address_t *saddr, u8 proto);
struct xfrm_state   *(*find_acq)(u8 mode, u32 reqid, u8 proto, 
 xfrm_address_t *daddr, 
xfrm_address_t *saddr, 
 int create);
@@ -937,6 +938,7 @@ extern void xfrm_state_insert(struct xfr
 extern int xfrm_state_add(struct xfrm_state *x);
 extern int xfrm_state_update(struct xfrm_state *x);
 extern struct xfrm_state *xfrm_state_lookup(xfrm_address_t *daddr, u32 spi, u8 
proto, unsigned short family);
+extern struct xfrm_state *xfrm_state_lookup_byaddr(xfrm_address_t *daddr, 
xfrm_address_t *saddr, u8 proto, unsigned short family);
 extern struct xfrm_state *xfrm_find_acq_byseq(u32 seq);
 extern int xfrm_state_delete(struct xfrm_state *x);
 extern void xfrm_state_flush(u8 proto);
diff --git a/net/ipv4/xfrm4_state.c b/net/ipv4/xfrm4_state.c
index c56b258..616be13 100644
--- a/net/ipv4/xfrm4_state.c
+++ b/net/ipv4/xfrm4_state.c
@@ -80,6 +80,14 @@ __xfrm4_state_lookup(xfrm_address_t *dad
return NULL;
 }
 
+/* placeholder until ipv4's code is written */
+static struct xfrm_state *
+__xfrm4_state_lookup_byaddr(xfrm_address_t *daddr, xfrm_address_t *saddr,
+   u8 proto)
+{
+   return NULL;
+}
+
 static struct xfrm_state *
 __xfrm4_find_acq(u8 mode, u32 reqid, u8 proto, 
 xfrm_address_t *daddr, xfrm_address_t *saddr, 
@@ -137,6 +145,7 @@ static struct xfrm_state_afinfo xfrm4_st
.init_flags = xfrm4_init_flags,
.init_tempsel   = __xfrm4_init_tempsel,
.state_lookup   = __xfrm4_state_lookup,
+   .state_lookup_byaddr= __xfrm4_state_lookup_byaddr,
.find_acq   = __xfrm4_find_acq,
 };
 
diff --git a/net/ipv6/xfrm6_state.c b/net/ipv6/xfrm6_state.c
index 2fb0785..9c95b9d 100644
--- a/net/ipv6/xfrm6_state.c
+++ b/net/ipv6/xfrm6_state.c
@@ -64,6 +64,26 @@ __xfrm6_init_tempsel(struct xfrm_state *
 }
 
 static struct xfrm_state *
+__xfrm6_state_lookup_byaddr(xfrm_address_t *daddr, xfrm_address_t *saddr,
+   u8 proto)
+{
+   struct xfrm_state *x = NULL;
+   unsigned h;
+
+   h = __xfrm6_src_hash(saddr);
+   list_for_each_entry(x, xfrm6_state_afinfo.state_bysrc+h, bysrc) {
+   if (x-props.family == AF_INET6 
+   ipv6_addr_equal((struct in6_addr *)daddr, (struct in6_addr 
*)x-id.daddr.a6) 
+   ipv6_addr_equal((struct in6_addr *)saddr, (struct in6_addr 
*)x-props.saddr.a6) 
+   proto == x-id.proto) {
+   xfrm_state_hold(x);
+   return x;
+   }
+   }
+   return NULL;
+}
+
+static struct xfrm_state *
 __xfrm6_state_lookup(xfrm_address_t *daddr, u32 spi, u8 proto)
 {
unsigned h = __xfrm6_spi_hash(daddr, spi, proto);
@@ -140,6 +160,7 @@ static struct xfrm_state_afinfo xfrm6_st
.family = AF_INET6,
.init_tempsel   = __xfrm6_init_tempsel,
.state_lookup   = __xfrm6_state_lookup,
+   .state_lookup_byaddr= __xfrm6_state_lookup_byaddr,
.find_acq   = __xfrm6_find_acq,
 };
 
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c
index 2a99928..11f480b 100644
--- a/net/xfrm/xfrm_state.c
+++ 

Re: [PATCH 6/44] [XFRM] STATE: Search by address using source address list.

2006-08-23 Thread David Miller
From: YOSHIFUJI Hideaki [EMAIL PROTECTED]
Date: Thu, 24 Aug 2006 00:02:07 +0900

 From: Masahide NAKAMURA [EMAIL PROTECTED]
 
 This is a support to search transformation states by its addresses
 by using source address list for Mobile IPv6 usage.
 To use it from user-space, it is also added a message type for
 source address as a xfrm state option.
 Based on MIPL2 kernel patch.
 
 Signed-off-by: Masahide NAKAMURA [EMAIL PROTECTED]
 Signed-off-by: YOSHIFUJI Hideaki [EMAIL PROTECTED]

Applied to net-2.6.19, thanks a lot.
-
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