네트워크 디바이스 드라이버를 수정해보고자 합니다.
Atheros 계열 무선랜카드에 madwifi 드라이버를 설치했습니다. OS는 우분투입니다.
현재는 코드 분석 중에 있구요 패킷이 수신된 후 호출되는 함수부터 시작해서 흐름을 읽어가고 있습니다.
최종적으로는 패킷 모니터링을 해보고자 하는데 커널, 디바이스 등 기초적인 배경지식 부분에서 많이 막히네요
질문 첫번 째)
코드 분석 하면서 중요하다고 생각하는 구조체, 변수 부분을 프린트해서 눈으로 확인하면서 진행하고 싶은데, 어떻게 해야할까요
일반 코드라면 printf 찍어서 실행하면서 확인하면 되는데, 이건 실행파일이 따로 있는 것도 아니고 난감합니다.
현재 보고 있는 소스의 앞부분입니다. 파라미터값이나 sc->sc_ah 이런 부분의 값을 확인하고 싶습니다.
ath_intr(int irq, void *dev_id, struct pt_regs *regs)
#endif
{
struct net_device *dev = dev_id;
struct ath_softc *sc = dev->priv;
struct ath_hal *ah = sc->sc_ah;
HAL_INT status;
int needmark;
if (sc->sc_invalid) {
/*
* The hardware is not ready/present, don't touch anything.
* Note this can happen early on if the IRQ is shared.
*/
return IRQ_NONE;
}
if (!ath_hal_intrpend(ah)) /* shared irq, not for us */
return IRQ_NONE;
.
.
.
질문 두번 째)
아직 네트워크 디바이스 드라이버에 대한 개념이 확실치 않아 하는 질문입니다.
패킷 도착후 드라이버에서 인터럽트 핸들러를 실행하고, netif_rx()를 호출하자나요.
ifconfig나 madwifi 의 tool인 wlanconfig 등은 네트워크 정보를 보여주는데, 어느 부분에서 데이터를 가져오는건가요
디바이스 드라이버인지 혹은 그 상위 단계인지.
ISO C90 forbids mixed declarations and code
위 소스뿐 아니라 어떤 소스에라도 먼가 추가를 하면 이 에러가 뜨면서 컴파일이 안됩니다.
"ISO C90 forbids mixed
"ISO C90 forbids mixed declarations and code" 내용으로 구글 검색해보시면 바로 알 수 있습니다.
C90 표준에서는 변수 선언을 아무 곳에서나 하면 안 되고, 코드 맨 앞 부분에 해야 합니다.
함수 시작 부분에 관련 변수 선언을 모두 해보세요.
필요한 관련 헤더들도 제대로 포함되었는지 확인해보시고요.
답변1) printk를 사용해보세요.
답변2) ifconfig은 /proc/net/dev 파일의 정보를 읽어서 보여주는 것 같네요.
net/core/dev.c 파일에서 dev_seq_show() 함수와 dev_seq_printf_stats() 함수를 확인해보세요.
dev_seq_show() 함수가 /proc/net/dev를 읽을 때 호출되는 함수입니다.
실제 stat 정보는 device driver에서 업데이트하게 됩니다.
이전 커널에서는 dev->get_stats로 등록된 함수가 해당 statistics 구조체를 return하고,
최근 커널(http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=eeda3fd64f75bcbfaa70ce946513abaf3f23b8e0 이후)에서는
dev->netdev_ops->get_stats로 등록된 함수가 statistics 구조체를 return하는 것으로 보입니다.
친절한 답변 감사합니다^^
그런데 첫번 째가 여전히 문제입니다.
님 답변주시기 전에 printk 찍어 봤는데 역시나 컴파일에서 에러가 났습니다;;
다른 코드 전혀 추가 안하고 단지 printk("packet received \n"); 이 한줄만 추가해도 ISO C90 forbids mixed...
구글링을 해봐도 보통 warning 이고 error까진 아니던데....후우;
컴파일 방법에 문제가 있는건지, 코드 수정을 막아 놓건지 별 생각이 다 드네요. 분명 오픈 소스인데 ㅠ
madwifi/net80211/ieee80211_input.c 이 소스 수정 후 madwifi/net80211/여기서 make 한번 madwifi/여기서 다시 한번 이렇게 하는거 아닌가요?
madwifi/net80211/tools/wlanconfig.c 이 부분도 수정해 봤는데 위와 같은 순서로 컴파일해서 모듈 다시 올리고 실행까지 잘 됩니다.
wlanconfig ath0 list sta 이런식으로 콘솔창에서 실행하는 프로그램입니다.
makefile을 수정할 정도로 소스를 건드린 것도 아니고, 단지 printk 한 줄조차 컴파일이 안되니 답답합니다.
제가 놓치고 있는 부분이 있는건지 다시 한번 조언 부탁드립니다.
댓글 달기