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