Changeset 65579 in vbox for trunk/src/VBox/Runtime
- Timestamp:
- Feb 1, 2017 9:32:38 PM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 113233
- Location:
- trunk/src/VBox/Runtime
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/net/netaddrstr2.cpp
r62477 r65579 153 153 154 154 155 RTDECL(int) RTNetMaskToPrefixIPv4(PCRTNETADDRIPV4 pMask, int *piPrefix) 156 { 157 AssertReturn(pMask != NULL, VERR_INVALID_PARAMETER); 158 159 if (pMask->u == 0) 160 { 161 if (piPrefix != NULL) 162 *piPrefix = 0; 163 return VINF_SUCCESS; 164 } 165 166 const uint32_t uMask = RT_N2H_U32(pMask->u); 167 168 uint32_t uPrefixMask = UINT32_C(0xffffffff); 169 int iPrefixLen = 32; 170 171 while (iPrefixLen > 0) { 172 if (uMask == uPrefixMask) 173 { 174 if (piPrefix != NULL) 175 *piPrefix = iPrefixLen; 176 return VINF_SUCCESS; 177 } 178 179 --iPrefixLen; 180 uPrefixMask <<= 1; 181 } 182 183 return VERR_INVALID_PARAMETER; 184 } 185 RT_EXPORT_SYMBOL(RTNetMaskToPrefixIPv4); 186 187 188 RTDECL(int) RTNetPrefixToMaskIPv4(int iPrefix, PRTNETADDRIPV4 pMask) 189 { 190 AssertReturn(pMask != NULL, VERR_INVALID_PARAMETER); 191 192 if (RT_UNLIKELY(iPrefix < 0 || 32 < iPrefix)) 193 return VERR_INVALID_PARAMETER; 194 195 if (RT_LIKELY(iPrefix != 0)) 196 pMask->u = RT_H2N_U32(UINT32_C(0xffffffff) << (32 - iPrefix)); 197 else /* avoid UB in the shift */ 198 pMask->u = 0; 199 200 return VINF_SUCCESS; 201 } 202 RT_EXPORT_SYMBOL(RTNetPrefixToMaskIPv4); 203 204 155 205 static int rtNetStrToHexGroup(const char *pcszValue, char **ppszNext, 156 206 uint16_t *pu16) -
trunk/src/VBox/Runtime/testcase/tstRTNetIPv4.cpp
r62477 r65579 112 112 113 113 114 #define CHECKMASK(_mask, _rcExpected, _iExpectedPrefix) \ 115 do { \ 116 /* const */ RTNETADDRIPV4 Mask; \ 117 int iExpectedPrefix = (_iExpectedPrefix); \ 118 int iPrefix; \ 119 const int rcExpected = (_rcExpected); \ 120 int rc2; \ 121 \ 122 Mask.u = RT_H2N_U32_C(UINT32_C(_mask)); \ 123 rc2 = RTNetMaskToPrefixIPv4(&Mask, &iPrefix); \ 124 \ 125 if (rcExpected == VINF_SUCCESS) \ 126 { \ 127 if (rc2 != rcExpected) \ 128 { \ 129 /* unexpected failure */ \ 130 RTTestIFailed("at line %d: mask %RTnaipv4:" \ 131 " expected prefix length %d got %Rrc\n", \ 132 __LINE__, Mask.u, \ 133 iExpectedPrefix, rc2); \ 134 } \ 135 else if (iPrefix != iExpectedPrefix) \ 136 { \ 137 /* unexpected result */ \ 138 RTTestIFailed("at line %d: mask %RTnaipv4:" \ 139 " expected prefix length %d got %d\n", \ 140 __LINE__, Mask.u, \ 141 iExpectedPrefix, iPrefix); \ 142 } \ 143 } \ 144 else /* expect failure */ \ 145 { \ 146 if (rc2 == VINF_SUCCESS) \ 147 { \ 148 /* unexpected success */ \ 149 RTTestIFailed("at line %d: mask %RTnaipv4:" \ 150 " expected %Rrc got prefix length %d\n", \ 151 __LINE__, Mask.u, \ 152 rcExpected, iPrefix); \ 153 } \ 154 else if (rc2 != rcExpected) \ 155 { \ 156 /* unexpected error */ \ 157 RTTestIFailed("at line %d: mask %RTnaipv4:" \ 158 " expected %Rrc got %Rrc\n", \ 159 __LINE__, Mask.u, \ 160 rcExpected, rc2); \ 161 } \ 162 } \ 163 } while (0) 164 165 #define CHECKPREFIX(_prefix, _rcExpected, _mask) \ 166 do { \ 167 const int iPrefix = (_prefix); \ 168 RTNETADDRIPV4 ExpectedMask, Mask; \ 169 const int rcExpected = (_rcExpected); \ 170 int rc2; \ 171 \ 172 ExpectedMask.u = RT_H2N_U32_C(UINT32_C(_mask)); \ 173 rc2 = RTNetPrefixToMaskIPv4(iPrefix, &Mask); \ 174 \ 175 if (rcExpected == VINF_SUCCESS) \ 176 { \ 177 if (rc2 != rcExpected) \ 178 { \ 179 /* unexpected failure */ \ 180 RTTestIFailed("at line %d: prefix %d:" \ 181 " expected mask %RTnaipv4 got %Rrc\n", \ 182 __LINE__, iPrefix, \ 183 ExpectedMask.u, rc2); \ 184 } \ 185 else if (Mask.u != ExpectedMask.u) \ 186 { \ 187 /* unexpected result */ \ 188 RTTestIFailed("at line %d: prefix %d:" \ 189 " expected mask %RTnaipv4 got %RTnaipv4\n", \ 190 __LINE__, iPrefix, \ 191 ExpectedMask.u, Mask.u); \ 192 } \ 193 } \ 194 else /* expect failure */ \ 195 { \ 196 if (rc2 == VINF_SUCCESS) \ 197 { \ 198 /* unexpected success */ \ 199 RTTestIFailed("at line %d: prefix %d:" \ 200 " expected %Rrc got mask %RTnaipv4\n", \ 201 __LINE__, iPrefix, \ 202 rcExpected, Mask.u); \ 203 } \ 204 else if (rc2 != rcExpected) \ 205 { \ 206 /* unexpected error */ \ 207 RTTestIFailed("at line %d: prefix %d:" \ 208 " expected %Rrc got %Rrc\n", \ 209 __LINE__, iPrefix, \ 210 rcExpected, rc2); \ 211 } \ 212 } \ 213 } while (0) 214 215 #define GOODMASK(_mask, _prefix) \ 216 do { \ 217 CHECKMASK(_mask, VINF_SUCCESS, _prefix); \ 218 CHECKPREFIX(_prefix, VINF_SUCCESS, _mask); \ 219 } while (0) 220 221 #define BADMASK(_mask) \ 222 CHECKMASK(_mask, VERR_INVALID_PARAMETER, -1) 223 224 #define BADPREFIX(_prefix) \ 225 CHECKPREFIX(_prefix, VERR_INVALID_PARAMETER, 0) 226 227 114 228 int main() 115 229 { … … 153 267 NOT_ANY("0.0.0.0x"); /* bad address */ 154 268 269 270 /* 271 * The mask <-> prefix table is small so we can test it all. 272 */ 273 GOODMASK(0x00000000, 0); /* 0.0.0.0 */ 274 GOODMASK(0x80000000, 1); /* 128.0.0.0 */ 275 GOODMASK(0xc0000000, 2); /* 192.0.0.0 */ 276 GOODMASK(0xe0000000, 3); /* 224.0.0.0 */ 277 GOODMASK(0xf0000000, 4); /* 240.0.0.0 */ 278 GOODMASK(0xf8000000, 5); /* 248.0.0.0 */ 279 GOODMASK(0xfc000000, 6); /* 252.0.0.0 */ 280 GOODMASK(0xfe000000, 7); /* 254.0.0.0 */ 281 GOODMASK(0xff000000, 8); /* 255.0.0.0 */ 282 GOODMASK(0xff800000, 9); /* 255.128.0.0 */ 283 GOODMASK(0xffc00000, 10); /* 255.192.0.0 */ 284 GOODMASK(0xffe00000, 11); /* 255.224.0.0 */ 285 GOODMASK(0xfff00000, 12); /* 255.240.0.0 */ 286 GOODMASK(0xfff80000, 13); /* 255.248.0.0 */ 287 GOODMASK(0xfffc0000, 14); /* 255.252.0.0 */ 288 GOODMASK(0xfffe0000, 15); /* 255.254.0.0 */ 289 GOODMASK(0xffff0000, 16); /* 255.255.0.0 */ 290 GOODMASK(0xffff8000, 17); /* 255.255.128.0 */ 291 GOODMASK(0xffffc000, 18); /* 255.255.192.0 */ 292 GOODMASK(0xffffe000, 19); /* 255.255.224.0 */ 293 GOODMASK(0xfffff000, 20); /* 255.255.240.0 */ 294 GOODMASK(0xfffff800, 21); /* 255.255.248.0 */ 295 GOODMASK(0xfffffc00, 22); /* 255.255.252.0 */ 296 GOODMASK(0xfffffe00, 23); /* 255.255.254.0 */ 297 GOODMASK(0xffffff00, 24); /* 255.255.255.0 */ 298 GOODMASK(0xffffff80, 25); /* 255.255.255.128 */ 299 GOODMASK(0xffffffc0, 26); /* 255.255.255.192 */ 300 GOODMASK(0xffffffe0, 27); /* 255.255.255.224 */ 301 GOODMASK(0xfffffff0, 28); /* 255.255.255.240 */ 302 GOODMASK(0xfffffff8, 29); /* 255.255.255.248 */ 303 GOODMASK(0xfffffffc, 30); /* 255.255.255.252 */ 304 GOODMASK(0xfffffffe, 31); /* 255.255.255.254 */ 305 GOODMASK(0xffffffff, 32); /* 255.255.255.255 */ 306 307 BADMASK(0x01020304); 308 309 BADPREFIX(-1); 310 BADPREFIX(33); 311 155 312 return RTTestSummaryAndDestroy(hTest); 156 313 }
Note:
See TracChangeset
for help on using the changeset viewer.