summaryrefslogtreecommitdiffstats
path: root/src/vpp-api
diff options
context:
space:
mode:
authorNeale Ranns <nranns@cisco.com>2018-01-03 04:18:48 -0800
committerOle Trøan <otroan@employees.org>2018-01-09 16:38:19 +0000
commitf068c3ed296c49dfbfe17677fc1ad2428fb4e3e4 (patch)
treeeef3c7c502b68ccdff9c5d80d04850465e25ef01 /src/vpp-api
parent0e8cb6c475b616a3296b08d25bcaa1eed3ab0084 (diff)
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 <nranns@cisco.com>
Diffstat (limited to 'src/vpp-api')
-rw-r--r--src/vpp-api/vom/prefix.cpp13
-rw-r--r--src/vpp-api/vom/prefix.hpp44
-rw-r--r--src/vpp-api/vom/route.cpp29
-rw-r--r--src/vpp-api/vom/route.hpp30
-rw-r--r--src/vpp-api/vom/route_cmds.cpp4
5 files changed, 95 insertions, 25 deletions
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
@@ -26,6 +26,27 @@ namespace VOM {
*/
/**
+ * 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<nh_proto_t>
+{
+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<nh_proto_t>
-{
-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<path::flags_t>(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
@@ -72,6 +72,29 @@ public:
};
/**
+ * Path flags
+ */
+ class flags_t : public enum_base<flags_t>
+ {
+ 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
*/
path(special_t special);
@@ -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<route_domain> rd() const;
std::shared_ptr<interface> itf() const;
@@ -148,6 +173,11 @@ private:
nh_proto_t m_nh_proto;
/**
+ * Flags for the path
+ */
+ flags_t m_flags;
+
+ /**
* The next-hop
*/
boost::asio::ip::address m_nh;
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()) {