diff options
Diffstat (limited to 'net/xfrm/xfrm_state.c')
| -rw-r--r-- | net/xfrm/xfrm_state.c | 8 | 
1 files changed, 8 insertions, 0 deletions
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 0c306473a79d..649bb739df0d 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c @@ -1292,6 +1292,7 @@ found:  		if (km_query(x, tmpl, pol) == 0) {  			spin_lock_bh(&net->xfrm.xfrm_state_lock);  			x->km.state = XFRM_STATE_ACQ; +			x->dir = XFRM_SA_DIR_OUT;  			list_add(&x->km.all, &net->xfrm.state_all);  			XFRM_STATE_INSERT(bydst, &x->bydst,  					  net->xfrm.state_bydst + h, @@ -1744,6 +1745,7 @@ static struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig,  	x->lastused = orig->lastused;  	x->new_mapping = 0;  	x->new_mapping_sport = 0; +	x->dir = orig->dir;  	return x; @@ -1864,8 +1866,14 @@ int xfrm_state_update(struct xfrm_state *x)  	}  	if (x1->km.state == XFRM_STATE_ACQ) { +		if (x->dir && x1->dir != x->dir) +			goto out; +  		__xfrm_state_insert(x);  		x = NULL; +	} else { +		if (x1->dir != x->dir) +			goto out;  	}  	err = 0;  |