Code Review
/
vpp.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
docs: fixed to use unified "pcap trace" command
[vpp.git]
/
src
/
vnet
/
classify
/
vnet_classify.c
diff --git
a/src/vnet/classify/vnet_classify.c
b/src/vnet/classify/vnet_classify.c
index
4fb4f33
..
8ad8a6a
100644
(file)
--- a/
src/vnet/classify/vnet_classify.c
+++ b/
src/vnet/classify/vnet_classify.c
@@
-293,7
+293,7
@@
split_and_rehash (vnet_classify_table_t * t,
for (i = 0; i < length_in_entries; i++)
{
for (i = 0; i < length_in_entries; i++)
{
- u
64
new_hash;
+ u
32
new_hash;
v = vnet_classify_entry_at_index (t, old_values, i);
v = vnet_classify_entry_at_index (t, old_values, i);
@@
-424,7
+424,7
@@
vnet_classify_add_del (vnet_classify_table_t *t, vnet_classify_entry_t *add_v,
u32 value_index;
int rv = 0;
int i;
u32 value_index;
int rv = 0;
int i;
- u
64
hash, new_hash;
+ u
32
hash, new_hash;
u32 limit;
u32 old_log2_pages, new_log2_pages;
u32 thread_index = vlib_get_thread_index ();
u32 limit;
u32 old_log2_pages, new_log2_pages;
u32 thread_index = vlib_get_thread_index ();
@@
-647,21
+647,21
@@
typedef CLIB_PACKED(struct {
}) classify_data_or_mask_t;
/* *INDENT-ON* */
}) classify_data_or_mask_t;
/* *INDENT-ON* */
-u
64
-vnet_classify_hash_packet (
vnet_classify_table_t * t, u8 *
h)
+u
32
+vnet_classify_hash_packet (
const vnet_classify_table_t *t, u8 *
h)
{
return vnet_classify_hash_packet_inline (t, h);
}
vnet_classify_entry_t *
{
return vnet_classify_hash_packet_inline (t, h);
}
vnet_classify_entry_t *
-vnet_classify_find_entry (
vnet_classify_table_t * t
,
-
u8 * h, u64 hash,
f64 now)
+vnet_classify_find_entry (
const vnet_classify_table_t *t, u8 *h, u32 hash
,
+ f64 now)
{
return vnet_classify_find_entry_inline (t, h, hash, now);
}
{
return vnet_classify_find_entry_inline (t, h, hash, now);
}
-
static
u8 *
-format_classify_entry (u8 *
s, va_list *
args)
+u8 *
+format_classify_entry (u8 *
s, va_list *
args)
{
vnet_classify_table_t *t = va_arg (*args, vnet_classify_table_t *);
vnet_classify_entry_t *e = va_arg (*args, vnet_classify_entry_t *);
{
vnet_classify_table_t *t = va_arg (*args, vnet_classify_table_t *);
vnet_classify_entry_t *e = va_arg (*args, vnet_classify_entry_t *);
@@
-777,8
+777,10
@@
vnet_classify_add_del_table (vnet_classify_main_t *cm, const u8 *mask,
else /* update */
{
vnet_classify_main_t *cm = &vnet_classify_main;
else /* update */
{
vnet_classify_main_t *cm = &vnet_classify_main;
- t = pool_elt_at_index (cm->tables, *table_index);
+ if (pool_is_free_index (cm->tables, *table_index))
+ return VNET_API_ERROR_CLASSIFY_TABLE_NOT_FOUND;
+ t = pool_elt_at_index (cm->tables, *table_index);
t->next_table_index = next_table_index;
}
return 0;
t->next_table_index = next_table_index;
}
return 0;
@@
-1233,12
+1235,16
@@
unformat_classify_mask (unformat_input_t * input, va_list * args)
u8 *l2 = 0;
u8 *l3 = 0;
u8 *l4 = 0;
u8 *l2 = 0;
u8 *l3 = 0;
u8 *l4 = 0;
+ u8 add_l2 = 1;
int i;
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
{
if (unformat (input, "hex %U", unformat_hex_string, &mask))
;
int i;
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
{
if (unformat (input, "hex %U", unformat_hex_string, &mask))
;
+ else if (unformat (input, "l2 none"))
+ /* Don't add the l2 header in the mask */
+ add_l2 = 0;
else if (unformat (input, "l2 %U", unformat_l2_mask, &l2))
;
else if (unformat (input, "l3 %U", unformat_l3_mask, &l3))
else if (unformat (input, "l2 %U", unformat_l2_mask, &l2))
;
else if (unformat (input, "l3 %U", unformat_l3_mask, &l3))
@@
-1249,6
+1255,15
@@
unformat_classify_mask (unformat_input_t * input, va_list * args)
break;
}
break;
}
+ if (l2 && !add_l2)
+ {
+ vec_free (mask);
+ vec_free (l2);
+ vec_free (l3);
+ vec_free (l4);
+ return 0;
+ }
+
if (l4 && !l3)
{
vec_free (mask);
if (l4 && !l3)
{
vec_free (mask);
@@
-1261,15
+1276,20
@@
unformat_classify_mask (unformat_input_t * input, va_list * args)
{
if (l2 || l3 || l4)
{
{
if (l2 || l3 || l4)
{
- /* "With a free Ethernet header in every package" */
- if (l2 == 0)
- vec_validate (l2, 13);
- mask = l2;
- if (l3)
+ if (add_l2)
{
{
- vec_append (mask, l3);
- vec_free (l3);
+ /* "With a free Ethernet header in every package" */
+ if (l2 == 0)
+ vec_validate (l2, 13);
+ mask = l2;
+ if (l3)
+ {
+ vec_append (mask, l3);
+ vec_free (l3);
+ }
}
}
+ else
+ mask = l3;
if (l4)
{
vec_append (mask, l4);
if (l4)
{
vec_append (mask, l4);
@@
-1302,7
+1322,7
@@
unformat_classify_mask (unformat_input_t * input, va_list * args)
if (match == 0)
clib_warning ("BUG: match 0");
if (match == 0)
clib_warning ("BUG: match 0");
-
_vec_len (mask) = match * sizeof (u32x4
);
+
vec_set_len (mask, match * sizeof (u32x4)
);
*matchp = match;
*maskp = mask;
*matchp = match;
*maskp = mask;
@@
-2034,7
+2054,7
@@
vlib_enable_disable_pkt_trace_filter (int enable)
/*?
* Construct an arbitrary set of packet classifier tables for use with
/*?
* Construct an arbitrary set of packet classifier tables for use with
- * "pcap
rx | tx trace
," and with the vpp packet tracer
+ * "pcap
trace rx | tx
," and with the vpp packet tracer
*
* Packets which match a rule in the classifier table chain
* will be traced. The tables are automatically ordered so that
*
* Packets which match a rule in the classifier table chain
* will be traced. The tables are automatically ordered so that
@@
-2077,10
+2097,10
@@
vlib_enable_disable_pkt_trace_filter (int enable)
* @cliexpar
* Configuring the classify filter
*
* @cliexpar
* Configuring the classify filter
*
- * Configure a simple classify filter, and configure pcap
rx trace
to use it:
+ * Configure a simple classify filter, and configure pcap
trace rx
to use it:
*
* @cliexcmd{classify filter rx mask l3 ip4 src match l3 ip4 src 192.168.1.11}
*
* @cliexcmd{classify filter rx mask l3 ip4 src match l3 ip4 src 192.168.1.11}
- * <b><em>pcap
rx trace on
max 100 filter</em></b>
+ * <b><em>pcap
trace rx
max 100 filter</em></b>
*
* Configure another fairly simple filter
*
*
* Configure another fairly simple filter
*
@@
-2679,6
+2699,7
@@
unformat_classify_match (unformat_input_t * input, va_list * args)
u8 *l2 = 0;
u8 *l3 = 0;
u8 *l4 = 0;
u8 *l2 = 0;
u8 *l3 = 0;
u8 *l4 = 0;
+ u8 add_l2 = 1;
if (pool_is_free_index (cm->tables, table_index))
return 0;
if (pool_is_free_index (cm->tables, table_index))
return 0;
@@
-2689,6
+2710,9
@@
unformat_classify_match (unformat_input_t * input, va_list * args)
{
if (unformat (input, "hex %U", unformat_hex_string, &match))
;
{
if (unformat (input, "hex %U", unformat_hex_string, &match))
;
+ else if (unformat (input, "l2 none"))
+ /* Don't add the l2 header in the mask */
+ add_l2 = 0;
else if (unformat (input, "l2 %U", unformat_l2_match, &l2))
;
else if (unformat (input, "l3 %U", unformat_l3_match, &l3))
else if (unformat (input, "l2 %U", unformat_l2_match, &l2))
;
else if (unformat (input, "l3 %U", unformat_l3_match, &l3))
@@
-2699,6
+2723,15
@@
unformat_classify_match (unformat_input_t * input, va_list * args)
break;
}
break;
}
+ if (l2 && !add_l2)
+ {
+ vec_free (match);
+ vec_free (l2);
+ vec_free (l3);
+ vec_free (l4);
+ return 0;
+ }
+
if (l4 && !l3)
{
vec_free (match);
if (l4 && !l3)
{
vec_free (match);
@@
-2711,15
+2744,20
@@
unformat_classify_match (unformat_input_t * input, va_list * args)
{
if (l2 || l3 || l4)
{
{
if (l2 || l3 || l4)
{
- /* "Win a free Ethernet header in every packet" */
- if (l2 == 0)
- vec_validate_aligned (l2, 13, sizeof (u32x4));
- match = l2;
- if (l3)
+ if (add_l2)
{
{
- vec_append_aligned (match, l3, sizeof (u32x4));
- vec_free (l3);
+ /* "Win a free Ethernet header in every packet" */
+ if (l2 == 0)
+ vec_validate_aligned (l2, 13, sizeof (u32x4));
+ match = l2;
+ if (l3)
+ {
+ vec_append_aligned (match, l3, sizeof (u32x4));
+ vec_free (l3);
+ }
}
}
+ else
+ match = l3;
if (l4)
{
vec_append_aligned (match, l4, sizeof (u32x4));
if (l4)
{
vec_append_aligned (match, l4, sizeof (u32x4));
@@
-2734,8
+2772,8
@@
unformat_classify_match (unformat_input_t * input, va_list * args)
sizeof (u32x4));
/* Set size, include skipped vectors */
sizeof (u32x4));
/* Set size, include skipped vectors */
- _vec_len (match) =
-
(t->match_n_vectors + t->skip_n_vectors) * sizeof (u32x4
);
+ vec_set_len (match,
+
(t->match_n_vectors + t->skip_n_vectors) * sizeof (u32x4)
);
*matchp = match;
*matchp = match;
@@
-2747,9
+2785,9
@@
unformat_classify_match (unformat_input_t * input, va_list * args)
int
vnet_classify_add_del_session (vnet_classify_main_t *cm, u32 table_index,
int
vnet_classify_add_del_session (vnet_classify_main_t *cm, u32 table_index,
- const u8 *match, u
32
hit_next_index,
+ const u8 *match, u
16
hit_next_index,
u32 opaque_index, i32 advance, u8 action,
u32 opaque_index, i32 advance, u8 action,
- u
16
metadata, int is_add)
+ u
32
metadata, int is_add)
{
vnet_classify_table_t *t;
vnet_classify_entry_5_t _max_e __attribute__ ((aligned (16)));
{
vnet_classify_table_t *t;
vnet_classify_entry_5_t _max_e __attribute__ ((aligned (16)));
@@
-3199,7
+3237,7
@@
test_classify_churn (test_classify_main_t * tm)
for (i = 0; i < tm->sessions; i++)
{
u8 *key_minus_skip;
for (i = 0; i < tm->sessions; i++)
{
u8 *key_minus_skip;
- u
64
hash;
+ u
32
hash;
vnet_classify_entry_t *e;
ep = tm->entries + i;
vnet_classify_entry_t *e;
ep = tm->entries + i;