aboutsummaryrefslogtreecommitdiffstats
path: root/src/vlib/cli.h
blob: e713808f18e26201651a4eb2c5d99053c0a5f136 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
/*
 * 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.
 */
/*
 * cli.h: command line interface
 *
 * Copyright (c) 2008 Eliot Dresselhaus
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

#ifndef included_vlib_cli_h
#define included_vlib_cli_h

#include <vppinfra/format.h>

struct vlib_cli_command_t;

typedef struct
{
  u32 min_char;

  /* Indexed by name[position] - min_char. */
  uword **bitmaps;
} vlib_cli_parse_position_t;

typedef struct
{
  u8 *name;

  u32 index;
} vlib_cli_sub_command_t;

typedef struct
{
  u8 *name;

  u32 rule_index;

  u32 command_index;
} vlib_cli_sub_rule_t;

typedef struct
{
  char *name;
  char *short_help;
  char *long_help;

  /* Number of bytes in parsed data.  Zero for vector. */
  uword data_size;

  unformat_function_t *unformat_function;

  /* Opaque for unformat function. */
  uword unformat_function_arg[2];
} vlib_cli_parse_rule_t;

/* CLI command callback function. */
typedef clib_error_t *(vlib_cli_command_function_t)
  (struct vlib_main_t * vm,
   unformat_input_t * input, struct vlib_cli_command_t * cmd);

typedef struct vlib_cli_command_t
{
  /* Command path (e.g. "show something").
     Spaces delimit elements of path. */
  char *path;

  /* Short/long help strings. */
  char *short_help;
  char *long_help;

  /* Callback function. */
  vlib_cli_command_function_t *function;

  /* Opaque. */
  uword function_arg;

  /* Known MP-safe? */
  uword is_mp_safe;

  /* Sub commands for this command. */
  vlib_cli_sub_command_t *sub_commands;

  /* Hash table mapping name (e.g. last path element) to sub command index. */
  uword *sub_command_index_by_name;

  /* bitmap[p][c][i] says whether sub-command i has character
     c in position p. */
  vlib_cli_parse_position_t *sub_command_positions;

  /* Hash table mapping name (e.g. last path element) to sub rule index. */
  uword *sub_rule_index_by_name;

  /* Vector of possible parse rules for this path. */
  vlib_cli_sub_rule_t *sub_rules;

  /* List of CLI commands, built by constructors */
  struct vlib_cli_command_t *next_cli_command;

} vlib_cli_command_t;

typedef void (vlib_cli_output_function_t) (uword arg,
					   u8 * buffer, uword buffer_bytes);
typedef struct
{
  /* Vector of all known commands. */
  vlib_cli_command_t *commands;

  /* Hash table mapping normalized path to index into all_commands. */
  uword *command_index_by_path;

  /* Vector of all known parse rules. */
  vlib_cli_parse_rule_t *parse_rules;

  /* Hash table mapping parse rule name to index into parse_rule vector. */
  uword *parse_rule_index_by_name;

  /* Data parsed for rules. */
  void **parse_rule_data;

  /* registration list added by constructors */
  vlib_cli_command_t *cli_command_registrations;
} vlib_cli_main_t;

#define VLIB_CLI_COMMAND(x,...)                                         \
    __VA_ARGS__ vlib_cli_command_t x;                                   \
static void __vlib_cli_command_registration_##x (void)                  \
    __attribute__((__constructor__)) ;                                  \
static void __vlib_cli_command_registration_##x (void)                  \
{                                                                       \
    vlib_main_t * vm = vlib_get_main();                                 \
    vlib_cli_main_t *cm = &vm->cli_main;                                \
    x.next_cli_command = cm->cli_command_registrations;                 \
    cm->cli_command_registrations = &x;                                 \
}                                                                       \
__VA_ARGS__ vlib_cli_command_t x
#define VLIB_CLI_PARSE_RULE(x) \
  vlib_cli_parse_rule_t x
/* Output to current CLI connection. */
void vlib_cli_output (struct vlib_main_t *vm, char *fmt, ...);

/* Process CLI input. */
void vlib_cli_input (struct vlib_main_t *vm,
		     unformat_input_t * input,
		     vlib_cli_output_function_t * function,
		     uword function_arg);

clib_error_t *vlib_cli_register (struct vlib_main_t *vm,
				 vlib_cli_command_t * c);
clib_error_t *vlib_cli_register_parse_rule (struct vlib_main_t *vm,
					    vlib_cli_parse_rule_t * c);

uword unformat_vlib_cli_sub_input (unformat_input_t * i, va_list * args);

/* Return an vector of strings consisting of possible auto-completions
 * for a given input string */
u8 **vlib_cli_get_possible_completions (u8 * input_str);

#endif /* included_vlib_cli_h */

