/* * 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_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 singular() const; /** * Find a subinterface from its key */ static std::shared_ptr find(const key_t& k); /** * The interface that is the east end of the pipe */ std::shared_ptr 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 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& mk_create_cmd(std::queue& cmds); virtual std::queue& mk_delete_cmd(std::queue& cmds); std::shared_ptr 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 singular_i() const; /** * Virtual functions to construct an interface create commands. */ virtual std::queue& mk_create_cmd(std::queue& cmds); /** * Virtual functions to construct an interface delete commands. */ virtual std::queue& mk_delete_cmd(std::queue& cmds); /** * the handles that are set during the create command */ HW::item m_hdl_pair; /** * The ends of the pipe */ std::shared_ptr 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