From patchwork Thu Jan 5 10:46:17 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mickey Spiegel X-Patchwork-Id: 711326 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3tvPXC2vz5z9sQw for ; Thu, 5 Jan 2017 21:47:39 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="XOn6mlq2"; dkim-atps=neutral Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id C40FEB8A; Thu, 5 Jan 2017 10:46:41 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id ECAF4B8A for ; Thu, 5 Jan 2017 10:46:40 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pf0-f193.google.com (mail-pf0-f193.google.com [209.85.192.193]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 74ACA133 for ; Thu, 5 Jan 2017 10:46:40 +0000 (UTC) Received: by mail-pf0-f193.google.com with SMTP id b22so1985123pfd.3 for ; Thu, 05 Jan 2017 02:46:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=HmHJQRxtudLJ8AcAW5NaonZABFHF2P/nwKbDexcc1xU=; b=XOn6mlq2CZ3twa53lxOq1GyqPApe9j/0Bq/aE1V4EPPcG6iS5YBqPRmPV1ypxgISNI VutLNpbRNJ1oOvdfUNALf+XA0QHodc7BDKvCzc3E/q7JaU5HDozdVHakUZ07W2WSS+0r NMQxxXuw5xqm51uHsxo5b9oh1y+P0xUaJXrxDNTC2ziHpSrgyFmmhjDNzls841Hm+bl8 DEigrKWG2zSEoqy6Df37c2FcxEn3+Aff9a3iD+sy53SS7U7KzzyI9ZQKEHlcFEXBasGH hKbDSs+08QfsXbys9ex+35RKy7JBj3uZphwcb3gPr1SJUIGCnnWFYHRP+5BfJCbbnwlr 2epA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=HmHJQRxtudLJ8AcAW5NaonZABFHF2P/nwKbDexcc1xU=; b=IrKPb+ZYsuzEinKDC45zEXW6nSP5t3As/OC0R5y5GeSvRpNlysM4KX6Y7AFpoLVUFJ VEPkr+ivdBjK/DonEe0gAevIEOtA+UEgSXQOslrSFaTp4gfQLKVOiAe7QTc5fJ2Ucgsn W3Xt6twFA3ZAPH+/rBlBms7yHzjMQeiqma2bA8P60G/RlvxeA8z1zewuPZs9sNY1Wqiy BfRDXaiVcMXyDkR+nQ2dcEWKK86GjUS2Zcmg6Zp4bWvWOWnKX2B4wujNJnQwjjcoYyYe +xHW6mOrDTrM4VMPle6nrGTJb4f0KFlFXFJTh8uXNAfcvNTYx4dcN1PBs12JJHDFeKNC WF/w== X-Gm-Message-State: AIkVDXK5XHtKgx44O/0q2Vle7yeec65+3dv1vsYRujsY+asDZhPJJNtmYp8+LfT0foqMvQ== X-Received: by 10.84.210.38 with SMTP id z35mr139542303plh.111.1483613195204; Thu, 05 Jan 2017 02:46:35 -0800 (PST) Received: from localhost.localdomain (c-73-202-53-195.hsd1.ca.comcast.net. [73.202.53.195]) by smtp.gmail.com with ESMTPSA id o1sm154333059pgf.35.2017.01.05.02.46.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 05 Jan 2017 02:46:34 -0800 (PST) From: Mickey Spiegel To: dev@openvswitch.org Date: Thu, 5 Jan 2017 02:46:17 -0800 Message-Id: <1483613183-28450-2-git-send-email-mickeys.dev@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1483613183-28450-1-git-send-email-mickeys.dev@gmail.com> References: <1483613183-28450-1-git-send-email-mickeys.dev@gmail.com> X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [PATCH v6 1/7] ovn: specify addresses of type "router" lsps as "router" X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org Currently in OVN, when a logical switch port of type "router" is created, the MAC and optionally IP addresses of the peer logical router port must be specified again as the addresses of the logical switch port. This patch allows the logical switch port's addresses to be specified as the string "router", rather than explicitly copying the logical router port's MAC and optionally IP addresses. The router addresses are used to populate the logical switch's destination lookup, and to populate op->lsp_addrs in ovn-northd.c, which in turn is used to generate logical switch ARP and ND replies. Since ipam already looks at logical router ports, the only ipam modification necessary is to skip logical switch ports with addresses "router". Signed-off-by: Mickey Spiegel --- ovn/northd/ovn-northd.c | 31 +++++++++++++++++++++++++++++-- ovn/ovn-nb.xml | 16 ++++++++++++++++ ovn/utilities/ovn-nbctl.c | 1 + tests/ovn.at | 3 ++- 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/ovn/northd/ovn-northd.c b/ovn/northd/ovn-northd.c index a28327b..5ad544d 100644 --- a/ovn/northd/ovn-northd.c +++ b/ovn/northd/ovn-northd.c @@ -815,7 +815,7 @@ ipam_insert_lsp_addresses(struct ovn_datapath *od, struct ovn_port *op, char *address) { if (!od || !op || !address || !strcmp(address, "unknown") - || is_dynamic_lsp_address(address)) { + || !strcmp(address, "router") || is_dynamic_lsp_address(address)) { return; } @@ -1205,7 +1205,8 @@ join_logical_ports(struct northd_context *ctx, op->lsp_addrs = xmalloc(sizeof *op->lsp_addrs * nbsp->n_addresses); for (size_t j = 0; j < nbsp->n_addresses; j++) { - if (!strcmp(nbsp->addresses[j], "unknown")) { + if (!strcmp(nbsp->addresses[j], "unknown") + || !strcmp(nbsp->addresses[j], "router")) { continue; } if (is_dynamic_lsp_address(nbsp->addresses[j])) { @@ -1323,6 +1324,18 @@ join_logical_ports(struct northd_context *ctx, op->od->router_ports, sizeof *op->od->router_ports * (op->od->n_router_ports + 1)); op->od->router_ports[op->od->n_router_ports++] = op; + + /* Fill op->lsp_addrs for op->nbsp->addresses[] with + * contents "router", which was skipped in the loop above. */ + for (size_t j = 0; j < op->nbsp->n_addresses; j++) { + if (!strcmp(op->nbsp->addresses[j], "router")) { + if (extract_lrp_networks(peer->nbrp, + &op->lsp_addrs[op->n_lsp_addrs])) { + op->n_lsp_addrs++; + } + break; + } + } } else if (op->nbrp && op->nbrp->peer) { struct ovn_port *peer = ovn_port_find(ports, op->nbrp->peer); if (peer) { @@ -3123,6 +3136,20 @@ build_lswitch_flows(struct hmap *datapaths, struct hmap *ports, ds_put_format(&actions, "outport = %s; output;", op->json_key); ovn_lflow_add(lflows, op->od, S_SWITCH_IN_L2_LKUP, 50, ds_cstr(&match), ds_cstr(&actions)); + } else if (!strcmp(op->nbsp->addresses[i], "router")) { + if (!op->peer || !op->peer->nbrp + || !ovs_scan(op->peer->nbrp->mac, + ETH_ADDR_SCAN_FMT, ETH_ADDR_SCAN_ARGS(mac))) { + continue; + } + ds_clear(&match); + ds_put_format(&match, "eth.dst == "ETH_ADDR_FMT, + ETH_ADDR_ARGS(mac)); + + ds_clear(&actions); + ds_put_format(&actions, "outport = %s; output;", op->json_key); + ovn_lflow_add(lflows, op->od, S_SWITCH_IN_L2_LKUP, 50, + ds_cstr(&match), ds_cstr(&actions)); } else { static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1); diff --git a/ovn/ovn-nb.xml b/ovn/ovn-nb.xml index a3dc916..f53fb9b 100644 --- a/ovn/ovn-nb.xml +++ b/ovn/ovn-nb.xml @@ -519,6 +519,22 @@ +
router
+
+

+ This indicates that the Ethernet, IPv4, and IPv6 addresses for + this logical switch port should be obtained from the connected + logical router port, as specified by router-port in + . +

+ +

+ The resulting addresses are used to populate the logical + switch's destination lookup, and also for the logical switch + to generate ARP and ND replies. +

+
+ diff --git a/ovn/utilities/ovn-nbctl.c b/ovn/utilities/ovn-nbctl.c index af1eeab..8ff5020 100644 --- a/ovn/utilities/ovn-nbctl.c +++ b/ovn/utilities/ovn-nbctl.c @@ -986,6 +986,7 @@ nbctl_lsp_set_addresses(struct ctl_context *ctx) struct eth_addr ea; if (strcmp(ctx->argv[i], "unknown") && strcmp(ctx->argv[i], "dynamic") + && strcmp(ctx->argv[i], "router") && !ovs_scan(ctx->argv[i], ETH_ADDR_SCAN_FMT, ETH_ADDR_SCAN_ARGS(ea))) { ctl_fatal("%s: Invalid address format. See ovn-nb(5). " diff --git a/tests/ovn.at b/tests/ovn.at index b7cb4cb..9a4fbe6 100644 --- a/tests/ovn.at +++ b/tests/ovn.at @@ -4801,7 +4801,8 @@ ovn-nbctl ls-add alice -- add Logical_Switch alice other_config subnet=192.168.2 # Connect foo to R1 ovn-nbctl lrp-add R1 foo 00:00:00:01:02:03 192.168.1.1/24 ovn-nbctl lsp-add foo rp-foo -- set Logical_Switch_Port rp-foo type=router \ - options:router-port=foo addresses=\"00:00:00:01:02:03\" + options:router-port=foo \ + -- lsp-set-addresses rp-foo router # Connect alice to R1 ovn-nbctl lrp-add R1 alice 00:00:00:01:02:04 192.168.2.1/24