All of lore.kernel.org
 help / color / mirror / Atom feed
* [RESEND][XFRM][PATCH v4] Fix unexpected SA hard expiration after setting new date
@ 2012-07-27  2:39 Fan Du
  2012-07-27  2:39 ` [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date Fan Du
  0 siblings, 1 reply; 21+ messages in thread
From: Fan Du @ 2012-07-27  2:39 UTC (permalink / raw)
  To: davem, herbert; +Cc: netdev


Hi, Dave

It has been more than one month since my last post of this patch.
Previous posting receives no objection from you and Herbert, so I
rebase it with latest linux-3.5, then it can be easily picked up.
I'm wondering could you please take a look at this patch ?

Any comments are really welcome!

Thanks


Changelog:
v1->v2
1) use xflags instead of creating new flags(suggested by Steffen Klassert)

v2->v3
1) fix email problem, and remove cc to myself(requested by David Miller)

v3->v4
1) fix typo when clearing XFRM_SOFT_EXPIRE(thanks for David Miller)
2) fix email problem, and remove cc to myself AGAIN!!!


*Background*:
Once IPsec SAs are created between two peers, kernel setup a timer to monitor
two events: soft/hard expiration. However the timer handler use xtime to
caculate whether it's soft or hard expiration event.

normal code flow(hard expire time:100s, soft expire time:82s)

a) When new SAs created, xfrm_timer_handler is called one second
after its creation. At this point, calculate soft expire
interval(81s), setup the timer;

b) soft expire occur, rearm the timer with hard expire interval(18s)
then notify racoon2 about soft expire event. racoon2 will create
new SAs.

c) hard expire happen, notify racoon2 about it. racoon2 will delete
the old SAs.

*Scenario*:
Setting a new date before b),and after a) could result c) happens first,
As a result, old SAs is deleted before new ones are created. Normally
new SAs will be created by the next time networking traffic, but there
is a small time being when networking connection is down, this could
result in upper layer connections failed in tel comm area, thus it's
better to keep it strict in sequence.

*Workaround*:
set new time could happen:
1) before a), then SAs is updated with new time.
2) before b),and after a)
2a) When new SAs created, xfrm_timer_handler is called one second
after its creation. At this point, calculate soft expire
interval(81s), setup the timer;(set flag to mark next time should
be soft time expire)

<<---- new date comes

2b) soft expire occur, the calculation results in a hard time expire
event, but flag is set, so catch ya. Sync the addtime, and rearm
the timer with hard expire interval(18s), then notify racoon2
about soft expire event;

2c) hard expire happen, notify racoon2 about it;
so everything is in order.

3) after b), hard expire always happened anyway.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date
  2012-07-27  2:39 [RESEND][XFRM][PATCH v4] Fix unexpected SA hard expiration after setting new date Fan Du
@ 2012-07-27  2:39 ` Fan Du
  2012-07-30  6:15   ` David Miller
  0 siblings, 1 reply; 21+ messages in thread
From: Fan Du @ 2012-07-27  2:39 UTC (permalink / raw)
  To: davem, herbert; +Cc: netdev

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 <fdu@windriver.com>
---
 include/net/xfrm.h    |    4 ++++
 net/xfrm/xfrm_state.c |   22 ++++++++++++++++++----
 2 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/include/net/xfrm.h b/include/net/xfrm.h
index d9509eb..62b619e 100644
--- a/include/net/xfrm.h
+++ b/include/net/xfrm.h
@@ -213,6 +213,9 @@ struct xfrm_state {
 	struct xfrm_lifetime_cur curlft;
 	struct tasklet_hrtimer	mtimer;
 
+	/* used to fix curlft->add_time when changing date */
+	long		saved_tmo;
+
 	/* Last used time */
 	unsigned long		lastused;
 
@@ -238,6 +241,7 @@ static inline struct net *xs_net(struct xfrm_state *x)
 
 /* xflags - make enum if more show up */
 #define XFRM_TIME_DEFER	1
+#define XFRM_SOFT_EXPIRE 2
 
 enum {
 	XFRM_STATE_VOID,
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c
index 5b228f9..fb64dc6 100644
--- a/net/xfrm/xfrm_state.c
+++ b/net/xfrm/xfrm_state.c
@@ -415,8 +415,18 @@ static enum hrtimer_restart xfrm_timer_handler(struct hrtimer * me)
 	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->xflags & XFRM_SOFT_EXPIRE) {
+				/* 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;
+			
+			} else
+				goto expired;
+		}
 		if (tmo < next)
 			next = tmo;
 	}
@@ -433,10 +443,14 @@ static enum hrtimer_restart xfrm_timer_handler(struct hrtimer * me)
 	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->xflags &= ~XFRM_SOFT_EXPIRE;
+		} else if (tmo < next) {
 			next = tmo;
+			x->xflags |= XFRM_SOFT_EXPIRE;
+			x->saved_tmo = tmo;
+		}
 	}
 	if (x->lft.soft_use_expires_seconds) {
 		long tmo = x->lft.soft_use_expires_seconds +
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date
  2012-07-27  2:39 ` [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date Fan Du
@ 2012-07-30  6:15   ` David Miller
  0 siblings, 0 replies; 21+ messages in thread
From: David Miller @ 2012-07-30  6:15 UTC (permalink / raw)
  To: fdu; +Cc: herbert, netdev

From: Fan Du <fdu@windriver.com>
Date: Fri, 27 Jul 2012 10:39:19 +0800

> +				x->curlft.add_time = now - x->saved_tmo - 1;
> +				tmo = x->lft.hard_add_expires_seconds - x->saved_tmo;
> +			
   ^^^^^^^^^^^^^^^^
> +			} else

Unnecessary empty line, please remove it.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date
  2012-08-02  7:23     ` David Miller
  2012-08-02  7:23       ` David Miller
@ 2012-08-02  8:58       ` Fan Du
  1 sibling, 0 replies; 21+ messages in thread
From: Fan Du @ 2012-08-02  8:58 UTC (permalink / raw)
  To: David Miller; +Cc: herbert, netdev

Hi, all

*Apologize* for all the trouble I brought to everyone, who gave me
advices/suggestions using fdu@windriver.com.
I'm truly sorry that all the inconvenience caused by my mistake.

fdu@windriver.com is obsolete!!!
I will use fan.du@windriver.com from now on.

Thanks


On 2012年08月02日 15:23, David Miller wrote:
>
> You know what Fan Du, I'm extremely irritated about your email
> situation.
>
> Every time you post a patch, I reply, and I get this crap:
>
> Diagnostic-Code: smtp; 5.1.0 - Unknown address error 550-'5.2.1<fdu@windriver.com>... Mailbox disabled for this recipient' (delivery attempts: 0)
>
> I've seen this at least 7 times, and this absolutely has to stop.
>
> Otherwise I'm ignoring every patch you submit, it's as simple as
> that.
> --
> 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
>

-- 

Love each day!
--fan

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date
  2012-08-02  7:23     ` David Miller
@ 2012-08-02  7:23       ` David Miller
  2012-08-02  8:58       ` Fan Du
  1 sibling, 0 replies; 21+ messages in thread
From: David Miller @ 2012-08-02  7:23 UTC (permalink / raw)
  To: fdu; +Cc: herbert, netdev

From: David Miller <davem@davemloft.net>
Date: Thu, 02 Aug 2012 00:23:08 -0700 (PDT)

> 
> You know what Fan Du, I'm extremely irritated about your email
> situation.
> 
> Every time you post a patch, I reply, and I get this crap:

And this email triggered it too, what gives?

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date
  2012-08-02  7:21   ` David Miller
@ 2012-08-02  7:23     ` David Miller
  2012-08-02  7:23       ` David Miller
  2012-08-02  8:58       ` Fan Du
  0 siblings, 2 replies; 21+ messages in thread
From: David Miller @ 2012-08-02  7:23 UTC (permalink / raw)
  To: fdu; +Cc: herbert, netdev


You know what Fan Du, I'm extremely irritated about your email
situation.

Every time you post a patch, I reply, and I get this crap:

Diagnostic-Code: smtp; 5.1.0 - Unknown address error 550-'5.2.1 <fdu@windriver.com>... Mailbox disabled for this recipient' (delivery attempts: 0)

I've seen this at least 7 times, and this absolutely has to stop.

Otherwise I'm ignoring every patch you submit, it's as simple as
that.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date
  2012-07-31  7:43 ` [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date Fan Du
@ 2012-08-02  7:21   ` David Miller
  2012-08-02  7:23     ` David Miller
  0 siblings, 1 reply; 21+ messages in thread
From: David Miller @ 2012-08-02  7:21 UTC (permalink / raw)
  To: fdu; +Cc: herbert, netdev

From: Fan Du <fdu@windriver.com>
Date: Tue, 31 Jul 2012 15:43:54 +0800

> 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 <fdu@windriver.com>

Applied.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date
  2012-07-31  7:43 [XFRM][PATCH v5] Fix unexpected SA hard expiration after setting new date Fan Du
@ 2012-07-31  7:43 ` Fan Du
  2012-08-02  7:21   ` David Miller
  0 siblings, 1 reply; 21+ messages in thread
From: Fan Du @ 2012-07-31  7:43 UTC (permalink / raw)
  To: davem, herbert; +Cc: netdev

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 <fdu@windriver.com>
---
 include/net/xfrm.h    |    4 ++++
 net/xfrm/xfrm_state.c |   22 ++++++++++++++++++----
 2 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/include/net/xfrm.h b/include/net/xfrm.h
index d9509eb..62b619e 100644
--- a/include/net/xfrm.h
+++ b/include/net/xfrm.h
@@ -213,6 +213,9 @@ struct xfrm_state {
 	struct xfrm_lifetime_cur curlft;
 	struct tasklet_hrtimer	mtimer;
 
+	/* used to fix curlft->add_time when changing date */
+	long		saved_tmo;
+
 	/* Last used time */
 	unsigned long		lastused;
 
@@ -238,6 +241,7 @@ static inline struct net *xs_net(struct xfrm_state *x)
 
 /* xflags - make enum if more show up */
 #define XFRM_TIME_DEFER	1
+#define XFRM_SOFT_EXPIRE 2
 
 enum {
 	XFRM_STATE_VOID,
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c
index 5b228f9..fb64dc6 100644
--- a/net/xfrm/xfrm_state.c
+++ b/net/xfrm/xfrm_state.c
@@ -415,8 +415,17 @@ static enum hrtimer_restart xfrm_timer_handler(struct hrtimer * me)
 	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->xflags & XFRM_SOFT_EXPIRE) {
+				/* 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;
+			} else
+				goto expired;
+		}
 		if (tmo < next)
 			next = tmo;
 	}
@@ -433,10 +443,14 @@ static enum hrtimer_restart xfrm_timer_handler(struct hrtimer * me)
 	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->xflags &= ~XFRM_SOFT_EXPIRE;
+		} else if (tmo < next) {
 			next = tmo;
+			x->xflags |= XFRM_SOFT_EXPIRE;
+			x->saved_tmo = tmo;
+		}
 	}
 	if (x->lft.soft_use_expires_seconds) {
 		long tmo = x->lft.soft_use_expires_seconds +
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date
  2012-06-21  6:26 ` [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date Fan Du
@ 2012-06-25 22:29   ` David Miller
  0 siblings, 0 replies; 21+ messages in thread
From: David Miller @ 2012-06-25 22:29 UTC (permalink / raw)
  To: fdu; +Cc: herbert, netdev

From: Fan Du <fdu@windriver.com>
Date: Thu, 21 Jun 2012 14:26:01 +0800

> 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 <fdu@windriver.com>
> ---
>  include/net/xfrm.h    |  3 +++
>  net/xfrm/xfrm_state.c | 21 +++++++++++++++++----
>  2 files changed, 20 insertions(+), 4 deletions(-)
> 
> diff --git a/include/net/xfrm.h b/include/net/xfrm.h
> index 2933d74..8d16777 100644
> --- a/include/net/xfrm.h
> +++ b/include/net/xfrm.h
> @@ -197,6 +197,8 @@ struct xfrm_state
>  
>  	struct xfrm_lifetime_cur curlft;
>  	struct timer_list	timer;
> +	/* used to fix curlft->add_time when changing date */
> +	long		saved_tmo;

'saved_tmo' is not properly indented to line up with the
struct member names above it.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date
  2012-06-21  3:43         ` David Miller
@ 2012-06-21  6:41           ` Fan Du
  0 siblings, 0 replies; 21+ messages in thread
From: Fan Du @ 2012-06-21  6:41 UTC (permalink / raw)
  To: David Miller; +Cc: herbert, netdev

Hi, David

On 2012年06月21日 11:43, David Miller wrote:
> From: Fan Du<fan.du@windriver.com>
> Date: Thu, 21 Jun 2012 10:11:51 +0800
>
>> Could you please take a look at it if you have time?
>
> Everyone saw it, you need to be patient.
>

Apologize for this noise.
Yes, I'm young, and a bit of rush :)


> And you still have fdu@windriver.com in the CC: list, which I told you
> bounces.
>
> I asked you explicitly to remove this email address from the CC: list,
> because it bounces.

I didn't do it deliberately.
Damn, must be my afternoon buzzy head!

I have sent out V4, I hope I will not make any dummy mistake.
Anyway, please review it if you have time, and I will wait for your
response *PATIENTLY*.

thanks

-- 

Love each day!
--fan

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date
  2012-06-21  6:26 [XFRM][RFC v4] Fix unexpected SA hard expiration after setting new date Fan Du
@ 2012-06-21  6:26 ` Fan Du
  2012-06-25 22:29   ` David Miller
  0 siblings, 1 reply; 21+ messages in thread
From: Fan Du @ 2012-06-21  6:26 UTC (permalink / raw)
  To: davem, herbert; +Cc: netdev

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 <fdu@windriver.com>
---
 include/net/xfrm.h    |  3 +++
 net/xfrm/xfrm_state.c | 21 +++++++++++++++++----
 2 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/include/net/xfrm.h b/include/net/xfrm.h
index 2933d74..8d16777 100644
--- a/include/net/xfrm.h
+++ b/include/net/xfrm.h
@@ -197,6 +197,8 @@ struct xfrm_state
 
 	struct xfrm_lifetime_cur curlft;
 	struct timer_list	timer;
+	/* used to fix curlft->add_time when changing date */
+	long		saved_tmo;
 
 	/* Last used time */
 	unsigned long		lastused;
@@ -218,6 +220,7 @@ struct xfrm_state
 
 /* xflags - make enum if more show up */
 #define XFRM_TIME_DEFER	1
+#define XFRM_SOFT_EXPIRE 2
 
 enum {
 	XFRM_STATE_VOID,
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c
index fd77cf0..2b55244 100644
--- a/net/xfrm/xfrm_state.c
+++ b/net/xfrm/xfrm_state.c
@@ -442,8 +442,17 @@ 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->xflags & XFRM_SOFT_EXPIRE) {
+				/* 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;
+			} else
+				goto expired;
+		}
 		if (tmo < next)
 			next = tmo;
 	}
@@ -460,10 +469,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->xflags &= ~XFRM_SOFT_EXPIRE;
+		} else if (tmo < next) {
 			next = tmo;
+			x->xflags |= XFRM_SOFT_EXPIRE;
+			x->saved_tmo = tmo;
+		}
 	}
 	if (x->lft.soft_use_expires_seconds) {
 		long tmo = x->lft.soft_use_expires_seconds +
-- 
1.7.11

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date
  2012-06-19  7:51 ` [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date fan.du
  2012-06-19  9:01   ` David Miller
@ 2012-06-21  4:06   ` David Miller
  1 sibling, 0 replies; 21+ messages in thread
From: David Miller @ 2012-06-21  4:06 UTC (permalink / raw)
  To: fan.du; +Cc: herbert, netdev, fdu

From: "fan.du" <fan.du@windriver.com>
Date: Tue, 19 Jun 2012 15:51:09 +0800

> +			x->xflags |= ~XFRM_SOFT_EXPIRE;

This is not how you clear a bit in a bitmask.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date
  2012-06-21  2:11       ` Fan Du
@ 2012-06-21  3:43         ` David Miller
  2012-06-21  6:41           ` Fan Du
  0 siblings, 1 reply; 21+ messages in thread
From: David Miller @ 2012-06-21  3:43 UTC (permalink / raw)
  To: fan.du; +Cc: herbert, netdev, fdu

From: Fan Du <fan.du@windriver.com>
Date: Thu, 21 Jun 2012 10:11:51 +0800

> Could you please take a look at it if you have time?

Everyone saw it, you need to be patient.

And you still have fdu@windriver.com in the CC: list, which I told you
bounces.

I asked you explicitly to remove this email address from the CC: list,
because it bounces.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date
  2012-06-19  9:05     ` David Miller
@ 2012-06-21  2:11       ` Fan Du
  2012-06-21  3:43         ` David Miller
  0 siblings, 1 reply; 21+ messages in thread
From: Fan Du @ 2012-06-21  2:11 UTC (permalink / raw)
  To: David Miller; +Cc: herbert, netdev, fdu

Hi David

On 2012年06月19日 17:05, David Miller wrote:
> From: David Miller<davem@davemloft.net>
> Date: Tue, 19 Jun 2012 02:01:11 -0700 (PDT)
>
>> From: "fan.du"<fan.du@windriver.com>
>> Date: Tue, 19 Jun 2012 15:51:09 +0800
>>
>>> From: "fan.du"<fan.du@windriver.com>
>>
>> Please don't put your email user name instead of real name in quotes
>> there.  Thank you.
>
> Also fdu@windriver.com bounces, do not put it in the CC: list.

I have send the V3 which made modifications requested by your advice at
here:
http://marc.info/?l=linux-netdev&m=134009837402499&w=2
http://marc.info/?l=linux-netdev&m=134009837402498&w=2

Could you please take a look at it if you have time?

thanks :)

-- 

Love each day!
--fan

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date
  2012-06-19  9:28 [XFRM][RFC v3] Fix unexpected SA hard expiration after setting new date Fan Du
@ 2012-06-19  9:28 ` Fan Du
  0 siblings, 0 replies; 21+ messages in thread
From: Fan Du @ 2012-06-19  9:28 UTC (permalink / raw)
  To: davem, herbert; +Cc: netdev

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 <fdu@windriver.com>
---
 include/net/xfrm.h    |  3 +++
 net/xfrm/xfrm_state.c | 21 +++++++++++++++++----
 2 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/include/net/xfrm.h b/include/net/xfrm.h
index 2933d74..8d16777 100644
--- a/include/net/xfrm.h
+++ b/include/net/xfrm.h
@@ -197,6 +197,8 @@ struct xfrm_state
 
 	struct xfrm_lifetime_cur curlft;
 	struct timer_list	timer;
+	/* used to fix curlft->add_time when changing date */
+	long		saved_tmo;
 
 	/* Last used time */
 	unsigned long		lastused;
@@ -218,6 +220,7 @@ struct xfrm_state
 
 /* xflags - make enum if more show up */
 #define XFRM_TIME_DEFER	1
+#define XFRM_SOFT_EXPIRE 2
 
 enum {
 	XFRM_STATE_VOID,
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c
index fd77cf0..ab4aa0f 100644
--- a/net/xfrm/xfrm_state.c
+++ b/net/xfrm/xfrm_state.c
@@ -442,8 +442,17 @@ 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->xflags & XFRM_SOFT_EXPIRE) {
+				/* 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;
+			} else
+				goto expired;
+		}
 		if (tmo < next)
 			next = tmo;
 	}
@@ -460,10 +469,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->xflags |= ~XFRM_SOFT_EXPIRE;
+		} else if (tmo < next) {
 			next = tmo;
+			x->xflags |= XFRM_SOFT_EXPIRE;
+			x->saved_tmo = tmo;
+		}
 	}
 	if (x->lft.soft_use_expires_seconds) {
 		long tmo = x->lft.soft_use_expires_seconds +
-- 
1.7.11

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date
  2012-06-19  9:01   ` David Miller
@ 2012-06-19  9:05     ` David Miller
  2012-06-21  2:11       ` Fan Du
  0 siblings, 1 reply; 21+ messages in thread
From: David Miller @ 2012-06-19  9:05 UTC (permalink / raw)
  To: fan.du; +Cc: herbert, netdev, fdu

From: David Miller <davem@davemloft.net>
Date: Tue, 19 Jun 2012 02:01:11 -0700 (PDT)

> From: "fan.du" <fan.du@windriver.com>
> Date: Tue, 19 Jun 2012 15:51:09 +0800
> 
>> From: "fan.du" <fan.du@windriver.com>
> 
> Please don't put your email user name instead of real name in quotes
> there.  Thank you.

Also fdu@windriver.com bounces, do not put it in the CC: list.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date
  2012-06-19  7:51 ` [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date fan.du
@ 2012-06-19  9:01   ` David Miller
  2012-06-19  9:05     ` David Miller
  2012-06-21  4:06   ` David Miller
  1 sibling, 1 reply; 21+ messages in thread
From: David Miller @ 2012-06-19  9:01 UTC (permalink / raw)
  To: fan.du; +Cc: herbert, netdev, fdu

From: "fan.du" <fan.du@windriver.com>
Date: Tue, 19 Jun 2012 15:51:09 +0800

> From: "fan.du" <fan.du@windriver.com>

Please don't put your email user name instead of real name in quotes
there.  Thank you.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date
  2012-06-19  7:51 [XFRM][RFC v2] Fix unexpected SA hard expiration after setting new date fan.du
@ 2012-06-19  7:51 ` fan.du
  2012-06-19  9:01   ` David Miller
  2012-06-21  4:06   ` David Miller
  0 siblings, 2 replies; 21+ messages in thread
From: fan.du @ 2012-06-19  7:51 UTC (permalink / raw)
  To: davem, herbert; +Cc: netdev, fdu

From: "fan.du" <fan.du@windriver.com>

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    |  3 +++
 net/xfrm/xfrm_state.c | 21 +++++++++++++++++----
 2 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/include/net/xfrm.h b/include/net/xfrm.h
index 2933d74..8d16777 100644
--- a/include/net/xfrm.h
+++ b/include/net/xfrm.h
@@ -197,6 +197,8 @@ struct xfrm_state
 
 	struct xfrm_lifetime_cur curlft;
 	struct timer_list	timer;
+	/* used to fix curlft->add_time when changing date */
+	long		saved_tmo;
 
 	/* Last used time */
 	unsigned long		lastused;
@@ -218,6 +220,7 @@ struct xfrm_state
 
 /* xflags - make enum if more show up */
 #define XFRM_TIME_DEFER	1
+#define XFRM_SOFT_EXPIRE 2
 
 enum {
 	XFRM_STATE_VOID,
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c
index fd77cf0..ab4aa0f 100644
--- a/net/xfrm/xfrm_state.c
+++ b/net/xfrm/xfrm_state.c
@@ -442,8 +442,17 @@ 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->xflags & XFRM_SOFT_EXPIRE) {
+				/* 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;
+			} else
+				goto expired;
+		}
 		if (tmo < next)
 			next = tmo;
 	}
@@ -460,10 +469,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->xflags |= ~XFRM_SOFT_EXPIRE;
+		} else if (tmo < next) {
 			next = tmo;
+			x->xflags |= XFRM_SOFT_EXPIRE;
+			x->saved_tmo = tmo;
+		}
 	}
 	if (x->lft.soft_use_expires_seconds) {
 		long tmo = x->lft.soft_use_expires_seconds +
-- 
1.7.11

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date
  2012-06-18 11:05   ` Steffen Klassert
@ 2012-06-19  1:34     ` Fan Du
  0 siblings, 0 replies; 21+ messages in thread
From: Fan Du @ 2012-06-19  1:34 UTC (permalink / raw)
  To: Steffen Klassert; +Cc: davem, herbert, netdev, fdu



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.


-- 

Love each day!
--fan

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date
  2012-06-18  8:24 ` [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date fan.du
@ 2012-06-18 11:05   ` Steffen Klassert
  2012-06-19  1:34     ` Fan Du
  0 siblings, 1 reply; 21+ messages in thread
From: Steffen Klassert @ 2012-06-18 11:05 UTC (permalink / raw)
  To: fan.du; +Cc: davem, herbert, netdev, fdu

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.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date
  2012-06-18  8:24 [XFRM][RFC v1] Fix unexpected SA hard expiration after setting new date fan.du
@ 2012-06-18  8:24 ` fan.du
  2012-06-18 11:05   ` Steffen Klassert
  0 siblings, 1 reply; 21+ messages in thread
From: fan.du @ 2012-06-18  8:24 UTC (permalink / raw)
  To: davem, herbert; +Cc: netdev, fdu

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;
+	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 +
-- 
1.6.3.1

^ permalink raw reply related	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2012-08-02  8:55 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-07-27  2:39 [RESEND][XFRM][PATCH v4] Fix unexpected SA hard expiration after setting new date Fan Du
2012-07-27  2:39 ` [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date Fan Du
2012-07-30  6:15   ` David Miller
  -- strict thread matches above, loose matches on Subject: below --
2012-07-31  7:43 [XFRM][PATCH v5] Fix unexpected SA hard expiration after setting new date Fan Du
2012-07-31  7:43 ` [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date Fan Du
2012-08-02  7:21   ` David Miller
2012-08-02  7:23     ` David Miller
2012-08-02  7:23       ` David Miller
2012-08-02  8:58       ` Fan Du
2012-06-21  6:26 [XFRM][RFC v4] Fix unexpected SA hard expiration after setting new date Fan Du
2012-06-21  6:26 ` [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date Fan Du
2012-06-25 22:29   ` David Miller
2012-06-19  9:28 [XFRM][RFC v3] Fix unexpected SA hard expiration after setting new date Fan Du
2012-06-19  9:28 ` [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date Fan Du
2012-06-19  7:51 [XFRM][RFC v2] Fix unexpected SA hard expiration after setting new date fan.du
2012-06-19  7:51 ` [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date fan.du
2012-06-19  9:01   ` David Miller
2012-06-19  9:05     ` David Miller
2012-06-21  2:11       ` Fan Du
2012-06-21  3:43         ` David Miller
2012-06-21  6:41           ` Fan Du
2012-06-21  4:06   ` David Miller
2012-06-18  8:24 [XFRM][RFC v1] Fix unexpected SA hard expiration after setting new date fan.du
2012-06-18  8:24 ` [PATCH] [XFRM] Fix unexpected SA hard expiration after changing date fan.du
2012-06-18 11:05   ` Steffen Klassert
2012-06-19  1:34     ` Fan Du

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.