LCOV - code coverage report
Current view: top level - app/test - test_cmdline_ipaddr.c (source / functions) Hit Total Coverage
Test: Code coverage Lines: 86 127 67.7 %
Date: 2025-01-02 22:41:34 Functions: 4 5 80.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 90 116 77.6 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: BSD-3-Clause
       2                 :            :  * Copyright(c) 2010-2014 Intel Corporation
       3                 :            :  */
       4                 :            : #include <stdio.h>
       5                 :            : #include <string.h>
       6                 :            : #include <inttypes.h>
       7                 :            : 
       8                 :            : #include <rte_string_fns.h>
       9                 :            : 
      10                 :            : #include <cmdline_parse.h>
      11                 :            : #include <cmdline_parse_ipaddr.h>
      12                 :            : 
      13                 :            : #include "test_cmdline.h"
      14                 :            : 
      15                 :            : #define IP4(a,b,c,d) {.s_addr = (uint32_t)(((a) & 0xff) | \
      16                 :            :                                            (((b) & 0xff) << 8) | \
      17                 :            :                                            (((c) & 0xff) << 16)  | \
      18                 :            :                                            ((d) & 0xff)  << 24)}
      19                 :            : 
      20                 :            : #define IP6(a, b, c, d, e, f, g, h) .ipv6 = RTE_IPV6(a, b, c, d, e, f, g, h)
      21                 :            : 
      22                 :            : /** these are defined in netinet/in.h but not present in linux headers */
      23                 :            : #ifndef NIPQUAD
      24                 :            : 
      25                 :            : #define NIPQUAD_FMT "%u.%u.%u.%u"
      26                 :            : #define NIPQUAD(addr)                           \
      27                 :            :         (unsigned)((unsigned char *)&addr)[0],      \
      28                 :            :         (unsigned)((unsigned char *)&addr)[1],      \
      29                 :            :         (unsigned)((unsigned char *)&addr)[2],      \
      30                 :            :         (unsigned)((unsigned char *)&addr)[3]
      31                 :            : #endif
      32                 :            : 
      33                 :            : struct ipaddr_str {
      34                 :            :         const char * str;
      35                 :            :         cmdline_ipaddr_t addr;
      36                 :            :         unsigned flags;
      37                 :            : };
      38                 :            : 
      39                 :            : const struct ipaddr_str ipaddr_valid_strs[] = {
      40                 :            :                 {"0.0.0.0", {AF_INET, {IP4(0,0,0,0)}, 0},
      41                 :            :                                 CMDLINE_IPADDR_V4},
      42                 :            :                 {"0.0.0.0/0", {AF_INET, {IP4(0,0,0,0)}, 0},
      43                 :            :                                 CMDLINE_IPADDR_V4 | CMDLINE_IPADDR_NETWORK},
      44                 :            :                 {"0.0.0.0/24", {AF_INET, {IP4(0,0,0,0)}, 24},
      45                 :            :                                 CMDLINE_IPADDR_V4 | CMDLINE_IPADDR_NETWORK},
      46                 :            :                 {"192.168.1.0/24", {AF_INET, {IP4(192,168,1,0)}, 24},
      47                 :            :                                 CMDLINE_IPADDR_V4 | CMDLINE_IPADDR_NETWORK},
      48                 :            :                 {"34.56.78.90/1", {AF_INET, {IP4(34,56,78,90)}, 1},
      49                 :            :                                 CMDLINE_IPADDR_V4 | CMDLINE_IPADDR_NETWORK},
      50                 :            :                 {"::", {AF_INET6, {IP6(0,0,0,0,0,0,0,0)}, 0},
      51                 :            :                                         CMDLINE_IPADDR_V6},
      52                 :            :                 {"::1", {AF_INET6, {IP6(0,0,0,0,0,0,0,1)}, 0},
      53                 :            :                                 CMDLINE_IPADDR_V6},
      54                 :            :                 {"::1/32", {AF_INET6, {IP6(0,0,0,0,0,0,0,1)}, 32},
      55                 :            :                                 CMDLINE_IPADDR_V6 | CMDLINE_IPADDR_NETWORK},
      56                 :            :                 {"::/32", {AF_INET6, {IP6(0,0,0,0,0,0,0,0)}, 32},
      57                 :            :                                         CMDLINE_IPADDR_V6 | CMDLINE_IPADDR_NETWORK},
      58                 :            :                 /* RFC5952 requests that only lowercase should be used */
      59                 :            :                 {"1234:5678:90ab:cdef:4321:8765:BA09:FEDC", {AF_INET6,
      60                 :            :                                 {IP6(0x1234,0x5678,0x90AB,0xCDEF,0x4321,0x8765,0xBA09,0xFEDC)},
      61                 :            :                                 0},
      62                 :            :                                 CMDLINE_IPADDR_V6},
      63                 :            :                 {"1234::1234/64", {AF_INET6,
      64                 :            :                                 {IP6(0x1234,0,0,0,0,0,0,0x1234)},
      65                 :            :                                 64},
      66                 :            :                                 CMDLINE_IPADDR_V6 | CMDLINE_IPADDR_NETWORK},
      67                 :            :                 {"1234::/64", {AF_INET6,
      68                 :            :                                 {IP6(0x1234,0,0,0,0,0,0,0)},
      69                 :            :                                 64},
      70                 :            :                                 CMDLINE_IPADDR_V6 | CMDLINE_IPADDR_NETWORK},
      71                 :            :                 {"1:1::1/32", {AF_INET6,
      72                 :            :                                 {IP6(1,1,0,0,0,0,0,1)},
      73                 :            :                                 32},
      74                 :            :                                 CMDLINE_IPADDR_V6 | CMDLINE_IPADDR_NETWORK},
      75                 :            :                 {"1:2:3:4::/64", {AF_INET6,
      76                 :            :                                 {IP6(1,2,3,4,0,0,0,0)},
      77                 :            :                                 64},
      78                 :            :                         CMDLINE_IPADDR_V6 | CMDLINE_IPADDR_NETWORK},
      79                 :            :                 {"::ffff:192.168.1.0/64", {AF_INET6,
      80                 :            :                                 {IP6(0,0,0,0,0,0xFFFF,0xC0A8,0x100)},
      81                 :            :                                 64},
      82                 :            :                         CMDLINE_IPADDR_V6 | CMDLINE_IPADDR_NETWORK},
      83                 :            :                 /* RFC5952 requests not using :: to skip one block of zeros*/
      84                 :            :                 {"1::2:3:4:5:6:7", {AF_INET6,
      85                 :            :                                 {IP6(1,0,2,3,4,5,6,7)},
      86                 :            :                                 0},
      87                 :            :                         CMDLINE_IPADDR_V6},
      88                 :            : };
      89                 :            : 
      90                 :            : const char * ipaddr_garbage_addr4_strs[] = {
      91                 :            :                 /* IPv4 */
      92                 :            :                 "192.168.1.0 garbage",
      93                 :            :                 "192.168.1.0\0garbage",
      94                 :            :                 "192.168.1.0#garbage",
      95                 :            :                 "192.168.1.0\tgarbage",
      96                 :            :                 "192.168.1.0\rgarbage",
      97                 :            :                 "192.168.1.0\ngarbage",
      98                 :            : };
      99                 :            : #define IPv4_GARBAGE_ADDR IP4(192,168,1,0)
     100                 :            : 
     101                 :            : const char * ipaddr_garbage_addr6_strs[] = {
     102                 :            :                 /* IPv6 */
     103                 :            :                 "1:2:3:4::8 garbage",
     104                 :            :                 "1:2:3:4::8#garbage",
     105                 :            :                 "1:2:3:4::8\0garbage",
     106                 :            :                 "1:2:3:4::8\rgarbage",
     107                 :            :                 "1:2:3:4::8\ngarbage",
     108                 :            :                 "1:2:3:4::8\tgarbage",
     109                 :            : };
     110                 :            : #define IPv6_GARBAGE_ADDR {IP6(1,2,3,4,0,0,0,8)}
     111                 :            : 
     112                 :            : const char * ipaddr_garbage_network4_strs[] = {
     113                 :            :                 /* IPv4 */
     114                 :            :                 "192.168.1.0/24 garbage",
     115                 :            :                 "192.168.1.0/24\0garbage",
     116                 :            :                 "192.168.1.0/24#garbage",
     117                 :            :                 "192.168.1.0/24\tgarbage",
     118                 :            :                 "192.168.1.0/24\rgarbage",
     119                 :            :                 "192.168.1.0/24\ngarbage",
     120                 :            : };
     121                 :            : #define IPv4_GARBAGE_PREFIX 24
     122                 :            : 
     123                 :            : const char * ipaddr_garbage_network6_strs[] = {
     124                 :            :                 /* IPv6 */
     125                 :            :                 "1:2:3:4::8/64 garbage",
     126                 :            :                 "1:2:3:4::8/64#garbage",
     127                 :            :                 "1:2:3:4::8/64\0garbage",
     128                 :            :                 "1:2:3:4::8/64\rgarbage",
     129                 :            :                 "1:2:3:4::8/64\ngarbage",
     130                 :            :                 "1:2:3:4::8/64\tgarbage",
     131                 :            : };
     132                 :            : #define IPv6_GARBAGE_PREFIX 64
     133                 :            : 
     134                 :            : const char * ipaddr_invalid_strs[] = {
     135                 :            :                 /** IPv4 **/
     136                 :            : 
     137                 :            :                 /* invalid numbers */
     138                 :            :                 "0.0.0.-1",
     139                 :            :                 "0.0.-1.0",
     140                 :            :                 "0.-1.0.0",
     141                 :            :                 "-1.0.0.0",
     142                 :            :                 "0.0.0.-1/24",
     143                 :            :                 "256.123.123.123",
     144                 :            :                 "255.256.123.123",
     145                 :            :                 "255.255.256.123",
     146                 :            :                 "255.255.255.256",
     147                 :            :                 "256.123.123.123/24",
     148                 :            :                 "255.256.123.123/24",
     149                 :            :                 "255.255.256.123/24",
     150                 :            :                 "255.255.255.256/24",
     151                 :            :                 /* invalid network mask */
     152                 :            :                 "1.2.3.4/33",
     153                 :            :                 "1.2.3.4/33231313",
     154                 :            :                 "1.2.3.4/-1",
     155                 :            :                 "1.2.3.4/24/33",
     156                 :            :                 "1.2.3.4/24/-1",
     157                 :            :                 "1.2.3.4/24/",
     158                 :            :                 /* wrong format */
     159                 :            :                 "1/24"
     160                 :            :                 "/24"
     161                 :            :                 "123.123.123",
     162                 :            :                 "123.123.123.",
     163                 :            :                 "123.123.123.123.",
     164                 :            :                 "123.123.123..123",
     165                 :            :                 "123.123.123.123.123",
     166                 :            :                 ".123.123.123",
     167                 :            :                 ".123.123.123.123",
     168                 :            :                 "123.123.123/24",
     169                 :            :                 "123.123.123./24",
     170                 :            :                 "123.123.123.123./24",
     171                 :            :                 "123.123.123..123/24",
     172                 :            :                 "123.123.123.123.123/24",
     173                 :            :                 ".123.123.123/24",
     174                 :            :                 ".123.123.123.123/24",
     175                 :            :                 /* invalid characters */
     176                 :            :                 "123.123.123.12F",
     177                 :            :                 "123.123.12F.123",
     178                 :            :                 "123.12F.123.123",
     179                 :            :                 "12F.123.123.123",
     180                 :            :                 "12J.123.123.123",
     181                 :            :                 "123,123,123,123",
     182                 :            :                 "123!123!123!12F",
     183                 :            :                 "123.123.123.123/4F",
     184                 :            : 
     185                 :            :                 /** IPv6 **/
     186                 :            : 
     187                 :            :                 /* wrong format */
     188                 :            :                 "::fffff",
     189                 :            :                 "ffff:",
     190                 :            :                 "1:2:3:4:5:6:7:192.168.1.1",
     191                 :            :                 "1234:192.168.1.1:ffff::",
     192                 :            :                 "1:2:3:4:5:6:7:890ab",
     193                 :            :                 "1:2:3:4:5:6:7890a:b",
     194                 :            :                 "1:2:3:4:5:67890:a:b",
     195                 :            :                 "1:2:3:4:56789:0:a:b",
     196                 :            :                 "1:2:3:45678:9:0:a:b",
     197                 :            :                 "1:2:34567:8:9:0:a:b",
     198                 :            :                 "1:23456:7:8:9:0:a:b",
     199                 :            :                 "12345:6:7:8:9:0:a:b",
     200                 :            :                 "1:::2",
     201                 :            :                 "1::::2",
     202                 :            :                 "::fffff/64",
     203                 :            :                 "1::2::3",
     204                 :            :                 "1::2::3/64",
     205                 :            :                 ":1:2",
     206                 :            :                 ":1:2/64",
     207                 :            :                 ":1::2",
     208                 :            :                 ":1::2/64",
     209                 :            :                 "1::2:3:4:5:6:7:8/64",
     210                 :            : 
     211                 :            :                 /* invalid network mask */
     212                 :            :                 "1:2:3:4:5:6:7:8/129",
     213                 :            :                 "1:2:3:4:5:6:7:8/-1",
     214                 :            : 
     215                 :            :                 /* invalid characters */
     216                 :            :                 "a:b:c:d:e:f:g::",
     217                 :            : 
     218                 :            :                 /** misc **/
     219                 :            : 
     220                 :            :                 /* too long */
     221                 :            :                 "1234:1234:1234:1234:1234:1234:1234:1234:1234:1234:1234",
     222                 :            :                 "random invalid text",
     223                 :            :                 "",
     224                 :            :                 "\0",
     225                 :            :                 " ",
     226                 :            : };
     227                 :            : 
     228                 :            : static void
     229                 :          0 : dump_addr(cmdline_ipaddr_t addr)
     230                 :            : {
     231      [ #  #  # ]:          0 :         switch (addr.family) {
     232                 :          0 :         case AF_INET:
     233                 :            :         {
     234                 :          0 :                 printf(NIPQUAD_FMT " prefixlen=%u\n",
     235                 :            :                                 NIPQUAD(addr.addr.ipv4.s_addr), addr.prefixlen);
     236                 :            :                 break;
     237                 :            :         }
     238                 :          0 :         case AF_INET6:
     239                 :            :         {
     240                 :          0 :                 printf(RTE_IPV6_ADDR_FMT " prefixlen=%u\n",
     241                 :          0 :                                 RTE_IPV6_ADDR_SPLIT(&addr.addr.ipv6), addr.prefixlen);
     242                 :            :                 break;
     243                 :            :         }
     244                 :            :         default:
     245                 :            :                 printf("Can't dump: unknown address family.\n");
     246                 :            :                 return;
     247                 :            :         }
     248                 :            : }
     249                 :            : 
     250                 :            : 
     251                 :            : static int
     252                 :         32 : is_addr_different(cmdline_ipaddr_t addr1, cmdline_ipaddr_t addr2)
     253                 :            : {
     254         [ +  - ]:         32 :         if (addr1.family != addr2.family)
     255                 :            :                 return 1;
     256                 :            : 
     257         [ +  - ]:         32 :         if (addr1.prefixlen != addr2.prefixlen)
     258                 :            :                 return 1;
     259                 :            : 
     260      [ +  +  - ]:         32 :         switch (addr1.family) {
     261                 :            :         /* IPv4 */
     262                 :         10 :         case AF_INET:
     263         [ -  + ]:         10 :                 if (memcmp(&addr1.addr.ipv4, &addr2.addr.ipv4,
     264                 :            :                                 sizeof(struct in_addr)) != 0)
     265                 :          0 :                         return 1;
     266                 :            :                 break;
     267                 :            :         /* IPv6 */
     268                 :            :         case AF_INET6:
     269                 :            :         {
     270         [ -  + ]:         22 :                 if (!rte_ipv6_addr_eq(&addr1.addr.ipv6, &addr2.addr.ipv6))
     271                 :          0 :                         return 1;
     272                 :            :                 break;
     273                 :            :         }
     274                 :            :         /* thing that should not be */
     275                 :            :         default:
     276                 :            :                 return -1;
     277                 :            :         }
     278                 :            :         return 0;
     279                 :            : }
     280                 :            : 
     281                 :            : static int
     282                 :            : can_parse_addr(unsigned addr_flags, unsigned test_flags)
     283                 :            : {
     284                 :        240 :         if ((test_flags & addr_flags) == addr_flags) {
     285                 :            :                 /* if we are not trying to parse network addresses */
     286   [ +  +  +  +  :         90 :                 if (test_flags < CMDLINE_IPADDR_NETWORK)
                   +  + ]
     287                 :            :                         return 1;
     288                 :            :                 /* if this is a network address */
     289         [ +  + ]:         32 :                 else if (addr_flags & CMDLINE_IPADDR_NETWORK)
     290                 :         22 :                         return 1;
     291                 :            :         }
     292                 :            :         return 0;
     293                 :            : }
     294                 :            : 
     295                 :            : int
     296                 :          1 : test_parse_ipaddr_valid(void)
     297                 :            : {
     298                 :            :         cmdline_parse_token_ipaddr_t token;
     299                 :            :         char buf[CMDLINE_TEST_BUFSIZE];
     300                 :            :         cmdline_ipaddr_t result;
     301                 :            :         unsigned i;
     302                 :            :         uint8_t flags;
     303                 :            :         int ret;
     304                 :            : 
     305                 :            :         /* cover all cases in help */
     306         [ +  + ]:          8 :         for (flags = 0x1; flags < 0x8; flags++) {
     307                 :          7 :                 token.ipaddr_data.flags = flags;
     308                 :            : 
     309                 :            :                 memset(buf, 0, sizeof(buf));
     310                 :            : 
     311         [ -  + ]:          7 :                 if (cmdline_get_help_ipaddr((cmdline_parse_token_hdr_t*)&token,
     312                 :            :                                 buf, sizeof(buf)) == -1) {
     313                 :            :                         printf("Error: help rejected valid parameters!\n");
     314                 :          0 :                         return -1;
     315                 :            :                 }
     316                 :            :         }
     317                 :            : 
     318                 :            :         /* test valid strings */
     319         [ +  + ]:         17 :         for (i = 0; i < RTE_DIM(ipaddr_valid_strs); i++) {
     320                 :            : 
     321                 :            :                 /* test each valid string against different flags */
     322         [ +  + ]:        128 :                 for (flags = 1; flags < 0x8; flags++) {
     323                 :            : 
     324                 :            :                         /* skip bad flag */
     325         [ +  + ]:        112 :                         if (flags == CMDLINE_IPADDR_NETWORK)
     326                 :         16 :                                 continue;
     327                 :            : 
     328                 :            :                         /* clear out everything */
     329                 :            :                         memset(buf, 0, sizeof(buf));
     330                 :            :                         memset(&result, 0, sizeof(result));
     331                 :            :                         memset(&token, 0, sizeof(token));
     332                 :            : 
     333                 :         96 :                         token.ipaddr_data.flags = flags;
     334                 :            : 
     335                 :         96 :                         cmdline_get_help_ipaddr((cmdline_parse_token_hdr_t*)&token,
     336                 :            :                                                         buf, sizeof(buf));
     337                 :            : 
     338                 :         96 :                         ret = cmdline_parse_ipaddr((cmdline_parse_token_hdr_t*)&token,
     339                 :         96 :                                 ipaddr_valid_strs[i].str, (void*)&result,
     340                 :            :                                 sizeof(result));
     341                 :            : 
     342                 :            :                         /* if should have passed, or should have failed */
     343         [ -  + ]:         96 :                         if ((ret < 0) ==
     344         [ +  + ]:         96 :                                         (can_parse_addr(ipaddr_valid_strs[i].flags, flags))) {
     345                 :            :                                 printf("Error: unexpected behavior when parsing %s as %s!\n",
     346                 :            :                                                 ipaddr_valid_strs[i].str, buf);
     347                 :            :                                 printf("Parsed result: ");
     348                 :          0 :                                 dump_addr(result);
     349                 :            :                                 printf("Expected result: ");
     350                 :          0 :                                 dump_addr(ipaddr_valid_strs[i].addr);
     351                 :          0 :                                 return -1;
     352                 :            :                         }
     353         [ +  + ]:         96 :                         if (ret != -1 &&
     354         [ -  + ]:         32 :                                         is_addr_different(result, ipaddr_valid_strs[i].addr)) {
     355                 :            :                                 printf("Error: result mismatch when parsing %s as %s!\n",
     356                 :            :                                                 ipaddr_valid_strs[i].str, buf);
     357                 :            :                                 printf("Parsed result: ");
     358                 :          0 :                                 dump_addr(result);
     359                 :            :                                 printf("Expected result: ");
     360                 :          0 :                                 dump_addr(ipaddr_valid_strs[i].addr);
     361                 :          0 :                                 return -1;
     362                 :            :                         }
     363                 :            :                 }
     364                 :            :         }
     365                 :            : 
     366                 :            :         /* test garbage ipv4 address strings */
     367         [ +  + ]:          7 :         for (i = 0; i < RTE_DIM(ipaddr_garbage_addr4_strs); i++) {
     368                 :            : 
     369                 :          6 :                 struct in_addr tmp = IPv4_GARBAGE_ADDR;
     370                 :            : 
     371                 :            :                 /* test each valid string against different flags */
     372         [ +  + ]:         48 :                 for (flags = 1; flags < 0x8; flags++) {
     373                 :            : 
     374                 :            :                         /* skip bad flag */
     375         [ +  + ]:         42 :                         if (flags == CMDLINE_IPADDR_NETWORK)
     376                 :          6 :                                 continue;
     377                 :            : 
     378                 :            :                         /* clear out everything */
     379                 :            :                         memset(buf, 0, sizeof(buf));
     380                 :            :                         memset(&result, 0, sizeof(result));
     381                 :            :                         memset(&token, 0, sizeof(token));
     382                 :            : 
     383                 :         36 :                         token.ipaddr_data.flags = flags;
     384                 :            : 
     385                 :         36 :                         cmdline_get_help_ipaddr((cmdline_parse_token_hdr_t*)&token,
     386                 :            :                                                         buf, sizeof(buf));
     387                 :            : 
     388                 :         36 :                         ret = cmdline_parse_ipaddr((cmdline_parse_token_hdr_t*)&token,
     389                 :            :                                 ipaddr_garbage_addr4_strs[i], (void*)&result,
     390                 :            :                                 sizeof(result));
     391                 :            : 
     392                 :            :                         /* if should have passed, or should have failed */
     393   [ +  +  -  + ]:         60 :                         if ((ret < 0) ==
     394                 :            :                                         (can_parse_addr(CMDLINE_IPADDR_V4, flags))) {
     395                 :          0 :                                 printf("Error: unexpected behavior when parsing %s as %s!\n",
     396                 :            :                                                 ipaddr_garbage_addr4_strs[i], buf);
     397                 :          0 :                                 return -1;
     398                 :            :                         }
     399         [ +  + ]:         36 :                         if (ret != -1 &&
     400         [ -  + ]:         12 :                                         memcmp(&result.addr.ipv4, &tmp, sizeof(tmp))) {
     401                 :          0 :                                 printf("Error: result mismatch when parsing %s as %s!\n",
     402                 :            :                                                 ipaddr_garbage_addr4_strs[i], buf);
     403                 :          0 :                                 return -1;
     404                 :            :                         }
     405                 :            :                 }
     406                 :            :         }
     407                 :            : 
     408                 :            :         /* test garbage ipv6 address strings */
     409         [ +  + ]:          7 :         for (i = 0; i < RTE_DIM(ipaddr_garbage_addr6_strs); i++) {
     410                 :            : 
     411                 :          6 :                 cmdline_ipaddr_t tmp = {.addr = IPv6_GARBAGE_ADDR};
     412                 :            : 
     413                 :            :                 /* test each valid string against different flags */
     414         [ +  + ]:         48 :                 for (flags = 1; flags < 0x8; flags++) {
     415                 :            : 
     416                 :            :                         /* skip bad flag */
     417         [ +  + ]:         42 :                         if (flags == CMDLINE_IPADDR_NETWORK)
     418                 :          6 :                                 continue;
     419                 :            : 
     420                 :            :                         /* clear out everything */
     421                 :            :                         memset(buf, 0, sizeof(buf));
     422                 :            :                         memset(&result, 0, sizeof(result));
     423                 :            :                         memset(&token, 0, sizeof(token));
     424                 :            : 
     425                 :         36 :                         token.ipaddr_data.flags = flags;
     426                 :            : 
     427                 :         36 :                         cmdline_get_help_ipaddr((cmdline_parse_token_hdr_t*)&token,
     428                 :            :                                                         buf, sizeof(buf));
     429                 :            : 
     430                 :         36 :                         ret = cmdline_parse_ipaddr((cmdline_parse_token_hdr_t*)&token,
     431                 :            :                                 ipaddr_garbage_addr6_strs[i], (void*)&result,
     432                 :            :                                 sizeof(result));
     433                 :            : 
     434                 :            :                         /* if should have passed, or should have failed */
     435   [ +  +  -  + ]:         60 :                         if ((ret < 0) ==
     436                 :            :                                         (can_parse_addr(CMDLINE_IPADDR_V6, flags))) {
     437                 :          0 :                                 printf("Error: unexpected behavior when parsing %s as %s!\n",
     438                 :            :                                                 ipaddr_garbage_addr6_strs[i], buf);
     439                 :          0 :                                 return -1;
     440                 :            :                         }
     441   [ +  +  -  + ]:         36 :                         if (ret != -1 &&
     442                 :            :                                         !rte_ipv6_addr_eq(&result.addr.ipv6, &tmp.addr.ipv6)) {
     443                 :          0 :                                 printf("Error: result mismatch when parsing %s as %s!\n",
     444                 :            :                                                 ipaddr_garbage_addr6_strs[i], buf);
     445                 :          0 :                                 return -1;
     446                 :            :                         }
     447                 :            :                 }
     448                 :            :         }
     449                 :            : 
     450                 :            : 
     451                 :            :         /* test garbage ipv4 network strings */
     452         [ +  + ]:          7 :         for (i = 0; i < RTE_DIM(ipaddr_garbage_network4_strs); i++) {
     453                 :            : 
     454                 :          6 :                 struct in_addr tmp = IPv4_GARBAGE_ADDR;
     455                 :            : 
     456                 :            :                 /* test each valid string against different flags */
     457         [ +  + ]:         48 :                 for (flags = 1; flags < 0x8; flags++) {
     458                 :            : 
     459                 :            :                         /* skip bad flag */
     460         [ +  + ]:         42 :                         if (flags == CMDLINE_IPADDR_NETWORK)
     461                 :          6 :                                 continue;
     462                 :            : 
     463                 :            :                         /* clear out everything */
     464                 :            :                         memset(buf, 0, sizeof(buf));
     465                 :            :                         memset(&result, 0, sizeof(result));
     466                 :            :                         memset(&token, 0, sizeof(token));
     467                 :            : 
     468                 :         36 :                         token.ipaddr_data.flags = flags;
     469                 :            : 
     470                 :         36 :                         cmdline_get_help_ipaddr((cmdline_parse_token_hdr_t*)&token,
     471                 :            :                                                         buf, sizeof(buf));
     472                 :            : 
     473                 :         36 :                         ret = cmdline_parse_ipaddr((cmdline_parse_token_hdr_t*)&token,
     474                 :            :                                 ipaddr_garbage_network4_strs[i], (void*)&result,
     475                 :            :                                 sizeof(result));
     476                 :            : 
     477                 :            :                         /* if should have passed, or should have failed */
     478   [ +  +  -  + ]:         48 :                         if ((ret < 0) ==
     479                 :            :                                         (can_parse_addr(CMDLINE_IPADDR_V4 | CMDLINE_IPADDR_NETWORK, flags))) {
     480                 :          0 :                                 printf("Error: unexpected behavior when parsing %s as %s!\n",
     481                 :            :                                                 ipaddr_garbage_network4_strs[i], buf);
     482                 :          0 :                                 return -1;
     483                 :            :                         }
     484         [ +  + ]:         36 :                         if (ret != -1 &&
     485         [ -  + ]:         12 :                                         memcmp(&result.addr.ipv4, &tmp, sizeof(tmp))) {
     486                 :          0 :                                 printf("Error: result mismatch when parsing %s as %s!\n",
     487                 :            :                                                 ipaddr_garbage_network4_strs[i], buf);
     488                 :          0 :                                 return -1;
     489                 :            :                         }
     490                 :            :                 }
     491                 :            :         }
     492                 :            : 
     493                 :            :         /* test garbage ipv6 address strings */
     494         [ +  + ]:          7 :         for (i = 0; i < RTE_DIM(ipaddr_garbage_network6_strs); i++) {
     495                 :            : 
     496                 :          6 :                 cmdline_ipaddr_t tmp = {.addr = IPv6_GARBAGE_ADDR};
     497                 :            : 
     498                 :            :                 /* test each valid string against different flags */
     499         [ +  + ]:         48 :                 for (flags = 1; flags < 0x8; flags++) {
     500                 :            : 
     501                 :            :                         /* skip bad flag */
     502         [ +  + ]:         42 :                         if (flags == CMDLINE_IPADDR_NETWORK)
     503                 :          6 :                                 continue;
     504                 :            : 
     505                 :            :                         /* clear out everything */
     506                 :            :                         memset(buf, 0, sizeof(buf));
     507                 :            :                         memset(&result, 0, sizeof(result));
     508                 :            :                         memset(&token, 0, sizeof(token));
     509                 :            : 
     510                 :         36 :                         token.ipaddr_data.flags = flags;
     511                 :            : 
     512                 :         36 :                         cmdline_get_help_ipaddr((cmdline_parse_token_hdr_t*)&token,
     513                 :            :                                                         buf, sizeof(buf));
     514                 :            : 
     515                 :         36 :                         ret = cmdline_parse_ipaddr((cmdline_parse_token_hdr_t*)&token,
     516                 :            :                                 ipaddr_garbage_network6_strs[i], (void*)&result,
     517                 :            :                                 sizeof(result));
     518                 :            : 
     519                 :            :                         /* if should have passed, or should have failed */
     520   [ +  +  -  + ]:         48 :                         if ((ret < 0) ==
     521                 :            :                                         (can_parse_addr(CMDLINE_IPADDR_V6 | CMDLINE_IPADDR_NETWORK, flags))) {
     522                 :          0 :                                 printf("Error: unexpected behavior when parsing %s as %s!\n",
     523                 :            :                                                 ipaddr_garbage_network6_strs[i], buf);
     524                 :          0 :                                 return -1;
     525                 :            :                         }
     526   [ +  +  -  + ]:         36 :                         if (ret != -1 &&
     527                 :            :                                         !rte_ipv6_addr_eq(&result.addr.ipv6, &tmp.addr.ipv6)) {
     528                 :          0 :                                 printf("Error: result mismatch when parsing %s as %s!\n",
     529                 :            :                                                 ipaddr_garbage_network6_strs[i], buf);
     530                 :          0 :                                 return -1;
     531                 :            :                         }
     532                 :            :                 }
     533                 :            :         }
     534                 :            : 
     535                 :            :         return 0;
     536                 :            : }
     537                 :            : 
     538                 :            : int
     539                 :          1 : test_parse_ipaddr_invalid_data(void)
     540                 :            : {
     541                 :            :         cmdline_parse_token_ipaddr_t token;
     542                 :            :         char buf[CMDLINE_TEST_BUFSIZE];
     543                 :            :         cmdline_ipaddr_t result;
     544                 :            :         unsigned i;
     545                 :            :         uint8_t flags;
     546                 :            :         int ret;
     547                 :            : 
     548                 :            :         memset(&result, 0, sizeof(result));
     549                 :            : 
     550                 :            :         /* test invalid strings */
     551         [ +  + ]:         72 :         for (i = 0; i < RTE_DIM(ipaddr_invalid_strs); i++) {
     552                 :            : 
     553                 :            :                 /* test each valid string against different flags */
     554         [ +  + ]:        568 :                 for (flags = 1; flags < 0x8; flags++) {
     555                 :            : 
     556                 :            :                         /* skip bad flag */
     557         [ +  + ]:        497 :                         if (flags == CMDLINE_IPADDR_NETWORK)
     558                 :         71 :                                 continue;
     559                 :            : 
     560                 :            :                         /* clear out everything */
     561                 :            :                         memset(buf, 0, sizeof(buf));
     562                 :            :                         memset(&token, 0, sizeof(token));
     563                 :            : 
     564                 :        426 :                         token.ipaddr_data.flags = flags;
     565                 :            : 
     566                 :        426 :                         cmdline_get_help_ipaddr((cmdline_parse_token_hdr_t*)&token,
     567                 :            :                                         buf, sizeof(buf));
     568                 :            : 
     569                 :        426 :                         ret = cmdline_parse_ipaddr((cmdline_parse_token_hdr_t*)&token,
     570                 :            :                                 ipaddr_invalid_strs[i], (void*)&result,
     571                 :            :                                 sizeof(result));
     572                 :            : 
     573         [ -  + ]:        426 :                         if (ret != -1) {
     574                 :          0 :                                 printf("Error: parsing %s as %s succeeded!\n",
     575                 :            :                                                 ipaddr_invalid_strs[i], buf);
     576                 :            :                                 printf("Parsed result: ");
     577                 :          0 :                                 dump_addr(result);
     578                 :          0 :                                 return -1;
     579                 :            :                         }
     580                 :            :                 }
     581                 :            :         }
     582                 :            : 
     583                 :            :         return 0;
     584                 :            : }
     585                 :            : 
     586                 :            : int
     587                 :          1 : test_parse_ipaddr_invalid_param(void)
     588                 :            : {
     589                 :            :         cmdline_parse_token_ipaddr_t token;
     590                 :            :         char buf[CMDLINE_TEST_BUFSIZE];
     591                 :            :         cmdline_ipaddr_t result;
     592                 :            : 
     593                 :            :         snprintf(buf, sizeof(buf), "1.2.3.4");
     594                 :          1 :         token.ipaddr_data.flags = CMDLINE_IPADDR_V4;
     595                 :            : 
     596                 :            :         /* null token */
     597         [ -  + ]:          1 :         if (cmdline_parse_ipaddr(NULL, buf, (void*)&result,
     598                 :            :                         sizeof(result)) != -1) {
     599                 :            :                 printf("Error: parser accepted invalid parameters!\n");
     600                 :          0 :                 return -1;
     601                 :            :         }
     602                 :            :         /* null buffer */
     603         [ -  + ]:          1 :         if (cmdline_parse_ipaddr((cmdline_parse_token_hdr_t*)&token,
     604                 :            :                         NULL, (void*)&result, sizeof(result)) != -1) {
     605                 :            :                 printf("Error: parser accepted invalid parameters!\n");
     606                 :          0 :                 return -1;
     607                 :            :         }
     608                 :            :         /* empty buffer */
     609         [ -  + ]:          1 :         if (cmdline_parse_ipaddr((cmdline_parse_token_hdr_t*)&token,
     610                 :            :                         "", (void*)&result, sizeof(result)) != -1) {
     611                 :            :                 printf("Error: parser accepted invalid parameters!\n");
     612                 :          0 :                 return -1;
     613                 :            :         }
     614                 :            :         /* null result */
     615         [ -  + ]:          1 :         if (cmdline_parse_ipaddr((cmdline_parse_token_hdr_t*)&token,
     616                 :            :                         buf, NULL, 0) == -1) {
     617                 :            :                 printf("Error: parser rejected null result!\n");
     618                 :          0 :                 return -1;
     619                 :            :         }
     620                 :            : 
     621                 :            :         /* null token */
     622         [ -  + ]:          1 :         if (cmdline_get_help_ipaddr(NULL, buf, 0) != -1) {
     623                 :            :                 printf("Error: help accepted invalid parameters!\n");
     624                 :          0 :                 return -1;
     625                 :            :         }
     626                 :            :         /* null buffer */
     627         [ -  + ]:          1 :         if (cmdline_get_help_ipaddr((cmdline_parse_token_hdr_t*)&token,
     628                 :            :                         NULL, 0) != -1) {
     629                 :            :                 printf("Error: help accepted invalid parameters!\n");
     630                 :          0 :                 return -1;
     631                 :            :         }
     632                 :            :         return 0;
     633                 :            : }

Generated by: LCOV version 1.14