diff options
author | Florian Westphal <fw@strlen.de> | 2019-03-29 16:16:22 -0400 |
---|---|---|
committer | Steffen Klassert <steffen.klassert@secunet.com> | 2019-04-08 03:13:46 -0400 |
commit | b262a69582a4676c7378a73077b7bb186c7c5b2a (patch) | |
tree | 5c71243107e5f14023de503aeb2acd2214f01d25 | |
parent | f981c57ffd2d7cf2dd4b6d6f8fcb3965df42f54c (diff) |
xfrm: place af number into xfrm_mode struct
This will be useful to know if we're supposed to decode ipv4 or ipv6.
While at it, make the unregister function return void, all module_exit
functions did just BUG(); there is never a point in doing error checks
if there is no way to handle such error.
Signed-off-by: Florian Westphal <fw@strlen.de>
Reviewed-by: Sabrina Dubroca <sd@queasysnail.net>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
-rw-r--r-- | include/net/xfrm.h | 9 | ||||
-rw-r--r-- | net/ipv4/xfrm4_mode_beet.c | 8 | ||||
-rw-r--r-- | net/ipv4/xfrm4_mode_transport.c | 8 | ||||
-rw-r--r-- | net/ipv4/xfrm4_mode_tunnel.c | 8 | ||||
-rw-r--r-- | net/ipv6/xfrm6_mode_beet.c | 8 | ||||
-rw-r--r-- | net/ipv6/xfrm6_mode_ro.c | 8 | ||||
-rw-r--r-- | net/ipv6/xfrm6_mode_transport.c | 8 | ||||
-rw-r--r-- | net/ipv6/xfrm6_mode_tunnel.c | 8 | ||||
-rw-r--r-- | net/xfrm/xfrm_state.c | 19 |
9 files changed, 32 insertions, 52 deletions
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 85386becbaea..9a155063c25f 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
@@ -482,8 +482,9 @@ struct xfrm_mode { | |||
482 | 482 | ||
483 | struct xfrm_state_afinfo *afinfo; | 483 | struct xfrm_state_afinfo *afinfo; |
484 | struct module *owner; | 484 | struct module *owner; |
485 | unsigned int encap; | 485 | u8 encap; |
486 | int flags; | 486 | u8 family; |
487 | u8 flags; | ||
487 | }; | 488 | }; |
488 | 489 | ||
489 | /* Flags for xfrm_mode. */ | 490 | /* Flags for xfrm_mode. */ |
@@ -491,8 +492,8 @@ enum { | |||
491 | XFRM_MODE_FLAG_TUNNEL = 1, | 492 | XFRM_MODE_FLAG_TUNNEL = 1, |
492 | }; | 493 | }; |
493 | 494 | ||
494 | int xfrm_register_mode(struct xfrm_mode *mode, int family); | 495 | int xfrm_register_mode(struct xfrm_mode *mode); |
495 | int xfrm_unregister_mode(struct xfrm_mode *mode, int family); | 496 | void xfrm_unregister_mode(struct xfrm_mode *mode); |
496 | 497 | ||
497 | static inline int xfrm_af2proto(unsigned int family) | 498 | static inline int xfrm_af2proto(unsigned int family) |
498 | { | 499 | { |
diff --git a/net/ipv4/xfrm4_mode_beet.c b/net/ipv4/xfrm4_mode_beet.c index 856d2dfdb44b..a2e3b52ae46c 100644 --- a/net/ipv4/xfrm4_mode_beet.c +++ b/net/ipv4/xfrm4_mode_beet.c | |||
@@ -134,19 +134,17 @@ static struct xfrm_mode xfrm4_beet_mode = { | |||
134 | .owner = THIS_MODULE, | 134 | .owner = THIS_MODULE, |
135 | .encap = XFRM_MODE_BEET, | 135 | .encap = XFRM_MODE_BEET, |
136 | .flags = XFRM_MODE_FLAG_TUNNEL, | 136 | .flags = XFRM_MODE_FLAG_TUNNEL, |
137 | .family = AF_INET, | ||
137 | }; | 138 | }; |
138 | 139 | ||
139 | static int __init xfrm4_beet_init(void) | 140 | static int __init xfrm4_beet_init(void) |
140 | { | 141 | { |
141 | return xfrm_register_mode(&xfrm4_beet_mode, AF_INET); | 142 | return xfrm_register_mode(&xfrm4_beet_mode); |
142 | } | 143 | } |
143 | 144 | ||
144 | static void __exit xfrm4_beet_exit(void) | 145 | static void __exit xfrm4_beet_exit(void) |
145 | { | 146 | { |
146 | int err; | 147 | xfrm_unregister_mode(&xfrm4_beet_mode); |
147 | |||
148 | err = xfrm_unregister_mode(&xfrm4_beet_mode, AF_INET); | ||
149 | BUG_ON(err); | ||
150 | } | 148 | } |
151 | 149 | ||
152 | module_init(xfrm4_beet_init); | 150 | module_init(xfrm4_beet_init); |
diff --git a/net/ipv4/xfrm4_mode_transport.c b/net/ipv4/xfrm4_mode_transport.c index 1ad2c2c4e250..7c5443f797cf 100644 --- a/net/ipv4/xfrm4_mode_transport.c +++ b/net/ipv4/xfrm4_mode_transport.c | |||
@@ -93,19 +93,17 @@ static struct xfrm_mode xfrm4_transport_mode = { | |||
93 | .xmit = xfrm4_transport_xmit, | 93 | .xmit = xfrm4_transport_xmit, |
94 | .owner = THIS_MODULE, | 94 | .owner = THIS_MODULE, |
95 | .encap = XFRM_MODE_TRANSPORT, | 95 | .encap = XFRM_MODE_TRANSPORT, |
96 | .family = AF_INET, | ||
96 | }; | 97 | }; |
97 | 98 | ||
98 | static int __init xfrm4_transport_init(void) | 99 | static int __init xfrm4_transport_init(void) |
99 | { | 100 | { |
100 | return xfrm_register_mode(&xfrm4_transport_mode, AF_INET); | 101 | return xfrm_register_mode(&xfrm4_transport_mode); |
101 | } | 102 | } |
102 | 103 | ||
103 | static void __exit xfrm4_transport_exit(void) | 104 | static void __exit xfrm4_transport_exit(void) |
104 | { | 105 | { |
105 | int err; | 106 | xfrm_unregister_mode(&xfrm4_transport_mode); |
106 | |||
107 | err = xfrm_unregister_mode(&xfrm4_transport_mode, AF_INET); | ||
108 | BUG_ON(err); | ||
109 | } | 107 | } |
110 | 108 | ||
111 | module_init(xfrm4_transport_init); | 109 | module_init(xfrm4_transport_init); |
diff --git a/net/ipv4/xfrm4_mode_tunnel.c b/net/ipv4/xfrm4_mode_tunnel.c index 2a9764bd1719..cfc6b6d39755 100644 --- a/net/ipv4/xfrm4_mode_tunnel.c +++ b/net/ipv4/xfrm4_mode_tunnel.c | |||
@@ -131,19 +131,17 @@ static struct xfrm_mode xfrm4_tunnel_mode = { | |||
131 | .owner = THIS_MODULE, | 131 | .owner = THIS_MODULE, |
132 | .encap = XFRM_MODE_TUNNEL, | 132 | .encap = XFRM_MODE_TUNNEL, |
133 | .flags = XFRM_MODE_FLAG_TUNNEL, | 133 | .flags = XFRM_MODE_FLAG_TUNNEL, |
134 | .family = AF_INET, | ||
134 | }; | 135 | }; |
135 | 136 | ||
136 | static int __init xfrm4_mode_tunnel_init(void) | 137 | static int __init xfrm4_mode_tunnel_init(void) |
137 | { | 138 | { |
138 | return xfrm_register_mode(&xfrm4_tunnel_mode, AF_INET); | 139 | return xfrm_register_mode(&xfrm4_tunnel_mode); |
139 | } | 140 | } |
140 | 141 | ||
141 | static void __exit xfrm4_mode_tunnel_exit(void) | 142 | static void __exit xfrm4_mode_tunnel_exit(void) |
142 | { | 143 | { |
143 | int err; | 144 | xfrm_unregister_mode(&xfrm4_tunnel_mode); |
144 | |||
145 | err = xfrm_unregister_mode(&xfrm4_tunnel_mode, AF_INET); | ||
146 | BUG_ON(err); | ||
147 | } | 145 | } |
148 | 146 | ||
149 | module_init(xfrm4_mode_tunnel_init); | 147 | module_init(xfrm4_mode_tunnel_init); |
diff --git a/net/ipv6/xfrm6_mode_beet.c b/net/ipv6/xfrm6_mode_beet.c index 57fd314ec2b8..0d440e3a13f8 100644 --- a/net/ipv6/xfrm6_mode_beet.c +++ b/net/ipv6/xfrm6_mode_beet.c | |||
@@ -110,19 +110,17 @@ static struct xfrm_mode xfrm6_beet_mode = { | |||
110 | .owner = THIS_MODULE, | 110 | .owner = THIS_MODULE, |
111 | .encap = XFRM_MODE_BEET, | 111 | .encap = XFRM_MODE_BEET, |
112 | .flags = XFRM_MODE_FLAG_TUNNEL, | 112 | .flags = XFRM_MODE_FLAG_TUNNEL, |
113 | .family = AF_INET6, | ||
113 | }; | 114 | }; |
114 | 115 | ||
115 | static int __init xfrm6_beet_init(void) | 116 | static int __init xfrm6_beet_init(void) |
116 | { | 117 | { |
117 | return xfrm_register_mode(&xfrm6_beet_mode, AF_INET6); | 118 | return xfrm_register_mode(&xfrm6_beet_mode); |
118 | } | 119 | } |
119 | 120 | ||
120 | static void __exit xfrm6_beet_exit(void) | 121 | static void __exit xfrm6_beet_exit(void) |
121 | { | 122 | { |
122 | int err; | 123 | xfrm_unregister_mode(&xfrm6_beet_mode); |
123 | |||
124 | err = xfrm_unregister_mode(&xfrm6_beet_mode, AF_INET6); | ||
125 | BUG_ON(err); | ||
126 | } | 124 | } |
127 | 125 | ||
128 | module_init(xfrm6_beet_init); | 126 | module_init(xfrm6_beet_init); |
diff --git a/net/ipv6/xfrm6_mode_ro.c b/net/ipv6/xfrm6_mode_ro.c index da28e4407b8f..0408547d01ab 100644 --- a/net/ipv6/xfrm6_mode_ro.c +++ b/net/ipv6/xfrm6_mode_ro.c | |||
@@ -64,19 +64,17 @@ static struct xfrm_mode xfrm6_ro_mode = { | |||
64 | .output = xfrm6_ro_output, | 64 | .output = xfrm6_ro_output, |
65 | .owner = THIS_MODULE, | 65 | .owner = THIS_MODULE, |
66 | .encap = XFRM_MODE_ROUTEOPTIMIZATION, | 66 | .encap = XFRM_MODE_ROUTEOPTIMIZATION, |
67 | .family = AF_INET6, | ||
67 | }; | 68 | }; |
68 | 69 | ||
69 | static int __init xfrm6_ro_init(void) | 70 | static int __init xfrm6_ro_init(void) |
70 | { | 71 | { |
71 | return xfrm_register_mode(&xfrm6_ro_mode, AF_INET6); | 72 | return xfrm_register_mode(&xfrm6_ro_mode); |
72 | } | 73 | } |
73 | 74 | ||
74 | static void __exit xfrm6_ro_exit(void) | 75 | static void __exit xfrm6_ro_exit(void) |
75 | { | 76 | { |
76 | int err; | 77 | xfrm_unregister_mode(&xfrm6_ro_mode); |
77 | |||
78 | err = xfrm_unregister_mode(&xfrm6_ro_mode, AF_INET6); | ||
79 | BUG_ON(err); | ||
80 | } | 78 | } |
81 | 79 | ||
82 | module_init(xfrm6_ro_init); | 80 | module_init(xfrm6_ro_init); |
diff --git a/net/ipv6/xfrm6_mode_transport.c b/net/ipv6/xfrm6_mode_transport.c index 3c29da5defe6..66ae79218bdf 100644 --- a/net/ipv6/xfrm6_mode_transport.c +++ b/net/ipv6/xfrm6_mode_transport.c | |||
@@ -100,19 +100,17 @@ static struct xfrm_mode xfrm6_transport_mode = { | |||
100 | .xmit = xfrm6_transport_xmit, | 100 | .xmit = xfrm6_transport_xmit, |
101 | .owner = THIS_MODULE, | 101 | .owner = THIS_MODULE, |
102 | .encap = XFRM_MODE_TRANSPORT, | 102 | .encap = XFRM_MODE_TRANSPORT, |
103 | .family = AF_INET6, | ||
103 | }; | 104 | }; |
104 | 105 | ||
105 | static int __init xfrm6_transport_init(void) | 106 | static int __init xfrm6_transport_init(void) |
106 | { | 107 | { |
107 | return xfrm_register_mode(&xfrm6_transport_mode, AF_INET6); | 108 | return xfrm_register_mode(&xfrm6_transport_mode); |
108 | } | 109 | } |
109 | 110 | ||
110 | static void __exit xfrm6_transport_exit(void) | 111 | static void __exit xfrm6_transport_exit(void) |
111 | { | 112 | { |
112 | int err; | 113 | xfrm_unregister_mode(&xfrm6_transport_mode); |
113 | |||
114 | err = xfrm_unregister_mode(&xfrm6_transport_mode, AF_INET6); | ||
115 | BUG_ON(err); | ||
116 | } | 114 | } |
117 | 115 | ||
118 | module_init(xfrm6_transport_init); | 116 | module_init(xfrm6_transport_init); |
diff --git a/net/ipv6/xfrm6_mode_tunnel.c b/net/ipv6/xfrm6_mode_tunnel.c index de1b0b8c53b0..6cf12e961ea5 100644 --- a/net/ipv6/xfrm6_mode_tunnel.c +++ b/net/ipv6/xfrm6_mode_tunnel.c | |||
@@ -130,19 +130,17 @@ static struct xfrm_mode xfrm6_tunnel_mode = { | |||
130 | .owner = THIS_MODULE, | 130 | .owner = THIS_MODULE, |
131 | .encap = XFRM_MODE_TUNNEL, | 131 | .encap = XFRM_MODE_TUNNEL, |
132 | .flags = XFRM_MODE_FLAG_TUNNEL, | 132 | .flags = XFRM_MODE_FLAG_TUNNEL, |
133 | .family = AF_INET6, | ||
133 | }; | 134 | }; |
134 | 135 | ||
135 | static int __init xfrm6_mode_tunnel_init(void) | 136 | static int __init xfrm6_mode_tunnel_init(void) |
136 | { | 137 | { |
137 | return xfrm_register_mode(&xfrm6_tunnel_mode, AF_INET6); | 138 | return xfrm_register_mode(&xfrm6_tunnel_mode); |
138 | } | 139 | } |
139 | 140 | ||
140 | static void __exit xfrm6_mode_tunnel_exit(void) | 141 | static void __exit xfrm6_mode_tunnel_exit(void) |
141 | { | 142 | { |
142 | int err; | 143 | xfrm_unregister_mode(&xfrm6_tunnel_mode); |
143 | |||
144 | err = xfrm_unregister_mode(&xfrm6_tunnel_mode, AF_INET6); | ||
145 | BUG_ON(err); | ||
146 | } | 144 | } |
147 | 145 | ||
148 | module_init(xfrm6_mode_tunnel_init); | 146 | module_init(xfrm6_mode_tunnel_init); |
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 1bb971f46fc6..c32394b59776 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c | |||
@@ -331,7 +331,7 @@ static void xfrm_put_type_offload(const struct xfrm_type_offload *type) | |||
331 | } | 331 | } |
332 | 332 | ||
333 | static DEFINE_SPINLOCK(xfrm_mode_lock); | 333 | static DEFINE_SPINLOCK(xfrm_mode_lock); |
334 | int xfrm_register_mode(struct xfrm_mode *mode, int family) | 334 | int xfrm_register_mode(struct xfrm_mode *mode) |
335 | { | 335 | { |
336 | struct xfrm_state_afinfo *afinfo; | 336 | struct xfrm_state_afinfo *afinfo; |
337 | struct xfrm_mode **modemap; | 337 | struct xfrm_mode **modemap; |
@@ -340,7 +340,7 @@ int xfrm_register_mode(struct xfrm_mode *mode, int family) | |||
340 | if (unlikely(mode->encap >= XFRM_MODE_MAX)) | 340 | if (unlikely(mode->encap >= XFRM_MODE_MAX)) |
341 | return -EINVAL; | 341 | return -EINVAL; |
342 | 342 | ||
343 | afinfo = xfrm_state_get_afinfo(family); | 343 | afinfo = xfrm_state_get_afinfo(mode->family); |
344 | if (unlikely(afinfo == NULL)) | 344 | if (unlikely(afinfo == NULL)) |
345 | return -EAFNOSUPPORT; | 345 | return -EAFNOSUPPORT; |
346 | 346 | ||
@@ -365,31 +365,24 @@ out: | |||
365 | } | 365 | } |
366 | EXPORT_SYMBOL(xfrm_register_mode); | 366 | EXPORT_SYMBOL(xfrm_register_mode); |
367 | 367 | ||
368 | int xfrm_unregister_mode(struct xfrm_mode *mode, int family) | 368 | void xfrm_unregister_mode(struct xfrm_mode *mode) |
369 | { | 369 | { |
370 | struct xfrm_state_afinfo *afinfo; | 370 | struct xfrm_state_afinfo *afinfo; |
371 | struct xfrm_mode **modemap; | 371 | struct xfrm_mode **modemap; |
372 | int err; | ||
373 | |||
374 | if (unlikely(mode->encap >= XFRM_MODE_MAX)) | ||
375 | return -EINVAL; | ||
376 | 372 | ||
377 | afinfo = xfrm_state_get_afinfo(family); | 373 | afinfo = xfrm_state_get_afinfo(mode->family); |
378 | if (unlikely(afinfo == NULL)) | 374 | if (WARN_ON_ONCE(!afinfo)) |
379 | return -EAFNOSUPPORT; | 375 | return; |
380 | 376 | ||
381 | err = -ENOENT; | ||
382 | modemap = afinfo->mode_map; | 377 | modemap = afinfo->mode_map; |
383 | spin_lock_bh(&xfrm_mode_lock); | 378 | spin_lock_bh(&xfrm_mode_lock); |
384 | if (likely(modemap[mode->encap] == mode)) { | 379 | if (likely(modemap[mode->encap] == mode)) { |
385 | modemap[mode->encap] = NULL; | 380 | modemap[mode->encap] = NULL; |
386 | module_put(mode->afinfo->owner); | 381 | module_put(mode->afinfo->owner); |
387 | err = 0; | ||
388 | } | 382 | } |
389 | 383 | ||
390 | spin_unlock_bh(&xfrm_mode_lock); | 384 | spin_unlock_bh(&xfrm_mode_lock); |
391 | rcu_read_unlock(); | 385 | rcu_read_unlock(); |
392 | return err; | ||
393 | } | 386 | } |
394 | EXPORT_SYMBOL(xfrm_unregister_mode); | 387 | EXPORT_SYMBOL(xfrm_unregister_mode); |
395 | 388 | ||