Author: aurel32
Date: 2008-03-05 11:25:12 +0000 (Wed, 05 Mar 2008)
New Revision: 2854

Modified:
   glibc-package/trunk/debian/changelog
   glibc-package/trunk/debian/patches/all/cvs-gai_conf.diff
   glibc-package/trunk/debian/patches/any/cvs-rfc3484.diff
Log:
  * patches/any/cvs-rfc3484.diff: update from CVS to allow the definition of
    IPv4 scopes in /etc/gai.conf.    



Modified: glibc-package/trunk/debian/changelog
===================================================================
--- glibc-package/trunk/debian/changelog        2008-03-05 11:09:17 UTC (rev 
2853)
+++ glibc-package/trunk/debian/changelog        2008-03-05 11:25:12 UTC (rev 
2854)
@@ -16,8 +16,10 @@
     from "A.M/P.M.".
   * Remove uk_UA from patches/localedata/first_weekday.diff: merged upstream
     in a different way.  Closes: bug#469439.
+  * patches/any/cvs-rfc3484.diff: update from CVS to allow the definition of
+    IPv4 scopes in /etc/gai.conf.    
   * patches/all/cvs-gai_conf.diff: update gai.conf from CVS to also mention
-    Teredo tunnels.
+    Teredo tunnels and scopev4 defaults.
 
  -- Aurelien Jarno <[EMAIL PROTECTED]>  Wed, 05 Mar 2008 12:08:44 +0100
 

Modified: glibc-package/trunk/debian/patches/all/cvs-gai_conf.diff
===================================================================
--- glibc-package/trunk/debian/patches/all/cvs-gai_conf.diff    2008-03-05 
11:09:17 UTC (rev 2853)
+++ glibc-package/trunk/debian/patches/all/cvs-gai_conf.diff    2008-03-05 
11:25:12 UTC (rev 2854)
@@ -1,5 +1,9 @@
 2007-11-19  Ulrich Drepper  <[EMAIL PROTECTED]>
 
+       * posix/gai.conf: Document scopev4 defaults.
+
+2007-11-19  Ulrich Drepper  <[EMAIL PROTECTED]>
+
        * posix/gai.conf: Update for current default tables.
 
 ===================================================================
@@ -45,3 +49,21 @@
  #    and 10.3 in RFC 3484.  The default is:
  #
  #precedence  ::1/128       50
+@@ -52,3 +52,17 @@
+ #    For sites which prefer IPv4 connections change the last line to
+ #
+ #precedence ::ffff:0:0/96  100
++
++#
++# scopev4  <mask>  <value>
++#    Add another rule to the RFC 3484 scope table for IPv4 addresses.
++#    By default the scope IDs described in section 3.2 in RFC 3484 are
++#    used.  Changing these defaults should hardly ever be necessary.
++#    The defaults are equivalent to:
++#
++#scopev4 ::ffff:169.254.0.0/112  2
++#scopev4 ::ffff:127.0.0.0/104    2
++#scopev4 ::ffff:10.0.0.0/104     5
++#scopev4 ::ffff:172.16.0.0/108   5
++#scopev4 ::ffff:192.168.0.0/112  5
++#scopev4 ::ffff:0.0.0.0          14

Modified: glibc-package/trunk/debian/patches/any/cvs-rfc3484.diff
===================================================================
--- glibc-package/trunk/debian/patches/any/cvs-rfc3484.diff     2008-03-05 
11:09:17 UTC (rev 2853)
+++ glibc-package/trunk/debian/patches/any/cvs-rfc3484.diff     2008-03-05 
11:25:12 UTC (rev 2854)
@@ -3,7 +3,15 @@
        * sysdeps/unix/sysv/linux/check_pf.c (make_request): Fix
        recognition of interface family.
 
+2007-11-19  Ulrich Drepper  <[EMAIL PROTECTED]>
 
+       * sysdeps/posix/getaddrinfo.c (defaults_scopes, scopes): New variables.
+       (get_scope): For IPv4 scope, use scopes table.
+       (fini): Free scopes table if necessary.
+       (free_scopelist): New function.
+       (scopecmp): New function.
+       (gaiconf_init): Also handle scopev4 entries.
+
 2007-11-12  Ulrich Drepper  <[EMAIL PROTECTED]>
 
        * include/ifaddrs.c (struct in6addrinfo): Add prefixlen field.
