Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/95815/?format=api
http://patches.dpdk.org/api/patches/95815/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/patch/20210713133542.3550525-11-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": "<20210713133542.3550525-11-radu.nicolau@intel.com>", "list_archive_url": "https://inbox.dpdk.org/dev/20210713133542.3550525-11-radu.nicolau@intel.com", "date": "2021-07-13T13:35:42", "name": "[10/10] ipsec: add ol_flags support", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": true, "hash": "d94f3095ed309cd7d0ecd88707a18f417385d68e", "submitter": { "id": 743, "url": "http://patches.dpdk.org/api/people/743/?format=api", "name": "Radu Nicolau", "email": "radu.nicolau@intel.com" }, "delegate": { "id": 6690, "url": "http://patches.dpdk.org/api/users/6690/?format=api", "username": "akhil", "first_name": "akhil", "last_name": "goyal", "email": "gakhil@marvell.com" }, "mbox": "http://patches.dpdk.org/project/dpdk/patch/20210713133542.3550525-11-radu.nicolau@intel.com/mbox/", "series": [ { "id": 17806, "url": "http://patches.dpdk.org/api/series/17806/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=17806", "date": "2021-07-13T13:35:32", "name": "new features for ipsec and security libraries", "version": 1, "mbox": "http://patches.dpdk.org/series/17806/mbox/" } ], "comments": "http://patches.dpdk.org/api/patches/95815/comments/", "check": "fail", "checks": "http://patches.dpdk.org/api/patches/95815/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<dev-bounces@dpdk.org>", "X-Original-To": "patchwork@inbox.dpdk.org", "Delivered-To": "patchwork@inbox.dpdk.org", "Received": [ "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 0FFE3A0C4F;\n\tTue, 13 Jul 2021 15:47:57 +0200 (CEST)", "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 69E4A412BD;\n\tTue, 13 Jul 2021 15:47:16 +0200 (CEST)", "from mga12.intel.com (mga12.intel.com [192.55.52.136])\n by mails.dpdk.org (Postfix) with ESMTP id BD8DD412EE\n for <dev@dpdk.org>; Tue, 13 Jul 2021 15:47:14 +0200 (CEST)", "from orsmga007.jf.intel.com ([10.7.209.58])\n by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 13 Jul 2021 06:47:14 -0700", "from silpixa00400884.ir.intel.com ([10.243.22.82])\n by orsmga007.jf.intel.com with ESMTP; 13 Jul 2021 06:47:12 -0700" ], "X-IronPort-AV": [ "E=McAfee;i=\"6200,9189,10043\"; a=\"189847584\"", "E=Sophos;i=\"5.84,236,1620716400\"; d=\"scan'208\";a=\"189847584\"", "E=Sophos;i=\"5.84,236,1620716400\"; d=\"scan'208\";a=\"451761793\"" ], "X-ExtLoop1": "1", "From": "Radu Nicolau <radu.nicolau@intel.com>", "To": "Konstantin Ananyev <konstantin.ananyev@intel.com>,\n Bernard Iremonger <bernard.iremonger@intel.com>,\n Vladimir Medvedkin <vladimir.medvedkin@intel.com>", "Cc": "dev@dpdk.org, Radu Nicolau <radu.nicolau@intel.com>,\n Declan Doherty <declan.doherty@intel.com>,\n Abhijit Sinha <abhijit.sinha@intel.com>,\n Daniel Martin Buckley <daniel.m.buckley@intel.com>", "Date": "Tue, 13 Jul 2021 14:35:42 +0100", "Message-Id": "<20210713133542.3550525-11-radu.nicolau@intel.com>", "X-Mailer": "git-send-email 2.25.1", "In-Reply-To": "<20210713133542.3550525-1-radu.nicolau@intel.com>", "References": "<20210713133542.3550525-1-radu.nicolau@intel.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[dpdk-dev] [PATCH 10/10] ipsec: add ol_flags support", "X-BeenThere": "dev@dpdk.org", "X-Mailman-Version": "2.1.29", "Precedence": "list", "List-Id": "DPDK patches and discussions <dev.dpdk.org>", "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>", "List-Archive": "<http://mails.dpdk.org/archives/dev/>", "List-Post": "<mailto:dev@dpdk.org>", "List-Help": "<mailto:dev-request@dpdk.org?subject=help>", "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>", "Errors-To": "dev-bounces@dpdk.org", "Sender": "\"dev\" <dev-bounces@dpdk.org>" }, "content": "Set mbuff->ol_flags for IPsec packets.\n\nSigned-off-by: Declan Doherty <declan.doherty@intel.com>\nSigned-off-by: Radu Nicolau <radu.nicolau@intel.com>\nSigned-off-by: Abhijit Sinha <abhijit.sinha@intel.com>\nSigned-off-by: Daniel Martin Buckley <daniel.m.buckley@intel.com>\n---\n lib/ipsec/esp_inb.c | 17 ++++++++++++--\n lib/ipsec/esp_outb.c | 48 ++++++++++++++++++++++++++++++---------\n lib/ipsec/rte_ipsec_sa.h | 3 ++-\n lib/ipsec/sa.c | 49 ++++++++++++++++++++++++++++++++++++++--\n lib/ipsec/sa.h | 8 +++++++\n 5 files changed, 109 insertions(+), 16 deletions(-)", "diff": "diff --git a/lib/ipsec/esp_inb.c b/lib/ipsec/esp_inb.c\nindex 8cb4c16302..5fcb41297e 100644\n--- a/lib/ipsec/esp_inb.c\n+++ b/lib/ipsec/esp_inb.c\n@@ -559,7 +559,8 @@ trs_process_step3(struct rte_mbuf *mb)\n * - tx_offload\n */\n static inline void\n-tun_process_step3(struct rte_mbuf *mb, uint64_t txof_msk, uint64_t txof_val)\n+tun_process_step3(struct rte_mbuf *mb, uint8_t is_ipv4, uint64_t txof_msk,\n+\tuint64_t txof_val)\n {\n \t/* reset mbuf metatdata: L2/L3 len, packet type */\n \tmb->packet_type = RTE_PTYPE_UNKNOWN;\n@@ -567,6 +568,14 @@ tun_process_step3(struct rte_mbuf *mb, uint64_t txof_msk, uint64_t txof_val)\n \n \t/* clear the PKT_RX_SEC_OFFLOAD flag if set */\n \tmb->ol_flags &= ~PKT_RX_SEC_OFFLOAD;\n+\n+\tif (is_ipv4) {\n+\t\tmb->l3_len = sizeof(struct rte_ipv4_hdr);\n+\t\tmb->ol_flags |= (PKT_TX_IPV4 | PKT_TX_IP_CKSUM);\n+\t} else {\n+\t\tmb->l3_len = sizeof(struct rte_ipv6_hdr);\n+\t\tmb->ol_flags |= PKT_TX_IPV6;\n+\t}\n }\n \n /*\n@@ -618,8 +627,12 @@ tun_process(const struct rte_ipsec_sa *sa, struct rte_mbuf *mb[],\n \t\t\tupdate_tun_inb_l3hdr(sa, outh, inh);\n \n \t\t\t/* update mbuf's metadata */\n-\t\t\ttun_process_step3(mb[i], sa->tx_offload.msk,\n+\t\t\ttun_process_step3(mb[i],\n+\t\t\t\t(sa->type & RTE_IPSEC_SATP_IPV_MASK) ==\n+\t\t\t\t\tRTE_IPSEC_SATP_IPV4 ? 1 : 0,\n+\t\t\t\tsa->tx_offload.msk,\n \t\t\t\tsa->tx_offload.val);\n+\n \t\t\tk++;\n \t\t} else\n \t\t\tdr[i - k] = i;\ndiff --git a/lib/ipsec/esp_outb.c b/lib/ipsec/esp_outb.c\nindex 8a6d09558f..d8e261e6fb 100644\n--- a/lib/ipsec/esp_outb.c\n+++ b/lib/ipsec/esp_outb.c\n@@ -19,7 +19,7 @@\n \n typedef int32_t (*esp_outb_prepare_t)(struct rte_ipsec_sa *sa, rte_be64_t sqc,\n \tconst uint64_t ivp[IPSEC_MAX_IV_QWORD], struct rte_mbuf *mb,\n-\tunion sym_op_data *icv, uint8_t sqh_len);\n+\tunion sym_op_data *icv, uint8_t sqh_len, uint8_t icrypto);\n \n /*\n * helper function to fill crypto_sym op for cipher+auth algorithms.\n@@ -140,9 +140,9 @@ outb_cop_prepare(struct rte_crypto_op *cop,\n static inline int32_t\n outb_tun_pkt_prepare(struct rte_ipsec_sa *sa, rte_be64_t sqc,\n \tconst uint64_t ivp[IPSEC_MAX_IV_QWORD], struct rte_mbuf *mb,\n-\tunion sym_op_data *icv, uint8_t sqh_len)\n+\tunion sym_op_data *icv, uint8_t sqh_len, uint8_t icrypto)\n {\n-\tuint32_t clen, hlen, l2len, pdlen, pdofs, plen, tlen;\n+\tuint32_t clen, hlen, l2len, l3len, pdlen, pdofs, plen, tlen;\n \tstruct rte_mbuf *ml;\n \tstruct rte_esp_hdr *esph;\n \tstruct rte_esp_tail *espt;\n@@ -154,6 +154,8 @@ outb_tun_pkt_prepare(struct rte_ipsec_sa *sa, rte_be64_t sqc,\n \n \t/* size of ipsec protected data */\n \tl2len = mb->l2_len;\n+\tl3len = mb->l3_len;\n+\n \tplen = mb->pkt_len - l2len;\n \n \t/* number of bytes to encrypt */\n@@ -190,8 +192,26 @@ outb_tun_pkt_prepare(struct rte_ipsec_sa *sa, rte_be64_t sqc,\n \tpt = rte_pktmbuf_mtod_offset(ml, typeof(pt), pdofs);\n \n \t/* update pkt l2/l3 len */\n-\tmb->tx_offload = (mb->tx_offload & sa->tx_offload.msk) |\n-\t\tsa->tx_offload.val;\n+\tif (icrypto) {\n+\t\tmb->tx_offload =\n+\t\t\t(mb->tx_offload & sa->inline_crypto.tx_offload.msk) |\n+\t\t\tsa->inline_crypto.tx_offload.val;\n+\t\tmb->l3_len = l3len;\n+\n+\t\tmb->ol_flags |= sa->inline_crypto.tx_ol_flags;\n+\n+\t\t/* set ip checksum offload for inner */\n+\t\tif ((sa->type & RTE_IPSEC_SATP_IPV_MASK) == RTE_IPSEC_SATP_IPV4)\n+\t\t\tmb->ol_flags |= (PKT_TX_IPV4 | PKT_TX_IP_CKSUM);\n+\t\telse if ((sa->type & RTE_IPSEC_SATP_IPV_MASK)\n+\t\t\t\t== RTE_IPSEC_SATP_IPV6)\n+\t\t\tmb->ol_flags |= PKT_TX_IPV6;\n+\t} else {\n+\t\tmb->tx_offload = (mb->tx_offload & sa->tx_offload.msk) |\n+\t\t\tsa->tx_offload.val;\n+\n+\t\tmb->ol_flags |= sa->tx_ol_flags;\n+\t}\n \n \t/* copy tunnel pkt header */\n \trte_memcpy(ph, sa->hdr, sa->hdr_len);\n@@ -311,7 +331,7 @@ esp_outb_tun_prepare(const struct rte_ipsec_session *ss, struct rte_mbuf *mb[],\n \n \t\t/* try to update the packet itself */\n \t\trc = outb_tun_pkt_prepare(sa, sqc, iv, mb[i], &icv,\n-\t\t\t\t\t sa->sqh_len);\n+\t\t\t\t\t sa->sqh_len, 0);\n \t\t/* success, setup crypto op */\n \t\tif (rc >= 0) {\n \t\t\toutb_pkt_xprepare(sa, sqc, &icv);\n@@ -338,7 +358,7 @@ esp_outb_tun_prepare(const struct rte_ipsec_session *ss, struct rte_mbuf *mb[],\n static inline int32_t\n outb_trs_pkt_prepare(struct rte_ipsec_sa *sa, rte_be64_t sqc,\n \tconst uint64_t ivp[IPSEC_MAX_IV_QWORD], struct rte_mbuf *mb,\n-\tunion sym_op_data *icv, uint8_t sqh_len)\n+\tunion sym_op_data *icv, uint8_t sqh_len, uint8_t icrypto __rte_unused)\n {\n \tuint8_t np;\n \tuint32_t clen, hlen, pdlen, pdofs, plen, tlen, uhlen;\n@@ -394,10 +414,16 @@ outb_trs_pkt_prepare(struct rte_ipsec_sa *sa, rte_be64_t sqc,\n \t/* shift L2/L3 headers */\n \tinsert_esph(ph, ph + hlen, uhlen);\n \n+\tif ((sa->type & RTE_IPSEC_SATP_IPV_MASK) == RTE_IPSEC_SATP_IPV4)\n+\t\tmb->ol_flags |= (PKT_TX_IPV4 | PKT_TX_IP_CKSUM);\n+\telse if ((sa->type & RTE_IPSEC_SATP_IPV_MASK) == RTE_IPSEC_SATP_IPV6)\n+\t\tmb->ol_flags |= PKT_TX_IPV6;\n+\n \t/* update ip header fields */\n \tnp = update_trs_l34hdrs(sa, ph + l2len, mb->pkt_len - sqh_len, l2len,\n \t\t\tl3len, IPPROTO_ESP, tso);\n \n+\n \t/* update spi, seqn and iv */\n \tesph = (struct rte_esp_hdr *)(ph + uhlen);\n \tiv = (uint64_t *)(esph + 1);\n@@ -463,7 +489,7 @@ esp_outb_trs_prepare(const struct rte_ipsec_session *ss, struct rte_mbuf *mb[],\n \n \t\t/* try to update the packet itself */\n \t\trc = outb_trs_pkt_prepare(sa, sqc, iv, mb[i], &icv,\n-\t\t\t\t sa->sqh_len);\n+\t\t\t\t sa->sqh_len, 0);\n \t\t/* success, setup crypto op */\n \t\tif (rc >= 0) {\n \t\t\toutb_pkt_xprepare(sa, sqc, &icv);\n@@ -560,7 +586,7 @@ cpu_outb_pkt_prepare(const struct rte_ipsec_session *ss,\n \t\tgen_iv(ivbuf[k], sqc);\n \n \t\t/* try to update the packet itself */\n-\t\trc = prepare(sa, sqc, ivbuf[k], mb[i], &icv, sa->sqh_len);\n+\t\trc = prepare(sa, sqc, ivbuf[k], mb[i], &icv, sa->sqh_len, 0);\n \n \t\t/* success, proceed with preparations */\n \t\tif (rc >= 0) {\n@@ -741,7 +767,7 @@ inline_outb_tun_pkt_process(const struct rte_ipsec_session *ss,\n \t\tgen_iv(iv, sqc);\n \n \t\t/* try to update the packet itself */\n-\t\trc = outb_tun_pkt_prepare(sa, sqc, iv, mb[i], &icv, 0);\n+\t\trc = outb_tun_pkt_prepare(sa, sqc, iv, mb[i], &icv, 0, 1);\n \n \t\tk += (rc >= 0);\n \n@@ -808,7 +834,7 @@ inline_outb_trs_pkt_process(const struct rte_ipsec_session *ss,\n \t\tgen_iv(iv, sqc);\n \n \t\t/* try to update the packet itself */\n-\t\trc = outb_trs_pkt_prepare(sa, sqc, iv, mb[i], &icv, 0);\n+\t\trc = outb_trs_pkt_prepare(sa, sqc, iv, mb[i], &icv, 0, 0);\n \n \t\tk += (rc >= 0);\n \ndiff --git a/lib/ipsec/rte_ipsec_sa.h b/lib/ipsec/rte_ipsec_sa.h\nindex 40d1e70d45..3c36dcaa77 100644\n--- a/lib/ipsec/rte_ipsec_sa.h\n+++ b/lib/ipsec/rte_ipsec_sa.h\n@@ -38,7 +38,8 @@ struct rte_ipsec_sa_prm {\n \tunion {\n \t\tstruct {\n \t\t\tuint8_t hdr_len; /**< tunnel header len */\n-\t\t\tuint8_t hdr_l3_off; /**< offset for IPv4/IPv6 header */\n+\t\t\tuint8_t hdr_l3_off; /**< tunnel l3 header len */\n+\t\t\tuint8_t hdr_l3_len; /**< tunnel l3 header len */\n \t\t\tuint8_t next_proto; /**< next header protocol */\n \t\t\tconst void *hdr; /**< tunnel header template */\n \t\t} tun; /**< tunnel mode related parameters */\ndiff --git a/lib/ipsec/sa.c b/lib/ipsec/sa.c\nindex 242fdcd461..51f71b30c6 100644\n--- a/lib/ipsec/sa.c\n+++ b/lib/ipsec/sa.c\n@@ -17,6 +17,8 @@\n \n #define MBUF_MAX_L2_LEN\t\tRTE_LEN2MASK(RTE_MBUF_L2_LEN_BITS, uint64_t)\n #define MBUF_MAX_L3_LEN\t\tRTE_LEN2MASK(RTE_MBUF_L3_LEN_BITS, uint64_t)\n+#define MBUF_MAX_TSO_LEN\tRTE_LEN2MASK(RTE_MBUF_TSO_SEGSZ_BITS, uint64_t)\n+#define MBUF_MAX_OL3_LEN\tRTE_LEN2MASK(RTE_MBUF_OUTL3_LEN_BITS, uint64_t)\n \n /* some helper structures */\n struct crypto_xform {\n@@ -348,6 +350,11 @@ esp_outb_init(struct rte_ipsec_sa *sa, uint32_t hlen, uint64_t sqn)\n \tsa->cofs.ofs.cipher.head = sa->ctp.cipher.offset - sa->ctp.auth.offset;\n \tsa->cofs.ofs.cipher.tail = (sa->ctp.auth.offset + sa->ctp.auth.length) -\n \t\t\t(sa->ctp.cipher.offset + sa->ctp.cipher.length);\n+\n+\tif (sa->type & RTE_IPSEC_SATP_MODE_TUNLV4)\n+\t\tsa->tx_ol_flags |= (PKT_TX_IPV4 | PKT_TX_IP_CKSUM);\n+\telse if (sa->type & RTE_IPSEC_SATP_MODE_TUNLV6)\n+\t\tsa->tx_ol_flags |= PKT_TX_IPV6;\n }\n \n /*\n@@ -362,9 +369,43 @@ esp_outb_tun_init(struct rte_ipsec_sa *sa, const struct rte_ipsec_sa_prm *prm)\n \tsa->hdr_len = prm->tun.hdr_len;\n \tsa->hdr_l3_off = prm->tun.hdr_l3_off;\n \n+\n+\t/* update l2_len and l3_len fields for outbound mbuf */\n+\tsa->inline_crypto.tx_offload.val = rte_mbuf_tx_offload(\n+\t\t\t0,\t\t\t/* iL2_LEN */\n+\t\t\t0,\t\t\t/* iL3_LEN */\n+\t\t\t0,\t\t\t/* iL4_LEN */\n+\t\t\t0,\t\t\t/* TSO_SEG_SZ */\n+\t\t\tprm->tun.hdr_l3_len,\t/* oL3_LEN */\n+\t\t\tprm->tun.hdr_l3_off,\t/* oL2_LEN */\n+\t\t\t0);\n+\n+\tsa->inline_crypto.tx_ol_flags |= PKT_TX_TUNNEL_ESP;\n+\n+\tif (sa->type & RTE_IPSEC_SATP_MODE_TUNLV4)\n+\t\tsa->inline_crypto.tx_ol_flags |= PKT_TX_OUTER_IPV4;\n+\telse if (sa->type & RTE_IPSEC_SATP_MODE_TUNLV6)\n+\t\tsa->inline_crypto.tx_ol_flags |= PKT_TX_OUTER_IPV6;\n+\n+\tif (sa->inline_crypto.tx_ol_flags & PKT_TX_OUTER_IPV4)\n+\t\tsa->inline_crypto.tx_ol_flags |= PKT_TX_OUTER_IP_CKSUM;\n+\tif (sa->tx_ol_flags & PKT_TX_IPV4)\n+\t\tsa->inline_crypto.tx_ol_flags |= PKT_TX_IP_CKSUM;\n+\n \t/* update l2_len and l3_len fields for outbound mbuf */\n-\tsa->tx_offload.val = rte_mbuf_tx_offload(sa->hdr_l3_off,\n-\t\tsa->hdr_len - sa->hdr_l3_off, 0, 0, 0, 0, 0);\n+\tsa->tx_offload.val = rte_mbuf_tx_offload(\n+\t\t\tprm->tun.hdr_l3_off,\t/* iL2_LEN */\n+\t\t\tprm->tun.hdr_l3_len,\t/* iL3_LEN */\n+\t\t\t0,\t\t\t/* iL4_LEN */\n+\t\t\t0,\t\t\t/* TSO_SEG_SZ */\n+\t\t\t0,\t\t\t/* oL3_LEN */\n+\t\t\t0,\t\t\t/* oL2_LEN */\n+\t\t\t0);\n+\n+\tif (sa->type & RTE_IPSEC_SATP_MODE_TUNLV4)\n+\t\tsa->tx_ol_flags |= (PKT_TX_IPV4 | PKT_TX_IP_CKSUM);\n+\telse if (sa->type & RTE_IPSEC_SATP_MODE_TUNLV6)\n+\t\tsa->tx_ol_flags |= PKT_TX_IPV6;\n \n \tmemcpy(sa->hdr, prm->tun.hdr, sa->hdr_len);\n \n@@ -473,6 +514,10 @@ esp_sa_init(struct rte_ipsec_sa *sa, const struct rte_ipsec_sa_prm *prm,\n \tsa->salt = prm->ipsec_xform.salt;\n \n \t/* preserve all values except l2_len and l3_len */\n+\tsa->inline_crypto.tx_offload.msk =\n+\t\t~rte_mbuf_tx_offload(MBUF_MAX_L2_LEN, MBUF_MAX_L3_LEN,\n+\t\t\t\t0, 0, MBUF_MAX_OL3_LEN, 0, 0);\n+\n \tsa->tx_offload.msk =\n \t\t~rte_mbuf_tx_offload(MBUF_MAX_L2_LEN, MBUF_MAX_L3_LEN,\n \t\t\t\t0, 0, 0, 0, 0);\ndiff --git a/lib/ipsec/sa.h b/lib/ipsec/sa.h\nindex b9b7ebec5b..172d094c4b 100644\n--- a/lib/ipsec/sa.h\n+++ b/lib/ipsec/sa.h\n@@ -101,6 +101,14 @@ struct rte_ipsec_sa {\n \t\tuint64_t msk;\n \t\tuint64_t val;\n \t} tx_offload;\n+\tuint64_t tx_ol_flags;\n+\tstruct {\n+\t\tuint64_t tx_ol_flags;\n+\t\tstruct {\n+\t\t\tuint64_t msk;\n+\t\t\tuint64_t val;\n+\t\t} tx_offload;\n+\t} inline_crypto;\n \tstruct {\n \t\tuint16_t sport;\n \t\tuint16_t dport;\n", "prefixes": [ "10/10" ] }{ "id": 95815, "url": "