netdev-notifier-error-inject.c 1.5 KB

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