X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=extras%2Fvom%2Fvom%2Fdhcp_client.hpp;fp=extras%2Fvom%2Fvom%2Fdhcp_config.hpp;h=17c626ed0f11786c5d7e08c4fcbbd0a2ffac8c4a;hb=daff1784037376f4a5caec2f5975f9b5fc23d5a4;hp=8ea608d809d45884679f7d7bb113731871c8cbc6;hpb=0e969ac8431c80ff4bca5f6985876b1c584eefcd;p=vpp.git diff --git a/extras/vom/vom/dhcp_config.hpp b/extras/vom/vom/dhcp_client.hpp similarity index 54% rename from extras/vom/vom/dhcp_config.hpp rename to extras/vom/vom/dhcp_client.hpp index 8ea608d809d..17c626ed0f1 100644 --- a/extras/vom/vom/dhcp_config.hpp +++ b/extras/vom/vom/dhcp_client.hpp @@ -13,60 +13,130 @@ * limitations under the License. */ -#ifndef __VOM_DHCP_CONFIG_H__ -#define __VOM_DHCP_CONFIG_H__ +#ifndef __VOM_DHCP_CLIENT_H__ +#define __VOM_DHCP_CLIENT_H__ #include "vom/hw.hpp" #include "vom/inspect.hpp" #include "vom/interface.hpp" #include "vom/object_base.hpp" #include "vom/om.hpp" +#include "vom/prefix.hpp" #include "vom/singular_db.hpp" namespace VOM { -namespace dhcp_config_cmds { +namespace dhcp_client_cmds { class events_cmd; }; /** - * A representation of DHCP client configuration on an interface + * A representation of DHCP client on an interface */ -class dhcp_config : public object_base +class dhcp_client : public object_base { public: /** - * typedef for the DHCP config key type + * typedef for the DHCP client key type */ typedef interface::key_t key_t; + struct state_t : enum_base + { + const static state_t DISCOVER; + const static state_t REQUEST; + const static state_t BOUND; + + static const state_t& from_vpp(int i); + + private: + /** + * Private constructor taking the value and the string name + */ + state_t(int v, const std::string& s); + }; + + /** + * A DHCP lease data + */ + struct lease_t + { + lease_t(); + lease_t(const state_t& state, + std::shared_ptr itf, + const boost::asio::ip::address& router_address, + const route::prefix_t& host_prefix, + const std::string& hostname, + const mac_address_t& mac); + + std::string to_string() const; + + const state_t& state; + std::shared_ptr itf; + boost::asio::ip::address router_address; + route::prefix_t host_prefix; + std::string hostname; + mac_address_t mac; + }; + + /** + * A class that listens to DHCP Events + */ + class event_listener + { + public: + /** + * Constructor + */ + event_listener(); + + /** + * listener's virtual function invoked when a DHCP event is + * available to read + */ + virtual void handle_dhcp_event(std::shared_ptr e) = 0; + + /** + * Return the HW::item associated with this command + */ + HW::item& status(); + + protected: + /** + * The HW::item associated with this command + */ + HW::item m_status; + }; + /** * Construct a new object matching the desried state */ - dhcp_config(const interface& itf, + dhcp_client(const interface& itf, const std::string& hostname, - bool set_broadcast_flag = true); + bool set_broadcast_flag = true, + event_listener* ev = nullptr); /** * Construct a new object matching the desried state */ - dhcp_config(const interface& itf, + dhcp_client(const interface& itf, const std::string& hostname, const l2_address_t& client_id, - bool set_broadcast_flag = true); + bool set_broadcast_flag = true, + event_listener* ev = nullptr); /** * Copy Constructor */ - dhcp_config(const dhcp_config& o); + dhcp_client(const dhcp_client& o); /** * Destructor */ - ~dhcp_config(); + ~dhcp_client(); /** * Comparison operator - for UT */ - bool operator==(const dhcp_config& d) const; + bool operator==(const dhcp_client& d) const; /** * Return the object's key @@ -74,9 +144,9 @@ public: const key_t& key() const; /** - * Return the 'singular' of the DHCP config that matches this object + * Return the 'singular' of the DHCP client that matches this object */ - std::shared_ptr singular() const; + std::shared_ptr singular() const; /** * convert to string format for debug purposes @@ -84,43 +154,19 @@ public: std::string to_string() const; /** - * Dump all DHCP configs into the stream provided + * Dump all DHCP clients into the stream provided */ static void dump(std::ostream& os); /** - * Find a DHCP config from its key + * Find a DHCP client from its key */ - static std::shared_ptr find(const key_t& k); + static std::shared_ptr find(const key_t& k); /** - * A class that listens to DHCP Events - */ - class event_listener - { - public: - /** - * Constructor - */ - event_listener(); - - /** - * listener's virtual function invoked when a DHCP event is - * available to read - */ - virtual void handle_dhcp_event(dhcp_config_cmds::events_cmd* cmd) = 0; - - /** - * Return the HW::item associated with this command - */ - HW::item& status(); - - protected: - /** - * The HW::item associated with this command - */ - HW::item m_status; - }; + * return the current lease data + */ + const std::shared_ptr lease() const; private: /** @@ -161,12 +207,12 @@ private: /** * Enquue commonds to the VPP command Q for the update */ - void update(const dhcp_config& obj); + void update(const dhcp_client& obj); /** - * Find or add DHCP config to the OM + * Find or add DHCP client to the OM */ - static std::shared_ptr find_or_add(const dhcp_config& temp); + static std::shared_ptr find_or_add(const dhcp_client& temp); /* * It's the OM class that calls singular() @@ -176,7 +222,7 @@ private: /** * It's the singular_db class that calls replay() */ - friend class singular_db; + friend class singular_db; /** * Sweep/reap the object if still stale @@ -188,20 +234,22 @@ private: */ void replay(void); + void lease(std::shared_ptr l); + /** - * A reference counting pointer to the interface on which DHCP config + * A reference counting pointer to the interface on which DHCP client * resides. By holding the reference here, we can guarantee that * this object will outlive the interface */ const std::shared_ptr m_itf; /** - * The hostname in the DHCP configuration + * The hostname in the DHCP client */ const std::string m_hostname; /** - * The option-61 client_id in the DHCP configuration + * The option-61 client_id in the DHCP client */ const l2_address_t m_client_id; @@ -213,13 +261,41 @@ private: /** * HW configuration for the binding. The bool representing the * do/don't bind. - */ + */ HW::item m_binding; /** - * A map of all Dhcp configs keyed against the interface. + * A pointer to an event listener for client events */ - static singular_db m_db; + event_listener* m_evl; + + /** + * Current lease state for this client + */ + std::shared_ptr m_lease; + + std::shared_ptr m_event_cmd; + + void handle_dhcp_event(std::shared_ptr e); + + /** + * A map of all Dhcp clients keyed against the interface. + */ + static singular_db m_db; + + static std::weak_ptr m_s_event_cmd; + static std::shared_ptr get_event_cmd(); + + class dhcp_client_listener : public event_listener + { + public: + /** + * listener's virtual function invoked when a DHCP event is + * available to read + */ + void handle_dhcp_event(std::shared_ptr e); + }; + static dhcp_client_listener m_listener; }; };