@@ -338,65 +338,14 @@ static int rtnl_register_internal(struct module *owner,
338338 return ret ;
339339}
340340
341- /**
342- * rtnl_register_module - Register a rtnetlink message type
343- *
344- * @owner: module registering the hook (THIS_MODULE)
345- * @protocol: Protocol family or PF_UNSPEC
346- * @msgtype: rtnetlink message type
347- * @doit: Function pointer called for each request message
348- * @dumpit: Function pointer called for each dump request (NLM_F_DUMP) message
349- * @flags: rtnl_link_flags to modify behaviour of doit/dumpit functions
350- *
351- * Like rtnl_register, but for use by removable modules.
352- */
353- int rtnl_register_module (struct module * owner ,
354- int protocol , int msgtype ,
355- rtnl_doit_func doit , rtnl_dumpit_func dumpit ,
356- unsigned int flags )
357- {
358- return rtnl_register_internal (owner , protocol , msgtype ,
359- doit , dumpit , flags );
360- }
361- EXPORT_SYMBOL_GPL (rtnl_register_module );
362-
363- /**
364- * rtnl_register - Register a rtnetlink message type
365- * @protocol: Protocol family or PF_UNSPEC
366- * @msgtype: rtnetlink message type
367- * @doit: Function pointer called for each request message
368- * @dumpit: Function pointer called for each dump request (NLM_F_DUMP) message
369- * @flags: rtnl_link_flags to modify behaviour of doit/dumpit functions
370- *
371- * Registers the specified function pointers (at least one of them has
372- * to be non-NULL) to be called whenever a request message for the
373- * specified protocol family and message type is received.
374- *
375- * The special protocol family PF_UNSPEC may be used to define fallback
376- * function pointers for the case when no entry for the specific protocol
377- * family exists.
378- */
379- void rtnl_register (int protocol , int msgtype ,
380- rtnl_doit_func doit , rtnl_dumpit_func dumpit ,
381- unsigned int flags )
382- {
383- int err ;
384-
385- err = rtnl_register_internal (NULL , protocol , msgtype , doit , dumpit ,
386- flags );
387- if (err )
388- pr_err ("Unable to register rtnetlink message handler, "
389- "protocol = %d, message type = %d\n" , protocol , msgtype );
390- }
391-
392341/**
393342 * rtnl_unregister - Unregister a rtnetlink message type
394343 * @protocol: Protocol family or PF_UNSPEC
395344 * @msgtype: rtnetlink message type
396345 *
397346 * Returns 0 on success or a negative error code.
398347 */
399- int rtnl_unregister (int protocol , int msgtype )
348+ static int rtnl_unregister (int protocol , int msgtype )
400349{
401350 struct rtnl_link __rcu * * tab ;
402351 struct rtnl_link * link ;
@@ -419,7 +368,6 @@ int rtnl_unregister(int protocol, int msgtype)
419368
420369 return 0 ;
421370}
422- EXPORT_SYMBOL_GPL (rtnl_unregister );
423371
424372/**
425373 * rtnl_unregister_all - Unregister all rtnetlink message type of a protocol
@@ -454,6 +402,26 @@ void rtnl_unregister_all(int protocol)
454402}
455403EXPORT_SYMBOL_GPL (rtnl_unregister_all );
456404
405+ /**
406+ * __rtnl_register_many - Register rtnetlink message types
407+ * @handlers: Array of struct rtnl_msg_handlers
408+ * @n: The length of @handlers
409+ *
410+ * Registers the specified function pointers (at least one of them has
411+ * to be non-NULL) to be called whenever a request message for the
412+ * specified protocol family and message type is received.
413+ *
414+ * The special protocol family PF_UNSPEC may be used to define fallback
415+ * function pointers for the case when no entry for the specific protocol
416+ * family exists.
417+ *
418+ * When one element of @handlers fails to register,
419+ * 1) built-in: panics.
420+ * 2) modules : the previous successful registrations are unwinded
421+ * and an error is returned.
422+ *
423+ * Use rtnl_register_many().
424+ */
457425int __rtnl_register_many (const struct rtnl_msg_handler * handlers , int n )
458426{
459427 const struct rtnl_msg_handler * handler ;
@@ -464,6 +432,10 @@ int __rtnl_register_many(const struct rtnl_msg_handler *handlers, int n)
464432 handler -> msgtype , handler -> doit ,
465433 handler -> dumpit , handler -> flags );
466434 if (err ) {
435+ if (!handler -> owner )
436+ panic ("Unable to register rtnetlink message "
437+ "handlers, %pS\n" , handlers );
438+
467439 __rtnl_unregister_many (handlers , i );
468440 break ;
469441 }
@@ -6839,41 +6811,44 @@ static struct pernet_operations rtnetlink_net_ops = {
68396811 .exit = rtnetlink_net_exit ,
68406812};
68416813
6814+ static const struct rtnl_msg_handler rtnetlink_rtnl_msg_handlers [] __initconst = {
6815+ {.msgtype = RTM_NEWLINK , .doit = rtnl_newlink },
6816+ {.msgtype = RTM_DELLINK , .doit = rtnl_dellink },
6817+ {.msgtype = RTM_GETLINK , .doit = rtnl_getlink ,
6818+ .dumpit = rtnl_dump_ifinfo , .flags = RTNL_FLAG_DUMP_SPLIT_NLM_DONE },
6819+ {.msgtype = RTM_SETLINK , .doit = rtnl_setlink },
6820+ {.msgtype = RTM_GETADDR , .dumpit = rtnl_dump_all },
6821+ {.msgtype = RTM_GETROUTE , .dumpit = rtnl_dump_all },
6822+ {.msgtype = RTM_GETNETCONF , .dumpit = rtnl_dump_all },
6823+ {.msgtype = RTM_GETSTATS , .doit = rtnl_stats_get ,
6824+ .dumpit = rtnl_stats_dump },
6825+ {.msgtype = RTM_SETSTATS , .doit = rtnl_stats_set },
6826+ {.msgtype = RTM_NEWLINKPROP , .doit = rtnl_newlinkprop },
6827+ {.msgtype = RTM_DELLINKPROP , .doit = rtnl_dellinkprop },
6828+ {.protocol = PF_BRIDGE , .msgtype = RTM_GETLINK ,
6829+ .dumpit = rtnl_bridge_getlink },
6830+ {.protocol = PF_BRIDGE , .msgtype = RTM_DELLINK ,
6831+ .doit = rtnl_bridge_dellink },
6832+ {.protocol = PF_BRIDGE , .msgtype = RTM_SETLINK ,
6833+ .doit = rtnl_bridge_setlink },
6834+ {.protocol = PF_BRIDGE , .msgtype = RTM_NEWNEIGH , .doit = rtnl_fdb_add },
6835+ {.protocol = PF_BRIDGE , .msgtype = RTM_DELNEIGH , .doit = rtnl_fdb_del ,
6836+ .flags = RTNL_FLAG_BULK_DEL_SUPPORTED },
6837+ {.protocol = PF_BRIDGE , .msgtype = RTM_GETNEIGH , .doit = rtnl_fdb_get ,
6838+ .dumpit = rtnl_fdb_dump },
6839+ {.protocol = PF_BRIDGE , .msgtype = RTM_NEWMDB , .doit = rtnl_mdb_add },
6840+ {.protocol = PF_BRIDGE , .msgtype = RTM_DELMDB , .doit = rtnl_mdb_del ,
6841+ .flags = RTNL_FLAG_BULK_DEL_SUPPORTED },
6842+ {.protocol = PF_BRIDGE , .msgtype = RTM_GETMDB , .doit = rtnl_mdb_get ,
6843+ .dumpit = rtnl_mdb_dump },
6844+ };
6845+
68426846void __init rtnetlink_init (void )
68436847{
68446848 if (register_pernet_subsys (& rtnetlink_net_ops ))
68456849 panic ("rtnetlink_init: cannot initialize rtnetlink\n" );
68466850
68476851 register_netdevice_notifier (& rtnetlink_dev_notifier );
68486852
6849- rtnl_register (PF_UNSPEC , RTM_GETLINK , rtnl_getlink ,
6850- rtnl_dump_ifinfo , RTNL_FLAG_DUMP_SPLIT_NLM_DONE );
6851- rtnl_register (PF_UNSPEC , RTM_SETLINK , rtnl_setlink , NULL , 0 );
6852- rtnl_register (PF_UNSPEC , RTM_NEWLINK , rtnl_newlink , NULL , 0 );
6853- rtnl_register (PF_UNSPEC , RTM_DELLINK , rtnl_dellink , NULL , 0 );
6854-
6855- rtnl_register (PF_UNSPEC , RTM_GETADDR , NULL , rtnl_dump_all , 0 );
6856- rtnl_register (PF_UNSPEC , RTM_GETROUTE , NULL , rtnl_dump_all , 0 );
6857- rtnl_register (PF_UNSPEC , RTM_GETNETCONF , NULL , rtnl_dump_all , 0 );
6858-
6859- rtnl_register (PF_UNSPEC , RTM_NEWLINKPROP , rtnl_newlinkprop , NULL , 0 );
6860- rtnl_register (PF_UNSPEC , RTM_DELLINKPROP , rtnl_dellinkprop , NULL , 0 );
6861-
6862- rtnl_register (PF_BRIDGE , RTM_NEWNEIGH , rtnl_fdb_add , NULL , 0 );
6863- rtnl_register (PF_BRIDGE , RTM_DELNEIGH , rtnl_fdb_del , NULL ,
6864- RTNL_FLAG_BULK_DEL_SUPPORTED );
6865- rtnl_register (PF_BRIDGE , RTM_GETNEIGH , rtnl_fdb_get , rtnl_fdb_dump , 0 );
6866-
6867- rtnl_register (PF_BRIDGE , RTM_GETLINK , NULL , rtnl_bridge_getlink , 0 );
6868- rtnl_register (PF_BRIDGE , RTM_DELLINK , rtnl_bridge_dellink , NULL , 0 );
6869- rtnl_register (PF_BRIDGE , RTM_SETLINK , rtnl_bridge_setlink , NULL , 0 );
6870-
6871- rtnl_register (PF_UNSPEC , RTM_GETSTATS , rtnl_stats_get , rtnl_stats_dump ,
6872- 0 );
6873- rtnl_register (PF_UNSPEC , RTM_SETSTATS , rtnl_stats_set , NULL , 0 );
6874-
6875- rtnl_register (PF_BRIDGE , RTM_GETMDB , rtnl_mdb_get , rtnl_mdb_dump , 0 );
6876- rtnl_register (PF_BRIDGE , RTM_NEWMDB , rtnl_mdb_add , NULL , 0 );
6877- rtnl_register (PF_BRIDGE , RTM_DELMDB , rtnl_mdb_del , NULL ,
6878- RTNL_FLAG_BULK_DEL_SUPPORTED );
6853+ rtnl_register_many (rtnetlink_rtnl_msg_handlers );
68796854}
0 commit comments