Skip to content

Commit e8bffe0

Browse files
Mahesh Bandewardavem330
authored andcommitted
net: Add _nf_(un)register_hooks symbols
Add _nf_register_hooks() and _nf_unregister_hooks() calls which allow caller to hold RTNL mutex. Signed-off-by: Mahesh Bandewar <maheshb@google.com> CC: Pablo Neira Ayuso <pablo@netfilter.org> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent d409b84 commit e8bffe0

File tree

2 files changed

+48
-5
lines changed

2 files changed

+48
-5
lines changed

include/linux/netfilter.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ int nf_register_hook(struct nf_hook_ops *reg);
133133
void nf_unregister_hook(struct nf_hook_ops *reg);
134134
int nf_register_hooks(struct nf_hook_ops *reg, unsigned int n);
135135
void nf_unregister_hooks(struct nf_hook_ops *reg, unsigned int n);
136+
int _nf_register_hooks(struct nf_hook_ops *reg, unsigned int n);
137+
void _nf_unregister_hooks(struct nf_hook_ops *reg, unsigned int n);
136138

137139
/* Functions to register get/setsockopt ranges (non-inclusive). You
138140
need to check permissions yourself! */

net/netfilter/core.c

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -188,19 +188,17 @@ EXPORT_SYMBOL(nf_unregister_net_hooks);
188188

189189
static LIST_HEAD(nf_hook_list);
190190

191-
int nf_register_hook(struct nf_hook_ops *reg)
191+
static int _nf_register_hook(struct nf_hook_ops *reg)
192192
{
193193
struct net *net, *last;
194194
int ret;
195195

196-
rtnl_lock();
197196
for_each_net(net) {
198197
ret = nf_register_net_hook(net, reg);
199198
if (ret && ret != -ENOENT)
200199
goto rollback;
201200
}
202201
list_add_tail(&reg->list, &nf_hook_list);
203-
rtnl_unlock();
204202

205203
return 0;
206204
rollback:
@@ -210,19 +208,34 @@ int nf_register_hook(struct nf_hook_ops *reg)
210208
break;
211209
nf_unregister_net_hook(net, reg);
212210
}
211+
return ret;
212+
}
213+
214+
int nf_register_hook(struct nf_hook_ops *reg)
215+
{
216+
int ret;
217+
218+
rtnl_lock();
219+
ret = _nf_register_hook(reg);
213220
rtnl_unlock();
221+
214222
return ret;
215223
}
216224
EXPORT_SYMBOL(nf_register_hook);
217225

218-
void nf_unregister_hook(struct nf_hook_ops *reg)
226+
static void _nf_unregister_hook(struct nf_hook_ops *reg)
219227
{
220228
struct net *net;
221229

222-
rtnl_lock();
223230
list_del(&reg->list);
224231
for_each_net(net)
225232
nf_unregister_net_hook(net, reg);
233+
}
234+
235+
void nf_unregister_hook(struct nf_hook_ops *reg)
236+
{
237+
rtnl_lock();
238+
_nf_unregister_hook(reg);
226239
rtnl_unlock();
227240
}
228241
EXPORT_SYMBOL(nf_unregister_hook);
@@ -246,13 +259,41 @@ int nf_register_hooks(struct nf_hook_ops *reg, unsigned int n)
246259
}
247260
EXPORT_SYMBOL(nf_register_hooks);
248261

262+
/* Caller MUST take rtnl_lock() */
263+
int _nf_register_hooks(struct nf_hook_ops *reg, unsigned int n)
264+
{
265+
unsigned int i;
266+
int err = 0;
267+
268+
for (i = 0; i < n; i++) {
269+
err = _nf_register_hook(&reg[i]);
270+
if (err)
271+
goto err;
272+
}
273+
return err;
274+
275+
err:
276+
if (i > 0)
277+
_nf_unregister_hooks(reg, i);
278+
return err;
279+
}
280+
EXPORT_SYMBOL(_nf_register_hooks);
281+
249282
void nf_unregister_hooks(struct nf_hook_ops *reg, unsigned int n)
250283
{
251284
while (n-- > 0)
252285
nf_unregister_hook(&reg[n]);
253286
}
254287
EXPORT_SYMBOL(nf_unregister_hooks);
255288

289+
/* Caller MUST take rtnl_lock */
290+
void _nf_unregister_hooks(struct nf_hook_ops *reg, unsigned int n)
291+
{
292+
while (n-- > 0)
293+
_nf_unregister_hook(&reg[n]);
294+
}
295+
EXPORT_SYMBOL(_nf_unregister_hooks);
296+
256297
unsigned int nf_iterate(struct list_head *head,
257298
struct sk_buff *skb,
258299
struct nf_hook_state *state,

0 commit comments

Comments
 (0)