LCOV - code coverage report
Current view: top level - root/contrail/vrouter/utils/vtest - vt_gen_lib.c (source / functions) Hit Total Coverage
Test: OpenSDN C/C++ coverage (all TARGET_SET jobs) Lines: 27 177 15.3 %
Date: 2026-11-09 02:10:49 Functions: 3 15 20.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * vt_gen_lib.c --
       3             :  *
       4             :  * Copyright(c) 2015, Juniper Networks, Inc.
       5             :  * Copyright Contributors to the OpenSDN project
       6             :  * All rights reserved
       7             :  */
       8             : #include <stdio.h>
       9             : #include <string.h>
      10             : #include <inttypes.h>
      11             : #include <stdlib.h>
      12             : #include <stdbool.h>
      13             : #include <errno.h>
      14             : #include <ctype.h>
      15             : #include <strings.h>
      16             : 
      17             : #include <vr_types.h>
      18             : #include <vt_gen_lib.h>
      19             : 
      20             : unsigned char *
      21           0 : vt_gen_skip_space(unsigned char *string)
      22             : {
      23           0 :     unsigned int i = 0, len;
      24             : 
      25           0 :     if (!string)
      26           0 :         return string;
      27             : 
      28           0 :     len = strlen(string);
      29           0 :     if (!len)
      30           0 :         return string;
      31             : 
      32           0 :     while ((i < len) && isspace(string[i])) {
      33           0 :         i++;
      34             :     }
      35             : 
      36           0 :     if (i == len)
      37           0 :         return NULL;
      38             : 
      39           0 :     return &string[i];
      40             : }
      41             : 
      42             : unsigned char *
      43           0 : vt_gen_skip_char(unsigned char *string, unsigned char c)
      44             : {
      45           0 :     unsigned int i = 0, len;
      46             : 
      47           0 :     if (!string)
      48           0 :         return string;
      49             : 
      50           0 :     len = strlen(string);
      51           0 :     if (!len)
      52           0 :         return string;
      53             : 
      54           0 :     while ((i < len) && string[i] == c) {
      55           0 :         i++;
      56             :     }
      57             : 
      58           0 :     if (i == len)
      59           0 :         return NULL;
      60             : 
      61           0 :     return &string[i];
      62             : }
      63             : 
      64             : unsigned char *
      65           0 : vt_gen_reach_char(unsigned char *string, unsigned char c)
      66             : {
      67           0 :     unsigned int i = 0, len;
      68             : 
      69           0 :     if (!string)
      70           0 :         return string;
      71             : 
      72           0 :     len = strlen(string);
      73           0 :     if (!len)
      74           0 :         return string;
      75             : 
      76           0 :     while ((i < len) && (string[i] != c)) {
      77           0 :         i++;
      78             :     }
      79             : 
      80           0 :     return &string[i];
      81             : }
      82             : 
      83             : unsigned char *
      84           0 : vt_gen_reach_space(unsigned char *string)
      85             : {
      86           0 :     return vt_gen_reach_char(string, ' ');
      87             : }
      88             : 
      89             : bool
      90           0 : vt_gen_byte_compare(uint8_t one, uint8_t two)
      91             : {
      92           0 :     return one == two;
      93             : }
      94             : 
      95             : bool
      96           0 : vt_gen_short_compare(uint16_t one, uint16_t two)
      97             : {
      98           0 :     return one == two;
      99             : }
     100             : 
     101             : bool
     102           0 : vt_gen_int_compare(unsigned int one, unsigned int two)
     103             : {
     104           0 :     return one == two;
     105             : }
     106             : 
     107             : bool
     108           0 : vt_gen_int64_compare(uint64_t one, uint64_t two)
     109             : {
     110           0 :     return one == two;
     111             : }
     112             : 
     113             : bool
     114           0 : vt_gen_flow_op_compare(int op, unsigned char *string)
     115             : {
     116           0 :     int expected_op = 0;
     117             : 
     118           0 :     if (!string)
     119           0 :         return -1;
     120             : 
     121           0 :     if (!strncasecmp(string, "flow_set", strlen("flow_set")) ||
     122           0 :         !strncasecmp(string, "0", strlen("0"))) {
     123           0 :         expected_op = FLOW_OP_FLOW_SET;
     124           0 :     } else if (!strncasecmp(string, "flow_table_get",
     125           0 :                 strlen("flow_table_get"))  ||
     126           0 :                !strncasecmp(string, "2", strlen("2"))) {
     127           0 :         expected_op = FLOW_OP_FLOW_TABLE_GET;
     128             :     }
     129             : 
     130           0 :     return op == expected_op;
     131             : }
     132             : 
     133             : int
     134         322 : vt_gen_flow_op(unsigned char *string)
     135             : {
     136         322 :     if (!string)
     137           0 :         return -1;
     138             : 
     139         322 :     if (!strncasecmp(string, "flow_set", strlen("flow_set")) ||
     140         322 :         !strncasecmp(string, "0", strlen("0"))) {
     141         322 :         return FLOW_OP_FLOW_SET;
     142           0 :     } else if (!strncasecmp(string, "flow_table_get",
     143           0 :                 strlen("flow_table_get")) ||
     144           0 :                !strncasecmp(string, "2", strlen("2"))) {
     145           0 :         return FLOW_OP_FLOW_TABLE_GET;
     146             :     }
     147             : 
     148           0 :     return -1;
     149             : }
     150             : 
     151             : bool
     152           0 : vt_gen_op_compare(int op, unsigned char *string)
     153             : {
     154           0 :     int expected_op = 0;
     155             : 
     156           0 :     if (!strncasecmp(string, "Add", strlen("Add"))) {
     157           0 :         expected_op = SANDESH_OP_ADD;
     158           0 :     } else if (!strncasecmp(string, "Get", strlen("Get"))) {
     159           0 :         expected_op = SANDESH_OP_GET;
     160           0 :     } else if (!strncasecmp(string, "Delete", strlen("Delete"))) {
     161           0 :         expected_op = SANDESH_OP_DEL;
     162           0 :     } else if (!strncasecmp(string, "Dump", strlen("Dump"))) {
     163           0 :         expected_op = SANDESH_OP_DUMP;
     164           0 :     } else if (!strncasecmp(string, "Reset", strlen("Reset"))) {
     165           0 :         expected_op = SANDESH_OP_RESET;
     166             :     }
     167             : 
     168           0 :     return op == expected_op;
     169             : }
     170             : 
     171             : int
     172        2472 : vt_gen_op(unsigned char *string)
     173             : {
     174        2472 :     if (!string)
     175           0 :         return -1;
     176             : 
     177        2472 :     if (!strncasecmp(string, "Add", strlen("Add")) ||
     178        2472 :         !strncasecmp(string, "0", strlen("0"))) {
     179         863 :         return SANDESH_OP_ADD;
     180        1609 :     } else if (!strncasecmp(string, "Get", strlen("Get")) ||
     181        1609 :                !strncasecmp(string, "1", strlen("1"))) {
     182         483 :         return SANDESH_OP_GET;
     183        1126 :     } else if (!strncasecmp(string, "Delete", strlen("Delete")) ||
     184        1126 :                !strncasecmp(string, "2", strlen("2"))) {
     185        1122 :         return SANDESH_OP_DEL;
     186           4 :     } else if (!strncasecmp(string, "Dump", strlen("Dump")) ||
     187           4 :                !strncasecmp(string, "3", strlen("3"))) {
     188           0 :         return SANDESH_OP_DUMP;
     189           4 :     } else if (!strncasecmp(string, "Reset", strlen("Reset")) ||
     190           4 :                !strncasecmp(string, "5", strlen("5"))) {
     191           4 :         return SANDESH_OP_RESET;
     192             :     }
     193             : 
     194           0 :     return -1;
     195             : }
     196             : 
     197             : 
     198             : /*TODO 
     199             :  *
     200             :  * Create a generic function -> delimiter and base
     201             :  * */
     202             : 
     203             : void *
     204           0 : vt_gen_list(unsigned char *list, unsigned int type, unsigned int *list_size)
     205             : {
     206           0 :     unsigned int i = 0, j = 0, type_size;
     207             :     unsigned int string_size;
     208           0 :     unsigned char *local_list = list;
     209             :     unsigned char *end;
     210             :     char *tmp;
     211           0 :     char *is_colon = NULL;
     212             : 
     213             :     unsigned char *store;
     214             :     uint8_t  *store_b;
     215             :     uint16_t *store_i16;
     216             :     uint32_t *store_i32;
     217             :     uint64_t *store_i64;
     218             : 
     219           0 :     *list_size = 0;
     220           0 :     if (!list)
     221           0 :         return NULL;
     222             : 
     223           0 :     switch (type) {
     224           0 :         case GEN_TYPE_U8:
     225           0 :             type_size = 1;
     226           0 :             break;
     227             : 
     228           0 :         case GEN_TYPE_U16:
     229           0 :             type_size = 2;
     230           0 :             break;
     231             : 
     232           0 :         case GEN_TYPE_U32:
     233           0 :             type_size = 4;
     234           0 :             break;
     235             : 
     236           0 :         case GEN_TYPE_U64:
     237           0 :             type_size = 8;
     238           0 :             break;
     239             : 
     240           0 :         default:
     241           0 :             return NULL;
     242             :     }
     243             : 
     244           0 :     string_size = strlen(list);
     245           0 :     end = list + string_size;
     246             : 
     247             : 
     248             : 
     249             :     while (1) {
     250           0 :         local_list = vt_gen_skip_char(local_list, ':');
     251           0 :         if (!strlen(local_list))
     252           0 :             break;
     253             : 
     254           0 :         j++;
     255             : 
     256           0 :         local_list = vt_gen_reach_char(local_list, ':');
     257           0 :         if (!local_list)
     258           0 :             break;
     259             :     }
     260             : 
     261             : 
     262           0 :     store = calloc(j, type_size);
     263           0 :     if (!store)
     264           0 :         return NULL;
     265             : 
     266           0 :     *list_size = type_size * j;
     267             : 
     268           0 :     store_b = (uint8_t *)store;
     269           0 :     store_i16 = (uint16_t *)store;
     270           0 :     store_i32 = (uint32_t *)store;
     271           0 :     store_i64 = (uint64_t *)store;
     272             : 
     273           0 :     local_list = list;
     274           0 :     for (i = 0; i < j; i++) {
     275           0 :         switch (type) {
     276           0 :             case GEN_TYPE_U8:
     277             :                 /*TODO  For now only mac addresses are mapped to base 16*/
     278           0 :                 store_b[i] = strtoul(local_list, &tmp, 16);
     279           0 :                 break;
     280             : 
     281           0 :             case GEN_TYPE_U16:
     282           0 :                 store_i16[i] = strtoul(local_list, &tmp, 0);
     283           0 :                 break;
     284             : 
     285           0 :             case GEN_TYPE_U32:
     286           0 :                 store_i32[i] = strtoul(local_list, &tmp, 0);
     287           0 :                 break;
     288             : 
     289           0 :             case GEN_TYPE_U64:
     290           0 :                 store_i64[i] = strtoul(local_list, &tmp, 0);
     291           0 :                 break;
     292             :         }
     293             : 
     294           0 :         if (errno == ERANGE) {
     295           0 :             free(store);
     296           0 :             return NULL;
     297             :         }
     298             : 
     299           0 :         local_list = tmp;
     300             : 
     301           0 :         local_list = vt_gen_skip_char(local_list, ':');
     302             : 
     303           0 :         if (!local_list)
     304           0 :             break;
     305             :     }
     306             : 
     307           0 :     return store;
     308             : }
     309             : 
     310             : bool
     311           0 : vt_gen_list_compare(void *list, unsigned int list_size,
     312             :         unsigned char *string, unsigned int type)
     313             : {
     314             :     unsigned int buf_size;
     315             :     void *buf;
     316             : 
     317           0 :     buf = vt_gen_list(string, type, &buf_size);
     318           0 :     if (!buf)
     319           0 :         return false;
     320             : 
     321           0 :     if (buf_size != list_size)
     322           0 :         return false;
     323             : 
     324           0 :     if (memcmp(list, buf, list_size))
     325           0 :         return false;
     326             : 
     327           0 :     return true;
     328             : }
     329             : 
     330             : void *
     331         826 : vt_gen_string(char *string)
     332             : {
     333             :     unsigned int string_len;
     334             :     char *store;
     335             : 
     336         826 :     string_len = strlen(string);
     337         826 :     store = malloc(string_len + 1);
     338         826 :     if (!store)
     339           0 :         return NULL;
     340             : 
     341         826 :     strcpy(store, string);
     342             : 
     343         826 :     return store;
     344             : }
     345             : 

Generated by: LCOV version 1.14