{"action":"created","comment":{"url":"https://api.github.com/repos/Linaro/odp/pulls/comments/175075200","pull_request_review_id":104547938,"id":175075200,"diff_hunk":"@@ -0,0 +1,1035 @@\n+/* Copyright (c) 2015-2018, Linaro Limited\n+ * All rights reserved.\n+ *\n+ * SPDX-License-Identifier:\tBSD-3-Clause\n+ */\n+\n+#include \"config.h\"\n+\n+#ifndef _GNU_SOURCE\n+#define _GNU_SOURCE\n+#endif /* _GNU_SOURCE */\n+\n+#include <stdlib.h>\n+#include <string.h>\n+#include <getopt.h>\n+#include <unistd.h>\n+#include <stdio.h>\n+#include <sys/time.h>\n+#include <sys/resource.h>\n+\n+#include <odp_api.h>\n+#include <odp/helper/odph_api.h>\n+\n+#define app_err(fmt, ...) \\\n+\tfprintf(stderr, \"%s:%d:%s(): Error: \" fmt, __FILE__, \\\n+\t\t__LINE__, __func__, ##__VA_ARGS__)\n+\n+/** @def POOL_NUM_PKT\n+ * Number of packets in the pool\n+ */\n+#define POOL_NUM_PKT  64\n+\n+static uint8_t test_salt[16] = \"0123456789abcdef\";\n+\n+static uint8_t test_key16[16] = { 0x01, 0x02, 0x03, 0x04, 0x05,\n+\t\t\t\t  0x06, 0x07, 0x08, 0x09, 0x0a,\n+\t\t\t\t  0x0b, 0x0c, 0x0d, 0x0e, 0x0f,\n+\t\t\t\t  0x10,\n+};\n+\n+static uint8_t test_key20[20] = { 0x01, 0x02, 0x03, 0x04, 0x05,\n+\t\t\t\t  0x06, 0x07, 0x08, 0x09, 0x0a,\n+\t\t\t\t  0x0b, 0x0c, 0x0d, 0x0e, 0x0f,\n+\t\t\t\t  0x10, 0x11, 0x12, 0x13, 0x14,\n+};\n+\n+static uint8_t test_key24[24] = { 0x01, 0x02, 0x03, 0x04, 0x05,\n+\t\t\t\t  0x06, 0x07, 0x08, 0x09, 0x0a,\n+\t\t\t\t  0x0b, 0x0c, 0x0d, 0x0e, 0x0f,\n+\t\t\t\t  0x10, 0x11, 0x12, 0x13, 0x14,\n+\t\t\t\t  0x15, 0x16, 0x17, 0x18\n+};\n+\n+/**\n+ * Structure that holds template for sa create call\n+ * for different algorithms supported by test\n+ */\n+typedef struct {\n+\tconst char *name;\t\t      /**< Algorithm name */\n+\todp_ipsec_crypto_param_t crypto; /**< Prefilled SA crypto param */\n+} ipsec_alg_config_t;\n+\n+/**\n+ * Parsed command line crypto arguments. Describes test configuration.\n+ */\n+typedef struct {\n+\t/**\n+\t * If non zero prints content of packets. Enabled by -d or\n+\t * --debug option.\n+\t */\n+\tint debug_packets;\n+\n+\t/**\n+\t * If non zero Try to run crypto operation in place. Note some\n+\t * implementation may not support such mode. Enabled by -n or\n+\t * --inplace option.\n+\t */\n+\tint in_place;\n+\n+\t/**\n+\t * If non zeor output of previous operation taken as input for\n+\t * next encrypt operations. Enabled by -r or --reuse option.\n+\t */\n+\tint reuse_packet;\n+\n+\t/**\n+\t * Maximum number of outstanding encryption requests. Note code\n+\t * poll for results over queue and if nothing is available it can\n+\t * submit more encryption requests up to maximum number specified by\n+\t * this option. Specified through -f or --flight option.\n+\t */\n+\tint in_flight;\n+\n+\t/**\n+\t * Number of iteration to repeat crypto operation to get good\n+\t * average number. Specified through -i or --terations option.\n+\t * Default is 10000.\n+\t */\n+\tint iteration_count;\n+\n+\t/**\n+\t * Payload size to test. If 0 set of predefined payload sizes\n+\t * is tested. Specified through -p or --payload option.\n+\t */\n+\tint payload_length;\n+\n+\t/**\n+\t * Pointer to selected algorithm to test. If NULL all available\n+\t * alogorthims are tested. Name of algorithm is passed through\n+\t * -a or --algorithm option.\n+\t */\n+\tipsec_alg_config_t *alg_config;\n+\n+\t/**\n+\t * Use scheduler to get completion events from crypto operation.\n+\t * Specified through -s argument.\n+\t * */\n+\tint schedule;\n+\n+\t/*\n+\t * Poll completion queue for crypto completion events.\n+\t * Specified through -p argument.\n+\t */\n+\tint poll;\n+\n+\t/*\n+\t * Use tunnel instead of transport mode.\n+\t * Specified through -t argument.\n+\t */\n+\tint tunnel;\n+} ipsec_args_t;\n+\n+/*\n+ * Helper structure that holds averages for test of one algorithm\n+ * for given payload size.\n+ */\n+typedef struct {\n+\t/**\n+\t * Elapsed time for one crypto operation.\n+\t */\n+\tdouble elapsed;\n+\n+\t/**\n+\t * CPU time spent pre one crypto operation by whole process\n+\t * i.e include current and all other threads in process.\n+\t * It is filled with 'getrusage(RUSAGE_SELF, ...)' call.\n+\t */\n+\tdouble rusage_self;\n+\n+\t/**\n+\t * CPU time spent per one crypto operation by current thread\n+\t * only. It is filled with 'getrusage(RUSAGE_THREAD, ...)'\n+\t * call.\n+\t */\n+\tdouble rusage_thread;\n+} crypto_run_result_t;\n+\n+/**\n+ * Structure holds one snap to misc times of current process.\n+ */\n+typedef struct {\n+\tstruct timeval tv;\t /**< Elapsed time */\n+\tstruct rusage ru_self;\t /**< Rusage value for whole process */\n+\tstruct rusage ru_thread; /**< Rusage value for current thread */\n+} time_record_t;\n+\n+/**\n+ * Set of predefined payloads.\n+ */\n+static unsigned int payloads[] = {\n+\t64,\n+\t256,\n+\t1024,\n+\t8192,\n+\t16384\n+};\n+\n+/** Number of payloads used in the test */\n+static unsigned int num_payloads;\n+\n+/**\n+ * Set of known algorithms to test\n+ */\n+static ipsec_alg_config_t algs_config[] = {\n+\t{\n+\t\t.name = \"3des-cbc-null\",\n+\t\t.crypto = {\n+\t\t\t.cipher_alg = ODP_CIPHER_ALG_3DES_CBC,\n+\t\t\t.cipher_key = {\n+\t\t\t\t.data = test_key24,\n+\t\t\t\t.length = sizeof(test_key24)\n+\t\t\t},\n+\t\t\t.auth_alg = ODP_AUTH_ALG_NULL\n+\t\t},\n+\t},\n+\t{\n+\t\t.name = \"3des-cbc-hmac-md5-96\",\n+\t\t.crypto = {\n+\t\t\t.cipher_alg = ODP_CIPHER_ALG_3DES_CBC,\n+\t\t\t.cipher_key = {\n+\t\t\t\t.data = test_key24,\n+\t\t\t\t.length = sizeof(test_key24)\n+\t\t\t},\n+\t\t\t.auth_alg = ODP_AUTH_ALG_MD5_HMAC,\n+\t\t\t.auth_key = {\n+\t\t\t\t.data = test_key16,\n+\t\t\t\t.length = sizeof(test_key16)\n+\t\t\t},\n+\t\t},\n+\t},\n+\t{\n+\t\t.name = \"null-hmac-md5-96\",\n+\t\t.crypto = {\n+\t\t\t.cipher_alg = ODP_CIPHER_ALG_NULL,\n+\t\t\t.auth_alg = ODP_AUTH_ALG_MD5_HMAC,\n+\t\t\t.auth_key = {\n+\t\t\t\t.data = test_key16,\n+\t\t\t\t.length = sizeof(test_key16)\n+\t\t\t},\n+\t\t},\n+\t},\n+\t{\n+\t\t.name = \"aes-cbc-null\",\n+\t\t.crypto = {\n+\t\t\t.cipher_alg = ODP_CIPHER_ALG_AES_CBC,\n+\t\t\t.cipher_key = {\n+\t\t\t\t.data = test_key16,\n+\t\t\t\t.length = sizeof(test_key16)\n+\t\t\t},\n+\t\t\t.auth_alg = ODP_AUTH_ALG_NULL\n+\t\t},\n+\t},\n+\t{\n+\t\t.name = \"aes-cbc-hmac-sha1-96\",\n+\t\t.crypto = {\n+\t\t\t.cipher_alg = ODP_CIPHER_ALG_AES_CBC,\n+\t\t\t.cipher_key = {\n+\t\t\t\t.data = test_key16,\n+\t\t\t\t.length = sizeof(test_key16)\n+\t\t\t},\n+\t\t\t.auth_alg = ODP_AUTH_ALG_SHA1_HMAC,\n+\t\t\t.auth_key = {\n+\t\t\t\t.data = test_key20,\n+\t\t\t\t.length = sizeof(test_key20)\n+\t\t\t},\n+\t\t},\n+\t},\n+\t{\n+\t\t.name = \"null-hmac-sha1-96\",\n+\t\t.crypto = {\n+\t\t\t.cipher_alg = ODP_CIPHER_ALG_NULL,\n+\t\t\t.auth_alg = ODP_AUTH_ALG_SHA1_HMAC,\n+\t\t\t.auth_key = {\n+\t\t\t\t.data = test_key20,\n+\t\t\t\t.length = sizeof(test_key20)\n+\t\t\t},\n+\t\t},\n+\t},\n+\t{\n+\t\t.name = \"aes-gcm\",\n+\t\t.crypto = {\n+\t\t\t.cipher_alg = ODP_CIPHER_ALG_AES_GCM,\n+\t\t\t.cipher_key = {\n+\t\t\t\t.data = test_key16,\n+\t\t\t\t.length = sizeof(test_key16)\n+\t\t\t},\n+\t\t\t.cipher_key_extra = {\n+\t\t\t\t.data = test_salt,\n+\t\t\t\t.length = 4,\n+\t\t\t},\n+\t\t\t.auth_alg = ODP_AUTH_ALG_AES_GCM,\n+\t\t},\n+\t},\n+};\n+\n+/**\n+ * Find corresponding config for given name. Returns NULL\n+ * if config for given name is not found.\n+ */\n+static ipsec_alg_config_t *\n+find_config_by_name(const char *name)\n+{\n+\tunsigned int i;\n+\tipsec_alg_config_t *ret = NULL;\n+\n+\tfor (i = 0; i < (sizeof(algs_config) / sizeof(ipsec_alg_config_t));\n+\t     i++) {\n+\t\tif (strcmp(algs_config[i].name, name) == 0) {\n+\t\t\tret = algs_config + i;\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\treturn ret;\n+}\n+\n+/**\n+ * Helper function that prints list of algorithms that this\n+ * test understands.\n+ */\n+static void\n+print_config_names(const char *prefix)\n+{\n+\tunsigned int i;\n+\n+\tfor (i = 0; i < (sizeof(algs_config) / sizeof(ipsec_alg_config_t));\n+\t     i++) {\n+\t\tprintf(\"%s %s\\n\", prefix, algs_config[i].name);\n+\t}\n+}\n+\n+/**\n+ * Snap current time values and put them into 'rec'.\n+ */\n+static void\n+fill_time_record(time_record_t *rec)\n+{\n+\tgettimeofday(&rec->tv, NULL);\n+\tgetrusage(RUSAGE_SELF, &rec->ru_self);\n+\tgetrusage(RUSAGE_THREAD, &rec->ru_thread);\n+}\n+\n+/**\n+ * Calculated CPU time difference for given two rusage structures.\n+ * Note it adds user space and system time together.\n+ */\n+static unsigned long long\n+get_rusage_diff(struct rusage *start, struct rusage *end)\n+{\n+\tunsigned long long rusage_diff;\n+\tunsigned long long rusage_start;\n+\tunsigned long long rusage_end;\n+\n+\trusage_start = (start->ru_utime.tv_sec * 1000000) +\n+\t\t       (start->ru_utime.tv_usec);\n+\trusage_start += (start->ru_stime.tv_sec * 1000000) +\n+\t\t\t(start->ru_stime.tv_usec);\n+\n+\trusage_end = (end->ru_utime.tv_sec * 1000000) +\n+\t\t     (end->ru_utime.tv_usec);\n+\trusage_end += (end->ru_stime.tv_sec * 1000000) +\n+\t\t      (end->ru_stime.tv_usec);\n+\n+\trusage_diff = rusage_end - rusage_start;\n+\n+\treturn rusage_diff;\n+}\n+\n+/**\n+ * Get diff for RUSAGE_SELF (whole process) between two time snap\n+ * records.\n+ */\n+static unsigned long long\n+get_rusage_self_diff(time_record_t *start, time_record_t *end)\n+{\n+\treturn get_rusage_diff(&start->ru_self, &end->ru_self);\n+}\n+\n+/**\n+ * Get diff for RUSAGE_THREAD (current thread only) between two\n+ * time snap records.\n+ */\n+static unsigned long long\n+get_rusage_thread_diff(time_record_t *start, time_record_t *end)\n+{\n+\treturn get_rusage_diff(&start->ru_thread, &end->ru_thread);\n+}\n+\n+/**\n+ * Get diff of elapsed time between two time snap records\n+ */\n+static unsigned long long\n+get_elapsed_usec(time_record_t *start, time_record_t *end)\n+{\n+\tunsigned long long s;\n+\tunsigned long long e;\n+\n+\ts = (start->tv.tv_sec * 1000000) +\n+\t    (start->tv.tv_usec);\n+\te = (end->tv.tv_sec * 1000000) +\n+\t    (end->tv.tv_usec);\n+\n+\treturn e - s;\n+}\n+\n+#define REPORT_HEADER\t    \"\\n%30.30s %15s %15s %15s %15s %15s %15s\\n\"\n+#define REPORT_LINE\t    \"%30.30s %15d %15d %15.3f %15.3f %15.3f %15d\\n\"\n+\n+/**\n+ * Print header line for our report.\n+ */\n+static void\n+print_result_header(void)\n+{\n+\tprintf(REPORT_HEADER,\n+\t       \"algorithm\", \"avg over #\", \"payload (bytes)\", \"elapsed (us)\",\n+\t       \"rusg self (us)\", \"rusg thrd (us)\", \"throughput (Kb)\");\n+}\n+\n+/**\n+ * Print one line of our report.\n+ */\n+static void\n+print_result(ipsec_args_t *cargs,\n+\t     unsigned int payload_length,\n+\t     ipsec_alg_config_t *config,\n+\t     crypto_run_result_t *result)\n+{\n+\tunsigned int throughput;\n+\n+\tthroughput = (1000000.0 / result->elapsed) * payload_length / 1024;\n+\tprintf(REPORT_LINE,\n+\t       config->name, cargs->iteration_count, payload_length,\n+\t       result->elapsed, result->rusage_self, result->rusage_thread,\n+\t       throughput);\n+}\n+\n+#define IPV4ADDR(a, b, c, d) odp_cpu_to_be_32((a << 24) | \\\n+\t\t\t\t\t      (b << 16) | \\\n+\t\t\t\t\t      (c << 8) | \\\n+\t\t\t\t\t      (d << 0))\n+\n+/**\n+ * Create ODP IPsec SA for given config.\n+ */\n+static odp_ipsec_sa_t\n+create_sa_from_config(ipsec_alg_config_t *config,\n+\t\t      ipsec_args_t *cargs)\n+{\n+\todp_ipsec_sa_param_t param;\n+\todp_queue_t out_queue;\n+\n+\todp_ipsec_sa_param_init(&param);\n+\tmemcpy(&param.crypto, &config->crypto,\n+\t       sizeof(odp_ipsec_crypto_param_t));\n+\n+\tparam.proto = ODP_IPSEC_ESP;\n+\tparam.dir = ODP_IPSEC_DIR_OUTBOUND;\n+\n+\tif (cargs->tunnel) {\n+\t\tuint32_t src = IPV4ADDR(10, 0, 111, 2);\n+\t\tuint32_t dst = IPV4ADDR(10, 0, 222, 2);\n+\t\todp_ipsec_tunnel_param_t tunnel;\n+\n+\t\tmemset(&tunnel, 0, sizeof(tunnel));\n+\t\ttunnel.type = ODP_IPSEC_TUNNEL_IPV4;\n+\t\ttunnel.ipv4.src_addr = &src;\n+\t\ttunnel.ipv4.dst_addr = &dst;\n+\t\ttunnel.ipv4.ttl = 64;\n+\n+\t\tparam.mode = ODP_IPSEC_MODE_TUNNEL;\n+\t\tparam.outbound.tunnel = tunnel;\n+\t} else {\n+\t\tparam.mode = ODP_IPSEC_MODE_TRANSPORT;\n+\t}\n+\n+\tif (cargs->schedule || cargs->poll) {\n+\t\tout_queue = odp_queue_lookup(\"ipsec-out\");\n+\t\tif (out_queue == ODP_QUEUE_INVALID) {\n+\t\t\tapp_err(\"ipsec-out queue not found\\n\");\n+\t\t\treturn ODP_IPSEC_SA_INVALID;\n+\t\t}\n+\t\tparam.dest_queue = out_queue;\n+\t} else {\n+\t\tparam.dest_queue = ODP_QUEUE_INVALID;\n+\t}\n+\n+\treturn odp_ipsec_sa_create(&param);\n+}\n+\n+static uint8_t test_data[] = {\n+\t/* IP */\n+\t0x45, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,\n+\t0x40, 0x01, 0xac, 0x27, 0xc0, 0xa8, 0x6f, 0x02,\n+\t0xc0, 0xa8, 0xde, 0x02,\n+\n+\t/* ICMP */\n+\t0x08, 0x00, 0xfb, 0x37, 0x12, 0x34, 0x00, 0x00\n+};\n+\n+static odp_packet_t\n+make_packet(odp_pool_t pkt_pool, unsigned int payload_length)\n+{\n+\todp_packet_t pkt;\n+\n+\tif (payload_length < sizeof(test_data))\n+\t\treturn ODP_PACKET_INVALID;\n+\n+\tpkt = odp_packet_alloc(pkt_pool, payload_length);\n+\tif (pkt == ODP_PACKET_INVALID) {\n+\t\tapp_err(\"failed to allocate buffer\\n\");\n+\t\treturn pkt;\n+\t}\n+\n+\todp_packet_copy_from_mem(pkt, 0, sizeof(test_data), test_data);\n+\todp_packet_l3_offset_set(pkt, 0);\n+\n+\tuint8_t *mem = odp_packet_data(pkt);\n+\t((odph_ipv4hdr_t *)mem)->tot_len = odp_cpu_to_be_16(payload_length);\n+\tmemset(mem + sizeof(test_data), 1, payload_length - sizeof(test_data));\n+\n+\treturn pkt;\n+}\n+\n+/**\n+ * Run measurement iterations for given config and payload size.\n+ * Result of run returned in 'result' out parameter.\n+ */\n+static int\n+run_measure_one(ipsec_args_t *cargs,\n+\t\tipsec_alg_config_t *config ODP_UNUSED,\n+\t\todp_ipsec_sa_t sa,\n+\t\tunsigned int payload_length,\n+\t\tcrypto_run_result_t *result)\n+{\n+\todp_ipsec_out_param_t param;\n+\todp_pool_t pkt_pool;\n+\todp_queue_t out_queue;\n+\todp_packet_t pkt = ODP_PACKET_INVALID;\n+\tint rc = 0;\n+\n+\tpkt_pool = odp_pool_lookup(\"packet_pool\");\n+\tif (pkt_pool == ODP_POOL_INVALID) {\n+\t\tapp_err(\"pkt_pool not found\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\tout_queue = odp_queue_lookup(\"ipsec-out\");\n+\tif (cargs->schedule || cargs->poll) {\n+\t\tif (out_queue == ODP_QUEUE_INVALID) {\n+\t\t\tapp_err(\"ipsec-out queue not found\\n\");\n+\t\t\treturn -1;\n+\t\t}\n+\t}\n+\n+\tif (cargs->reuse_packet) {\n+\t\tpkt = make_packet(pkt_pool, payload_length);\n+\t\tif (ODP_PACKET_INVALID == pkt)\n+\t\t\treturn -1;\n+\t}\n+\n+\ttime_record_t start, end;\n+\tint packets_sent = 0;\n+\tint packets_received = 0;\n+\n+\t/* Initialize parameters block */\n+\tmemset(&param, 0, sizeof(param));\n+\tparam.num_sa = 1;\n+\tparam.num_opt = 0;\n+\tparam.sa = &sa;\n+\n+\tfill_time_record(&start);\n+\n+\twhile ((packets_sent < cargs->iteration_count) ||\n+\t       (packets_received < cargs->iteration_count)) {\n+\t\tif ((packets_sent < cargs->iteration_count) &&\n+\t\t    (packets_sent - packets_received <\n+\t\t     cargs->in_flight)) {\n+\t\t\todp_packet_t out_pkt;\n+\n+\t\t\tif (!cargs->reuse_packet) {\n+\t\t\t\tpkt = make_packet(pkt_pool, payload_length);\n+\t\t\t\tif (ODP_PACKET_INVALID == pkt)\n+\t\t\t\t\treturn -1;\n+\t\t\t}\n+\n+\t\t\tout_pkt = cargs->in_place ? pkt : ODP_PACKET_INVALID;\n+\n+\t\t\tif (cargs->debug_packets)\n+\t\t\t\todp_packet_print_data(pkt, 0,\n+\t\t\t\t\t\t      odp_packet_len(pkt));\n+\n+\t\t\tif (cargs->schedule || cargs->poll) {\n+\t\t\t\trc = odp_ipsec_out_enq(&pkt, 1,\n+\t\t\t\t\t\t       &param);\n+\t\t\t\tif (rc <= 0) {\n+\t\t\t\t\tapp_err(\"failed odp_crypto_packet_op_enq: rc = %d\\n\",\n+\t\t\t\t\t\trc);\n+\t\t\t\t\tif (!cargs->reuse_packet)\n+\t\t\t\t\t\todp_packet_free(pkt);\n+\t\t\t\t\tbreak;\n+\t\t\t\t}\n+\t\t\t\tpackets_sent += rc;\n+\t\t\t} else {\n+\t\t\t\tint num_out = 1;\n+\n+\t\t\t\trc = odp_ipsec_out(&pkt, 1,\n+\t\t\t\t\t\t   &out_pkt, &num_out,\n+\t\t\t\t\t\t   &param);\n+\t\t\t\tif (rc <= 0) {\n+\t\t\t\t\tapp_err(\"failed odp_ipsec_out: rc = %d\\n\",\n+\t\t\t\t\t\trc);\n+\t\t\t\t\tif (!cargs->reuse_packet)\n+\t\t\t\t\t\todp_packet_free(pkt);\n+\t\t\t\t\tbreak;\n+\t\t\t\t}\n+\t\t\t\tif (odp_packet_has_error(out_pkt)) {\n+\t\t\t\t\todp_ipsec_packet_result_t result;\n+\n+\t\t\t\t\todp_ipsec_result(&result, out_pkt);\n+\t\t\t\t\tapp_err(\"Received error packet: %d\\n\",\n+\t\t\t\t\t\tresult.status.error.all);\n+\t\t\t\t}\n+\t\t\t\tpackets_sent += rc;\n+\t\t\t\tpackets_received += num_out;\n+\t\t\t\tif (cargs->debug_packets)\n+\t\t\t\t\todp_packet_print_data(out_pkt, 0,\n+\t\t\t\t\t\t\t      odp_packet_len(out_pkt));\n+\t\t\t\tif (cargs->reuse_packet)\n+\t\t\t\t\tpkt = out_pkt;\n+\t\t\t\telse\n+\t\t\t\t\todp_packet_free(out_pkt);\n+\t\t\t}\n+\t\t}\n+\n+\t\tif (cargs->schedule || cargs->poll) {\n+\t\t\todp_event_t ev;\n+\t\t\todp_crypto_packet_result_t result;\n+\t\t\todp_packet_t out_pkt;\n+\n+\t\t\tif (cargs->schedule)\n+\t\t\t\tev = odp_schedule(NULL,","path":"test/performance/odp_ipsec.c","position":621,"original_position":621,"commit_id":"8724c392b668fd59924d03b8de7386e5dcbfe4fb","original_commit_id":"8724c392b668fd59924d03b8de7386e5dcbfe4fb","user":{"login":"muvarov","id":650186,"avatar_url":"https://avatars2.githubusercontent.com/u/650186?v=4","gravatar_id":"","url":"https://api.github.com/users/muvarov","html_url":"https://github.com/muvarov","followers_url":"https://api.github.com/users/muvarov/followers","following_url":"https://api.github.com/users/muvarov/following{/other_user}","gists_url":"https://api.github.com/users/muvarov/gists{/gist_id}","starred_url":"https://api.github.com/users/muvarov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/muvarov/subscriptions","organizations_url":"https://api.github.com/users/muvarov/orgs","repos_url":"https://api.github.com/users/muvarov/repos","events_url":"https://api.github.com/users/muvarov/events{/privacy}","received_events_url":"https://api.github.com/users/muvarov/received_events","type":"User","site_admin":false},"body":"for performance reason might be odp_schedule_multi() is better.","created_at":"2018-03-16T12:33:01Z","updated_at":"2018-03-16T12:33:02Z","html_url":"https://github.com/Linaro/odp/pull/529#discussion_r175075200","pull_request_url":"https://api.github.com/repos/Linaro/odp/pulls/529","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/Linaro/odp/pulls/comments/175075200"},"html":{"href":"https://github.com/Linaro/odp/pull/529#discussion_r175075200"},"pull_request":{"href":"https://api.github.com/repos/Linaro/odp/pulls/529"}}},"pull_request":{"url":"https://api.github.com/repos/Linaro/odp/pulls/529","id":175240856,"html_url":"https://github.com/Linaro/odp/pull/529","diff_url":"https://github.com/Linaro/odp/pull/529.diff","patch_url":"https://github.com/Linaro/odp/pull/529.patch","issue_url":"https://api.github.com/repos/Linaro/odp/issues/529","number":529,"state":"open","locked":false,"title":"[PATCH v2] tests: add IPsec performance test","user":{"login":"lumag","id":20323,"avatar_url":"https://avatars2.githubusercontent.com/u/20323?v=4","gravatar_id":"","url":"https://api.github.com/users/lumag","html_url":"https://github.com/lumag","followers_url":"https://api.github.com/users/lumag/followers","following_url":"https://api.github.com/users/lumag/following{/other_user}","gists_url":"https://api.github.com/users/lumag/gists{/gist_id}","starred_url":"https://api.github.com/users/lumag/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lumag/subscriptions","organizations_url":"https://api.github.com/users/lumag/orgs","repos_url":"https://api.github.com/users/lumag/repos","events_url":"https://api.github.com/users/lumag/events{/privacy}","received_events_url":"https://api.github.com/users/lumag/received_events","type":"User","site_admin":false},"body":"Use this tool to measure IPsec performance with different algorithms\r\nFor now only outbound direction is supported.\r\n\r\nSigned-off-by: Dmitry Eremin-Solenikov <dmitry.ereminsolenikov@linaro.org>","created_at":"2018-03-15T12:52:09Z","updated_at":"2018-03-16T12:33:02Z","closed_at":null,"merged_at":null,"merge_commit_sha":"2d83d254a7f9e877414df48306043c898144bd62","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":577854052,"url":"https://api.github.com/repos/Linaro/odp/labels/Email_sent","name":"Email_sent","color":"ededed","default":false},{"id":666131932,"url":"https://api.github.com/repos/Linaro/odp/labels/checkpatch","name":"checkpatch","color":"0000ff","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/Linaro/odp/pulls/529/commits","review_comments_url":"https://api.github.com/repos/Linaro/odp/pulls/529/comments","review_comment_url":"https://api.github.com/repos/Linaro/odp/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Linaro/odp/issues/529/comments","statuses_url":"https://api.github.com/repos/Linaro/odp/statuses/8724c392b668fd59924d03b8de7386e5dcbfe4fb","head":{"label":"lumag:ipsec-perf","ref":"ipsec-perf","sha":"8724c392b668fd59924d03b8de7386e5dcbfe4fb","user":{"login":"lumag","id":20323,"avatar_url":"https://avatars2.githubusercontent.com/u/20323?v=4","gravatar_id":"","url":"https://api.github.com/users/lumag","html_url":"https://github.com/lumag","followers_url":"https://api.github.com/users/lumag/followers","following_url":"https://api.github.com/users/lumag/following{/other_user}","gists_url":"https://api.github.com/users/lumag/gists{/gist_id}","starred_url":"https://api.github.com/users/lumag/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lumag/subscriptions","organizations_url":"https://api.github.com/users/lumag/orgs","repos_url":"https://api.github.com/users/lumag/repos","events_url":"https://api.github.com/users/lumag/events{/privacy}","received_events_url":"https://api.github.com/users/lumag/received_events","type":"User","site_admin":false},"repo":{"id":87109113,"name":"odp","full_name":"lumag/odp","owner":{"login":"lumag","id":20323,"avatar_url":"https://avatars2.githubusercontent.com/u/20323?v=4","gravatar_id":"","url":"https://api.github.com/users/lumag","html_url":"https://github.com/lumag","followers_url":"https://api.github.com/users/lumag/followers","following_url":"https://api.github.com/users/lumag/following{/other_user}","gists_url":"https://api.github.com/users/lumag/gists{/gist_id}","starred_url":"https://api.github.com/users/lumag/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lumag/subscriptions","organizations_url":"https://api.github.com/users/lumag/orgs","repos_url":"https://api.github.com/users/lumag/repos","events_url":"https://api.github.com/users/lumag/events{/privacy}","received_events_url":"https://api.github.com/users/lumag/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/lumag/odp","description":"The ODP project is an open-source, cross-platform set of application programming interfaces (APIs) for the networking data plane","fork":true,"url":"https://api.github.com/repos/lumag/odp","forks_url":"https://api.github.com/repos/lumag/odp/forks","keys_url":"https://api.github.com/repos/lumag/odp/keys{/key_id}","collaborators_url":"https://api.github.com/repos/lumag/odp/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/lumag/odp/teams","hooks_url":"https://api.github.com/repos/lumag/odp/hooks","issue_events_url":"https://api.github.com/repos/lumag/odp/issues/events{/number}","events_url":"https://api.github.com/repos/lumag/odp/events","assignees_url":"https://api.github.com/repos/lumag/odp/assignees{/user}","branches_url":"https://api.github.com/repos/lumag/odp/branches{/branch}","tags_url":"https://api.github.com/repos/lumag/odp/tags","blobs_url":"https://api.github.com/repos/lumag/odp/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/lumag/odp/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/lumag/odp/git/refs{/sha}","trees_url":"https://api.github.com/repos/lumag/odp/git/trees{/sha}","statuses_url":"https://api.github.com/repos/lumag/odp/statuses/{sha}","languages_url":"https://api.github.com/repos/lumag/odp/languages","stargazers_url":"https://api.github.com/repos/lumag/odp/stargazers","contributors_url":"https://api.github.com/repos/lumag/odp/contributors","subscribers_url":"https://api.github.com/repos/lumag/odp/subscribers","subscription_url":"https://api.github.com/repos/lumag/odp/subscription","commits_url":"https://api.github.com/repos/lumag/odp/commits{/sha}","git_commits_url":"https://api.github.com/repos/lumag/odp/git/commits{/sha}","comments_url":"https://api.github.com/repos/lumag/odp/comments{/number}","issue_comment_url":"https://api.github.com/repos/lumag/odp/issues/comments{/number}","contents_url":"https://api.github.com/repos/lumag/odp/contents/{+path}","compare_url":"https://api.github.com/repos/lumag/odp/compare/{base}...{head}","merges_url":"https://api.github.com/repos/lumag/odp/merges","archive_url":"https://api.github.com/repos/lumag/odp/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/lumag/odp/downloads","issues_url":"https://api.github.com/repos/lumag/odp/issues{/number}","pulls_url":"https://api.github.com/repos/lumag/odp/pulls{/number}","milestones_url":"https://api.github.com/repos/lumag/odp/milestones{/number}","notifications_url":"https://api.github.com/repos/lumag/odp/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/lumag/odp/labels{/name}","releases_url":"https://api.github.com/repos/lumag/odp/releases{/id}","deployments_url":"https://api.github.com/repos/lumag/odp/deployments","created_at":"2017-04-03T18:50:14Z","updated_at":"2017-04-03T18:50:17Z","pushed_at":"2018-03-15T13:53:35Z","git_url":"git://github.com/lumag/odp.git","ssh_url":"git@github.com:lumag/odp.git","clone_url":"https://github.com/lumag/odp.git","svn_url":"https://github.com/lumag/odp","homepage":"http://www.opendataplane.org/","size":10500,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"Linaro:master","ref":"master","sha":"eca5df13cf7987d6e3cd3cc930851671b071e4b3","user":{"login":"Linaro","id":1180626,"avatar_url":"https://avatars0.githubusercontent.com/u/1180626?v=4","gravatar_id":"","url":"https://api.github.com/users/Linaro","html_url":"https://github.com/Linaro","followers_url":"https://api.github.com/users/Linaro/followers","following_url":"https://api.github.com/users/Linaro/following{/other_user}","gists_url":"https://api.github.com/users/Linaro/gists{/gist_id}","starred_url":"https://api.github.com/users/Linaro/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Linaro/subscriptions","organizations_url":"https://api.github.com/users/Linaro/orgs","repos_url":"https://api.github.com/users/Linaro/repos","events_url":"https://api.github.com/users/Linaro/events{/privacy}","received_events_url":"https://api.github.com/users/Linaro/received_events","type":"Organization","site_admin":false},"repo":{"id":79130215,"name":"odp","full_name":"Linaro/odp","owner":{"login":"Linaro","id":1180626,"avatar_url":"https://avatars0.githubusercontent.com/u/1180626?v=4","gravatar_id":"","url":"https://api.github.com/users/Linaro","html_url":"https://github.com/Linaro","followers_url":"https://api.github.com/users/Linaro/followers","following_url":"https://api.github.com/users/Linaro/following{/other_user}","gists_url":"https://api.github.com/users/Linaro/gists{/gist_id}","starred_url":"https://api.github.com/users/Linaro/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Linaro/subscriptions","organizations_url":"https://api.github.com/users/Linaro/orgs","repos_url":"https://api.github.com/users/Linaro/repos","events_url":"https://api.github.com/users/Linaro/events{/privacy}","received_events_url":"https://api.github.com/users/Linaro/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Linaro/odp","description":"The ODP project is an open-source, cross-platform set of application programming interfaces (APIs) for the networking data plane","fork":false,"url":"https://api.github.com/repos/Linaro/odp","forks_url":"https://api.github.com/repos/Linaro/odp/forks","keys_url":"https://api.github.com/repos/Linaro/odp/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Linaro/odp/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Linaro/odp/teams","hooks_url":"https://api.github.com/repos/Linaro/odp/hooks","issue_events_url":"https://api.github.com/repos/Linaro/odp/issues/events{/number}","events_url":"https://api.github.com/repos/Linaro/odp/events","assignees_url":"https://api.github.com/repos/Linaro/odp/assignees{/user}","branches_url":"https://api.github.com/repos/Linaro/odp/branches{/branch}","tags_url":"https://api.github.com/repos/Linaro/odp/tags","blobs_url":"https://api.github.com/repos/Linaro/odp/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Linaro/odp/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Linaro/odp/git/refs{/sha}","trees_url":"https://api.github.com/repos/Linaro/odp/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Linaro/odp/statuses/{sha}","languages_url":"https://api.github.com/repos/Linaro/odp/languages","stargazers_url":"https://api.github.com/repos/Linaro/odp/stargazers","contributors_url":"https://api.github.com/repos/Linaro/odp/contributors","subscribers_url":"https://api.github.com/repos/Linaro/odp/subscribers","subscription_url":"https://api.github.com/repos/Linaro/odp/subscription","commits_url":"https://api.github.com/repos/Linaro/odp/commits{/sha}","git_commits_url":"https://api.github.com/repos/Linaro/odp/git/commits{/sha}","comments_url":"https://api.github.com/repos/Linaro/odp/comments{/number}","issue_comment_url":"https://api.github.com/repos/Linaro/odp/issues/comments{/number}","contents_url":"https://api.github.com/repos/Linaro/odp/contents/{+path}","compare_url":"https://api.github.com/repos/Linaro/odp/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Linaro/odp/merges","archive_url":"https://api.github.com/repos/Linaro/odp/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Linaro/odp/downloads","issues_url":"https://api.github.com/repos/Linaro/odp/issues{/number}","pulls_url":"https://api.github.com/repos/Linaro/odp/pulls{/number}","milestones_url":"https://api.github.com/repos/Linaro/odp/milestones{/number}","notifications_url":"https://api.github.com/repos/Linaro/odp/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Linaro/odp/labels{/name}","releases_url":"https://api.github.com/repos/Linaro/odp/releases{/id}","deployments_url":"https://api.github.com/repos/Linaro/odp/deployments","created_at":"2017-01-16T15:11:12Z","updated_at":"2018-03-16T12:17:17Z","pushed_at":"2018-03-16T12:17:14Z","git_url":"git://github.com/Linaro/odp.git","ssh_url":"git@github.com:Linaro/odp.git","clone_url":"https://github.com/Linaro/odp.git","svn_url":"https://github.com/Linaro/odp","homepage":"http://www.opendataplane.org/","size":10914,"stargazers_count":39,"watchers_count":39,"language":"C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":47,"mirror_url":null,"archived":false,"open_issues_count":18,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":47,"open_issues":18,"watchers":39,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Linaro/odp/pulls/529"},"html":{"href":"https://github.com/Linaro/odp/pull/529"},"issue":{"href":"https://api.github.com/repos/Linaro/odp/issues/529"},"comments":{"href":"https://api.github.com/repos/Linaro/odp/issues/529/comments"},"review_comments":{"href":"https://api.github.com/repos/Linaro/odp/pulls/529/comments"},"review_comment":{"href":"https://api.github.com/repos/Linaro/odp/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Linaro/odp/pulls/529/commits"},"statuses":{"href":"https://api.github.com/repos/Linaro/odp/statuses/8724c392b668fd59924d03b8de7386e5dcbfe4fb"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"muvarov"}}