blob: 7da3a1f162a8633e07b85460e3f099d5fa778abf [file] [log] [blame]
/*
* Copyright (c) 2018 Cisco and/or its affiliates.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __VOM_PIPE_H__
#define __VOM_PIPE_H__
#include "vom/interface.hpp"
namespace VOM {
/**
* A Pipe interface.
* A pipe is composed for 3 'interfaces'.
* 1) the 'parent' interface - this is used as the 'key' for the pipe
* 2) the two 'ends' of the pipe - these are used to RX/TX packets
* form/to. The ends are retreivable using the east()/west() functions.
* The east and west end are exactly equivalent, they are merely
* named differently for logical purposes.
*/
class pipe : public interface
{
public:
typedef std::pair<handle_t, handle_t> handle_pair_t;
/**
* Construct a new object matching the desried state
*/
pipe(uint32_t instance, admin_state_t state);
/**
* Destructor
*/
~pipe();
/**
* Copy Constructor
*/
pipe(const pipe& o);
/**
* comparison operator - for UT
*/
bool operator==(const pipe& s) const;
/**
* Return the matching 'singular instance' of the sub-interface
*/
std::shared_ptr<pipe> singular() const;
/**
* Find a subinterface from its key
*/
static std::shared_ptr<pipe> find(const key_t& k);
/**
* The interface that is the east end of the pipe
*/
std::shared_ptr<interface> east();
/**
* The interface that is the west end of the pipe.
* The east and west end are exactly equivalent, they are merely
* named differently for logical purposes.
*/
std::shared_ptr<interface> west();
virtual std::string to_string(void) const;
void set_ends(const handle_pair_t& p);
private:
/**
* The interface type that forms the ends of the pipe
*/
class pipe_end : public interface
{
public:
pipe_end(const pipe& p, uint8_t id);
private:
virtual std::queue<cmd*>& mk_create_cmd(std::queue<cmd*>& cmds);
virtual std::queue<cmd*>& mk_delete_cmd(std::queue<cmd*>& cmds);
std::shared_ptr<pipe> m_pipe;
};
/**
*Class definition for listeners to OM events
*/
class event_handler : public OM::listener, public inspect::command_handler
{
public:
event_handler();
virtual ~event_handler() = default;
/**
* Handle a populate event
*/
void handle_populate(const client_db::key_t& key);
/**
* Handle a replay event
*/
void handle_replay();
/**
* Show the object in the Singular DB
*/
void show(std::ostream& os);
/**
* Get the sortable Id of the listener
*/
dependency_t order() const;
};
static event_handler m_evh;
/**
* Return the matching 'instance' of the pipe
* over-ride from the base class
*/
std::shared_ptr<interface> singular_i() const;
/**
* Virtual functions to construct an interface create commands.
*/
virtual std::queue<cmd*>& mk_create_cmd(std::queue<cmd*>& cmds);
/**
* Virtual functions to construct an interface delete commands.
*/
virtual std::queue<cmd*>& mk_delete_cmd(std::queue<cmd*>& cmds);
/**
* the handles that are set during the create command
*/
HW::item<handle_pair_t> m_hdl_pair;
/**
* The ends of the pipe
*/
std::shared_ptr<interface> m_ends[2];
/**
* Instance number
*/
uint32_t m_instance;
};
}; // namespace VOM
/*
* fd.io coding-style-patch-verification: ON
*
* Local Variables:
* eval: (c-set-style "mozilla")
* End:
*/
#endif