ホームページ > 運用・保守 > Linuxの運用と保守 > Linux linkwatchとはどのようなプロセスですか?

Linux linkwatchとはどのようなプロセスですか?

藏色散人
リリース: 2023-03-14 10:30:05
オリジナル
1249 人が閲覧しました

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 キューのフロー制御を有効または無効にする 機能

  • ユーザー スペースへのネットリンク メッセージ 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 ビデオ チュートリアル

以上がLinux linkwatchとはどのようなプロセスですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート