25 singular_db<l2_xconnect::key_t, l2_xconnect> l2_xconnect::m_db;
33 : m_east_itf(east_itf.singular())
34 , m_west_itf(west_itf.singular())
37 , m_vtr_op(l2_vtr::option_t::DISABLED,
rc_t::
UNSET)
43 : m_east_itf(o.m_east_itf)
44 , m_west_itf(o.m_west_itf)
45 , m_xconnect_east(o.m_xconnect_east)
46 , m_xconnect_west(o.m_xconnect_west)
47 , m_vtr_op(o.m_vtr_op)
48 , m_vtr_op_tag(o.m_vtr_op_tag)
55 if (m_east_itf->name() < m_west_itf->name())
56 return (std::make_pair(m_east_itf->key(), m_west_itf->key()));
57 return (std::make_pair(m_west_itf->key(), m_east_itf->key()));
63 return ((*m_east_itf == *l.m_east_itf) && (*m_west_itf == *l.m_west_itf));
66 std::shared_ptr<l2_xconnect>
69 return (m_db.find(key));
75 if (m_xconnect_east && m_xconnect_west &&
79 m_xconnect_east, m_east_itf->handle(), m_west_itf->handle()));
81 m_xconnect_west, m_west_itf->handle(), m_east_itf->handle()));
90 if (m_xconnect_east && m_xconnect_west &&
94 m_xconnect_east, m_east_itf->handle(), m_west_itf->handle()));
96 m_xconnect_west, m_west_itf->handle(), m_east_itf->handle()));
110 m_db.release(
key(),
this);
116 std::ostringstream s;
117 s <<
"L2-xconnect:[" << m_east_itf->to_string() <<
" " 118 << m_west_itf->to_string() <<
" " << m_xconnect_east.
to_string() <<
" " 141 m_xconnect_east, m_east_itf->handle(), m_west_itf->handle()));
143 m_xconnect_west, m_west_itf->handle(), m_east_itf->handle()));
149 if (m_vtr_op.
update(desired.m_vtr_op)) {
155 std::shared_ptr<l2_xconnect>
158 return (m_db.find_or_add(temp.
key(), temp));
161 std::shared_ptr<l2_xconnect>
164 return find_or_add(*
this);
180 l2_xconnect::event_handler::handle_replay()
191 std::shared_ptr<l2_xconnect_cmds::dump_cmd>
cmd =
192 std::make_shared<l2_xconnect_cmds::dump_cmd>();
197 for (
auto& x_record : *cmd) {
198 auto& payload = x_record.get_payload();
201 <<
" east-itf: " << payload.rx_sw_if_index
202 <<
" west-itf: " << payload.tx_sw_if_index;
204 std::shared_ptr<interface> east_itf =
206 std::shared_ptr<interface> west_itf =
209 if (east_itf && west_itf) {
210 if (east_itf->name() > west_itf->name())
219 l2_xconnect::event_handler::order()
const static std::shared_ptr< l2_xconnect > find(const key_t &key)
Static function to find the bridge_domain in the model.
static const rc_t NOOP
The HW write/update action was/has not been attempted.
A functor class that binds L2 configuration to an interface.
void db_dump(const DB &db, std::ostream &os)
Print each of the objects in the DB into the stream provided.
const std::string key_t
In the opflex world each entity is known by a URI which can be converted into a string.
static std::shared_ptr< interface > find(const handle_t &h)
The the singular instance of the interface in the DB by handle.
bool update(const item &desired)
update the item to the desired state.
void set(const l2_vtr::option_t &op, uint16_t tag)
Set the VTR operation on the binding/interface.
A Class representing the cross connnect of an L2 interface with another l2 interface.
static void register_handler(const std::vector< std::string > &cmds, const std::string &help, command_handler *ch)
Register a command handler for inspection.
static rc_t write()
Write/Execute all commands hitherto enqueued.
rc_t rc() const
Get the HW return code.
Error codes that VPP will return during a HW write.
static const log_level_t DEBUG
std::shared_ptr< l2_xconnect > singular() const
Return the 'singular instance' of the L2 config that matches this object.
static const handle_t INVALID
A value of an interface handle_t that means the itf does not exist.
std::string to_string() const
convert to string format for debug purposes
A cmd class that Unbinds L2 configuration from an interface.
static void dump(std::ostream &os)
Dump all l2_xconnects into the stream provided.
A representation of an interface in VPP.
bool operator==(const l2_xconnect &l) const
Comparison operator - for UT.
static rc_t commit(const client_db::key_t &key, const OBJ &obj)
Make the State in VPP reflect the expressed desired state.
void event_handler(void *tls_async)
dependency_t
There needs to be a strict order in which object types are read from VPP (at boot time) and replayed ...
static const rc_t OK
The HW write was successfull.
static void enqueue(cmd *f)
Enqueue A command for execution.
l2_xconnect(const interface &east_itf, const interface &west_itf)
Construct a new object matching the desried state.
std::pair< interface::key_t, interface::key_t > key_t
Key type for an L2 xconnect in the singular DB.
~l2_xconnect()
Destructor.
std::string to_string() const
convert to string format for debug purposes
A cmd class sets the VTR operation.
Then L2/objects that bind to interfaces, BD, ACLS, etc.
The VPP Object Model (VOM) library.
A representation of a method call to VPP.
static const rc_t UNSET
The value un-set.
void set(const rc_t &rc)
Set the HW return code - should only be called from the family of Command objects.
static bool register_listener(listener *listener)
Register a listener of events.
const key_t key() const
Return the xconnect's key.