(MLD/Mobile IPv6) Sending in a tunnel

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,

 I aim at making a MLD General Query and sending it in
 the tunnels towards the mobiles. I successfuly create
 the message which is correct, it works when i send on
 the LAN interface (i'm working on the home agent),
but
 i get an error "Network is unreachable" when i send
it
 on a tunnel interface.

 Here follows the source code. Has anyone a clue ?

 Thx 
 Fred


#########################################################

 /** The structure of a MLDv1 report */
 struct mld6_v1_hdr {
 	/** The ICMPv6 structure */
 	struct icmp6_hdr	mld_icmp6_hdr;
 	/** The IPv6 address of the multicast group */
 	struct in6_addr		mld6_addr;
 };

 int send_general_query(int iface)
 {
 	struct mld6_v1_hdr mld;
 	int offset = 2;
 	int length;
 	int sockfd;
 	
 	struct sockaddr_in6 src;
 	struct sockaddr_in6 dst;
 	
 	struct msghdr msgh;
 	struct cmsghdr *cmsgh;
 	struct iovec iovector;
 	char control[128];
 	
 	/* ra is the complete HOP-by-HOP router alert option
 */
 	
 	char ra[8] = { IPPROTO_ICMPV6, 0, IPV6_TLV_PADN, 0,
 			IPV6_TLV_ROUTERALERT, 2, 0, 0 };
 	
 	/* an ICMP socket for the home agent LAN interface
*/
 	if( (sockfd = socket( AF_INET6, SOCK_RAW,
 IPPROTO_ICMPV6)) <0 )
 	{
 		perror("Socket Creation");
 		return -1;
 	}
 	
 	memset( &src, 0, sizeof(struct sockaddr_in6) );
 	memset( &dst, 0, sizeof(struct sockaddr_in6) );
 	/* dest address is ff02::1 */
     if( (inet_pton(AF_INET6, "ff02::1",
 &dst.sin6_addr)) == -1)
     {
         fprintf(stderr,"send_general_query : Problem
 with address resolution\n");
         if(debug_lvl == VERBOSE)
 			fprintf(log_file,"send_general_query : Problem
with
 address resolution\n");
 		return FALSE;
     }   
 	dst.sin6_family = AF_INET6;
 	dst.sin6_port = htons(0);
 	dst.sin6_scope_id = iface;
 	/* Setting up SRC */
 	src.sin6_family = AF_INET6;
 	src.sin6_port = htons(0);
 	src.sin6_addr = member_tab.oif_addr; /* my ipv6
 addressz */
 	src.sin6_scope_id = iface;
 	length = sizeof(struct sockaddr_in6);
 	if ( bind(sockfd, (struct sockaddr *)&src, length)
==
 -1)
 	{
 		perror("Could not bind");
 		return -1;
 	}
 	
 	/* the MLD v1 query message */
 	memset( &mld, 0, sizeof(struct mld6_v1_hdr) );
 	mld.mld_icmp6_hdr.icmp6_type =
 ICMP6_MEMBERSHIP_QUERY;
 	mld.mld_icmp6_hdr.icmp6_code = 0;
 	mld.mld_icmp6_hdr.icmp6_cksum = 0;
 	mld.mld_icmp6_hdr.icmp6_dataun.icmp6_un_data16[0] =
 htons(100);
 	mld.mld_icmp6_hdr.icmp6_dataun.icmp6_un_data16[0] =
 0;
 	mld.mld6_addr = in6addr_any;
 	
 	memset( &iovector, 0, sizeof(struct iovec) );
 	iovector.iov_base = &mld;
 	iovector.iov_len = sizeof(struct mld6_v1_hdr);
 	
 	memset( &msgh, 0, sizeof(struct msghdr) );
 	msgh.msg_name = &dst;
 	msgh.msg_namelen = sizeof(struct sockaddr_in6);
 	msgh.msg_iov = &iovector;
 	msgh.msg_iovlen = 1;
 	msgh.msg_control = control;
 	msgh.msg_controllen = 128;
 	
 	/* set ancillary data options + copy hop-by-hop
 option */
 	cmsgh = CMSG_FIRSTHDR(&msgh);
 	cmsgh->cmsg_len = CMSG_LEN(8);
 	cmsgh->cmsg_level = SOL_IPV6;
 	cmsgh->cmsg_type = IPV6_HOPOPTS;
 	memcpy( (void *)CMSG_DATA(cmsgh), (void *)ra,
 sizeof(ra) );
 	msgh.msg_controllen = cmsgh->cmsg_len;
 	
 	/* ask kernel to compute ICMP checksum */
 	if (setsockopt(sockfd,
 IPPROTO_IPV6,IPV6_CHECKSUM,&offset,sizeof(offset)) <
 0)
         {  
 		perror ("Couldn't setsockopt IPV6_CHECKSUM");
 		return(-1);
         }

 	if( (sendmsg( sockfd, &msgh, MSG_DONTROUTE )) <= 0)
 	{
 		perror("(V1)Problem with sendmsg");
 		return -1;
 	}
 	
 	close(sockfd);
 	return 0;
 }



	

	
		
Yahoo! Mail : votre e-mail personnel et gratuit qui vous suit partout ! 
Créez votre Yahoo! Mail sur http://fr.benefits.yahoo.com/

Dialoguez en direct avec vos amis grâce à Yahoo! Messenger !Téléchargez Yahoo! Messenger sur http://fr.messenger.yahoo.com
-
: send the line "unsubscribe linux-net" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux 802.1Q VLAN]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Git]     [Bugtraq]     [Yosemite News and Information]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux PCI]     [Linux Admin]     [Samba]

  Powered by Linux