VirtualBox

Changeset 65579 in vbox for trunk/src/VBox/Runtime


Ignore:
Timestamp:
Feb 1, 2017 9:32:38 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
113233
Message:

IPRT: RTNetMaskToPrefixIPv4 and RTNetPrefixToMaskIPv4.

Location:
trunk/src/VBox/Runtime
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/net/netaddrstr2.cpp

    r62477 r65579  
    153153
    154154
     155RTDECL(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}
     185RT_EXPORT_SYMBOL(RTNetMaskToPrefixIPv4);
     186
     187
     188RTDECL(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}
     202RT_EXPORT_SYMBOL(RTNetPrefixToMaskIPv4);
     203
     204
    155205static int rtNetStrToHexGroup(const char *pcszValue, char **ppszNext,
    156206                              uint16_t *pu16)
  • trunk/src/VBox/Runtime/testcase/tstRTNetIPv4.cpp

    r62477 r65579  
    112112
    113113
     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
    114228int main()
    115229{
     
    153267    NOT_ANY("0.0.0.0x");        /* bad address */
    154268
     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
    155312    return RTTestSummaryAndDestroy(hTest);
    156313}
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette