@@ -1068,15 +1068,24 @@ CSubNet::CSubNet(const CNetAddr& addr, const CNetAddr& mask) : CSubNet()
1068
1068
1069
1069
CSubNet::CSubNet (const CNetAddr& addr) : CSubNet()
1070
1070
{
1071
- valid = addr.IsIPv4 () || addr.IsIPv6 ();
1072
- if (!valid) {
1071
+ switch (addr.m_net ) {
1072
+ case NET_IPV4:
1073
+ case NET_IPV6:
1074
+ valid = true ;
1075
+ assert (addr.m_addr .size () <= sizeof (netmask));
1076
+ memset (netmask, 0xFF , addr.m_addr .size ());
1077
+ break ;
1078
+ case NET_ONION:
1079
+ case NET_I2P:
1080
+ case NET_CJDNS:
1081
+ valid = true ;
1082
+ break ;
1083
+ case NET_INTERNAL:
1084
+ case NET_UNROUTABLE:
1085
+ case NET_MAX:
1073
1086
return ;
1074
1087
}
1075
1088
1076
- assert (addr.m_addr .size () <= sizeof (netmask));
1077
-
1078
- memset (netmask, 0xFF , addr.m_addr .size ());
1079
-
1080
1089
network = addr;
1081
1090
}
1082
1091
@@ -1088,6 +1097,21 @@ bool CSubNet::Match(const CNetAddr &addr) const
1088
1097
{
1089
1098
if (!valid || !addr.IsValid () || network.m_net != addr.m_net )
1090
1099
return false ;
1100
+
1101
+ switch (network.m_net ) {
1102
+ case NET_IPV4:
1103
+ case NET_IPV6:
1104
+ break ;
1105
+ case NET_ONION:
1106
+ case NET_I2P:
1107
+ case NET_CJDNS:
1108
+ case NET_INTERNAL:
1109
+ return addr == network;
1110
+ case NET_UNROUTABLE:
1111
+ case NET_MAX:
1112
+ return false ;
1113
+ }
1114
+
1091
1115
assert (network.m_addr .size () == addr.m_addr .size ());
1092
1116
for (size_t x = 0 ; x < addr.m_addr .size (); ++x) {
1093
1117
if ((addr.m_addr [x] & netmask[x]) != network.m_addr [x]) {
@@ -1099,18 +1123,35 @@ bool CSubNet::Match(const CNetAddr &addr) const
1099
1123
1100
1124
std::string CSubNet::ToString () const
1101
1125
{
1102
- assert (network. m_addr . size () <= sizeof (netmask)) ;
1126
+ std::string suffix ;
1103
1127
1104
- uint8_t cidr = 0 ;
1128
+ switch (network.m_net ) {
1129
+ case NET_IPV4:
1130
+ case NET_IPV6: {
1131
+ assert (network.m_addr .size () <= sizeof (netmask));
1105
1132
1106
- for (size_t i = 0 ; i < network.m_addr .size (); ++i) {
1107
- if (netmask[i] == 0x00 ) {
1108
- break ;
1133
+ uint8_t cidr = 0 ;
1134
+
1135
+ for (size_t i = 0 ; i < network.m_addr .size (); ++i) {
1136
+ if (netmask[i] == 0x00 ) {
1137
+ break ;
1138
+ }
1139
+ cidr += NetmaskBits (netmask[i]);
1109
1140
}
1110
- cidr += NetmaskBits (netmask[i]);
1141
+
1142
+ suffix = strprintf (" /%u" , cidr);
1143
+ break ;
1144
+ }
1145
+ case NET_ONION:
1146
+ case NET_I2P:
1147
+ case NET_CJDNS:
1148
+ case NET_INTERNAL:
1149
+ case NET_UNROUTABLE:
1150
+ case NET_MAX:
1151
+ break ;
1111
1152
}
1112
1153
1113
- return network.ToString () + strprintf ( " /%u " , cidr) ;
1154
+ return network.ToString () + suffix ;
1114
1155
}
1115
1156
1116
1157
bool CSubNet::IsValid () const
@@ -1120,7 +1161,19 @@ bool CSubNet::IsValid() const
1120
1161
1121
1162
bool CSubNet::SanityCheck () const
1122
1163
{
1123
- if (!(network.IsIPv4 () || network.IsIPv6 ())) return false ;
1164
+ switch (network.m_net ) {
1165
+ case NET_IPV4:
1166
+ case NET_IPV6:
1167
+ break ;
1168
+ case NET_ONION:
1169
+ case NET_I2P:
1170
+ case NET_CJDNS:
1171
+ return true ;
1172
+ case NET_INTERNAL:
1173
+ case NET_UNROUTABLE:
1174
+ case NET_MAX:
1175
+ return false ;
1176
+ }
1124
1177
1125
1178
for (size_t x = 0 ; x < network.m_addr .size (); ++x) {
1126
1179
if (network.m_addr [x] & ~netmask[x]) return false ;
0 commit comments