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);
}
반응형
'IT > 네트워크' 카테고리의 다른 글
net_device Structure (net_device 구조체) (0) | 2015.07.01 |
---|---|
캐리어 손실과 관련 함수(carrier loss and funtions) (0) | 2015.07.01 |
링크상태 변화 이벤트의 스케쥴링과 프로세싱 (Scheduling and processing link state change events) (0) | 2015.07.01 |
일방향 네트워크, Unidirectional network (0) | 2015.05.18 |