netdev-notifier-error-inject.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. #include <linux/kernel.h>
  3. #include <linux/module.h>
  4. #include <linux/netdevice.h>
  5. #include "notifier-error-inject.h"
  6. static int priority;
  7. module_param(priority, int, 0);
  8. MODULE_PARM_DESC(priority, "specify netdevice notifier priority");
  9. static struct notifier_err_inject netdev_notifier_err_inject = {
  10. .actions = {
  11. { NOTIFIER_ERR_INJECT_ACTION(NETDEV_REGISTER) },
  12. { NOTIFIER_ERR_INJECT_ACTION(NETDEV_CHANGEMTU) },
  13. { NOTIFIER_ERR_INJECT_ACTION(NETDEV_CHANGENAME) },
  14. { NOTIFIER_ERR_INJECT_ACTION(NETDEV_PRE_UP) },
  15. { NOTIFIER_ERR_INJECT_ACTION(NETDEV_PRE_TYPE_CHANGE) },
  16. { NOTIFIER_ERR_INJECT_ACTION(NETDEV_POST_INIT) },
  17. { NOTIFIER_ERR_INJECT_ACTION(NETDEV_PRECHANGEMTU) },
  18. { NOTIFIER_ERR_INJECT_ACTION(NETDEV_PRECHANGEUPPER) },
  19. { NOTIFIER_ERR_INJECT_ACTION(NETDEV_CHANGEUPPER) },
  20. {}
  21. }
  22. };
  23. static struct dentry *dir;
  24. static int netdev_err_inject_init(void)
  25. {
  26. int err;
  27. dir = notifier_err_inject_init("netdev", notifier_err_inject_dir,
  28. &netdev_notifier_err_inject, priority);
  29. if (IS_ERR(dir))
  30. return PTR_ERR(dir);
  31. err = register_netdevice_notifier(&netdev_notifier_err_inject.nb);
  32. if (err)
  33. debugfs_remove_recursive(dir);
  34. return err;
  35. }
  36. static void netdev_err_inject_exit(void)
  37. {
  38. unregister_netdevice_notifier(&netdev_notifier_err_inject.nb);
  39. debugfs_remove_recursive(dir);
  40. }
  41. module_init(netdev_err_inject_init);
  42. module_exit(netdev_err_inject_exit);
  43. MODULE_DESCRIPTION("Netdevice notifier error injection module");
  44. MODULE_LICENSE("GPL");
  45. MODULE_AUTHOR("Nikolay Aleksandrov <razor@blackwall.org>");