UDP-Encap: name counters for the stats segment
change the ADD api so that is returns the 'ID' that can be used by the client to read the stats from the stats segment and to delete the object. Previously a similar value used required to be chosen by the client, now VPP allocates one (like it does e.g. for interfaces) Change-Id: I563cf6092276eb990c52d5457c86e72546bcf69e Signed-off-by: Neale Ranns <nranns@cisco.com>
This commit is contained in:
committed by
Damjan Marion
parent
da8e180262
commit
9c0a3c423e
@@ -181,7 +181,11 @@ bier_fmask_init (bier_fmask_t *bfm,
|
||||
btid = bier_table_get_id(bfm->bfm_id->bfmi_bti);
|
||||
bier_fmask_bits_init(&bfm->bfm_bits, btid->bti_hdr_len);
|
||||
|
||||
if (ip46_address_is_zero(&(bfm->bfm_id->bfmi_nh)))
|
||||
if (rpath->frp_flags & FIB_ROUTE_PATH_UDP_ENCAP)
|
||||
{
|
||||
bfm->bfm_id->bfmi_nh_type = BIER_NH_UDP;
|
||||
}
|
||||
else if (ip46_address_is_zero(&(bfm->bfm_id->bfmi_nh)))
|
||||
{
|
||||
bfm->bfm_flags |= BIER_FMASK_FLAG_DISP;
|
||||
}
|
||||
|
||||
@@ -80,7 +80,7 @@ typedef struct bier_fmask_id_t_ {
|
||||
bier_hdr_type_t bfmi_hdr_type;
|
||||
|
||||
/**
|
||||
* Union discriminatrr
|
||||
* Union discriminator
|
||||
*/
|
||||
bier_nh_type_t bfmi_nh_type;
|
||||
} __attribute__((packed)) bier_fmask_id_t;
|
||||
|
||||
@@ -58,6 +58,7 @@ typedef struct bier_output_trace_t_
|
||||
{
|
||||
u32 next_index;
|
||||
index_t bfm_index;
|
||||
mpls_label_t bfm_label;
|
||||
} bier_output_trace_t;
|
||||
|
||||
static uword
|
||||
@@ -163,6 +164,7 @@ bier_output (vlib_main_t * vm,
|
||||
tr = vlib_add_trace (vm, node, b0, sizeof (*tr));
|
||||
tr->next_index = next0;
|
||||
tr->bfm_index = bfmi0;
|
||||
tr->bfm_label = bfm0->bfm_label;
|
||||
}
|
||||
|
||||
vlib_validate_buffer_enqueue_x1 (vm, node, next_index,
|
||||
@@ -186,8 +188,8 @@ format_bier_output_trace (u8 * s, va_list * args)
|
||||
CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
|
||||
bier_output_trace_t * t = va_arg (*args, bier_output_trace_t *);
|
||||
|
||||
s = format (s, " next [%d], BFM index %d",
|
||||
t->next_index, t->bfm_index);
|
||||
s = format (s, " next [%d], BFM index %d label:%x",
|
||||
t->next_index, t->bfm_index, t->bfm_label);
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
@@ -903,7 +903,7 @@ fib_path_unresolve (fib_path_t *path)
|
||||
adj_unlock(path->fp_dpo.dpoi_index);
|
||||
break;
|
||||
case FIB_PATH_TYPE_UDP_ENCAP:
|
||||
udp_encap_unlock_w_index(path->fp_dpo.dpoi_index);
|
||||
udp_encap_unlock(path->fp_dpo.dpoi_index);
|
||||
break;
|
||||
case FIB_PATH_TYPE_EXCLUSIVE:
|
||||
dpo_reset(&path->exclusive.fp_ex_dpo);
|
||||
|
||||
+17
-3
@@ -33,16 +33,16 @@ import "vnet/ip/ip_types.api";
|
||||
* @param src_ip - Encap source address
|
||||
* @param dst_port - Encap destination port
|
||||
* @param src_port - Encap source port
|
||||
* @param id - The ID assigned to this encap object by the caller
|
||||
* @param id - VPP assigned id; ignored in add message, set in dump
|
||||
*/
|
||||
typedef udp_encap
|
||||
{
|
||||
u32 id;
|
||||
u32 table_id;
|
||||
u16 src_port;
|
||||
u16 dst_port;
|
||||
vl_api_address_t src_ip;
|
||||
vl_api_address_t dst_ip;
|
||||
u32 id;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -51,13 +51,27 @@ typedef udp_encap
|
||||
* @param context - sender context, to match reply w/ request
|
||||
* @param udp_encap - UDP encap description
|
||||
*/
|
||||
autoreply define udp_encap_add
|
||||
define udp_encap_add
|
||||
{
|
||||
u32 client_index;
|
||||
u32 context;
|
||||
vl_api_udp_encap_t udp_encap;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Add UDP encap reply
|
||||
* @param context - sender context, to match reply w/ request
|
||||
* @param retval - success/failure return value
|
||||
* @param id - The ID of the encap object that should be used on delete
|
||||
* and when reading stats from the stats segment.
|
||||
*/
|
||||
define udp_encap_add_reply
|
||||
{
|
||||
u32 context;
|
||||
i32 retval;
|
||||
u32 id;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Del UDP encap
|
||||
* @param client_index - opaque cookie to identify the sender
|
||||
|
||||
+15
-9
@@ -86,7 +86,7 @@ send_udp_encap_details (const udp_encap_t * ue, vl_api_registration_t * reg,
|
||||
|
||||
mp->udp_encap.table_id =
|
||||
htonl (fib_table_get_table_id (ue->ue_fib_index, ue->ue_ip_proto));
|
||||
mp->udp_encap.id = htonl (ue->ue_id);
|
||||
mp->udp_encap.id = htonl (ue - udp_encap_pool);
|
||||
|
||||
vl_api_send_msg (reg, (u8 *) mp);
|
||||
}
|
||||
@@ -115,12 +115,12 @@ vl_api_udp_encap_add_t_handler (vl_api_udp_encap_add_t * mp, vlib_main_t * vm)
|
||||
{
|
||||
vl_api_udp_encap_add_reply_t *rmp;
|
||||
ip46_address_t src_ip, dst_ip;
|
||||
u32 fib_index, table_id, ue_id;
|
||||
u32 fib_index, table_id;
|
||||
fib_protocol_t fproto;
|
||||
ip46_type_t itype;
|
||||
index_t uei;
|
||||
int rv = 0;
|
||||
|
||||
ue_id = ntohl (mp->udp_encap.id);
|
||||
table_id = ntohl (mp->udp_encap.table_id);
|
||||
|
||||
itype = ip_address_decode (&mp->udp_encap.src_ip, &src_ip);
|
||||
@@ -134,14 +134,20 @@ vl_api_udp_encap_add_t_handler (vl_api_udp_encap_add_t * mp, vlib_main_t * vm)
|
||||
goto done;
|
||||
}
|
||||
|
||||
udp_encap_add_and_lock (ue_id, fproto, fib_index,
|
||||
&src_ip, &dst_ip,
|
||||
ntohs (mp->udp_encap.src_port),
|
||||
ntohs (mp->udp_encap.dst_port),
|
||||
UDP_ENCAP_FIXUP_NONE);
|
||||
uei = udp_encap_add_and_lock (fproto, fib_index,
|
||||
&src_ip, &dst_ip,
|
||||
ntohs (mp->udp_encap.src_port),
|
||||
ntohs (mp->udp_encap.dst_port),
|
||||
UDP_ENCAP_FIXUP_NONE);
|
||||
|
||||
done:
|
||||
REPLY_MACRO (VL_API_UDP_ENCAP_ADD_REPLY);
|
||||
/* *INDENT-OFF* */
|
||||
REPLY_MACRO2 (VL_API_UDP_ENCAP_ADD_REPLY,
|
||||
({
|
||||
rmp->id = ntohl (uei);
|
||||
}));
|
||||
/* *INDENT-ON* */
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
+98
-184
File diff suppressed because it is too large
Load Diff
@@ -92,12 +92,6 @@ typedef struct udp_encap_t_
|
||||
*/
|
||||
fib_node_t ue_fib_node;
|
||||
|
||||
/**
|
||||
* The ID given by the user/client.
|
||||
* This ID is used by the client for modifications.
|
||||
*/
|
||||
u32 ue_id;
|
||||
|
||||
/**
|
||||
* Tracking information for the IP destination
|
||||
*/
|
||||
@@ -110,8 +104,7 @@ typedef struct udp_encap_t_
|
||||
index_t ue_fib_index;
|
||||
} udp_encap_t;
|
||||
|
||||
extern index_t udp_encap_add_and_lock (u32 id,
|
||||
fib_protocol_t proto,
|
||||
extern index_t udp_encap_add_and_lock (fib_protocol_t proto,
|
||||
index_t fib_index,
|
||||
const ip46_address_t * src_ip,
|
||||
const ip46_address_t * dst_ip,
|
||||
@@ -119,12 +112,10 @@ extern index_t udp_encap_add_and_lock (u32 id,
|
||||
u16 dst_port,
|
||||
udp_encap_fixup_flags_t flags);
|
||||
|
||||
extern index_t udp_encap_find (u32 id);
|
||||
extern void udp_encap_lock (u32 id);
|
||||
extern void udp_encap_unlock (u32 id);
|
||||
extern void udp_encap_lock (index_t uei);
|
||||
extern void udp_encap_unlock (index_t uei);
|
||||
extern u8 *format_udp_encap (u8 * s, va_list * args);
|
||||
extern void udp_encap_unlock_w_index (index_t uei);
|
||||
extern void udp_encap_contribute_forwarding (u32 id,
|
||||
extern void udp_encap_contribute_forwarding (index_t uei,
|
||||
dpo_proto_t proto,
|
||||
dpo_id_t * dpo);
|
||||
|
||||
|
||||
@@ -2154,11 +2154,9 @@ udp_encap_stats_walk_cb (index_t uei, void *arg)
|
||||
vl_api_udp_encap_counter_t *stat;
|
||||
udp_encap_t *ue;
|
||||
|
||||
ue = udp_encap_get (uei);
|
||||
vec_add2 (ctx->stats, stat, 1);
|
||||
|
||||
stat->id = ue->ue_id;
|
||||
udp_encap_get_stats (ue->ue_id, &stat->packets, &stat->bytes);
|
||||
udp_encap_get_stats (uei, &stat->packets, &stat->bytes);
|
||||
|
||||
return (WALK_CONTINUE);
|
||||
}
|
||||
|
||||
+3
-3
@@ -666,7 +666,7 @@ class TestBier(VppTestCase):
|
||||
labels=[VppMplsLabel(2001)])])
|
||||
ip_route.add_vpp_config()
|
||||
|
||||
udp_encap = VppUdpEncap(self, 4,
|
||||
udp_encap = VppUdpEncap(self,
|
||||
self.pg0.local_ip4,
|
||||
nh1,
|
||||
330, 8138)
|
||||
@@ -677,7 +677,7 @@ class TestBier(VppTestCase):
|
||||
[VppRoutePath("0.0.0.0",
|
||||
0xFFFFFFFF,
|
||||
is_udp_encap=1,
|
||||
next_hop_id=4)])
|
||||
next_hop_id=udp_encap.id)])
|
||||
bier_route.add_vpp_config()
|
||||
|
||||
#
|
||||
@@ -727,7 +727,7 @@ class TestBier(VppTestCase):
|
||||
self.assertEqual(rx[0][IP].dst, nh1)
|
||||
self.assertEqual(rx[0][UDP].sport, 330)
|
||||
self.assertEqual(rx[0][UDP].dport, 8138)
|
||||
self.assertEqual(rx[0][BIFT].bsl, 2)
|
||||
self.assertEqual(rx[0][BIFT].bsl, BIERLength.BIER_LEN_256)
|
||||
self.assertEqual(rx[0][BIFT].sd, 1)
|
||||
self.assertEqual(rx[0][BIFT].set, 0)
|
||||
self.assertEqual(rx[0][BIFT].ttl, 64)
|
||||
|
||||
+13
-8
@@ -87,21 +87,21 @@ class TestUdpEncap(VppTestCase):
|
||||
# construct a UDP encap object through each of the peers
|
||||
# v4 through the first two peears, v6 through the second.
|
||||
#
|
||||
udp_encap_0 = VppUdpEncap(self, 0,
|
||||
udp_encap_0 = VppUdpEncap(self,
|
||||
self.pg0.local_ip4,
|
||||
self.pg0.remote_ip4,
|
||||
330, 440)
|
||||
udp_encap_1 = VppUdpEncap(self, 1,
|
||||
udp_encap_1 = VppUdpEncap(self,
|
||||
self.pg1.local_ip4,
|
||||
self.pg1.remote_ip4,
|
||||
331, 441,
|
||||
table_id=1)
|
||||
udp_encap_2 = VppUdpEncap(self, 2,
|
||||
udp_encap_2 = VppUdpEncap(self,
|
||||
self.pg2.local_ip6,
|
||||
self.pg2.remote_ip6,
|
||||
332, 442,
|
||||
table_id=2)
|
||||
udp_encap_3 = VppUdpEncap(self, 3,
|
||||
udp_encap_3 = VppUdpEncap(self,
|
||||
self.pg3.local_ip6,
|
||||
self.pg3.remote_ip6,
|
||||
333, 443,
|
||||
@@ -125,23 +125,23 @@ class TestUdpEncap(VppTestCase):
|
||||
[VppRoutePath("0.0.0.0",
|
||||
0xFFFFFFFF,
|
||||
is_udp_encap=1,
|
||||
next_hop_id=0)])
|
||||
next_hop_id=udp_encap_0.id)])
|
||||
route_4o6 = VppIpRoute(self, "1.1.2.1", 32,
|
||||
[VppRoutePath("0.0.0.0",
|
||||
0xFFFFFFFF,
|
||||
is_udp_encap=1,
|
||||
next_hop_id=2)])
|
||||
next_hop_id=udp_encap_2.id)])
|
||||
route_6o4 = VppIpRoute(self, "2001::1", 128,
|
||||
[VppRoutePath("0.0.0.0",
|
||||
0xFFFFFFFF,
|
||||
is_udp_encap=1,
|
||||
next_hop_id=1)],
|
||||
next_hop_id=udp_encap_1.id)],
|
||||
is_ip6=1)
|
||||
route_6o6 = VppIpRoute(self, "2001::3", 128,
|
||||
[VppRoutePath("0.0.0.0",
|
||||
0xFFFFFFFF,
|
||||
is_udp_encap=1,
|
||||
next_hop_id=3)],
|
||||
next_hop_id=udp_encap_3.id)],
|
||||
is_ip6=1)
|
||||
route_4o4.add_vpp_config()
|
||||
route_4o6.add_vpp_config()
|
||||
@@ -161,6 +161,7 @@ class TestUdpEncap(VppTestCase):
|
||||
self.validate_outer4(p, udp_encap_0)
|
||||
p = IP(p["UDP"].payload.load)
|
||||
self.validate_inner4(p, p_4o4)
|
||||
self.assertEqual(udp_encap_0.get_stats()['packets'], 65)
|
||||
|
||||
#
|
||||
# 4o6 encap
|
||||
@@ -175,6 +176,7 @@ class TestUdpEncap(VppTestCase):
|
||||
self.validate_outer6(p, udp_encap_2)
|
||||
p = IP(p["UDP"].payload.load)
|
||||
self.validate_inner4(p, p_4o6)
|
||||
self.assertEqual(udp_encap_2.get_stats()['packets'], 65)
|
||||
|
||||
#
|
||||
# 6o4 encap
|
||||
@@ -189,6 +191,7 @@ class TestUdpEncap(VppTestCase):
|
||||
self.validate_outer4(p, udp_encap_1)
|
||||
p = IPv6(p["UDP"].payload.load)
|
||||
self.validate_inner6(p, p_6o4)
|
||||
self.assertEqual(udp_encap_1.get_stats()['packets'], 65)
|
||||
|
||||
#
|
||||
# 6o6 encap
|
||||
@@ -203,6 +206,7 @@ class TestUdpEncap(VppTestCase):
|
||||
self.validate_outer6(p, udp_encap_3)
|
||||
p = IPv6(p["UDP"].payload.load)
|
||||
self.validate_inner6(p, p_6o6)
|
||||
self.assertEqual(udp_encap_3.get_stats()['packets'], 65)
|
||||
|
||||
#
|
||||
# A route with an output label
|
||||
@@ -226,6 +230,7 @@ class TestUdpEncap(VppTestCase):
|
||||
self.validate_outer4(p, udp_encap_1)
|
||||
p = MPLS(p["UDP"].payload.load)
|
||||
self.validate_inner4(p, p_4omo4, ttl=63)
|
||||
self.assertEqual(udp_encap_1.get_stats()['packets'], 130)
|
||||
|
||||
|
||||
class TestUDP(VppTestCase):
|
||||
|
||||
@@ -1150,14 +1150,12 @@ class VppPapiProvider(object):
|
||||
)
|
||||
|
||||
def udp_encap_add(self,
|
||||
id,
|
||||
src_ip,
|
||||
dst_ip,
|
||||
src_port,
|
||||
dst_port,
|
||||
table_id=0):
|
||||
""" Add a GRE tunnel
|
||||
:param id: user provided ID
|
||||
:param src_ip:
|
||||
:param dst_ip:
|
||||
:param src_port:
|
||||
@@ -1169,7 +1167,6 @@ class VppPapiProvider(object):
|
||||
self.papi.udp_encap_add,
|
||||
{
|
||||
'udp_encap': {
|
||||
'id': id,
|
||||
'src_ip': src_ip,
|
||||
'dst_ip': dst_ip,
|
||||
'src_port': src_port,
|
||||
|
||||
@@ -25,14 +25,12 @@ class VppUdpEncap(VppObject):
|
||||
|
||||
def __init__(self,
|
||||
test,
|
||||
id,
|
||||
src_ip,
|
||||
dst_ip,
|
||||
src_port,
|
||||
dst_port,
|
||||
table_id=0):
|
||||
self._test = test
|
||||
self.id = id
|
||||
self.table_id = table_id
|
||||
self.src_ip_s = src_ip
|
||||
self.dst_ip_s = dst_ip
|
||||
@@ -42,13 +40,13 @@ class VppUdpEncap(VppObject):
|
||||
self.dst_port = dst_port
|
||||
|
||||
def add_vpp_config(self):
|
||||
self._test.vapi.udp_encap_add(
|
||||
self.id,
|
||||
r = self._test.vapi.udp_encap_add(
|
||||
self.src_ip.encode(),
|
||||
self.dst_ip.encode(),
|
||||
self.src_port,
|
||||
self.dst_port,
|
||||
self.table_id)
|
||||
self.id = r.id
|
||||
self._test.registry.register(self, self._test.logger)
|
||||
|
||||
def remove_vpp_config(self):
|
||||
@@ -62,3 +60,7 @@ class VppUdpEncap(VppObject):
|
||||
|
||||
def object_id(self):
|
||||
return ("udp-encap-%d" % self.id)
|
||||
|
||||
def get_stats(self):
|
||||
c = self._test.statistics.get_counter("/net/udp-encap")
|
||||
return c[0][self.id]
|
||||
|
||||
Reference in New Issue
Block a user