2012-09-27 5 views
1

모두를 수신하고 싶습니다. 가능하다면 레이어 2에서 작동하지 않고 특정 인터페이스에 도착한 멀티 캐스트 IPv6 패킷이 도착합니다.리눅스에서 모든 멀티 캐스트 ICMPv6 패킷을 수신합니다.

원시 ICMPv6 패킷을위한 소켓을 열고 내 컴퓨터 전용의 유니 캐스트 패킷을 수신하는 것이 정상적으로 작동합니다. 그러나 많은 ICMPv6 패킷은 링크 - 로컬 멀티 캐스트 (예 : 이웃 요청)입니다. 요청 된 노드 멀티 캐스트를 포함하여 모든 멀티 캐스트 트래픽을 수신 대기하는 올바른 방법은 무엇입니까? 현재 IPV6_ADD_MEMBERSHIP가있는 멀티 캐스트 그룹을 추가하려고 시도하지만 작동하지 않습니다. 여기 내 코드 :

/* open RAW socket to receive on */ 
if ((sockfd = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6)) < 0) { 
    perror("socket"); 
} 

/* get device index */ 
memset(&if_idx, 0, sizeof(struct ifreq)); 
strncpy(if_idx.ifr_name, DEVNAME, IFNAMSIZ-1); 
if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0) { 
    perror("SIOCGIFINDEX"); 
} 

/* configure to receive all multicast packets on this interface */ 
memset(&mreq, 0, sizeof(struct ipv6_mreq)); 
inet_pton(AF_INET6, "ff02::", &mreq.ipv6mr_multiaddr); 
mreq.ipv6mr_interface = if_idx.ifr_ifindex; 
if (setsockopt(sockfd, SOL_SOCKET, IPV6_ADD_MEMBERSHIP, &mreq, 
      sizeof(struct ipv6_mreq)) < 0) { 
    perror("setsockopt"); 
} 

내가 뭘 잘못하고 있니? 내가 원하는 것은 어쨌든 가능해야합니다. 나는 ff02 ::와 ff02 :: 1 : ff00 : 0을 그룹으로 시도했고 후자는 setsockopt를 실패로 만들었다. 무슨 일이야? 불행히도 IPv6 멀티 캐스트 프로그래밍에 관한 문서는 거의 없습니다.

+0

예, 이것은 내가 지정한 멀티 캐스트 주소의 일부입니다. – dietr

+0

죄송합니다, 당신이하는 말을 이해하지 못합니다. 범위 ID는 여기에 관련이 없습니다. * 수신 * 패킷이 아닌 * 전송 * 패킷의 중요성. 여기서 중요한 것은 인터페이스 일 뿐이며 올바르게 설정됩니다. – dietr

+0

UDP ?! ICMPv6 패킷을 받고 싶습니다. 그것은 전혀 UDP가 아닙니다! ICMPv6를 사용하려면 원시 소켓을 사용해야합니다. IPv6 멀티 캐스트가 원시 소켓에서 작동하지 않는 이유는 무엇입니까? 이 문서는 어디에 문서화되어 있습니까? 내 정보원은 DGRAM과 RAW 소켓에서만 작동한다고합니다. BTW : 위의 컨텍스트 밖의 주석에 대해 궁금한 점이 있다면, 저는 이제 자신의 의견을 삭제하기로 결정한 사람에게 대답했습니다. 한숨. – dietr

답변

0

결국 이것은 불가능한 것처럼 보입니다. 나는 현재 "cooked"모드 (SOCKET_DGRAM)의 Linux AF_PACKET 소켓 유형을 사용하여 링크 계층 헤더와 BPF를 사용하여 원시 IPv6 패킷에 액세스하여 ICMPv6 ND 패킷을 필터링합니다. 적어도 이더넷을 구문 분석 할 필요는 없습니다. 이렇게하면 다른 링크 계층 유형을보다 쉽게 ​​지원할 수 있습니다.

0

SOL_SOCKET 대신 SOL_IPV6을 사용하십시오.

ff80::1에 가입하고 ping6 -I eth0 ff08::1으로 트래픽을 생성하는 테스트.

+0

이것은 특정 멀티 캐스트 그룹에서 작동하지만 * all * solicited-node 멀티 캐스트 그룹에서 트래픽을 수신해야합니다. 이것들은 2^24 그룹이고, 그것들을 모두 더하는 것은 실용적이지 않습니다. – dietr

+0

@dietr 멀티 캐스트 작동 방식 : 네트워크 인프라에서 트래픽을 전달하기 위해 IGMP 구독이 필요합니다. 로컬 링크 트래픽의 경우'PF_PACKET'을 사용해 볼 수 있지만 스위치 재구성이 필요하거나 기본적으로 허브를 사용해야 할 수도 있습니다. –

+0

글쎄, 나는 실제로 기계에 도착한 * 멀티 캐스트 트래픽에만 관심이있다. (그리고 일반적으로 적어도 모든 링크 로컬 멀티 캐스트). 나는 실제로 그것을 초기 게시물에 썼다. IGMP (또는 IPv6 등가물)는 전혀 관련이 없습니다. – dietr

관련 문제