300x250

Understanding Linux Network Internals

Chapter 8 : 디바이스 등록과 초기화링크 상태 변화 탐지 (Link State Change Detection)

 

NIC 디바이스 드라이버가 캐리어나 시그널의 존재나 부재를 탐지할때, NIC에 등록된 설정을 읽음으로써 NIC으로부터 커널에게 netif_carrier_on과 netif_carrier_off를 통해 전달한다.

 
이런 루틴은 캐리어 상태의 변화가 있을때 호출이 된다. 
 
다음은 링크 상태의 변화의 몇가지 케이스이다. : 
* 케이블이 NIC로부터 플러그 into 또는 unplugged
* 다른 끝단의 디바이스가 작동중이지 않을때(디바이스는 허브, 브릿지, 라우터, PCNIC등)
 
디바이스 드라이버가 캐리어를 탐지하여 netif_carrier_on이 호출될 때 : 
* dev->state의 __LINK_STATE_NOCARRIER 플래그가 삭제됨. 
* 링크신호 변화 이벤트가 발생하고 linkwatch_fire_event가 처리된다. (Scheduling and processing link state change event 참고) 
* 만약 디바이스가 작동가능하면, watchdog timer가 시작됨. 
  타이머는 전송 실패를 탐지하고 stuck을 가져오기 위한 트래픽 컨트롤에 사용됨.(watchdog timer 참고) 
 
static inline netif_carrier_on(struct net_device *dev) 
{ 
 if (test_and_clear_bit(__LINK_STATE_NOCARRIER, &dev->state)) 
 linkwatch_fire_event(dev); 
 if (netif_running(dev)) 
 __netdev_watchdog_up(dev);
}
 
 디바이스 드라이버가 캐리어의 손실을 탐지하여 netif_carrier_off가 호출될때 :
 * dev->state의 __LINK_STATE_NOCARRIER flag 설정
 * 링크상태변경이벤트를 발생 시키고 linkwatch_fire_event를 처리하기 위해 전달됨.(Scheduling and processing link state change events 참고)
 
위 두 루틴은 링크 상태 변화 이벤트를 발생 시키고 linkwatch_fire_event를 처리하기 위해 전달된다. 

static inline netif_carrier_off(struct net_device *dev) 
{ 
if(!test_and_set_bit(__LINK_STATE_NOCARRIER, &dev->state)) 
 linkwatch_fire_event(dev); 
}

 

 

 

반응형

+ Recent posts