1*f8be1786SSlawomir Mrozowicz #include <stdio.h> 2*f8be1786SSlawomir Mrozowicz 3*f8be1786SSlawomir Mrozowicz #include <rte_malloc.h> 4*f8be1786SSlawomir Mrozowicz 5*f8be1786SSlawomir Mrozowicz #include "cperf_options.h" 6*f8be1786SSlawomir Mrozowicz #include "cperf_test_vectors.h" 7*f8be1786SSlawomir Mrozowicz #include "cperf_test_vector_parsing.h" 8*f8be1786SSlawomir Mrozowicz 9*f8be1786SSlawomir Mrozowicz int 10*f8be1786SSlawomir Mrozowicz free_test_vector(struct cperf_test_vector *vector, struct cperf_options *opts) 11*f8be1786SSlawomir Mrozowicz { 12*f8be1786SSlawomir Mrozowicz if (vector == NULL || opts == NULL) 13*f8be1786SSlawomir Mrozowicz return -1; 14*f8be1786SSlawomir Mrozowicz 15*f8be1786SSlawomir Mrozowicz rte_free(vector->iv.data); 16*f8be1786SSlawomir Mrozowicz rte_free(vector->aad.data); 17*f8be1786SSlawomir Mrozowicz rte_free(vector->digest.data); 18*f8be1786SSlawomir Mrozowicz 19*f8be1786SSlawomir Mrozowicz if (opts->test_file != NULL) { 20*f8be1786SSlawomir Mrozowicz rte_free(vector->plaintext.data); 21*f8be1786SSlawomir Mrozowicz rte_free(vector->cipher_key.data); 22*f8be1786SSlawomir Mrozowicz rte_free(vector->auth_key.data); 23*f8be1786SSlawomir Mrozowicz rte_free(vector->ciphertext.data); 24*f8be1786SSlawomir Mrozowicz } 25*f8be1786SSlawomir Mrozowicz 26*f8be1786SSlawomir Mrozowicz rte_free(vector); 27*f8be1786SSlawomir Mrozowicz 28*f8be1786SSlawomir Mrozowicz return 0; 29*f8be1786SSlawomir Mrozowicz } 30*f8be1786SSlawomir Mrozowicz 31*f8be1786SSlawomir Mrozowicz void 32*f8be1786SSlawomir Mrozowicz show_test_vector(struct cperf_test_vector *test_vector) 33*f8be1786SSlawomir Mrozowicz { 34*f8be1786SSlawomir Mrozowicz const uint8_t wrap = 32; 35*f8be1786SSlawomir Mrozowicz uint32_t i; 36*f8be1786SSlawomir Mrozowicz 37*f8be1786SSlawomir Mrozowicz if (test_vector == NULL) 38*f8be1786SSlawomir Mrozowicz return; 39*f8be1786SSlawomir Mrozowicz 40*f8be1786SSlawomir Mrozowicz if (test_vector->plaintext.data) { 41*f8be1786SSlawomir Mrozowicz printf("\nplaintext =\n"); 42*f8be1786SSlawomir Mrozowicz for (i = 0; i < test_vector->plaintext.length; ++i) { 43*f8be1786SSlawomir Mrozowicz if ((i % wrap == 0) && (i != 0)) 44*f8be1786SSlawomir Mrozowicz printf("\n"); 45*f8be1786SSlawomir Mrozowicz if (i == test_vector->plaintext.length - 1) 46*f8be1786SSlawomir Mrozowicz printf("0x%02x", 47*f8be1786SSlawomir Mrozowicz test_vector->plaintext.data[i]); 48*f8be1786SSlawomir Mrozowicz else 49*f8be1786SSlawomir Mrozowicz printf("0x%02x, ", 50*f8be1786SSlawomir Mrozowicz test_vector->plaintext.data[i]); 51*f8be1786SSlawomir Mrozowicz } 52*f8be1786SSlawomir Mrozowicz printf("\n"); 53*f8be1786SSlawomir Mrozowicz } 54*f8be1786SSlawomir Mrozowicz 55*f8be1786SSlawomir Mrozowicz if (test_vector->cipher_key.data) { 56*f8be1786SSlawomir Mrozowicz printf("\ncipher_key =\n"); 57*f8be1786SSlawomir Mrozowicz for (i = 0; i < test_vector->cipher_key.length; ++i) { 58*f8be1786SSlawomir Mrozowicz if ((i % wrap == 0) && (i != 0)) 59*f8be1786SSlawomir Mrozowicz printf("\n"); 60*f8be1786SSlawomir Mrozowicz if (i == (uint32_t)(test_vector->cipher_key.length - 1)) 61*f8be1786SSlawomir Mrozowicz printf("0x%02x", 62*f8be1786SSlawomir Mrozowicz test_vector->cipher_key.data[i]); 63*f8be1786SSlawomir Mrozowicz else 64*f8be1786SSlawomir Mrozowicz printf("0x%02x, ", 65*f8be1786SSlawomir Mrozowicz test_vector->cipher_key.data[i]); 66*f8be1786SSlawomir Mrozowicz } 67*f8be1786SSlawomir Mrozowicz printf("\n"); 68*f8be1786SSlawomir Mrozowicz } 69*f8be1786SSlawomir Mrozowicz 70*f8be1786SSlawomir Mrozowicz if (test_vector->auth_key.data) { 71*f8be1786SSlawomir Mrozowicz printf("\nauth_key =\n"); 72*f8be1786SSlawomir Mrozowicz for (i = 0; i < test_vector->auth_key.length; ++i) { 73*f8be1786SSlawomir Mrozowicz if ((i % wrap == 0) && (i != 0)) 74*f8be1786SSlawomir Mrozowicz printf("\n"); 75*f8be1786SSlawomir Mrozowicz if (i == (uint32_t)(test_vector->auth_key.length - 1)) 76*f8be1786SSlawomir Mrozowicz printf("0x%02x", test_vector->auth_key.data[i]); 77*f8be1786SSlawomir Mrozowicz else 78*f8be1786SSlawomir Mrozowicz printf("0x%02x, ", 79*f8be1786SSlawomir Mrozowicz test_vector->auth_key.data[i]); 80*f8be1786SSlawomir Mrozowicz } 81*f8be1786SSlawomir Mrozowicz printf("\n"); 82*f8be1786SSlawomir Mrozowicz } 83*f8be1786SSlawomir Mrozowicz 84*f8be1786SSlawomir Mrozowicz if (test_vector->iv.data) { 85*f8be1786SSlawomir Mrozowicz printf("\niv =\n"); 86*f8be1786SSlawomir Mrozowicz for (i = 0; i < test_vector->iv.length; ++i) { 87*f8be1786SSlawomir Mrozowicz if ((i % wrap == 0) && (i != 0)) 88*f8be1786SSlawomir Mrozowicz printf("\n"); 89*f8be1786SSlawomir Mrozowicz if (i == (uint32_t)(test_vector->iv.length - 1)) 90*f8be1786SSlawomir Mrozowicz printf("0x%02x", test_vector->iv.data[i]); 91*f8be1786SSlawomir Mrozowicz else 92*f8be1786SSlawomir Mrozowicz printf("0x%02x, ", test_vector->iv.data[i]); 93*f8be1786SSlawomir Mrozowicz } 94*f8be1786SSlawomir Mrozowicz printf("\n"); 95*f8be1786SSlawomir Mrozowicz } 96*f8be1786SSlawomir Mrozowicz 97*f8be1786SSlawomir Mrozowicz if (test_vector->ciphertext.data) { 98*f8be1786SSlawomir Mrozowicz printf("\nciphertext =\n"); 99*f8be1786SSlawomir Mrozowicz for (i = 0; i < test_vector->ciphertext.length; ++i) { 100*f8be1786SSlawomir Mrozowicz if ((i % wrap == 0) && (i != 0)) 101*f8be1786SSlawomir Mrozowicz printf("\n"); 102*f8be1786SSlawomir Mrozowicz if (i == test_vector->ciphertext.length - 1) 103*f8be1786SSlawomir Mrozowicz printf("0x%02x", 104*f8be1786SSlawomir Mrozowicz test_vector->ciphertext.data[i]); 105*f8be1786SSlawomir Mrozowicz else 106*f8be1786SSlawomir Mrozowicz printf("0x%02x, ", 107*f8be1786SSlawomir Mrozowicz test_vector->ciphertext.data[i]); 108*f8be1786SSlawomir Mrozowicz } 109*f8be1786SSlawomir Mrozowicz printf("\n"); 110*f8be1786SSlawomir Mrozowicz } 111*f8be1786SSlawomir Mrozowicz 112*f8be1786SSlawomir Mrozowicz if (test_vector->aad.data) { 113*f8be1786SSlawomir Mrozowicz printf("\naad =\n"); 114*f8be1786SSlawomir Mrozowicz for (i = 0; i < test_vector->aad.length; ++i) { 115*f8be1786SSlawomir Mrozowicz if ((i % wrap == 0) && (i != 0)) 116*f8be1786SSlawomir Mrozowicz printf("\n"); 117*f8be1786SSlawomir Mrozowicz if (i == (uint32_t)(test_vector->aad.length - 1)) 118*f8be1786SSlawomir Mrozowicz printf("0x%02x", test_vector->aad.data[i]); 119*f8be1786SSlawomir Mrozowicz else 120*f8be1786SSlawomir Mrozowicz printf("0x%02x, ", test_vector->aad.data[i]); 121*f8be1786SSlawomir Mrozowicz } 122*f8be1786SSlawomir Mrozowicz printf("\n"); 123*f8be1786SSlawomir Mrozowicz } 124*f8be1786SSlawomir Mrozowicz 125*f8be1786SSlawomir Mrozowicz if (test_vector->digest.data) { 126*f8be1786SSlawomir Mrozowicz printf("\ndigest =\n"); 127*f8be1786SSlawomir Mrozowicz for (i = 0; i < test_vector->digest.length; ++i) { 128*f8be1786SSlawomir Mrozowicz if ((i % wrap == 0) && (i != 0)) 129*f8be1786SSlawomir Mrozowicz printf("\n"); 130*f8be1786SSlawomir Mrozowicz if (i == (uint32_t)(test_vector->digest.length - 1)) 131*f8be1786SSlawomir Mrozowicz printf("0x%02x", test_vector->digest.data[i]); 132*f8be1786SSlawomir Mrozowicz else 133*f8be1786SSlawomir Mrozowicz printf("0x%02x, ", test_vector->digest.data[i]); 134*f8be1786SSlawomir Mrozowicz } 135*f8be1786SSlawomir Mrozowicz printf("\n"); 136*f8be1786SSlawomir Mrozowicz } 137*f8be1786SSlawomir Mrozowicz } 138*f8be1786SSlawomir Mrozowicz 139*f8be1786SSlawomir Mrozowicz /* trim leading and trailing spaces */ 140*f8be1786SSlawomir Mrozowicz static char * 141*f8be1786SSlawomir Mrozowicz trim_space(char *str) 142*f8be1786SSlawomir Mrozowicz { 143*f8be1786SSlawomir Mrozowicz char *start, *end; 144*f8be1786SSlawomir Mrozowicz 145*f8be1786SSlawomir Mrozowicz for (start = str; *start; start++) { 146*f8be1786SSlawomir Mrozowicz if (!isspace((unsigned char) start[0])) 147*f8be1786SSlawomir Mrozowicz break; 148*f8be1786SSlawomir Mrozowicz } 149*f8be1786SSlawomir Mrozowicz 150*f8be1786SSlawomir Mrozowicz for (end = start + strlen(start); end > start + 1; end--) { 151*f8be1786SSlawomir Mrozowicz if (!isspace((unsigned char) end[-1])) 152*f8be1786SSlawomir Mrozowicz break; 153*f8be1786SSlawomir Mrozowicz } 154*f8be1786SSlawomir Mrozowicz 155*f8be1786SSlawomir Mrozowicz *end = 0; 156*f8be1786SSlawomir Mrozowicz 157*f8be1786SSlawomir Mrozowicz /* Shift from "start" to the beginning of the string */ 158*f8be1786SSlawomir Mrozowicz if (start > str) 159*f8be1786SSlawomir Mrozowicz memmove(str, start, (end - start) + 1); 160*f8be1786SSlawomir Mrozowicz 161*f8be1786SSlawomir Mrozowicz return str; 162*f8be1786SSlawomir Mrozowicz } 163*f8be1786SSlawomir Mrozowicz 164*f8be1786SSlawomir Mrozowicz /* tokenization test values separated by a comma */ 165*f8be1786SSlawomir Mrozowicz static int 166*f8be1786SSlawomir Mrozowicz parse_values(char *tokens, uint8_t **data, uint32_t *data_length) 167*f8be1786SSlawomir Mrozowicz { 168*f8be1786SSlawomir Mrozowicz uint32_t n_tokens; 169*f8be1786SSlawomir Mrozowicz uint32_t data_size = 32; 170*f8be1786SSlawomir Mrozowicz 171*f8be1786SSlawomir Mrozowicz uint8_t *values, *values_resized; 172*f8be1786SSlawomir Mrozowicz char *tok, *error = NULL; 173*f8be1786SSlawomir Mrozowicz 174*f8be1786SSlawomir Mrozowicz tok = strtok(tokens, CPERF_VALUE_DELIMITER); 175*f8be1786SSlawomir Mrozowicz if (tok == NULL) 176*f8be1786SSlawomir Mrozowicz return -1; 177*f8be1786SSlawomir Mrozowicz 178*f8be1786SSlawomir Mrozowicz values = (uint8_t *) rte_zmalloc(NULL, sizeof(uint8_t) * data_size, 0); 179*f8be1786SSlawomir Mrozowicz if (values == NULL) 180*f8be1786SSlawomir Mrozowicz return -1; 181*f8be1786SSlawomir Mrozowicz 182*f8be1786SSlawomir Mrozowicz n_tokens = 0; 183*f8be1786SSlawomir Mrozowicz while (tok != NULL) { 184*f8be1786SSlawomir Mrozowicz values_resized = NULL; 185*f8be1786SSlawomir Mrozowicz 186*f8be1786SSlawomir Mrozowicz if (n_tokens >= data_size) { 187*f8be1786SSlawomir Mrozowicz data_size *= 2; 188*f8be1786SSlawomir Mrozowicz 189*f8be1786SSlawomir Mrozowicz values_resized = (uint8_t *) rte_realloc(values, 190*f8be1786SSlawomir Mrozowicz sizeof(uint8_t) * data_size, 0); 191*f8be1786SSlawomir Mrozowicz if (values_resized == NULL) { 192*f8be1786SSlawomir Mrozowicz rte_free(values); 193*f8be1786SSlawomir Mrozowicz return -1; 194*f8be1786SSlawomir Mrozowicz } 195*f8be1786SSlawomir Mrozowicz values = values_resized; 196*f8be1786SSlawomir Mrozowicz } 197*f8be1786SSlawomir Mrozowicz 198*f8be1786SSlawomir Mrozowicz values[n_tokens] = (uint8_t) strtoul(tok, &error, 0); 199*f8be1786SSlawomir Mrozowicz if ((error == NULL) || (*error != '\0')) { 200*f8be1786SSlawomir Mrozowicz printf("Failed with convert '%s'\n", tok); 201*f8be1786SSlawomir Mrozowicz rte_free(values); 202*f8be1786SSlawomir Mrozowicz return -1; 203*f8be1786SSlawomir Mrozowicz } 204*f8be1786SSlawomir Mrozowicz 205*f8be1786SSlawomir Mrozowicz tok = strtok(NULL, CPERF_VALUE_DELIMITER); 206*f8be1786SSlawomir Mrozowicz if (tok == NULL) 207*f8be1786SSlawomir Mrozowicz break; 208*f8be1786SSlawomir Mrozowicz 209*f8be1786SSlawomir Mrozowicz n_tokens++; 210*f8be1786SSlawomir Mrozowicz } 211*f8be1786SSlawomir Mrozowicz 212*f8be1786SSlawomir Mrozowicz values_resized = (uint8_t *) rte_realloc(values, 213*f8be1786SSlawomir Mrozowicz sizeof(uint8_t) * (n_tokens + 1), 0); 214*f8be1786SSlawomir Mrozowicz 215*f8be1786SSlawomir Mrozowicz if (values_resized == NULL) { 216*f8be1786SSlawomir Mrozowicz rte_free(values); 217*f8be1786SSlawomir Mrozowicz return -1; 218*f8be1786SSlawomir Mrozowicz } 219*f8be1786SSlawomir Mrozowicz 220*f8be1786SSlawomir Mrozowicz *data = values_resized; 221*f8be1786SSlawomir Mrozowicz *data_length = n_tokens + 1; 222*f8be1786SSlawomir Mrozowicz 223*f8be1786SSlawomir Mrozowicz return 0; 224*f8be1786SSlawomir Mrozowicz } 225*f8be1786SSlawomir Mrozowicz 226*f8be1786SSlawomir Mrozowicz /* checks the type of key and assigns data */ 227*f8be1786SSlawomir Mrozowicz static int 228*f8be1786SSlawomir Mrozowicz parse_entry(char *entry, struct cperf_test_vector *vector, 229*f8be1786SSlawomir Mrozowicz struct cperf_options *opts, uint8_t tc_found) 230*f8be1786SSlawomir Mrozowicz { 231*f8be1786SSlawomir Mrozowicz int status; 232*f8be1786SSlawomir Mrozowicz uint32_t data_length; 233*f8be1786SSlawomir Mrozowicz 234*f8be1786SSlawomir Mrozowicz uint8_t *data = NULL; 235*f8be1786SSlawomir Mrozowicz char *token, *key_token; 236*f8be1786SSlawomir Mrozowicz 237*f8be1786SSlawomir Mrozowicz /* get key */ 238*f8be1786SSlawomir Mrozowicz token = strtok(entry, CPERF_ENTRY_DELIMITER); 239*f8be1786SSlawomir Mrozowicz key_token = token; 240*f8be1786SSlawomir Mrozowicz 241*f8be1786SSlawomir Mrozowicz /* get values for key */ 242*f8be1786SSlawomir Mrozowicz token = strtok(NULL, CPERF_ENTRY_DELIMITER); 243*f8be1786SSlawomir Mrozowicz if (token == NULL) { 244*f8be1786SSlawomir Mrozowicz printf("Expected 'key = values' but was '%.40s'..\n", 245*f8be1786SSlawomir Mrozowicz key_token); 246*f8be1786SSlawomir Mrozowicz return -1; 247*f8be1786SSlawomir Mrozowicz } 248*f8be1786SSlawomir Mrozowicz 249*f8be1786SSlawomir Mrozowicz status = parse_values(token, &data, &data_length); 250*f8be1786SSlawomir Mrozowicz if (status) 251*f8be1786SSlawomir Mrozowicz return -1; 252*f8be1786SSlawomir Mrozowicz 253*f8be1786SSlawomir Mrozowicz /* compare keys */ 254*f8be1786SSlawomir Mrozowicz if (strstr(key_token, "plaintext")) { 255*f8be1786SSlawomir Mrozowicz rte_free(vector->plaintext.data); 256*f8be1786SSlawomir Mrozowicz vector->plaintext.data = data; 257*f8be1786SSlawomir Mrozowicz if (tc_found) 258*f8be1786SSlawomir Mrozowicz vector->plaintext.length = data_length; 259*f8be1786SSlawomir Mrozowicz else { 260*f8be1786SSlawomir Mrozowicz if (opts->buffer_sz > data_length) { 261*f8be1786SSlawomir Mrozowicz printf("Global plaintext shorter than " 262*f8be1786SSlawomir Mrozowicz "buffer_sz\n"); 263*f8be1786SSlawomir Mrozowicz return -1; 264*f8be1786SSlawomir Mrozowicz } 265*f8be1786SSlawomir Mrozowicz vector->plaintext.length = opts->buffer_sz; 266*f8be1786SSlawomir Mrozowicz } 267*f8be1786SSlawomir Mrozowicz 268*f8be1786SSlawomir Mrozowicz } else if (strstr(key_token, "cipher_key")) { 269*f8be1786SSlawomir Mrozowicz rte_free(vector->cipher_key.data); 270*f8be1786SSlawomir Mrozowicz vector->cipher_key.data = data; 271*f8be1786SSlawomir Mrozowicz if (tc_found) 272*f8be1786SSlawomir Mrozowicz vector->cipher_key.length = data_length; 273*f8be1786SSlawomir Mrozowicz else { 274*f8be1786SSlawomir Mrozowicz if (opts->cipher_key_sz > data_length) { 275*f8be1786SSlawomir Mrozowicz printf("Global cipher_key shorter than " 276*f8be1786SSlawomir Mrozowicz "cipher_key_sz\n"); 277*f8be1786SSlawomir Mrozowicz return -1; 278*f8be1786SSlawomir Mrozowicz } 279*f8be1786SSlawomir Mrozowicz vector->cipher_key.length = opts->cipher_key_sz; 280*f8be1786SSlawomir Mrozowicz } 281*f8be1786SSlawomir Mrozowicz 282*f8be1786SSlawomir Mrozowicz } else if (strstr(key_token, "auth_key")) { 283*f8be1786SSlawomir Mrozowicz rte_free(vector->auth_key.data); 284*f8be1786SSlawomir Mrozowicz vector->auth_key.data = data; 285*f8be1786SSlawomir Mrozowicz if (tc_found) 286*f8be1786SSlawomir Mrozowicz vector->auth_key.length = data_length; 287*f8be1786SSlawomir Mrozowicz else { 288*f8be1786SSlawomir Mrozowicz if (opts->auth_key_sz > data_length) { 289*f8be1786SSlawomir Mrozowicz printf("Global auth_key shorter than " 290*f8be1786SSlawomir Mrozowicz "auth_key_sz\n"); 291*f8be1786SSlawomir Mrozowicz return -1; 292*f8be1786SSlawomir Mrozowicz } 293*f8be1786SSlawomir Mrozowicz vector->auth_key.length = opts->auth_key_sz; 294*f8be1786SSlawomir Mrozowicz } 295*f8be1786SSlawomir Mrozowicz 296*f8be1786SSlawomir Mrozowicz } else if (strstr(key_token, "iv")) { 297*f8be1786SSlawomir Mrozowicz rte_free(vector->iv.data); 298*f8be1786SSlawomir Mrozowicz vector->iv.data = data; 299*f8be1786SSlawomir Mrozowicz vector->iv.phys_addr = rte_malloc_virt2phy(vector->iv.data); 300*f8be1786SSlawomir Mrozowicz if (tc_found) 301*f8be1786SSlawomir Mrozowicz vector->iv.length = data_length; 302*f8be1786SSlawomir Mrozowicz else { 303*f8be1786SSlawomir Mrozowicz if (opts->cipher_iv_sz > data_length) { 304*f8be1786SSlawomir Mrozowicz printf("Global iv shorter than " 305*f8be1786SSlawomir Mrozowicz "cipher_iv_sz\n"); 306*f8be1786SSlawomir Mrozowicz return -1; 307*f8be1786SSlawomir Mrozowicz } 308*f8be1786SSlawomir Mrozowicz vector->iv.length = opts->cipher_iv_sz; 309*f8be1786SSlawomir Mrozowicz } 310*f8be1786SSlawomir Mrozowicz 311*f8be1786SSlawomir Mrozowicz } else if (strstr(key_token, "ciphertext")) { 312*f8be1786SSlawomir Mrozowicz rte_free(vector->ciphertext.data); 313*f8be1786SSlawomir Mrozowicz vector->ciphertext.data = data; 314*f8be1786SSlawomir Mrozowicz if (tc_found) 315*f8be1786SSlawomir Mrozowicz vector->ciphertext.length = data_length; 316*f8be1786SSlawomir Mrozowicz else { 317*f8be1786SSlawomir Mrozowicz if (opts->buffer_sz > data_length) { 318*f8be1786SSlawomir Mrozowicz printf("Global ciphertext shorter than " 319*f8be1786SSlawomir Mrozowicz "buffer_sz\n"); 320*f8be1786SSlawomir Mrozowicz return -1; 321*f8be1786SSlawomir Mrozowicz } 322*f8be1786SSlawomir Mrozowicz vector->ciphertext.length = opts->buffer_sz; 323*f8be1786SSlawomir Mrozowicz } 324*f8be1786SSlawomir Mrozowicz 325*f8be1786SSlawomir Mrozowicz } else if (strstr(key_token, "aad")) { 326*f8be1786SSlawomir Mrozowicz rte_free(vector->aad.data); 327*f8be1786SSlawomir Mrozowicz vector->aad.data = data; 328*f8be1786SSlawomir Mrozowicz vector->aad.phys_addr = rte_malloc_virt2phy(vector->aad.data); 329*f8be1786SSlawomir Mrozowicz if (tc_found) 330*f8be1786SSlawomir Mrozowicz vector->aad.length = data_length; 331*f8be1786SSlawomir Mrozowicz else { 332*f8be1786SSlawomir Mrozowicz if (opts->auth_aad_sz > data_length) { 333*f8be1786SSlawomir Mrozowicz printf("Global aad shorter than " 334*f8be1786SSlawomir Mrozowicz "auth_aad_sz\n"); 335*f8be1786SSlawomir Mrozowicz return -1; 336*f8be1786SSlawomir Mrozowicz } 337*f8be1786SSlawomir Mrozowicz vector->aad.length = opts->auth_aad_sz; 338*f8be1786SSlawomir Mrozowicz } 339*f8be1786SSlawomir Mrozowicz 340*f8be1786SSlawomir Mrozowicz } else if (strstr(key_token, "digest")) { 341*f8be1786SSlawomir Mrozowicz rte_free(vector->digest.data); 342*f8be1786SSlawomir Mrozowicz vector->digest.data = data; 343*f8be1786SSlawomir Mrozowicz vector->digest.phys_addr = rte_malloc_virt2phy( 344*f8be1786SSlawomir Mrozowicz vector->digest.data); 345*f8be1786SSlawomir Mrozowicz if (tc_found) 346*f8be1786SSlawomir Mrozowicz vector->digest.length = data_length; 347*f8be1786SSlawomir Mrozowicz else { 348*f8be1786SSlawomir Mrozowicz if (opts->auth_digest_sz > data_length) { 349*f8be1786SSlawomir Mrozowicz printf("Global digest shorter than " 350*f8be1786SSlawomir Mrozowicz "auth_digest_sz\n"); 351*f8be1786SSlawomir Mrozowicz return -1; 352*f8be1786SSlawomir Mrozowicz } 353*f8be1786SSlawomir Mrozowicz vector->digest.length = opts->auth_digest_sz; 354*f8be1786SSlawomir Mrozowicz } 355*f8be1786SSlawomir Mrozowicz } else { 356*f8be1786SSlawomir Mrozowicz printf("Not valid key: '%s'\n", trim_space(key_token)); 357*f8be1786SSlawomir Mrozowicz return -1; 358*f8be1786SSlawomir Mrozowicz } 359*f8be1786SSlawomir Mrozowicz 360*f8be1786SSlawomir Mrozowicz return 0; 361*f8be1786SSlawomir Mrozowicz } 362*f8be1786SSlawomir Mrozowicz 363*f8be1786SSlawomir Mrozowicz /* searches in the file for test keys and values */ 364*f8be1786SSlawomir Mrozowicz static int 365*f8be1786SSlawomir Mrozowicz parse_file(struct cperf_test_vector *vector, struct cperf_options *opts) 366*f8be1786SSlawomir Mrozowicz { 367*f8be1786SSlawomir Mrozowicz uint8_t tc_found = 0; 368*f8be1786SSlawomir Mrozowicz uint8_t tc_data_start = 0; 369*f8be1786SSlawomir Mrozowicz ssize_t read; 370*f8be1786SSlawomir Mrozowicz size_t len = 0; 371*f8be1786SSlawomir Mrozowicz int status = 0; 372*f8be1786SSlawomir Mrozowicz 373*f8be1786SSlawomir Mrozowicz FILE *fp; 374*f8be1786SSlawomir Mrozowicz char *line = NULL; 375*f8be1786SSlawomir Mrozowicz char *entry = NULL; 376*f8be1786SSlawomir Mrozowicz 377*f8be1786SSlawomir Mrozowicz fp = fopen(opts->test_file, "r"); 378*f8be1786SSlawomir Mrozowicz if (fp == NULL) { 379*f8be1786SSlawomir Mrozowicz printf("File %s does not exists\n", opts->test_file); 380*f8be1786SSlawomir Mrozowicz return -1; 381*f8be1786SSlawomir Mrozowicz } 382*f8be1786SSlawomir Mrozowicz 383*f8be1786SSlawomir Mrozowicz while ((read = getline(&line, &len, fp)) != -1) { 384*f8be1786SSlawomir Mrozowicz 385*f8be1786SSlawomir Mrozowicz /* ignore comments and new lines */ 386*f8be1786SSlawomir Mrozowicz if (line[0] == '#' || line[0] == '/' || line[0] == '\n' 387*f8be1786SSlawomir Mrozowicz || line[0] == '\r' || line[0] == ' ') 388*f8be1786SSlawomir Mrozowicz continue; 389*f8be1786SSlawomir Mrozowicz 390*f8be1786SSlawomir Mrozowicz trim_space(line); 391*f8be1786SSlawomir Mrozowicz 392*f8be1786SSlawomir Mrozowicz /* next test case is started */ 393*f8be1786SSlawomir Mrozowicz if (line[0] == '[' && line[strlen(line) - 1] == ']' && tc_found) 394*f8be1786SSlawomir Mrozowicz break; 395*f8be1786SSlawomir Mrozowicz /* test case section started, end of global data */ 396*f8be1786SSlawomir Mrozowicz else if (line[0] == '[' && line[strlen(line) - 1] == ']') 397*f8be1786SSlawomir Mrozowicz tc_data_start = 1; 398*f8be1786SSlawomir Mrozowicz 399*f8be1786SSlawomir Mrozowicz /* test name unspecified, end after global data */ 400*f8be1786SSlawomir Mrozowicz if (tc_data_start && opts->test_name == NULL) 401*f8be1786SSlawomir Mrozowicz break; 402*f8be1786SSlawomir Mrozowicz /* searching for a suitable test */ 403*f8be1786SSlawomir Mrozowicz else if (tc_data_start && tc_found == 0) { 404*f8be1786SSlawomir Mrozowicz if (!strcmp(line, opts->test_name)) { 405*f8be1786SSlawomir Mrozowicz tc_found = 1; 406*f8be1786SSlawomir Mrozowicz continue; 407*f8be1786SSlawomir Mrozowicz } else 408*f8be1786SSlawomir Mrozowicz continue; 409*f8be1786SSlawomir Mrozowicz } 410*f8be1786SSlawomir Mrozowicz 411*f8be1786SSlawomir Mrozowicz /* buffer for multiline */ 412*f8be1786SSlawomir Mrozowicz entry = (char *) rte_realloc(entry, 413*f8be1786SSlawomir Mrozowicz sizeof(char) * strlen(line) + 1, 0); 414*f8be1786SSlawomir Mrozowicz if (entry == NULL) 415*f8be1786SSlawomir Mrozowicz return -1; 416*f8be1786SSlawomir Mrozowicz 417*f8be1786SSlawomir Mrozowicz memset(entry, 0, strlen(line) + 1); 418*f8be1786SSlawomir Mrozowicz strncpy(entry, line, strlen(line)); 419*f8be1786SSlawomir Mrozowicz 420*f8be1786SSlawomir Mrozowicz /* check if entry ends with , or = */ 421*f8be1786SSlawomir Mrozowicz if (entry[strlen(entry) - 1] == ',' 422*f8be1786SSlawomir Mrozowicz || entry[strlen(entry) - 1] == '=') { 423*f8be1786SSlawomir Mrozowicz while ((read = getline(&line, &len, fp)) != -1) { 424*f8be1786SSlawomir Mrozowicz trim_space(line); 425*f8be1786SSlawomir Mrozowicz 426*f8be1786SSlawomir Mrozowicz /* extend entry about length of new line */ 427*f8be1786SSlawomir Mrozowicz char *entry_extended = (char *) rte_realloc( 428*f8be1786SSlawomir Mrozowicz entry, sizeof(char) 429*f8be1786SSlawomir Mrozowicz * (strlen(line) + strlen(entry)) 430*f8be1786SSlawomir Mrozowicz + 1, 0); 431*f8be1786SSlawomir Mrozowicz 432*f8be1786SSlawomir Mrozowicz if (entry_extended == NULL) 433*f8be1786SSlawomir Mrozowicz goto err; 434*f8be1786SSlawomir Mrozowicz entry = entry_extended; 435*f8be1786SSlawomir Mrozowicz 436*f8be1786SSlawomir Mrozowicz strncat(entry, line, strlen(line)); 437*f8be1786SSlawomir Mrozowicz 438*f8be1786SSlawomir Mrozowicz if (entry[strlen(entry) - 1] != ',') 439*f8be1786SSlawomir Mrozowicz break; 440*f8be1786SSlawomir Mrozowicz } 441*f8be1786SSlawomir Mrozowicz } 442*f8be1786SSlawomir Mrozowicz status = parse_entry(entry, vector, opts, tc_found); 443*f8be1786SSlawomir Mrozowicz if (status) { 444*f8be1786SSlawomir Mrozowicz printf("An error occurred while parsing!\n"); 445*f8be1786SSlawomir Mrozowicz goto err; 446*f8be1786SSlawomir Mrozowicz } 447*f8be1786SSlawomir Mrozowicz } 448*f8be1786SSlawomir Mrozowicz 449*f8be1786SSlawomir Mrozowicz if (tc_found == 0 && opts->test_name != NULL) { 450*f8be1786SSlawomir Mrozowicz printf("Not found '%s' case in test file\n", opts->test_name); 451*f8be1786SSlawomir Mrozowicz goto err; 452*f8be1786SSlawomir Mrozowicz } 453*f8be1786SSlawomir Mrozowicz 454*f8be1786SSlawomir Mrozowicz fclose(fp); 455*f8be1786SSlawomir Mrozowicz free(line); 456*f8be1786SSlawomir Mrozowicz rte_free(entry); 457*f8be1786SSlawomir Mrozowicz 458*f8be1786SSlawomir Mrozowicz return 0; 459*f8be1786SSlawomir Mrozowicz 460*f8be1786SSlawomir Mrozowicz err: 461*f8be1786SSlawomir Mrozowicz if (fp) 462*f8be1786SSlawomir Mrozowicz fclose(fp); 463*f8be1786SSlawomir Mrozowicz if (line) 464*f8be1786SSlawomir Mrozowicz free(line); 465*f8be1786SSlawomir Mrozowicz if (entry) 466*f8be1786SSlawomir Mrozowicz rte_free(entry); 467*f8be1786SSlawomir Mrozowicz 468*f8be1786SSlawomir Mrozowicz return -1; 469*f8be1786SSlawomir Mrozowicz } 470*f8be1786SSlawomir Mrozowicz 471*f8be1786SSlawomir Mrozowicz struct cperf_test_vector* 472*f8be1786SSlawomir Mrozowicz cperf_test_vector_get_from_file(struct cperf_options *opts) 473*f8be1786SSlawomir Mrozowicz { 474*f8be1786SSlawomir Mrozowicz int status; 475*f8be1786SSlawomir Mrozowicz struct cperf_test_vector *test_vector = NULL; 476*f8be1786SSlawomir Mrozowicz 477*f8be1786SSlawomir Mrozowicz if (opts == NULL || opts->test_file == NULL) 478*f8be1786SSlawomir Mrozowicz return test_vector; 479*f8be1786SSlawomir Mrozowicz 480*f8be1786SSlawomir Mrozowicz test_vector = (struct cperf_test_vector *) rte_zmalloc(NULL, 481*f8be1786SSlawomir Mrozowicz sizeof(struct cperf_test_vector), 0); 482*f8be1786SSlawomir Mrozowicz if (test_vector == NULL) 483*f8be1786SSlawomir Mrozowicz return test_vector; 484*f8be1786SSlawomir Mrozowicz 485*f8be1786SSlawomir Mrozowicz /* filling the vector with data from a file */ 486*f8be1786SSlawomir Mrozowicz status = parse_file(test_vector, opts); 487*f8be1786SSlawomir Mrozowicz if (status) { 488*f8be1786SSlawomir Mrozowicz free_test_vector(test_vector, opts); 489*f8be1786SSlawomir Mrozowicz return NULL; 490*f8be1786SSlawomir Mrozowicz } 491*f8be1786SSlawomir Mrozowicz 492*f8be1786SSlawomir Mrozowicz /* other values not included in the file */ 493*f8be1786SSlawomir Mrozowicz test_vector->data.cipher_offset = 0; 494*f8be1786SSlawomir Mrozowicz test_vector->data.cipher_length = opts->buffer_sz; 495*f8be1786SSlawomir Mrozowicz 496*f8be1786SSlawomir Mrozowicz test_vector->data.auth_offset = 0; 497*f8be1786SSlawomir Mrozowicz test_vector->data.auth_length = opts->buffer_sz; 498*f8be1786SSlawomir Mrozowicz 499*f8be1786SSlawomir Mrozowicz return test_vector; 500*f8be1786SSlawomir Mrozowicz } 501