IPv6 Duplicate Address Detection

Sho rmaglasang at infoweapons.com
Fri Jul 9 04:13:55 UTC 2010


Krishna wrote:
> Hi,
>
> I am implementing a user space program to create and assign IPv6 address 
> to a linux host.
> I am able to create and assign the IP successfully. But, if i am 
> assigning the duplicate address,
> still the address gets assigned. I understand the kernel is handling the 
> DAD and reporting to kernel log.
> Is there any way, i can use IOCTL to get the TENTATIVE flag value and 
> delete the IP if it is duplicate.
> By the way, i use IOCTL system call to assign the IP too.
>
> I went through some posts in freebsd-net where they have mentioned about 
> "SIOCGIFAFLAG_IN6 ioctl"
> which gives the flags value where the TENTATIVE flag value can be plooed.
> I tried to use the same API in my user program but failed.
>
> Can somebody post me the working sample code of SIOCGIFAFLAG ioctl ?
>
> Thanks,
> -Krishna
> _______________________________________________
> freebsd-net at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-net
> To unsubscribe, send any mail to "freebsd-net-unsubscribe at freebsd.org"
>   
Here's a sample code fragment to retrieve the status.

--

  ipv6_addr = "1234:2:3:4:5::1001";
  ifname = "vr0";


  memset(&hints, 0, sizeof(hints));
  hints.ai_family = AF_INET6;
  ret = getaddrinfo(ipv6_addr, NULL, &hints, &res);
  if (ret != 0)
  {
    fprintf(stderr, "Invalid IPv6 address: [%s]\n", ipv6_addr);
    return(1);
  }

  bcopy(res->ai_addr, &ifr6.ifr_addr, res->ai_addrlen);
  strncpy(ifr6.ifr_name, ifname, sizeof(ifr6.ifr_name));
  if ((s6 = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
  {
    fprintf(stderr, "socket(AF_INET6, SOCK_DGRAM) failed!\n");
    return(1);
  }

  if (ioctl(s6, SIOCGIFAFLAG_IN6, &ifr6) < 0)
  {
    fprintf(stderr, "ioctl(SIOCGIFAFLAG_IN6) failed!\n");
    close(s6);
    return(1);
  }

  flags6 = ifr6.ifr_ifru.ifru_flags6;
  close(s6);

  fprintf(stdout, "  Status: ");

  if ((flags6 & IN6_IFF_DUPLICATED) != 0)
    fprintf(stdout, "duplicated ");
 
  if ((flags6 & IN6_IFF_TENTATIVE) != 0)
    fprintf(stdout, "tentative ");

--

You might want to check the code of ifconfig at 
in6_status()/usr/src/sbin/ifconfig/af_inet6.c.




More information about the freebsd-net mailing list