blob: b0d6b897ed65bdb6e3833352ade81cf83cfbbcfa (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
// SPDX-License-Identifier: Apache-2.0
// SPDX-FileCopyrightText: Copyright OpenBMC Authors
#pragma once
#include <boost/asio/ip/address.hpp>
#include <boost/asio/ip/address_v4.hpp>
#include <boost/asio/ip/address_v6.hpp>
#include <cstdint>
#include <string>
namespace redfish
{
namespace ip_util
{
/**
* @brief Converts boost::asio::ip::address to string
* Will automatically convert IPv4-mapped IPv6 address back to IPv4.
*
* @param[in] ipAddr IP address to convert
*
* @return IP address string
*/
inline std::string toString(const boost::asio::ip::address& ipAddr)
{
if (ipAddr.is_v6() && ipAddr.to_v6().is_v4_mapped())
{
return boost::asio::ip::make_address_v4(boost::asio::ip::v4_mapped,
ipAddr.to_v6())
.to_string();
}
return ipAddr.to_string();
}
/**
* @brief Helper function that verifies IP address to check if it is in
* proper format. If bits pointer is provided, also calculates active
* bit count for Subnet Mask.
*
* @param[in] ip IP that will be verified
* @param[out] bits Calculated mask in bits notation
*
* @return true in case of success, false otherwise
*/
inline bool ipv4VerifyIpAndGetBitcount(const std::string& ip,
uint8_t* prefixLength = nullptr)
{
boost::system::error_code ec;
boost::asio::ip::address_v4 addr = boost::asio::ip::make_address_v4(ip, ec);
if (ec)
{
return false;
}
if (prefixLength != nullptr)
{
uint8_t prefix = 0;
boost::asio::ip::address_v4::bytes_type maskBytes = addr.to_bytes();
bool maskFinished = false;
for (unsigned char byte : maskBytes)
{
if (maskFinished)
{
if (byte != 0U)
{
return false;
}
continue;
}
switch (byte)
{
case 255:
prefix += 8;
break;
case 254:
prefix += 7;
maskFinished = true;
break;
case 252:
prefix += 6;
maskFinished = true;
break;
case 248:
prefix += 5;
maskFinished = true;
break;
case 240:
prefix += 4;
maskFinished = true;
break;
case 224:
prefix += 3;
maskFinished = true;
break;
case 192:
prefix += 2;
maskFinished = true;
break;
case 128:
prefix += 1;
maskFinished = true;
break;
case 0:
maskFinished = true;
break;
default:
// Invalid netmask
return false;
}
}
*prefixLength = prefix;
}
return true;
}
} // namespace ip_util
} // namespace redfish
|