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 */
|