get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 29424,
    "url": "https://patches.dpdk.org/api/patches/29424/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1506676737-23900-4-git-send-email-bernard.iremonger@intel.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": "<1506676737-23900-4-git-send-email-bernard.iremonger@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1506676737-23900-4-git-send-email-bernard.iremonger@intel.com",
    "date": "2017-09-29T09:18:56",
    "name": "[dpdk-dev,v6,3/4] test: add packet burst generator functions",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "c48218eb2595f4c82402566ff70177b6bbe1bfc4",
    "submitter": {
        "id": 91,
        "url": "https://patches.dpdk.org/api/people/91/?format=api",
        "name": "Iremonger, Bernard",
        "email": "bernard.iremonger@intel.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1506676737-23900-4-git-send-email-bernard.iremonger@intel.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/29424/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/29424/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 [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 220451B21F;\n\tFri, 29 Sep 2017 11:19:23 +0200 (CEST)",
            "from mga11.intel.com (mga11.intel.com [192.55.52.93])\n\tby dpdk.org (Postfix) with ESMTP id 36A691B215\n\tfor <dev@dpdk.org>; Fri, 29 Sep 2017 11:19:20 +0200 (CEST)",
            "from fmsmga001.fm.intel.com ([10.253.24.23])\n\tby fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t29 Sep 2017 02:19:20 -0700",
            "from sivswdev01.ir.intel.com (HELO localhost.localdomain)\n\t([10.237.217.45])\n\tby fmsmga001.fm.intel.com with ESMTP; 29 Sep 2017 02:19:18 -0700"
        ],
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos; i=\"5.42,452,1500966000\"; d=\"scan'208\";\n\ta=\"1200363938\"",
        "From": "Bernard Iremonger <bernard.iremonger@intel.com>",
        "To": "dev@dpdk.org, ferruh.yigit@intel.com, konstantin.ananyev@intel.com,\n\tcristian.dumitrescu@intel.com, adrien.mazarguil@6wind.com",
        "Cc": "Bernard Iremonger <bernard.iremonger@intel.com>",
        "Date": "Fri, 29 Sep 2017 10:18:56 +0100",
        "Message-Id": "<1506676737-23900-4-git-send-email-bernard.iremonger@intel.com>",
        "X-Mailer": "git-send-email 1.7.0.7",
        "In-Reply-To": "<1504802598-27296-1-git-send-email-bernard.iremonger@intel.com>",
        "References": "<1504802598-27296-1-git-send-email-bernard.iremonger@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v6 3/4] test: add packet burst generator functions",
        "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": "add initialize_tcp_header function\nadd initialize_stcp_header function\nadd initialize_ipv4_header_proto function\nadd generate_packet_burst_proto function\n\nSigned-off-by: Bernard Iremonger <bernard.iremonger@intel.com>\n---\n test/test/packet_burst_generator.c | 191 +++++++++++++++++++++++++++++++++++++\n test/test/packet_burst_generator.h |  22 ++++-\n 2 files changed, 211 insertions(+), 2 deletions(-)",
    "diff": "diff --git a/test/test/packet_burst_generator.c b/test/test/packet_burst_generator.c\nindex a93c3b5..8f4ddcc 100644\n--- a/test/test/packet_burst_generator.c\n+++ b/test/test/packet_burst_generator.c\n@@ -134,6 +134,36 @@\n \treturn pkt_len;\n }\n \n+uint16_t\n+initialize_tcp_header(struct tcp_hdr *tcp_hdr, uint16_t src_port,\n+\t\tuint16_t dst_port, uint16_t pkt_data_len)\n+{\n+\tuint16_t pkt_len;\n+\n+\tpkt_len = (uint16_t) (pkt_data_len + sizeof(struct tcp_hdr));\n+\n+\tmemset(tcp_hdr, 0, sizeof(struct tcp_hdr));\n+\ttcp_hdr->src_port = rte_cpu_to_be_16(src_port);\n+\ttcp_hdr->dst_port = rte_cpu_to_be_16(dst_port);\n+\n+\treturn pkt_len;\n+}\n+\n+uint16_t\n+initialize_sctp_header(struct sctp_hdr *sctp_hdr, uint16_t src_port,\n+\t\tuint16_t dst_port, uint16_t pkt_data_len)\n+{\n+\tuint16_t pkt_len;\n+\n+\tpkt_len = (uint16_t) (pkt_data_len + sizeof(struct udp_hdr));\n+\n+\tsctp_hdr->src_port = rte_cpu_to_be_16(src_port);\n+\tsctp_hdr->dst_port = rte_cpu_to_be_16(dst_port);\n+\tsctp_hdr->tag = 0;\n+\tsctp_hdr->cksum = 0; /* No SCTP checksum. */\n+\n+\treturn pkt_len;\n+}\n \n uint16_t\n initialize_ipv6_header(struct ipv6_hdr *ip_hdr, uint8_t *src_addr,\n@@ -198,7 +228,53 @@\n \treturn pkt_len;\n }\n \n+uint16_t\n+initialize_ipv4_header_proto(struct ipv4_hdr *ip_hdr, uint32_t src_addr,\n+\t\tuint32_t dst_addr, uint16_t pkt_data_len, uint8_t proto)\n+{\n+\tuint16_t pkt_len;\n+\tunaligned_uint16_t *ptr16;\n+\tuint32_t ip_cksum;\n+\n+\t/*\n+\t * Initialize IP header.\n+\t */\n+\tpkt_len = (uint16_t) (pkt_data_len + sizeof(struct ipv4_hdr));\n+\n+\tip_hdr->version_ihl   = IP_VHL_DEF;\n+\tip_hdr->type_of_service   = 0;\n+\tip_hdr->fragment_offset = 0;\n+\tip_hdr->time_to_live   = IP_DEFTTL;\n+\tip_hdr->next_proto_id = proto;\n+\tip_hdr->packet_id = 0;\n+\tip_hdr->total_length   = rte_cpu_to_be_16(pkt_len);\n+\tip_hdr->src_addr = rte_cpu_to_be_32(src_addr);\n+\tip_hdr->dst_addr = rte_cpu_to_be_32(dst_addr);\n+\n+\t/*\n+\t * Compute IP header checksum.\n+\t */\n+\tptr16 = (unaligned_uint16_t *)ip_hdr;\n+\tip_cksum = 0;\n+\tip_cksum += ptr16[0]; ip_cksum += ptr16[1];\n+\tip_cksum += ptr16[2]; ip_cksum += ptr16[3];\n+\tip_cksum += ptr16[4];\n+\tip_cksum += ptr16[6]; ip_cksum += ptr16[7];\n+\tip_cksum += ptr16[8]; ip_cksum += ptr16[9];\n \n+\t/*\n+\t * Reduce 32 bit checksum to 16 bits and complement it.\n+\t */\n+\tip_cksum = ((ip_cksum & 0xFFFF0000) >> 16) +\n+\t\t(ip_cksum & 0x0000FFFF);\n+\tip_cksum %= 65536;\n+\tip_cksum = (~ip_cksum) & 0x0000FFFF;\n+\tif (ip_cksum == 0)\n+\t\tip_cksum = 0xFFFF;\n+\tip_hdr->hdr_checksum = (uint16_t) ip_cksum;\n+\n+\treturn pkt_len;\n+}\n \n /*\n  * The maximum number of segments per packet is used when creating\n@@ -283,3 +359,118 @@\n \n \treturn nb_pkt;\n }\n+\n+int\n+generate_packet_burst_proto(struct rte_mempool *mp,\n+\t\tstruct rte_mbuf **pkts_burst,\n+\t\tstruct ether_hdr *eth_hdr, uint8_t vlan_enabled, void *ip_hdr,\n+\t\tuint8_t ipv4, uint8_t proto, void *proto_hdr,\n+\t\tint nb_pkt_per_burst, uint8_t pkt_len, uint8_t nb_pkt_segs)\n+{\n+\tint i, nb_pkt = 0;\n+\tsize_t eth_hdr_size;\n+\n+\tstruct rte_mbuf *pkt_seg;\n+\tstruct rte_mbuf *pkt;\n+\n+\tfor (nb_pkt = 0; nb_pkt < nb_pkt_per_burst; nb_pkt++) {\n+\t\tpkt = rte_pktmbuf_alloc(mp);\n+\t\tif (pkt == NULL) {\n+nomore_mbuf:\n+\t\t\tif (nb_pkt == 0)\n+\t\t\t\treturn -1;\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tpkt->data_len = pkt_len;\n+\t\tpkt_seg = pkt;\n+\t\tfor (i = 1; i < nb_pkt_segs; i++) {\n+\t\t\tpkt_seg->next = rte_pktmbuf_alloc(mp);\n+\t\t\tif (pkt_seg->next == NULL) {\n+\t\t\t\tpkt->nb_segs = i;\n+\t\t\t\trte_pktmbuf_free(pkt);\n+\t\t\t\tgoto nomore_mbuf;\n+\t\t\t}\n+\t\t\tpkt_seg = pkt_seg->next;\n+\t\t\tpkt_seg->data_len = pkt_len;\n+\t\t}\n+\t\tpkt_seg->next = NULL; /* Last segment of packet. */\n+\n+\t\t/*\n+\t\t * Copy headers in first packet segment(s).\n+\t\t */\n+\t\tif (vlan_enabled)\n+\t\t\teth_hdr_size = sizeof(struct ether_hdr) +\n+\t\t\t\tsizeof(struct vlan_hdr);\n+\t\telse\n+\t\t\teth_hdr_size = sizeof(struct ether_hdr);\n+\n+\t\tcopy_buf_to_pkt(eth_hdr, eth_hdr_size, pkt, 0);\n+\n+\t\tif (ipv4) {\n+\t\t\tcopy_buf_to_pkt(ip_hdr, sizeof(struct ipv4_hdr), pkt,\n+\t\t\t\teth_hdr_size);\n+\t\t\tswitch (proto) {\n+\t\t\tcase IPPROTO_UDP:\n+\t\t\t\tcopy_buf_to_pkt(proto_hdr,\n+\t\t\t\t\tsizeof(struct udp_hdr), pkt,\n+\t\t\t\t\teth_hdr_size + sizeof(struct ipv4_hdr));\n+\t\t\t\tbreak;\n+\t\t\tcase IPPROTO_TCP:\n+\t\t\t\tcopy_buf_to_pkt(proto_hdr,\n+\t\t\t\t\tsizeof(struct tcp_hdr), pkt,\n+\t\t\t\t\teth_hdr_size + sizeof(struct ipv4_hdr));\n+\t\t\t\tbreak;\n+\t\t\tcase IPPROTO_SCTP:\n+\t\t\t\tcopy_buf_to_pkt(proto_hdr,\n+\t\t\t\t\tsizeof(struct sctp_hdr), pkt,\n+\t\t\t\t\teth_hdr_size + sizeof(struct ipv4_hdr));\n+\t\t\t\tbreak;\n+\t\t\tdefault:\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t} else {\n+\t\t\tcopy_buf_to_pkt(ip_hdr, sizeof(struct ipv6_hdr), pkt,\n+\t\t\t\teth_hdr_size);\n+\t\t\tswitch (proto) {\n+\t\t\tcase IPPROTO_UDP:\n+\t\t\t\tcopy_buf_to_pkt(proto_hdr,\n+\t\t\t\t\tsizeof(struct udp_hdr), pkt,\n+\t\t\t\t\teth_hdr_size + sizeof(struct ipv6_hdr));\n+\t\t\t\tbreak;\n+\t\t\tcase IPPROTO_TCP:\n+\t\t\t\tcopy_buf_to_pkt(proto_hdr,\n+\t\t\t\t\tsizeof(struct tcp_hdr), pkt,\n+\t\t\t\t\teth_hdr_size + sizeof(struct ipv6_hdr));\n+\t\t\t\tbreak;\n+\t\t\tcase IPPROTO_SCTP:\n+\t\t\t\tcopy_buf_to_pkt(proto_hdr,\n+\t\t\t\t\tsizeof(struct sctp_hdr), pkt,\n+\t\t\t\t\teth_hdr_size + sizeof(struct ipv6_hdr));\n+\t\t\t\tbreak;\n+\t\t\tdefault:\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+\n+\t\t/*\n+\t\t * Complete first mbuf of packet and append it to the\n+\t\t * burst of packets to be transmitted.\n+\t\t */\n+\t\tpkt->nb_segs = nb_pkt_segs;\n+\t\tpkt->pkt_len = pkt_len;\n+\t\tpkt->l2_len = eth_hdr_size;\n+\n+\t\tif (ipv4) {\n+\t\t\tpkt->vlan_tci  = ETHER_TYPE_IPv4;\n+\t\t\tpkt->l3_len = sizeof(struct ipv4_hdr);\n+\t\t} else {\n+\t\t\tpkt->vlan_tci  = ETHER_TYPE_IPv6;\n+\t\t\tpkt->l3_len = sizeof(struct ipv6_hdr);\n+\t\t}\n+\n+\t\tpkts_burst[nb_pkt] = pkt;\n+\t}\n+\n+\treturn nb_pkt;\n+}\ndiff --git a/test/test/packet_burst_generator.h b/test/test/packet_burst_generator.h\nindex edc1044..3315bfa 100644\n--- a/test/test/packet_burst_generator.h\n+++ b/test/test/packet_burst_generator.h\n@@ -43,7 +43,8 @@\n #include <rte_arp.h>\n #include <rte_ip.h>\n #include <rte_udp.h>\n-\n+#include <rte_tcp.h>\n+#include <rte_sctp.h>\n \n #define IPV4_ADDR(a, b, c, d)(((a & 0xff) << 24) | ((b & 0xff) << 16) | \\\n \t\t((c & 0xff) << 8) | (d & 0xff))\n@@ -65,6 +66,13 @@\n initialize_udp_header(struct udp_hdr *udp_hdr, uint16_t src_port,\n \t\tuint16_t dst_port, uint16_t pkt_data_len);\n \n+uint16_t\n+initialize_tcp_header(struct tcp_hdr *tcp_hdr, uint16_t src_port,\n+\t\tuint16_t dst_port, uint16_t pkt_data_len);\n+\n+uint16_t\n+initialize_sctp_header(struct sctp_hdr *sctp_hdr, uint16_t src_port,\n+\t\tuint16_t dst_port, uint16_t pkt_data_len);\n \n uint16_t\n initialize_ipv6_header(struct ipv6_hdr *ip_hdr, uint8_t *src_addr,\n@@ -74,15 +82,25 @@\n initialize_ipv4_header(struct ipv4_hdr *ip_hdr, uint32_t src_addr,\n \t\tuint32_t dst_addr, uint16_t pkt_data_len);\n \n+uint16_t\n+initialize_ipv4_header_proto(struct ipv4_hdr *ip_hdr, uint32_t src_addr,\n+\t\tuint32_t dst_addr, uint16_t pkt_data_len, uint8_t proto);\n+\n int\n generate_packet_burst(struct rte_mempool *mp, struct rte_mbuf **pkts_burst,\n \t\tstruct ether_hdr *eth_hdr, uint8_t vlan_enabled, void *ip_hdr,\n \t\tuint8_t ipv4, struct udp_hdr *udp_hdr, int nb_pkt_per_burst,\n \t\tuint8_t pkt_len, uint8_t nb_pkt_segs);\n \n+int\n+generate_packet_burst_proto(struct rte_mempool *mp,\n+\t\tstruct rte_mbuf **pkts_burst,\n+\t\tstruct ether_hdr *eth_hdr, uint8_t vlan_enabled, void *ip_hdr,\n+\t\tuint8_t ipv4, uint8_t proto, void *proto_hdr,\n+\t\tint nb_pkt_per_burst, uint8_t pkt_len, uint8_t nb_pkt_segs);\n+\n #ifdef __cplusplus\n }\n #endif\n \n-\n #endif /* PACKET_BURST_GENERATOR_H_ */\n",
    "prefixes": [
        "dpdk-dev",
        "v6",
        "3/4"
    ]
}