diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2005-06-20 16:18:08 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2005-06-20 16:18:08 -0400 |
commit | 72cb6962a91f2af9eef69a06198e1949c10259ae (patch) | |
tree | 3ae65d1c4e7d7cb7ac05bfc6f457312df45f6996 | |
parent | 3f7a87d2fa9b42f7aade43914f060df68cc89cc7 (diff) |
[IPSEC]: Add xfrm_init_state
This patch adds xfrm_init_state which is simply a wrapper that calls
xfrm_get_type and subsequently x->type->init_state. It also gets rid
of the unused args argument.
Abstracting it out allows us to add common initialisation code, e.g.,
to set family-specific flags.
The add_time setting in xfrm_user.c was deleted because it's already
set by xfrm_state_alloc.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Acked-by: James Morris <jmorris@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | include/net/xfrm.h | 3 | ||||
-rw-r--r-- | net/ipv4/ah4.c | 2 | ||||
-rw-r--r-- | net/ipv4/esp4.c | 2 | ||||
-rw-r--r-- | net/ipv4/ipcomp.c | 11 | ||||
-rw-r--r-- | net/ipv4/xfrm4_tunnel.c | 2 | ||||
-rw-r--r-- | net/ipv6/ah6.c | 2 | ||||
-rw-r--r-- | net/ipv6/esp6.c | 2 | ||||
-rw-r--r-- | net/ipv6/ipcomp6.c | 9 | ||||
-rw-r--r-- | net/ipv6/xfrm6_tunnel.c | 2 | ||||
-rw-r--r-- | net/key/af_key.c | 12 | ||||
-rw-r--r-- | net/xfrm/xfrm_policy.c | 1 | ||||
-rw-r--r-- | net/xfrm/xfrm_state.c | 21 | ||||
-rw-r--r-- | net/xfrm/xfrm_user.c | 9 |
13 files changed, 38 insertions, 40 deletions
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 0e65e02b7a1d..77bfdde440f8 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
@@ -225,7 +225,7 @@ struct xfrm_type | |||
225 | struct module *owner; | 225 | struct module *owner; |
226 | __u8 proto; | 226 | __u8 proto; |
227 | 227 | ||
228 | int (*init_state)(struct xfrm_state *x, void *args); | 228 | int (*init_state)(struct xfrm_state *x); |
229 | void (*destructor)(struct xfrm_state *); | 229 | void (*destructor)(struct xfrm_state *); |
230 | int (*input)(struct xfrm_state *, struct xfrm_decap_state *, struct sk_buff *skb); | 230 | int (*input)(struct xfrm_state *, struct xfrm_decap_state *, struct sk_buff *skb); |
231 | int (*post_input)(struct xfrm_state *, struct xfrm_decap_state *, struct sk_buff *skb); | 231 | int (*post_input)(struct xfrm_state *, struct xfrm_decap_state *, struct sk_buff *skb); |
@@ -839,6 +839,7 @@ extern int xfrm_replay_check(struct xfrm_state *x, u32 seq); | |||
839 | extern void xfrm_replay_advance(struct xfrm_state *x, u32 seq); | 839 | extern void xfrm_replay_advance(struct xfrm_state *x, u32 seq); |
840 | extern int xfrm_state_check(struct xfrm_state *x, struct sk_buff *skb); | 840 | extern int xfrm_state_check(struct xfrm_state *x, struct sk_buff *skb); |
841 | extern int xfrm_state_mtu(struct xfrm_state *x, int mtu); | 841 | extern int xfrm_state_mtu(struct xfrm_state *x, int mtu); |
842 | extern int xfrm_init_state(struct xfrm_state *x); | ||
842 | extern int xfrm4_rcv(struct sk_buff *skb); | 843 | extern int xfrm4_rcv(struct sk_buff *skb); |
843 | extern int xfrm4_output(struct sk_buff *skb); | 844 | extern int xfrm4_output(struct sk_buff *skb); |
844 | extern int xfrm4_tunnel_register(struct xfrm_tunnel *handler); | 845 | extern int xfrm4_tunnel_register(struct xfrm_tunnel *handler); |
diff --git a/net/ipv4/ah4.c b/net/ipv4/ah4.c index 0e98f2235b6e..514c85b2631a 100644 --- a/net/ipv4/ah4.c +++ b/net/ipv4/ah4.c | |||
@@ -200,7 +200,7 @@ static void ah4_err(struct sk_buff *skb, u32 info) | |||
200 | xfrm_state_put(x); | 200 | xfrm_state_put(x); |
201 | } | 201 | } |
202 | 202 | ||
203 | static int ah_init_state(struct xfrm_state *x, void *args) | 203 | static int ah_init_state(struct xfrm_state *x) |
204 | { | 204 | { |
205 | struct ah_data *ahp = NULL; | 205 | struct ah_data *ahp = NULL; |
206 | struct xfrm_algo_desc *aalg_desc; | 206 | struct xfrm_algo_desc *aalg_desc; |
diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c index eae84cc39d3f..ba57446d5d1f 100644 --- a/net/ipv4/esp4.c +++ b/net/ipv4/esp4.c | |||
@@ -362,7 +362,7 @@ static void esp_destroy(struct xfrm_state *x) | |||
362 | kfree(esp); | 362 | kfree(esp); |
363 | } | 363 | } |
364 | 364 | ||
365 | static int esp_init_state(struct xfrm_state *x, void *args) | 365 | static int esp_init_state(struct xfrm_state *x) |
366 | { | 366 | { |
367 | struct esp_data *esp = NULL; | 367 | struct esp_data *esp = NULL; |
368 | 368 | ||
diff --git a/net/ipv4/ipcomp.c b/net/ipv4/ipcomp.c index 1a23c5263b99..2065944fd9e5 100644 --- a/net/ipv4/ipcomp.c +++ b/net/ipv4/ipcomp.c | |||
@@ -236,15 +236,10 @@ static struct xfrm_state *ipcomp_tunnel_create(struct xfrm_state *x) | |||
236 | t->props.mode = 1; | 236 | t->props.mode = 1; |
237 | t->props.saddr.a4 = x->props.saddr.a4; | 237 | t->props.saddr.a4 = x->props.saddr.a4; |
238 | t->props.flags = x->props.flags; | 238 | t->props.flags = x->props.flags; |
239 | 239 | ||
240 | t->type = xfrm_get_type(IPPROTO_IPIP, t->props.family); | 240 | if (xfrm_init_state(t)) |
241 | if (t->type == NULL) | ||
242 | goto error; | ||
243 | |||
244 | if (t->type->init_state(t, NULL)) | ||
245 | goto error; | 241 | goto error; |
246 | 242 | ||
247 | t->km.state = XFRM_STATE_VALID; | ||
248 | atomic_set(&t->tunnel_users, 1); | 243 | atomic_set(&t->tunnel_users, 1); |
249 | out: | 244 | out: |
250 | return t; | 245 | return t; |
@@ -422,7 +417,7 @@ static void ipcomp_destroy(struct xfrm_state *x) | |||
422 | kfree(ipcd); | 417 | kfree(ipcd); |
423 | } | 418 | } |
424 | 419 | ||
425 | static int ipcomp_init_state(struct xfrm_state *x, void *args) | 420 | static int ipcomp_init_state(struct xfrm_state *x) |
426 | { | 421 | { |
427 | int err; | 422 | int err; |
428 | struct ipcomp_data *ipcd; | 423 | struct ipcomp_data *ipcd; |
diff --git a/net/ipv4/xfrm4_tunnel.c b/net/ipv4/xfrm4_tunnel.c index 413191f585f6..e1fe360ed27a 100644 --- a/net/ipv4/xfrm4_tunnel.c +++ b/net/ipv4/xfrm4_tunnel.c | |||
@@ -84,7 +84,7 @@ static void ipip_err(struct sk_buff *skb, u32 info) | |||
84 | handler->err_handler(skb, &arg); | 84 | handler->err_handler(skb, &arg); |
85 | } | 85 | } |
86 | 86 | ||
87 | static int ipip_init_state(struct xfrm_state *x, void *args) | 87 | static int ipip_init_state(struct xfrm_state *x) |
88 | { | 88 | { |
89 | if (!x->props.mode) | 89 | if (!x->props.mode) |
90 | return -EINVAL; | 90 | return -EINVAL; |
diff --git a/net/ipv6/ah6.c b/net/ipv6/ah6.c index e3ecf626cbf7..986fdfdccbcd 100644 --- a/net/ipv6/ah6.c +++ b/net/ipv6/ah6.c | |||
@@ -339,7 +339,7 @@ static void ah6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
339 | xfrm_state_put(x); | 339 | xfrm_state_put(x); |
340 | } | 340 | } |
341 | 341 | ||
342 | static int ah6_init_state(struct xfrm_state *x, void *args) | 342 | static int ah6_init_state(struct xfrm_state *x) |
343 | { | 343 | { |
344 | struct ah_data *ahp = NULL; | 344 | struct ah_data *ahp = NULL; |
345 | struct xfrm_algo_desc *aalg_desc; | 345 | struct xfrm_algo_desc *aalg_desc; |
diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c index be7095d6babe..324db62515a2 100644 --- a/net/ipv6/esp6.c +++ b/net/ipv6/esp6.c | |||
@@ -296,7 +296,7 @@ static void esp6_destroy(struct xfrm_state *x) | |||
296 | kfree(esp); | 296 | kfree(esp); |
297 | } | 297 | } |
298 | 298 | ||
299 | static int esp6_init_state(struct xfrm_state *x, void *args) | 299 | static int esp6_init_state(struct xfrm_state *x) |
300 | { | 300 | { |
301 | struct esp_data *esp = NULL; | 301 | struct esp_data *esp = NULL; |
302 | 302 | ||
diff --git a/net/ipv6/ipcomp6.c b/net/ipv6/ipcomp6.c index 6cde5310cd76..423feb46ccc0 100644 --- a/net/ipv6/ipcomp6.c +++ b/net/ipv6/ipcomp6.c | |||
@@ -234,14 +234,9 @@ static struct xfrm_state *ipcomp6_tunnel_create(struct xfrm_state *x) | |||
234 | t->props.mode = 1; | 234 | t->props.mode = 1; |
235 | memcpy(t->props.saddr.a6, x->props.saddr.a6, sizeof(struct in6_addr)); | 235 | memcpy(t->props.saddr.a6, x->props.saddr.a6, sizeof(struct in6_addr)); |
236 | 236 | ||
237 | t->type = xfrm_get_type(IPPROTO_IPV6, t->props.family); | 237 | if (xfrm_init_state(t)) |
238 | if (t->type == NULL) | ||
239 | goto error; | 238 | goto error; |
240 | 239 | ||
241 | if (t->type->init_state(t, NULL)) | ||
242 | goto error; | ||
243 | |||
244 | t->km.state = XFRM_STATE_VALID; | ||
245 | atomic_set(&t->tunnel_users, 1); | 240 | atomic_set(&t->tunnel_users, 1); |
246 | 241 | ||
247 | out: | 242 | out: |
@@ -420,7 +415,7 @@ static void ipcomp6_destroy(struct xfrm_state *x) | |||
420 | xfrm6_tunnel_free_spi((xfrm_address_t *)&x->props.saddr); | 415 | xfrm6_tunnel_free_spi((xfrm_address_t *)&x->props.saddr); |
421 | } | 416 | } |
422 | 417 | ||
423 | static int ipcomp6_init_state(struct xfrm_state *x, void *args) | 418 | static int ipcomp6_init_state(struct xfrm_state *x) |
424 | { | 419 | { |
425 | int err; | 420 | int err; |
426 | struct ipcomp_data *ipcd; | 421 | struct ipcomp_data *ipcd; |
diff --git a/net/ipv6/xfrm6_tunnel.c b/net/ipv6/xfrm6_tunnel.c index ffcadd68b951..60c26c87277e 100644 --- a/net/ipv6/xfrm6_tunnel.c +++ b/net/ipv6/xfrm6_tunnel.c | |||
@@ -466,7 +466,7 @@ static void xfrm6_tunnel_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
466 | return; | 466 | return; |
467 | } | 467 | } |
468 | 468 | ||
469 | static int xfrm6_tunnel_init_state(struct xfrm_state *x, void *args) | 469 | static int xfrm6_tunnel_init_state(struct xfrm_state *x) |
470 | { | 470 | { |
471 | if (!x->props.mode) | 471 | if (!x->props.mode) |
472 | return -EINVAL; | 472 | return -EINVAL; |
diff --git a/net/key/af_key.c b/net/key/af_key.c index 98b72f2024ff..652dd09ccd3a 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c | |||
@@ -1096,17 +1096,11 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct sadb_msg *hdr, | |||
1096 | } | 1096 | } |
1097 | } | 1097 | } |
1098 | 1098 | ||
1099 | x->type = xfrm_get_type(proto, x->props.family); | 1099 | err = xfrm_init_state(x); |
1100 | if (x->type == NULL) { | 1100 | if (err) |
1101 | err = -ENOPROTOOPT; | ||
1102 | goto out; | ||
1103 | } | ||
1104 | if (x->type->init_state(x, NULL)) { | ||
1105 | err = -EINVAL; | ||
1106 | goto out; | 1101 | goto out; |
1107 | } | 1102 | |
1108 | x->km.seq = hdr->sadb_msg_seq; | 1103 | x->km.seq = hdr->sadb_msg_seq; |
1109 | x->km.state = XFRM_STATE_VALID; | ||
1110 | return x; | 1104 | return x; |
1111 | 1105 | ||
1112 | out: | 1106 | out: |
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 0a4260719a12..d65ed8684fc1 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
@@ -118,7 +118,6 @@ retry: | |||
118 | xfrm_policy_put_afinfo(afinfo); | 118 | xfrm_policy_put_afinfo(afinfo); |
119 | return type; | 119 | return type; |
120 | } | 120 | } |
121 | EXPORT_SYMBOL(xfrm_get_type); | ||
122 | 121 | ||
123 | int xfrm_dst_lookup(struct xfrm_dst **dst, struct flowi *fl, | 122 | int xfrm_dst_lookup(struct xfrm_dst **dst, struct flowi *fl, |
124 | unsigned short family) | 123 | unsigned short family) |
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 2537f26f097c..1845b73d69f9 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c | |||
@@ -1055,6 +1055,27 @@ int xfrm_state_mtu(struct xfrm_state *x, int mtu) | |||
1055 | } | 1055 | } |
1056 | 1056 | ||
1057 | EXPORT_SYMBOL(xfrm_state_mtu); | 1057 | EXPORT_SYMBOL(xfrm_state_mtu); |
1058 | |||
1059 | int xfrm_init_state(struct xfrm_state *x) | ||
1060 | { | ||
1061 | int err; | ||
1062 | |||
1063 | err = -ENOENT; | ||
1064 | x->type = xfrm_get_type(x->id.proto, x->props.family); | ||
1065 | if (x->type == NULL) | ||
1066 | goto error; | ||
1067 | |||
1068 | err = x->type->init_state(x); | ||
1069 | if (err) | ||
1070 | goto error; | ||
1071 | |||
1072 | x->km.state = XFRM_STATE_VALID; | ||
1073 | |||
1074 | error: | ||
1075 | return err; | ||
1076 | } | ||
1077 | |||
1078 | EXPORT_SYMBOL(xfrm_init_state); | ||
1058 | 1079 | ||
1059 | void __init xfrm_state_init(void) | 1080 | void __init xfrm_state_init(void) |
1060 | { | 1081 | { |
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index 5ce8558eac91..ecade4893a13 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
@@ -249,17 +249,10 @@ static struct xfrm_state *xfrm_state_construct(struct xfrm_usersa_info *p, | |||
249 | if ((err = attach_encap_tmpl(&x->encap, xfrma[XFRMA_ENCAP-1]))) | 249 | if ((err = attach_encap_tmpl(&x->encap, xfrma[XFRMA_ENCAP-1]))) |
250 | goto error; | 250 | goto error; |
251 | 251 | ||
252 | err = -ENOENT; | 252 | err = xfrm_init_state(x); |
253 | x->type = xfrm_get_type(x->id.proto, x->props.family); | ||
254 | if (x->type == NULL) | ||
255 | goto error; | ||
256 | |||
257 | err = x->type->init_state(x, NULL); | ||
258 | if (err) | 253 | if (err) |
259 | goto error; | 254 | goto error; |
260 | 255 | ||
261 | x->curlft.add_time = (unsigned long) xtime.tv_sec; | ||
262 | x->km.state = XFRM_STATE_VALID; | ||
263 | x->km.seq = p->seq; | 256 | x->km.seq = p->seq; |
264 | 257 | ||
265 | return x; | 258 | return x; |