Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/952120/?format=api
{ "id": 952120, "url": "http://patchwork.ozlabs.org/api/patches/952120/?format=api", "web_url": "http://patchwork.ozlabs.org/project/openvswitch/patch/20180801121635.14509-3-vkommadi@redhat.com/", "project": { "id": 47, "url": "http://patchwork.ozlabs.org/api/projects/47/?format=api", "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": "<20180801121635.14509-3-vkommadi@redhat.com>", "list_archive_url": null, "date": "2018-08-01T12:16:33", "name": "[ovs-dev,v7,2/4] Send gateway port ARP through router internal ports", "commit_ref": null, "pull_url": null, "state": "deferred", "archived": false, "hash": "3d833669ea7a68581cf915c8e41e2b99d9ab837d", "submitter": { "id": 67383, "url": "http://patchwork.ozlabs.org/api/people/67383/?format=api", "name": "Venkata Anil", "email": "vkommadi@redhat.com" }, "delegate": { "id": 55684, "url": "http://patchwork.ozlabs.org/api/users/55684/?format=api", "username": "jpettit", "first_name": "Justin", "last_name": "Pettit", "email": "jpettit@nicira.com" }, "mbox": "http://patchwork.ozlabs.org/project/openvswitch/patch/20180801121635.14509-3-vkommadi@redhat.com/mbox/", "series": [ { "id": 58787, "url": "http://patchwork.ozlabs.org/api/series/58787/?format=api", "web_url": "http://patchwork.ozlabs.org/project/openvswitch/list/?series=58787", "date": "2018-08-01T12:16:31", "name": "Use VLANs for VLAN packets redirected to a gateway chassis", "version": 7, "mbox": "http://patchwork.ozlabs.org/series/58787/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/952120/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/952120/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@mail.linuxfoundation.org" ], "Authentication-Results": [ "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=openvswitch.org\n\t(client-ip=140.211.169.12; helo=mail.linuxfoundation.org;\n\tenvelope-from=ovs-dev-bounces@openvswitch.org;\n\treceiver=<UNKNOWN>)", "ozlabs.org;\n\tdmarc=fail (p=none dis=none) header.from=redhat.com" ], "Received": [ "from mail.linuxfoundation.org (mail.linuxfoundation.org\n\t[140.211.169.12])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256\n\tbits)) (No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 41gXQ04hkYz9s3Z\n\tfor <incoming@patchwork.ozlabs.org>;\n\tWed, 1 Aug 2018 22:18:00 +1000 (AEST)", "from mail.linux-foundation.org (localhost [127.0.0.1])\n\tby mail.linuxfoundation.org (Postfix) with ESMTP id 1C558DD5;\n\tWed, 1 Aug 2018 12:16:54 +0000 (UTC)", "from smtp1.linuxfoundation.org (smtp1.linux-foundation.org\n\t[172.17.192.35])\n\tby mail.linuxfoundation.org (Postfix) with ESMTPS id 55D54DB3\n\tfor <dev@openvswitch.org>; Wed, 1 Aug 2018 12:16:53 +0000 (UTC)", "from mx1.redhat.com (mx3-rdu2.redhat.com [66.187.233.73])\n\tby smtp1.linuxfoundation.org (Postfix) with ESMTPS id 9783C701\n\tfor <dev@openvswitch.org>; Wed, 1 Aug 2018 12:16:52 +0000 (UTC)", "from smtp.corp.redhat.com\n\t(int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby mx1.redhat.com (Postfix) with ESMTPS id C19657DAC8\n\tfor <dev@openvswitch.org>; Wed, 1 Aug 2018 12:16:51 +0000 (UTC)", "from vkommadi.lab.eng.blr.redhat.com\n\t(dhcp35-207.lab.eng.blr.redhat.com [10.70.35.207])\n\tby smtp.corp.redhat.com (Postfix) with ESMTPS id 9D7011C641;\n\tWed, 1 Aug 2018 12:16:50 +0000 (UTC)" ], "X-Greylist": [ "domain auto-whitelisted by SQLgrey-1.7.6", "Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.11.55.2]);\n\tWed, 01 Aug 2018 12:16:51 +0000 (UTC)", "inspected by milter-greylist-4.5.16 (mx1.redhat.com\n\t[10.11.55.2]); \n\tWed, 01 Aug 2018 12:16:51 +0000 (UTC) for IP:'10.11.54.5'\n\tDOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com'\n\tHELO:'smtp.corp.redhat.com' FROM:'vkommadi@redhat.com' RCPT:''" ], "From": "vkommadi@redhat.com", "To": "dev@openvswitch.org", "Date": "Wed, 1 Aug 2018 17:46:33 +0530", "Message-Id": "<20180801121635.14509-3-vkommadi@redhat.com>", "In-Reply-To": "<20180801121635.14509-1-vkommadi@redhat.com>", "References": "<20180801121635.14509-1-vkommadi@redhat.com>", "X-Scanned-By": "MIMEDefang 2.79 on 10.11.54.5", "X-Spam-Status": "No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED\n\tautolearn=ham version=3.3.1", "X-Spam-Checker-Version": "SpamAssassin 3.3.1 (2010-03-16) on\n\tsmtp1.linux-foundation.org", "Subject": "[ovs-dev] [PATCH v7 2/4] Send gateway port ARP through router\n\tinternal ports", "X-BeenThere": "ovs-dev@openvswitch.org", "X-Mailman-Version": "2.1.12", "Precedence": "list", "List-Id": "<ovs-dev.openvswitch.org>", "List-Unsubscribe": "<https://mail.openvswitch.org/mailman/options/ovs-dev>,\n\t<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\t<mailto:ovs-dev-request@openvswitch.org?subject=subscribe>", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=\"us-ascii\"", "Content-Transfer-Encoding": "7bit", "Sender": "ovs-dev-bounces@openvswitch.org", "Errors-To": "ovs-dev-bounces@openvswitch.org" }, "content": "From: venkata anil <vkommadi@redhat.com>\n\nExternal switches should learn the distributed gateway port MAC address\nas they have to forward the packet tagged with tenant vlan network but\nwith this MAC as destination MAC address. So router has to send ARP\nreply and gARP for this MAC address through router internal patch ports\nconnecting tenant vlan networks.\n\nSigned-off-by: Venkata Anil <vkommadi@redhat.com>\n---\n\nv6->v7:\n* Rebased\n* Addressed review comments\n\nv5->v6:\n* Rebased\n\nv4->v5:\n* No changes in this patch\n\n\n ovn/controller/pinctrl.c | 57 +++++++++++++++++++++++++++++++++++++++++++-----\n ovn/northd/ovn-northd.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++\n tests/ovn.at | 6 +++++\n 3 files changed, 114 insertions(+), 6 deletions(-)", "diff": "diff --git a/ovn/controller/pinctrl.c b/ovn/controller/pinctrl.c\nindex a0bf602..d01e57f 100644\n--- a/ovn/controller/pinctrl.c\n+++ b/ovn/controller/pinctrl.c\n@@ -2185,8 +2185,47 @@ get_nat_addresses_and_keys(struct ovsdb_idl_index *sbrec_chassis_by_name,\n struct sset *local_l3gw_ports,\n const struct sbrec_chassis *chassis,\n const struct sset *active_tunnels,\n- struct shash *nat_addresses)\n+ struct shash *nat_addresses,\n+ const struct hmap *local_datapaths)\n {\n+ /* When a router has tenant vlan networks, gARP for distributed gateway\n+ * router port has to be sent through internal tenant vlan network's\n+ * localnet port, so that external switches can learn this MAC and forward\n+ * tenant vlan network traffic with distributed gateway router port MAC\n+ * as destination MAC address */\n+\n+ struct local_datapath *ldp;\n+ struct shash router_vlan_ports;\n+\n+ shash_init(&router_vlan_ports);\n+ HMAP_FOR_EACH (ldp, hmap_node, local_datapaths) {\n+ const struct sbrec_port_binding *crp;\n+ crp = ldp->chassisredirect_port;\n+ /* check if it a router with chassis redirect port,\n+ * get corresponding distributed port */\n+ if (crp && crp->chassis &&\n+ !strcmp(crp->chassis->name, chassis->name)) {\n+ const struct sbrec_port_binding *dp = NULL;\n+ for (int i = 0; i < ldp->n_peer_dps; i++) {\n+ if (!strcmp(ldp->peer_dps[i]->patch->logical_port,\n+ smap_get(&crp->options, \"distributed-port\"))) {\n+ dp = ldp->peer_dps[i]->peer;\n+ break;\n+ }\n+ }\n+\n+ /* Save router internal port (patch port on tenant vlan network)\n+ * along with distributed port. */\n+ for (int i = 0; i < ldp->n_peer_dps; i++) {\n+ if (strcmp(ldp->peer_dps[i]->patch->logical_port,\n+ smap_get(&crp->options, \"distributed-port\"))) {\n+ shash_add(&router_vlan_ports,\n+ ldp->peer_dps[i]->peer->logical_port, dp);\n+ }\n+ }\n+ }\n+ }\n+\n const char *gw_port;\n SSET_FOR_EACH(gw_port, local_l3gw_ports) {\n const struct sbrec_port_binding *pb;\n@@ -2196,11 +2235,16 @@ get_nat_addresses_and_keys(struct ovsdb_idl_index *sbrec_chassis_by_name,\n continue;\n }\n \n- if (pb->n_nat_addresses) {\n- for (int i = 0; i < pb->n_nat_addresses; i++) {\n+ /* Router internal ports should send gARP for distributed port\n+ * NAT addresses */\n+ const struct sbrec_port_binding *dp;\n+ dp = shash_find_data(&router_vlan_ports, pb->logical_port);\n+ const struct sbrec_port_binding *nat_port = dp ? dp : pb;\n+ if (nat_port->n_nat_addresses) {\n+ for (int i = 0; i < nat_port->n_nat_addresses; i++) {\n consider_nat_address(sbrec_chassis_by_name,\n sbrec_port_binding_by_name,\n- pb->nat_addresses[i], pb,\n+ nat_port->nat_addresses[i], pb,\n nat_address_keys, chassis,\n active_tunnels,\n nat_addresses);\n@@ -2208,7 +2252,7 @@ get_nat_addresses_and_keys(struct ovsdb_idl_index *sbrec_chassis_by_name,\n } else {\n /* Continue to support options:nat-addresses for version\n * upgrade. */\n- const char *nat_addresses_options = smap_get(&pb->options,\n+ const char *nat_addresses_options = smap_get(&nat_port->options,\n \"nat-addresses\");\n if (nat_addresses_options) {\n consider_nat_address(sbrec_chassis_by_name,\n@@ -2220,6 +2264,7 @@ get_nat_addresses_and_keys(struct ovsdb_idl_index *sbrec_chassis_by_name,\n }\n }\n }\n+ shash_destroy(&router_vlan_ports);\n }\n \n static void\n@@ -2255,7 +2300,7 @@ send_garp_run(struct ovsdb_idl_index *sbrec_chassis_by_name,\n sbrec_port_binding_by_name,\n &nat_ip_keys, &local_l3gw_ports,\n chassis, active_tunnels,\n- &nat_addresses);\n+ &nat_addresses, local_datapaths);\n /* For deleted ports and deleted nat ips, remove from send_garp_data. */\n struct shash_node *iter, *next;\n SHASH_FOR_EACH_SAFE (iter, next, &send_garp_data) {\ndiff --git a/ovn/northd/ovn-northd.c b/ovn/northd/ovn-northd.c\nindex 2497a5b..bcf0b66 100644\n--- a/ovn/northd/ovn-northd.c\n+++ b/ovn/northd/ovn-northd.c\n@@ -5043,6 +5043,63 @@ build_lrouter_flows(struct hmap *datapaths, struct hmap *ports,\n ds_cstr(&match), ds_cstr(&actions));\n }\n \n+ /* ARP requests for distributed port IP address but coming from router\n+ * internal network vlan, should be replied through router internal\n+ * network vlan ports */\n+ if (op->od->l3dgw_port && (op == op->od->l3dgw_port)\n+ && op->od->l3redirect_port) {\n+ for (int i = 0; i < op->lrp_networks.n_ipv4_addrs; i++) {\n+ ds_clear(&match);\n+ ds_put_format(&match,\n+ \"flags.rcv_from_vlan == 1 && \"\n+ \"arp.tpa == %s && arp.op == 1 && \"\n+ \"is_chassis_resident(%s)\",\n+ op->lrp_networks.ipv4_addrs[i].addr_s,\n+ op->od->l3redirect_port->json_key);\n+\n+ ds_clear(&actions);\n+ ds_put_format(&actions,\n+ \"eth.dst = eth.src; \"\n+ \"eth.src = %s; \"\n+ \"arp.op = 2; /* ARP reply */ \"\n+ \"arp.tha = arp.sha; \"\n+ \"arp.sha = %s; \"\n+ \"arp.tpa = arp.spa; \"\n+ \"arp.spa = %s; \"\n+ \"flags.loopback = 1; \",\n+ op->lrp_networks.ea_s,\n+ op->lrp_networks.ea_s,\n+ op->lrp_networks.ipv4_addrs[i].addr_s);\n+\n+ /* Add internal vlan network ports as output ports */\n+ bool router_ports_exist = false;\n+ struct ovn_datapath *dp;\n+ HMAP_FOR_EACH (dp, key_node, datapaths) {\n+ if (!dp->nbs) {\n+ continue;\n+ }\n+ if (!dp->localnet_port) {\n+ continue;\n+ }\n+ for (size_t j = 0; j < dp->n_router_ports; j++) {\n+ struct ovn_port *rp = dp->router_ports[j];\n+ if (rp->peer && rp->peer->od == op->od &&\n+ rp->peer != op) {\n+ router_ports_exist = true;\n+ ds_put_format(&actions,\n+ \"outport = %s; \"\n+ \"output;\",\n+ rp->peer->json_key);\n+ }\n+ }\n+ }\n+ if (router_ports_exist) {\n+ ovn_lflow_add(lflows, op->od, S_ROUTER_IN_IP_INPUT, 90,\n+ ds_cstr(&match), ds_cstr(&actions));\n+ }\n+ }\n+ }\n+\n /* A set to hold all load-balancer vips that need ARP responses. */\n struct sset all_ips = SSET_INITIALIZER(&all_ips);\n int addr_family;\ndiff --git a/tests/ovn.at b/tests/ovn.at\nindex fb9b516..314f0ad 100644\n--- a/tests/ovn.at\n+++ b/tests/ovn.at\n@@ -7981,6 +7981,12 @@ foo_mac=\"000001010203\"\n gw_mac=\"000002010203\"\n nexthop_mac=\"f00000010204\"\n \n+# gARP for distributed port has to be sent through router internal patch port\n+# which is connected to vlan network\n+garp=ffffffffffff${gw_mac}8100000208060001080006040001${gw_mac}${gw_ip}000000000000${gw_ip}\n+echo $garp >> hv1-br-ex_n2-rx.expected\n+OVN_CHECK_PACKETS([hv1/br-ex_n2-rx.pcap], [hv1-br-ex_n2-rx.expected])\n+\n # Send ip packet from foo1 to 8.8.8.8\n src_mac=\"f00000010203\"\n dst_mac=\"000001010203\"\n", "prefixes": [ "ovs-dev", "v7", "2/4" ] }