Skip to content

Commit b4ce526

Browse files
committed
Add 64 bit host to network and network to host support
1 parent 7826970 commit b4ce526

3 files changed

Lines changed: 131 additions & 4 deletions

File tree

common/network/NetworkUtils.cpp

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,17 @@ inline bool IsBigEndian() {
106106
#endif // defined(HAVE_ENDIAN_H) && defined(__BIG_ENDIAN)
107107
}
108108

109+
inline uint64_t ByteSwap64(uint64_t value) {
110+
return ((value & 0x00000000000000ff) << 56) |
111+
((value & 0x000000000000ff00) << 40) |
112+
((value & 0x0000000000ff0000) << 24) |
113+
((value & 0x00000000ff000000) << 8) |
114+
((value & 0x000000ff00000000) >> 8) |
115+
((value & 0x0000ff0000000000) >> 24) |
116+
((value & 0x00ff000000000000) >> 40) |
117+
((value & 0xff00000000000000) >> 56);
118+
}
119+
109120
inline uint32_t ByteSwap32(uint32_t value) {
110121
return ((value & 0x000000ff) << 24) |
111122
((value & 0x0000ff00) << 8) |
@@ -148,6 +159,14 @@ uint32_t NetworkToHost(uint32_t value) {
148159
return ntohl(value);
149160
}
150161

162+
uint64_t NetworkToHost(uint64_t value) {
163+
#ifdef HAVE_ENDIAN_H
164+
return be64toh(value);
165+
#else
166+
#error "No be64toh for NetworkToHost, please report this."
167+
#endif // HAVE_ENDIAN_H
168+
}
169+
151170
int16_t NetworkToHost(int16_t value) {
152171
return ntohs(value);
153172
}
@@ -156,6 +175,14 @@ int32_t NetworkToHost(int32_t value) {
156175
return ntohl(value);
157176
}
158177

178+
int64_t NetworkToHost(int64_t value) {
179+
#ifdef HAVE_ENDIAN_H
180+
return be64toh(value);
181+
#else
182+
#error "No be64toh for NetworkToHost, please report this."
183+
#endif // HAVE_ENDIAN_H
184+
}
185+
159186
uint16_t HostToNetwork(uint16_t value) {
160187
return htons(value);
161188
}
@@ -172,6 +199,22 @@ int32_t HostToNetwork(int32_t value) {
172199
return htonl(value);
173200
}
174201

202+
uint64_t HostToNetwork(uint64_t value) {
203+
#ifdef HAVE_ENDIAN_H
204+
return htobe64(value);
205+
#else
206+
#error "No htobe64 for HostToNetwork, please report this."
207+
#endif // HAVE_ENDIAN_H
208+
}
209+
210+
int64_t HostToNetwork(int64_t value) {
211+
#ifdef HAVE_ENDIAN_H
212+
return htobe64(value);
213+
#else
214+
#error "No htobe64 for HostToNetwork, please report this."
215+
#endif // HAVE_ENDIAN_H
216+
}
217+
175218
uint16_t HostToLittleEndian(uint16_t value) {
176219
if (IsBigEndian()) {
177220
return ByteSwap16(value);
@@ -204,6 +247,22 @@ int32_t HostToLittleEndian(int32_t value) {
204247
}
205248
}
206249

250+
uint64_t HostToLittleEndian(uint64_t value) {
251+
if (IsBigEndian()) {
252+
return ByteSwap64(value);
253+
} else {
254+
return value;
255+
}
256+
}
257+
258+
int64_t HostToLittleEndian(int64_t value) {
259+
if (IsBigEndian()) {
260+
return ByteSwap64(value);
261+
} else {
262+
return value;
263+
}
264+
}
265+
207266
uint16_t LittleEndianToHost(uint16_t value) {
208267
if (IsBigEndian()) {
209268
return ByteSwap16(value);
@@ -239,6 +298,24 @@ int32_t LittleEndianToHost(int32_t value) {
239298
}
240299
}
241300

301+
302+
uint64_t LittleEndianToHost(uint64_t value) {
303+
if (IsBigEndian()) {
304+
return ByteSwap64(value);
305+
} else {
306+
return value;
307+
}
308+
}
309+
310+
311+
int64_t LittleEndianToHost(int64_t value) {
312+
if (IsBigEndian()) {
313+
return ByteSwap64(value);
314+
} else {
315+
return value;
316+
}
317+
}
318+
242319
string HostnameFromFQDN(const string &fqdn) {
243320
string::size_type first_dot = fqdn.find_first_of(".");
244321
if (first_dot == string::npos) {

common/network/NetworkUtilsTest.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ void NetworkUtilsTest::tearDown() {
8888
#endif // _WIN32
8989
}
9090

91+
9192
/*
9293
* Check that we can convert to/from network byte order
9394
*/
@@ -101,6 +102,9 @@ void NetworkUtilsTest::testToFromNetwork() {
101102

102103
uint32_t v3 = 0x01020304;
103104
OLA_ASSERT_EQ(v3, NetworkToHost(HostToNetwork(v3)));
105+
106+
uint64_t v4 = 0x0102030405060708;
107+
OLA_ASSERT_EQ(v4, NetworkToHost(HostToNetwork(v4)));
104108
}
105109

106110

@@ -118,15 +122,21 @@ void NetworkUtilsTest::testToFromLittleEndian() {
118122
uint32_t v3 = 0x01020304;
119123
OLA_ASSERT_EQ(v3, LittleEndianToHost(HostToLittleEndian(v3)));
120124

121-
int8_t v4 = -10;
122-
OLA_ASSERT_EQ(v4, HostToLittleEndian(v4));
125+
uint64_t v4 = 0x0102030405060708;
123126
OLA_ASSERT_EQ(v4, LittleEndianToHost(HostToLittleEndian(v4)));
124127

125-
int16_t v5 = -0x0102;
128+
int8_t v5 = -10;
129+
OLA_ASSERT_EQ(v5, HostToLittleEndian(v5));
126130
OLA_ASSERT_EQ(v5, LittleEndianToHost(HostToLittleEndian(v5)));
127131

128-
int32_t v6 = -0x01020304;
132+
int16_t v6 = -0x0102;
129133
OLA_ASSERT_EQ(v6, LittleEndianToHost(HostToLittleEndian(v6)));
134+
135+
int32_t v7 = -0x01020304;
136+
OLA_ASSERT_EQ(v7, LittleEndianToHost(HostToLittleEndian(v7)));
137+
138+
int64_t v8 = -0x0102030405060708;
139+
OLA_ASSERT_EQ(v8, LittleEndianToHost(HostToLittleEndian(v8)));
130140
}
131141

132142

include/ola/network/NetworkUtils.h

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ uint16_t NetworkToHost(uint16_t value);
4646
*/
4747
uint32_t NetworkToHost(uint32_t value);
4848

49+
/**
50+
* @brief 64-bit unsigned network to host conversion.
51+
*/
52+
uint64_t NetworkToHost(uint64_t value);
53+
4954
/**
5055
* @brief 8-bit signed network to host conversion.
5156
*/
@@ -61,6 +66,11 @@ int16_t NetworkToHost(int16_t value);
6166
*/
6267
int32_t NetworkToHost(int32_t value);
6368

69+
/**
70+
* @brief 64-bit signed network to host conversion.
71+
*/
72+
int64_t NetworkToHost(int64_t value);
73+
6474
/**
6575
* @brief 8-bit unsigned host to network conversion.
6676
*/
@@ -76,6 +86,11 @@ uint16_t HostToNetwork(uint16_t value);
7686
*/
7787
uint32_t HostToNetwork(uint32_t value);
7888

89+
/**
90+
* @brief 64-bit unsigned host to network conversion.
91+
*/
92+
uint64_t HostToNetwork(uint64_t value);
93+
7994
/**
8095
* @brief 8-bit signed host to network conversion.
8196
*/
@@ -91,6 +106,11 @@ int16_t HostToNetwork(int16_t value);
91106
*/
92107
int32_t HostToNetwork(int32_t value);
93108

109+
/**
110+
* @brief 64-bit signed host to network conversion.
111+
*/
112+
int64_t HostToNetwork(int64_t value);
113+
94114
/**
95115
* @brief 8-bit unsigned host to little endian conversion.
96116
*/
@@ -106,6 +126,11 @@ uint16_t HostToLittleEndian(uint16_t value);
106126
*/
107127
uint32_t HostToLittleEndian(uint32_t value);
108128

129+
/**
130+
* @brief 64-bit unsigned host to little endian conversion.
131+
*/
132+
uint64_t HostToLittleEndian(uint64_t value);
133+
109134
/**
110135
* @brief 8-bit signed host to little endian conversion.
111136
*/
@@ -121,6 +146,11 @@ int16_t HostToLittleEndian(int16_t value);
121146
*/
122147
int32_t HostToLittleEndian(int32_t value);
123148

149+
/**
150+
* @brief 64-bit signed host to little endian conversion.
151+
*/
152+
int64_t HostToLittleEndian(int64_t value);
153+
124154
/**
125155
* @brief 8-bit unsigned little endian to host conversion.
126156
*/
@@ -136,6 +166,11 @@ uint16_t LittleEndianToHost(uint16_t value);
136166
*/
137167
uint32_t LittleEndianToHost(uint32_t value);
138168

169+
/**
170+
* @brief 64-bit unsigned little endian to host conversion.
171+
*/
172+
uint64_t LittleEndianToHost(uint64_t value);
173+
139174
/**
140175
* @brief 8-bit signed little endian to host conversion.
141176
*/
@@ -151,6 +186,11 @@ int16_t LittleEndianToHost(int16_t value);
151186
*/
152187
int32_t LittleEndianToHost(int32_t value);
153188

189+
/**
190+
* @brief 64-bit signed little endian to host conversion.
191+
*/
192+
int64_t LittleEndianToHost(int64_t value);
193+
154194
/**
155195
* Convert a FQDN to a hostname
156196
* @param fqdn a fully qualified domain name

0 commit comments

Comments
 (0)