Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/815218/?format=api
{ "id": 815218, "url": "http://patchwork.ozlabs.org/api/patches/815218/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/20170919003904.5124-5-tom@quantonium.net/", "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": "<20170919003904.5124-5-tom@quantonium.net>", "list_archive_url": null, "date": "2017-09-19T00:38:54", "name": "[net-next,04/14] gtp: udp recv clean up", "commit_ref": null, "pull_url": null, "state": "changes-requested", "archived": true, "hash": "a69ff19faa92ab19a5cbc80ce96d27a46d1d13bc", "submitter": { "id": 72064, "url": "http://patchwork.ozlabs.org/api/people/72064/?format=api", "name": "Tom Herbert", "email": "tom@quantonium.net" }, "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/20170919003904.5124-5-tom@quantonium.net/mbox/", "series": [ { "id": 3758, "url": "http://patchwork.ozlabs.org/api/series/3758/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/list/?series=3758", "date": "2017-09-19T00:38:50", "name": "gtp: Additional feature support", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/3758/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/815218/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/815218/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 (2048-bit key;\n\tunprotected) header.d=quantonium-net.20150623.gappssmtp.com\n\theader.i=@quantonium-net.20150623.gappssmtp.com\n\theader.b=\"xhHOua33\"; dkim-atps=neutral" ], "Received": [ "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xx3tM69cdz9s5L\n\tfor <patchwork-incoming@ozlabs.org>;\n\tTue, 19 Sep 2017 10:39:55 +1000 (AEST)", "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751378AbdISAjo (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tMon, 18 Sep 2017 20:39:44 -0400", "from mail-pf0-f176.google.com ([209.85.192.176]:53059 \"EHLO\n\tmail-pf0-f176.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1751227AbdISAjm (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Mon, 18 Sep 2017 20:39:42 -0400", "by mail-pf0-f176.google.com with SMTP id p87so1103621pfj.9\n\tfor <netdev@vger.kernel.org>; Mon, 18 Sep 2017 17:39:42 -0700 (PDT)", "from localhost.localdomain (c-73-162-13-107.hsd1.ca.comcast.net.\n\t[73.162.13.107]) by smtp.gmail.com with ESMTPSA id\n\tk78sm662018pfb.157.2017.09.18.17.39.40\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tMon, 18 Sep 2017 17:39:41 -0700 (PDT)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=quantonium-net.20150623.gappssmtp.com; s=20150623;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=cf1PHU9itUm9XgenGeS6L3jYR1k9PqG510l88SnyXO0=;\n\tb=xhHOua336d0A21CIkcB+giRb01/r1BsZ4ex9IgXjEIBy79cobIfgKl1//qyraJ0KgP\n\tF1pNjaMTCz7aD4bmV6T04vXezJPo4iGeUS6CFeT0ISZQGGYPHz6zi3UMP6i+sxN6Q3QH\n\tV6id6YuM+8A45ilL+wZGYNpUH0PN3CbR2HfYcJcwxYG1fUTZdCxsFivG2Ew0gdmVaHLS\n\tifeXODWj9K8JA47gseRd0CMdCgsV5bAwJUaUEtIynO3iHz43JGUQef2qW4EsC2B4ScBW\n\tBYfAvwMXAyfk0HUA9XWiGPuNtwmJWxMGqZ0+6VI+6dowfz0l3sO4sWai5iSfHdoSaKaC\n\tCBTQ==", "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=cf1PHU9itUm9XgenGeS6L3jYR1k9PqG510l88SnyXO0=;\n\tb=pbO6v2KeGzks0mIjOGHB1edhWiPb/jWyrml+98e6K+iC6++3QS5Z50SO5YLYuUQqmD\n\t7ozc1fK8dmN+0RuZ0d+nNY3q9tE11BgbJN//h1xmaxX11XTVO0Rr8uiY2iqFmPg4beal\n\tAi9ilJzF1XfNng3p+jGStv0i7qIn2qbIFBlHNfePytbM8M18ToFS3VZpQhy3uvyA5SOk\n\tTUThxtDa5VsvZ8O6j4XZQmbqkaQhOgt/ynGwsDqTJ+G4iOoJpW89cACUSDqsWiB7Roxb\n\tNOpqGq76chrenICB3DosVhwIT0mOLyFC3poXeAOUqRyqU1Ol1jJ2Lmpg/tX5M0gxcvOW\n\tMaDA==", "X-Gm-Message-State": "AHPjjUit5LwifCk6w1EaagDnbWNe0myvs18PreeDHGYw/fq5GRPQNjAk\n\tr4jhOHj25JJdbWqW", "X-Google-Smtp-Source": "AOwi7QBfZxXrYU1v7o6Mqtdh5kc3V6jgYsweYNo5qg/9H7xsRRPDiYiUl3Dh3vglk52IPIhotuZEoA==", "X-Received": "by 10.98.26.201 with SMTP id a192mr309961pfa.311.1505781581978; \n\tMon, 18 Sep 2017 17:39:41 -0700 (PDT)", "From": "Tom Herbert <tom@quantonium.net>", "To": "davem@davemloft.net", "Cc": "netdev@vger.kernel.org, pablo@netfilter.org, laforge@gnumonks.org,\n\trohit@quantonium.net, Tom Herbert <tom@quantonium.net>", "Subject": "[PATCH net-next 04/14] gtp: udp recv clean up", "Date": "Mon, 18 Sep 2017 17:38:54 -0700", "Message-Id": "<20170919003904.5124-5-tom@quantonium.net>", "X-Mailer": "git-send-email 2.11.0", "In-Reply-To": "<20170919003904.5124-1-tom@quantonium.net>", "References": "<20170919003904.5124-1-tom@quantonium.net>", "Sender": "netdev-owner@vger.kernel.org", "Precedence": "bulk", "List-ID": "<netdev.vger.kernel.org>", "X-Mailing-List": "netdev@vger.kernel.org" }, "content": "Create separate UDP receive functions for GTP version 0 and version 1.\nSet encap_rcv appropriately when configuring a socket. Also, convert to\nusing gro_cells.\n\nSigned-off-by: Tom Herbert <tom@quantonium.net>\n---\n drivers/net/gtp.c | 130 +++++++++++++++++++++++++++++-------------------------\n 1 file changed, 71 insertions(+), 59 deletions(-)", "diff": "diff --git a/drivers/net/gtp.c b/drivers/net/gtp.c\nindex 95df3bcebbb2..1de2ea6217ea 100644\n--- a/drivers/net/gtp.c\n+++ b/drivers/net/gtp.c\n@@ -80,6 +80,8 @@ struct gtp_dev {\n \tunsigned int\t\thash_size;\n \tstruct hlist_head\t*tid_hash;\n \tstruct hlist_head\t*addr_hash;\n+\n+\tstruct gro_cells\tgro_cells;\n };\n \n static unsigned int gtp_net_id __read_mostly;\n@@ -217,55 +219,83 @@ static int gtp_rx(struct pdp_ctx *pctx, struct sk_buff *skb,\n \tstats->rx_bytes += skb->len;\n \tu64_stats_update_end(&stats->syncp);\n \n-\tnetif_rx(skb);\n+\tgro_cells_receive(>p->gro_cells, skb);\n+\n \treturn 0;\n }\n \n-/* 1 means pass up to the stack, -1 means drop and 0 means decapsulated. */\n-static int gtp0_udp_encap_recv(struct gtp_dev *gtp, struct sk_buff *skb)\n+/* UDP encapsulation receive handler for GTPv0-U . See net/ipv4/udp.c.\n+ * Return codes: 0: success, <0: error, >0: pass up to userspace UDP socket.\n+ */\n+static int gtp0_udp_encap_recv(struct sock *sk, struct sk_buff *skb)\n {\n+\tstruct gtp_dev *gtp = rcu_dereference_sk_user_data(sk);\n \tunsigned int hdrlen = sizeof(struct udphdr) +\n \t\t\t sizeof(struct gtp0_header);\n \tstruct gtp0_header *gtp0;\n \tstruct pdp_ctx *pctx;\n \n+\tif (!gtp)\n+\t\tgoto pass;\n+\n \tif (!pskb_may_pull(skb, hdrlen))\n-\t\treturn -1;\n+\t\tgoto drop;\n \n \tgtp0 = (struct gtp0_header *)(skb->data + sizeof(struct udphdr));\n \n \tif ((gtp0->flags >> 5) != GTP_V0)\n-\t\treturn 1;\n+\t\tgoto pass;\n \n \tif (gtp0->type != GTP_TPDU)\n-\t\treturn 1;\n+\t\tgoto pass;\n+\n+\tnetdev_dbg(gtp->dev, \"received GTP0 packet\\n\");\n \n \tpctx = gtp0_pdp_find(gtp, be64_to_cpu(gtp0->tid));\n \tif (!pctx) {\n \t\tnetdev_dbg(gtp->dev, \"No PDP ctx to decap skb=%p\\n\", skb);\n-\t\treturn 1;\n+\t\tgoto pass;\n+\t}\n+\n+\tif (!gtp_rx(pctx, skb, hdrlen, gtp->role)) {\n+\t\t/* Successfully received */\n+\t\treturn 0;\n \t}\n \n-\treturn gtp_rx(pctx, skb, hdrlen, gtp->role);\n+drop:\n+\tkfree_skb(skb);\n+\treturn 0;\n+\n+pass:\n+\treturn 1;\n }\n \n-static int gtp1u_udp_encap_recv(struct gtp_dev *gtp, struct sk_buff *skb)\n+/* UDP encapsulation receive handler for GTPv0-U . See net/ipv4/udp.c.\n+ * Return codes: 0: success, <0: error, >0: pass up to userspace UDP socket.\n+ */\n+static int gtp1u_udp_encap_recv(struct sock *sk, struct sk_buff *skb)\n {\n+\tstruct gtp_dev *gtp = rcu_dereference_sk_user_data(sk);\n \tunsigned int hdrlen = sizeof(struct udphdr) +\n \t\t\t sizeof(struct gtp1_header);\n \tstruct gtp1_header *gtp1;\n \tstruct pdp_ctx *pctx;\n \n+\tif (!gtp)\n+\t\tgoto pass;\n+\n \tif (!pskb_may_pull(skb, hdrlen))\n-\t\treturn -1;\n+\t\tgoto drop;\n \n \tgtp1 = (struct gtp1_header *)(skb->data + sizeof(struct udphdr));\n \n \tif ((gtp1->flags >> 5) != GTP_V1)\n-\t\treturn 1;\n+\t\tgoto pass;\n \n \tif (gtp1->type != GTP_TPDU)\n-\t\treturn 1;\n+\t\tgoto pass;\n+\n+\tnetdev_dbg(gtp->dev, \"received GTP1 packet\\n\");\n \n \t/* From 29.060: \"This field shall be present if and only if any one or\n \t * more of the S, PN and E flags are set.\".\n@@ -278,17 +308,27 @@ static int gtp1u_udp_encap_recv(struct gtp_dev *gtp, struct sk_buff *skb)\n \n \t/* Make sure the header is larger enough, including extensions. */\n \tif (!pskb_may_pull(skb, hdrlen))\n-\t\treturn -1;\n+\t\tgoto drop;\n \n \tgtp1 = (struct gtp1_header *)(skb->data + sizeof(struct udphdr));\n \n \tpctx = gtp1_pdp_find(gtp, ntohl(gtp1->tid));\n \tif (!pctx) {\n \t\tnetdev_dbg(gtp->dev, \"No PDP ctx to decap skb=%p\\n\", skb);\n-\t\treturn 1;\n+\t\tgoto pass;\n+\t}\n+\n+\tif (!gtp_rx(pctx, skb, hdrlen, gtp->role)) {\n+\t\t/* Successfully received */\n+\t\treturn 0;\n \t}\n \n-\treturn gtp_rx(pctx, skb, hdrlen, gtp->role);\n+drop:\n+\tkfree_skb(skb);\n+\treturn 0;\n+\n+pass:\n+\treturn 1;\n }\n \n static void gtp_encap_destroy(struct sock *sk)\n@@ -317,49 +357,6 @@ static void gtp_encap_disable(struct gtp_dev *gtp)\n \tgtp_encap_disable_sock(gtp->sk1u);\n }\n \n-/* UDP encapsulation receive handler. See net/ipv4/udp.c.\n- * Return codes: 0: success, <0: error, >0: pass up to userspace UDP socket.\n- */\n-static int gtp_encap_recv(struct sock *sk, struct sk_buff *skb)\n-{\n-\tstruct gtp_dev *gtp;\n-\tint ret = 0;\n-\n-\tgtp = rcu_dereference_sk_user_data(sk);\n-\tif (!gtp)\n-\t\treturn 1;\n-\n-\tnetdev_dbg(gtp->dev, \"encap_recv sk=%p\\n\", sk);\n-\n-\tswitch (udp_sk(sk)->encap_type) {\n-\tcase UDP_ENCAP_GTP0:\n-\t\tnetdev_dbg(gtp->dev, \"received GTP0 packet\\n\");\n-\t\tret = gtp0_udp_encap_recv(gtp, skb);\n-\t\tbreak;\n-\tcase UDP_ENCAP_GTP1U:\n-\t\tnetdev_dbg(gtp->dev, \"received GTP1U packet\\n\");\n-\t\tret = gtp1u_udp_encap_recv(gtp, skb);\n-\t\tbreak;\n-\tdefault:\n-\t\tret = -1; /* Shouldn't happen. */\n-\t}\n-\n-\tswitch (ret) {\n-\tcase 1:\n-\t\tnetdev_dbg(gtp->dev, \"pass up to the process\\n\");\n-\t\tbreak;\n-\tcase 0:\n-\t\tbreak;\n-\tcase -1:\n-\t\tnetdev_dbg(gtp->dev, \"GTP packet has been dropped\\n\");\n-\t\tkfree_skb(skb);\n-\t\tret = 0;\n-\t\tbreak;\n-\t}\n-\n-\treturn ret;\n-}\n-\n static int gtp_dev_init(struct net_device *dev)\n {\n \tstruct gtp_dev *gtp = netdev_priv(dev);\n@@ -627,6 +624,8 @@ static void gtp_link_setup(struct net_device *dev)\n \t\t\t\t sizeof(struct iphdr) +\n \t\t\t\t sizeof(struct udphdr) +\n \t\t\t\t sizeof(struct gtp0_header);\n+\n+\tgro_cells_init(>p->gro_cells, dev);\n }\n \n static int gtp_hashtable_new(struct gtp_dev *gtp, int hsize);\n@@ -683,6 +682,7 @@ static void gtp_dellink(struct net_device *dev, struct list_head *head)\n {\n \tstruct gtp_dev *gtp = netdev_priv(dev);\n \n+\tgro_cells_destroy(>p->gro_cells);\n \tgtp_encap_disable(gtp);\n \tgtp_hashtable_free(gtp);\n \tlist_del_rcu(>p->list);\n@@ -804,9 +804,21 @@ static struct sock *gtp_encap_enable_socket(int fd, int type,\n \tsk = sock->sk;\n \tsock_hold(sk);\n \n+\tswitch (type) {\n+\tcase UDP_ENCAP_GTP0:\n+\t\ttuncfg.encap_rcv = gtp0_udp_encap_recv;\n+\t\tbreak;\n+\tcase UDP_ENCAP_GTP1U:\n+\t\ttuncfg.encap_rcv = gtp1u_udp_encap_recv;\n+\t\tbreak;\n+\tdefault:\n+\t\tpr_debug(\"Unknown encap type %u\\n\", type);\n+\t\tsk = ERR_PTR(-EINVAL);\n+\t\tgoto out_sock;\n+\t}\n+\n \ttuncfg.sk_user_data = gtp;\n \ttuncfg.encap_type = type;\n-\ttuncfg.encap_rcv = gtp_encap_recv;\n \ttuncfg.encap_destroy = gtp_encap_destroy;\n \n \tsetup_udp_tunnel_sock(sock_net(sock->sk), sock, &tuncfg);\n", "prefixes": [ "net-next", "04/14" ] }