Heim >Betrieb und Instandhaltung >Betrieb und Wartung von Linux >Welcher Prozess ist Linux Linkwatch?

Welcher Prozess ist Linux Linkwatch?

藏色散人
藏色散人Original
2023-03-14 10:30:051251Durchsuche

Linux Linkwatch ist ein „Link Status Change“-Prozess; im Linux-Netzwerkprotokollstapel wird das Linkwatch-Modul verwendet, um der Netzwerkkarte mitzuteilen, ob sie derzeit Daten übertragen kann Benachrichtigen Sie die Netzwerkstatusänderung.

Welcher Prozess ist Linux Linkwatch?

Die Betriebsumgebung dieses Tutorials: Linux5.9.8-System, Dell G3-Computer.

Was ist der Prozess von Linux Linkwatch?

Linkstatusänderung (Linkwatch)

Im Linux-Netzwerkprotokollstapel wird das Linkwatch-Modul verwendet, um der Netzwerkkarte mitzuteilen, ob sie derzeit Daten übertragen kann.

Der Treiber ruft die Funktion netif_carrier_on/netif_carrier_off auf, um dies zu benachrichtigen Netzwerkstatusänderung.

Hauptfunktion:

  • Aktivieren/Deaktivieren der Flusskontrollfunktion der TX-Warteschlange

  • Initiieren Sie die Netlink-Nachricht NETDEV_CHANGE an den Benutzerbereich

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

Verwandte Empfehlungen: " Linux Video-Tutorial"

Das obige ist der detaillierte Inhalt vonWelcher Prozess ist Linux Linkwatch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn