linux linkwatch进程指的是什么

服务器   发布日期:2023年08月25日   浏览次数:780

本文小编为大家详细介绍“linux linkwatch进程指的是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux linkwatch进程指的是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

linux linkwatch是“链接状态改变”进程;在linux 网络协议栈中,linkwatch模块用来通知网卡当前是否能够进行数据传输;在驱动中调用“netif_carrier_on/netif_carrier_off”函数来通知网络状态变化。

链接状态改变(linkwatch)

在Linux网络协议栈中linkwatch模块用来通知网卡当前是否能够进行数据传输.

驱动中调用netif_carrier_on/netif_carrier_off函数来通知网络状态变化.

主要作用:

  • 启动/禁止 TX队列的流量控制功能

  • 发起netlink消息NETDEV_CHANGE到用户空间

  1. void netif_carrier_on(struct net_device *dev)
  2. {
  3. if (test_and_clear_bit(__LINK_STATE_NOCARRIER, &dev->state)) {
  4. if (dev->reg_state == NETREG_UNINITIALIZED)
  5. return;
  6. linkwatch_fire_event(dev);
  7. if (netif_running(dev))
  8. __netdev_watchdog_up(dev);
  9. }
  10. }
  11. void netif_carrier_off(struct net_device *dev)
  12. {
  13. if (!test_and_set_bit(__LINK_STATE_NOCARRIER, &dev->state)) {
  14. if (dev->reg_state == NETREG_UNINITIALIZED)
  15. return ;
  16. linkwatch_fire_event(dev);
  17. }
  18. }
  19. linwatch模块,只需要知道状态改变了,不需要知道具体是on还是off
  20. void linkwatch_fire_event(struct net_device *dev)
  21. {
  22. /*判断是否为紧急事件, 内核规定两次事件的间隔至少为1个HZ*/
  23. bool urgent = linkwatch_urgent_event(dev);
  24. if (!test_and_set_bit(__LINK_STATE_LINKWATCH_PENDING, &dev->state)) {
  25. linkwatch_add_event(dev);//把dev添加到lweventlist链表
  26. } else if (!urgent)
  27. return;
  28. /*调用工作队列linkwatch_event */
  29. linkwatch_schedule_work(urgent);
  30. }
  31. static void __linkwatch_run_queue(int urgent_only)
  32. {
  33. struct net_device *dev;
  34. LIST_HEAD(wrk);
  35. while (!list_empty(&wrk)) {
  36. dev = list_first_entry(&wrk, struct net_device, link_watch_list);
  37. list_del_init(&dev->link_watch_list);
  38. /*判断是否只执行紧急事件 */
  39. if (urgent_only && !linkwatch_urgent_event(dev)) {
  40. list_add_tail(&dev->link_watch_list, &lweventlist);
  41. continue;
  42. }
  43. spin_unlock_irq(&lweventlist_lock);
  44. linkwatch_do_dev(dev);
  45. spin_lock_irq(&lweventlist_lock);
  46. }
  47. if (!list_empty(&lweventlist)){
  48. linkwatch_schedule_work(0);
  49. }
  50. spin_unlock_irq(&lweventlist_lock);
  51. }
  52. static void linkwatch_do_dev(struct net_device *dev)
  53. {
  54. rfc2863_policy(dev);
  55. if (dev->flags & IFF_UP) {
  56. if (netif_carrier_ok(dev))
  57. dev_activate(dev);//启动tx队列流量控制功能
  58. else
  59. dev_deactivate(dev);//禁止tx队列流量控制功能
  60. netdev_state_change(dev);//发起Netlink事件:NETDEV_CHANGE
  61. }
  62. dev_put(dev);
  63. }

以上就是linux linkwatch进程指的是什么的详细内容,更多关于linux linkwatch进程指的是什么的资料请关注九品源码其它相关文章!