35 #ifndef BM_BM_SIM_DEV_MGR_H_ 
   36 #define BM_BM_SIM_DEV_MGR_H_ 
   38 #include <bm/config.h> 
   45 #include "packet_handler.h" 
   50 class DevMgrIface : 
public PacketDispatcherIface {
 
   55   using PortExtras = std::map<std::string, std::string>;
 
   57   static constexpr 
char kPortExtraInPcap[] = 
"in_pcap";
 
   58   static constexpr 
char kPortExtraOutPcap[] = 
"out_pcap";
 
   61     PortInfo(port_t port_num, 
const std::string &iface_name,
 
   62              const PortExtras &port_extras = {})
 
   63         : port_num(port_num), iface_name(iface_name), extra(port_extras) { }
 
   65     void set_is_up(
bool status) {
 
   69     void add_extra(
const std::string &key, 
const std::string &value) {
 
   70       extra.emplace(key, value);
 
   74     std::string iface_name{};
 
   85     static PortStats make(uint64_t in_packets, uint64_t in_octets,
 
   86                           uint64_t out_packets, uint64_t out_octets) {
 
   87       return {in_packets, in_octets, out_packets, out_octets};
 
   91   virtual ~DevMgrIface();
 
   93   ReturnCode port_add(
const std::string &iface_name, port_t port_num,
 
   94                       const PortExtras &port_extras);
 
   96   ReturnCode port_remove(port_t port_num);
 
  101   void transmit_fn(port_t port_num, 
const char *buffer, 
int len) {
 
  102     transmit_fn_(port_num, buffer, len);
 
  108   ReturnCode set_packet_handler(
const PacketHandler &handler, 
void *cookie);
 
  110   bool port_is_up(port_t port_num) 
const;
 
  112   ReturnCode register_status_cb(
const PortStatus &type,
 
  113                                 const PortStatusCb &port_cb);
 
  115   std::map<port_t, PortInfo> get_port_info() 
const;
 
  117   PortStats get_port_stats(port_t port) 
const;
 
  119   PortStats clear_port_stats(port_t port);
 
  122   std::unique_ptr<PortMonitorIface> p_monitor{
nullptr};
 
  125   virtual ReturnCode port_add_(
const std::string &iface_name, port_t port_num,
 
  126                                const PortExtras &port_extras) = 0;
 
  128   virtual ReturnCode port_remove_(port_t port_num) = 0;
 
  130   virtual void transmit_fn_(port_t port_num, 
const char *buffer, 
int len) = 0;
 
  132   virtual void start_() = 0;
 
  134   virtual ReturnCode set_packet_handler_(
const PacketHandler &handler,
 
  137   virtual bool port_is_up_(port_t port_num) 
const = 0;
 
  139   virtual std::map<port_t, PortInfo> get_port_info_() 
const = 0;
 
  141   virtual PortStats get_port_stats_(port_t port) 
const;
 
  142   virtual PortStats clear_port_stats_(port_t port);
 
  150 class DevMgr : 
public PacketDispatcherIface {
 
  158   using PortExtras = DevMgrIface::PortExtras;
 
  165   void set_dev_mgr(std::unique_ptr<DevMgrIface> my_pimp);
 
  167   void set_dev_mgr_bmi(
 
  168       device_id_t device_id,
 
  170       std::shared_ptr<TransportIface> notifications_transport = 
nullptr);
 
  175   void set_dev_mgr_files(
unsigned wait_time_in_seconds);
 
  180   void set_dev_mgr_packet_in(
 
  181       device_id_t device_id, 
const std::string &addr,
 
  182       std::shared_ptr<TransportIface> notifications_transport = 
nullptr,
 
  183       bool enforce_ports = 
false);
 
  186   ReturnCode port_add(
const std::string &iface_name, 
port_t port_num,
 
  187                       const PortExtras &port_extras);
 
  189   ReturnCode port_remove(
port_t port_num);
 
  191   bool port_is_up(
port_t port_num) 
const;
 
  193   std::map<port_t, DevMgrIface::PortInfo> get_port_info() 
const;
 
  195   DevMgrIface::PortStats get_port_stats(
port_t port_num) 
const;
 
  196   DevMgrIface::PortStats clear_port_stats(
port_t port_num);
 
  201   ReturnCode set_packet_handler(
const PacketHandler &handler, 
void *cookie)
 
  221   std::string sample_packet_data(
const char *buffer, 
int len);
 
  223   size_t dump_packet_data{0};
 
  229   std::unique_ptr<DevMgrIface> pimp{
nullptr};
 
  234 #endif  // BM_BM_SIM_DEV_MGR_H_