diff options
Diffstat (limited to 'net/xfrm/xfrm_state.c')
-rw-r--r-- | net/xfrm/xfrm_state.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index d575f0534868..dd78536d40de 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c | |||
@@ -1181,6 +1181,12 @@ static struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig, int *errp) | |||
1181 | goto error; | 1181 | goto error; |
1182 | } | 1182 | } |
1183 | 1183 | ||
1184 | if (orig->replay_esn) { | ||
1185 | err = xfrm_replay_clone(x, orig); | ||
1186 | if (err) | ||
1187 | goto error; | ||
1188 | } | ||
1189 | |||
1184 | memcpy(&x->mark, &orig->mark, sizeof(x->mark)); | 1190 | memcpy(&x->mark, &orig->mark, sizeof(x->mark)); |
1185 | 1191 | ||
1186 | err = xfrm_init_state(x); | 1192 | err = xfrm_init_state(x); |
@@ -1907,7 +1913,7 @@ int xfrm_state_mtu(struct xfrm_state *x, int mtu) | |||
1907 | return res; | 1913 | return res; |
1908 | } | 1914 | } |
1909 | 1915 | ||
1910 | int xfrm_init_state(struct xfrm_state *x) | 1916 | int __xfrm_init_state(struct xfrm_state *x, bool init_replay) |
1911 | { | 1917 | { |
1912 | struct xfrm_state_afinfo *afinfo; | 1918 | struct xfrm_state_afinfo *afinfo; |
1913 | struct xfrm_mode *inner_mode; | 1919 | struct xfrm_mode *inner_mode; |
@@ -1980,12 +1986,25 @@ int xfrm_init_state(struct xfrm_state *x) | |||
1980 | if (x->outer_mode == NULL) | 1986 | if (x->outer_mode == NULL) |
1981 | goto error; | 1987 | goto error; |
1982 | 1988 | ||
1989 | if (init_replay) { | ||
1990 | err = xfrm_init_replay(x); | ||
1991 | if (err) | ||
1992 | goto error; | ||
1993 | } | ||
1994 | |||
1983 | x->km.state = XFRM_STATE_VALID; | 1995 | x->km.state = XFRM_STATE_VALID; |
1984 | 1996 | ||
1985 | error: | 1997 | error: |
1986 | return err; | 1998 | return err; |
1987 | } | 1999 | } |
1988 | 2000 | ||
2001 | EXPORT_SYMBOL(__xfrm_init_state); | ||
2002 | |||
2003 | int xfrm_init_state(struct xfrm_state *x) | ||
2004 | { | ||
2005 | return __xfrm_init_state(x, true); | ||
2006 | } | ||
2007 | |||
1989 | EXPORT_SYMBOL(xfrm_init_state); | 2008 | EXPORT_SYMBOL(xfrm_init_state); |
1990 | 2009 | ||
1991 | int __net_init xfrm_state_init(struct net *net) | 2010 | int __net_init xfrm_state_init(struct net *net) |