get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 1522848,
    "url": "http://patchwork.ozlabs.org/api/patches/1522848/",
    "web_url": "http://patchwork.ozlabs.org/project/openvswitch/patch/1630470310-16283-2-git-send-email-wenxu@ucloud.cn/",
    "project": {
        "id": 47,
        "url": "http://patchwork.ozlabs.org/api/projects/47/",
        "name": "Open vSwitch",
        "link_name": "openvswitch",
        "list_id": "ovs-dev.openvswitch.org",
        "list_email": "ovs-dev@openvswitch.org",
        "web_url": "http://openvswitch.org/",
        "scm_url": "git@github.com:openvswitch/ovs.git",
        "webscm_url": "https://github.com/openvswitch/ovs",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<1630470310-16283-2-git-send-email-wenxu@ucloud.cn>",
    "list_archive_url": null,
    "date": "2021-09-01T04:25:10",
    "name": "[ovs-dev,2/2] conntrack: limit port clash resolution attempts",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "c32903f5c02fc1c5b512b12f3f1dbd28cd31dfb1",
    "submitter": {
        "id": 67928,
        "url": "http://patchwork.ozlabs.org/api/people/67928/",
        "name": "wenxu",
        "email": "wenxu@ucloud.cn"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/openvswitch/patch/1630470310-16283-2-git-send-email-wenxu@ucloud.cn/mbox/",
    "series": [
        {
            "id": 260441,
            "url": "http://patchwork.ozlabs.org/api/series/260441/",
            "web_url": "http://patchwork.ozlabs.org/project/openvswitch/list/?series=260441",
            "date": "2021-09-01T04:25:09",
            "name": "[ovs-dev,1/2] conntrack: restore the origin port for each round with new address",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/260441/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/1522848/comments/",
    "check": "fail",
    "checks": "http://patchwork.ozlabs.org/api/patches/1522848/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<ovs-dev-bounces@openvswitch.org>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "dev@openvswitch.org"
        ],
        "Delivered-To": [
            "patchwork-incoming@bilbo.ozlabs.org",
            "ovs-dev@lists.linuxfoundation.org"
        ],
        "Authentication-Results": "ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org\n (client-ip=2605:bc80:3010::133; helo=smtp2.osuosl.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=<UNKNOWN>)",
        "Received": [
            "from smtp2.osuosl.org (smtp2.osuosl.org [IPv6:2605:bc80:3010::133])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest\n SHA256)\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 4GzrZf1rPqz9sRN\n\tfor <incoming@patchwork.ozlabs.org>; Wed,  1 Sep 2021 14:25:29 +1000 (AEST)",
            "from localhost (localhost [127.0.0.1])\n\tby smtp2.osuosl.org (Postfix) with ESMTP id 3778340180;\n\tWed,  1 Sep 2021 04:25:26 +0000 (UTC)",
            "from smtp2.osuosl.org ([127.0.0.1])\n\tby localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id l1X0g6MeBrHS; Wed,  1 Sep 2021 04:25:22 +0000 (UTC)",
            "from lists.linuxfoundation.org (lf-lists.osuosl.org\n [IPv6:2605:bc80:3010:104::8cd3:938])\n\tby smtp2.osuosl.org (Postfix) with ESMTPS id 554EA40117;\n\tWed,  1 Sep 2021 04:25:21 +0000 (UTC)",
            "from lf-lists.osuosl.org (localhost [127.0.0.1])\n\tby lists.linuxfoundation.org (Postfix) with ESMTP id A7A9DC0021;\n\tWed,  1 Sep 2021 04:25:19 +0000 (UTC)",
            "from smtp2.osuosl.org (smtp2.osuosl.org [IPv6:2605:bc80:3010::133])\n by lists.linuxfoundation.org (Postfix) with ESMTP id 7C28BC000E\n for <dev@openvswitch.org>; Wed,  1 Sep 2021 04:25:17 +0000 (UTC)",
            "from localhost (localhost [127.0.0.1])\n by smtp2.osuosl.org (Postfix) with ESMTP id 5D489400C3\n for <dev@openvswitch.org>; Wed,  1 Sep 2021 04:25:17 +0000 (UTC)",
            "from smtp2.osuosl.org ([127.0.0.1])\n by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n with ESMTP id 9ZHqjKTgEA95 for <dev@openvswitch.org>;\n Wed,  1 Sep 2021 04:25:16 +0000 (UTC)",
            "from mail-m2456.qiye.163.com (mail-m2456.qiye.163.com\n [220.194.24.56])\n by smtp2.osuosl.org (Postfix) with ESMTPS id 4222640003\n for <dev@openvswitch.org>; Wed,  1 Sep 2021 04:25:15 +0000 (UTC)",
            "from localhost.localdomain (unknown [117.50.0.204])\n by mail-m2456.qiye.163.com (Hmail) with ESMTPA id 86E837001B5;\n Wed,  1 Sep 2021 12:25:11 +0800 (CST)"
        ],
        "X-Virus-Scanned": [
            "amavisd-new at osuosl.org",
            "amavisd-new at osuosl.org"
        ],
        "X-Greylist": "domain auto-whitelisted by SQLgrey-1.8.0",
        "From": "wenxu@ucloud.cn",
        "To": "i.maximets@ovn.org, dlu998@gmail.com, pvalerio@redhat.com,\n aconole@redhat.com",
        "Date": "Wed,  1 Sep 2021 12:25:10 +0800",
        "Message-Id": "<1630470310-16283-2-git-send-email-wenxu@ucloud.cn>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1630470310-16283-1-git-send-email-wenxu@ucloud.cn>",
        "References": "<1630470310-16283-1-git-send-email-wenxu@ucloud.cn>",
        "X-HM-Spam-Status": "e1kfGhgUHx5ZQUtXWQgPGg8OCBgUHx5ZQUlOS1dZCBgUCR5ZQVlLVUtZV1\n kWDxoPAgseWUFZKDYvK1lXWShZQUlCN1dZLVlBSVdZDwkaFQgSH1lBWRpIQ0NWGRgdGUNIH0pMTk\n 8fVRkRExYaEhckFA4PWVdZFhoPEhUdFFlBWU9LSFVKSktISkxVS1kG",
        "X-HM-Sender-Digest": "e1kMHhlZQR0aFwgeV1kSHx4VD1lBWUc6OQg6IRw5FTMBHR4pEDkeOEwa\n UQMaCwFVSlVKTUhLT0xLSEpKTEpJVTMWGhIXVQweFQMOOw4YFxQOH1UYFUVZV1kSC1lBWUpKTFVO\n S1VLVUlLT1lXWQgBWUFPS0xONwY+",
        "X-HM-Tid": "0a7b9f9a8e938c15kuqt86e837001b5",
        "Cc": "dev@openvswitch.org",
        "Subject": "[ovs-dev] [PATCH 2/2] conntrack: limit port clash resolution\n\tattempts",
        "X-BeenThere": "ovs-dev@openvswitch.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "<ovs-dev.openvswitch.org>",
        "List-Unsubscribe": "<https://mail.openvswitch.org/mailman/options/ovs-dev>,\n <mailto:ovs-dev-request@openvswitch.org?subject=unsubscribe>",
        "List-Archive": "<http://mail.openvswitch.org/pipermail/ovs-dev/>",
        "List-Post": "<mailto:ovs-dev@openvswitch.org>",
        "List-Help": "<mailto:ovs-dev-request@openvswitch.org?subject=help>",
        "List-Subscribe": "<https://mail.openvswitch.org/mailman/listinfo/ovs-dev>,\n <mailto:ovs-dev-request@openvswitch.org?subject=subscribe>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=\"us-ascii\"",
        "Content-Transfer-Encoding": "7bit",
        "Errors-To": "ovs-dev-bounces@openvswitch.org",
        "Sender": "\"dev\" <ovs-dev-bounces@openvswitch.org>"
    },
    "content": "From: wenxu <wenxu@ucloud.cn>\n\nIn case almost or all available ports are taken, clash resolution can\ntake a very long time, resulting in soft lockup.\n\nThis can happen when many to-be-natted hosts connect to same\ndestination:port (e.g. a proxy) and all connections pass the same SNAT.\n\nPick a random offset in the acceptable range, then try ever smaller\nnumber of adjacent port numbers, until either the limit is reached or a\nuseable port was found.  This results in at most 248 attempts\n(128 + 64 + 32 + 16 + 8, i.e. 4 restarts with new search offset)\ninstead of 64000+.\n\nSigned-off-by: wenxu <wenxu@ucloud.cn>\n---\n lib/conntrack.c | 35 +++++++++++++++++++++++++++++++----\n 1 file changed, 31 insertions(+), 4 deletions(-)",
    "diff": "diff --git a/lib/conntrack.c b/lib/conntrack.c\nindex 2d14205..a500d64 100644\n--- a/lib/conntrack.c\n+++ b/lib/conntrack.c\n@@ -2414,6 +2414,10 @@ nat_get_unique_tuple(struct conntrack *ct, const struct conn *conn,\n                      conn->key.nw_proto == IPPROTO_UDP;\n     uint16_t min_dport, max_dport, curr_dport, orig_dport;\n     uint16_t min_sport, max_sport, curr_sport, orig_sport;\n+    static const unsigned int max_attempts = 128;\n+    uint16_t range_src, range_dst, range_max;\n+    unsigned int attempts;\n+    unsigned int i;\n \n     min_addr = conn->nat_info->min_addr;\n     max_addr = conn->nat_info->max_addr;\n@@ -2430,6 +2434,10 @@ nat_get_unique_tuple(struct conntrack *ct, const struct conn *conn,\n     set_dport_range(conn->nat_info, &conn->key, hash, &orig_dport,\n                     &min_dport, &max_dport);\n \n+    range_src = max_sport - min_sport + 1;\n+    range_dst = max_dport - min_dport + 1;\n+    range_max = range_src > range_dst ? range_src : range_dst;\n+\n another_round:\n     store_addr_to_key(&curr_addr, &nat_conn->rev_key,\n                       conn->nat_info->nat_action);\n@@ -2446,17 +2454,36 @@ another_round:\n     curr_sport = orig_sport;\n     curr_dport = orig_dport;\n \n+another_port_round:\n+    i = 0;\n+    attempts = range_max;\n+    if (attempts > max_attempts) {\n+        attempts = max_attempts;\n+    }\n+\n     FOR_EACH_PORT_IN_RANGE(curr_dport, min_dport, max_dport) {\n         nat_conn->rev_key.src.port = htons(curr_dport);\n         FOR_EACH_PORT_IN_RANGE(curr_sport, min_sport, max_sport) {\n-            nat_conn->rev_key.dst.port = htons(curr_sport);\n-            if (!conn_lookup(ct, &nat_conn->rev_key,\n-                             time_msec(), NULL, NULL)) {\n-                return true;\n+            if (i++ < attempts) {\n+                nat_conn->rev_key.dst.port = htons(curr_sport);\n+                if (!conn_lookup(ct, &nat_conn->rev_key,\n+                                 time_msec(), NULL, NULL)) {\n+                    return true;\n+                }\n             }\n         }\n     }\n \n+    if (attempts >= range_max || attempts < 16) {\n+        goto next_addr;\n+    }\n+\n+    attempts /= 2;\n+    curr_dport = random_uint32() % range_dst;\n+    curr_sport = random_uint32() % range_src;\n+\n+    goto another_port_round;\n+\n     /* Check if next IP is in range and respin. Otherwise, notify\n      * exhaustion to the caller. */\n next_addr:\n",
    "prefixes": [
        "ovs-dev",
        "2/2"
    ]
}