FD.io VPP  v16.09
Vector Packet Processing
parse_builtin.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include <vlib/parse.h>
16 
17 always_inline void *
19 {
22  vec_elt (pm->match_items,
23  vec_len (pm->match_items) - 1));
24  return i->value.as_pointer;
25 }
26 
29  vlib_lex_token_t * t, vlib_parse_value_t * valuep)
30 {
31  return t->token ==
32  VLIB_LEX_eof ? VLIB_PARSE_MATCH_DONE : VLIB_PARSE_MATCH_FAIL;
33 }
34 
35 PARSE_TYPE_INIT (eof, eof_match, 0 /* cleanup value */ ,
36  0 /* format value */ );
37 
40  vlib_lex_token_t * t, vlib_parse_value_t * valuep)
41 {
43  pm->current_token_index--;
44  return fp ? fp (pm, type, t, valuep) : VLIB_PARSE_MATCH_RULE;
45 }
46 
47 PARSE_TYPE_INIT (rule_eof, rule_eof_match, 0, 0);
48 
51  vlib_lex_token_t * t, vlib_parse_value_t * valuep)
52 {
53  u8 *tv, *iv;
54  int i;
55 
56  if (t->token != VLIB_LEX_word)
57  return VLIB_PARSE_MATCH_FAIL;
58 
59  tv = t->value.as_pointer;
60  iv = parse_last_match_value (pm);
61 
62  for (i = 0; tv[i]; i++)
63  {
64  if (tv[i] != iv[i])
65  return VLIB_PARSE_MATCH_FAIL;
66  }
67 
68  return iv[i] == 0 ? VLIB_PARSE_MATCH_FULL : VLIB_PARSE_MATCH_PARTIAL;
69 }
70 
71 PARSE_TYPE_INIT (word, word_match, 0 /* clnup value */ ,
72  0 /* format value */ );
73 
76  vlib_lex_token_t * t, vlib_parse_value_t * valuep)
77 {
78  if (t->token == VLIB_LEX_number)
79  {
80  valuep->value.as_uword = t->value.as_uword;
81  return VLIB_PARSE_MATCH_VALUE;
82  }
83  return VLIB_PARSE_MATCH_FAIL;
84 }
85 
86 static u8 *
87 format_value_number (u8 * s, va_list * args)
88 {
89  vlib_parse_value_t *v = va_arg (*args, vlib_parse_value_t *);
90  uword a = v->value.as_uword;
91 
92  if (BITS (uword) == 64)
93  s = format (s, "%lld(0x%llx)", a, a);
94  else
95  s = format (s, "%ld(0x%lx)", a, a);
96  return s;
97 }
98 
99 PARSE_TYPE_INIT (number, number_match, 0 /* cln value */ ,
100  format_value_number /* fmt value */ );
101 
102 
103 #define foreach_vanilla_lex_match_function \
104  _(plus) \
105  _(minus) \
106  _(star) \
107  _(slash) \
108  _(lpar) \
109  _(rpar)
110 
111 #define LEX_MATCH_DEBUG 0
112 
113 #define _(name) \
114 vlib_parse_match_t name##_match (vlib_parse_main_t *pm, \
115  vlib_parse_type_t *type, \
116  vlib_lex_token_t *t, \
117  vlib_parse_value_t *valuep) \
118 { \
119  if (LEX_MATCH_DEBUG > 0) \
120  clib_warning ("against %U returns %s", \
121  format_vlib_lex_token, pm->lex_main, t, \
122  (t->token == VLIB_LEX_##name) \
123  ? "VLIB_PARSE_MATCH_FULL" : \
124  "VLIB_PARSE_MATCH_FAIL"); \
125  if (t->token == VLIB_LEX_##name) \
126  return VLIB_PARSE_MATCH_FULL; \
127  return VLIB_PARSE_MATCH_FAIL; \
128 } \
129  \
130 PARSE_TYPE_INIT (name, name##_match, 0 /* cln value */, \
131  0 /* fmt val */);
132 
134 #undef _
135 /* So we're linked in. */
136 static clib_error_t *
138 {
139  return 0;
140 }
141 
143 
144 /*
145  * fd.io coding-style-patch-verification: ON
146  *
147  * Local Variables:
148  * eval: (c-set-style "gnu")
149  * End:
150  */
void * as_pointer
Definition: parse.h:54
sll srl srl sll sra u16x4 i
Definition: vector_sse2.h:343
a
Definition: bitmap.h:516
bad routing header type(not 4)") sr_error (NO_MORE_SEGMENTS
vlib_parse_match_t eof_match(vlib_parse_main_t *pm, vlib_parse_type_t *type, vlib_lex_token_t *t, vlib_parse_value_t *valuep)
Definition: parse_builtin.c:28
PARSE_TYPE_INIT(eof, eof_match, 0, 0)
u32 current_token_index
Definition: parse.h:168
#define VLIB_INIT_FUNCTION(x)
Definition: init.h:111
#define always_inline
Definition: clib.h:84
vlib_parse_item_t * parse_items
Definition: parse.h:135
static void * parse_last_match_value(vlib_parse_main_t *pm)
Definition: parse_builtin.c:18
#define foreach_vanilla_lex_match_function
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:369
static foreach_vanilla_lex_match_function clib_error_t * parse_builtin_init(vlib_main_t *vm)
vlib_parse_match_t( vlib_parse_match_function_t)(struct vlib_parse_main *, struct vlib_parse_type *, vlib_lex_token_t *, vlib_parse_value_t *)
Definition: parse.h:97
union vlib_parse_item_t::@30 value
u32 * match_items
Definition: parse.h:158
union vlib_lex_token_t::@26 value
void * as_pointer
Definition: lex.h:78
u8 * format(u8 *s, char *fmt,...)
Definition: format.c:418
vlib_parse_match_t word_match(vlib_parse_main_t *pm, vlib_parse_type_t *type, vlib_lex_token_t *t, vlib_parse_value_t *valuep)
Definition: parse_builtin.c:50
u64 uword
Definition: types.h:112
#define vec_elt(v, i)
Get vector value at index i.
i64 word
Definition: types.h:111
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
unsigned char u8
Definition: types.h:56
static u8 * format_value_number(u8 *s, va_list *args)
Definition: parse_builtin.c:87
uword as_uword
Definition: lex.h:77
#define BITS(x)
Definition: clib.h:58
u32 token
Definition: lex.h:73
vlib_parse_match_t
Definition: parse.h:85
vlib_parse_match_t number_match(vlib_parse_main_t *pm, vlib_parse_type_t *type, vlib_lex_token_t *t, vlib_parse_value_t *valuep)
Definition: parse_builtin.c:75
vlib_parse_match_t rule_eof_match(vlib_parse_main_t *pm, vlib_parse_type_t *type, vlib_lex_token_t *t, vlib_parse_value_t *valuep)
Definition: parse_builtin.c:39