* include/arpa/nameser.h: Add optimizations for NS_GET16 and NS_GET32.
authorUlrich Drepper <drepper@redhat.com>
Sat, 6 May 2006 08:03:24 +0000 (08:03 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sat, 6 May 2006 08:03:24 +0000 (08:03 +0000)
* resolv/res_send.c (res_nameinquery): Use NS_GET16 directly
instead of ns_get16.
(res_queriesmatch): Likewise.  Minor optimization.

ChangeLog
include/arpa/nameser.h
resolv/res_send.c

index 3d8a63f..065f64d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2006-05-06  Ulrich Drepper  <drepper@redhat.com>
 
+       * include/arpa/nameser.h: Add optimizations for NS_GET16 and NS_GET32.
+
+       * resolv/res_send.c (res_nameinquery): Use NS_GET16 directly
+       instead of ns_get16.
+       (res_queriesmatch): Likewise.  Minor optimization.
+
        [BZ #2499]
        * resolv/res_query.c (__libc_res_nquery): If answerp != NULL,
        __libc_res_nsend might reallocate the buffer for the answer.  In
index 944fe73..09bd504 100644 (file)
@@ -1 +1,28 @@
 #include <resolv/arpa/nameser.h>
+
+/* If the machine allows unaligned access we can do better than using
+   the NS_GET16, NS_GET32, NS_PUT16, and NS_PUT32 macros from the
+   installed header.  */
+#include <string.h>
+#include <stdint.h>
+#include <netinet/in.h>
+
+#if _STRING_ARCH_unaligned
+
+# undef NS_GET16
+# define NS_GET16(s, cp) \
+  do {                                                                       \
+    uint16_t *t_cp = (uint16_t *) (cp);                                              \
+    (s) = ntohs (*t_cp);                                                     \
+    (cp) += NS_INT16SZ;                                                              \
+  } while (0)
+
+# undef NS_GET32
+# define NS_GET32(s, cp) \
+  do {                                                                       \
+    uint32_t *t_cp = (uint32_t *) (cp);                                              \
+    (s) = ntohl (*t_cp);                                                     \
+    (cp) += NS_INT32SZ;                                                              \
+  } while (0)
+
+#endif
index ff7be11..4bcb746 100644 (file)
@@ -267,8 +267,8 @@ res_nameinquery(const char *name, int type, int class,
                cp += n;
                if (cp + 2 * INT16SZ > eom)
                        return (-1);
-               ttype = ns_get16(cp); cp += INT16SZ;
-               tclass = ns_get16(cp); cp += INT16SZ;
+               NS_GET16(ttype, cp);
+               NS_GET16(tclass, cp);
                if (ttype == type && tclass == class &&
                    ns_samename(tname, name) == 1)
                        return (1);
@@ -292,9 +292,6 @@ int
 res_queriesmatch(const u_char *buf1, const u_char *eom1,
                 const u_char *buf2, const u_char *eom2)
 {
-       const u_char *cp = buf1 + HFIXEDSZ;
-       int qdcount = ntohs(((HEADER*)buf1)->qdcount);
-
        if (buf1 + HFIXEDSZ > eom1 || buf2 + HFIXEDSZ > eom2)
                return (-1);
 
@@ -306,8 +303,16 @@ res_queriesmatch(const u_char *buf1, const u_char *eom1,
            (((HEADER *)buf2)->opcode == ns_o_update))
                return (1);
 
-       if (qdcount != ntohs(((HEADER*)buf2)->qdcount))
+       /* Note that we initially do not convert QDCOUNT to the host byte
+          order.  We can compare it with the second buffers QDCOUNT
+          value without doing this.  */
+       int qdcount = ((HEADER*)buf1)->qdcount;
+       if (qdcount != ((HEADER*)buf2)->qdcount)
                return (0);
+
+       qdcount = htons (qdcount);
+       const u_char *cp = buf1 + HFIXEDSZ;
+
        while (qdcount-- > 0) {
                char tname[MAXDNAME+1];
                int n, ttype, tclass;
@@ -318,8 +323,8 @@ res_queriesmatch(const u_char *buf1, const u_char *eom1,
                cp += n;
                if (cp + 2 * INT16SZ > eom1)
                        return (-1);
-               ttype = ns_get16(cp);   cp += INT16SZ;
-               tclass = ns_get16(cp); cp += INT16SZ;
+               NS_GET16(ttype, cp);
+               NS_GET16(tclass, cp);
                if (!res_nameinquery(tname, ttype, tclass, buf2, eom2))
                        return (0);
        }