stpd 를 만들려는데요...
글쓴이: cnyld / 작성시간: 금, 2010/07/09 - 7:29오후
BPDU를 받아야 할텐데...
어떻게 BPDU packet을 수신해야될 지 모르겠습니다.
socket() 을 일단 써야할텐데,
RAW packet 으로 socket을 만들어야겠죠?
근데, bind는 어떻게 해야하죠?
destination MAC 주소로 등록해야하지 않을까요?
그러니까 결국은, 특정 destionation mac 주소를 가진 packet만 받아 올리는,
그런 socket을 어떻게 만들어야되는지
제발 좀 가르쳐주세요...
꾸벅
Forums:
꽤 오래된 질문인데 답변이 없네요... BPDU를
꽤 오래된 질문인데 답변이 없네요...
BPDU를 수신하기 위해서는 말씀하신 것처럼 소켓을 만듭니다.
1. fd = socket( PF_PACKET, SOCK_RAW, htons(ETH_P_802_2) );
...
2. binding을 합니다. 단 특정 인터페이스를 지정해서 받고 싶을때만 호출합니다. 물리 인터페이스가 하나라면 굳이 필요없습니다.
sockaddr_ll sll;
sll.sll_ifindex = if_nametoindex( ifname );
...
bind( fd, (struct sockaddr *)&sll, sizeof(sll) );
3. 마지막으로 BPDU의 목적지 주소를 setsockopt을 이용해 지정합니다.
unsigned char address[] = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x00 };
struct packet_mreq mreq;
mreq.mr_type = PACKET_MR_MULTICAST;
mreq.mr_alen = ETH_ALEN;
memcpy( mreq.mr_address, address, mreq.mr_alen );
...
setsockopt( fd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq, sizeof(mreq) );
BPDU 주소도 결국 multicast 주소이므로 위와 같이 할 수 있는 것이죠.
PF_PACKET에 대한 리눅스 매뉴얼에 보다 자세한 설명이 있습니다. 참고하시길...
댓글 달기