byte-order: Make uint32_byteswap() available regardless of endianness.
authorBen Pfaff <blp@nicira.com>
Mon, 2 Dec 2013 22:53:27 +0000 (14:53 -0800)
committerBen Pfaff <blp@nicira.com>
Mon, 2 Dec 2013 22:55:48 +0000 (14:55 -0800)
pcap_read() can use it whether we're big-endian or not.

Signed-off-by: Ben Pfaff <blp@nicira.com>
Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
lib/byte-order.h
lib/pcap-file.c

index f9be78b..352f91e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2010, 2011 Nicira, Inc.
+ * Copyright (c) 2008, 2010, 2011, 2013 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -40,7 +40,6 @@ ovs_be64 htonll(uint64_t);
 uint64_t ntohll(ovs_be64);
 #endif
 
-#if defined(WORDS_BIGENDIAN)
 static inline uint32_t
 uint32_byteswap(uint32_t crc) {
     return (((crc & 0x000000ff) << 24) |
@@ -48,7 +47,6 @@ uint32_byteswap(uint32_t crc) {
             ((crc & 0x00ff0000) >>  8) |
             ((crc & 0xff000000) >> 24));
 }
-#endif
 
 /* These macros may substitute for htons(), htonl(), and htonll() in contexts
  * where function calls are not allowed, such as case labels.  They should not
index 9091a72..ac68716 100644 (file)
@@ -21,6 +21,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <sys/stat.h>
+#include "byte-order.h"
 #include "compiler.h"
 #include "ofpbuf.h"
 #include "vlog.h"
@@ -151,10 +152,7 @@ pcap_read(FILE *file, struct ofpbuf **bufp)
     /* Calculate length. */
     len = prh.incl_len;
     if (len > 0xffff) {
-        uint32_t swapped_len = (((len & 0xff000000) >> 24) |
-                                ((len & 0x00ff0000) >>  8) |
-                                ((len & 0x0000ff00) <<  8) |
-                                ((len & 0x000000ff) << 24));
+        uint32_t swapped_len = uint32_byteswap(len);
         if (swapped_len > 0xffff) {
             VLOG_WARN("bad packet length %"PRIuSIZE" or %"PRIu32" "
                       "reading pcap file",