Linux linkwatch는 Linux 네트워크 프로토콜 스택의 "링크 상태 변경" 프로세스입니다. linkwatch 모듈은 드라이버에서 "netif_carrier_on/netif_carrier_off" 함수가 호출되어 현재 데이터를 전송할 수 있는지 여부를 알리는 데 사용됩니다. 네트워크 상태 변경을 알립니다.
이 튜토리얼의 운영 환경: linux5.9.8 시스템, Dell G3 컴퓨터.
리눅스 링크워치 프로세스는 어떻게 되나요?
링크 상태 변경(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); }
관련 권장 사항: " 리눅스 영상 튜토리얼"
위 내용은 리눅스 링크워치는 어떤 프로세스인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!