Linux linkwatch est un processus de « changement d'état de lien » ; dans la pile de protocole réseau Linux, le module linkwatch est utilisé pour indiquer à la carte réseau si elle peut actuellement transmettre des données ; la fonction « netif_carrier_on/netif_carrier_off » est appelée dans le pilote pour notifier le changement d’état du réseau.
L'environnement d'exploitation de ce tutoriel : système linux5.9.8, ordinateur Dell G3.
Quel est le processus de Linux Linkwatch ?
Changement d'état du lien (linkwatch)
Dans la pile de protocole réseau Linux, le module linkwatch est utilisé pour notifier à la carte réseau si elle peut actuellement transmettre des données.
Le pilote appelle la fonction netif_carrier_on/netif_carrier_off pour notifier le changement d'état du réseau.
Fonction principale :
Activer/désactiver la fonction de contrôle de flux de la file d'attente TX
Initier le message netlink NETDEV_CHANGE vers l'espace utilisateur
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); }
Recommandations associées : " Linux Tutoriel vidéo"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!