]> err.no Git - linux-2.6/blobdiff - net/ipv4/xfrm4_state.c
[XFRM] STATE: Search by address using source address list.
[linux-2.6] / net / ipv4 / xfrm4_state.c
index dbabf81a9b7b4d19389c8d85e3b686026e33dd33..616be131b4e36657ec9d8b6037a562b2dec9176c 100644 (file)
@@ -42,7 +42,7 @@ __xfrm4_init_tempsel(struct xfrm_state *x, struct flowi *fl,
        x->props.saddr = tmpl->saddr;
        if (x->props.saddr.a4 == 0)
                x->props.saddr.a4 = saddr->a4;
-       if (tmpl->mode && x->props.saddr.a4 == 0) {
+       if (tmpl->mode == XFRM_MODE_TUNNEL && x->props.saddr.a4 == 0) {
                struct rtable *rt;
                struct flowi fl_tunnel = {
                        .nl_u = {
@@ -80,6 +80,14 @@ __xfrm4_state_lookup(xfrm_address_t *daddr, u32 spi, u8 proto)
        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, 
@@ -122,6 +130,9 @@ __xfrm4_find_acq(u8 mode, u32 reqid, u8 proto,
                add_timer(&x0->timer);
                xfrm_state_hold(x0);
                list_add_tail(&x0->bydst, xfrm4_state_afinfo.state_bydst+h);
+               h = __xfrm4_src_hash(saddr);
+               xfrm_state_hold(x0);
+               list_add_tail(&x0->bysrc, xfrm4_state_afinfo.state_bysrc+h);
                wake_up(&km_waitq);
        }
        if (x0)
@@ -131,10 +142,10 @@ __xfrm4_find_acq(u8 mode, u32 reqid, u8 proto,
 
 static struct xfrm_state_afinfo xfrm4_state_afinfo = {
        .family                 = AF_INET,
-       .lock                   = RW_LOCK_UNLOCKED,
        .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,
 };