blob: 2aef697ebcacfd78d135c98eac8e52e8225fb617 [file] [log] [blame]
Neale Ranns812ed392017-10-16 04:20:13 -07001/*
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:
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
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.
14 */
15
16#ifndef __VOM_BRIDGE_DOMAIN_ENTRY_H__
17#define __VOM_BRIDGE_DOMAIN_ENTRY_H__
18
19#include "vom/bridge_domain.hpp"
20#include "vom/interface.hpp"
21#include "vom/singular_db.hpp"
22
Neale Ranns812ed392017-10-16 04:20:13 -070023namespace VOM {
24/**
25 * A MAC forwarding entry in the bridge-domain/L2-FIB
26 */
27class bridge_domain_entry : public object_base
28{
29public:
30 /**
31 * The key for a bridge_domain
32 */
Neale Rannsfd920602017-11-23 12:15:00 -080033 typedef std::pair<bridge_domain::key_t, mac_address_t> key_t;
Neale Ranns812ed392017-10-16 04:20:13 -070034
35 /**
36 * Construct a bridge_domain in the given bridge domain
37 */
38 bridge_domain_entry(const bridge_domain& bd,
39 const mac_address_t& mac,
40 const interface& tx_itf);
41
42 /**
43 * Construct a bridge_domain in the default table
44 */
45 bridge_domain_entry(const mac_address_t& mac, const interface& tx_itf);
46
47 /**
48 * Copy Construct
49 */
50 bridge_domain_entry(const bridge_domain_entry& r);
51
52 /**
53 * Destructor
54 */
55 ~bridge_domain_entry();
56
57 /**
Neale Rannsfd920602017-11-23 12:15:00 -080058 * Return the object's key
59 */
60 const key_t key() const;
61
62 /**
63 * comparison operator
64 */
65 bool operator==(const bridge_domain_entry& be) const;
66
67 /**
Neale Ranns812ed392017-10-16 04:20:13 -070068 * Return the matching 'singular instance'
69 */
70 std::shared_ptr<bridge_domain_entry> singular() const;
71
72 /**
73 * Find the instnace of the bridge_domain domain in the OM
74 */
Neale Rannsfd920602017-11-23 12:15:00 -080075 static std::shared_ptr<bridge_domain_entry> find(const key_t& k);
Neale Ranns812ed392017-10-16 04:20:13 -070076
77 /**
78 * Dump all bridge_domain-doamin into the stream provided
79 */
80 static void dump(std::ostream& os);
81
82 /**
83 * replay the object to create it in hardware
84 */
85 void replay(void);
86
87 /**
88 * Convert to string for debugging
89 */
90 std::string to_string() const;
91
Neale Ranns812ed392017-10-16 04:20:13 -070092private:
93 /**
94 * Class definition for listeners to OM events
95 */
96 class event_handler : public OM::listener, public inspect::command_handler
97 {
98 public:
99 event_handler();
100 virtual ~event_handler() = default;
101
102 /**
103 * Handle a populate event
104 */
105 void handle_populate(const client_db::key_t& key);
106
107 /**
108 * Handle a replay event
109 */
110 void handle_replay();
111
112 /**
113 * Show the object in the Singular DB
114 */
115 void show(std::ostream& os);
116
117 /**
118 * Get the sortable Id of the listener
119 */
120 dependency_t order() const;
121 };
122
123 /**
124 * event_handler to register with OM
125 */
126 static event_handler m_evh;
127
128 /**
129 * Commit the acculmulated changes into VPP. i.e. to a 'HW" write.
130 */
131 void update(const bridge_domain_entry& obj);
132
133 /**
134 * Find or add the instnace of the bridge_domain domain in the OM
135 */
136 static std::shared_ptr<bridge_domain_entry> find_or_add(
137 const bridge_domain_entry& temp);
138
139 /*
140 * It's the VPPHW class that updates the objects in HW
141 */
142 friend class OM;
143
144 /**
145 * It's the singular_db class that calls replay()
146 */
147 friend class singular_db<key_t, bridge_domain_entry>;
148
149 /**
150 * Sweep/reap the object if still stale
151 */
152 void sweep(void);
153
154 /**
155 * HW configuration for the result of creating the bridge_domain
156 */
157 HW::item<bool> m_hw;
158
159 /**
160 * The mac to match
161 */
162 mac_address_t m_mac;
163
164 /**
165 * The bridge_domain domain the bridge_domain is in.
166 */
167 std::shared_ptr<bridge_domain> m_bd;
168
169 /**
170 * The set of paths
171 */
172 std::shared_ptr<interface> m_tx_itf;
173
174 /**
175 * A map of all bridge_domains
176 */
177 static singular_db<key_t, bridge_domain_entry> m_db;
178};
179
180std::ostream& operator<<(std::ostream& os,
181 const bridge_domain_entry::key_t& key);
182};
183
184/*
185 * fd.io coding-style-patch-verification: ON
186 *
187 * Local Variables:
188 * eval: (c-set-style "mozilla")
189 * End:
190 */
191
192#endif