From patchwork Fri May 7 04:06:56 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Pfaff X-Patchwork-Id: 1475337 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.137; helo=smtp4.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Received: from smtp4.osuosl.org (smtp4.osuosl.org [140.211.166.137]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4FbxmH5cbHz9sPf for ; Fri, 7 May 2021 14:09:35 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 2336F41505; Fri, 7 May 2021 04:09:34 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 1oIE0fadLf41; Fri, 7 May 2021 04:09:32 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp4.osuosl.org (Postfix) with ESMTP id 77B044198E; Fri, 7 May 2021 04:09:26 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id E95DFC002B; Fri, 7 May 2021 04:09:23 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp1.osuosl.org (smtp1.osuosl.org [IPv6:2605:bc80:3010::138]) by lists.linuxfoundation.org (Postfix) with ESMTP id 3939FC0001 for ; Fri, 7 May 2021 04:09:22 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id 358CD83EDF for ; Fri, 7 May 2021 04:08:04 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp1.osuosl.org ([127.0.0.1]) by localhost (smtp1.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id PQK166GwLbHp for ; Fri, 7 May 2021 04:07:59 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 Received: from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net [217.70.183.198]) by smtp1.osuosl.org (Postfix) with ESMTPS id 2AF8383DA6 for ; Fri, 7 May 2021 04:07:47 +0000 (UTC) X-Originating-IP: 75.54.222.30 Received: from sigfpe.attlocal.net (75-54-222-30.lightspeed.rdcyca.sbcglobal.net [75.54.222.30]) (Authenticated sender: blp@ovn.org) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id 5C661C000E; Fri, 7 May 2021 04:07:45 +0000 (UTC) From: Ben Pfaff To: dev@openvswitch.org Date: Thu, 6 May 2021 21:06:56 -0700 Message-Id: <20210507040659.26830-25-blp@ovn.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210507040659.26830-1-blp@ovn.org> References: <20210507040659.26830-1-blp@ovn.org> MIME-Version: 1.0 Cc: Leonid Ryzhyk , Ben Pfaff Subject: [ovs-dev] [PATCH ovn v3 24/27] ovn-northd-ddlog: Intern nb::Logical_Router_Port. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Leonid Ryzhyk Use the `--intern-table` switch to intern `Logical_Router_Port` records, so that they can be copied and compared efficiently by pointer. Signed-off-by: Leonid Ryzhyk Signed-off-by: Ben Pfaff --- northd/helpers.dl | 2 +- northd/lrouter.dl | 50 ++++++++++++++++++++++---------------------- northd/lswitch.dl | 2 +- northd/multicast.dl | 2 +- northd/ovn-nb.dlopts | 1 + northd/ovn_northd.dl | 34 +++++++++++++++--------------- 6 files changed, 46 insertions(+), 45 deletions(-) diff --git a/northd/helpers.dl b/northd/helpers.dl index 33a8d15d8b32..820e37bb3072 100644 --- a/northd/helpers.dl +++ b/northd/helpers.dl @@ -25,7 +25,7 @@ relation SwitchRouterPeer(lsp: uuid, lsp_name: string, lrp: uuid) SwitchRouterPeer(lsp, lsp_name, lrp) :- nb::Logical_Switch_Port(._uuid = lsp, .name = lsp_name, .__type = "router", .options = options), Some{var router_port} = options.get("router-port"), - nb::Logical_Router_Port(.name = router_port, ._uuid = lrp). + &nb::Logical_Router_Port(.name = router_port, ._uuid = lrp). function get_bool_def(m: Map, k: string, def: bool): bool = { m.get(k) diff --git a/northd/lrouter.dl b/northd/lrouter.dl index 93f02d80bba0..3b5047c3ec01 100644 --- a/northd/lrouter.dl +++ b/northd/lrouter.dl @@ -21,7 +21,7 @@ import helpers import lswitch function is_enabled(lr: nb::Logical_Router): bool { is_enabled(lr.enabled) } -function is_enabled(lrp: nb::Logical_Router_Port): bool { is_enabled(lrp.enabled) } +function is_enabled(lrp: Intern): bool { is_enabled(lrp.enabled) } function is_enabled(rp: RouterPort): bool { rp.lrp.is_enabled() } function is_enabled(rp: Intern): bool { rp.lrp.is_enabled() } @@ -42,7 +42,7 @@ Warning[message] :- LogicalRouterPortCandidate(lrp_uuid, lr_uuid), var lrs = lr_uuid.group_by(lrp_uuid).to_set(), lrs.size() > 1, - lrp in nb::Logical_Router_Port(._uuid = lrp_uuid), + lrp in &nb::Logical_Router_Port(._uuid = lrp_uuid), var message = "Bad configuration: logical router port ${lrp.name} belongs " "to more than one logical router". @@ -69,9 +69,9 @@ LogicalRouterPort(lrp_uuid, lr_uuid) :- relation PeerLogicalRouter(a: uuid, b: uuid) PeerLogicalRouter(lrp_uuid, peer._uuid) :- LogicalRouterPort(lrp_uuid, _), - lrp in nb::Logical_Router_Port(._uuid = lrp_uuid), + lrp in &nb::Logical_Router_Port(._uuid = lrp_uuid), Some{var peer_name} = lrp.peer, - peer in nb::Logical_Router_Port(.name = peer_name), + peer in &nb::Logical_Router_Port(.name = peer_name), peer.peer == Some{lrp.name}, // 'peer' must point back to 'lrp' lrp_uuid != peer._uuid. // No reflexive pointers. @@ -86,7 +86,7 @@ PeerLogicalRouter(lrp_uuid, peer._uuid) :- relation FirstHopLogicalRouter(lrouter: uuid, lswitch: uuid) FirstHopLogicalRouter(lrouter, lswitch) :- LogicalRouterPort(lrp_uuid, lrouter), - lrp in nb::Logical_Router_Port(._uuid = lrp_uuid, .peer = None), + lrp in &nb::Logical_Router_Port(._uuid = lrp_uuid, .peer = None), LogicalSwitchRouterPort(lsp_uuid, lrp.name, lswitch). relation LogicalSwitchRouterPort(lsp: uuid, lsp_router_port: string, ls: uuid) @@ -119,7 +119,7 @@ ReachableLogicalRouter(a, a) :- ReachableLogicalRouter(a, _). // ha_chassis_group and gateway_chassis may not both be present. Warning[message] :- - lrp in nb::Logical_Router_Port(), + lrp in &nb::Logical_Router_Port(), lrp.ha_chassis_group.is_some(), not lrp.gateway_chassis.is_empty(), var message = "Both ha_chassis_group and gateway_chassis configured on " @@ -127,7 +127,7 @@ Warning[message] :- // A distributed gateway port cannot also be an L3 gateway router. Warning[message] :- - lrp in nb::Logical_Router_Port(), + lrp in &nb::Logical_Router_Port(), lrp.ha_chassis_group.is_some() or not lrp.gateway_chassis.is_empty(), lrp.options.contains_key("chassis"), var message = "Bad configuration: distributed gateway port configured on " @@ -143,7 +143,7 @@ relation DistributedGatewayPortCandidate(lr_uuid: uuid, lrp_uuid: uuid) DistributedGatewayPortCandidate(lr_uuid, lrp_uuid) :- lr in nb::Logical_Router(._uuid = lr_uuid), LogicalRouterPort(lrp_uuid, lr._uuid), - lrp in nb::Logical_Router_Port(._uuid = lrp_uuid), + lrp in &nb::Logical_Router_Port(._uuid = lrp_uuid), not lrp.options.contains_key("chassis"), var has_hcg = lrp.ha_chassis_group.is_some(), var has_gc = not lrp.gateway_chassis.is_empty(), @@ -161,13 +161,13 @@ Warning[message] :- * Each row means 'lrp' is the distributed gateway port on 'lr_uuid'. * * There is at most one distributed gateway port per logical router. */ -relation DistributedGatewayPort(lrp: nb::Logical_Router_Port, lr_uuid: uuid) +relation DistributedGatewayPort(lrp: Intern, lr_uuid: uuid) DistributedGatewayPort(lrp, lr_uuid) :- DistributedGatewayPortCandidate(lr_uuid, lrp_uuid), var lrps = lrp_uuid.group_by(lr_uuid).to_set(), lrps.size() == 1, Some{var lrp_uuid} = lrps.nth(0), - lrp in nb::Logical_Router_Port(._uuid = lrp_uuid). + lrp in &nb::Logical_Router_Port(._uuid = lrp_uuid). /* HAChassis is an abstraction over nb::Gateway_Chassis and nb::HA_Chassis, which * are different ways to represent the same configuration. Each row is @@ -249,12 +249,12 @@ LogicalRouterHAChassisGroup(lr_uuid, /* For each router port, tracks whether it's a redirect port of its router */ relation RouterPortIsRedirect(lrp: uuid, is_redirect: bool) -RouterPortIsRedirect(lrp, true) :- DistributedGatewayPort(nb::Logical_Router_Port{._uuid = lrp}, _). +RouterPortIsRedirect(lrp, true) :- DistributedGatewayPort(&nb::Logical_Router_Port{._uuid = lrp}, _). RouterPortIsRedirect(lrp, false) :- - nb::Logical_Router_Port(._uuid = lrp), - not DistributedGatewayPort(nb::Logical_Router_Port{._uuid = lrp}, _). + &nb::Logical_Router_Port(._uuid = lrp), + not DistributedGatewayPort(&nb::Logical_Router_Port{._uuid = lrp}, _). -relation LogicalRouterRedirectPort(lr: uuid, has_redirect_port: Option) +relation LogicalRouterRedirectPort(lr: uuid, has_redirect_port: Option>) LogicalRouterRedirectPort(lr, Some{lrp}) :- DistributedGatewayPort(lrp, lr). @@ -453,7 +453,7 @@ typedef Router = Router { external_ids: Map, /* Additional computed fields. */ - l3dgw_port: Option, + l3dgw_port: Option>, redirect_port_name: string, is_gateway: bool, nats: Vec, @@ -523,9 +523,9 @@ RouterLBVIP(router, lb, vip, backends) :- relation RouterRouterPeer(rport1: uuid, rport2: uuid, rport2_name: string) RouterRouterPeer(rport1, rport2, peer_name) :- - nb::Logical_Router_Port(._uuid = rport1, .peer = peer), + &nb::Logical_Router_Port(._uuid = rport1, .peer = peer), Some{var peer_name} = peer, - nb::Logical_Router_Port(._uuid = rport2, .name = peer_name). + &nb::Logical_Router_Port(._uuid = rport2, .name = peer_name). /* Router port can peer with anothe router port, a switch port or have * no peer. @@ -552,7 +552,7 @@ RouterPortPeer(rport1, PeerRouter{rport2, rport2_name}) :- RouterRouterPeer(rport1, rport2, rport2_name). RouterPortPeer(rport, PeerNone) :- - nb::Logical_Router_Port(._uuid = rport), + &nb::Logical_Router_Port(._uuid = rport), not SwitchRouterPeer(_, _, rport), not RouterRouterPeer(rport, _, _). @@ -563,7 +563,7 @@ RouterPortPeer(rport, PeerNone) :- * faster convergence.) */ relation RouterPortSbOptions(lrp_uuid: uuid, options: Map) RouterPortSbOptions(lrp._uuid, options) :- - lrp in nb::Logical_Router_Port(), + lrp in &nb::Logical_Router_Port(), pb in sb::Port_Binding(._uuid = lrp._uuid), var options = { var options = pb.options; @@ -572,21 +572,21 @@ RouterPortSbOptions(lrp._uuid, options) :- options }. RouterPortSbOptions(lrp._uuid, map_empty()) :- - lrp in nb::Logical_Router_Port(), + lrp in &nb::Logical_Router_Port(), not sb::Port_Binding(._uuid = lrp._uuid). relation RouterPortHasBfd(lrp_uuid: uuid, has_bfd: bool) RouterPortHasBfd(lrp_uuid, true) :- - nb::Logical_Router_Port(._uuid = lrp_uuid, .name = logical_port), + &nb::Logical_Router_Port(._uuid = lrp_uuid, .name = logical_port), nb::BFD(.logical_port = logical_port). RouterPortHasBfd(lrp_uuid, false) :- - nb::Logical_Router_Port(._uuid = lrp_uuid, .name = logical_port), + &nb::Logical_Router_Port(._uuid = lrp_uuid, .name = logical_port), not nb::BFD(.logical_port = logical_port). /* FIXME: what should happen when extract_lrp_networks fails? */ /* RouterPort relation collects all attributes of a logical router port */ typedef RouterPort = RouterPort { - lrp: nb::Logical_Router_Port, + lrp: Intern, json_name: string, networks: lport_addresses, router: Intern, @@ -610,7 +610,7 @@ RouterPort[RouterPort{ .sb_options = sb_options, .has_bfd = has_bfd }.intern()] :- - nb::Logical_Router_Port[lrp], + lrp in &nb::Logical_Router_Port(), Some{var networks} = extract_lrp_networks(lrp.mac, lrp.networks), LogicalRouterPort(lrp._uuid, lrouter_uuid), router in &Router(._uuid = lrouter_uuid), @@ -775,7 +775,7 @@ RouterStaticRoute(router, key, dsts) :- .output_port = Some{oport}, .ecmp_symmetric_reply = ecmp_symmetric_reply), /* output_port specified */ - port in &RouterPort(.lrp = nb::Logical_Router_Port{.name = oport}, + port in &RouterPort(.lrp = &nb::Logical_Router_Port{.name = oport}, .networks = networks), Some{var src_ip} = match (find_lrp_member_ip(networks, nexthop)) { Some{src_ip} -> Some{src_ip}, diff --git a/northd/lswitch.dl b/northd/lswitch.dl index 29e88d7749f6..cc0777f743c1 100644 --- a/northd/lswitch.dl +++ b/northd/lswitch.dl @@ -30,7 +30,7 @@ relation SwitchRouterPeerRef(lsp: uuid, rport: Option>) SwitchRouterPeerRef(lsp, Some{rport}) :- SwitchRouterPeer(lsp, _, lrp), - rport in &RouterPort(.lrp = nb::Logical_Router_Port{._uuid = lrp}). + rport in &RouterPort(.lrp = &nb::Logical_Router_Port{._uuid = lrp}). SwitchRouterPeerRef(lsp, None) :- nb::Logical_Switch_Port(._uuid = lsp), diff --git a/northd/multicast.dl b/northd/multicast.dl index 25fcd2938f6b..bd9bc9b46f61 100644 --- a/northd/multicast.dl +++ b/northd/multicast.dl @@ -101,7 +101,7 @@ McastPortCfg[McastPortCfg{lsp_uuid, false, flood, flood_reports}.intern()] :- var flood_reports = options.get_bool_def("mcast_flood_reports", false). McastPortCfg[McastPortCfg{lrp_uuid, true, flood, flood}.intern()] :- - nb::Logical_Router_Port(._uuid = lrp_uuid, .options = options), + &nb::Logical_Router_Port(._uuid = lrp_uuid, .options = options), var flood = options.get_bool_def("mcast_flood", false). /* Mapping between Switch and the set of router port uuids on which to flood diff --git a/northd/ovn-nb.dlopts b/northd/ovn-nb.dlopts index c4390c904f33..c1ceb4f1496a 100644 --- a/northd/ovn-nb.dlopts +++ b/northd/ovn-nb.dlopts @@ -21,3 +21,4 @@ --intern-table Meter --intern-table NAT --intern-table Address_Set +--intern-table Logical_Router_Port diff --git a/northd/ovn_northd.dl b/northd/ovn_northd.dl index 218ba896dc87..f7744a1dae75 100644 --- a/northd/ovn_northd.dl +++ b/northd/ovn_northd.dl @@ -418,7 +418,7 @@ relation RouterPortRAOptionsComplete(lrp: uuid, options: Map) RouterPortRAOptionsComplete(lrp, options) :- RouterPortRAOptions(lrp, options). RouterPortRAOptionsComplete(lrp, map_empty()) :- - nb::Logical_Router_Port(._uuid = lrp), + &nb::Logical_Router_Port(._uuid = lrp), not RouterPortRAOptions(lrp, _). @@ -1384,7 +1384,7 @@ nb::Out_Logical_Switch_Port(._uuid = lsp._uuid, relation LRPIPv6Prefix0(lrp_uuid: uuid, ipv6_prefix: string) LRPIPv6Prefix0(lrp._uuid, ipv6_prefix) :- - lrp in nb::Logical_Router_Port(), + lrp in &nb::Logical_Router_Port(), lrp.options.get_bool_def("prefix", false), sb::Port_Binding(.logical_port = lrp.name, .options = options), Some{var ipv6_ra_pd_list} = options.get("ipv6_ra_pd_list"), @@ -1395,12 +1395,12 @@ relation LRPIPv6Prefix(lrp_uuid: uuid, ipv6_prefix: Option) LRPIPv6Prefix(lrp_uuid, Some{ipv6_prefix}) :- LRPIPv6Prefix0(lrp_uuid, ipv6_prefix). LRPIPv6Prefix(lrp_uuid, None) :- - nb::Logical_Router_Port(._uuid = lrp_uuid), + &nb::Logical_Router_Port(._uuid = lrp_uuid), not LRPIPv6Prefix0(lrp_uuid, _). nb::Out_Logical_Router_Port(._uuid = _uuid, .ipv6_prefix = to_set(ipv6_prefix)) :- - nb::Logical_Router_Port(._uuid = _uuid, .name = name), + &nb::Logical_Router_Port(._uuid = _uuid, .name = name), LRPIPv6Prefix(_uuid, ipv6_prefix). typedef Pipeline = Ingress | Egress @@ -4762,7 +4762,7 @@ AddChassisResidentCheck(lrp, add_check) :- AddChassisResidentCheck_(lrp, add_check). AddChassisResidentCheck(lrp, false) :- - nb::Logical_Router_Port(._uuid = lrp), + &nb::Logical_Router_Port(._uuid = lrp), not AddChassisResidentCheck_(lrp, _). @@ -4855,7 +4855,7 @@ LogicalRouterPortNatArpNdFlow(router, nat, l3dgw_port) :- /* Respond to ARP/NS requests on the chassis that binds the gw * port. Drop the ARP/NS requests on other chassis. */ -relation LogicalRouterPortNatArpNdFlow(router: Intern, nat: NAT, lrp: nb::Logical_Router_Port) +relation LogicalRouterPortNatArpNdFlow(router: Intern, nat: NAT, lrp: Intern) LogicalRouterArpNdFlow(router, nat, Some{lrp}, mac, Some{extra_match}, false, 92), LogicalRouterArpNdFlow(router, nat, Some{lrp}, mac, None, true, 91) :- LogicalRouterPortNatArpNdFlow(router, nat, lrp), @@ -4888,7 +4888,7 @@ LogicalRouterArpNdFlow(router, nat, Some{lrp}, mac, None, true, 91) :- relation LogicalRouterArpNdFlow( router: Intern, nat: NAT, - lrp: Option, + lrp: Option>, mac: string, extra_match: Option, drop: bool, @@ -4904,7 +4904,7 @@ LogicalRouterNdFlow(router, lrp, "nd_na", ipv6, true, mac, extra_match, drop, pr relation LogicalRouterArpFlow( lr: Intern, - lrp: Option, + lrp: Option>, ip: in_addr, mac: string, extra_match: Option, @@ -4947,7 +4947,7 @@ Flow(.logical_datapath = lr._uuid, relation LogicalRouterNdFlow( lr: Intern, - lrp: Option, + lrp: Option>, action: string, ip: in6_addr, sn_ip: bool, @@ -5083,7 +5083,7 @@ Flow(.logical_datapath = lr_uuid, .__match = "ip4.dst == {" ++ match_ips.join(", ") ++ "}", .actions = "drop;", .external_ids = stage_hint(lrp_uuid)) :- - &RouterPort(.lrp = nb::Logical_Router_Port{._uuid = lrp_uuid}, + &RouterPort(.lrp = &nb::Logical_Router_Port{._uuid = lrp_uuid}, .router = &Router{.snat_ips = snat_ips, .force_lb_snat = false, ._uuid = lr_uuid}, @@ -5097,7 +5097,7 @@ Flow(.logical_datapath = lr_uuid, .__match = "ip6.dst == {" ++ match_ips.join(", ") ++ "}", .actions = "drop;", .external_ids = stage_hint(lrp_uuid)) :- - &RouterPort(.lrp = nb::Logical_Router_Port{._uuid = lrp_uuid}, + &RouterPort(.lrp = &nb::Logical_Router_Port{._uuid = lrp_uuid}, .router = &Router{.snat_ips = snat_ips, .force_lb_snat = false, ._uuid = lr_uuid}, @@ -6199,7 +6199,7 @@ function copy_ra_to_sb(port: RouterPort, address_mode: string): Map