> 운영 및 유지보수 > 리눅스 운영 및 유지 관리 > 리눅스 링크워치는 어떤 프로세스인가요?

리눅스 링크워치는 어떤 프로세스인가요?

藏色散人
풀어 주다: 2023-03-14 10:30:05
원래의
1274명이 탐색했습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