2 * Copyright (c) 2017 Cisco and/or its affiliates.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
16 #ifndef __VOM_GBP_ENDPOINT_GROUP_H__
17 #define __VOM_GBP_ENDPOINT_GROUP_H__
19 #include "vom/interface.hpp"
20 #include "vom/singular_db.hpp"
21 #include "vom/types.hpp"
23 #include "vom/gbp_bridge_domain.hpp"
24 #include "vom/gbp_route_domain.hpp"
25 #include "vom/gbp_types.hpp"
30 * A entry in the ARP termination table of a Bridge Domain
32 class gbp_endpoint_group : public object_base
36 * Endpoint Retention Policy Settings
41 retention_t(uint32_t remote_ep_timeout);
43 retention_t(const retention_t&) = default;
44 retention_t& operator=(const retention_t&) = default;
46 bool operator==(const retention_t& o) const;
47 std::string to_string() const;
50 * Remote Endpoint timeout/ageing
52 uint32_t remote_ep_timeout;
56 * The key for a GBP endpoint group is its ID
58 typedef sclass_t key_t;
61 * Construct a GBP endpoint_group
63 gbp_endpoint_group(vnid_t vnid,
66 const gbp_route_domain& rd,
67 const gbp_bridge_domain& bd);
68 gbp_endpoint_group(vnid_t vnid,
70 const gbp_route_domain& rd,
71 const gbp_bridge_domain& bd);
72 gbp_endpoint_group(sclass_t sclass,
73 const gbp_route_domain& rd,
74 const gbp_bridge_domain& bd);
79 gbp_endpoint_group(const gbp_endpoint_group& r);
84 ~gbp_endpoint_group();
87 * Return the object's key
89 const key_t key() const;
94 bool operator==(const gbp_endpoint_group& bdae) const;
97 * Return the matching 'singular instance'
99 std::shared_ptr<gbp_endpoint_group> singular() const;
102 * Find the instnace of the bridge_domain domain in the OM
104 static std::shared_ptr<gbp_endpoint_group> find(const key_t& k);
107 * Dump all bridge_domain-doamin into the stream provided
109 static void dump(std::ostream& os);
112 * replay the object to create it in hardware
117 * Convert to string for debugging
119 std::string to_string() const;
122 * Get the ID of the EPG
125 sclass_t sclass() const;
127 const std::shared_ptr<gbp_route_domain> get_route_domain() const;
128 const std::shared_ptr<gbp_bridge_domain> get_bridge_domain() const;
130 void set(const retention_t& retention);
134 * Class definition for listeners to OM events
136 class event_handler : public OM::listener, public inspect::command_handler
140 virtual ~event_handler() = default;
143 * Handle a populate event
145 void handle_populate(const client_db::key_t& key);
148 * Handle a replay event
150 void handle_replay();
153 * Show the object in the Singular DB
155 void show(std::ostream& os);
158 * Get the sortable Id of the listener
160 dependency_t order() const;
164 * event_handler to register with OM
166 static event_handler m_evh;
169 * Commit the acculmulated changes into VPP. i.e. to a 'HW" write.
171 void update(const gbp_endpoint_group& obj);
174 * Find or add the instnace of the bridge_domain domain in the OM
176 static std::shared_ptr<gbp_endpoint_group> find_or_add(
177 const gbp_endpoint_group& temp);
180 * It's the VPPHW class that updates the objects in HW
185 * It's the singular_db class that calls replay()
187 friend class singular_db<key_t, gbp_endpoint_group>;
190 * Sweep/reap the object if still stale
195 * HW configuration for the result of creating the endpoint_group
205 * The SClass on the wire
210 * The uplink interface for the endpoint group
212 std::shared_ptr<interface> m_itf;
215 * The route-domain the EPG uses
217 std::shared_ptr<gbp_route_domain> m_rd;
220 * The bridge-domain the EPG uses
222 std::shared_ptr<gbp_bridge_domain> m_bd;
225 * The Group's EP retention Policy
227 retention_t m_retention;
230 * A map of all bridge_domains
232 static singular_db<key_t, gbp_endpoint_group> m_db;
238 * fd.io coding-style-patch-verification: ON
241 * eval: (c-set-style "mozilla")