#ifndef __VOM_L3_BINDING_H__
#define __VOM_L3_BINDING_H__
-#include "vom/dump_cmd.hpp"
#include "vom/hw.hpp"
#include "vom/inspect.hpp"
#include "vom/interface.hpp"
#include "vom/object_base.hpp"
#include "vom/om.hpp"
-#include "vom/rpc_cmd.hpp"
#include "vom/singular_db.hpp"
-#include <vapi/ip.api.vapi.hpp>
-
namespace VOM {
/**
* A representation of L3 configuration on an interface
class l3_binding : public object_base
{
public:
+ /**
+ * The key type for l3_bindings
+ */
+ typedef std::pair<interface::key_t, route::prefix_t> key_t;
+
/**
* Construct a new object matching the desried state
*/
~l3_binding();
/**
- * Return the 'singular instance' of the L3-Config that matches this
- * object
+ * Comparison operator
*/
- std::shared_ptr<l3_binding> singular() const;
+ bool operator==(const l3_binding& l) const;
/**
- * convert to string format for debug purposes
+ * Get the object's key
*/
- std::string to_string() const;
+ const key_t key() const;
/**
- * Return the prefix associated with this L3config
+ * The iterator type
*/
- const route::prefix_t& prefix() const;
+ typedef singular_db<key_t, l3_binding>::const_iterator const_iterator_t;
+
+ static const_iterator_t cbegin();
+ static const_iterator_t cend();
/**
- * Dump all l3_bindings into the stream provided
+ * Return the 'singular instance' of the L3-Config that matches this
+ * object
*/
- static void dump(std::ostream& os);
+ std::shared_ptr<l3_binding> singular() const;
/**
- * The key type for l3_bindings
+ * convert to string format for debug purposes
*/
- typedef std::pair<interface::key_type, route::prefix_t> key_type_t;
+ std::string to_string() const;
/**
- * Find an singular instance in the DB for the interface passed
+ * Return the prefix associated with this L3 binding
*/
- static std::deque<std::shared_ptr<l3_binding>> find(const interface& i);
+ const route::prefix_t& prefix() const;
/**
- * A functor class that binds the L3 config to the interface
+ * Return the interface associated with this L3 binding
*/
- class bind_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Sw_interface_add_del_address>
- {
- public:
- /**
- * Constructor
- */
- bind_cmd(HW::item<bool>& item,
- const handle_t& itf,
- const route::prefix_t& pfx);
-
- /**
- * Issue the command to VPP/HW
- */
- rc_t issue(connection& con);
- /**
- * convert to string format for debug purposes
- */
- std::string to_string() const;
-
- /**
- * Comparison operator - only used for UT
- */
- bool operator==(const bind_cmd& i) const;
-
- private:
- /**
- * Reference to the interface to bind to
- */
- const handle_t& m_itf;
-
- /**
- * The prefix to bind
- */
- const route::prefix_t& m_pfx;
- };
+ const interface& itf() const;
/**
- * A cmd class that Unbinds L3 Config from an interface
+ * Dump all l3_bindings into the stream provided
*/
- class unbind_cmd
- : public rpc_cmd<HW::item<bool>, rc_t, vapi::Sw_interface_add_del_address>
- {
- public:
- /**
- * Constructor
- */
- unbind_cmd(HW::item<bool>& item,
- const handle_t& itf,
- const route::prefix_t& pfx);
-
- /**
- * Issue the command to VPP/HW
- */
- rc_t issue(connection& con);
- /**
- * convert to string format for debug purposes
- */
- std::string to_string() const;
-
- /**
- * Comparison operator - only used for UT
- */
- bool operator==(const unbind_cmd& i) const;
-
- private:
- /**
- * Reference to the interface to unbind fomr
- */
- const handle_t& m_itf;
-
- /**
- * The prefix to unbind
- */
- const route::prefix_t& m_pfx;
- };
+ static void dump(std::ostream& os);
/**
- * A cmd class that Dumps all the IPv4 L3 configs
+ * Find all bindings in the DB for the interface passed
*/
- class dump_v4_cmd : public dump_cmd<vapi::Ip_address_dump>
- {
- public:
- /**
- * Constructor
- */
- dump_v4_cmd(const handle_t& itf);
- dump_v4_cmd(const dump_v4_cmd& d);
-
- /**
- * Issue the command to VPP/HW
- */
- rc_t issue(connection& con);
- /**
- * convert to string format for debug purposes
- */
- std::string to_string() const;
-
- /**
- * Comparison operator - only used for UT
- */
- bool operator==(const dump_v4_cmd& i) const;
-
- private:
- /**
- * HW reutrn code
- */
- HW::item<bool> item;
+ static std::deque<std::shared_ptr<l3_binding>> find(const interface& i);
- /**
- * The interface to get the addresses for
- */
- const handle_t& m_itf;
- };
+ /**
+ * Find a binding from its key
+ */
+ static std::shared_ptr<l3_binding> find(const key_t& k);
private:
/**
/**
e* It's the singular_db class that calls replay()
*/
- friend class singular_db<key_type_t, l3_binding>;
+ friend class singular_db<key_t, l3_binding>;
/**
* Sweep/reap the object if still stale
*/
void replay(void);
+ friend class interface;
+
/**
* A reference counting pointer the interface that this L3 layer
* represents. By holding the reference here, we can guarantee that
/**
* The prefix for this L3 configuration
*/
- const route::prefix_t& m_pfx;
+ const route::prefix_t m_pfx;
/**
* HW configuration for the binding. The bool representing the
* A map of all L3 configs keyed against a combination of the interface
* and subnet's keys.
*/
- static singular_db<key_type_t, l3_binding> m_db;
+ static singular_db<key_t, l3_binding> m_db;
};
/**
* Ostream output for the key
*/
-std::ostream& operator<<(std::ostream& os, const l3_binding::key_type_t& key);
+std::ostream& operator<<(std::ostream& os, const l3_binding::key_t& key);
};
/*