sk_buff에서 data에 쓰레기 값이 들어가네요.
우분투 14.04 LTS x64, 3.19 커널입니다.
송신부와 수신부는 x86 기반의 intel CPU를 탑재한 개발보드이고,
이더넷포트는 보드에 두 개가 달려 있습니다.
eth0를 보드끼리 연결이 되어 있고,
eth1들은 데스크 탑과 연결되어 ssh로 붙어 있습니다.
-------------------------------------------
통신은 RAW소켓으로 하고 있습니다.
송신부에서는
socket(AF_PACKET, SOCK_RAW, htons(ETH_MY_ALL)));
으로 소켓을 열고 버퍼를 잡은 뒤 0xAB로 모두 초기화 했습니다.
후에
Source MAC(6 byte), Destination MAC(6 byte), ehter type(2 byte)만 설정한 14바이트를 해더로 붙이고
sendto()를 통해 송신을 했습니다.
수신부에서는
struct packet_type을 선언해 type은 위에 __constant_htons(ETH_MY_ALL)로 지정한 뒤, receive 함수를 추가했습니다.
기본적으로 통신이 잘 되는 것은 tcpdump로 확인 했습니다.
tcpdump에서 보낸 패킷이 정확하게 들어오는 것을 덤프 해 주는 것을 확인 했습니다.
문제는 송신부에서 256 byte 초과하는 패킷을 보낼 때 발생합니다.
이유는 모르겠지만 receive 함수에서 sk_buff->data를 len로 찍어봤을 때,
전혀 이상한 값이 찍힙니다.정확하게 256 byte까지는 정확하게 tcpdump의 값과 일치하는 값이 찍히며,
257 byte 이상부터는 tcpdump와 전혀 다른값이 찍힙니다. (tcpdump에 출력되는 값은 송신부에서 보낸 값과 일치합니다.)
또한,
256 byte까지는 sk_buff의 len = 패킷사이즈(1~256), data_len = 0, 이지만,
257 byte부터는 len = data_len = 패킷사이즈(257~) 가 됩니다.
제가 알기로 len이 0이 아닌 경우에 fragmentation이 된 것으로 알고 있는데, fragmentation이 된 경우라면
len = data_len 인 경우는 없어야 한다고 알고 있습니다. 그런데 두 개가 같으니 이해가 안 되네요...
eth0의 receive buffer size가 작아서 그런가 싶기도 했는데, 그렇게 생각하자니 tcpdump에서 출력되는 것도 이해가 잘 안 됩니다.
어떻게 하면 256 byte 이상의 사이즈 패킷에 대해서도 sk_buff의 data 항목이 접근이 가능할까요?
혹시 MTU 사이즈 확인 해보셨나요?이더넷 기본이
혹시 MTU 사이즈 확인 해보셨나요?
이더넷 기본이 1500 바이트인 것 알고있습니다만
확실한 것 부터 체크하는게 좋을 것 같아서요.
아 참고로 저도 AF_PACKET, RAW로 작업하는 프로젝트 진행중인게 있는데
400바이트 이상의 패킷도 잘 송수신 되고 있습니다.
socket(AF_PACKET, SOCK_RAW, htons(ETH_MY_PROTOCOL)));
특정 ethertype으로 바인딩 되어 있는 소켓이구요.
답글 감사합니다.
우선은 MTU는 1500으로 되어 있는 것을 확인 했습니다.
딱히 집히는 게 없어서 플렛폼이나 커널문제가 아닌가 하고 생각하고 있습니다...
--------------------------------------------------------------
세상엔 알아야 할 것도 알지 말았어야 할 것도 너무 많았습니다.
댓글 달기