get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 41793,
    "url": "http://patchwork.dpdk.org/api/patches/41793/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/4DB9E2E1-58A9-470C-B866-4F413CD59B09@bu.edu/",
    "project": {
        "id": 1,
        "url": "http://patchwork.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": "<4DB9E2E1-58A9-470C-B866-4F413CD59B09@bu.edu>",
    "list_archive_url": "https://inbox.dpdk.org/dev/4DB9E2E1-58A9-470C-B866-4F413CD59B09@bu.edu",
    "date": "2018-06-28T06:12:37",
    "name": "ip_frag: add function rte_ip_frag_sweep_table()",
    "commit_ref": null,
    "pull_url": null,
    "state": "rejected",
    "archived": true,
    "hash": "5517bedd2c51a5a47f383d0de0df8668855d3c19",
    "submitter": {
        "id": 1064,
        "url": "http://patchwork.dpdk.org/api/people/1064/?format=api",
        "name": "Fu, Qiaobin",
        "email": "qiaobinf@bu.edu"
    },
    "delegate": {
        "id": 1,
        "url": "http://patchwork.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/4DB9E2E1-58A9-470C-B866-4F413CD59B09@bu.edu/mbox/",
    "series": [
        {
            "id": 282,
            "url": "http://patchwork.dpdk.org/api/series/282/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=282",
            "date": "2018-06-28T06:12:37",
            "name": "ip_frag: add function rte_ip_frag_sweep_table()",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/282/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/41793/comments/",
    "check": "success",
    "checks": "http://patchwork.dpdk.org/api/patches/41793/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 1C829532C;\n\tThu, 28 Jun 2018 08:12:43 +0200 (CEST)",
            "from NAM03-BY2-obe.outbound.protection.outlook.com\n\t(mail-by2nam03on0116.outbound.protection.outlook.com [104.47.42.116])\n\tby dpdk.org (Postfix) with ESMTP id 295A84F9A\n\tfor <dev@dpdk.org>; Thu, 28 Jun 2018 08:12:41 +0200 (CEST)",
            "from MWHSPR01MB303.namprd03.prod.outlook.com (10.174.170.167) by\n\tMWHPR03MB3101.namprd03.prod.outlook.com (10.174.174.18) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n\t15.20.906.23; Thu, 28 Jun 2018 06:12:38 +0000",
            "from MWHSPR01MB303.namprd03.prod.outlook.com\n\t([fe80::d50a:f68a:5de5:42a2]) by\n\tMWHSPR01MB303.namprd03.prod.outlook.com\n\t([fe80::d50a:f68a:5de5:42a2%2]) with mapi id 15.20.0906.023;\n\tThu, 28 Jun 2018 06:12:38 +0000"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=bushare.onmicrosoft.com; s=selector1-bu-edu;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n\tbh=HXRHRpQPIz2Z6bQpoZDhEj3zO1JzxTh3wMdbZgx6kx0=;\n\tb=ZA6jH4abNpE/eJpOBhvF+jvxoikWJCyOBfGX8VcZzRZt8fexlOfHxMLytuDgbuXg072sT/fk3ckLIGXU4JOvlSx3FYLs9MTDEvRdvNAjnX0DhQHH8I46c1OrpkQ32NFps19nonopcLz0BScA6goQRqlzmVIRr7K1BN+nh8+R1w0=",
        "From": "\"Fu, Qiaobin\" <qiaobinf@bu.edu>",
        "To": "\"konstantin.ananyev@intel.com\" <konstantin.ananyev@intel.com>",
        "CC": "\"dev@dpdk.org\" <dev@dpdk.org>, Michel Machado <michel@digirati.com.br>, \n\t\"Fu, Qiaobin\" <qiaobinf@bu.edu>, \"Doucette, Cody,\n\tJoseph\" <doucette@bu.edu>",
        "Thread-Topic": "[PATCH] ip_frag: add function rte_ip_frag_sweep_table()",
        "Thread-Index": "AQHUDqcD/cj/CAiHW02ogWzuIGfirA==",
        "Date": "Thu, 28 Jun 2018 06:12:37 +0000",
        "Message-ID": "<4DB9E2E1-58A9-470C-B866-4F413CD59B09@bu.edu>",
        "Accept-Language": "en-US",
        "Content-Language": "en-US",
        "X-MS-Has-Attach": "",
        "X-MS-TNEF-Correlator": "",
        "authentication-results": "spf=none (sender IP is )\n\tsmtp.mailfrom=qiaobinf@bu.edu; ",
        "x-originating-ip": "[67.180.169.0]",
        "x-ms-publictraffictype": "Email",
        "x-microsoft-exchange-diagnostics": "1; MWHPR03MB3101;\n\t7:p+v+ivnCkyTX6PIBmb+H1tUyH+SQ7p8ykMpNdkZMTcn8UiL+OIdd6ZBkS4OYoAP+VSXIXGrzGV63iqAEt0N1Tn1lWAip3sjo5Pj0KoIZrYS1QyZ0MzxE8iFW6mBX66z0e6eREBfnCQlqCpad+EPXkTUu4VhgYB72YiQTKxLgV8z2UGhdnAFDD6WkLerCLo/yVSc4srXFLvU1jLASEPc9Wln9Q7/f9rZg6nng3hZKXl+wDg/O9EpO0Hz8itoztyTK",
        "x-ms-exchange-antispam-srfa-diagnostics": "SOS;",
        "x-ms-office365-filtering-correlation-id": "5b476983-cd3f-4550-a9b9-08d5dcbe25e9",
        "x-microsoft-antispam": "UriScan:; BCL:0; PCL:0;\n\tRULEID:(7020095)(4652034)(8989117)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(5600026)(711020)(2017052603328)(7153060)(7193020);\n\tSRVR:MWHPR03MB3101; ",
        "x-ms-traffictypediagnostic": "MWHPR03MB3101:",
        "x-ld-processed": "d57d32cc-c121-488f-b07b-dfe705680c71,ExtAddr",
        "x-microsoft-antispam-prvs": "<MWHPR03MB31016079DA2DC37C0DE3971CA24F0@MWHPR03MB3101.namprd03.prod.outlook.com>",
        "x-exchange-antispam-report-test": "UriScan:(238701278423138)(166494164430575); ",
        "x-ms-exchange-senderadcheck": "1",
        "x-exchange-antispam-report-cfa-test": "BCL:0; PCL:0;\n\tRULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(3231254)(944501410)(52105095)(93006095)(93001095)(3002001)(10201501046)(149027)(150027)(6041310)(201703131423095)(201702281529075)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123562045)(20161123564045)(20161123558120)(6072148)(201708071742011)(7699016);\n\tSRVR:MWHPR03MB3101; BCL:0; PCL:0; RULEID:; SRVR:MWHPR03MB3101; ",
        "x-forefront-prvs": "0717E25089",
        "x-forefront-antispam-report": "SFV:NSPM;\n\tSFS:(10019020)(136003)(376002)(39860400002)(366004)(396003)(346002)(189003)(199004)(66066001)(2906002)(68736007)(478600001)(82746002)(486006)(476003)(25786009)(2616005)(4326008)(5660300001)(54906003)(6916009)(6436002)(36756003)(33656002)(5640700003)(6486002)(6512007)(14444005)(97736004)(75432002)(256004)(83716003)(102836004)(1857600001)(786003)(106356001)(99286004)(5250100002)(105586002)(81156014)(7736002)(86362001)(3846002)(8936002)(316002)(186003)(26005)(81166006)(2351001)(8676002)(6116002)(2900100001)(305945005)(88552002)(53936002)(14454004)(6506007)(2501003)(7756004);\n\tDIR:OUT; SFP:1102; SCL:1; SRVR:MWHPR03MB3101;\n\tH:MWHSPR01MB303.namprd03.prod.outlook.com; FPR:; SPF:None; LANG:en;\n\tPTR:InfoNoRecords; MX:1; A:1; ",
        "received-spf": "None (protection.outlook.com: bu.edu does not designate\n\tpermitted sender hosts)",
        "x-microsoft-antispam-message-info": "ztWOV9B7I1DdG3GI2m2p5L/pq9kk6W+uebuXl3MmWtFJ5TNcHbKcrXYvvkuObcFRVbVIRDwtcJXQ5lShEx7GB9VMb5FpVqyx0iL8xMX3pDYzji/eCjJ85DgdaAdVMWpPUtpWMHqQR2OokSZlXN7R1jgFJAXU6Lzw6kp5t2VhI1naCKpkCerkkTl9OvzDQnJ6sQ0v4mgog25mFEWGIOJhf9pfsjvkFiGGGbMfB94hEKF+8LrhPg9xyq7STI+eTcdcv38RLM4wvLi+z1OaAyKStriE879v0yl75T1YU+e5W5U5hNbkX/4N3gIwtiI8n+2aWgb4Kv5MICZFREfrA3R8Yo3XB0zII9NISy3oDG9c9r8=",
        "spamdiagnosticoutput": "1:99",
        "spamdiagnosticmetadata": "NSPM",
        "Content-Type": "text/plain; charset=\"us-ascii\"",
        "Content-ID": "<09B298D45501AA419E3A958BD38BD257@namprd03.prod.outlook.com>",
        "Content-Transfer-Encoding": "quoted-printable",
        "MIME-Version": "1.0",
        "X-OriginatorOrg": "bu.edu",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "5b476983-cd3f-4550-a9b9-08d5dcbe25e9",
        "X-MS-Exchange-CrossTenant-originalarrivaltime": "28 Jun 2018 06:12:37.9299\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-fromentityheader": "Hosted",
        "X-MS-Exchange-CrossTenant-id": "d57d32cc-c121-488f-b07b-dfe705680c71",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "MWHPR03MB3101",
        "Subject": "[dpdk-dev] [PATCH] ip_frag: add function rte_ip_frag_sweep_table()",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n\t<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\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Function rte_ip_frag_sweep_table() enables callers to\nincrementally sweep IP frament tables for incomplete, expired fragments.\n\nrte_ip_frag_sweep_table() is needed to identify\nnever-to-be-completed fragments during DDoS attacks.\n\nSigned-off-by: Qiaobin Fu <qiaobinf@bu.edu>\nReviewed-by: Cody Doucette <doucette@bu.edu>\nReviewed-by: Michel Machado <michel@digirati.com.br>\n---\n lib/librte_ip_frag/ip_frag_common.h     | 18 +++++++++++++++++\n lib/librte_ip_frag/ip_frag_internal.c   | 18 -----------------\n lib/librte_ip_frag/rte_ip_frag.h        | 17 ++++++++++++++++\n lib/librte_ip_frag/rte_ip_frag_common.c | 26 +++++++++++++++++++++++++\n 4 files changed, 61 insertions(+), 18 deletions(-)",
    "diff": "diff --git a/lib/librte_ip_frag/ip_frag_common.h b/lib/librte_ip_frag/ip_frag_common.h\nindex 197acf8d8..ef869182d 100644\n--- a/lib/librte_ip_frag/ip_frag_common.h\n+++ b/lib/librte_ip_frag/ip_frag_common.h\n@@ -25,6 +25,12 @@\n #define IPv6_KEY_BYTES_FMT \\\n \t\"%08\" PRIx64 \"%08\" PRIx64 \"%08\" PRIx64 \"%08\" PRIx64\n \n+#ifdef RTE_LIBRTE_IP_FRAG_TBL_STAT\n+#define\tIP_FRAG_TBL_STAT_UPDATE(s, f, v)\t((s)->f += (v))\n+#else\n+#define\tIP_FRAG_TBL_STAT_UPDATE(s, f, v)\tdo {} while (0)\n+#endif /* IP_FRAG_TBL_STAT */\n+\n /* internal functions declarations */\n struct rte_mbuf * ip_frag_process(struct ip_frag_pkt *fp,\n \t\tstruct rte_ip_frag_death_row *dr, struct rte_mbuf *mb,\n@@ -149,4 +155,16 @@ ip_frag_reset(struct ip_frag_pkt *fp, uint64_t tms)\n \tfp->frags[IP_FIRST_FRAG_IDX] = zero_frag;\n }\n \n+/* frag table helper functions */\n+static inline void\n+ip_frag_tbl_del(struct rte_ip_frag_tbl *tbl, struct rte_ip_frag_death_row *dr,\n+\tstruct ip_frag_pkt *fp)\n+{\n+\tip_frag_free(fp, dr);\n+\tip_frag_key_invalidate(&fp->key);\n+\tTAILQ_REMOVE(&tbl->lru, fp, lru);\n+\ttbl->use_entries--;\n+\tIP_FRAG_TBL_STAT_UPDATE(&tbl->stat, del_num, 1);\n+}\n+\n #endif /* _IP_FRAG_COMMON_H_ */\ndiff --git a/lib/librte_ip_frag/ip_frag_internal.c b/lib/librte_ip_frag/ip_frag_internal.c\nindex 2560c7713..97470a872 100644\n--- a/lib/librte_ip_frag/ip_frag_internal.c\n+++ b/lib/librte_ip_frag/ip_frag_internal.c\n@@ -14,24 +14,6 @@\n #define\tIP_FRAG_TBL_POS(tbl, sig)\t\\\n \t((tbl)->pkt + ((sig) & (tbl)->entry_mask))\n \n-#ifdef RTE_LIBRTE_IP_FRAG_TBL_STAT\n-#define\tIP_FRAG_TBL_STAT_UPDATE(s, f, v)\t((s)->f += (v))\n-#else\n-#define\tIP_FRAG_TBL_STAT_UPDATE(s, f, v)\tdo {} while (0)\n-#endif /* IP_FRAG_TBL_STAT */\n-\n-/* local frag table helper functions */\n-static inline void\n-ip_frag_tbl_del(struct rte_ip_frag_tbl *tbl, struct rte_ip_frag_death_row *dr,\n-\tstruct ip_frag_pkt *fp)\n-{\n-\tip_frag_free(fp, dr);\n-\tip_frag_key_invalidate(&fp->key);\n-\tTAILQ_REMOVE(&tbl->lru, fp, lru);\n-\ttbl->use_entries--;\n-\tIP_FRAG_TBL_STAT_UPDATE(&tbl->stat, del_num, 1);\n-}\n-\n static inline void\n ip_frag_tbl_add(struct rte_ip_frag_tbl *tbl,  struct ip_frag_pkt *fp,\n \tconst struct ip_frag_key *key, uint64_t tms)\ndiff --git a/lib/librte_ip_frag/rte_ip_frag.h b/lib/librte_ip_frag/rte_ip_frag.h\nindex b3f3f78df..79443096c 100644\n--- a/lib/librte_ip_frag/rte_ip_frag.h\n+++ b/lib/librte_ip_frag/rte_ip_frag.h\n@@ -146,6 +146,23 @@ struct rte_ip_frag_tbl * rte_ip_frag_table_create(uint32_t bucket_num,\n \t\tuint32_t bucket_entries,  uint32_t max_entries,\n \t\tuint64_t max_cycles, int socket_id);\n \n+/**\n+ * Sweep the IP fragmentation table for expired segments.\n+ *\n+ * @param tbl\n+ *   Fragmentation table to sweep.\n+ * @param dr\n+ *   Death row to free buffers to\n+ * @param next\n+ *   Pointer to the bucket iterator.\n+ *   Should be 0 to start sweeping the fragmentation table.\n+ *   Bucket iterator is incremented after each call of this function.\n+ * @return\n+ *   0 if successful. -EINVAL if the parameters are invalid.\n+ */\n+int rte_ip_frag_sweep_table(struct rte_ip_frag_tbl *tbl,\n+\tstruct rte_ip_frag_death_row *dr, uint32_t *next);\n+\n /**\n  * Free allocated IP fragmentation table.\n  *\ndiff --git a/lib/librte_ip_frag/rte_ip_frag_common.c b/lib/librte_ip_frag/rte_ip_frag_common.c\nindex 659a17951..53325ddae 100644\n--- a/lib/librte_ip_frag/rte_ip_frag_common.c\n+++ b/lib/librte_ip_frag/rte_ip_frag_common.c\n@@ -7,6 +7,7 @@\n \n #include <rte_memory.h>\n #include <rte_log.h>\n+#include <rte_cycles.h>\n \n #include \"ip_frag_common.h\"\n \n@@ -93,6 +94,31 @@ rte_ip_frag_table_destroy(struct rte_ip_frag_tbl *tbl)\n \trte_free(tbl);\n }\n \n+/* Sweep the IP fragmentation table. */\n+int\n+rte_ip_frag_sweep_table(struct rte_ip_frag_tbl *tbl,\n+\tstruct rte_ip_frag_death_row *dr, uint32_t *next)\n+{\n+\tuint32_t i;\n+\tuint64_t cur_tsc = rte_rdtsc();\n+\tstruct ip_frag_pkt *pkt;\n+\n+\tif (tbl == NULL || dr == NULL || next == NULL ||\n+\t\t\t(*next * tbl->bucket_entries >= tbl->nb_entries))\n+\t\treturn -EINVAL;\n+\n+\tpkt = tbl->pkt + *next * tbl->bucket_entries;\n+\tfor (i = 0; i < tbl->bucket_entries; i++) {\n+\t\tif (tbl->max_cycles + pkt[i].start < cur_tsc)\n+\t\t\tip_frag_tbl_del(tbl, dr, pkt + i);\n+\t}\n+\n+\t*next = (*next + 1) * tbl->bucket_entries >= tbl->nb_entries ?\n+\t\t0 : *next + 1;\n+\n+\treturn 0;\n+}\n+\n /* dump frag table statistics to file */\n void\n rte_ip_frag_table_statistics_dump(FILE *f, const struct rte_ip_frag_tbl *tbl)\n",
    "prefixes": []
}