Kernel Socket Programing
글쓴이: hie / 작성시간: 월, 2010/06/21 - 9:44오후
커널 모드에서 sock_create()로 UDP 소켓을 열고
sock_sendmsg(), sock_recvmsg()를 이용하여
패킷을 주고 받는 프로그램을 작성하였였습니다.
테스트 환경은 다음과 같습니다.
+-----------+ +--------+ | Host A |----------------| Host B | +-----------+ +--------+ 192.168.23.54 192.168.23.64
Host A에 상기 모듈이 올라가고, Host B에는 UDP Client App가 실행되고 있습니다.
시험 방식은 매우 간단합니다.
1. Host B에서 Host A로 패킷을 보낸다.
2. 패킷을 수신한 Host A의 커널 모듈은 Host B 로 패킷을 보낸다.
Host B에서 송신된 패킷은 Host A의 커널 모듈에서 정상적으로 수신이 잘 됩니다.
문제는 Host A에서 보낸 패킷은 Host B의 App이 수신을 못한다는 것입니다.
그런데 Host B에서 TCPDUMP로 확인해본 결과 해당 패킷을 수신했다는 것입니다.
Checksum 역시 이상이 없습니다.
혹시 이런 경험 혹은 디버깅에 참고될 만한 내용을 알려주셨으면 합니다.
미리 감사드립니다.
Forums:
같은 패킷을 Host
같은 패킷을 Host A에서 커널말고 userlevel 프로그램으로 만들어서 테스트해보시고,
두 패킷이 같은지 한번 비교해보세요.
또 단순한 실수일 수도 있으니 iptables도 한번 확인해보시기 바랍니다.
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
Host B에서 특별히
Host B에서 특별히 커널을 고치지 않았다면 커널탓은 아닐테니, Host A쪽의 문제일 확률이 큽니다.
다만 예상치 못한 버그로 Host B의 커널이 패킷을 씹어버리는 상황이 발생할 가능성이 0은 아닙니다.
물론 일반적인 경우는 아니지만, 그렇다면 커널의 udp handler쪽을 쫓아가며 패킷이 잘 오는지 확인하는 것도 방법이 되겠습니다만, 별로 추천하지는 않습니다. 쓸데없이 삽질할 가능성이...
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
먼저 조언 진심으로 감사드립니다.
그리고 다음 3가지 사항에 대해서 말씀드립니다.
1. 말씀하신대로 같은 패킷을 Host A에서 커널말고 userlevel 프로그램으로 송신하는
것은 질문을 올리기전에 이미 확인해 보았으며, 차이점을 발견하지 못했습니다.
2. Host B에서 Iptables에 대한 설정이 없습니다.
3. Host B의 커널은 수정/변경 내용이 없습니다.
황당한 이야기지만 Host A에서 Host B로 송신만 하는 경우는 정상적으로 동작되는
것을 확인했습니다. 송/수신 하는 경우 마치 Host B에서 실행되는 App의 Socket이 Block되는
듯한 현상이 발생하는데 그 이유를 모르겠습니다. 더욱 황당한 것은 TCPDUMP 결과 정상적으로
수신되는 패킷과 그렇지 않은 패킷의 내용은 차이가 없음을 확인했습니다.
오늘 회의가 많아서 전혀 디버깅을 하지 못했는데 내일 좀더 디버깅을 한 후
그 결과를 공유토록 하겠습니다.
끝으로 관심어린 조언 다시한번 감사드립니다.
정상/비정상
정상/비정상 수신되는 패킷이 차이가 없다는 것은 불가능합니다. 만약 그게 사실이라면 보낸쪽에서 커널에서 직접 보낸건지 userapp에서 보낸건지 구분할 수 있는 프로그램이 탄생하겠지요. 두둥.
분명 차이가 없어보이지만 차이가 존재할겁니다.
timestamp를 제외한 모든 것을 다시 한번 비교해보세요. 어쩌면 link layer에 문제가 있을지도 모릅니다.
userapp에서 udp소켓을 통해서 보내면 커널이 link layer를 채워주지만, 직접 생성하신게 어떻게 가는지는 확실히 모르겠습니다.
udp layer를 통한다면 역시 제대로 해줘야 정상이자만.
가상 시나리오:
Host A와 Host B가 같은 서브넷에 속해있다.
Destination HWADDR이 잘못 되었다.
TCPDUMP하면 promisc 플래그가 켜지므로 HWADDR이 잘못되었더라도 패킷은 보인다.
하지만 커널에서는 Destination HWADDR이 잘못 되었으므로 거부한다.
상황만 보면 지금 말씀하신 경우와 딱 같습니다.
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
댓글 달기