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