linux linkwatch是什么進程

linux linkwatch是“鏈接狀態改變”進程;在linux 網絡協議棧中,linkwatch模塊用來通知網卡當前是否能夠進行數據傳輸;在驅動中調用“netif_carrier_on/netif_carrier_off”函數來通知網絡狀態變化。

linux linkwatch是什么進程

本教程操作環境:linux5.9.8系統、Dell G3電腦。

linux linkwatch是什么進程?

鏈接狀態改變(linkwatch)

在Linux網絡協議棧中linkwatch模塊用來通知網卡當前是否能夠進行數據傳輸.

驅動中調用netif_carrier_on/netif_carrier_off函數來通知網絡狀態變化.

主要作用:

  • 啟動/禁止 TX隊列的流量控制功能

  • 發起netlink消息NETDEV_CHANGE到用戶空間

?

void?netif_carrier_on(struct?net_device?*dev) { ?????????if?(test_and_clear_bit(__LINK_STATE_NOCARRIER,?&dev->state))?{ ???????????????????if?(dev->reg_state?==?NETREG_UNINITIALIZED) ????????????????????????????return; ???????????????????linkwatch_fire_event(dev); ???????????????????if?(netif_running(dev)) ????????????????????????????__netdev_watchdog_up(dev); ?????????} } void?netif_carrier_off(struct?net_device?*dev) { ?????????if?(!test_and_set_bit(__LINK_STATE_NOCARRIER,?&dev->state))?{ ???????????????????if?(dev->reg_state?==?NETREG_UNINITIALIZED) ????????????????????????????return?; ???????????????????linkwatch_fire_event(dev); ?????????} } linwatch模塊,只需要知道狀態改變了,不需要知道具體是on還是off void?linkwatch_fire_event(struct?net_device?*dev) { ???/*判斷是否為緊急事件,?內核規定兩次事件的間隔至少為1個HZ*/ ?????????bool?urgent?=?linkwatch_urgent_event(dev); ?????????if?(!test_and_set_bit(__LINK_STATE_LINKWATCH_PENDING,?&dev->state))?{ ???????????????????linkwatch_add_event(dev);//把dev添加到lweventlist鏈表 ?????????}?else?if?(!urgent) ???????????????????return; ???/*調用工作隊列linkwatch_event?*/ ?????????linkwatch_schedule_work(urgent); } ? static?void?__linkwatch_run_queue(int?urgent_only) { ?????????struct?net_device?*dev; ?????????LIST_HEAD(wrk); ?????????while?(!list_empty(&wrk))?{ ???????????????????dev?=?list_first_entry(&wrk,?struct?net_device,?link_watch_list); ???????????????????list_del_init(&dev->link_watch_list); ??????/*判斷是否只執行緊急事件?*/ ???????????????????if?(urgent_only?&&?!linkwatch_urgent_event(dev))?{ ????????????????????????????list_add_tail(&dev->link_watch_list,?&lweventlist); ????????????????????????????continue; ???????????????????}??????? ???????????????????spin_unlock_irq(&lweventlist_lock); ???????????????????linkwatch_do_dev(dev); ???????????????????spin_lock_irq(&lweventlist_lock); ?????????} ?????????if?(!list_empty(&lweventlist)){ ???????????????????linkwatch_schedule_work(0); ?????????} ?????????spin_unlock_irq(&lweventlist_lock); } ? static?void?linkwatch_do_dev(struct?net_device?*dev) { ?????????rfc2863_policy(dev); ?????????if?(dev->flags?&?IFF_UP)?{ ???????????????????if?(netif_carrier_ok(dev)) ????????????????????????????dev_activate(dev);//啟動tx隊列流量控制功能 ???????????????????else ????????????????????????????dev_deactivate(dev);//禁止tx隊列流量控制功能 ???????????????????netdev_state_change(dev);//發起Netlink事件:NETDEV_CHANGE ?????????} ?????????dev_put(dev); }

相關推薦:《Linux視頻教程

以上就是

? 版權聲明
THE END
喜歡就支持一下吧
點贊6 分享