DHCP Client Dump
[vpp.git] / 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 8ea608d..17c626e 100644 (file)
  * 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<state_t>
+  {
+    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<interface> 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<interface> 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<lease_t> e) = 0;
+
+    /**
+     * Return the HW::item associated with this command
+     */
+    HW::item<bool>& status();
+
+  protected:
+    /**
+     * The HW::item associated with this command
+     */
+    HW::item<bool> 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<dhcp_config> singular() const;
+  std::shared_ptr<dhcp_client> 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<dhcp_config> find(const key_t& k);
+  static std::shared_ptr<dhcp_client> 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<bool>& status();
-
-  protected:
-    /**
-     * The HW::item associated with this command
-     */
-    HW::item<bool> m_status;
-  };
+   * return the current lease data
+   */
+  const std::shared_ptr<lease_t> 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<dhcp_config> find_or_add(const dhcp_config& temp);
+  static std::shared_ptr<dhcp_client> 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<key_t, dhcp_config>;
+  friend class singular_db<key_t, dhcp_client>;
 
   /**
    * Sweep/reap the object if still stale
@@ -188,20 +234,22 @@ private:
    */
   void replay(void);
 
+  void lease(std::shared_ptr<lease_t> 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<interface> 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<bool> m_binding;
 
   /**
-   * A map of all Dhcp configs keyed against the interface.
+   * A pointer to an event listener for client events
    */
-  static singular_db<key_t, dhcp_config> m_db;
+  event_listener* m_evl;
+
+  /**
+   * Current lease state for this client
+   */
+  std::shared_ptr<lease_t> m_lease;
+
+  std::shared_ptr<dhcp_client_cmds::events_cmd> m_event_cmd;
+
+  void handle_dhcp_event(std::shared_ptr<lease_t> e);
+
+  /**
+   * A map of all Dhcp clients keyed against the interface.
+   */
+  static singular_db<key_t, dhcp_client> m_db;
+
+  static std::weak_ptr<dhcp_client_cmds::events_cmd> m_s_event_cmd;
+  static std::shared_ptr<dhcp_client_cmds::events_cmd> 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<lease_t> e);
+  };
+  static dhcp_client_listener m_listener;
 };
 };