Hi Dave: This patch consolidates the km_*expired functions in prepartion for policy notification. -- Debian GNU/Linux 3.0 is out! ( http://www.debian.org/ ) Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
Index: kernel-source-2.5/include/net/xfrm.h =================================================================== RCS file: /home/gondolin/herbert/src/CVS/debian/kernel-source-2.5/include/net/xfrm.h,v retrieving revision 1.9 diff -u -r1.9 xfrm.h --- kernel-source-2.5/include/net/xfrm.h 5 Jul 2003 07:36:20 -0000 1.9 +++ kernel-source-2.5/include/net/xfrm.h 5 Jul 2003 07:54:28 -0000 @@ -811,8 +811,7 @@ extern int xfrm_dst_lookup(struct xfrm_dst **dst, struct flowi *fl, unsigned short family); extern wait_queue_head_t km_waitq; -extern void km_warn_expired(struct xfrm_state *x); -extern void km_expired(struct xfrm_state *x); +extern void km_state_expired(struct xfrm_state *x, int hard); extern int km_query(struct xfrm_state *x, struct xfrm_tmpl *, struct xfrm_policy *pol); extern int km_new_mapping(struct xfrm_state *x, xfrm_address_t *ipaddr, u16 sport); Index: kernel-source-2.5/net/xfrm/xfrm_state.c =================================================================== RCS file: /home/gondolin/herbert/src/CVS/debian/kernel-source-2.5/net/xfrm/xfrm_state.c,v retrieving revision 1.4 diff -u -r1.4 xfrm_state.c --- kernel-source-2.5/net/xfrm/xfrm_state.c 5 Jul 2003 04:44:34 -0000 1.4 +++ kernel-source-2.5/net/xfrm/xfrm_state.c 5 Jul 2003 07:54:10 -0000 @@ -140,7 +140,7 @@ } if (warn) - km_warn_expired(x); + km_state_expired(x, 0); resched: if (next != LONG_MAX && !mod_timer(&x->timer, jiffies + make_jiffies(next))) @@ -155,7 +155,7 @@ goto resched; } if (x->id.spi != 0) - km_expired(x); + km_state_expired(x, 1); __xfrm_state_delete(x); out: @@ -522,7 +522,7 @@ if (x->curlft.bytes >= x->lft.hard_byte_limit || x->curlft.packets >= x->lft.hard_packet_limit) { - km_expired(x); + km_state_expired(x, 1); if (!mod_timer(&x->timer, jiffies + XFRM_ACQ_EXPIRES*HZ)) xfrm_state_hold(x); return -EINVAL; @@ -531,7 +531,7 @@ if (!x->km.dying && (x->curlft.bytes >= x->lft.soft_byte_limit || x->curlft.packets >= x->lft.soft_packet_limit)) - km_warn_expired(x); + km_state_expired(x, 0); return 0; } @@ -747,28 +747,22 @@ static struct list_head xfrm_km_list = LIST_HEAD_INIT(xfrm_km_list); static rwlock_t xfrm_km_lock = RW_LOCK_UNLOCKED; -void km_warn_expired(struct xfrm_state *x) +void km_state_expired(struct xfrm_state *x, int hard) { struct xfrm_mgr *km; - x->km.dying = 1; - read_lock(&xfrm_km_lock); - list_for_each_entry(km, &xfrm_km_list, list) - km->notify(x, 0); - read_unlock(&xfrm_km_lock); -} - -void km_expired(struct xfrm_state *x) -{ - struct xfrm_mgr *km; - - x->km.state = XFRM_STATE_EXPIRED; + if (hard) + x->km.state = XFRM_STATE_EXPIRED; + else + x->km.dying = 1; read_lock(&xfrm_km_lock); list_for_each_entry(km, &xfrm_km_list, list) - km->notify(x, 1); + km->notify(x, hard); read_unlock(&xfrm_km_lock); - wake_up(&km_waitq); + + if (hard) + wake_up(&km_waitq); } int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol)