This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] fix getifaddrs() to set correct sin6_scope_id


At Thu, 14 Oct 2004 22:28:37 -0700,
Ulrich Drepper <drepper@redhat.com> wrote:

> > The current getifaddrs() doesn't set correct sin6_scope_id value.
> > (You can verify it by using getnameinfo().)
> 
> That is not enough explanation.  Provide some code which shows the
> program and point to the specification which supports your claim that
> there is something wrong.

OK, I attached test code to this mail.

================================================================
On current glibc, this test program outputs bellow.

% ./v6scopeid
(snipped)
------
Interface: eth1
        Address: [fe80::208:dff:fee7:f4f7%253] <--- (A)
------                                    ^^^

On my patch applied glibc, this test program outputs bellow.
(snipped)
------
Interface: eth1
        Address: [fe80::208:dff:fee7:f4f7%eth1] <--- (A')
------                                    ^^^^

Both fields (A) and (A') are displayed via getnameinfo().
================================================================


1. getnameinfo() presumes that sin6_scope_id member of struct
  sockaddr_in6 is interface index.

 Please see getnameinfo() in libc/inet/getnameinfo.c nearby line#311-:

    if (sa->sa_family == AF_INET6)
      {
        const struct sockaddr_in6 *sin6p;
        uint32_t scopeid;
        (snipped)
        scopeid = sin6p->sin6_scope_id;
        if (scopeid != 0)
          {
            /* Buffer is >= IFNAMSIZ+1.  */
            char scopebuf[IFNAMSIZ + 1];
            char *scopeptr;
            int ni_numericscope = 0;
            size_t real_hostlen = __strnlen (host, hostlen);
            size_t scopelen = 0;

            scopebuf[0] = SCOPE_DELIMITER;
            scopebuf[1] = '\0';
            scopeptr = &scopebuf[1];

            if (IN6_IS_ADDR_LINKLOCAL (&sin6p->sin6_addr)
                || IN6_IS_ADDR_MC_LINKLOCAL (&sin6p->sin6_addr))
              {
                if (if_indextoname (scopeid, scopeptr) == NULL) <= presumes scopde is index
                  ++ni_numericscope;
                else
                  scopelen = strlen (scopebuf);
              }

2. and also linux kernel set interface index to ifa_index member of struct ifaddrmsg.
  
  LINUX_KERNEL_SOURCE/net/ipv6/addrconf.c: inet6_fill_ifaddr() 
  (kernel 2.6.8.1)

static int inet6_fill_ifaddr(struct sk_buff *skb, struct inet6_ifaddr *ifa,
                             u32 pid, u32 seq, int event)
{
        struct ifaddrmsg *ifm;
        struct nlmsghdr  *nlh;
        struct ifa_cacheinfo ci;
        unsigned char    *b = skb->tail;

        nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*ifm));
        if (pid) nlh->nlmsg_flags |= NLM_F_MULTI;
        ifm = NLMSG_DATA(nlh);
        ifm->ifa_family = AF_INET6;
        ifm->ifa_prefixlen = ifa->prefix_len;
        ifm->ifa_flags = ifa->flags;
        ifm->ifa_scope = RT_SCOPE_UNIVERSE;
        if (ifa->scope&IFA_HOST)
                ifm->ifa_scope = RT_SCOPE_HOST;
        else if (ifa->scope&IFA_LINK)
                ifm->ifa_scope = RT_SCOPE_LINK;
        else if (ifa->scope&IFA_SITE)
                ifm->ifa_scope = RT_SCOPE_SITE;
        ifm->ifa_index = ifa->idev->dev->ifindex; <= sets interface index here
 (snipped)

}

3. In the IETF internet-draft draft-ietf-ipv6-scoping-arch-02.txt:
   (This document is in IESG working queue to publish as RFC.)

   11.3 Examples

   (snipped)
   If we use interface names as <zone_id>, those addresses could also be
   represented as follows:

            fe80::1234%ne0
            ff02::5678%pvc1.3
            ff08::9abc%interface10

   where the interface "ne0" belongs to the 1st link, "pvc1.3" belongs
   to the 5th link, and "interface10" belongs to the 10th organization.


Regards,
-mk

Attachment: v6scopeid.c
Description: Binary data


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]