get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2434,
    "url": "https://patches.dpdk.org/api/patches/2434/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1421873870-21754-8-git-send-email-nhorman@tuxdriver.com/",
    "project": {
        "id": 1,
        "url": "https://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": "<1421873870-21754-8-git-send-email-nhorman@tuxdriver.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1421873870-21754-8-git-send-email-nhorman@tuxdriver.com",
    "date": "2015-01-21T20:57:32",
    "name": "[dpdk-dev,v7,08/26] bond: fix vlan flag interpretation",
    "commit_ref": null,
    "pull_url": null,
    "state": "not-applicable",
    "archived": true,
    "hash": "809a6aed361cb82d96aa2075e3bc2d88f4ef6c95",
    "submitter": {
        "id": 32,
        "url": "https://patches.dpdk.org/api/people/32/?format=api",
        "name": "Neil Horman",
        "email": "nhorman@tuxdriver.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1421873870-21754-8-git-send-email-nhorman@tuxdriver.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/2434/comments/",
    "check": "pending",
    "checks": "https://patches.dpdk.org/api/patches/2434/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 425625AB5;\n\tWed, 21 Jan 2015 21:58:26 +0100 (CET)",
            "from smtp.tuxdriver.com (charlotte.tuxdriver.com [70.61.120.58])\n\tby dpdk.org (Postfix) with ESMTP id 09D695A9A\n\tfor <dev@dpdk.org>; Wed, 21 Jan 2015 21:58:20 +0100 (CET)",
            "from hmsreliant.think-freely.org\n\t([2001:470:8:a08:7aac:c0ff:fec2:933b] helo=localhost)\n\tby smtp.tuxdriver.com with esmtpsa (TLSv1:AES128-SHA:128) (Exim 4.63)\n\t(envelope-from <nhorman@tuxdriver.com>)\n\tid 1YE2Lu-0007A0-3V; Wed, 21 Jan 2015 15:58:17 -0500"
        ],
        "From": "Neil Horman <nhorman@tuxdriver.com>",
        "To": "dev@dpdk.org",
        "Date": "Wed, 21 Jan 2015 15:57:32 -0500",
        "Message-Id": "<1421873870-21754-8-git-send-email-nhorman@tuxdriver.com>",
        "X-Mailer": "git-send-email 2.1.0",
        "In-Reply-To": "<1421873870-21754-1-git-send-email-nhorman@tuxdriver.com>",
        "References": "<1419109299-9603-1-git-send-email-nhorman@tuxdriver.com>\n\t<1421873870-21754-1-git-send-email-nhorman@tuxdriver.com>",
        "X-Spam-Score": "-2.9 (--)",
        "X-Spam-Status": "No",
        "Subject": "[dpdk-dev] [PATCH v7 08/26] bond: fix vlan flag interpretation",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "patches and discussions about DPDK <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": "From: Declan Doherty <declan.doherty@intel.com>\n\nThis patch contains a fix for link bonding handling of vlan tagged packets in mode 3 and 5.\nCurrently xmit_slave_hash function misinterprets the PKT_RX_VLAN_PKT flag to mean that\nthere is a vlan tag within the packet when in actually means that there is a valid entry\nin the vlan_tci field in the mbuf.\n\n- Fixed VLAN tag support in hashing functions.\n- Adds support for TCP in layer 4 header hashing.\n- Splits transmit hashing function into separate functions for each policy to\n  reduce branching and to make the code clearer.\n- Fixed incorrect flag set in test application packet generator.\n\nTest report: http://dpdk.org/ml/archives/dev/2015-January/010792.html\n\nSigned-off-by: Declan Doherty <declan.doherty@intel.com>\nAcked-by: Pawel Wodkowski <pawelx.wodkowski@intel.com>\nTested-by: SunX Jiajia <sunx.jiajia@intel.com>\n---\n app/test/packet_burst_generator.c          |   2 +-\n lib/librte_net/rte_ip.h                    |   8 ++\n lib/librte_pmd_bond/rte_eth_bond_api.c     |   8 ++\n lib/librte_pmd_bond/rte_eth_bond_pmd.c     | 162 ++++++++++++++++-------------\n lib/librte_pmd_bond/rte_eth_bond_private.h |  15 +++\n 5 files changed, 122 insertions(+), 73 deletions(-)",
    "diff": "diff --git a/app/test/packet_burst_generator.c b/app/test/packet_burst_generator.c\nindex b2824dc..4a89663 100644\n--- a/app/test/packet_burst_generator.c\n+++ b/app/test/packet_burst_generator.c\n@@ -97,7 +97,7 @@ initialize_eth_header(struct ether_hdr *eth_hdr, struct ether_addr *src_mac,\n \t\tvhdr->eth_proto =  rte_cpu_to_be_16(ETHER_TYPE_IPv4);\n \t\tvhdr->vlan_tci = van_id;\n \t} else {\n-\t\teth_hdr->ether_type = rte_cpu_to_be_16(ETHER_TYPE_VLAN);\n+\t\teth_hdr->ether_type = rte_cpu_to_be_16(ETHER_TYPE_IPv4);\n \t}\n \n }\ndiff --git a/lib/librte_net/rte_ip.h b/lib/librte_net/rte_ip.h\nindex f0ec543..64935d9 100644\n--- a/lib/librte_net/rte_ip.h\n+++ b/lib/librte_net/rte_ip.h\n@@ -110,6 +110,14 @@ struct ipv4_hdr {\n \t\t\t\t\t   (((c) & 0xff) << 8)  | \\\n \t\t\t\t\t   ((d) & 0xff))\n \n+/** Internet header length mask for version_ihl field */\n+#define IPV4_HDR_IHL_MASK\t(0x0f)\n+/**\n+ * Internet header length field multiplier (IHL field specifies overall header\n+ * length in number of 4-byte words)\n+ */\n+#define IPV4_IHL_MULTIPLIER\t(4)\n+\n /* Fragment Offset * Flags. */\n #define\tIPV4_HDR_DF_SHIFT\t14\n #define\tIPV4_HDR_MF_SHIFT\t13\ndiff --git a/lib/librte_pmd_bond/rte_eth_bond_api.c b/lib/librte_pmd_bond/rte_eth_bond_api.c\nindex c2a99a3..4ab3267 100644\n--- a/lib/librte_pmd_bond/rte_eth_bond_api.c\n+++ b/lib/librte_pmd_bond/rte_eth_bond_api.c\n@@ -272,6 +272,7 @@ rte_eth_bond_create(const char *name, uint8_t mode, uint8_t socket_id)\n \tinternals->mode = BONDING_MODE_INVALID;\n \tinternals->current_primary_port = 0;\n \tinternals->balance_xmit_policy = BALANCE_XMIT_POLICY_LAYER2;\n+\tinternals->xmit_hash = xmit_l2_hash;\n \tinternals->user_defined_mac = 0;\n \tinternals->link_props_set = 0;\n \n@@ -714,9 +715,16 @@ rte_eth_bond_xmit_policy_set(uint8_t bonded_port_id, uint8_t policy)\n \n \tswitch (policy) {\n \tcase BALANCE_XMIT_POLICY_LAYER2:\n+\t\tinternals->balance_xmit_policy = policy;\n+\t\tinternals->xmit_hash = xmit_l2_hash;\n+\t\tbreak;\n \tcase BALANCE_XMIT_POLICY_LAYER23:\n+\t\tinternals->balance_xmit_policy = policy;\n+\t\tinternals->xmit_hash = xmit_l23_hash;\n+\t\tbreak;\n \tcase BALANCE_XMIT_POLICY_LAYER34:\n \t\tinternals->balance_xmit_policy = policy;\n+\t\tinternals->xmit_hash = xmit_l34_hash;\n \t\tbreak;\n \n \tdefault:\ndiff --git a/lib/librte_pmd_bond/rte_eth_bond_pmd.c b/lib/librte_pmd_bond/rte_eth_bond_pmd.c\nindex bb4a537..e9cec2a 100644\n--- a/lib/librte_pmd_bond/rte_eth_bond_pmd.c\n+++ b/lib/librte_pmd_bond/rte_eth_bond_pmd.c\n@@ -31,6 +31,8 @@\n  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n  */\n #include <stdlib.h>\n+#include <netinet/in.h>\n+\n #include <rte_mbuf.h>\n #include <rte_malloc.h>\n #include <rte_ethdev.h>\n@@ -48,6 +50,9 @@\n #include \"rte_eth_bond_8023ad_private.h\"\n \n #define REORDER_PERIOD_MS 10\n+\n+#define HASH_L4_PORTS(h) ((h)->src_port ^ (h)->dst_port)\n+\n /* Table for statistics in mode 5 TLB */\n static uint64_t tlb_last_obytets[RTE_MAX_ETHPORTS];\n \n@@ -276,90 +281,105 @@ ipv6_hash(struct ipv6_hdr *ipv6_hdr)\n \t\t\t(word_src_addr[3] ^ word_dst_addr[3]);\n }\n \n-static uint32_t\n-udp_hash(struct udp_hdr *hdr)\n+static inline size_t\n+get_vlan_offset(struct ether_hdr *eth_hdr)\n {\n-\treturn hdr->src_port ^ hdr->dst_port;\n+\tsize_t vlan_offset = 0;\n+\n+\t/* Calculate VLAN offset */\n+\tif (rte_cpu_to_be_16(ETHER_TYPE_VLAN) == eth_hdr->ether_type) {\n+\t\tstruct vlan_hdr *vlan_hdr = (struct vlan_hdr *)(eth_hdr + 1);\n+\t\tvlan_offset = sizeof(struct vlan_hdr);\n+\n+\t\twhile (rte_cpu_to_be_16(ETHER_TYPE_VLAN) ==\n+\t\t\t\tvlan_hdr->eth_proto) {\n+\t\t\tvlan_hdr = vlan_hdr + 1;\n+\t\t\tvlan_offset += sizeof(struct vlan_hdr);\n+\t\t}\n+\t}\n+\treturn vlan_offset;\n }\n \n-static inline uint16_t\n-xmit_slave_hash(const struct rte_mbuf *buf, uint8_t slave_count, uint8_t policy)\n+uint16_t\n+xmit_l2_hash(const struct rte_mbuf *buf, uint8_t slave_count)\n {\n-\tstruct ether_hdr *eth_hdr;\n-\tstruct udp_hdr *udp_hdr;\n-\tsize_t eth_offset = 0;\n-\tuint32_t hash = 0;\n-\n-\tif (slave_count == 1)\n-\t\treturn 0;\n+\tstruct ether_hdr *eth_hdr = rte_pktmbuf_mtod(buf, struct ether_hdr *);\n \n-\tswitch (policy) {\n-\tcase BALANCE_XMIT_POLICY_LAYER2:\n-\t\teth_hdr = rte_pktmbuf_mtod(buf, struct ether_hdr *);\n+\tuint32_t hash = ether_hash(eth_hdr);\n \n-\t\thash = ether_hash(eth_hdr);\n-\t\thash ^= hash >> 8;\n-\t\treturn hash % slave_count;\n+\treturn (hash ^= hash >> 8) % slave_count;\n+}\n \n-\tcase BALANCE_XMIT_POLICY_LAYER23:\n-\t\teth_hdr = rte_pktmbuf_mtod(buf, struct ether_hdr *);\n+uint16_t\n+xmit_l23_hash(const struct rte_mbuf *buf, uint8_t slave_count)\n+{\n+\tstruct ether_hdr *eth_hdr = rte_pktmbuf_mtod(buf, struct ether_hdr *);\n+\tsize_t vlan_offset = get_vlan_offset(eth_hdr);\n+\tuint32_t hash, l3hash = 0;\n \n-\t\tif (buf->ol_flags & PKT_RX_VLAN_PKT)\n-\t\t\teth_offset = sizeof(struct ether_hdr) + sizeof(struct vlan_hdr);\n-\t\telse\n-\t\t\teth_offset = sizeof(struct ether_hdr);\n+\thash = ether_hash(eth_hdr);\n \n-\t\tif (buf->ol_flags & PKT_RX_IPV4_HDR) {\n-\t\t\tstruct ipv4_hdr *ipv4_hdr;\n-\t\t\tipv4_hdr = (struct ipv4_hdr *)(rte_pktmbuf_mtod(buf,\n-\t\t\t\t\tunsigned char *) + eth_offset);\n+\tif (buf->ol_flags & PKT_RX_IPV4_HDR) {\n+\t\tstruct ipv4_hdr *ipv4_hdr = (struct ipv4_hdr *)\n+\t\t\t\t((char *)(eth_hdr + 1) + vlan_offset);\n+\t\tl3hash = ipv4_hash(ipv4_hdr);\n \n-\t\t\thash = ether_hash(eth_hdr) ^ ipv4_hash(ipv4_hdr);\n+\t} else if  (buf->ol_flags & PKT_RX_IPV6_HDR) {\n+\t\tstruct ipv6_hdr *ipv6_hdr = (struct ipv6_hdr *)\n+\t\t\t\t((char *)(eth_hdr + 1) + vlan_offset);\n+\t\tl3hash = ipv6_hash(ipv6_hdr);\n+\t}\n \n-\t\t} else {\n-\t\t\tstruct ipv6_hdr *ipv6_hdr;\n+\thash = hash ^ l3hash;\n+\thash ^= hash >> 16;\n+\thash ^= hash >> 8;\n \n-\t\t\tipv6_hdr = (struct ipv6_hdr *)(rte_pktmbuf_mtod(buf,\n-\t\t\t\t\tunsigned char *) + eth_offset);\n+\treturn hash % slave_count;\n+}\n \n-\t\t\thash = ether_hash(eth_hdr) ^ ipv6_hash(ipv6_hdr);\n+uint16_t\n+xmit_l34_hash(const struct rte_mbuf *buf, uint8_t slave_count)\n+{\n+\tstruct ether_hdr *eth_hdr = rte_pktmbuf_mtod(buf, struct ether_hdr *);\n+\tsize_t vlan_offset = get_vlan_offset(eth_hdr);\n+\tstruct udp_hdr *udp_hdr = NULL;\n+\tstruct tcp_hdr *tcp_hdr = NULL;\n+\tuint32_t hash, l3hash = 0, l4hash = 0;\n+\n+\tif (buf->ol_flags & PKT_RX_IPV4_HDR) {\n+\t\tstruct ipv4_hdr *ipv4_hdr = (struct ipv4_hdr *)\n+\t\t\t\t((char *)(eth_hdr + 1) + vlan_offset);\n+\t\tsize_t ip_hdr_offset;\n+\n+\t\tl3hash = ipv4_hash(ipv4_hdr);\n+\n+\t\tip_hdr_offset = (ipv4_hdr->version_ihl & IPV4_HDR_IHL_MASK) *\n+\t\t\t\tIPV4_IHL_MULTIPLIER;\n+\n+\t\tif (ipv4_hdr->next_proto_id == IPPROTO_TCP) {\n+\t\t\ttcp_hdr = (struct tcp_hdr *)((char *)ipv4_hdr +\n+\t\t\t\t\tip_hdr_offset);\n+\t\t\tl4hash = HASH_L4_PORTS(tcp_hdr);\n+\t\t} else if (ipv4_hdr->next_proto_id == IPPROTO_UDP) {\n+\t\t\tudp_hdr = (struct udp_hdr *)((char *)ipv4_hdr +\n+\t\t\t\t\tip_hdr_offset);\n+\t\t\tl4hash = HASH_L4_PORTS(udp_hdr);\n \t\t}\n-\t\tbreak;\n-\n-\tcase BALANCE_XMIT_POLICY_LAYER34:\n-\t\tif (buf->ol_flags & PKT_RX_VLAN_PKT)\n-\t\t\teth_offset = sizeof(struct ether_hdr) + sizeof(struct vlan_hdr);\n-\t\telse\n-\t\t\teth_offset = sizeof(struct ether_hdr);\n-\n-\t\tif (buf->ol_flags & PKT_RX_IPV4_HDR) {\n-\t\t\tstruct ipv4_hdr *ipv4_hdr = (struct ipv4_hdr *)\n-\t\t\t\t\t(rte_pktmbuf_mtod(buf, unsigned char *) + eth_offset);\n-\n-\t\t\tif (ipv4_hdr->next_proto_id == IPPROTO_UDP) {\n-\t\t\t\tudp_hdr = (struct udp_hdr *)\n-\t\t\t\t\t\t(rte_pktmbuf_mtod(buf, unsigned char *) + eth_offset +\n-\t\t\t\t\t\t\t\tsizeof(struct ipv4_hdr));\n-\t\t\t\thash = ipv4_hash(ipv4_hdr) ^ udp_hash(udp_hdr);\n-\t\t\t} else {\n-\t\t\t\thash = ipv4_hash(ipv4_hdr);\n-\t\t\t}\n-\t\t} else {\n-\t\t\tstruct ipv6_hdr *ipv6_hdr = (struct ipv6_hdr *)\n-\t\t\t\t\t(rte_pktmbuf_mtod(buf, unsigned char *) + eth_offset);\n-\n-\t\t\tif (ipv6_hdr->proto == IPPROTO_UDP) {\n-\t\t\t\tudp_hdr = (struct udp_hdr *)\n-\t\t\t\t\t\t(rte_pktmbuf_mtod(buf, unsigned char *) + eth_offset +\n-\t\t\t\t\t\t\t\tsizeof(struct ipv6_hdr));\n-\t\t\t\thash = ipv6_hash(ipv6_hdr) ^ udp_hash(udp_hdr);\n-\t\t\t} else {\n-\t\t\t\thash = ipv6_hash(ipv6_hdr);\n-\t\t\t}\n+\t} else if  (buf->ol_flags & PKT_RX_IPV6_HDR) {\n+\t\tstruct ipv6_hdr *ipv6_hdr = (struct ipv6_hdr *)\n+\t\t\t\t((char *)(eth_hdr + 1) + vlan_offset);\n+\t\tl3hash = ipv6_hash(ipv6_hdr);\n+\n+\t\tif (ipv6_hdr->proto == IPPROTO_TCP) {\n+\t\t\ttcp_hdr = (struct tcp_hdr *)(ipv6_hdr + 1);\n+\t\t\tl4hash = HASH_L4_PORTS(tcp_hdr);\n+\t\t} else if (ipv6_hdr->proto == IPPROTO_UDP) {\n+\t\t\tudp_hdr = (struct udp_hdr *)(ipv6_hdr + 1);\n+\t\t\tl4hash = HASH_L4_PORTS(udp_hdr);\n \t\t}\n-\t\tbreak;\n \t}\n \n+\thash = l3hash ^ l4hash;\n \thash ^= hash >> 16;\n \thash ^= hash >> 8;\n \n@@ -536,8 +556,7 @@ bond_ethdev_tx_burst_balance(void *queue, struct rte_mbuf **bufs,\n \t/* Populate slaves mbuf with the packets which are to be sent on it  */\n \tfor (i = 0; i < nb_pkts; i++) {\n \t\t/* Select output slave using hash based on xmit policy */\n-\t\top_slave_id = xmit_slave_hash(bufs[i], num_of_slaves,\n-\t\t\t\tinternals->balance_xmit_policy);\n+\t\top_slave_id = internals->xmit_hash(bufs[i], num_of_slaves);\n \n \t\t/* Populate slave mbuf arrays with mbufs for that slave */\n \t\tslave_bufs[op_slave_id][slave_nb_pkts[op_slave_id]++] = bufs[i];\n@@ -575,7 +594,7 @@ bond_ethdev_tx_burst_8023ad(void *queue, struct rte_mbuf **bufs,\n \n \tuint8_t num_of_slaves;\n \tuint8_t slaves[RTE_MAX_ETHPORTS];\n-\t /* possitions in slaves, not ID */\n+\t /* positions in slaves, not ID */\n \tuint8_t distributing_offsets[RTE_MAX_ETHPORTS];\n \tuint8_t distributing_count;\n \n@@ -622,8 +641,7 @@ bond_ethdev_tx_burst_8023ad(void *queue, struct rte_mbuf **bufs,\n \t\t/* Populate slaves mbuf with the packets which are to be sent on it */\n \t\tfor (i = 0; i < nb_pkts; i++) {\n \t\t\t/* Select output slave using hash based on xmit policy */\n-\t\t\top_slave_idx = xmit_slave_hash(bufs[i], distributing_count,\n-\t\t\t\t\tinternals->balance_xmit_policy);\n+\t\t\top_slave_idx = internals->xmit_hash(bufs[i], distributing_count);\n \n \t\t\t/* Populate slave mbuf arrays with mbufs for that slave. Use only\n \t\t\t * slaves that are currently distributing. */\ndiff --git a/lib/librte_pmd_bond/rte_eth_bond_private.h b/lib/librte_pmd_bond/rte_eth_bond_private.h\nindex f913c5b..e01e66b 100644\n--- a/lib/librte_pmd_bond/rte_eth_bond_private.h\n+++ b/lib/librte_pmd_bond/rte_eth_bond_private.h\n@@ -108,6 +108,9 @@ struct bond_slave_details {\n \tstruct ether_addr persisted_mac_addr;\n };\n \n+\n+typedef uint16_t (*xmit_hash_t)(const struct rte_mbuf *buf, uint8_t slave_count);\n+\n /** Link Bonding PMD device private configuration Structure */\n struct bond_dev_private {\n \tuint8_t port_id;\t\t\t\t\t/**< Port Id of Bonded Port */\n@@ -122,6 +125,9 @@ struct bond_dev_private {\n \n \tuint8_t balance_xmit_policy;\n \t/**< Transmit policy - l2 / l23 / l34 for operation in balance mode */\n+\txmit_hash_t xmit_hash;\n+\t/**< Transmit policy hash function */\n+\n \tuint8_t user_defined_mac;\n \t/**< Flag for whether MAC address is user defined or not */\n \tuint8_t promiscuous_en;\n@@ -225,6 +231,15 @@ void\n slave_add(struct bond_dev_private *internals,\n \t\tstruct rte_eth_dev *slave_eth_dev);\n \n+uint16_t\n+xmit_l2_hash(const struct rte_mbuf *buf, uint8_t slave_count);\n+\n+uint16_t\n+xmit_l23_hash(const struct rte_mbuf *buf, uint8_t slave_count);\n+\n+uint16_t\n+xmit_l34_hash(const struct rte_mbuf *buf, uint8_t slave_count);\n+\n void\n bond_ethdev_primary_set(struct bond_dev_private *internals,\n \t\tuint8_t slave_port_id);\n",
    "prefixes": [
        "dpdk-dev",
        "v7",
        "08/26"
    ]
}