Understanding Linux Network internals
Chapter 8 : 디바이스 등록과 초기화( Device Registration and Initialization )
링크상태 변화 이벤트의 스케쥴링과 프로세싱 (Scheduling and processing link state change events)
링크상태 변화 이벤트는 lw_event 구조체에 정의되어 있다.
구조체는 간단하다. net_device 구조체와 연관된 포인터를 포함하고 있다. 그리고 다른 필드는 링크 상태 변화 이벤트의 전역 리스트에 구조체를 연결시킬 목적으로 사용된다.(lweventlist)
그 리스트는 lweventlist_lock에 의해 보호된다.
lw_event 구조체는 탐지와 케리어의 손실간의 구분을 위한 파라미터를 포함하지 않는다. 모든 커널은 링크상태의 변화가 있다는 것을 알아야할 필요가 있는데, 그럼에도 디바이스를 위한 참조로는 충분하다. 어떤 디바이스라도 lweventlist의 lw_event는 단 한개이다. 왜냐하면 변화를 기록하는데 더 많이 있어야할 필요가 없기 때문이다. condition은 dev->state의 __LINK_STATE_LINKWATCH_PENDING flag를 체크함으로써 탐지 가능하다.
lw_event 데이터 구조체가 올바른 net_device 인스턴스와 함께 초기화 되자마자 lweventlist의 list에 추가된다. 그리고 __LINK_STATE_LINKWATCH_PENDING flag는 (dev->state 내부의) 셋팅 된다.
linkwatch_fire_event는 lweventlist의 리스트의 요소를 실행하는 루틴의 실행이 필요하다.
이 루틴(linkwatch_event)는 즉시 called 되어 지지 않는다. 이는 keventd_wq 커널 스레드를 요청하는 것을 submit함에 의해 실행이 스케쥴된다. work_struct 데이터 구조체는 linkwatch_event 루틴을 참조하여 초기화되고 keventd_wq에 전달된다.
처리 루틴인 linkwatch_event가 너무 자주 실행되는 것을 피하기 위해, 1초에 한번의 비율로 실행된다.
linkwatch_event는 lweventlist의 요소를 rtnl lock의 보호하에 linkwatch_run_queue와 함께 처리한다. (rtnl lock은 "locking" 섹션에 설명되어있다.)
lw_event 인스턴스는 다음과 같이 구성되어 있다.
dev->state의 __LINK_STATE_LINKWATCH_PENDING flag 삭제
netdev_chain notification 체인에서의 NETDEV_CHANGE notification 전송
RTMGRP_LINK RTnetlink 그룹으로 RTM_NEWLINK notification을 전송. (RTnetlink link notifications 섹션 참조)
두 notifications는 오직 디바이스가 enabled 될때 netdev_state_change에 의해 보내진다.
Linkwatch flags
net/core/linkwatch.c의 코드는 두 flags를 정의한다. 두 flags는 전역 변수 linkwatch_flags에 셋팅 될 수 있다.
LW_RUNNING = 플래그가 셋되었을때, linkwatch_event는 실행을 위해 스케쥴된다. 플래그는 linkwatch_event 그 자체에 의해 지워진다.
LW_SE_USED = lweventlist는 종종 최소 한개의 요소만 가지기 때문에, 코드는 lw_event데이터 구조 할당을 최대한으로 활용한다.
'IT > 네트워크' 카테고리의 다른 글
링크 상태 변화 감지 (Link State Change Detection) (0) | 2015.07.02 |
---|---|
net_device Structure (net_device 구조체) (0) | 2015.07.01 |
캐리어 손실과 관련 함수(carrier loss and funtions) (0) | 2015.07.01 |
일방향 네트워크, Unidirectional network (0) | 2015.05.18 |