summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2019-03-29 16:16:22 -0400
committerSteffen Klassert <steffen.klassert@secunet.com>2019-04-08 03:13:46 -0400
commitb262a69582a4676c7378a73077b7bb186c7c5b2a (patch)
tree5c71243107e5f14023de503aeb2acd2214f01d25
parentf981c57ffd2d7cf2dd4b6d6f8fcb3965df42f54c (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.h9
-rw-r--r--net/ipv4/xfrm4_mode_beet.c8
-rw-r--r--net/ipv4/xfrm4_mode_transport.c8
-rw-r--r--net/ipv4/xfrm4_mode_tunnel.c8
-rw-r--r--net/ipv6/xfrm6_mode_beet.c8
-rw-r--r--net/ipv6/xfrm6_mode_ro.c8
-rw-r--r--net/ipv6/xfrm6_mode_transport.c8
-rw-r--r--net/ipv6/xfrm6_mode_tunnel.c8
-rw-r--r--net/xfrm/xfrm_state.c19
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
494int xfrm_register_mode(struct xfrm_mode *mode, int family); 495int xfrm_register_mode(struct xfrm_mode *mode);
495int xfrm_unregister_mode(struct xfrm_mode *mode, int family); 496void xfrm_unregister_mode(struct xfrm_mode *mode);
496 497
497static inline int xfrm_af2proto(unsigned int family) 498static 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
139static int __init xfrm4_beet_init(void) 140static 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
144static void __exit xfrm4_beet_exit(void) 145static 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
152module_init(xfrm4_beet_init); 150module_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
98static int __init xfrm4_transport_init(void) 99static 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
103static void __exit xfrm4_transport_exit(void) 104static 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
111module_init(xfrm4_transport_init); 109module_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
136static int __init xfrm4_mode_tunnel_init(void) 137static 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
141static void __exit xfrm4_mode_tunnel_exit(void) 142static 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
149module_init(xfrm4_mode_tunnel_init); 147module_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
115static int __init xfrm6_beet_init(void) 116static 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
120static void __exit xfrm6_beet_exit(void) 121static 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
128module_init(xfrm6_beet_init); 126module_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
69static int __init xfrm6_ro_init(void) 70static 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
74static void __exit xfrm6_ro_exit(void) 75static 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
82module_init(xfrm6_ro_init); 80module_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
105static int __init xfrm6_transport_init(void) 106static 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
110static void __exit xfrm6_transport_exit(void) 111static 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
118module_init(xfrm6_transport_init); 116module_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
135static int __init xfrm6_mode_tunnel_init(void) 136static 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
140static void __exit xfrm6_mode_tunnel_exit(void) 141static 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
148module_init(xfrm6_mode_tunnel_init); 146module_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
333static DEFINE_SPINLOCK(xfrm_mode_lock); 333static DEFINE_SPINLOCK(xfrm_mode_lock);
334int xfrm_register_mode(struct xfrm_mode *mode, int family) 334int 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}
366EXPORT_SYMBOL(xfrm_register_mode); 366EXPORT_SYMBOL(xfrm_register_mode);
367 367
368int xfrm_unregister_mode(struct xfrm_mode *mode, int family) 368void 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}
394EXPORT_SYMBOL(xfrm_unregister_mode); 387EXPORT_SYMBOL(xfrm_unregister_mode);
395 388