mirror of https://github.com/torvalds/linux.git
Merge branch 'rtnetlink-use-rtnl_register_many'
Kuniyuki Iwashima says: ==================== rtnetlink: Use rtnl_register_many(). This series converts all rtnl_register() and rtnl_register_module() to rtnl_register_many() and finally removes them. Once this series is applied, I'll start converting doit() to per-netns RTNL. v1: https://lore.kernel.org/20241011220550.46040-1-kuniyu@amazon.com/ ==================== Link: https://patch.msgid.link/20241014201828.91221-1-kuniyu@amazon.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
53bac83308
|
|
@ -29,6 +29,16 @@ static inline enum rtnl_kinds rtnl_msgtype_kind(int msgtype)
|
|||
return msgtype & RTNL_KIND_MASK;
|
||||
}
|
||||
|
||||
/**
|
||||
* struct rtnl_msg_handler - rtnetlink message type and handlers
|
||||
*
|
||||
* @owner: NULL for built-in, THIS_MODULE for module
|
||||
* @protocol: Protocol family or PF_UNSPEC
|
||||
* @msgtype: rtnetlink message type
|
||||
* @doit: Function pointer called for each request message
|
||||
* @dumpit: Function pointer called for each dump request (NLM_F_DUMP) message
|
||||
* @flags: rtnl_link_flags to modify behaviour of doit/dumpit functions
|
||||
*/
|
||||
struct rtnl_msg_handler {
|
||||
struct module *owner;
|
||||
int protocol;
|
||||
|
|
@ -38,11 +48,6 @@ struct rtnl_msg_handler {
|
|||
int flags;
|
||||
};
|
||||
|
||||
void rtnl_register(int protocol, int msgtype,
|
||||
rtnl_doit_func, rtnl_dumpit_func, unsigned int flags);
|
||||
int rtnl_register_module(struct module *owner, int protocol, int msgtype,
|
||||
rtnl_doit_func, rtnl_dumpit_func, unsigned int flags);
|
||||
int rtnl_unregister(int protocol, int msgtype);
|
||||
void rtnl_unregister_all(int protocol);
|
||||
|
||||
int __rtnl_register_many(const struct rtnl_msg_handler *handlers, int n);
|
||||
|
|
|
|||
29
net/can/gw.c
29
net/can/gw.c
|
|
@ -1265,6 +1265,15 @@ static struct pernet_operations cangw_pernet_ops = {
|
|||
.exit_batch = cangw_pernet_exit_batch,
|
||||
};
|
||||
|
||||
static const struct rtnl_msg_handler cgw_rtnl_msg_handlers[] __initconst_or_module = {
|
||||
{.owner = THIS_MODULE, .protocol = PF_CAN, .msgtype = RTM_NEWROUTE,
|
||||
.doit = cgw_create_job},
|
||||
{.owner = THIS_MODULE, .protocol = PF_CAN, .msgtype = RTM_DELROUTE,
|
||||
.doit = cgw_remove_job},
|
||||
{.owner = THIS_MODULE, .protocol = PF_CAN, .msgtype = RTM_GETROUTE,
|
||||
.dumpit = cgw_dump_jobs},
|
||||
};
|
||||
|
||||
static __init int cgw_module_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
|
@ -1290,27 +1299,13 @@ static __init int cgw_module_init(void)
|
|||
if (ret)
|
||||
goto out_register_notifier;
|
||||
|
||||
ret = rtnl_register_module(THIS_MODULE, PF_CAN, RTM_GETROUTE,
|
||||
NULL, cgw_dump_jobs, 0);
|
||||
ret = rtnl_register_many(cgw_rtnl_msg_handlers);
|
||||
if (ret)
|
||||
goto out_rtnl_register1;
|
||||
|
||||
ret = rtnl_register_module(THIS_MODULE, PF_CAN, RTM_NEWROUTE,
|
||||
cgw_create_job, NULL, 0);
|
||||
if (ret)
|
||||
goto out_rtnl_register2;
|
||||
ret = rtnl_register_module(THIS_MODULE, PF_CAN, RTM_DELROUTE,
|
||||
cgw_remove_job, NULL, 0);
|
||||
if (ret)
|
||||
goto out_rtnl_register3;
|
||||
goto out_rtnl_register;
|
||||
|
||||
return 0;
|
||||
|
||||
out_rtnl_register3:
|
||||
rtnl_unregister(PF_CAN, RTM_NEWROUTE);
|
||||
out_rtnl_register2:
|
||||
rtnl_unregister(PF_CAN, RTM_GETROUTE);
|
||||
out_rtnl_register1:
|
||||
out_rtnl_register:
|
||||
unregister_netdevice_notifier(¬ifier);
|
||||
out_register_notifier:
|
||||
kmem_cache_destroy(cgw_cache);
|
||||
|
|
|
|||
|
|
@ -1291,13 +1291,18 @@ static struct pernet_operations fib_rules_net_ops = {
|
|||
.exit = fib_rules_net_exit,
|
||||
};
|
||||
|
||||
static const struct rtnl_msg_handler fib_rules_rtnl_msg_handlers[] __initconst = {
|
||||
{.msgtype = RTM_NEWRULE, .doit = fib_nl_newrule},
|
||||
{.msgtype = RTM_DELRULE, .doit = fib_nl_delrule},
|
||||
{.msgtype = RTM_GETRULE, .dumpit = fib_nl_dumprule,
|
||||
.flags = RTNL_FLAG_DUMP_UNLOCKED},
|
||||
};
|
||||
|
||||
static int __init fib_rules_init(void)
|
||||
{
|
||||
int err;
|
||||
rtnl_register(PF_UNSPEC, RTM_NEWRULE, fib_nl_newrule, NULL, 0);
|
||||
rtnl_register(PF_UNSPEC, RTM_DELRULE, fib_nl_delrule, NULL, 0);
|
||||
rtnl_register(PF_UNSPEC, RTM_GETRULE, NULL, fib_nl_dumprule,
|
||||
RTNL_FLAG_DUMP_UNLOCKED);
|
||||
|
||||
rtnl_register_many(fib_rules_rtnl_msg_handlers);
|
||||
|
||||
err = register_pernet_subsys(&fib_rules_net_ops);
|
||||
if (err < 0)
|
||||
|
|
@ -1312,9 +1317,7 @@ static int __init fib_rules_init(void)
|
|||
fail_unregister:
|
||||
unregister_pernet_subsys(&fib_rules_net_ops);
|
||||
fail:
|
||||
rtnl_unregister(PF_UNSPEC, RTM_NEWRULE);
|
||||
rtnl_unregister(PF_UNSPEC, RTM_DELRULE);
|
||||
rtnl_unregister(PF_UNSPEC, RTM_GETRULE);
|
||||
rtnl_unregister_many(fib_rules_rtnl_msg_handlers);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3886,17 +3886,18 @@ EXPORT_SYMBOL(neigh_sysctl_unregister);
|
|||
|
||||
#endif /* CONFIG_SYSCTL */
|
||||
|
||||
static const struct rtnl_msg_handler neigh_rtnl_msg_handlers[] __initconst = {
|
||||
{.msgtype = RTM_NEWNEIGH, .doit = neigh_add},
|
||||
{.msgtype = RTM_DELNEIGH, .doit = neigh_delete},
|
||||
{.msgtype = RTM_GETNEIGH, .doit = neigh_get, .dumpit = neigh_dump_info,
|
||||
.flags = RTNL_FLAG_DUMP_UNLOCKED},
|
||||
{.msgtype = RTM_GETNEIGHTBL, .dumpit = neightbl_dump_info},
|
||||
{.msgtype = RTM_SETNEIGHTBL, .doit = neightbl_set},
|
||||
};
|
||||
|
||||
static int __init neigh_init(void)
|
||||
{
|
||||
rtnl_register(PF_UNSPEC, RTM_NEWNEIGH, neigh_add, NULL, 0);
|
||||
rtnl_register(PF_UNSPEC, RTM_DELNEIGH, neigh_delete, NULL, 0);
|
||||
rtnl_register(PF_UNSPEC, RTM_GETNEIGH, neigh_get, neigh_dump_info,
|
||||
RTNL_FLAG_DUMP_UNLOCKED);
|
||||
|
||||
rtnl_register(PF_UNSPEC, RTM_GETNEIGHTBL, NULL, neightbl_dump_info,
|
||||
0);
|
||||
rtnl_register(PF_UNSPEC, RTM_SETNEIGHTBL, neightbl_set, NULL, 0);
|
||||
|
||||
rtnl_register_many(neigh_rtnl_msg_handlers);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1169,6 +1169,14 @@ static void __init netns_ipv4_struct_check(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
static const struct rtnl_msg_handler net_ns_rtnl_msg_handlers[] __initconst = {
|
||||
{.msgtype = RTM_NEWNSID, .doit = rtnl_net_newid,
|
||||
.flags = RTNL_FLAG_DOIT_UNLOCKED},
|
||||
{.msgtype = RTM_GETNSID, .doit = rtnl_net_getid,
|
||||
.dumpit = rtnl_net_dumpid,
|
||||
.flags = RTNL_FLAG_DOIT_UNLOCKED | RTNL_FLAG_DUMP_UNLOCKED},
|
||||
};
|
||||
|
||||
void __init net_ns_init(void)
|
||||
{
|
||||
struct net_generic *ng;
|
||||
|
|
@ -1206,11 +1214,7 @@ void __init net_ns_init(void)
|
|||
if (register_pernet_subsys(&net_ns_ops))
|
||||
panic("Could not register network namespace subsystems");
|
||||
|
||||
rtnl_register(PF_UNSPEC, RTM_NEWNSID, rtnl_net_newid, NULL,
|
||||
RTNL_FLAG_DOIT_UNLOCKED);
|
||||
rtnl_register(PF_UNSPEC, RTM_GETNSID, rtnl_net_getid, rtnl_net_dumpid,
|
||||
RTNL_FLAG_DOIT_UNLOCKED |
|
||||
RTNL_FLAG_DUMP_UNLOCKED);
|
||||
rtnl_register_many(net_ns_rtnl_msg_handlers);
|
||||
}
|
||||
|
||||
static void free_exit_list(struct pernet_operations *ops, struct list_head *net_exit_list)
|
||||
|
|
|
|||
|
|
@ -338,57 +338,6 @@ static int rtnl_register_internal(struct module *owner,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* rtnl_register_module - Register a rtnetlink message type
|
||||
*
|
||||
* @owner: module registering the hook (THIS_MODULE)
|
||||
* @protocol: Protocol family or PF_UNSPEC
|
||||
* @msgtype: rtnetlink message type
|
||||
* @doit: Function pointer called for each request message
|
||||
* @dumpit: Function pointer called for each dump request (NLM_F_DUMP) message
|
||||
* @flags: rtnl_link_flags to modify behaviour of doit/dumpit functions
|
||||
*
|
||||
* Like rtnl_register, but for use by removable modules.
|
||||
*/
|
||||
int rtnl_register_module(struct module *owner,
|
||||
int protocol, int msgtype,
|
||||
rtnl_doit_func doit, rtnl_dumpit_func dumpit,
|
||||
unsigned int flags)
|
||||
{
|
||||
return rtnl_register_internal(owner, protocol, msgtype,
|
||||
doit, dumpit, flags);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rtnl_register_module);
|
||||
|
||||
/**
|
||||
* rtnl_register - Register a rtnetlink message type
|
||||
* @protocol: Protocol family or PF_UNSPEC
|
||||
* @msgtype: rtnetlink message type
|
||||
* @doit: Function pointer called for each request message
|
||||
* @dumpit: Function pointer called for each dump request (NLM_F_DUMP) message
|
||||
* @flags: rtnl_link_flags to modify behaviour of doit/dumpit functions
|
||||
*
|
||||
* Registers the specified function pointers (at least one of them has
|
||||
* to be non-NULL) to be called whenever a request message for the
|
||||
* specified protocol family and message type is received.
|
||||
*
|
||||
* The special protocol family PF_UNSPEC may be used to define fallback
|
||||
* function pointers for the case when no entry for the specific protocol
|
||||
* family exists.
|
||||
*/
|
||||
void rtnl_register(int protocol, int msgtype,
|
||||
rtnl_doit_func doit, rtnl_dumpit_func dumpit,
|
||||
unsigned int flags)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = rtnl_register_internal(NULL, protocol, msgtype, doit, dumpit,
|
||||
flags);
|
||||
if (err)
|
||||
pr_err("Unable to register rtnetlink message handler, "
|
||||
"protocol = %d, message type = %d\n", protocol, msgtype);
|
||||
}
|
||||
|
||||
/**
|
||||
* rtnl_unregister - Unregister a rtnetlink message type
|
||||
* @protocol: Protocol family or PF_UNSPEC
|
||||
|
|
@ -396,7 +345,7 @@ void rtnl_register(int protocol, int msgtype,
|
|||
*
|
||||
* Returns 0 on success or a negative error code.
|
||||
*/
|
||||
int rtnl_unregister(int protocol, int msgtype)
|
||||
static int rtnl_unregister(int protocol, int msgtype)
|
||||
{
|
||||
struct rtnl_link __rcu **tab;
|
||||
struct rtnl_link *link;
|
||||
|
|
@ -419,7 +368,6 @@ int rtnl_unregister(int protocol, int msgtype)
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rtnl_unregister);
|
||||
|
||||
/**
|
||||
* rtnl_unregister_all - Unregister all rtnetlink message type of a protocol
|
||||
|
|
@ -454,6 +402,26 @@ void rtnl_unregister_all(int protocol)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(rtnl_unregister_all);
|
||||
|
||||
/**
|
||||
* __rtnl_register_many - Register rtnetlink message types
|
||||
* @handlers: Array of struct rtnl_msg_handlers
|
||||
* @n: The length of @handlers
|
||||
*
|
||||
* Registers the specified function pointers (at least one of them has
|
||||
* to be non-NULL) to be called whenever a request message for the
|
||||
* specified protocol family and message type is received.
|
||||
*
|
||||
* The special protocol family PF_UNSPEC may be used to define fallback
|
||||
* function pointers for the case when no entry for the specific protocol
|
||||
* family exists.
|
||||
*
|
||||
* When one element of @handlers fails to register,
|
||||
* 1) built-in: panics.
|
||||
* 2) modules : the previous successful registrations are unwinded
|
||||
* and an error is returned.
|
||||
*
|
||||
* Use rtnl_register_many().
|
||||
*/
|
||||
int __rtnl_register_many(const struct rtnl_msg_handler *handlers, int n)
|
||||
{
|
||||
const struct rtnl_msg_handler *handler;
|
||||
|
|
@ -464,6 +432,10 @@ int __rtnl_register_many(const struct rtnl_msg_handler *handlers, int n)
|
|||
handler->msgtype, handler->doit,
|
||||
handler->dumpit, handler->flags);
|
||||
if (err) {
|
||||
if (!handler->owner)
|
||||
panic("Unable to register rtnetlink message "
|
||||
"handlers, %pS\n", handlers);
|
||||
|
||||
__rtnl_unregister_many(handlers, i);
|
||||
break;
|
||||
}
|
||||
|
|
@ -6839,6 +6811,38 @@ static struct pernet_operations rtnetlink_net_ops = {
|
|||
.exit = rtnetlink_net_exit,
|
||||
};
|
||||
|
||||
static const struct rtnl_msg_handler rtnetlink_rtnl_msg_handlers[] __initconst = {
|
||||
{.msgtype = RTM_NEWLINK, .doit = rtnl_newlink},
|
||||
{.msgtype = RTM_DELLINK, .doit = rtnl_dellink},
|
||||
{.msgtype = RTM_GETLINK, .doit = rtnl_getlink,
|
||||
.dumpit = rtnl_dump_ifinfo, .flags = RTNL_FLAG_DUMP_SPLIT_NLM_DONE},
|
||||
{.msgtype = RTM_SETLINK, .doit = rtnl_setlink},
|
||||
{.msgtype = RTM_GETADDR, .dumpit = rtnl_dump_all},
|
||||
{.msgtype = RTM_GETROUTE, .dumpit = rtnl_dump_all},
|
||||
{.msgtype = RTM_GETNETCONF, .dumpit = rtnl_dump_all},
|
||||
{.msgtype = RTM_GETSTATS, .doit = rtnl_stats_get,
|
||||
.dumpit = rtnl_stats_dump},
|
||||
{.msgtype = RTM_SETSTATS, .doit = rtnl_stats_set},
|
||||
{.msgtype = RTM_NEWLINKPROP, .doit = rtnl_newlinkprop},
|
||||
{.msgtype = RTM_DELLINKPROP, .doit = rtnl_dellinkprop},
|
||||
{.protocol = PF_BRIDGE, .msgtype = RTM_GETLINK,
|
||||
.dumpit = rtnl_bridge_getlink},
|
||||
{.protocol = PF_BRIDGE, .msgtype = RTM_DELLINK,
|
||||
.doit = rtnl_bridge_dellink},
|
||||
{.protocol = PF_BRIDGE, .msgtype = RTM_SETLINK,
|
||||
.doit = rtnl_bridge_setlink},
|
||||
{.protocol = PF_BRIDGE, .msgtype = RTM_NEWNEIGH, .doit = rtnl_fdb_add},
|
||||
{.protocol = PF_BRIDGE, .msgtype = RTM_DELNEIGH, .doit = rtnl_fdb_del,
|
||||
.flags = RTNL_FLAG_BULK_DEL_SUPPORTED},
|
||||
{.protocol = PF_BRIDGE, .msgtype = RTM_GETNEIGH, .doit = rtnl_fdb_get,
|
||||
.dumpit = rtnl_fdb_dump},
|
||||
{.protocol = PF_BRIDGE, .msgtype = RTM_NEWMDB, .doit = rtnl_mdb_add},
|
||||
{.protocol = PF_BRIDGE, .msgtype = RTM_DELMDB, .doit = rtnl_mdb_del,
|
||||
.flags = RTNL_FLAG_BULK_DEL_SUPPORTED},
|
||||
{.protocol = PF_BRIDGE, .msgtype = RTM_GETMDB, .doit = rtnl_mdb_get,
|
||||
.dumpit = rtnl_mdb_dump},
|
||||
};
|
||||
|
||||
void __init rtnetlink_init(void)
|
||||
{
|
||||
if (register_pernet_subsys(&rtnetlink_net_ops))
|
||||
|
|
@ -6846,34 +6850,5 @@ void __init rtnetlink_init(void)
|
|||
|
||||
register_netdevice_notifier(&rtnetlink_dev_notifier);
|
||||
|
||||
rtnl_register(PF_UNSPEC, RTM_GETLINK, rtnl_getlink,
|
||||
rtnl_dump_ifinfo, RTNL_FLAG_DUMP_SPLIT_NLM_DONE);
|
||||
rtnl_register(PF_UNSPEC, RTM_SETLINK, rtnl_setlink, NULL, 0);
|
||||
rtnl_register(PF_UNSPEC, RTM_NEWLINK, rtnl_newlink, NULL, 0);
|
||||
rtnl_register(PF_UNSPEC, RTM_DELLINK, rtnl_dellink, NULL, 0);
|
||||
|
||||
rtnl_register(PF_UNSPEC, RTM_GETADDR, NULL, rtnl_dump_all, 0);
|
||||
rtnl_register(PF_UNSPEC, RTM_GETROUTE, NULL, rtnl_dump_all, 0);
|
||||
rtnl_register(PF_UNSPEC, RTM_GETNETCONF, NULL, rtnl_dump_all, 0);
|
||||
|
||||
rtnl_register(PF_UNSPEC, RTM_NEWLINKPROP, rtnl_newlinkprop, NULL, 0);
|
||||
rtnl_register(PF_UNSPEC, RTM_DELLINKPROP, rtnl_dellinkprop, NULL, 0);
|
||||
|
||||
rtnl_register(PF_BRIDGE, RTM_NEWNEIGH, rtnl_fdb_add, NULL, 0);
|
||||
rtnl_register(PF_BRIDGE, RTM_DELNEIGH, rtnl_fdb_del, NULL,
|
||||
RTNL_FLAG_BULK_DEL_SUPPORTED);
|
||||
rtnl_register(PF_BRIDGE, RTM_GETNEIGH, rtnl_fdb_get, rtnl_fdb_dump, 0);
|
||||
|
||||
rtnl_register(PF_BRIDGE, RTM_GETLINK, NULL, rtnl_bridge_getlink, 0);
|
||||
rtnl_register(PF_BRIDGE, RTM_DELLINK, rtnl_bridge_dellink, NULL, 0);
|
||||
rtnl_register(PF_BRIDGE, RTM_SETLINK, rtnl_bridge_setlink, NULL, 0);
|
||||
|
||||
rtnl_register(PF_UNSPEC, RTM_GETSTATS, rtnl_stats_get, rtnl_stats_dump,
|
||||
0);
|
||||
rtnl_register(PF_UNSPEC, RTM_SETSTATS, rtnl_stats_set, NULL, 0);
|
||||
|
||||
rtnl_register(PF_BRIDGE, RTM_GETMDB, rtnl_mdb_get, rtnl_mdb_dump, 0);
|
||||
rtnl_register(PF_BRIDGE, RTM_NEWMDB, rtnl_mdb_add, NULL, 0);
|
||||
rtnl_register(PF_BRIDGE, RTM_DELMDB, rtnl_mdb_del, NULL,
|
||||
RTNL_FLAG_BULK_DEL_SUPPORTED);
|
||||
rtnl_register_many(rtnetlink_rtnl_msg_handlers);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2408,6 +2408,11 @@ static struct notifier_block dcbnl_nb __read_mostly = {
|
|||
.notifier_call = dcbnl_netdevice_event,
|
||||
};
|
||||
|
||||
static const struct rtnl_msg_handler dcbnl_rtnl_msg_handlers[] __initconst = {
|
||||
{.msgtype = RTM_GETDCB, .doit = dcb_doit},
|
||||
{.msgtype = RTM_SETDCB, .doit = dcb_doit},
|
||||
};
|
||||
|
||||
static int __init dcbnl_init(void)
|
||||
{
|
||||
int err;
|
||||
|
|
@ -2416,8 +2421,7 @@ static int __init dcbnl_init(void)
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
rtnl_register(PF_UNSPEC, RTM_GETDCB, dcb_doit, NULL, 0);
|
||||
rtnl_register(PF_UNSPEC, RTM_SETDCB, dcb_doit, NULL, 0);
|
||||
rtnl_register_many(dcbnl_rtnl_msg_handlers);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2797,6 +2797,16 @@ static struct rtnl_af_ops inet_af_ops __read_mostly = {
|
|||
.set_link_af = inet_set_link_af,
|
||||
};
|
||||
|
||||
static const struct rtnl_msg_handler devinet_rtnl_msg_handlers[] __initconst = {
|
||||
{.protocol = PF_INET, .msgtype = RTM_NEWADDR, .doit = inet_rtm_newaddr},
|
||||
{.protocol = PF_INET, .msgtype = RTM_DELADDR, .doit = inet_rtm_deladdr},
|
||||
{.protocol = PF_INET, .msgtype = RTM_GETADDR, .dumpit = inet_dump_ifaddr,
|
||||
.flags = RTNL_FLAG_DUMP_UNLOCKED | RTNL_FLAG_DUMP_SPLIT_NLM_DONE},
|
||||
{.protocol = PF_INET, .msgtype = RTM_GETNETCONF,
|
||||
.doit = inet_netconf_get_devconf, .dumpit = inet_netconf_dump_devconf,
|
||||
.flags = RTNL_FLAG_DOIT_UNLOCKED | RTNL_FLAG_DUMP_UNLOCKED},
|
||||
};
|
||||
|
||||
void __init devinet_init(void)
|
||||
{
|
||||
register_pernet_subsys(&devinet_ops);
|
||||
|
|
@ -2804,11 +2814,5 @@ void __init devinet_init(void)
|
|||
|
||||
rtnl_af_register(&inet_af_ops);
|
||||
|
||||
rtnl_register(PF_INET, RTM_NEWADDR, inet_rtm_newaddr, NULL, 0);
|
||||
rtnl_register(PF_INET, RTM_DELADDR, inet_rtm_deladdr, NULL, 0);
|
||||
rtnl_register(PF_INET, RTM_GETADDR, NULL, inet_dump_ifaddr,
|
||||
RTNL_FLAG_DUMP_UNLOCKED | RTNL_FLAG_DUMP_SPLIT_NLM_DONE);
|
||||
rtnl_register(PF_INET, RTM_GETNETCONF, inet_netconf_get_devconf,
|
||||
inet_netconf_dump_devconf,
|
||||
RTNL_FLAG_DOIT_UNLOCKED | RTNL_FLAG_DUMP_UNLOCKED);
|
||||
rtnl_register_many(devinet_rtnl_msg_handlers);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1649,6 +1649,15 @@ static struct pernet_operations fib_net_ops = {
|
|||
.exit_batch = fib_net_exit_batch,
|
||||
};
|
||||
|
||||
static const struct rtnl_msg_handler fib_rtnl_msg_handlers[] __initconst = {
|
||||
{.protocol = PF_INET, .msgtype = RTM_NEWROUTE,
|
||||
.doit = inet_rtm_newroute},
|
||||
{.protocol = PF_INET, .msgtype = RTM_DELROUTE,
|
||||
.doit = inet_rtm_delroute},
|
||||
{.protocol = PF_INET, .msgtype = RTM_GETROUTE, .dumpit = inet_dump_fib,
|
||||
.flags = RTNL_FLAG_DUMP_UNLOCKED | RTNL_FLAG_DUMP_SPLIT_NLM_DONE},
|
||||
};
|
||||
|
||||
void __init ip_fib_init(void)
|
||||
{
|
||||
fib_trie_init();
|
||||
|
|
@ -1658,8 +1667,5 @@ void __init ip_fib_init(void)
|
|||
register_netdevice_notifier(&fib_netdev_notifier);
|
||||
register_inetaddr_notifier(&fib_inetaddr_notifier);
|
||||
|
||||
rtnl_register(PF_INET, RTM_NEWROUTE, inet_rtm_newroute, NULL, 0);
|
||||
rtnl_register(PF_INET, RTM_DELROUTE, inet_rtm_delroute, NULL, 0);
|
||||
rtnl_register(PF_INET, RTM_GETROUTE, NULL, inet_dump_fib,
|
||||
RTNL_FLAG_DUMP_UNLOCKED | RTNL_FLAG_DUMP_SPLIT_NLM_DONE);
|
||||
rtnl_register_many(fib_rtnl_msg_handlers);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3137,6 +3137,17 @@ static struct pernet_operations ipmr_net_ops = {
|
|||
.exit_batch = ipmr_net_exit_batch,
|
||||
};
|
||||
|
||||
static const struct rtnl_msg_handler ipmr_rtnl_msg_handlers[] __initconst = {
|
||||
{.protocol = RTNL_FAMILY_IPMR, .msgtype = RTM_GETLINK,
|
||||
.dumpit = ipmr_rtm_dumplink},
|
||||
{.protocol = RTNL_FAMILY_IPMR, .msgtype = RTM_NEWROUTE,
|
||||
.doit = ipmr_rtm_route},
|
||||
{.protocol = RTNL_FAMILY_IPMR, .msgtype = RTM_DELROUTE,
|
||||
.doit = ipmr_rtm_route},
|
||||
{.protocol = RTNL_FAMILY_IPMR, .msgtype = RTM_GETROUTE,
|
||||
.doit = ipmr_rtm_getroute, .dumpit = ipmr_rtm_dumproute},
|
||||
};
|
||||
|
||||
int __init ip_mr_init(void)
|
||||
{
|
||||
int err;
|
||||
|
|
@ -3157,15 +3168,8 @@ int __init ip_mr_init(void)
|
|||
goto add_proto_fail;
|
||||
}
|
||||
#endif
|
||||
rtnl_register(RTNL_FAMILY_IPMR, RTM_GETROUTE,
|
||||
ipmr_rtm_getroute, ipmr_rtm_dumproute, 0);
|
||||
rtnl_register(RTNL_FAMILY_IPMR, RTM_NEWROUTE,
|
||||
ipmr_rtm_route, NULL, 0);
|
||||
rtnl_register(RTNL_FAMILY_IPMR, RTM_DELROUTE,
|
||||
ipmr_rtm_route, NULL, 0);
|
||||
rtnl_register_many(ipmr_rtnl_msg_handlers);
|
||||
|
||||
rtnl_register(RTNL_FAMILY_IPMR, RTM_GETLINK,
|
||||
NULL, ipmr_rtm_dumplink, 0);
|
||||
return 0;
|
||||
|
||||
#ifdef CONFIG_IP_PIMSM_V2
|
||||
|
|
|
|||
|
|
@ -4042,25 +4042,30 @@ static struct pernet_operations nexthop_net_ops = {
|
|||
.exit_batch_rtnl = nexthop_net_exit_batch_rtnl,
|
||||
};
|
||||
|
||||
static const struct rtnl_msg_handler nexthop_rtnl_msg_handlers[] __initconst = {
|
||||
{.msgtype = RTM_NEWNEXTHOP, .doit = rtm_new_nexthop},
|
||||
{.msgtype = RTM_DELNEXTHOP, .doit = rtm_del_nexthop},
|
||||
{.msgtype = RTM_GETNEXTHOP, .doit = rtm_get_nexthop,
|
||||
.dumpit = rtm_dump_nexthop},
|
||||
{.msgtype = RTM_GETNEXTHOPBUCKET, .doit = rtm_get_nexthop_bucket,
|
||||
.dumpit = rtm_dump_nexthop_bucket},
|
||||
{.protocol = PF_INET, .msgtype = RTM_NEWNEXTHOP,
|
||||
.doit = rtm_new_nexthop},
|
||||
{.protocol = PF_INET, .msgtype = RTM_GETNEXTHOP,
|
||||
.dumpit = rtm_dump_nexthop},
|
||||
{.protocol = PF_INET6, .msgtype = RTM_NEWNEXTHOP,
|
||||
.doit = rtm_new_nexthop},
|
||||
{.protocol = PF_INET6, .msgtype = RTM_GETNEXTHOP,
|
||||
.dumpit = rtm_dump_nexthop},
|
||||
};
|
||||
|
||||
static int __init nexthop_init(void)
|
||||
{
|
||||
register_pernet_subsys(&nexthop_net_ops);
|
||||
|
||||
register_netdevice_notifier(&nh_netdev_notifier);
|
||||
|
||||
rtnl_register(PF_UNSPEC, RTM_NEWNEXTHOP, rtm_new_nexthop, NULL, 0);
|
||||
rtnl_register(PF_UNSPEC, RTM_DELNEXTHOP, rtm_del_nexthop, NULL, 0);
|
||||
rtnl_register(PF_UNSPEC, RTM_GETNEXTHOP, rtm_get_nexthop,
|
||||
rtm_dump_nexthop, 0);
|
||||
|
||||
rtnl_register(PF_INET, RTM_NEWNEXTHOP, rtm_new_nexthop, NULL, 0);
|
||||
rtnl_register(PF_INET, RTM_GETNEXTHOP, NULL, rtm_dump_nexthop, 0);
|
||||
|
||||
rtnl_register(PF_INET6, RTM_NEWNEXTHOP, rtm_new_nexthop, NULL, 0);
|
||||
rtnl_register(PF_INET6, RTM_GETNEXTHOP, NULL, rtm_dump_nexthop, 0);
|
||||
|
||||
rtnl_register(PF_UNSPEC, RTM_GETNEXTHOPBUCKET, rtm_get_nexthop_bucket,
|
||||
rtm_dump_nexthop_bucket, 0);
|
||||
rtnl_register_many(nexthop_rtnl_msg_handlers);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3632,6 +3632,11 @@ static __net_initdata struct pernet_operations ipv4_inetpeer_ops = {
|
|||
struct ip_rt_acct __percpu *ip_rt_acct __read_mostly;
|
||||
#endif /* CONFIG_IP_ROUTE_CLASSID */
|
||||
|
||||
static const struct rtnl_msg_handler ip_rt_rtnl_msg_handlers[] __initconst = {
|
||||
{.protocol = PF_INET, .msgtype = RTM_GETROUTE,
|
||||
.doit = inet_rtm_getroute, .flags = RTNL_FLAG_DOIT_UNLOCKED},
|
||||
};
|
||||
|
||||
int __init ip_rt_init(void)
|
||||
{
|
||||
void *idents_hash;
|
||||
|
|
@ -3689,8 +3694,7 @@ int __init ip_rt_init(void)
|
|||
xfrm_init();
|
||||
xfrm4_init();
|
||||
#endif
|
||||
rtnl_register(PF_INET, RTM_GETROUTE, inet_rtm_getroute, NULL,
|
||||
RTNL_FLAG_DOIT_UNLOCKED);
|
||||
rtnl_register_many(ip_rt_rtnl_msg_handlers);
|
||||
|
||||
#ifdef CONFIG_SYSCTL
|
||||
register_pernet_subsys(&sysctl_route_ops);
|
||||
|
|
|
|||
|
|
@ -7406,6 +7406,27 @@ static struct rtnl_af_ops inet6_ops __read_mostly = {
|
|||
.set_link_af = inet6_set_link_af,
|
||||
};
|
||||
|
||||
static const struct rtnl_msg_handler addrconf_rtnl_msg_handlers[] __initconst_or_module = {
|
||||
{.owner = THIS_MODULE, .protocol = PF_INET6, .msgtype = RTM_GETLINK,
|
||||
.dumpit = inet6_dump_ifinfo, .flags = RTNL_FLAG_DUMP_UNLOCKED},
|
||||
{.owner = THIS_MODULE, .protocol = PF_INET6, .msgtype = RTM_NEWADDR,
|
||||
.doit = inet6_rtm_newaddr},
|
||||
{.owner = THIS_MODULE, .protocol = PF_INET6, .msgtype = RTM_DELADDR,
|
||||
.doit = inet6_rtm_deladdr},
|
||||
{.owner = THIS_MODULE, .protocol = PF_INET6, .msgtype = RTM_GETADDR,
|
||||
.doit = inet6_rtm_getaddr, .dumpit = inet6_dump_ifaddr,
|
||||
.flags = RTNL_FLAG_DOIT_UNLOCKED | RTNL_FLAG_DUMP_UNLOCKED},
|
||||
{.owner = THIS_MODULE, .protocol = PF_INET6, .msgtype = RTM_GETMULTICAST,
|
||||
.dumpit = inet6_dump_ifmcaddr,
|
||||
.flags = RTNL_FLAG_DUMP_UNLOCKED},
|
||||
{.owner = THIS_MODULE, .protocol = PF_INET6, .msgtype = RTM_GETANYCAST,
|
||||
.dumpit = inet6_dump_ifacaddr,
|
||||
.flags = RTNL_FLAG_DUMP_UNLOCKED},
|
||||
{.owner = THIS_MODULE, .protocol = PF_INET6, .msgtype = RTM_GETNETCONF,
|
||||
.doit = inet6_netconf_get_devconf, .dumpit = inet6_netconf_dump_devconf,
|
||||
.flags = RTNL_FLAG_DOIT_UNLOCKED | RTNL_FLAG_DUMP_UNLOCKED},
|
||||
};
|
||||
|
||||
/*
|
||||
* Init / cleanup code
|
||||
*/
|
||||
|
|
@ -7449,42 +7470,10 @@ int __init addrconf_init(void)
|
|||
|
||||
rtnl_af_register(&inet6_ops);
|
||||
|
||||
err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETLINK,
|
||||
NULL, inet6_dump_ifinfo, RTNL_FLAG_DUMP_UNLOCKED);
|
||||
if (err < 0)
|
||||
err = rtnl_register_many(addrconf_rtnl_msg_handlers);
|
||||
if (err)
|
||||
goto errout;
|
||||
|
||||
err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_NEWADDR,
|
||||
inet6_rtm_newaddr, NULL, 0);
|
||||
if (err < 0)
|
||||
goto errout;
|
||||
err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_DELADDR,
|
||||
inet6_rtm_deladdr, NULL, 0);
|
||||
if (err < 0)
|
||||
goto errout;
|
||||
err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETADDR,
|
||||
inet6_rtm_getaddr, inet6_dump_ifaddr,
|
||||
RTNL_FLAG_DOIT_UNLOCKED |
|
||||
RTNL_FLAG_DUMP_UNLOCKED);
|
||||
if (err < 0)
|
||||
goto errout;
|
||||
err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETMULTICAST,
|
||||
NULL, inet6_dump_ifmcaddr,
|
||||
RTNL_FLAG_DUMP_UNLOCKED);
|
||||
if (err < 0)
|
||||
goto errout;
|
||||
err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETANYCAST,
|
||||
NULL, inet6_dump_ifacaddr,
|
||||
RTNL_FLAG_DUMP_UNLOCKED);
|
||||
if (err < 0)
|
||||
goto errout;
|
||||
err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETNETCONF,
|
||||
inet6_netconf_get_devconf,
|
||||
inet6_netconf_dump_devconf,
|
||||
RTNL_FLAG_DOIT_UNLOCKED |
|
||||
RTNL_FLAG_DUMP_UNLOCKED);
|
||||
if (err < 0)
|
||||
goto errout;
|
||||
err = ipv6_addr_label_rtnl_register();
|
||||
if (err < 0)
|
||||
goto errout;
|
||||
|
|
|
|||
|
|
@ -634,23 +634,17 @@ static int ip6addrlbl_get(struct sk_buff *in_skb, struct nlmsghdr *nlh,
|
|||
return err;
|
||||
}
|
||||
|
||||
static const struct rtnl_msg_handler ipv6_adddr_label_rtnl_msg_handlers[] __initconst_or_module = {
|
||||
{.owner = THIS_MODULE, .protocol = PF_INET6, .msgtype = RTM_NEWADDRLABEL,
|
||||
.doit = ip6addrlbl_newdel, .flags = RTNL_FLAG_DOIT_UNLOCKED},
|
||||
{.owner = THIS_MODULE, .protocol = PF_INET6, .msgtype = RTM_DELADDRLABEL,
|
||||
.doit = ip6addrlbl_newdel, .flags = RTNL_FLAG_DOIT_UNLOCKED},
|
||||
{.owner = THIS_MODULE, .protocol = PF_INET6, .msgtype = RTM_GETADDRLABEL,
|
||||
.doit = ip6addrlbl_get, .dumpit = ip6addrlbl_dump,
|
||||
.flags = RTNL_FLAG_DOIT_UNLOCKED | RTNL_FLAG_DUMP_UNLOCKED},
|
||||
};
|
||||
|
||||
int __init ipv6_addr_label_rtnl_register(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_NEWADDRLABEL,
|
||||
ip6addrlbl_newdel,
|
||||
NULL, RTNL_FLAG_DOIT_UNLOCKED);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
ret = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_DELADDRLABEL,
|
||||
ip6addrlbl_newdel,
|
||||
NULL, RTNL_FLAG_DOIT_UNLOCKED);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
ret = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETADDRLABEL,
|
||||
ip6addrlbl_get,
|
||||
ip6addrlbl_dump, RTNL_FLAG_DOIT_UNLOCKED |
|
||||
RTNL_FLAG_DUMP_UNLOCKED);
|
||||
return ret;
|
||||
return rtnl_register_many(ipv6_adddr_label_rtnl_msg_handlers);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2493,6 +2493,12 @@ static struct pernet_operations fib6_net_ops = {
|
|||
.exit = fib6_net_exit,
|
||||
};
|
||||
|
||||
static const struct rtnl_msg_handler fib6_rtnl_msg_handlers[] __initconst_or_module = {
|
||||
{.owner = THIS_MODULE, .protocol = PF_INET6, .msgtype = RTM_GETROUTE,
|
||||
.dumpit = inet6_dump_fib,
|
||||
.flags = RTNL_FLAG_DUMP_UNLOCKED | RTNL_FLAG_DUMP_SPLIT_NLM_DONE},
|
||||
};
|
||||
|
||||
int __init fib6_init(void)
|
||||
{
|
||||
int ret = -ENOMEM;
|
||||
|
|
@ -2506,9 +2512,7 @@ int __init fib6_init(void)
|
|||
if (ret)
|
||||
goto out_kmem_cache_create;
|
||||
|
||||
ret = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETROUTE, NULL,
|
||||
inet6_dump_fib, RTNL_FLAG_DUMP_UNLOCKED |
|
||||
RTNL_FLAG_DUMP_SPLIT_NLM_DONE);
|
||||
ret = rtnl_register_many(fib6_rtnl_msg_handlers);
|
||||
if (ret)
|
||||
goto out_unregister_subsys;
|
||||
|
||||
|
|
|
|||
|
|
@ -1367,6 +1367,12 @@ static struct pernet_operations ip6mr_net_ops = {
|
|||
.exit_batch = ip6mr_net_exit_batch,
|
||||
};
|
||||
|
||||
static const struct rtnl_msg_handler ip6mr_rtnl_msg_handlers[] __initconst_or_module = {
|
||||
{.owner = THIS_MODULE, .protocol = RTNL_FAMILY_IP6MR,
|
||||
.msgtype = RTM_GETROUTE,
|
||||
.doit = ip6mr_rtm_getroute, .dumpit = ip6mr_rtm_dumproute},
|
||||
};
|
||||
|
||||
int __init ip6_mr_init(void)
|
||||
{
|
||||
int err;
|
||||
|
|
@ -1389,9 +1395,8 @@ int __init ip6_mr_init(void)
|
|||
goto add_proto_fail;
|
||||
}
|
||||
#endif
|
||||
err = rtnl_register_module(THIS_MODULE, RTNL_FAMILY_IP6MR, RTM_GETROUTE,
|
||||
ip6mr_rtm_getroute, ip6mr_rtm_dumproute, 0);
|
||||
if (err == 0)
|
||||
err = rtnl_register_many(ip6mr_rtnl_msg_handlers);
|
||||
if (!err)
|
||||
return 0;
|
||||
|
||||
#ifdef CONFIG_IPV6_PIMSM_V2
|
||||
|
|
@ -1408,7 +1413,7 @@ int __init ip6_mr_init(void)
|
|||
|
||||
void ip6_mr_cleanup(void)
|
||||
{
|
||||
rtnl_unregister(RTNL_FAMILY_IP6MR, RTM_GETROUTE);
|
||||
rtnl_unregister_many(ip6mr_rtnl_msg_handlers);
|
||||
#ifdef CONFIG_IPV6_PIMSM_V2
|
||||
inet6_del_protocol(&pim6_protocol, IPPROTO_PIM);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -6680,6 +6680,15 @@ static void bpf_iter_unregister(void)
|
|||
#endif
|
||||
#endif
|
||||
|
||||
static const struct rtnl_msg_handler ip6_route_rtnl_msg_handlers[] __initconst_or_module = {
|
||||
{.owner = THIS_MODULE, .protocol = PF_INET6, .msgtype = RTM_NEWROUTE,
|
||||
.doit = inet6_rtm_newroute},
|
||||
{.owner = THIS_MODULE, .protocol = PF_INET6, .msgtype = RTM_DELROUTE,
|
||||
.doit = inet6_rtm_delroute},
|
||||
{.owner = THIS_MODULE, .protocol = PF_INET6, .msgtype = RTM_GETROUTE,
|
||||
.doit = inet6_rtm_getroute, .flags = RTNL_FLAG_DOIT_UNLOCKED},
|
||||
};
|
||||
|
||||
int __init ip6_route_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
|
@ -6722,19 +6731,7 @@ int __init ip6_route_init(void)
|
|||
if (ret)
|
||||
goto fib6_rules_init;
|
||||
|
||||
ret = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_NEWROUTE,
|
||||
inet6_rtm_newroute, NULL, 0);
|
||||
if (ret < 0)
|
||||
goto out_register_late_subsys;
|
||||
|
||||
ret = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_DELROUTE,
|
||||
inet6_rtm_delroute, NULL, 0);
|
||||
if (ret < 0)
|
||||
goto out_register_late_subsys;
|
||||
|
||||
ret = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETROUTE,
|
||||
inet6_rtm_getroute, NULL,
|
||||
RTNL_FLAG_DOIT_UNLOCKED);
|
||||
ret = rtnl_register_many(ip6_route_rtnl_msg_handlers);
|
||||
if (ret < 0)
|
||||
goto out_register_late_subsys;
|
||||
|
||||
|
|
|
|||
|
|
@ -2243,13 +2243,16 @@ static int tc_dump_action(struct sk_buff *skb, struct netlink_callback *cb)
|
|||
return skb->len;
|
||||
}
|
||||
|
||||
static const struct rtnl_msg_handler tc_action_rtnl_msg_handlers[] __initconst = {
|
||||
{.msgtype = RTM_NEWACTION, .doit = tc_ctl_action},
|
||||
{.msgtype = RTM_DELACTION, .doit = tc_ctl_action},
|
||||
{.msgtype = RTM_GETACTION, .doit = tc_ctl_action,
|
||||
.dumpit = tc_dump_action},
|
||||
};
|
||||
|
||||
static int __init tc_action_init(void)
|
||||
{
|
||||
rtnl_register(PF_UNSPEC, RTM_NEWACTION, tc_ctl_action, NULL, 0);
|
||||
rtnl_register(PF_UNSPEC, RTM_DELACTION, tc_ctl_action, NULL, 0);
|
||||
rtnl_register(PF_UNSPEC, RTM_GETACTION, tc_ctl_action, tc_dump_action,
|
||||
0);
|
||||
|
||||
rtnl_register_many(tc_action_rtnl_msg_handlers);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4055,6 +4055,19 @@ static struct pernet_operations tcf_net_ops = {
|
|||
.size = sizeof(struct tcf_net),
|
||||
};
|
||||
|
||||
static const struct rtnl_msg_handler tc_filter_rtnl_msg_handlers[] __initconst = {
|
||||
{.msgtype = RTM_NEWTFILTER, .doit = tc_new_tfilter,
|
||||
.flags = RTNL_FLAG_DOIT_UNLOCKED},
|
||||
{.msgtype = RTM_DELTFILTER, .doit = tc_del_tfilter,
|
||||
.flags = RTNL_FLAG_DOIT_UNLOCKED},
|
||||
{.msgtype = RTM_GETTFILTER, .doit = tc_get_tfilter,
|
||||
.dumpit = tc_dump_tfilter, .flags = RTNL_FLAG_DOIT_UNLOCKED},
|
||||
{.msgtype = RTM_NEWCHAIN, .doit = tc_ctl_chain},
|
||||
{.msgtype = RTM_DELCHAIN, .doit = tc_ctl_chain},
|
||||
{.msgtype = RTM_GETCHAIN, .doit = tc_ctl_chain,
|
||||
.dumpit = tc_dump_chain},
|
||||
};
|
||||
|
||||
static int __init tc_filter_init(void)
|
||||
{
|
||||
int err;
|
||||
|
|
@ -4068,17 +4081,7 @@ static int __init tc_filter_init(void)
|
|||
goto err_register_pernet_subsys;
|
||||
|
||||
xa_init_flags(&tcf_exts_miss_cookies_xa, XA_FLAGS_ALLOC1);
|
||||
|
||||
rtnl_register(PF_UNSPEC, RTM_NEWTFILTER, tc_new_tfilter, NULL,
|
||||
RTNL_FLAG_DOIT_UNLOCKED);
|
||||
rtnl_register(PF_UNSPEC, RTM_DELTFILTER, tc_del_tfilter, NULL,
|
||||
RTNL_FLAG_DOIT_UNLOCKED);
|
||||
rtnl_register(PF_UNSPEC, RTM_GETTFILTER, tc_get_tfilter,
|
||||
tc_dump_tfilter, RTNL_FLAG_DOIT_UNLOCKED);
|
||||
rtnl_register(PF_UNSPEC, RTM_NEWCHAIN, tc_ctl_chain, NULL, 0);
|
||||
rtnl_register(PF_UNSPEC, RTM_DELCHAIN, tc_ctl_chain, NULL, 0);
|
||||
rtnl_register(PF_UNSPEC, RTM_GETCHAIN, tc_ctl_chain,
|
||||
tc_dump_chain, 0);
|
||||
rtnl_register_many(tc_filter_rtnl_msg_handlers);
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -2420,6 +2420,17 @@ static struct pernet_operations psched_net_ops = {
|
|||
DEFINE_STATIC_KEY_FALSE(tc_skip_wrapper);
|
||||
#endif
|
||||
|
||||
static const struct rtnl_msg_handler psched_rtnl_msg_handlers[] __initconst = {
|
||||
{.msgtype = RTM_NEWQDISC, .doit = tc_modify_qdisc},
|
||||
{.msgtype = RTM_DELQDISC, .doit = tc_get_qdisc},
|
||||
{.msgtype = RTM_GETQDISC, .doit = tc_get_qdisc,
|
||||
.dumpit = tc_dump_qdisc},
|
||||
{.msgtype = RTM_NEWTCLASS, .doit = tc_ctl_tclass},
|
||||
{.msgtype = RTM_DELTCLASS, .doit = tc_ctl_tclass},
|
||||
{.msgtype = RTM_GETTCLASS, .doit = tc_ctl_tclass,
|
||||
.dumpit = tc_dump_tclass},
|
||||
};
|
||||
|
||||
static int __init pktsched_init(void)
|
||||
{
|
||||
int err;
|
||||
|
|
@ -2438,14 +2449,7 @@ static int __init pktsched_init(void)
|
|||
register_qdisc(&mq_qdisc_ops);
|
||||
register_qdisc(&noqueue_qdisc_ops);
|
||||
|
||||
rtnl_register(PF_UNSPEC, RTM_NEWQDISC, tc_modify_qdisc, NULL, 0);
|
||||
rtnl_register(PF_UNSPEC, RTM_DELQDISC, tc_get_qdisc, NULL, 0);
|
||||
rtnl_register(PF_UNSPEC, RTM_GETQDISC, tc_get_qdisc, tc_dump_qdisc,
|
||||
0);
|
||||
rtnl_register(PF_UNSPEC, RTM_NEWTCLASS, tc_ctl_tclass, NULL, 0);
|
||||
rtnl_register(PF_UNSPEC, RTM_DELTCLASS, tc_ctl_tclass, NULL, 0);
|
||||
rtnl_register(PF_UNSPEC, RTM_GETTCLASS, tc_ctl_tclass, tc_dump_tclass,
|
||||
0);
|
||||
rtnl_register_many(psched_rtnl_msg_handlers);
|
||||
|
||||
tc_wrapper_init();
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue