LCOV - code coverage report
Current view: top level - lib - byte-order.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 19 19 100.0 %
Date: 2016-09-14 01:02:56 Functions: 7 7 100.0 %
Branches: 2 4 50.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * Copyright (c) 2008, 2010, 2011, 2013, 2016 Nicira, Inc.
       3                 :            :  *
       4                 :            :  * Licensed under the Apache License, Version 2.0 (the "License");
       5                 :            :  * you may not use this file except in compliance with the License.
       6                 :            :  * You may obtain a copy of the License at:
       7                 :            :  *
       8                 :            :  *     http://www.apache.org/licenses/LICENSE-2.0
       9                 :            :  *
      10                 :            :  * Unless required by applicable law or agreed to in writing, software
      11                 :            :  * distributed under the License is distributed on an "AS IS" BASIS,
      12                 :            :  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      13                 :            :  * See the License for the specific language governing permissions and
      14                 :            :  * limitations under the License.
      15                 :            :  */
      16                 :            : #ifndef BYTE_ORDER_H
      17                 :            : #define BYTE_ORDER_H 1
      18                 :            : 
      19                 :            : #include <arpa/inet.h>
      20                 :            : #include <sys/types.h>
      21                 :            : #include <inttypes.h>
      22                 :            : #include "openvswitch/types.h"
      23                 :            : 
      24                 :            : #ifndef __CHECKER__
      25                 :            : #if !(defined(_WIN32) || defined(htonll))
      26                 :            : static inline ovs_be64
      27                 :   80298342 : htonll(uint64_t n)
      28                 :            : {
      29         [ +  - ]:   80298342 :     return htonl(1) == 1 ? n : ((uint64_t) htonl(n) << 32) | htonl(n >> 32);
      30                 :            : }
      31                 :            : 
      32                 :            : static inline uint64_t
      33                 :   21964286 : ntohll(ovs_be64 n)
      34                 :            : {
      35         [ +  - ]:   21964286 :     return htonl(1) == 1 ? n : ((uint64_t) ntohl(n) << 32) | ntohl(n >> 32);
      36                 :            : }
      37                 :            : #endif /* !(defined(_WIN32) || defined(htonll)) */
      38                 :            : #else
      39                 :            : /* Making sparse happy with these functions also makes them unreadable, so
      40                 :            :  * don't bother to show it their implementations. */
      41                 :            : ovs_be64 htonll(uint64_t);
      42                 :            : uint64_t ntohll(ovs_be64);
      43                 :            : #endif
      44                 :            : 
      45                 :            : static inline ovs_be128
      46                 :     429492 : hton128(const ovs_u128 src)
      47                 :            : {
      48                 :            :     ovs_be128 dst;
      49                 :            : 
      50                 :     429492 :     dst.be64.hi = htonll(src.u64.hi);
      51                 :     429492 :     dst.be64.lo = htonll(src.u64.lo);
      52                 :     429492 :     return dst;
      53                 :            : }
      54                 :            : 
      55                 :            : static inline ovs_u128
      56                 :     290884 : ntoh128(const ovs_be128 src)
      57                 :            : {
      58                 :            :     ovs_u128 dst;
      59                 :            : 
      60                 :     290884 :     dst.u64.hi = ntohll(src.be64.hi);
      61                 :     290884 :     dst.u64.lo = ntohll(src.be64.lo);
      62                 :     290884 :     return dst;
      63                 :            : }
      64                 :            : 
      65                 :            : static inline uint32_t
      66                 :        247 : uint32_byteswap(uint32_t crc) {
      67                 :        247 :     return (((crc & 0x000000ff) << 24) |
      68                 :        494 :             ((crc & 0x0000ff00) <<  8) |
      69                 :        247 :             ((crc & 0x00ff0000) >>  8) |
      70                 :        247 :             ((crc & 0xff000000) >> 24));
      71                 :            : }
      72                 :            : 
      73                 :            : /* These macros may substitute for htons(), htonl(), and htonll() in contexts
      74                 :            :  * where function calls are not allowed, such as case labels.  They should not
      75                 :            :  * be used elsewhere because all of them evaluate their argument many times. */
      76                 :            : #if defined(WORDS_BIGENDIAN) || __CHECKER__
      77                 :            : #define CONSTANT_HTONS(VALUE) ((OVS_FORCE ovs_be16) ((VALUE) & 0xffff))
      78                 :            : #define CONSTANT_HTONL(VALUE) ((OVS_FORCE ovs_be32) ((VALUE) & 0xffffffff))
      79                 :            : #define CONSTANT_HTONLL(VALUE) \
      80                 :            :         ((OVS_FORCE ovs_be64) ((VALUE) & UINT64_C(0xffffffffffffffff)))
      81                 :            : #else
      82                 :            : #define CONSTANT_HTONS(VALUE)                       \
      83                 :            :         (((((ovs_be16) (VALUE)) & 0xff00) >> 8) |   \
      84                 :            :          ((((ovs_be16) (VALUE)) & 0x00ff) << 8))
      85                 :            : #define CONSTANT_HTONL(VALUE)                           \
      86                 :            :         (((((ovs_be32) (VALUE)) & 0x000000ff) << 24) |  \
      87                 :            :          ((((ovs_be32) (VALUE)) & 0x0000ff00) <<  8) |  \
      88                 :            :          ((((ovs_be32) (VALUE)) & 0x00ff0000) >>  8) |  \
      89                 :            :          ((((ovs_be32) (VALUE)) & 0xff000000) >> 24))
      90                 :            : #define CONSTANT_HTONLL(VALUE)                                           \
      91                 :            :         (((((ovs_be64) (VALUE)) & UINT64_C(0x00000000000000ff)) << 56) | \
      92                 :            :          ((((ovs_be64) (VALUE)) & UINT64_C(0x000000000000ff00)) << 40) | \
      93                 :            :          ((((ovs_be64) (VALUE)) & UINT64_C(0x0000000000ff0000)) << 24) | \
      94                 :            :          ((((ovs_be64) (VALUE)) & UINT64_C(0x00000000ff000000)) <<  8) | \
      95                 :            :          ((((ovs_be64) (VALUE)) & UINT64_C(0x000000ff00000000)) >>  8) | \
      96                 :            :          ((((ovs_be64) (VALUE)) & UINT64_C(0x0000ff0000000000)) >> 24) | \
      97                 :            :          ((((ovs_be64) (VALUE)) & UINT64_C(0x00ff000000000000)) >> 40) | \
      98                 :            :          ((((ovs_be64) (VALUE)) & UINT64_C(0xff00000000000000)) >> 56))
      99                 :            : #endif
     100                 :            : 
     101                 :            : #if WORDS_BIGENDIAN
     102                 :            : #define BYTES_TO_BE32(B1, B2, B3, B4) \
     103                 :            :     (OVS_FORCE ovs_be32)((uint32_t)(B1) << 24 | (B2) << 16 | (B3) << 8 | (B4))
     104                 :            : #define BE16S_TO_BE32(B1, B2) \
     105                 :            :     (OVS_FORCE ovs_be32)((uint32_t)(B1) << 16 | (B2))
     106                 :            : #else
     107                 :            : #define BYTES_TO_BE32(B1, B2, B3, B4) \
     108                 :            :     (OVS_FORCE ovs_be32)((uint32_t)(B1) | (B2) << 8 | (B3) << 16 | (B4) << 24)
     109                 :            : #define BE16S_TO_BE32(B1, B2) \
     110                 :            :     (OVS_FORCE ovs_be32)((uint32_t)(B1) | (B2) << 16)
     111                 :            : #endif
     112                 :            : 
     113                 :            : /* These functions zero-extend big-endian values to longer ones,
     114                 :            :  * or truncate long big-endian value to shorter ones. */
     115                 :            : #ifndef __CHECKER__
     116                 :            : #if WORDS_BIGENDIAN
     117                 :            : static inline ovs_be32 be16_to_be32(ovs_be16 x) { return x; }
     118                 :            : static inline ovs_be64 be16_to_be64(ovs_be16 x) { return x; }
     119                 :            : static inline ovs_be64 be32_to_be64(ovs_be32 x) { return x; }
     120                 :            : static inline ovs_be32 be64_to_be32(ovs_be64 x) { return x; }
     121                 :            : static inline ovs_be16 be64_to_be16(ovs_be64 x) { return x; }
     122                 :            : static inline ovs_be16 be32_to_be16(ovs_be32 x) { return x; }
     123                 :            : #else /* !WORDS_BIGENDIAN */
     124                 :            : static inline ovs_be32 be16_to_be32(ovs_be16 x) { return (ovs_be32) x << 16; }
     125                 :            : static inline ovs_be64 be16_to_be64(ovs_be16 x) { return (ovs_be64) x << 48; }
     126                 :          4 : static inline ovs_be64 be32_to_be64(ovs_be32 x) { return (ovs_be64) x << 32; }
     127                 :         20 : static inline ovs_be32 be64_to_be32(ovs_be64 x) { return x >> 32; }
     128                 :            : static inline ovs_be16 be64_to_be16(ovs_be64 x) { return x >> 48; }
     129                 :            : static inline ovs_be16 be32_to_be16(ovs_be32 x) { return x >> 16; }
     130                 :            : #endif /* !WORDS_BIGENDIAN */
     131                 :            : #else /* __CHECKER__ */
     132                 :            : /* Making sparse happy with these functions also makes them unreadable, so
     133                 :            :  * don't bother to show it their implementations. */
     134                 :            : ovs_be32 be16_to_be32(ovs_be16);
     135                 :            : ovs_be64 be16_to_be64(ovs_be16);
     136                 :            : ovs_be64 be32_to_be64(ovs_be32);
     137                 :            : ovs_be32 be64_to_be32(ovs_be64);
     138                 :            : ovs_be16 be64_to_be16(ovs_be64);
     139                 :            : ovs_be16 be32_to_be16(ovs_be32);
     140                 :            : #endif
     141                 :            : 
     142                 :            : #endif /* byte-order.h */

Generated by: LCOV version 1.12