Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/810852/?format=api
{ "id": 810852, "url": "http://patchwork.ozlabs.org/api/patches/810852/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/20170907060329.32402-5-bjorn.andersson@linaro.org/", "project": { "id": 7, "url": "http://patchwork.ozlabs.org/api/projects/7/?format=api", "name": "Linux network development", "link_name": "netdev", "list_id": "netdev.vger.kernel.org", "list_email": "netdev@vger.kernel.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20170907060329.32402-5-bjorn.andersson@linaro.org>", "list_archive_url": null, "date": "2017-09-07T06:03:26", "name": "[4/7] net: qrtr: Pass source and destination to enqueue functions", "commit_ref": null, "pull_url": null, "state": "deferred", "archived": true, "hash": "02e00b32e53ffa12e5544c1afb9f19c1e902abe2", "submitter": { "id": 68398, "url": "http://patchwork.ozlabs.org/api/people/68398/?format=api", "name": "Bjorn Andersson", "email": "bjorn.andersson@linaro.org" }, "delegate": { "id": 34, "url": "http://patchwork.ozlabs.org/api/users/34/?format=api", "username": "davem", "first_name": "David", "last_name": "Miller", "email": "davem@davemloft.net" }, "mbox": "http://patchwork.ozlabs.org/project/netdev/patch/20170907060329.32402-5-bjorn.andersson@linaro.org/mbox/", "series": [ { "id": 1911, "url": "http://patchwork.ozlabs.org/api/series/1911/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/list/?series=1911", "date": "2017-09-07T06:03:24", "name": "net: qrtr: Fixes and support receiving version 2 packets", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/1911/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/810852/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/810852/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<netdev-owner@vger.kernel.org>", "X-Original-To": "patchwork-incoming@ozlabs.org", "Delivered-To": "patchwork-incoming@ozlabs.org", "Authentication-Results": [ "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netdev-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)", "ozlabs.org; dkim=pass (1024-bit key;\n\tunprotected) header.d=linaro.org header.i=@linaro.org\n\theader.b=\"ZLqHiDoa\"; dkim-atps=neutral" ], "Received": [ "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xnqgf4fJpz9sRV\n\tfor <patchwork-incoming@ozlabs.org>;\n\tThu, 7 Sep 2017 16:05:34 +1000 (AEST)", "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1754357AbdIGGFX (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tThu, 7 Sep 2017 02:05:23 -0400", "from mail-pf0-f170.google.com ([209.85.192.170]:36062 \"EHLO\n\tmail-pf0-f170.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1753963AbdIGGDi (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Thu, 7 Sep 2017 02:03:38 -0400", "by mail-pf0-f170.google.com with SMTP id e199so16288998pfh.3\n\tfor <netdev@vger.kernel.org>; Wed, 06 Sep 2017 23:03:38 -0700 (PDT)", "from localhost.localdomain (ip68-111-217-79.sd.sd.cox.net.\n\t[68.111.217.79]) by smtp.gmail.com with ESMTPSA id\n\ts1sm2186650pfk.27.2017.09.06.23.03.37\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tWed, 06 Sep 2017 23:03:37 -0700 (PDT)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=rs/TiD4LBFiJxoXhLbhCH3XjxaQMD7w8zxJrxXtvSJk=;\n\tb=ZLqHiDoa88DpL7en593+HSJ4klyQ4aH0270I2Ze1XSY3lvL4tLIyrwHSKjf/Qhrl49\n\tsoFryww6GrUOeiMiaGY4tdIgTp6bO6JJh8YT4/ngSrYXkM4C7KHRyT7cUu5Dsm3z5nd3\n\tLeEKpQd14HvEYKXzc4QO0TLW7IkXHX21iDUxE=", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=rs/TiD4LBFiJxoXhLbhCH3XjxaQMD7w8zxJrxXtvSJk=;\n\tb=CLf87Z9AZF4JE00tvS6WJtAWrashzjv8mA+2ecOA7zpMV1icam4XKtAjP0bFAc6hpX\n\tZSkfcc3q8yMUGY44u0Mxw48glm1TtUSrYjyAo/EzCIazHFGGWz8/OsIZcaMH1O8ULFWT\n\tcVzKRDCpygnfjwqA6RKbbadpmCSp2yTT03F4mmGMIJ5rEhL5oxj9R1Rwp3R+KsIKX8FT\n\tES1QKOrjaNmUKNI8hlewCywdAsH5AeyB7S5N4axr0UQBnKsDd93SEUBfgfHeDy5hxqa5\n\tDAjXsNTFHNs4XecNoMl8jr69K9pEupmerv7C6cj+NwUdNmM4POnPag/ClSA4Y9hBAla6\n\tFKTw==", "X-Gm-Message-State": "AHPjjUjOE0U2uOaozLlMnDHt9iFNiYgTHjeenj5eSgVJ6ahZsOWZ5pch\n\twh3AffnGWzQuACgN", "X-Google-Smtp-Source": "ADKCNb4mh2FHs8TagQ8T/n65yexwepNOZLXpD3v0pYwyTEuh0LBslo4mFJbwS8qSIj1mMjNW3oZfhA==", "X-Received": "by 10.98.223.88 with SMTP id u85mr1589805pfg.219.1504764218280; \n\tWed, 06 Sep 2017 23:03:38 -0700 (PDT)", "From": "Bjorn Andersson <bjorn.andersson@linaro.org>", "To": "\"David S. Miller\" <davem@davemloft.net>", "Cc": "netdev@vger.kernel.org, linux-kernel@vger.kernel.org,\n\tlinux-arm-msm@vger.kernel.org, Chris Lew <clew@codeaurora.org>", "Subject": "[PATCH 4/7] net: qrtr: Pass source and destination to enqueue\n\tfunctions", "Date": "Wed, 6 Sep 2017 23:03:26 -0700", "Message-Id": "<20170907060329.32402-5-bjorn.andersson@linaro.org>", "X-Mailer": "git-send-email 2.12.0", "In-Reply-To": "<20170907060329.32402-1-bjorn.andersson@linaro.org>", "References": "<20170907060329.32402-1-bjorn.andersson@linaro.org>", "Sender": "netdev-owner@vger.kernel.org", "Precedence": "bulk", "List-ID": "<netdev.vger.kernel.org>", "X-Mailing-List": "netdev@vger.kernel.org" }, "content": "Defer writing the message header to the skb until its time to enqueue\nthe packet. As the receive path is reworked to decode the message header\nas it's received from the transport and only pass around the payload in\nthe skb this change means that we do not have to fill out the full\nmessage header just to decode it immediately in qrtr_local_enqueue().\n\nIn the future this change also makes it possible to prepend message\nheaders based on the version of each link.\n\nSigned-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>\n---\n net/qrtr/qrtr.c | 120 ++++++++++++++++++++++++++++++++------------------------\n 1 file changed, 69 insertions(+), 51 deletions(-)", "diff": "diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c\nindex fac7cd6ea445..bcec2432b833 100644\n--- a/net/qrtr/qrtr.c\n+++ b/net/qrtr/qrtr.c\n@@ -97,8 +97,12 @@ struct qrtr_node {\n \tstruct list_head item;\n };\n \n-static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb);\n-static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb);\n+static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb,\n+\t\t\t int type, struct sockaddr_qrtr *from,\n+\t\t\t struct sockaddr_qrtr *to);\n+static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb,\n+\t\t\t int type, struct sockaddr_qrtr *from,\n+\t\t\t struct sockaddr_qrtr *to);\n \n /* Release node resources and free the node.\n *\n@@ -136,10 +140,27 @@ static void qrtr_node_release(struct qrtr_node *node)\n }\n \n /* Pass an outgoing packet socket buffer to the endpoint driver. */\n-static int qrtr_node_enqueue(struct qrtr_node *node, struct sk_buff *skb)\n+static int qrtr_node_enqueue(struct qrtr_node *node, struct sk_buff *skb,\n+\t\t\t int type, struct sockaddr_qrtr *from,\n+\t\t\t struct sockaddr_qrtr *to)\n {\n+\tstruct qrtr_hdr *hdr;\n+\tsize_t len = skb->len;\n \tint rc = -ENODEV;\n \n+\thdr = skb_push(skb, QRTR_HDR_SIZE);\n+\thdr->version = cpu_to_le32(QRTR_PROTO_VER);\n+\thdr->type = cpu_to_le32(type);\n+\thdr->src_node_id = cpu_to_le32(from->sq_node);\n+\thdr->src_port_id = cpu_to_le32(from->sq_port);\n+\thdr->dst_node_id = cpu_to_le32(to->sq_node);\n+\thdr->dst_port_id = cpu_to_le32(to->sq_port);\n+\n+\thdr->size = cpu_to_le32(len);\n+\thdr->confirm_rx = 0;\n+\n+\tskb_put_padto(skb, ALIGN(len, 4));\n+\n \tmutex_lock(&node->ep_lock);\n \tif (node->ep)\n \t\trc = node->ep->xmit(node->ep, skb);\n@@ -237,23 +258,13 @@ EXPORT_SYMBOL_GPL(qrtr_endpoint_post);\n static struct sk_buff *qrtr_alloc_ctrl_packet(u32 type, size_t pkt_len,\n \t\t\t\t\t u32 src_node, u32 dst_node)\n {\n-\tstruct qrtr_hdr *hdr;\n \tstruct sk_buff *skb;\n \n \tskb = alloc_skb(QRTR_HDR_SIZE + pkt_len, GFP_KERNEL);\n \tif (!skb)\n \t\treturn NULL;\n-\tskb_reset_transport_header(skb);\n \n-\thdr = skb_put(skb, QRTR_HDR_SIZE);\n-\thdr->version = cpu_to_le32(QRTR_PROTO_VER);\n-\thdr->type = cpu_to_le32(type);\n-\thdr->src_node_id = cpu_to_le32(src_node);\n-\thdr->src_port_id = cpu_to_le32(QRTR_PORT_CTRL);\n-\thdr->confirm_rx = cpu_to_le32(0);\n-\thdr->size = cpu_to_le32(pkt_len);\n-\thdr->dst_node_id = cpu_to_le32(dst_node);\n-\thdr->dst_port_id = cpu_to_le32(QRTR_PORT_CTRL);\n+\tskb_reserve(skb, QRTR_HDR_SIZE);\n \n \treturn skb;\n }\n@@ -326,6 +337,8 @@ static void qrtr_port_put(struct qrtr_sock *ipc);\n static void qrtr_node_rx_work(struct work_struct *work)\n {\n \tstruct qrtr_node *node = container_of(work, struct qrtr_node, work);\n+\tstruct sockaddr_qrtr dst;\n+\tstruct sockaddr_qrtr src;\n \tstruct sk_buff *skb;\n \n \twhile ((skb = skb_dequeue(&node->rx_queue)) != NULL) {\n@@ -341,6 +354,11 @@ static void qrtr_node_rx_work(struct work_struct *work)\n \t\tdst_port = le32_to_cpu(phdr->dst_port_id);\n \t\tconfirm = !!phdr->confirm_rx;\n \n+\t\tsrc.sq_node = src_node;\n+\t\tsrc.sq_port = le32_to_cpu(phdr->src_port_id);\n+\t\tdst.sq_node = dst_node;\n+\t\tdst.sq_port = dst_port;\n+\n \t\tqrtr_node_assign(node, src_node);\n \n \t\tipc = qrtr_port_lookup(dst_port);\n@@ -357,7 +375,9 @@ static void qrtr_node_rx_work(struct work_struct *work)\n \t\t\tskb = qrtr_alloc_resume_tx(dst_node, node->nid, dst_port);\n \t\t\tif (!skb)\n \t\t\t\tbreak;\n-\t\t\tif (qrtr_node_enqueue(node, skb))\n+\n+\t\t\tif (qrtr_node_enqueue(node, skb, QRTR_TYPE_RESUME_TX,\n+\t\t\t\t\t &dst, &src))\n \t\t\t\tbreak;\n \t\t}\n \t}\n@@ -407,6 +427,8 @@ EXPORT_SYMBOL_GPL(qrtr_endpoint_register);\n void qrtr_endpoint_unregister(struct qrtr_endpoint *ep)\n {\n \tstruct qrtr_node *node = ep->node;\n+\tstruct sockaddr_qrtr src = {AF_QIPCRTR, node->nid, QRTR_PORT_CTRL};\n+\tstruct sockaddr_qrtr dst = {AF_QIPCRTR, qrtr_local_nid, QRTR_PORT_CTRL};\n \tstruct sk_buff *skb;\n \n \tmutex_lock(&node->ep_lock);\n@@ -416,7 +438,7 @@ void qrtr_endpoint_unregister(struct qrtr_endpoint *ep)\n \t/* Notify the local controller about the event */\n \tskb = qrtr_alloc_local_bye(node->nid);\n \tif (skb)\n-\t\tqrtr_local_enqueue(NULL, skb);\n+\t\tqrtr_local_enqueue(NULL, skb, QRTR_TYPE_BYE, &src, &dst);\n \n \tqrtr_node_release(node);\n \tep->node = NULL;\n@@ -454,11 +476,17 @@ static void qrtr_port_remove(struct qrtr_sock *ipc)\n {\n \tstruct sk_buff *skb;\n \tint port = ipc->us.sq_port;\n+\tstruct sockaddr_qrtr to;\n+\n+\tto.sq_family = AF_QIPCRTR;\n+\tto.sq_node = QRTR_NODE_BCAST;\n+\tto.sq_port = QRTR_PORT_CTRL;\n \n \tskb = qrtr_alloc_del_client(&ipc->us);\n \tif (skb) {\n \t\tskb_set_owner_w(skb, &ipc->sk);\n-\t\tqrtr_bcast_enqueue(NULL, skb);\n+\t\tqrtr_bcast_enqueue(NULL, skb, QRTR_TYPE_DEL_CLIENT, &ipc->us,\n+\t\t\t\t &to);\n \t}\n \n \tif (port == QRTR_PORT_CTRL)\n@@ -606,19 +634,25 @@ static int qrtr_bind(struct socket *sock, struct sockaddr *saddr, int len)\n }\n \n /* Queue packet to local peer socket. */\n-static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb)\n+static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb,\n+\t\t\t int type, struct sockaddr_qrtr *from,\n+\t\t\t struct sockaddr_qrtr *to)\n {\n-\tconst struct qrtr_hdr *phdr;\n \tstruct qrtr_sock *ipc;\n+\tstruct qrtr_hdr *phdr;\n \n-\tphdr = (const struct qrtr_hdr *)skb_transport_header(skb);\n-\n-\tipc = qrtr_port_lookup(le32_to_cpu(phdr->dst_port_id));\n+\tipc = qrtr_port_lookup(to->sq_port);\n \tif (!ipc || &ipc->sk == skb->sk) { /* do not send to self */\n \t\tkfree_skb(skb);\n \t\treturn -ENODEV;\n \t}\n \n+\tphdr = skb_push(skb, QRTR_HDR_SIZE);\n+\tskb_reset_transport_header(skb);\n+\n+\tphdr->src_node_id = cpu_to_le32(from->sq_node);\n+\tphdr->src_port_id = cpu_to_le32(from->sq_port);\n+\n \tif (sock_queue_rcv_skb(&ipc->sk, skb)) {\n \t\tqrtr_port_put(ipc);\n \t\tkfree_skb(skb);\n@@ -631,7 +665,9 @@ static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb)\n }\n \n /* Queue packet for broadcast. */\n-static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb)\n+static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb,\n+\t\t\t int type, struct sockaddr_qrtr *from,\n+\t\t\t struct sockaddr_qrtr *to)\n {\n \tstruct sk_buff *skbn;\n \n@@ -641,11 +677,11 @@ static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb)\n \t\tif (!skbn)\n \t\t\tbreak;\n \t\tskb_set_owner_w(skbn, skb->sk);\n-\t\tqrtr_node_enqueue(node, skbn);\n+\t\tqrtr_node_enqueue(node, skbn, type, from, to);\n \t}\n \tmutex_unlock(&qrtr_node_lock);\n \n-\tqrtr_local_enqueue(node, skb);\n+\tqrtr_local_enqueue(node, skb, type, from, to);\n \n \treturn 0;\n }\n@@ -653,13 +689,14 @@ static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb)\n static int qrtr_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)\n {\n \tDECLARE_SOCKADDR(struct sockaddr_qrtr *, addr, msg->msg_name);\n-\tint (*enqueue_fn)(struct qrtr_node *, struct sk_buff *);\n+\tint (*enqueue_fn)(struct qrtr_node *, struct sk_buff *, int,\n+\t\t\t struct sockaddr_qrtr *, struct sockaddr_qrtr *);\n \tstruct qrtr_sock *ipc = qrtr_sk(sock->sk);\n \tstruct sock *sk = sock->sk;\n \tstruct qrtr_node *node;\n-\tstruct qrtr_hdr *hdr;\n \tstruct sk_buff *skb;\n \tsize_t plen;\n+\tu32 type = QRTR_TYPE_DATA;\n \tint rc;\n \n \tif (msg->msg_flags & ~(MSG_DONTWAIT))\n@@ -713,32 +750,14 @@ static int qrtr_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)\n \tif (!skb)\n \t\tgoto out_node;\n \n-\tskb_reset_transport_header(skb);\n-\tskb_put(skb, len + QRTR_HDR_SIZE);\n-\n-\thdr = (struct qrtr_hdr *)skb_transport_header(skb);\n-\thdr->version = cpu_to_le32(QRTR_PROTO_VER);\n-\thdr->src_node_id = cpu_to_le32(ipc->us.sq_node);\n-\thdr->src_port_id = cpu_to_le32(ipc->us.sq_port);\n-\thdr->confirm_rx = cpu_to_le32(0);\n-\thdr->size = cpu_to_le32(len);\n-\thdr->dst_node_id = cpu_to_le32(addr->sq_node);\n-\thdr->dst_port_id = cpu_to_le32(addr->sq_port);\n+\tskb_reserve(skb, QRTR_HDR_SIZE);\n \n-\trc = skb_copy_datagram_from_iter(skb, QRTR_HDR_SIZE,\n-\t\t\t\t\t &msg->msg_iter, len);\n+\trc = memcpy_from_msg(skb_put(skb, len), msg, len);\n \tif (rc) {\n \t\tkfree_skb(skb);\n \t\tgoto out_node;\n \t}\n \n-\tif (plen != len) {\n-\t\trc = skb_pad(skb, plen - len);\n-\t\tif (rc)\n-\t\t\tgoto out_node;\n-\t\tskb_put(skb, plen - len);\n-\t}\n-\n \tif (ipc->us.sq_port == QRTR_PORT_CTRL) {\n \t\tif (len < 4) {\n \t\t\trc = -EINVAL;\n@@ -747,12 +766,11 @@ static int qrtr_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)\n \t\t}\n \n \t\t/* control messages already require the type as 'command' */\n-\t\tskb_copy_bits(skb, QRTR_HDR_SIZE, &hdr->type, 4);\n-\t} else {\n-\t\thdr->type = cpu_to_le32(QRTR_TYPE_DATA);\n+\t\tskb_copy_bits(skb, 0, &type, 4);\n+\t\ttype = le32_to_cpu(type);\n \t}\n \n-\trc = enqueue_fn(node, skb);\n+\trc = enqueue_fn(node, skb, type, &ipc->us, addr);\n \tif (rc >= 0)\n \t\trc = len;\n \n", "prefixes": [ "4/7" ] }