/* * 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_BOND_INTERFACE_H__ #define __VOM_BOND_INTERFACE_H__ #include "vom/interface.hpp" namespace VOM { /** * A bond-interface. e.g. a bond interface */ class bond_interface : public interface { public: /** * A bond interface mode */ struct mode_t : enum_base { /** * Round-Robin bond interface mode */ const static mode_t ROUND_ROBIN; /** * Active-backup bond interface mode */ const static mode_t ACTIVE_BACKUP; /** * XOR bond interface mode */ const static mode_t XOR; /** * Broadcast bond interface mode */ const static mode_t BROADCAST; /** * LACP bond interface mode */ const static mode_t LACP; /** * Unspecificed bond interface mode */ const static mode_t UNSPECIFIED; /** * Convert VPP's value of the bond to a mode */ static const mode_t from_numeric_val(uint8_t v); private: /** * Private constructor taking the value and the string name */ mode_t(int v, const std::string& s); }; /** * A bond interface load balance */ struct lb_t : enum_base { /** * L2 bond interface lb */ const static lb_t L2; /** * L34 bond interface lb */ const static lb_t L34; /** * L23 bond interface lb */ const static lb_t L23; /** * Unspecificed bond interface lb */ const static lb_t UNSPECIFIED; /** * Convert VPP's value of the bond to a lb */ static const lb_t from_numeric_val(uint8_t v); private: /** * Private constructor taking the value and the string name */ lb_t(int v, const std::string& s); }; bond_interface(const std::string& name, admin_state_t state, mode_t mode, lb_t lb = lb_t::UNSPECIFIED); bond_interface(const std::string& name, admin_state_t state, const l2_address_t& l2_address, mode_t mode, lb_t lb = lb_t::UNSPECIFIED); ~bond_interface(); bond_interface(const bond_interface& o); /** * The the singular instance of the bond interface in the DB by handle */ static std::shared_ptr find(const handle_t& hdl); /** * Return the matching 'singular instance' of the BOND interface */ std::shared_ptr singular() const; /** * set the mode */ void set(mode_t mode); /** * set the lb */ void set(lb_t lb); /** * convert to string */ virtual std::string to_string() const; protected: /** * set the handle */ void set(handle_t& handle); friend class interface_factory; private: /** * l2 address on bond interface */ l2_address_t m_l2_address; /** * mode on bond interface */ mode_t m_mode; /** * lb mode on bond interface */ lb_t m_lb; /** * Return the matching 'instance' of the sub-interface * 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); /* * It's the OM class that call singular() */ friend class OM; }; } /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "mozilla") * End: */ #endif