@@ -437,3 +445,312 @@
            }
          else if (nlmh->nlmsg_type == NLMSG_DONE)
            /* We found the end, leave the loop.  */
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/posix/getaddrinfo.c,v
+retrieving revision 1.120
+retrieving revision 1.121
+diff -u -r1.120 -r1.121
+--- libc/sysdeps/posix/getaddrinfo.c   2007/11/19 17:31:28     1.120
++++ libc/sysdeps/posix/getaddrinfo.c   2007/11/20 00:40:41     1.121
+@@ -1014,6 +1014,38 @@
+ };
+ 
+ 
++#if __BYTE_ORDER == __BIG_ENDIAN
++# define htonl_c(n) n
++#else
++# define htonl_c(n) __bswap_constant_32 (n)
++#endif
++
++static const struct scopeentry
++{
++  union
++  {
++    char addr[4];
++    uint32_t addr32;
++  };
++  uint32_t netmask;
++  int32_t scope;
++} default_scopes[] =
++  {
++    /* Link-local addresses: scope 2.  */
++    { { { 169, 254, 0, 0 } }, htonl_c (0xffff0000), 2 },
++    { { { 127, 0, 0, 0 } }, htonl_c (0xff000000), 2 },
++    /* Site-local addresses: scope 5.  */
++    { { { 10, 0, 0, 0 } }, htonl_c (0xff000000), 5 },
++    { { { 172, 16, 0, 0 } }, htonl_c (0xfff00000), 5 },
++    { { { 192, 168, 0, 0 } }, htonl_c (0xffff0000), 5 },
++    /* Default: scope 14.  */
++    { { { 0, 0, 0, 0 } }, htonl_c (0x00000000), 14 }
++  };
++
++/* The label table.  */
++static const struct scopeentry *scopes;
++
++
+ static int
+ get_scope (const struct sockaddr_storage *ss)
+ {
+@@ -1038,17 +1070,17 @@
+   else if (ss->ss_family == PF_INET)
+     {
+       const struct sockaddr_in *in = (const struct sockaddr_in *) ss;
+-      const uint8_t *addr = (const uint8_t *) &in->sin_addr;
+ 
+-      /* RFC 3484 specifies how to map IPv6 addresses to scopes.
+-       169.254/16 and 127/8 are link-local.  */
+-      if ((addr[0] == 169 && addr[1] == 254) || addr[0] == 127)
+-      scope = 2;
+-      else if (addr[0] == 10 || (addr[0] == 172 && (addr[1] & 0xf0) == 16)
+-             || (addr[0] == 192 && addr[1] == 168))
+-      scope = 5;
+-      else
+-      scope = 14;
++      size_t cnt = 0;
++      while (1)
++      {
++        if ((in->sin_addr.s_addr & scopes[cnt].netmask)
++            == scopes[cnt].addr32)
++          return scopes[cnt].scope;
++
++        ++cnt;
++      }
++      /* NOTREACHED */
+     }
+   else
+     /* XXX What is a good default?  */
+@@ -1490,6 +1522,13 @@
+       precedence = default_precedence;
+       free ((void *) old);
+     }
++
++  if (scopes != default_scopes)
++    {
++      const struct scopeentry *old = scopes;
++      scopes = default_scopes;
++      free ((void *) old);
++    }
+ }
+ 
+ 
+@@ -1500,6 +1539,13 @@
+ };
+ 
+ 
++struct scopelist
++{
++  struct scopeentry entry;
++  struct scopelist *next;
++};
++
++
+ static void
+ free_prefixlist (struct prefixlist *list)
+ {
+@@ -1512,6 +1558,18 @@
+ }
+ 
+ 
++static void
++free_scopelist (struct scopelist *list)
++{
++  while (list != NULL)
++    {
++      struct scopelist *oldp = list;
++      list = list->next;
++      free (oldp);
++    }
++}
++
++
+ static int
+ prefixcmp (const void *p1, const void *p2)
+ {
+@@ -1526,6 +1584,20 @@
+ }
+ 
+ 
++static int
++scopecmp (const void *p1, const void *p2)
++{
++  const struct scopeentry *e1 = (const struct scopeentry *) p1;
++  const struct scopeentry *e2 = (const struct scopeentry *) p2;
++
++  if (e1->netmask > e2->netmask)
++    return -1;
++  if (e1->netmask == e2->netmask)
++    return 0;
++  return 1;
++}
++
++
+ static void
+ gaiconf_init (void)
+ {
+@@ -1535,6 +1607,9 @@
+   struct prefixlist *precedencelist = NULL;
+   size_t nprecedencelist = 0;
+   bool precedencelist_nullbits = false;
++  struct scopelist *scopelist =  NULL;
++  size_t nscopelist = 0;
++  bool scopelist_nullbits = false;
+ 
+   FILE *fp = fopen (GAICONF_FNAME, "rc");
+   if (fp != NULL)
+@@ -1625,7 +1700,7 @@
+                         || (bits = strtoul (cp, &endp, 10)) != ULONG_MAX
+                         || errno != ERANGE)
+                     && *endp == '\0'
+-                    && bits <= INT_MAX
++                    && bits <= 128
+                     && ((val = strtoul (val2, &endp, 10)) != ULONG_MAX
+                         || errno != ERANGE)
+                     && *endp == '\0'
+@@ -1659,6 +1734,73 @@
+               }
+             break;
+ 
++          case 7:
++            if (strcmp (cmd, "scopev4") == 0)
++              {
++                struct in6_addr prefix;
++                unsigned long int bits;
++                unsigned long int val;
++                char *endp;
++
++                bits = 32;
++                __set_errno (0);
++                cp = strchr (val1, '/');
++                if (cp != NULL)
++                  *cp++ = '\0';
++                if (inet_pton (AF_INET6, val1, &prefix))
++                  {
++                    if (IN6_IS_ADDR_V4MAPPED (&prefix)
++                        && (cp == NULL
++                            || (bits = strtoul (cp, &endp, 10)) != ULONG_MAX
++                            || errno != ERANGE)
++                        && *endp == '\0'
++                        && bits >= 96
++                        && bits <= 128
++                        && ((val = strtoul (val2, &endp, 10)) != ULONG_MAX
++                            || errno != ERANGE)
++                        && *endp == '\0'
++                        && val <= INT_MAX)
++                      {
++                        struct scopelist *newp;
++                      new_scope:
++                        newp = malloc (sizeof (*newp));
++                        if (newp == NULL)
++                          {
++                            free (line);
++                            fclose (fp);
++                            goto no_file;
++                          }
++
++                        newp->entry.netmask = htonl (bits != 96
++                                                     ? (0xffffffff
++                                                        << (128 - bits))
++                                                     : 0);
++                        newp->entry.addr32 = (prefix.s6_addr32[3]
++                                              & newp->entry.netmask);
++                        newp->entry.scope = val;
++                        newp->next = scopelist;
++                        scopelist = newp;
++                        ++nscopelist;
++                        scopelist_nullbits |= bits == 96;
++                      }
++                  }
++                else if (inet_pton (AF_INET, val1, &prefix.s6_addr32[3])
++                         && (cp == NULL
++                             || (bits = strtoul (cp, &endp, 10)) != ULONG_MAX
++                             || errno != ERANGE)
++                         && *endp == '\0'
++                         && bits <= 32
++                         && ((val = strtoul (val2, &endp, 10)) != ULONG_MAX
++                             || errno != ERANGE)
++                         && *endp == '\0'
++                         && val <= INT_MAX)
++                  {
++                    bits += 96;
++                    goto new_scope;
++                  }
++              }
++            break;
++
+           case 10:
+             if (strcmp (cmd, "precedence") == 0)
+               {
+@@ -1742,12 +1884,52 @@
+ 
+         /* Sort the entries so that the most specific ones are at
+            the beginning.  */
+-        qsort (new_precedence, nprecedencelist, sizeof (*new_labels),
++        qsort (new_precedence, nprecedencelist, sizeof (*new_precedence),
+                prefixcmp);
+       }
+       else
+       new_precedence = (struct prefixentry *) default_precedence;
+ 
++      struct scopeentry *new_scopes;
++      if (nscopelist > 0)
++      {
++        if (!scopelist_nullbits)
++          ++nscopelist;
++        new_scopes = malloc (nscopelist * sizeof (*new_scopes));
++        if (new_scopes == NULL)
++          {
++            if (new_labels != default_labels)
++              free (new_labels);
++            if (new_precedence != default_precedence)
++              free (new_precedence);
++            goto no_file;
++          }
++
++        int i = nscopelist;
++        if (!scopelist_nullbits)
++          {
++            --i;
++            new_scopes[i].addr32 = 0;
++            new_scopes[i].netmask = 0;
++            new_scopes[i].scope = 14;
++          }
++
++        struct scopelist *l = scopelist;
++        while (i-- > 0)
++          {
++            new_scopes[i] = l->entry;
++            l = l->next;
++          }
++        free_scopelist (scopelist);
++
++        /* Sort the entries so that the most specific ones are at
++           the beginning.  */
++        qsort (new_scopes, nscopelist, sizeof (*new_scopes),
++               scopecmp);
++      }
++      else
++      new_scopes = (struct scopeentry *) default_scopes;
++
+       /* Now we are ready to replace the values.  */
+       const struct prefixentry *old = labels;
+       labels = new_labels;
+@@ -1759,6 +1941,11 @@
+       if (old != default_precedence)
+       free ((void *) old);
+ 
++      const struct scopeentry *oldscope = scopes;
++      scopes = new_scopes;
++      if (oldscope != default_scopes)
++      free ((void *) oldscope);
++
+       gaiconf_mtime = st.st_mtim;
+     }
+   else
+@@ -1766,6 +1953,7 @@
+     no_file:
+       free_prefixlist (labellist);
+       free_prefixlist (precedencelist);
++      free_scopelist (scopelist);
+ 
+       /* If we previously read the file but it is gone now, free the
+        old data and use the builtin one.  Leave the reload flag


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to