/*
 * fd.io coding-style-patch-verification: ON
 *
 * Local Variables:
 * eval: (c-set-style "gnu")
 * End:
 */
*/ #define RTE_EVENT_ETH_RX_ADAPTER_QUEUE_FLOW_ID_VALID 0x1 /**< This flag indicates the flow identifier is valid * @see rte_event_eth_rx_adapter_queue_conf::rx_queue_flags */ /** * @warning * @b EXPERIMENTAL: this API may change without prior notice * * Adapter configuration structure that the adapter configuration callback * function is expected to fill out * @see rte_event_eth_rx_adapter_conf_cb */ struct rte_event_eth_rx_adapter_conf { uint8_t event_port_id; /**< Event port identifier, the adapter enqueues mbuf events to this * port. */ uint32_t max_nb_rx; /**< The adapter can return early if it has processed at least * max_nb_rx mbufs. This isn't treated as a requirement; batching may * cause the adapter to process more than max_nb_rx mbufs. */ }; /** * @warning * @b EXPERIMENTAL: this API may change without prior notice * * Function type used for adapter configuration callback. The callback is * used to fill in members of the struct rte_event_eth_rx_adapter_conf, this * callback is invoked when creating a SW service for packet transfer from * ethdev queues to the event device. The SW service is created within the * rte_event_eth_rx_adapter_queue_add() function if SW based packet transfers * from ethdev queues to the event device are required. * * @param id * Adapter identifier. * * @param dev_id * Event device identifier. * * @param [out] conf * Structure that needs to be populated by this callback. * * @param arg * Argument to the callback. This is the same as the conf_arg passed to the * rte_event_eth_rx_adapter_create_ext(). */ typedef int (*rte_event_eth_rx_adapter_conf_cb) (uint8_t id, uint8_t dev_id, struct rte_event_eth_rx_adapter_conf *conf, void *arg); /** * @warning * @b EXPERIMENTAL: this API may change without prior notice * * Rx queue configuration structure */ struct rte_event_eth_rx_adapter_queue_conf { uint32_t rx_queue_flags; /**< Flags for handling received packets * @see RTE_EVENT_ETH_RX_ADAPTER_QUEUE_FLOW_ID_VALID */ uint16_t servicing_weight; /**< Relative polling frequency of ethernet receive queue when the * adapter uses a service core function for ethernet to event device * transfers. If it is set to zero, the Rx queue is interrupt driven * (unless rx queue interrupts are not enabled for the ethernet * device). */ struct rte_event ev; /**< * The values from the following event fields will be used when * queuing mbuf events: * - event_queue_id: Targeted event queue ID for received packets. * - event_priority: Event priority of packets from this Rx queue in * the event queue relative to other events. * - sched_type: Scheduling type for packets from this Rx queue. * - flow_id: If the RTE_ETH_RX_EVENT_ADAPTER_QUEUE_FLOW_ID_VALID bit * is set in rx_queue_flags, this flow_id is used for all * packets received from this queue. Otherwise the flow ID * is set to the RSS hash of the src and dst IPv4/6 * addresses. * * The event adapter sets ev.event_type to RTE_EVENT_TYPE_ETHDEV in the * enqueued event. */ }; /** * @warning * @b EXPERIMENTAL: this API may change without prior notice * * A structure used to retrieve statistics for an eth rx adapter instance. */ struct rte_event_eth_rx_adapter_stats { uint64_t rx_poll_count; /**< Receive queue poll count */ uint64_t rx_packets; /**< Received packet count */ uint64_t rx_enq_count; /**< Eventdev enqueue count */ uint64_t rx_enq_retry; /**< Eventdev enqueue retry count */ uint64_t rx_enq_start_ts; /**< Rx enqueue start timestamp */ uint64_t rx_enq_block_cycles; /**< Cycles for which the service is blocked by the event device, * i.e, the service fails to enqueue to the event device. */ uint64_t rx_enq_end_ts; /**< Latest timestamp at which the service is unblocked * by the event device. The start, end timestamps and * block cycles can be used to compute the percentage of * cycles the service is blocked by the event device. */ }; /** * @warning * @b EXPERIMENTAL: this API may change without prior notice * * Create a new ethernet Rx event adapter with the specified identifier. * * @param id * The identifier of the ethernet Rx event adapter. * * @param dev_id * The identifier of the device to configure. * * @param conf_cb * Callback function that fills in members of a * struct rte_event_eth_rx_adapter_conf struct passed into * it. * * @param conf_arg * Argument that is passed to the conf_cb function. * * @return * - 0: Success * - <0: Error code on failure */ int rte_event_eth_rx_adapter_create_ext(uint8_t id, uint8_t dev_id, rte_event_eth_rx_adapter_conf_cb conf_cb, void *conf_arg); /** * @warning * @b EXPERIMENTAL: this API may change without prior notice * * Create a new ethernet Rx event adapter with the specified identifier. * This function uses an internal configuration function that creates an event * port. This default function reconfigures the event device with an * additional event port and setups up the event port using the port_config * parameter passed into this function. In case the application needs more * control in configuration of the service, it should use the * rte_event_eth_rx_adapter_create_ext() version. * * @param id * The identifier of the ethernet Rx event adapter. * * @param dev_id * The identifier of the device to configure. * * @param port_config * Argument of type *rte_event_port_conf* that is passed to the conf_cb * function. * * @return * - 0: Success * - <0: Error code on failure */ int rte_event_eth_rx_adapter_create(uint8_t id, uint8_t dev_id, struct rte_event_port_conf *port_config); /** * @warning * @b EXPERIMENTAL: this API may change without prior notice * * Free an event adapter * * @param id * Adapter identifier. * * @return * - 0: Success * - <0: Error code on failure, If the adapter still has Rx queues * added to it, the function returns -EBUSY. */ int rte_event_eth_rx_adapter_free(uint8_t id); /** * @warning * @b EXPERIMENTAL: this API may change without prior notice * * Add receive queue to an event adapter. After a queue has been * added to the event adapter, the result of the application calling * rte_eth_rx_burst(eth_dev_id, rx_queue_id, ..) is undefined. * * @param id * Adapter identifier. * * @param eth_dev_id * Port identifier of Ethernet device. * * @param rx_queue_id * Ethernet device receive queue index. * If rx_queue_id is -1, then all Rx queues configured for * the device are added. If the ethdev Rx queues can only be * connected to a single event queue then rx_queue_id is * required to be -1. * @see RTE_EVENT_ETH_RX_ADAPTER_CAP_MULTI_EVENTQ * * @param conf * Additional configuration structure of type *rte_event_eth_rx_adapter_conf* * * @return * - 0: Success, Receive queue added correctly. * - <0: Error code on failure. */ int rte_event_eth_rx_adapter_queue_add(uint8_t id, uint8_t eth_dev_id, int32_t rx_queue_id, const struct rte_event_eth_rx_adapter_queue_conf *conf); /** * @warning * @b EXPERIMENTAL: this API may change without prior notice * * Delete receive queue from an event adapter. * * @param id * Adapter identifier. * * @param eth_dev_id * Port identifier of Ethernet device. * * @param rx_queue_id * Ethernet device receive queue index. * If rx_queue_id is -1, then all Rx queues configured for * the device are deleted. If the ethdev Rx queues can only be * connected to a single event queue then rx_queue_id is * required to be -1. * @see RTE_EVENT_ETH_RX_ADAPTER_CAP_MULTI_EVENTQ * * @return * - 0: Success, Receive queue deleted correctly. * - <0: Error code on failure. */ int rte_event_eth_rx_adapter_queue_del(uint8_t id, uint8_t eth_dev_id, int32_t rx_queue_id); /** * @warning * @b EXPERIMENTAL: this API may change without prior notice * * Start ethernet Rx event adapter * * @param id * Adapter identifier. * * @return * - 0: Success, Adapter started correctly. * - <0: Error code on failure. */ int rte_event_eth_rx_adapter_start(uint8_t id); /** * @warning * @b EXPERIMENTAL: this API may change without prior notice * * Stop ethernet Rx event adapter * * @param id * Adapter identifier. * * @return * - 0: Success, Adapter started correctly. * - <0: Error code on failure. */ int rte_event_eth_rx_adapter_stop(uint8_t id); /** * @warning * @b EXPERIMENTAL: this API may change without prior notice * * Retrieve statistics for an adapter * * @param id * Adapter identifier. * * @param [out] stats * A pointer to structure used to retrieve statistics for an adapter. * * @return * - 0: Success, retrieved successfully. * - <0: Error code on failure. */ int rte_event_eth_rx_adapter_stats_get(uint8_t id, struct rte_event_eth_rx_adapter_stats *stats); /** * @warning * @b EXPERIMENTAL: this API may change without prior notice * * Reset statistics for an adapter. * * @param id * Adapter identifier. * * @return * - 0: Success, statistics reset successfully. * - <0: Error code on failure. */ int rte_event_eth_rx_adapter_stats_reset(uint8_t id); /** * @warning * @b EXPERIMENTAL: this API may change without prior notice * * Retrieve the service ID of an adapter. If the adapter doesn't use * a rte_service function, this function returns -ESRCH. * * @param id * Adapter identifier. * * @param [out] service_id * A pointer to a uint32_t, to be filled in with the service id. * * @return * - 0: Success * - <0: Error code on failure, if the adapter doesn't use a rte_service * function, this function returns -ESRCH. */ int rte_event_eth_rx_adapter_service_id_get(uint8_t id, uint32_t *service_id); #ifdef __cplusplus } #endif #endif /* _RTE_EVENT_ETH_RX_ADAPTER_ */