在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屬性,...