get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/27990/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 27990,
    "url": "http://patches.dpdk.org/api/patches/27990/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1503673046-30651-6-git-send-email-radu.nicolau@intel.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1503673046-30651-6-git-send-email-radu.nicolau@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1503673046-30651-6-git-send-email-radu.nicolau@intel.com",
    "date": "2017-08-25T14:57:26",
    "name": "[dpdk-dev,RFC,5/5] examples/ipsec-secgw: enabled inline ipsec",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "4e773f3473680a6437cee30c57e7cab98b4e47b0",
    "submitter": {
        "id": 743,
        "url": "http://patches.dpdk.org/api/people/743/?format=api",
        "name": "Radu Nicolau",
        "email": "radu.nicolau@intel.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1503673046-30651-6-git-send-email-radu.nicolau@intel.com/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/27990/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/27990/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id E16517D8F;\n\tFri, 25 Aug 2017 17:01:25 +0200 (CEST)",
            "from mga07.intel.com (mga07.intel.com [134.134.136.100])\n\tby dpdk.org (Postfix) with ESMTP id 946B87D6F\n\tfor <dev@dpdk.org>; Fri, 25 Aug 2017 17:01:22 +0200 (CEST)",
            "from fmsmga005.fm.intel.com ([10.253.24.32])\n\tby orsmga105.jf.intel.com with ESMTP; 25 Aug 2017 08:01:22 -0700",
            "from silpixa00383879.ir.intel.com (HELO\n\tsilpixa00383879.ger.corp.intel.com) ([10.237.223.127])\n\tby fmsmga005.fm.intel.com with ESMTP; 25 Aug 2017 08:01:20 -0700"
        ],
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.41,426,1498546800\"; d=\"scan'208\";a=\"143899030\"",
        "From": "Radu Nicolau <radu.nicolau@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "Radu Nicolau <radu.nicolau@intel.com>",
        "Date": "Fri, 25 Aug 2017 15:57:26 +0100",
        "Message-Id": "<1503673046-30651-6-git-send-email-radu.nicolau@intel.com>",
        "X-Mailer": "git-send-email 2.7.5",
        "In-Reply-To": "<1503673046-30651-1-git-send-email-radu.nicolau@intel.com>",
        "References": "<1503673046-30651-1-git-send-email-radu.nicolau@intel.com>",
        "Subject": "[dpdk-dev] [RFC PATCH 5/5] examples/ipsec-secgw: enabled inline\n\tipsec",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Signed-off-by: Radu Nicolau <radu.nicolau@intel.com>\n---\n examples/ipsec-secgw/esp.c   | 26 ++++++++++++++++--\n examples/ipsec-secgw/ipsec.c | 61 +++++++++++++++++++++++++++++++++++------\n examples/ipsec-secgw/ipsec.h |  2 ++\n examples/ipsec-secgw/sa.c    | 65 +++++++++++++++++++++++++++++++-------------\n 4 files changed, 123 insertions(+), 31 deletions(-)",
    "diff": "diff --git a/examples/ipsec-secgw/esp.c b/examples/ipsec-secgw/esp.c\nindex 70bb81f..77ab232 100644\n--- a/examples/ipsec-secgw/esp.c\n+++ b/examples/ipsec-secgw/esp.c\n@@ -58,6 +58,9 @@ esp_inbound(struct rte_mbuf *m, struct ipsec_sa *sa,\n \tstruct rte_crypto_sym_op *sym_cop;\n \tint32_t payload_len, ip_hdr_len;\n \n+\tif (sa->type == RTE_SECURITY_SESS_ETH_INLINE_CRYPTO)\n+\t\treturn 0;\n+\n \tRTE_ASSERT(m != NULL);\n \tRTE_ASSERT(sa != NULL);\n \tRTE_ASSERT(cop != NULL);\n@@ -175,6 +178,16 @@ esp_inbound_post(struct rte_mbuf *m, struct ipsec_sa *sa,\n \tRTE_ASSERT(sa != NULL);\n \tRTE_ASSERT(cop != NULL);\n \n+\n+\tif (sa->type == RTE_SECURITY_SESS_ETH_INLINE_CRYPTO) {\n+\t\tif (m->ol_flags & PKT_RX_SECURITY_OFFLOAD\n+\t\t\t\t&& m->ol_flags & PKT_RX_SECURITY_OFFLOAD_FAILED)\n+\t\t\tcop->status = RTE_CRYPTO_OP_STATUS_ERROR;\n+\t\telse\n+\t\t\tcop->status = RTE_CRYPTO_OP_STATUS_SUCCESS;\n+\t}\n+\n+\n \tif (cop->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {\n \t\tRTE_LOG(ERR, IPSEC_ESP, \"failed crypto op\\n\");\n \t\treturn -1;\n@@ -321,6 +334,9 @@ esp_outbound(struct rte_mbuf *m, struct ipsec_sa *sa,\n \tesp->spi = rte_cpu_to_be_32(sa->spi);\n \tesp->seq = rte_cpu_to_be_32((uint32_t)sa->seq);\n \n+\tif (sa->type == RTE_SECURITY_SESS_ETH_INLINE_CRYPTO)\n+\t\treturn 0;\n+\n \tuint64_t *iv = (uint64_t *)(esp + 1);\n \n \tsym_cop = get_sym_cop(cop);\n@@ -419,9 +435,13 @@ esp_outbound_post(struct rte_mbuf *m __rte_unused,\n \tRTE_ASSERT(sa != NULL);\n \tRTE_ASSERT(cop != NULL);\n \n-\tif (cop->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {\n-\t\tRTE_LOG(ERR, IPSEC_ESP, \"Failed crypto op\\n\");\n-\t\treturn -1;\n+\tif (sa->type == RTE_SECURITY_SESS_ETH_INLINE_CRYPTO) {\n+\t\tm->ol_flags |= PKT_TX_SECURITY_OFFLOAD;\n+\t} else {\n+\t\tif (cop->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {\n+\t\t\tRTE_LOG(ERR, IPSEC_ESP, \"Failed crypto op\\n\");\n+\t\t\treturn -1;\n+\t\t}\n \t}\n \n \treturn 0;\ndiff --git a/examples/ipsec-secgw/ipsec.c b/examples/ipsec-secgw/ipsec.c\nindex c8fde1c..b14b23d 100644\n--- a/examples/ipsec-secgw/ipsec.c\n+++ b/examples/ipsec-secgw/ipsec.c\n@@ -58,13 +58,17 @@ create_session(struct ipsec_ctx *ipsec_ctx, struct ipsec_sa *sa)\n \tkey.cipher_algo = (uint8_t)sa->cipher_algo;\n \tkey.auth_algo = (uint8_t)sa->auth_algo;\n \n-\tret = rte_hash_lookup_data(ipsec_ctx->cdev_map, &key,\n-\t\t\t(void **)&cdev_id_qp);\n-\tif (ret < 0) {\n-\t\tRTE_LOG(ERR, IPSEC, \"No cryptodev: core %u, cipher_algo %u, \"\n-\t\t\t\t\"auth_algo %u\\n\", key.lcore_id, key.cipher_algo,\n-\t\t\t\tkey.auth_algo);\n-\t\treturn -1;\n+\tif (sa->type == RTE_SECURITY_SESS_NONE) {\n+\t\tret = rte_hash_lookup_data(ipsec_ctx->cdev_map, &key,\n+\t\t\t\t(void **)&cdev_id_qp);\n+\t\tif (ret < 0) {\n+\t\t\tRTE_LOG(ERR, IPSEC, \"No cryptodev: core %u, \"\n+\t\t\t\t\t\"cipher_algo %u, \"\n+\t\t\t\t\t\"auth_algo %u\\n\",\n+\t\t\t\t\tkey.lcore_id, key.cipher_algo,\n+\t\t\t\t\tkey.auth_algo);\n+\t\t\treturn -1;\n+\t\t}\n \t}\n \n \tRTE_LOG_DP(DEBUG, IPSEC, \"Create session for SA spi %u on cryptodev \"\n@@ -79,7 +83,8 @@ create_session(struct ipsec_ctx *ipsec_ctx, struct ipsec_sa *sa)\n \t\t\t\tsa->crypto_session, sa->xforms,\n \t\t\t\tipsec_ctx->session_pool);\n \n-\t\trte_cryptodev_info_get(ipsec_ctx->tbl[cdev_id_qp].id, &cdev_info);\n+\t\trte_cryptodev_info_get(ipsec_ctx->tbl[cdev_id_qp].id,\n+\t\t\t\t&cdev_info);\n \t\tif (cdev_info.sym.max_nb_sessions_per_qp > 0) {\n \t\t\tret = rte_cryptodev_queue_pair_attach_sym_session(\n \t\t\t\t\tipsec_ctx->tbl[cdev_id_qp].id,\n@@ -146,6 +151,7 @@ ipsec_enqueue(ipsec_xform_fn xform_func, struct ipsec_ctx *ipsec_ctx,\n \tstruct ipsec_mbuf_metadata *priv;\n \tstruct rte_crypto_sym_op *sym_cop;\n \tstruct ipsec_sa *sa;\n+\tstruct cdev_qp *cqp;\n \n \tfor (i = 0; i < nb_pkts; i++) {\n \t\tif (unlikely(sas[i] == NULL)) {\n@@ -202,8 +208,31 @@ ipsec_enqueue(ipsec_xform_fn xform_func, struct ipsec_ctx *ipsec_ctx,\n \t\t\t}\n \t\t\tbreak;\n \t\tcase RTE_SECURITY_SESS_ETH_PROTO_OFFLOAD:\n-\t\tcase RTE_SECURITY_SESS_ETH_INLINE_CRYPTO:\n \t\t\tbreak;\n+\t\tcase RTE_SECURITY_SESS_ETH_INLINE_CRYPTO:\n+\t\t\tpriv->cop.type = RTE_CRYPTO_OP_TYPE_SYMMETRIC;\n+\t\t\tpriv->cop.status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;\n+\n+\t\t\trte_prefetch0(&priv->sym_cop);\n+\n+\t\t\tif ((unlikely(sa->sec_session == NULL)) &&\n+\t\t\t\t\tcreate_session(ipsec_ctx, sa)) {\n+\t\t\t\trte_pktmbuf_free(pkts[i]);\n+\t\t\t\tcontinue;\n+\t\t\t}\n+\n+\t\t\trte_security_attach_session(&priv->cop,\n+\t\t\t\t\tsa->sec_session);\n+\n+\t\t\tret = xform_func(pkts[i], sa, &priv->cop);\n+\t\t\tif (unlikely(ret)) {\n+\t\t\t\trte_pktmbuf_free(pkts[i]);\n+\t\t\t\tcontinue;\n+\t\t\t}\n+\n+\t\t\tcqp = &ipsec_ctx->tbl[sa->cdev_id_qp];\n+\t\t\tcqp->ol_pkts[cqp->ol_pkts_cnt++] = pkts[i];\n+\t\t\tcontinue;\n \t\t}\n \n \t\tRTE_ASSERT(sa->cdev_id_qp < ipsec_ctx->nb_qps);\n@@ -228,6 +257,20 @@ ipsec_dequeue(ipsec_xform_fn xform_func, struct ipsec_ctx *ipsec_ctx,\n \t\tif (ipsec_ctx->last_qp == ipsec_ctx->nb_qps)\n \t\t\tipsec_ctx->last_qp %= ipsec_ctx->nb_qps;\n \n+\n+\t\twhile (cqp->ol_pkts_cnt > 0 && nb_pkts < max_pkts) {\n+\t\t\tpkt = cqp->ol_pkts[--cqp->ol_pkts_cnt];\n+\t\t\trte_prefetch0(pkt);\n+\t\t\tpriv = get_priv(pkt);\n+\t\t\tsa = priv->sa;\n+\t\t\tret = xform_func(pkt, sa, &priv->cop);\n+\t\t\tif (unlikely(ret)) {\n+\t\t\t\trte_pktmbuf_free(pkt);\n+\t\t\t\tcontinue;\n+\t\t\t}\n+\t\t\tpkts[nb_pkts++] = pkt;\n+\t\t}\n+\n \t\tif (cqp->in_flight == 0)\n \t\t\tcontinue;\n \ndiff --git a/examples/ipsec-secgw/ipsec.h b/examples/ipsec-secgw/ipsec.h\nindex 6291d86..685304b 100644\n--- a/examples/ipsec-secgw/ipsec.h\n+++ b/examples/ipsec-secgw/ipsec.h\n@@ -142,6 +142,8 @@ struct cdev_qp {\n \tuint16_t in_flight;\n \tuint16_t len;\n \tstruct rte_crypto_op *buf[MAX_PKT_BURST] __rte_aligned(sizeof(void *));\n+\tstruct rte_mbuf *ol_pkts[MAX_PKT_BURST] __rte_aligned(sizeof(void *));\n+\tuint16_t ol_pkts_cnt;\n };\n \n struct ipsec_ctx {\ndiff --git a/examples/ipsec-secgw/sa.c b/examples/ipsec-secgw/sa.c\nindex 851262b..11b31d0 100644\n--- a/examples/ipsec-secgw/sa.c\n+++ b/examples/ipsec-secgw/sa.c\n@@ -613,11 +613,13 @@ parse_sa_tokens(char **tokens, uint32_t n_tokens,\n \t\tif (status->status < 0)\n \t\t\treturn;\n \t} else {\n-\t\tAPP_CHECK(cipher_algo_p == 1, status, \"missing cipher or AEAD options\");\n+\t\tAPP_CHECK(cipher_algo_p == 1, status,\n+\t\t\t  \"missing cipher or AEAD options\");\n \t\tif (status->status < 0)\n \t\t\treturn;\n \n-\t\tAPP_CHECK(auth_algo_p == 1, status, \"missing auth or AEAD options\");\n+\t\tAPP_CHECK(auth_algo_p == 1, status,\n+\t\t\t\"missing auth or AEAD options\");\n \t\tif (status->status < 0)\n \t\t\treturn;\n \t}\n@@ -763,14 +765,31 @@ sa_add_rules(struct sa_ctx *sa_ctx, const struct ipsec_sa entries[],\n \t\t\tsa->dst.ip.ip4 = rte_cpu_to_be_32(sa->dst.ip.ip4);\n \t\t}\n \n-\t\tif (sa->type == RTE_SECURITY_SESS_CRYPTO_PROTO_OFFLOAD) {\n-\t\t\tsa_ctx->xf[idx].c.cipher_alg = sa->cipher_algo;\n-\t\t\tsa_ctx->xf[idx].c.auth_alg = sa->auth_algo;\n-\t\t\tsa_ctx->xf[idx].c.cipher_key.data = sa->cipher_key;\n-\t\t\tsa_ctx->xf[idx].c.auth_key.data = sa->auth_key;\n-\t\t\tsa_ctx->xf[idx].c.cipher_key.length =\n+\t\tif (sa->type == RTE_SECURITY_SESS_CRYPTO_PROTO_OFFLOAD ||\n+\t\t\tsa->type == RTE_SECURITY_SESS_ETH_INLINE_CRYPTO) {\n+\n+\t\t\tif (sa->aead_algo == RTE_CRYPTO_AEAD_AES_GCM) {\n+\t\t\t\tsa_ctx->xf[idx].c.aead_alg =\n+\t\t\t\t\t\tsa->aead_algo;\n+\t\t\t\tsa_ctx->xf[idx].c.aead_key.data =\n+\t\t\t\t\t\tsa->cipher_key;\n+\t\t\t\tsa_ctx->xf[idx].c.aead_key.length =\n+\t\t\t\t\t\tsa->cipher_key_len;\n+\n+\t\t\t} else {\n+\t\t\t\tsa_ctx->xf[idx].c.cipher_alg = sa->cipher_algo;\n+\t\t\t\tsa_ctx->xf[idx].c.auth_alg = sa->auth_algo;\n+\t\t\t\tsa_ctx->xf[idx].c.cipher_key.data =\n+\t\t\t\t\t\tsa->cipher_key;\n+\t\t\t\tsa_ctx->xf[idx].c.auth_key.data =\n+\t\t\t\t\t\tsa->auth_key;\n+\t\t\t\tsa_ctx->xf[idx].c.cipher_key.length =\n \t\t\t\t\t\tsa->cipher_key_len;\n-\t\t\tsa_ctx->xf[idx].c.auth_key.length = sa->auth_key_len;\n+\t\t\t\tsa_ctx->xf[idx].c.auth_key.length =\n+\t\t\t\t\t\tsa->auth_key_len;\n+\t\t\t\tsa_ctx->xf[idx].c.salt = sa->salt;\n+\t\t\t}\n+\n \t\t\tsa_ctx->xf[idx].c.op = (inbound == 1)?\n \t\t\t\t\t\tRTE_SECURITY_IPSEC_OP_DECAP :\n \t\t\t\t\t\tRTE_SECURITY_IPSEC_OP_ENCAP;\n@@ -835,9 +854,11 @@ sa_add_rules(struct sa_ctx *sa_ctx, const struct ipsec_sa entries[],\n \t\t\t}\n \n \t\t\tif (inbound) {\n-\t\t\t\tsa_ctx->xf[idx].b.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\t\t\t\tsa_ctx->xf[idx].b.type =\n+\t\t\t\t\t\tRTE_CRYPTO_SYM_XFORM_CIPHER;\n \t\t\t\tsa_ctx->xf[idx].b.cipher.algo = sa->cipher_algo;\n-\t\t\t\tsa_ctx->xf[idx].b.cipher.key.data = sa->cipher_key;\n+\t\t\t\tsa_ctx->xf[idx].b.cipher.key.data =\n+\t\t\t\t\t\tsa->cipher_key;\n \t\t\t\tsa_ctx->xf[idx].b.cipher.key.length =\n \t\t\t\t\tsa->cipher_key_len;\n \t\t\t\tsa_ctx->xf[idx].b.cipher.op =\n@@ -846,7 +867,8 @@ sa_add_rules(struct sa_ctx *sa_ctx, const struct ipsec_sa entries[],\n \t\t\t\tsa_ctx->xf[idx].b.cipher.iv.offset = IV_OFFSET;\n \t\t\t\tsa_ctx->xf[idx].b.cipher.iv.length = iv_length;\n \n-\t\t\t\tsa_ctx->xf[idx].a.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n+\t\t\t\tsa_ctx->xf[idx].a.type =\n+\t\t\t\t\t\tRTE_CRYPTO_SYM_XFORM_AUTH;\n \t\t\t\tsa_ctx->xf[idx].a.auth.algo = sa->auth_algo;\n \t\t\t\tsa_ctx->xf[idx].a.auth.key.data = sa->auth_key;\n \t\t\t\tsa_ctx->xf[idx].a.auth.key.length =\n@@ -856,9 +878,11 @@ sa_add_rules(struct sa_ctx *sa_ctx, const struct ipsec_sa entries[],\n \t\t\t\tsa_ctx->xf[idx].a.auth.op =\n \t\t\t\t\tRTE_CRYPTO_AUTH_OP_VERIFY;\n \t\t\t} else { /* outbound */\n-\t\t\t\tsa_ctx->xf[idx].a.type = RTE_CRYPTO_SYM_XFORM_CIPHER;\n+\t\t\t\tsa_ctx->xf[idx].a.type =\n+\t\t\t\t\tRTE_CRYPTO_SYM_XFORM_CIPHER;\n \t\t\t\tsa_ctx->xf[idx].a.cipher.algo = sa->cipher_algo;\n-\t\t\t\tsa_ctx->xf[idx].a.cipher.key.data = sa->cipher_key;\n+\t\t\t\tsa_ctx->xf[idx].a.cipher.key.data =\n+\t\t\t\t\tsa->cipher_key;\n \t\t\t\tsa_ctx->xf[idx].a.cipher.key.length =\n \t\t\t\t\tsa->cipher_key_len;\n \t\t\t\tsa_ctx->xf[idx].a.cipher.op =\n@@ -867,9 +891,12 @@ sa_add_rules(struct sa_ctx *sa_ctx, const struct ipsec_sa entries[],\n \t\t\t\tsa_ctx->xf[idx].a.cipher.iv.offset = IV_OFFSET;\n \t\t\t\tsa_ctx->xf[idx].a.cipher.iv.length = iv_length;\n \n-\t\t\t\tsa_ctx->xf[idx].b.type = RTE_CRYPTO_SYM_XFORM_AUTH;\n-\t\t\t\tsa_ctx->xf[idx].b.auth.algo = sa->auth_algo;\n-\t\t\t\tsa_ctx->xf[idx].b.auth.key.data = sa->auth_key;\n+\t\t\t\tsa_ctx->xf[idx].b.type =\n+\t\t\t\t\tRTE_CRYPTO_SYM_XFORM_AUTH;\n+\t\t\t\tsa_ctx->xf[idx].b.auth.algo =\n+\t\t\t\t\tsa->auth_algo;\n+\t\t\t\tsa_ctx->xf[idx].b.auth.key.data =\n+\t\t\t\t\t\tsa->auth_key;\n \t\t\t\tsa_ctx->xf[idx].b.auth.key.length =\n \t\t\t\t\tsa->auth_key_len;\n \t\t\t\tsa_ctx->xf[idx].b.auth.digest_length =\n@@ -991,8 +1018,8 @@ single_inbound_lookup(struct ipsec_sa *sadb, struct rte_mbuf *pkt,\n \tcase IP6_TUNNEL:\n \t\tsrc6_addr = RTE_PTR_ADD(ip, offsetof(struct ip6_hdr, ip6_src));\n \t\tif ((ip->ip_v == IP6_VERSION) &&\n-\t\t\t\t!memcmp(&sa->src.ip.ip6.ip6, src6_addr, 16) &&\n-\t\t\t\t!memcmp(&sa->dst.ip.ip6.ip6, src6_addr + 16, 16))\n+\t\t\t!memcmp(&sa->src.ip.ip6.ip6, src6_addr, 16) &&\n+\t\t\t!memcmp(&sa->dst.ip.ip6.ip6, src6_addr + 16, 16))\n \t\t\t*sa_ret = sa;\n \t\tbreak;\n \tcase TRANSPORT:\n",
    "prefixes": [
        "dpdk-dev",
        "RFC",
        "5/5"
    ]
}