{"id":806155,"url":"http://patchwork.ozlabs.org/api/1.2/patches/806155/?format=json","web_url":"http://patchwork.ozlabs.org/project/netdev/patch/1503780970-10312-5-git-send-email-andrew@lunn.ch/","project":{"id":7,"url":"http://patchwork.ozlabs.org/api/1.2/projects/7/?format=json","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":"<1503780970-10312-5-git-send-email-andrew@lunn.ch>","list_archive_url":null,"date":"2017-08-26T20:56:09","name":"[RFC,WIP,4/5] net: dsa: HACK: Handle MDB add/remove for none-switch ports","commit_ref":null,"pull_url":null,"state":"rfc","archived":true,"hash":"0abdda17f741a7539b28bba5d2b37ad1b99c7651","submitter":{"id":13608,"url":"http://patchwork.ozlabs.org/api/1.2/people/13608/?format=json","name":"Andrew Lunn","email":"andrew@lunn.ch"},"delegate":{"id":34,"url":"http://patchwork.ozlabs.org/api/1.2/users/34/?format=json","username":"davem","first_name":"David","last_name":"Miller","email":"davem@davemloft.net"},"mbox":"http://patchwork.ozlabs.org/project/netdev/patch/1503780970-10312-5-git-send-email-andrew@lunn.ch/mbox/","series":[],"comments":"http://patchwork.ozlabs.org/api/patches/806155/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/806155/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>)","Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xfr4V2b5Zz9s8V\n\tfor <patchwork-incoming@ozlabs.org>;\n\tSun, 27 Aug 2017 06:59:22 +1000 (AEST)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751161AbdHZU7U (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tSat, 26 Aug 2017 16:59:20 -0400","from vps0.lunn.ch ([178.209.37.122]:45166 \"EHLO vps0.lunn.ch\"\n\trhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP\n\tid S1751083AbdHZU7T (ORCPT <rfc822;netdev@vger.kernel.org>);\n\tSat, 26 Aug 2017 16:59:19 -0400","from andrew by vps0.lunn.ch with local (Exim 4.84_2)\n\t(envelope-from <andrew@lunn.ch>)\n\tid 1dli8H-0002hN-Dp; Sat, 26 Aug 2017 22:56:41 +0200"],"From":"Andrew Lunn <andrew@lunn.ch>","To":"netdev <netdev@vger.kernel.org>","Cc":"Vivien Didelot <vivien.didelot@savoirfairelinux.com>,\n\tFlorian Fainelli <f.fainelli@gmail.com>,\n\tnikolay@cumulusnetworks.com, jiri@mellanox.com,\n\troopa@cumulusnetworks.com, stephen@networkplumber.org,\n\tbridge@lists.linux-foundation.org, Andrew Lunn <andrew@lunn.ch>","Subject":"[PATCH RFC WIP 4/5] net: dsa: HACK: Handle MDB add/remove for\n\tnone-switch ports","Date":"Sat, 26 Aug 2017 22:56:09 +0200","Message-Id":"<1503780970-10312-5-git-send-email-andrew@lunn.ch>","X-Mailer":"git-send-email 2.1.4","In-Reply-To":"<1503780970-10312-1-git-send-email-andrew@lunn.ch>","References":"<1503780970-10312-1-git-send-email-andrew@lunn.ch>","Sender":"netdev-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<netdev.vger.kernel.org>","X-Mailing-List":"netdev@vger.kernel.org"},"content":"When there is a mdb added to a port which is not in the switch, we\nneed the switch to forward traffic for the group to the software\nbridge, so it can forward it out the none-switch port.\n\nThe current implementation is a hack and will be replaced. Currently\nonly the bridge soft interface is supported. When there is a\njoin/leave on the soft interface, switchdev calls are made on the soft\ninterface device, brX. This does not have a switchdev ops structure\nregistered, so all lower interfaces of brX get there switchdev\nfunction called. These are switch ports, and do have switchdev ops. By\ncomparing the original interface to the called interface, we can\ndetermine this is not for a switch port, and add/remove the mdb to the\nCPU port.\n---\n net/dsa/port.c | 19 +++++++++++++++++--\n 1 file changed, 17 insertions(+), 2 deletions(-)","diff":"diff --git a/net/dsa/port.c b/net/dsa/port.c\nindex d6e07176df3f..d8e4bfefd97d 100644\n--- a/net/dsa/port.c\n+++ b/net/dsa/port.c\n@@ -194,8 +194,15 @@ int dsa_port_mdb_add(struct dsa_port *dp,\n \t\t.mdb = mdb,\n \t};\n \n-\tpr_info(\"dsa_port_mdb_add: %d %d\", info.sw_index, info.port);\n-\n+\tif (dp->netdev != mdb->obj.orig_dev) {\n+\t\t/* Not a port for this switch, so forward\n+\t\t * multicast out the CPU port to the bridge.\n+\t\t */\n+\t\tstruct dsa_switch_tree *dst = dp->ds->dst;\n+\t\tstruct dsa_port *cpu_dp = dsa_get_cpu_port(dst);\n+\t\tinfo.port = cpu_dp->index;\n+\t\treturn dsa_port_notify(cpu_dp, DSA_NOTIFIER_MDB_ADD, &info);\n+\t}\n \treturn dsa_port_notify(dp, DSA_NOTIFIER_MDB_ADD, &info);\n }\n \n@@ -208,6 +215,14 @@ int dsa_port_mdb_del(struct dsa_port *dp,\n \t\t.mdb = mdb,\n \t};\n \n+\tif (dp->netdev != mdb->obj.orig_dev) {\n+\t\tstruct dsa_switch_tree *dst = dp->ds->dst;\n+\t\tstruct dsa_port *cpu_dp = dsa_get_cpu_port(dst);\n+\n+\t\tinfo.port = cpu_dp->index;\n+\t\treturn dsa_port_notify(cpu_dp, DSA_NOTIFIER_MDB_DEL, &info);\n+\t}\n+\n \treturn dsa_port_notify(dp, DSA_NOTIFIER_MDB_DEL, &info);\n }\n \n","prefixes":["RFC","WIP","4/5"]}