Change-Id: Ib246f1fbfce93274020ee93ce461e3d8bd8b9f17 Signed-off-by: Ed Warnicke <eaw@cisco.com>
172 lines
4.2 KiB
C
172 lines
4.2 KiB
C
/*
|
|
* Copyright (c) 2015 Cisco and/or its affiliates.
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
#ifndef included_vlib_parse_h
|
|
#define included_vlib_parse_h
|
|
|
|
#include <vlib/vlib.h>
|
|
#include <vlib/lex.h>
|
|
#include <vppinfra/mhash.h>
|
|
|
|
typedef struct {
|
|
/* Word aligned value. */
|
|
union {
|
|
u8 as_u8[32 - 1 * sizeof (u16)];
|
|
void * as_pointer;
|
|
uword as_uword;
|
|
word as_word;
|
|
u64 as_u64;
|
|
} value;
|
|
|
|
/* 16 bit type at end so that 30 bytes of value are aligned. */
|
|
u16 type;
|
|
} __attribute ((packed)) vlib_parse_value_t;
|
|
|
|
/* Instance of a type. */
|
|
typedef struct {
|
|
u32 type;
|
|
|
|
u32 origin;
|
|
|
|
u32 help_index;
|
|
|
|
union {
|
|
void * as_pointer;
|
|
uword as_uword;
|
|
} value;
|
|
} vlib_parse_item_t;
|
|
|
|
typedef struct {
|
|
/* Index of item for this node. */
|
|
u32 item;
|
|
|
|
/* Graph index of peer (sibling) node (linked list of peers). */
|
|
u32 peer;
|
|
|
|
/* Graph index of deeper (child) node (linked list of children). */
|
|
u32 deeper;
|
|
} vlib_parse_graph_t;
|
|
|
|
#define foreach_parse_match_type \
|
|
_(MATCH_DONE) \
|
|
_(MATCH_RULE) \
|
|
_(MATCH_FAIL) \
|
|
_(MATCH_FULL) \
|
|
_(MATCH_VALUE) \
|
|
_(MATCH_PARTIAL) \
|
|
_(MATCH_AMBIGUOUS) \
|
|
_(MATCH_EVAL_FAIL)
|
|
|
|
typedef enum {
|
|
#define _(a) VLIB_PARSE_##a,
|
|
foreach_parse_match_type
|
|
#undef _
|
|
} vlib_parse_match_t;
|
|
|
|
struct vlib_parse_type;
|
|
struct vlib_parse_main;
|
|
|
|
typedef 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 *);
|
|
typedef void (vlib_parse_value_cleanup_function_t) (vlib_parse_value_t *);
|
|
|
|
typedef struct vlib_parse_type {
|
|
/* Type name. */
|
|
char * name;
|
|
|
|
vlib_parse_match_function_t * match_function;
|
|
|
|
vlib_parse_value_cleanup_function_t * value_cleanup_function;
|
|
|
|
format_function_t * format_value;
|
|
|
|
u32 rule_index;
|
|
} vlib_parse_type_t;
|
|
|
|
typedef struct {
|
|
char *initializer;
|
|
void * eof_match;
|
|
int rule_length;
|
|
} parse_registration_t;
|
|
|
|
typedef struct vlib_parse_main {
|
|
/* (type, origin, help, value) tuples */
|
|
vlib_parse_item_t *parse_items;
|
|
mhash_t parse_item_hash;
|
|
|
|
/* (item, peer, deeper) tuples */
|
|
vlib_parse_graph_t *parse_graph;
|
|
u32 root_index;
|
|
|
|
u8 *register_input;
|
|
|
|
/* parser types */
|
|
vlib_parse_type_t * parse_types;
|
|
uword *parse_type_by_name_hash;
|
|
|
|
/* Vector of MATCH_VALUEs */
|
|
vlib_parse_value_t * parse_value;
|
|
u32 * match_items;
|
|
|
|
/* Parse registrations */
|
|
parse_registration_t **parse_registrations;
|
|
|
|
/* Token vector */
|
|
vlib_lex_token_t *tokens;
|
|
u32 current_token_index;
|
|
|
|
vlib_lex_main_t *lex_main;
|
|
vlib_main_t *vlib_main;
|
|
} vlib_parse_main_t;
|
|
|
|
vlib_parse_main_t vlib_parse_main;
|
|
|
|
typedef vlib_parse_match_t (vlib_parse_eval_function_t)
|
|
(vlib_parse_main_t *,
|
|
vlib_parse_item_t *,
|
|
vlib_parse_value_t *);
|
|
|
|
vlib_parse_match_t vlib_parse_eval (u8 * input);
|
|
|
|
format_function_t format_vlib_parse_value;
|
|
|
|
/* FIXME need these to be global? */
|
|
vlib_parse_match_function_t rule_match, eof_match, word_match, number_match;
|
|
|
|
#define _PARSE_REGISTRATION_DATA(x) \
|
|
VLIB_ELF_SECTION_DATA(x##_registration,parse_registration_t,parse_registrations)
|
|
|
|
#define PARSE_INIT(x, s, e) \
|
|
static _PARSE_REGISTRATION_DATA(x) = { \
|
|
.initializer = s, \
|
|
.eof_match = e, \
|
|
};
|
|
|
|
#define _PARSE_TYPE_REGISTRATION_DATA(x) \
|
|
VLIB_ELF_SECTION_DATA(x##_type_registration,vlib_parse_type_t, \
|
|
parse_type_registrations)
|
|
|
|
#define PARSE_TYPE_INIT(n, m, c, f) \
|
|
static _PARSE_TYPE_REGISTRATION_DATA(n) = { \
|
|
.name = #n, \
|
|
.match_function = m, \
|
|
.value_cleanup_function = c, \
|
|
.format_value = f, \
|
|
};
|
|
|
|
#endif /* included_vlib_parse_h */
|