blob: faf4df8b0a7dfdddb34b0eb9fde287025163eff6 [file] [log] [blame]
Neale Ranns55d03782017-10-21 06:34:22 -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_L2_EMULATION_H__
17#define __VOM_L2_EMULATION_H__
18
19#include "vom/bridge_domain.hpp"
20#include "vom/hw.hpp"
21#include "vom/inspect.hpp"
22#include "vom/interface.hpp"
23#include "vom/object_base.hpp"
24#include "vom/om.hpp"
25#include "vom/singular_db.hpp"
26
27namespace VOM {
28/**
29 * A Clas representing the binding of an L2 interface to a bridge-domain
30 * and the properties of that binding.
31 */
32class l2_emulation : public object_base
33{
34public:
35 /**
36 * Key type for an L2 emulation in the singular DB
37 */
38 typedef interface::key_t key_t;
39
40 /**
41 * Construct a new object matching the desried state
42 */
43 l2_emulation(const interface& itf);
44
45 /**
46 * Copy Constructor
47 */
48 l2_emulation(const l2_emulation& o);
49
50 /**
51 * Destructor
52 */
53 ~l2_emulation();
54
55 /**
56 * Return the binding's key
57 */
58 const key_t& key() const;
59
60 /**
61 * Comparison operator - for UT
62 */
63 bool operator==(const l2_emulation& l) const;
64
65 /**
66 * Return the 'singular instance' of the L2 config that matches this
67 * object
68 */
69 std::shared_ptr<l2_emulation> singular() const;
70
71 /**
72 * convert to string format for debug purposes
73 */
74 std::string to_string() const;
75
76 /**
77 * Dump all l2_emulations into the stream provided
78 */
79 static void dump(std::ostream& os);
80
81 /**
82 * Static function to find the bridge_domain in the model
83 */
84 static std::shared_ptr<l2_emulation> find(const key_t& key);
85
86private:
87 /**
88 * Class definition for listeners to OM events
89 */
90 class event_handler : public OM::listener, public inspect::command_handler
91 {
92 public:
93 event_handler();
94 virtual ~event_handler() = default;
95
96 /**
97 * Handle a populate event
98 */
99 void handle_populate(const client_db::key_t& key);
100
101 /**
102 * Handle a replay event
103 */
104 void handle_replay();
105
106 /**
107 * Show the object in the Singular DB
108 */
109 void show(std::ostream& os);
110
111 /**
112 * Get the sortable Id of the listener
113 */
114 dependency_t order() const;
115 };
116
117 /**
118 * event_handler to register with OM
119 */
120 static event_handler m_evh;
121
122 /**
123 * Enquue commonds to the VPP command Q for the update
124 */
125 void update(const l2_emulation& obj);
126
127 /**
128 * Find or Add the singular instance in the DB
129 */
130 static std::shared_ptr<l2_emulation> find_or_add(const l2_emulation& temp);
131
132 /*
133 * It's the OM class that calls singular()
134 */
135 friend class OM;
136
137 /**
138 * It's the singular_db class that calls replay()
139 */
140 friend class singular_db<key_t, l2_emulation>;
141
142 /**
143 * Sweep/reap the object if still stale
144 */
145 void sweep(void);
146
147 /**
148 * replay the object to create it in hardware
149 */
150 void replay(void);
151
152 /**
153 * A reference counting pointer the interface that this L2 layer
154 * represents. By holding the reference here, we can guarantee that
155 * this object will outlive the interface
156 */
157 const std::shared_ptr<interface> m_itf;
158
159 /**
160 * HW configuration for the emulation. The bool representing the
161 * enable/disable.
162 */
163 HW::item<bool> m_emulation;
164
165 /**
166 * A map of all L2 emulation configurations
167 */
168 static singular_db<key_t, l2_emulation> m_db;
169};
170};
171
172/*
173 * fd.io coding-style-patch-verification: ON
174 *
175 * Local Variables:
176 * eval: (c-set-style "mozilla")
177 * End:
178 */
179
180#endif