From f068c3ed296c49dfbfe17677fc1ad2428fb4e3e4 Mon Sep 17 00:00:00 2001 From: Neale Ranns Date: Wed, 3 Jan 2018 04:18:48 -0800 Subject: DVR: run L3 output features - rename l2_bridged to is_dvr. Including on the ip.api this was new in the 18.01 release so no compatability issues. - steal the free space in vnet_buffer_opaque_t for use with flags. - run the ipX-output feature arc from the DVR DPO Change-Id: I040e5976d1dbe076fcdda3a40a7804f56337ce3f Signed-off-by: Neale Ranns --- src/vpp-api/vom/prefix.cpp | 13 +++++++++++++ src/vpp-api/vom/prefix.hpp | 44 ++++++++++++++++++++++-------------------- src/vpp-api/vom/route.cpp | 29 ++++++++++++++++++++++++++-- src/vpp-api/vom/route.hpp | 30 ++++++++++++++++++++++++++++ src/vpp-api/vom/route_cmds.cpp | 4 ++-- 5 files changed, 95 insertions(+), 25 deletions(-) (limited to 'src/vpp-api') diff --git a/src/vpp-api/vom/prefix.cpp b/src/vpp-api/vom/prefix.cpp index e754999b6d1..abd589eef9f 100644 --- a/src/vpp-api/vom/prefix.cpp +++ b/src/vpp-api/vom/prefix.cpp @@ -53,6 +53,19 @@ l3_proto_t::from_address(const boost::asio::ip::address& addr) return IPV4; } +const nh_proto_t& +l3_proto_t::to_nh_proto() const +{ + if (*this == IPV4) + return nh_proto_t::IPV4; + else if (*this == IPV6) + return nh_proto_t::IPV6; + else if (*this == MPLS) + return nh_proto_t::MPLS; + + return nh_proto_t::IPV4; +} + std::ostream& operator<<(std::ostream& os, const l3_proto_t& l3p) { diff --git a/src/vpp-api/vom/prefix.hpp b/src/vpp-api/vom/prefix.hpp index 25b188ff86c..3950f6fd036 100644 --- a/src/vpp-api/vom/prefix.hpp +++ b/src/vpp-api/vom/prefix.hpp @@ -25,6 +25,27 @@ namespace VOM { * Types belonging to Routing */ +/** + * A next-hop protocol describes the protocol of a peer to which packets + * are sent after matching a route. + */ +class nh_proto_t : public enum_base +{ +public: + const static nh_proto_t IPV4; + const static nh_proto_t IPV6; + const static nh_proto_t MPLS; + const static nh_proto_t ETHERNET; + + static const nh_proto_t& from_address(const boost::asio::ip::address& addr); + +private: + /** + * Private constructor taking the value and the string name + */ + nh_proto_t(int v, const std::string& s); +}; + /** * An L3 protocol can be used to construct a prefix that is used * to match packets are part of a route. @@ -41,6 +62,8 @@ public: static const l3_proto_t& from_address(const boost::asio::ip::address& addr); + const nh_proto_t& to_nh_proto() const; + private: /** * Private constructor taking the value and the string name @@ -53,27 +76,6 @@ private: */ std::ostream& operator<<(std::ostream& os, const l3_proto_t& l3p); -/** - * A next-hop protocol describes the protocol of a peer to which packets - * are sent after matching a route. - */ -class nh_proto_t : public enum_base -{ -public: - const static nh_proto_t IPV4; - const static nh_proto_t IPV6; - const static nh_proto_t MPLS; - const static nh_proto_t ETHERNET; - - static const nh_proto_t& from_address(const boost::asio::ip::address& addr); - -private: - /** - * Private constructor taking the value and the string name - */ - nh_proto_t(int v, const std::string& s); -}; - namespace route { /** * type def the table-id diff --git a/src/vpp-api/vom/route.cpp b/src/vpp-api/vom/route.cpp index 661d99c4791..78ea8cebfad 100644 --- a/src/vpp-api/vom/route.cpp +++ b/src/vpp-api/vom/route.cpp @@ -33,9 +33,18 @@ path::special_t::special_t(int v, const std::string& s) { } +const path::flags_t path::flags_t::NONE(0, "none"); +const path::flags_t path::flags_t::DVR((1 << 0), "dvr"); + +path::flags_t::flags_t(int v, const std::string& s) + : enum_base(v, s) +{ +} + path::path(special_t special) : m_type(special) , m_nh_proto(nh_proto_t::IPV4) + , m_flags(flags_t::NONE) , m_nh() , m_rd(nullptr) , m_interface(nullptr) @@ -50,6 +59,7 @@ path::path(const boost::asio::ip::address& nh, uint8_t preference) : m_type(special_t::STANDARD) , m_nh_proto(nh_proto_t::from_address(nh)) + , m_flags(flags_t::NONE) , m_nh(nh) , m_rd(nullptr) , m_interface(interface.singular()) @@ -64,6 +74,7 @@ path::path(const route_domain& rd, uint8_t preference) : m_type(special_t::STANDARD) , m_nh_proto(nh_proto_t::from_address(nh)) + , m_flags(flags_t::NONE) , m_nh(nh) , m_rd(rd.singular()) , m_interface(nullptr) @@ -74,10 +85,12 @@ path::path(const route_domain& rd, path::path(const interface& interface, const nh_proto_t& proto, + const flags_t& flags, uint8_t weight, uint8_t preference) : m_type(special_t::STANDARD) , m_nh_proto(proto) + , m_flags(flags) , m_nh() , m_rd(nullptr) , m_interface(interface.singular()) @@ -89,6 +102,7 @@ path::path(const interface& interface, path::path(const path& p) : m_type(p.m_type) , m_nh_proto(p.m_nh_proto) + , m_flags(p.m_flags) , m_nh(p.m_nh) , m_rd(p.m_rd) , m_interface(p.m_interface) @@ -100,6 +114,10 @@ path::path(const path& p) bool path::operator<(const path& p) const { + if (m_nh_proto < p.m_nh_proto) + return true; + if (m_flags < p.m_flags) + return true; if (m_type < p.m_type) return true; if (m_rd && !p.m_rd) @@ -140,7 +158,8 @@ path::operator==(const path& p) const return false; if (m_interface && p.m_interface) result &= (*m_interface == *p.m_interface); - return (result && (m_type == p.m_type) && (m_nh == p.m_nh)); + return (result && (m_type == p.m_type) && (m_nh == p.m_nh) && + (m_nh_proto == p.m_nh_proto) && (m_flags == p.m_flags)); } std::string @@ -150,7 +169,7 @@ path::to_string() const s << "path:[" << "type:" << m_type.to_string() << " proto:" << m_nh_proto.to_string() - << " neighbour:" << m_nh.to_string(); + << " flags:" << m_flags.to_string() << " neighbour:" << m_nh.to_string(); if (m_rd) { s << " " << m_rd->to_string(); } @@ -175,6 +194,12 @@ path::nh_proto() const return m_nh_proto; } +path::flags_t +path::flags() const +{ + return m_flags; +} + const boost::asio::ip::address& path::nh() const { diff --git a/src/vpp-api/vom/route.hpp b/src/vpp-api/vom/route.hpp index 2fb855a13eb..65797b7c2f9 100644 --- a/src/vpp-api/vom/route.hpp +++ b/src/vpp-api/vom/route.hpp @@ -71,6 +71,29 @@ public: special_t(int v, const std::string& s); }; + /** + * Path flags + */ + class flags_t : public enum_base + { + public: + /** + * No flags + */ + const static flags_t NONE; + + /** + * A path that resolves via a DVR next-hop + */ + const static flags_t DVR; + + private: + /** + * Private constructor taking the value and the string name + */ + flags_t(int v, const std::string& s); + }; + /** * constructor for special paths */ @@ -97,6 +120,7 @@ public: */ path(const interface& interface, const nh_proto_t& proto, + const flags_t& flags = flags_t::NONE, uint8_t weight = 1, uint8_t preference = 0); @@ -130,6 +154,7 @@ public: */ special_t type() const; nh_proto_t nh_proto() const; + flags_t flags() const; const boost::asio::ip::address& nh() const; std::shared_ptr rd() const; std::shared_ptr itf() const; @@ -147,6 +172,11 @@ private: */ nh_proto_t m_nh_proto; + /** + * Flags for the path + */ + flags_t m_flags; + /** * The next-hop */ diff --git a/src/vpp-api/vom/route_cmds.cpp b/src/vpp-api/vom/route_cmds.cpp index 0d012a2946b..83d44ccc01d 100644 --- a/src/vpp-api/vom/route_cmds.cpp +++ b/src/vpp-api/vom/route_cmds.cpp @@ -33,8 +33,8 @@ to_vpp(const route::path& p, vapi_payload_ip_add_del_route& payload) payload.is_resolve_host = 0; payload.is_resolve_attached = 0; - if (nh_proto_t::ETHERNET == p.nh_proto()) { - payload.is_l2_bridged = 1; + if (route::path::flags_t::DVR & p.flags()) { + payload.is_dvr = 1; } if (route::path::special_t::STANDARD == p.type()) { -- cgit 1.2.3-korg