鏈結狀態改變 linkwatch

2021-08-15 23:50:24 字數 1398 閱讀 2022

在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)) 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);

狀態模式 狀態改變行為

what 普遍定義 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來形式改變了其類 自己總結 物件的行為隨著狀態改變 when 那麼何時使用呢?這個根據定義就可知道,當物件的行為根據狀態變化,並且在執行時刻根據狀態變化,就考略用狀態模式.也可以說,當乙個物件的轉換條件過於複雜的時候,使用這個...

iCheck狀態不能改變

1.1.1 現象 在 ui中使用了bootstrap的icheck外掛程式,呼叫.icheck uncheck 函式將checkbox設定為未選中狀態,結果ui上沒有任何變化,還是處於選中狀態。1.1.2 原因 經過跟蹤icheck原始碼發現,其在修改顯示狀態之前,先判斷了物件的checked屬性,...

iCheck狀態不能改變

1.1.1 現象 在 ui中使用了bootstrap的icheck外掛程式,呼叫.icheck uncheck 函式將checkbox設定為未選中狀態,結果ui上沒有任何變化,還是處於選中狀態。1.1.2 原因 經過跟蹤icheck原始碼發現,其在修改顯示狀態之前,先判斷了物件的checked屬性,...