DF-0423 / setup423.c
#include <sys/param.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <net/if.h> #include <netinet/in.h> #include <netinet6/ip6_mroute.h> #include <stdio.h> #include <string.h> #include <unistd.h> int main(void){ int s=socket(AF_INET6,SOCK_RAW,IPPROTO_ICMPV6); long one=1; struct mif6ctl mc; mifi_t mif; struct ifreq ifr; if(setsockopt(s,IPPROTO_IPV6,MRT6_INIT,&one,sizeof(one))<0)perror("INIT"); memset(&ifr,0,sizeof(ifr)); strlcpy(ifr.ifr_name,"tap0",sizeof(ifr.ifr_name)); ioctl(s,SIOCGIFINDEX,&ifr); unsigned int ti=ifr.ifr_index; printf("tap0 ifindex=%u\n",ti); memset(&mc,0,sizeof(mc)); mc.mif6c_mifi=0; mc.mif6c_flags=MIFF_REGISTER; mc.mif6c_pifi=ti; if(setsockopt(s,IPPROTO_IPV6,MRT6_ADD_MIF,&mc,sizeof(mc))<0)perror("ADD reg"); memset(&mc,0,sizeof(mc)); mc.mif6c_mifi=1; mc.mif6c_flags=0; mc.mif6c_pifi=ti; if(setsockopt(s,IPPROTO_IPV6,MRT6_ADD_MIF,&mc,sizeof(mc))<0)perror("ADD phy"); mif=0; if(setsockopt(s,IPPROTO_IPV6,MRT6_DEL_MIF,&mif,sizeof(mif))<0)perror("DEL"); printf("setup done, sleeping 90s (socket open)...\n"); fflush(stdout); sleep(90); return 0; } |