Message ID | 1340007856-27651-2-git-send-email-fan.du@windriver.com |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
On Mon, Jun 18, 2012 at 04:24:16PM +0800, fan.du wrote: > After SA is setup, one timer is armed to detect soft/hard expiration, > however the timer handler uses xtime to do the math. This makes hard > expiration occurs first before soft expiration after setting new date > with big interval. As a result new child SA is deleted before rekeying > the new one. > > Signed-off-by: fan.du <fan.du@windriver.com> > --- > include/net/xfrm.h | 2 ++ > net/xfrm/xfrm_state.c | 22 ++++++++++++++++++---- > 2 files changed, 20 insertions(+), 4 deletions(-) > > diff --git a/include/net/xfrm.h b/include/net/xfrm.h > index 2933d74..1734acc 100644 > --- a/include/net/xfrm.h > +++ b/include/net/xfrm.h > @@ -214,6 +214,8 @@ struct xfrm_state > /* Private data of this transformer, format is opaque, > * interpreted by xfrm_type methods. */ > void *data; > + u32 flags; We already have the xflags field, it holds exactly one flag at the moment. So I think we don't need yet another u32 that holds one flag too. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 2012年06月18日 19:05, Steffen Klassert wrote: > On Mon, Jun 18, 2012 at 04:24:16PM +0800, fan.du wrote: >> After SA is setup, one timer is armed to detect soft/hard expiration, >> however the timer handler uses xtime to do the math. This makes hard >> expiration occurs first before soft expiration after setting new date >> with big interval. As a result new child SA is deleted before rekeying >> the new one. >> >> Signed-off-by: fan.du<fan.du@windriver.com> >> --- >> include/net/xfrm.h | 2 ++ >> net/xfrm/xfrm_state.c | 22 ++++++++++++++++++---- >> 2 files changed, 20 insertions(+), 4 deletions(-) >> >> diff --git a/include/net/xfrm.h b/include/net/xfrm.h >> index 2933d74..1734acc 100644 >> --- a/include/net/xfrm.h >> +++ b/include/net/xfrm.h >> @@ -214,6 +214,8 @@ struct xfrm_state >> /* Private data of this transformer, format is opaque, >> * interpreted by xfrm_type methods. */ >> void *data; >> + u32 flags; > > We already have the xflags field, it holds exactly one flag > at the moment. So I think we don't need yet another u32 that > holds one flag too. > good point! I will make it in the next version.
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 2933d74..1734acc 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h @@ -214,6 +214,8 @@ struct xfrm_state /* Private data of this transformer, format is opaque, * interpreted by xfrm_type methods. */ void *data; + u32 flags; + long saved_tmo; }; /* xflags - make enum if more show up */ diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index fd77cf0..da2cc78 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c @@ -442,8 +442,18 @@ static void xfrm_timer_handler(unsigned long data) if (x->lft.hard_add_expires_seconds) { long tmo = x->lft.hard_add_expires_seconds + x->curlft.add_time - now; - if (tmo <= 0) - goto expired; + if (tmo <= 0) { + if (x->flags != 1) + goto expired; + else { + /* enter hard expire without soft expire first?! + * setting a new date could trigger this. + * workarbound: fix x->curflt.add_time by below: + */ + x->curlft.add_time = now - x->saved_tmo - 1; + tmo = x->lft.hard_add_expires_seconds - x->saved_tmo; + } + } if (tmo < next) next = tmo; } @@ -460,10 +470,14 @@ static void xfrm_timer_handler(unsigned long data) if (x->lft.soft_add_expires_seconds) { long tmo = x->lft.soft_add_expires_seconds + x->curlft.add_time - now; - if (tmo <= 0) + if (tmo <= 0) { warn = 1; - else if (tmo < next) + x->flags = 0; + } else if (tmo < next) { next = tmo; + x->flags = 1; + x->saved_tmo = tmo; + } } if (x->lft.soft_use_expires_seconds) { long tmo = x->lft.soft_use_expires_seconds +
After SA is setup, one timer is armed to detect soft/hard expiration, however the timer handler uses xtime to do the math. This makes hard expiration occurs first before soft expiration after setting new date with big interval. As a result new child SA is deleted before rekeying the new one. Signed-off-by: fan.du <fan.du@windriver.com> --- include/net/xfrm.h | 2 ++ net/xfrm/xfrm_state.c | 22 ++++++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-)