get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 132288,
    "url": "http://patchwork.dpdk.org/api/patches/132288/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20231003202909.391330-3-stephen@networkplumber.org/",
    "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": "<20231003202909.391330-3-stephen@networkplumber.org>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20231003202909.391330-3-stephen@networkplumber.org",
    "date": "2023-10-03T20:29:07",
    "name": "[v3,2/4] rte_ether_unformat: accept more inputs",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "9f582080b720157689ddaef910a45f80c84672dd",
    "submitter": {
        "id": 27,
        "url": "http://patchwork.dpdk.org/api/people/27/?format=api",
        "name": "Stephen Hemminger",
        "email": "stephen@networkplumber.org"
    },
    "delegate": {
        "id": 319,
        "url": "http://patchwork.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20231003202909.391330-3-stephen@networkplumber.org/mbox/",
    "series": [
        {
            "id": 29727,
            "url": "http://patchwork.dpdk.org/api/series/29727/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=29727",
            "date": "2023-10-03T20:29:05",
            "name": "rte_ether_unformat_addr related changes",
            "version": 3,
            "mbox": "http://patchwork.dpdk.org/series/29727/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/132288/comments/",
    "check": "success",
    "checks": "http://patchwork.dpdk.org/api/patches/132288/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 33607426B2;\n\tTue,  3 Oct 2023 22:29:35 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 7267940A6C;\n\tTue,  3 Oct 2023 22:29:24 +0200 (CEST)",
            "from mail-pl1-f173.google.com (mail-pl1-f173.google.com\n [209.85.214.173])\n by mails.dpdk.org (Postfix) with ESMTP id B5B0F402E1\n for <dev@dpdk.org>; Tue,  3 Oct 2023 22:29:22 +0200 (CEST)",
            "by mail-pl1-f173.google.com with SMTP id\n d9443c01a7336-1c328b53aeaso10854055ad.2\n for <dev@dpdk.org>; Tue, 03 Oct 2023 13:29:22 -0700 (PDT)",
            "from hermes.local (204-195-126-68.wavecable.com. [204.195.126.68])\n by smtp.gmail.com with ESMTPSA id\n a11-20020a1709027d8b00b001c5f62a639asm2014138plm.196.2023.10.03.13.29.20\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Tue, 03 Oct 2023 13:29:21 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=networkplumber-org.20230601.gappssmtp.com; s=20230601; t=1696364961;\n x=1696969761; darn=dpdk.org;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:from:to:cc:subject:date\n :message-id:reply-to;\n bh=sP6/bW96ydkOqViq+9pHtcGmfDIQkWN1rR8Kg+2Xby4=;\n b=Ep9LYFMTA6dJ4WJbreIE2kFSYMbAEQg6j2HmrGQW7kpnKoCB21GCYCsR2Oc18+vKmO\n gBj9D1FgOBEqkNlUAx8rZ800aI2sIjhsFCmI5uekIcwzEeXXp6XMGTLYxOxHZtOQ3uYh\n ITKLOCrmSYM8Rbb3i781yWlpJoXPifN09ezjDu3QUJ21ycaDrrf4ClzDuc4kJY76fCaY\n +tWi3AJYvUPHYIu/UiTxvOXHT+JaWf+mtyGocb/kdDkMB9OBLV1/Hl0+3gQq4FbexYIm\n NnpjC4NUXDzFsiSc3my/YL91VOeErl/NCoxRW6Uf+tB1qLHqaFvKpVxTMoiJRUxTBlE5\n 1u5w==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20230601; t=1696364961; x=1696969761;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc\n :subject:date:message-id:reply-to;\n bh=sP6/bW96ydkOqViq+9pHtcGmfDIQkWN1rR8Kg+2Xby4=;\n b=hWqHQZmHkLSoK2M+r/KK3Frg+l3hZeO/J+Zz+dfipuNJmhnpZacGG/DWW3U5JgwJ3d\n wHpPEwE7pAqxfSmoTqiv06qpkKDyayFNEAPOw5SnewZEw1qlLX7fOzpWVRJEQ297/n1G\n Y9h5p7/+agbQemaFy+aKk1qOGsdyjpbrSDbd7yBJRN9DKy+xcIkGyK5nhuhod153QsJl\n xf8M+TF7+KeJWGd/WKuqNFsrpinh6G3Mtjc9ipTBumwc104YzeMI+MtYVDXKfwKADUck\n TcGiam5fmFp9KB1syom9/jMYg7bZutjlfSTrDhm0JFziefm7uXdmX0r6c9kldzwf6eoe\n WqsQ==",
        "X-Gm-Message-State": "AOJu0YzIXY2IMKc4ITtEn7sVrwlIEh8c6mFrLDIVR+zEs6btXSe+0jH/\n wv9FhdFiJB/S5pYPRmN4w4klDb7PAV+Rx/0dgYE=",
        "X-Google-Smtp-Source": "\n AGHT+IFdeXzSo7oQzD89RwMc0kzx0dLvUnmTj/tG9lhh9cWRDjAHM1KTYQvXd2Qrw/6XdOIxaPsZOA==",
        "X-Received": "by 2002:a17:902:c412:b0:1bd:aeb3:9504 with SMTP id\n k18-20020a170902c41200b001bdaeb39504mr925193plk.15.1696364961536;\n Tue, 03 Oct 2023 13:29:21 -0700 (PDT)",
        "From": "Stephen Hemminger <stephen@networkplumber.org>",
        "To": "dev@dpdk.org",
        "Cc": "Stephen Hemminger <stephen@networkplumber.org>, =?utf-8?q?Morten_Br?=\n\t=?utf-8?q?=C3=B8rup?= <mb@smartsharesystems.com>,\n Olivier Matz <olivier.matz@6wind.com>",
        "Subject": "[PATCH v3 2/4] rte_ether_unformat: accept more inputs",
        "Date": "Tue,  3 Oct 2023 13:29:07 -0700",
        "Message-Id": "<20231003202909.391330-3-stephen@networkplumber.org>",
        "X-Mailer": "git-send-email 2.39.2",
        "In-Reply-To": "<20231003202909.391330-1-stephen@networkplumber.org>",
        "References": "<20230929163611.62691-1-stephen@networkplumber.org>\n <20231003202909.391330-1-stephen@networkplumber.org>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "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"
    },
    "content": "This updates rte_ether_addr_unformat() to accept more types\nformats for MAC address. It allows IEEE, IETF and Cisco\nformats. Leading zeros are allowed for byte formats.\n\nAcked-by: Morten Brørup <mb@smartsharesystems.com>\nSigned-off-by: Stephen Hemminger <stephen@networkplumber.org>\n---\n lib/net/rte_ether.c | 85 ++++++++++++++++++++++++++++++++++-----------\n lib/net/rte_ether.h | 10 ++++--\n 2 files changed, 73 insertions(+), 22 deletions(-)",
    "diff": "diff --git a/lib/net/rte_ether.c b/lib/net/rte_ether.c\nindex 66d9a9d0699a..f59c20289d37 100644\n--- a/lib/net/rte_ether.c\n+++ b/lib/net/rte_ether.c\n@@ -38,7 +38,8 @@ static int8_t get_xdigit(char ch)\n }\n \n /* Convert 00:11:22:33:44:55 to ethernet address */\n-static bool get_ether_addr6(const char *s0, struct rte_ether_addr *ea)\n+static bool get_ether_addr6(const char *s0, struct rte_ether_addr *ea,\n+\t\t\t    const char sep)\n {\n \tconst char *s = s0;\n \tint i;\n@@ -48,25 +49,29 @@ static bool get_ether_addr6(const char *s0, struct rte_ether_addr *ea)\n \n \t\tx = get_xdigit(*s++);\n \t\tif (x < 0)\n-\t\t\treturn false;\n+\t\t\treturn false;\t/* not a hex digit */\n \n-\t\tea->addr_bytes[i] = x << 4;\n-\t\tx = get_xdigit(*s++);\n-\t\tif (x < 0)\n-\t\t\treturn false;\n-\t\tea->addr_bytes[i] |= x;\n+\t\tea->addr_bytes[i] = x;\n+\t\tif (*s != sep && *s != '\\0') {\n+\t\t\tx = get_xdigit(*s++);\n+\t\t\tif (x < 0)\n+\t\t\t\treturn false;\t/* not a hex digit */\n+\t\t\tea->addr_bytes[i] <<= 4;\n+\t\t\tea->addr_bytes[i] |= x;\n+\t\t}\n \n \t\tif (i < RTE_ETHER_ADDR_LEN - 1 &&\n-\t\t    *s++ != ':')\n-\t\t\treturn false;\n+\t\t    *s++ != sep)\n+\t\t\treturn false;\t/* premature end of string */\n \t}\n \n-\t/* return true if at end of string */\n+\t/* return true if no trailing characters */\n \treturn *s == '\\0';\n }\n \n /* Convert 0011:2233:4455 to ethernet address */\n-static bool get_ether_addr3(const char *s, struct rte_ether_addr *ea)\n+static bool get_ether_addr3(const char *s, struct rte_ether_addr *ea,\n+\t\t\t    const char sep)\n {\n \tint i, j;\n \n@@ -78,14 +83,15 @@ static bool get_ether_addr3(const char *s, struct rte_ether_addr *ea)\n \n \t\t\tx = get_xdigit(*s++);\n \t\t\tif (x < 0)\n-\t\t\t\treturn false;\n+\t\t\t\treturn false;\t/* not a hex digit */\n \t\t\tw = (w << 4) | x;\n \t\t}\n+\n \t\tea->addr_bytes[i] = w >> 8;\n \t\tea->addr_bytes[i + 1] = w & 0xff;\n \n \t\tif (i < RTE_ETHER_ADDR_LEN - 2 &&\n-\t\t    *s++ != ':')\n+\t\t    *s++ != sep)\n \t\t\treturn false;\n \t}\n \n@@ -93,17 +99,56 @@ static bool get_ether_addr3(const char *s, struct rte_ether_addr *ea)\n }\n \n /*\n- * Like ether_aton_r but can handle either\n- * XX:XX:XX:XX:XX:XX or XXXX:XXXX:XXXX\n- * and is more restrictive.\n+ * Scan input to see if separated by dash, colon or period\n+ * Returns separator and number of matches\n+ * If separators are mixed will return\n+ */\n+static unsigned int get_ether_sep(const char *s, char *sep)\n+{\n+\tstatic const char separators[] = \"-:.\";\n+\tunsigned int count = 0;\n+\tconst char *cp;\n+\n+\tcp = strpbrk(s, separators);\n+\tif (cp == NULL)\n+\t\treturn 0;\t/* no separator found */\n+\n+\t*sep = *cp;\t\t/* return the separator */\n+\tdo {\n+\t\t++count;\n+\t\t/* find next instance of separator */\n+\t\tcp = strchr(cp + 1, *sep);\n+\t} while (cp != NULL);\n+\n+\treturn count;\n+}\n+\n+/*\n+ * Be liberal in accepting a wide variety of notational formats\n+ * for MAC address including:\n+ *  - Linux format six groups of hexadecimal digits separated by colon\n+ *  - Windows format six groups separated by hyphen\n+ *  - two groups hexadecimal digits\n  */\n int\n rte_ether_unformat_addr(const char *s, struct rte_ether_addr *ea)\n {\n-\tif (get_ether_addr6(s, ea))\n-\t\treturn 0;\n-\tif (get_ether_addr3(s, ea))\n-\t\treturn 0;\n+\tunsigned int count;\n+\tchar sep = '\\0';\n+\n+\tcount = get_ether_sep(s, &sep);\n+\tswitch (count) {\n+\tcase 5:\t/* i.e 01:23:45:67:89:AB */\n+\t\tif (get_ether_addr6(s, ea, sep))\n+\t\t\treturn 0;\n+\t\tbreak;\n+\tcase 2: /* i.e 0123.4567.89AB */\n+\t\tif (get_ether_addr3(s, ea, sep))\n+\t\t\treturn 0;\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n \n \trte_errno = EINVAL;\n \treturn -1;\ndiff --git a/lib/net/rte_ether.h b/lib/net/rte_ether.h\nindex b35c72c7b0e0..ce073ea818a2 100644\n--- a/lib/net/rte_ether.h\n+++ b/lib/net/rte_ether.h\n@@ -254,9 +254,15 @@ rte_ether_format_addr(char *buf, uint16_t size,\n  *\n  * @param str\n  *   A pointer to buffer contains the formatted MAC address.\n- *   The supported formats are:\n- *     XX:XX:XX:XX:XX:XX or XXXX:XXXX:XXXX\n+ *   Accepts either byte or word format separated by colon,\n+ *   hyphen or period.\n+ *\n+ *   The example formats are:\n+ *     XX:XX:XX:XX:XX:XX - Canonical form\n+ *     XX-XX-XX-XX-XX-XX - Windows and IEEE 802\n+ *     XXXX.XXXX.XXXX    - Cisco\n  *   where XX is a hex digit: 0-9, a-f, or A-F.\n+ *   In the byte format, leading zeros are optional.\n  * @param eth_addr\n  *   A pointer to a ether_addr structure.\n  * @return\n",
    "prefixes": [
        "v3",
        "2/4"
    ]
}