diff options
author | Dave Barach <dave@barachs.net> | 2016-07-08 08:13:45 -0400 |
---|---|---|
committer | Damjan Marion <dmarion.lists@gmail.com> | 2016-07-08 14:18:22 +0000 |
commit | 9b8ffd99fb35d37250cfb7094a0a31515f1bb577 (patch) | |
tree | 604ebcf86671a86b9e3395dda8d9fda50db2fcbc /vlib | |
parent | 0557a91ca727cee963a8179808d2d2108564ec56 (diff) |
fd-io-styleify pass
Change-Id: If2d57a213fc2fec996db26df332910c3d2105f97
Signed-off-by: Dave Barach <dave@barachs.net>
Diffstat (limited to 'vlib')
64 files changed, 9475 insertions, 7913 deletions
diff --git a/vlib/example/main_stub.c b/vlib/example/main_stub.c index 4213d912acd..4d74bd77aaa 100644 --- a/vlib/example/main_stub.c +++ b/vlib/example/main_stub.c @@ -16,7 +16,8 @@ #include <vlib/unix/unix.h> #include <math.h> -int main (int argc, char * argv[]) +int +main (int argc, char *argv[]) { return vlib_unix_main (argc, argv); } @@ -24,30 +25,33 @@ int main (int argc, char * argv[]) static clib_error_t * main_stub_init (vlib_main_t * vm) { - clib_error_t * error; + clib_error_t *error; - if ((error = unix_physmem_init (vm, /* fail_if_physical_memory_not_present */ 0))) + if ((error = + unix_physmem_init (vm, /* fail_if_physical_memory_not_present */ 0))) return error; - if ((error = vlib_call_init_function (vm, unix_cli_init))) - return error; + if ((error = vlib_call_init_function (vm, unix_cli_init))) + return error; - return error; + return error; } VLIB_INIT_FUNCTION (main_stub_init); #if 0 /* Node test code. */ -typedef struct { +typedef struct +{ int scalar; int vector[0]; } my_frame_t; -static u8 * format_my_node_frame (u8 * s, va_list * va) +static u8 * +format_my_node_frame (u8 * s, va_list * va) { - vlib_frame_t * f = va_arg (*va, vlib_frame_t *); - my_frame_t * g = vlib_frame_args (f); + vlib_frame_t *f = va_arg (*va, vlib_frame_t *); + my_frame_t *g = vlib_frame_args (f); int i; s = format (s, "scalar %d, vector { ", g->scalar); @@ -59,12 +63,10 @@ static u8 * format_my_node_frame (u8 * s, va_list * va) } static uword -my_func (vlib_main_t * vm, - vlib_node_runtime_t * rt, - vlib_frame_t * f) +my_func (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f) { - vlib_node_t * node; - my_frame_t * y; + vlib_node_t *node; + my_frame_t *y; u32 i, n_left = 0; static int serial; int verbose; @@ -79,7 +81,7 @@ my_func (vlib_main_t * vm, if (rt->n_next_nodes > 0) { - vlib_frame_t * next = vlib_get_next_frame (vm, rt, /* next index */ 0); + vlib_frame_t *next = vlib_get_next_frame (vm, rt, /* next index */ 0); n_left = VLIB_FRAME_SIZE - next->n_vectors; y = vlib_frame_args (next); y->scalar = serial++; @@ -105,6 +107,7 @@ my_func (vlib_main_t * vm, return i; } +/* *INDENT-OFF* */ VLIB_REGISTER_NODE (my_node1,static) = { .function = my_func, .type = VLIB_NODE_TYPE_INPUT, @@ -116,40 +119,44 @@ VLIB_REGISTER_NODE (my_node1,static) = { [0] = "my-node2", }, }; +/* *INDENT-ON* */ +/* *INDENT-OFF* */ VLIB_REGISTER_NODE (my_node2,static) = { .function = my_func, .name = "my-node2", .scalar_size = sizeof (my_frame_t), .vector_size = STRUCT_SIZE_OF (my_frame_t, vector[0]), }; +/* *INDENT-ON* */ #endif #if 0 -typedef enum { +typedef enum +{ MY_EVENT_TYPE1, MY_EVENT_TYPE2, } my_process_completion_type_t; -typedef struct { +typedef struct +{ int a; f64 b; } my_process_event_data_t; -static u8 * format_my_process_event_data (u8 * s, va_list * va) +static u8 * +format_my_process_event_data (u8 * s, va_list * va) { - my_process_event_data_t * d = va_arg (*va, my_process_event_data_t *); + my_process_event_data_t *d = va_arg (*va, my_process_event_data_t *); return format (s, "{ a %d b %.6f}", d->a, d->b); } static uword -my_proc (vlib_main_t * vm, - vlib_node_runtime_t * rt, - vlib_frame_t * f) +my_proc (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f) { - vlib_node_t * node; + vlib_node_t *node; u32 i; node = vlib_get_node (vm, rt->node_index); @@ -159,14 +166,14 @@ my_proc (vlib_main_t * vm, for (i = 0; i < 5; i++) { vlib_cli_output (vm, "%v: %d", node->name, i); - vlib_process_suspend (vm, 1e0 /* secs */); + vlib_process_suspend (vm, 1e0 /* secs */ ); } vlib_cli_output (vm, "%v: return frame %p", node->name, f); if (0) { - uword n_events_seen, type, * data = 0; + uword n_events_seen, type, *data = 0; for (n_events_seen = 0; n_events_seen < 2;) { @@ -174,8 +181,8 @@ my_proc (vlib_main_t * vm, type = vlib_process_get_events (vm, &data); n_events_seen += vec_len (data); vlib_cli_output (vm, "%U %v: completion #%d type %d data 0x%wx", - format_time_interval, "h:m:s:u", vlib_time_now (vm), - node->name, i, type, data[0]); + format_time_interval, "h:m:s:u", + vlib_time_now (vm), node->name, i, type, data[0]); _vec_len (data) = 0; } @@ -184,15 +191,17 @@ my_proc (vlib_main_t * vm, else { uword n_events_seen, i, type; - my_process_event_data_t * data; + my_process_event_data_t *data; for (n_events_seen = 0; n_events_seen < 2;) { vlib_process_wait_for_event (vm); data = vlib_process_get_event_data (vm, &type); - vec_foreach_index (i, data) { + vec_foreach_index (i, data) + { vlib_cli_output (vm, "%U event type %d data %U", - format_time_interval, "h:m:s:u", vlib_time_now (vm), - type, format_my_process_event_data, data); + format_time_interval, "h:m:s:u", + vlib_time_now (vm), type, + format_my_process_event_data, data); } n_events_seen += vec_len (data); vlib_process_put_event_data (vm, data); @@ -202,16 +211,16 @@ my_proc (vlib_main_t * vm, return i; } +/* *INDENT-OFF* */ VLIB_REGISTER_NODE (my_proc_node,static) = { .function = my_proc, .type = VLIB_NODE_TYPE_PROCESS, .name = "my-proc", }; +/* *INDENT-ON* */ static uword -my_proc_input (vlib_main_t * vm, - vlib_node_runtime_t * rt, - vlib_frame_t * f) +my_proc_input (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f) { static int i; @@ -223,13 +232,15 @@ my_proc_input (vlib_main_t * vm, 0x12340000 + i); else { - my_process_event_data_t * d; + my_process_event_data_t *d; f64 dt = 5; d = vlib_process_signal_event_at_time (vm, i * dt, my_proc_node.index, - i == 1 ? MY_EVENT_TYPE1 : MY_EVENT_TYPE2, - 1 /* elts */, + i == + 1 ? MY_EVENT_TYPE1 : + MY_EVENT_TYPE2, + 1 /* elts */ , sizeof (d[0])); d->a = i; d->b = vlib_time_now (vm); @@ -238,23 +249,26 @@ my_proc_input (vlib_main_t * vm, else vlib_node_set_state (vm, rt->node_index, VLIB_NODE_STATE_DISABLED); - return 0; + return 0; } +/* *INDENT-OFF* */ VLIB_REGISTER_NODE (my_proc_input_node,static) = { .function = my_proc_input, .type = VLIB_NODE_TYPE_INPUT, .name = "my-proc-input", }; +/* *INDENT-ON* */ -static uword _unformat_farith (unformat_input_t * i, va_list * args) +static uword +_unformat_farith (unformat_input_t * i, va_list * args) { u32 prec = va_arg (*args, u32); - f64 * result = va_arg (*args, f64 *); + f64 *result = va_arg (*args, f64 *); f64 tmp[2]; /* Binary operations in from lowest to highest precedence. */ - char * binops[] = { + char *binops[] = { "+%U", "-%U", "/%U", "*%U", "^%U", }; @@ -264,17 +278,27 @@ static uword _unformat_farith (unformat_input_t * i, va_list * args) int p; for (p = prec; p < ARRAY_LEN (binops); p++) { - if (unformat (i, binops[p], - _unformat_farith, prec + 0, &tmp[1])) + if (unformat (i, binops[p], _unformat_farith, prec + 0, &tmp[1])) { switch (binops[p][0]) { - case '+': result[0] = tmp[0] + tmp[1]; break; - case '-': result[0] = tmp[0] - tmp[1]; break; - case '/': result[0] = tmp[0] / tmp[1]; break; - case '*': result[0] = tmp[0] * tmp[1]; break; - case '^': result[0] = pow (tmp[0], tmp[1]); break; - default: abort (); + case '+': + result[0] = tmp[0] + tmp[1]; + break; + case '-': + result[0] = tmp[0] - tmp[1]; + break; + case '/': + result[0] = tmp[0] / tmp[1]; + break; + case '*': + result[0] = tmp[0] * tmp[1]; + break; + case '^': + result[0] = pow (tmp[0], tmp[1]); + break; + default: + abort (); } return 1; } @@ -283,15 +307,13 @@ static uword _unformat_farith (unformat_input_t * i, va_list * args) return 1; } - else if (unformat (i, "-%U", - _unformat_farith, prec + 0, &tmp[0])) + else if (unformat (i, "-%U", _unformat_farith, prec + 0, &tmp[0])) { result[0] = -tmp[0]; return 1; } - else if (unformat (i, "(%U)", - _unformat_farith, 0, &tmp[0])) + else if (unformat (i, "(%U)", _unformat_farith, 0, &tmp[0])) { result[0] = tmp[0]; return 1; @@ -304,64 +326,67 @@ static uword _unformat_farith (unformat_input_t * i, va_list * args) return 0; } -static uword unformat_farith (unformat_input_t * i, va_list * args) +static uword +unformat_farith (unformat_input_t * i, va_list * args) { CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *); - f64 * result = va_arg (*args, f64 *); + f64 *result = va_arg (*args, f64 *); return unformat_user (i, _unformat_farith, 0, result); } -static uword unformat_integer (unformat_input_t * i, va_list * args) +static uword +unformat_integer (unformat_input_t * i, va_list * args) { CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *); - u32 * data = va_arg (*args, u32 *); + u32 *data = va_arg (*args, u32 *); return unformat (i, "%d", data); } -static VLIB_CLI_PARSE_RULE (my_parse_rule1) = { - .name = "decimal_integer", - .short_help = "a decimal integer", - .unformat_function = unformat_integer, - .data_size = sizeof (u32), -}; +static VLIB_CLI_PARSE_RULE (my_parse_rule1) = +{ +.name = "decimal_integer",.short_help = + "a decimal integer",.unformat_function = unformat_integer,.data_size = + sizeof (u32),}; -static VLIB_CLI_PARSE_RULE (my_parse_rule2) = { - .name = "float_expression", - .short_help = "floating point expression", - .unformat_function = unformat_farith, - .data_size = sizeof (f64), -}; +static VLIB_CLI_PARSE_RULE (my_parse_rule2) = +{ +.name = "float_expression",.short_help = + "floating point expression",.unformat_function = + unformat_farith,.data_size = sizeof (f64),}; static clib_error_t * bar_command (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { switch (cmd->function_arg) { - case 2: { - u32 * d, * e; - d = vlib_cli_get_parse_rule_result (vm, 0); - e = vlib_cli_get_parse_rule_result (vm, 1); - vlib_cli_output (vm, "bar2 %d %d", d[0], e[0]); - break; - } - - case 1: { - u32 * d = vlib_cli_get_parse_rule_result (vm, 0); - vlib_cli_output (vm, "bar1 %d", d[0]); - break; - } - - case 3: { - f64 * d = vlib_cli_get_parse_rule_result (vm, 0); - vlib_cli_output (vm, "expr %.6f", d[0]); - } + case 2: + { + u32 *d, *e; + d = vlib_cli_get_parse_rule_result (vm, 0); + e = vlib_cli_get_parse_rule_result (vm, 1); + vlib_cli_output (vm, "bar2 %d %d", d[0], e[0]); + break; + } + + case 1: + { + u32 *d = vlib_cli_get_parse_rule_result (vm, 0); + vlib_cli_output (vm, "bar1 %d", d[0]); + break; + } + + case 3: + { + f64 *d = vlib_cli_get_parse_rule_result (vm, 0); + vlib_cli_output (vm, "expr %.6f", d[0]); + } } return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (bar_command2, static) = { .path = "bar %decimal_integer", .short_help = "bar1 command", @@ -380,6 +405,14 @@ VLIB_CLI_COMMAND (bar_command3, static) = { .function = bar_command, .function_arg = 3, }; +/* *INDENT-ON* */ #endif +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/example/mc_test.c b/vlib/example/mc_test.c index 2a7fe9867fe..e84a713cc59 100644 --- a/vlib/example/mc_test.c +++ b/vlib/example/mc_test.c @@ -19,7 +19,8 @@ #include <vlib/unix/mc_socket.h> #include <vppinfra/random.h> -typedef struct { +typedef struct +{ u32 min_n_msg_bytes; u32 max_n_msg_bytes; u32 tx_serial; @@ -37,17 +38,20 @@ choose_msg_size (mc_test_main_t * tm) { u32 r = tm->min_n_msg_bytes; if (tm->max_n_msg_bytes > tm->min_n_msg_bytes) - r += random_u32 (&tm->seed) % (1 + tm->max_n_msg_bytes - tm->min_n_msg_bytes); + r += + random_u32 (&tm->seed) % (1 + tm->max_n_msg_bytes - + tm->min_n_msg_bytes); return r; } static mc_test_main_t mc_test_main; -static void serialize_test_msg (serialize_main_t * m, va_list * va) +static void +serialize_test_msg (serialize_main_t * m, va_list * va) { - mc_test_main_t * tm = &mc_test_main; + mc_test_main_t *tm = &mc_test_main; u32 n_bytes = choose_msg_size (tm); - u8 * msg; + u8 *msg; int i; serialize_integer (m, n_bytes, sizeof (n_bytes)); msg = serialize_get (m, n_bytes); @@ -56,11 +60,12 @@ static void serialize_test_msg (serialize_main_t * m, va_list * va) tm->tx_serial += n_bytes; } -static void unserialize_test_msg (serialize_main_t * m, va_list * va) +static void +unserialize_test_msg (serialize_main_t * m, va_list * va) { - mc_test_main_t * tm = &mc_test_main; + mc_test_main_t *tm = &mc_test_main; u32 i, n_bytes, dump_msg = tm->verbose; - u8 * p; + u8 *p; unserialize_integer (m, &n_bytes, sizeof (n_bytes)); p = unserialize_get (m, n_bytes); if (tm->validate) @@ -76,45 +81,43 @@ static void unserialize_test_msg (serialize_main_t * m, va_list * va) tm->rx_serial += n_bytes; } -MC_SERIALIZE_MSG (test_msg, static) = { - .name = "test_msg", - .serialize = serialize_test_msg, - .unserialize = unserialize_test_msg, -}; +MC_SERIALIZE_MSG (test_msg, static) = +{ +.name = "test_msg",.serialize = serialize_test_msg,.unserialize = + unserialize_test_msg,}; #define SERIALIZE 1 #define EVENT_JOIN_STREAM 10 #define EVENT_SEND_DATA 11 -static void test_rx_callback (mc_main_t * mcm, - mc_stream_t * stream, - mc_peer_id_t peer_id, - u32 buffer_index) +static void +test_rx_callback (mc_main_t * mcm, + mc_stream_t * stream, + mc_peer_id_t peer_id, u32 buffer_index) { if (SERIALIZE) { - return mc_unserialize (mcm, stream, buffer_index); + return mc_unserialize (mcm, stream, buffer_index); } else { #if DEBUG > 1 - vlib_main_t * vm = mcm->vlib_main; - vlib_buffer_t * b = vlib_get_buffer (vm, buffer_index); - u8 * dp = vlib_buffer_get_current (b); - - fformat(stdout, "RX from %U %U\n", - stream->transport->format_peer_id, peer_id, - format_hex_bytes, dp, tm->n_msg_bytes); - + vlib_main_t *vm = mcm->vlib_main; + vlib_buffer_t *b = vlib_get_buffer (vm, buffer_index); + u8 *dp = vlib_buffer_get_current (b); + + fformat (stdout, "RX from %U %U\n", + stream->transport->format_peer_id, peer_id, + format_hex_bytes, dp, tm->n_msg_bytes); + #endif } } static u8 * test_snapshot_callback (mc_main_t * mcm, - u8 * data_vector, - u32 last_global_sequence_processed) + u8 * data_vector, u32 last_global_sequence_processed) { if (SERIALIZE) { @@ -133,9 +136,7 @@ test_snapshot_callback (mc_main_t * mcm, } static void -test_handle_snapshot_callback (mc_main_t * mcm, - u8 * data, - u32 n_data_bytes) +test_handle_snapshot_callback (mc_main_t * mcm, u8 * data, u32 n_data_bytes) { if (SERIALIZE) { @@ -150,19 +151,18 @@ static mc_socket_main_t mc_socket_main; static uword mc_test_process (vlib_main_t * vm, - vlib_node_runtime_t * node, - vlib_frame_t * f) + vlib_node_runtime_t * node, vlib_frame_t * f) { - mc_test_main_t * tm = &mc_test_main; - mc_socket_main_t * msm = &mc_socket_main; + mc_test_main_t *tm = &mc_test_main; + mc_socket_main_t *msm = &mc_socket_main; mc_main_t *mcm = &msm->mc_main; uword event_type, *event_data = 0; - u32 data_serial=0, stream_index; + u32 data_serial = 0, stream_index; f64 delay; mc_stream_config_t config; - clib_error_t * error; + clib_error_t *error; int i; - char *intfcs[] = { "eth1", "eth0", "ce" }; + char *intfcs[] = { "eth1", "eth0", "ce" }; memset (&config, 0, sizeof (config)); config.name = "test"; @@ -175,7 +175,7 @@ mc_test_process (vlib_main_t * vm, msm->multicast_tx_ip4_address_host_byte_order = 0xefff0100; msm->base_multicast_udp_port_host_byte_order = 0xffab; - error = mc_socket_main_init (&mc_socket_main, intfcs, ARRAY_LEN(intfcs)); + error = mc_socket_main_init (&mc_socket_main, intfcs, ARRAY_LEN (intfcs)); if (error) { clib_error_report (error); @@ -195,61 +195,66 @@ mc_test_process (vlib_main_t * vm, stream_index = mc_stream_join (mcm, &config); break; - case EVENT_SEND_DATA: { - f64 times[2]; - - if (stream_index == ~0) - stream_index = mc_stream_join (mcm, &config); - - times[0] = vlib_time_now (vm); - for (i = 0; i < event_data[0]; i++) - { - u32 bi; - if (SERIALIZE) - { - mc_serialize_stream (mcm, stream_index, &test_msg, data_serial); - } - else - { - u8 * mp; - mp = mc_get_vlib_buffer (vm, sizeof (mp[0]), &bi); - mp[0] = data_serial; - mc_stream_send (mcm, stream_index, bi); - } - if (tm->min_delay > 0) - { - delay = tm->min_delay + random_f64 (&tm->seed) * (tm->max_delay - tm->min_delay); - vlib_process_suspend (vm, delay); - } - data_serial++; - } - times[1] = vlib_time_now (vm); - clib_warning ("done sending %d; %.4e per sec", - event_data[0], - (f64) event_data[0] / (times[1] - times[0])); - break; - } + case EVENT_SEND_DATA: + { + f64 times[2]; + + if (stream_index == ~0) + stream_index = mc_stream_join (mcm, &config); + + times[0] = vlib_time_now (vm); + for (i = 0; i < event_data[0]; i++) + { + u32 bi; + if (SERIALIZE) + { + mc_serialize_stream (mcm, stream_index, &test_msg, + data_serial); + } + else + { + u8 *mp; + mp = mc_get_vlib_buffer (vm, sizeof (mp[0]), &bi); + mp[0] = data_serial; + mc_stream_send (mcm, stream_index, bi); + } + if (tm->min_delay > 0) + { + delay = + tm->min_delay + + random_f64 (&tm->seed) * (tm->max_delay - + tm->min_delay); + vlib_process_suspend (vm, delay); + } + data_serial++; + } + times[1] = vlib_time_now (vm); + clib_warning ("done sending %d; %.4e per sec", + event_data[0], + (f64) event_data[0] / (times[1] - times[0])); + break; + } default: clib_warning ("bug"); break; } - + if (event_data) _vec_len (event_data) = 0; } } -VLIB_REGISTER_NODE (mc_test_process_node,static) = { - .function = mc_test_process, - .type = VLIB_NODE_TYPE_PROCESS, - .name = "mc-test-process", -}; +/* *INDENT-OFF* */ +VLIB_REGISTER_NODE (mc_test_process_node, static) = +{ +.function = mc_test_process,.type = VLIB_NODE_TYPE_PROCESS,.name = + "mc-test-process",}; +/* *INDENT-ON* */ static clib_error_t * mc_test_command (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { f64 npkts = 10; @@ -260,63 +265,63 @@ mc_test_command (vlib_main_t * vm, EVENT_JOIN_STREAM, 0); return 0; } - else if (unformat (input, "send %f", &npkts) - || unformat(input, "send")) + else if (unformat (input, "send %f", &npkts) || unformat (input, "send")) { vlib_process_signal_event (vm, mc_test_process_node.index, EVENT_SEND_DATA, (uword) npkts); vlib_cli_output (vm, "Send %.0f pkts...\n", npkts); - + return 0; } else return unformat_parse_error (input); } -VLIB_CLI_COMMAND (test_mc_command, static) = { - .path = "test mc", - .short_help = "Test mc command", - .function = mc_test_command, -}; +/* *INDENT-OFF* */ +VLIB_CLI_COMMAND (test_mc_command, static) = +{ +.path = "test mc",.short_help = "Test mc command",.function = + mc_test_command,}; +/* *INDENT-ON* */ static clib_error_t * mc_show_command (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { mc_main_t *mcm = &mc_socket_main.mc_main; vlib_cli_output (vm, "%U", format_mc_main, mcm); return 0; } -VLIB_CLI_COMMAND (show_mc_command, static) = { - .path = "show mc", - .short_help = "Show mc command", - .function = mc_show_command, -}; +/* *INDENT-OFF* */ +VLIB_CLI_COMMAND (show_mc_command, static) = +{ +.path = "show mc",.short_help = "Show mc command",.function = + mc_show_command,}; +/* *INDENT-ON* */ static clib_error_t * mc_clear_command (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { - mc_main_t * mcm = &mc_socket_main.mc_main; + mc_main_t *mcm = &mc_socket_main.mc_main; mc_clear_stream_stats (mcm); return 0; } -VLIB_CLI_COMMAND (clear_mc_command, static) = { - .path = "clear mc", - .short_help = "Clear mc command", - .function = mc_clear_command, -}; +/* *INDENT-OFF* */ +VLIB_CLI_COMMAND (clear_mc_command, static) = +{ +.path = "clear mc",.short_help = "Clear mc command",.function = + mc_clear_command,}; +/* *INDENT-ON* */ static clib_error_t * mc_config (vlib_main_t * vm, unformat_input_t * input) { - mc_test_main_t * tm = &mc_test_main; - mc_socket_main_t * msm = &mc_socket_main; - clib_error_t * error = 0; + mc_test_main_t *tm = &mc_test_main; + mc_socket_main_t *msm = &mc_socket_main; + clib_error_t *error = 0; tm->min_n_msg_bytes = 4; tm->max_n_msg_bytes = 4; @@ -362,9 +367,18 @@ mc_config (vlib_main_t * vm, unformat_input_t * input) if (tm->n_packets_to_send > 0) vlib_process_signal_event (vm, mc_test_process_node.index, - EVENT_SEND_DATA, (uword) tm->n_packets_to_send); + EVENT_SEND_DATA, + (uword) tm->n_packets_to_send); return error; } VLIB_CONFIG_FUNCTION (mc_config, "mc"); + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/example/plex_test.c b/vlib/example/plex_test.c index 947f25bc50b..ce0c8ef1141 100644 --- a/vlib/example/plex_test.c +++ b/vlib/example/plex_test.c @@ -15,23 +15,22 @@ #include <vlib/parse.h> #include <vlib/unix/unix.h> -static u8 * format_value_v4_address (u8 * s, va_list * args) +static u8 * +format_value_v4_address (u8 * s, va_list * args) { vlib_parse_value_t *v = va_arg (*args, vlib_parse_value_t *); u32 a = v->value.as_uword; s = format (s, "%d.%d.%d.%d", - (a>>24) & 0xFF, - (a>>16) & 0xFF, - (a>>8) & 0xFF, - (a>>0) & 0xFF); + (a >> 24) & 0xFF, + (a >> 16) & 0xFF, (a >> 8) & 0xFF, (a >> 0) & 0xFF); return s; } static vlib_parse_match_t -v4_address_match (vlib_parse_main_t *pm, vlib_parse_type_t *type, - vlib_lex_token_t *t, vlib_parse_value_t *valuep) +v4_address_match (vlib_parse_main_t * pm, vlib_parse_type_t * type, + vlib_lex_token_t * t, vlib_parse_value_t * valuep) { u32 digit; u32 value = 0; @@ -42,19 +41,23 @@ v4_address_match (vlib_parse_main_t *pm, vlib_parse_type_t *type, /* NUMBER DOT NUMBER DOT NUMBER DOT NUMBER */ - for (i = 0; i < 7; i++) { - if ((i & 1) == 0) { - if (t[i].token != VLIB_LEX_number) - return VLIB_PARSE_MATCH_FAIL; - if (t[i].value.as_uword > 0xff) - return VLIB_PARSE_MATCH_FAIL; - digit = t[i].value.as_uword; - value = (value << 8) | digit; - } else { - if (t[i].token != VLIB_LEX_dot) - return VLIB_PARSE_MATCH_FAIL; + for (i = 0; i < 7; i++) + { + if ((i & 1) == 0) + { + if (t[i].token != VLIB_LEX_number) + return VLIB_PARSE_MATCH_FAIL; + if (t[i].value.as_uword > 0xff) + return VLIB_PARSE_MATCH_FAIL; + digit = t[i].value.as_uword; + value = (value << 8) | digit; + } + else + { + if (t[i].token != VLIB_LEX_dot) + return VLIB_PARSE_MATCH_FAIL; + } } - } /* note: caller advances by 1 */ pm->current_token_index += 6; valuep->value.as_uword = value; @@ -62,25 +65,22 @@ v4_address_match (vlib_parse_main_t *pm, vlib_parse_type_t *type, } PARSE_TYPE_INIT (v4_address, v4_address_match, 0, format_value_v4_address) - -static u8 * format_value_v4_address_and_mask (u8 * s, va_list * args) + static u8 *format_value_v4_address_and_mask (u8 * s, va_list * args) { vlib_parse_value_t *v = va_arg (*args, vlib_parse_value_t *); - u32 * a = v->value.as_pointer; + u32 *a = v->value.as_pointer; s = format (s, "%d.%d.%d.%d", - (a[0]>>24) & 0xFF, - (a[0]>>16) & 0xFF, - (a[0]>>8) & 0xFF, - (a[0]>>0) & 0xFF); + (a[0] >> 24) & 0xFF, + (a[0] >> 16) & 0xFF, (a[0] >> 8) & 0xFF, (a[0] >> 0) & 0xFF); s = format (s, "/%d", a[1]); return s; } static vlib_parse_match_t -v4_address_and_mask_match (vlib_parse_main_t *pm, vlib_parse_type_t *type, - vlib_lex_token_t *t, vlib_parse_value_t *valuep) +v4_address_and_mask_match (vlib_parse_main_t * pm, vlib_parse_type_t * type, + vlib_lex_token_t * t, vlib_parse_value_t * valuep) { u32 digit; u32 address = 0; @@ -92,19 +92,23 @@ v4_address_and_mask_match (vlib_parse_main_t *pm, vlib_parse_type_t *type, /* NUMBER DOT NUMBER DOT NUMBER DOT NUMBER */ - for (i = 0; i < 7; i++) { - if ((i & 1) == 0) { - if (t[i].token != VLIB_LEX_number) - return VLIB_PARSE_MATCH_FAIL; - if (t[i].value.as_uword > 0xff) - return VLIB_PARSE_MATCH_FAIL; - digit = t[i].value.as_uword; - address = (address << 8) | digit; - } else { - if (t[i].token != VLIB_LEX_dot) - return VLIB_PARSE_MATCH_FAIL; + for (i = 0; i < 7; i++) + { + if ((i & 1) == 0) + { + if (t[i].token != VLIB_LEX_number) + return VLIB_PARSE_MATCH_FAIL; + if (t[i].value.as_uword > 0xff) + return VLIB_PARSE_MATCH_FAIL; + digit = t[i].value.as_uword; + address = (address << 8) | digit; + } + else + { + if (t[i].token != VLIB_LEX_dot) + return VLIB_PARSE_MATCH_FAIL; + } } - } if (t[7].token != VLIB_LEX_slash || t[8].token != VLIB_LEX_number) return VLIB_PARSE_MATCH_FAIL; @@ -118,135 +122,143 @@ v4_address_and_mask_match (vlib_parse_main_t *pm, vlib_parse_type_t *type, return VLIB_PARSE_MATCH_VALUE; } -void v4_address_and_mask_cleanup (vlib_parse_value_t *valuep) +void +v4_address_and_mask_cleanup (vlib_parse_value_t * valuep) { - u32 * trash = valuep->value.as_pointer; + u32 *trash = valuep->value.as_pointer; vec_free (trash); } -PARSE_TYPE_INIT (v4_address_and_mask, v4_address_and_mask_match, - v4_address_and_mask_cleanup, - format_value_v4_address_and_mask) - -vlib_lex_main_t vlib_lex_main; +PARSE_TYPE_INIT (v4_address_and_mask, v4_address_and_mask_match, + v4_address_and_mask_cleanup, + format_value_v4_address_and_mask) + vlib_lex_main_t vlib_lex_main; -vlib_parse_match_t eval_factor0 (vlib_parse_main_t *pm, - vlib_parse_item_t *item, - vlib_parse_value_t *value) + vlib_parse_match_t eval_factor0 (vlib_parse_main_t * pm, + vlib_parse_item_t * item, + vlib_parse_value_t * value) { clib_warning ("%U", format_vlib_parse_value, pm); return VLIB_PARSE_MATCH_RULE; } -vlib_parse_match_t eval_factor1 (vlib_parse_main_t *pm, - vlib_parse_item_t *item, - vlib_parse_value_t *value) + +vlib_parse_match_t +eval_factor1 (vlib_parse_main_t * pm, + vlib_parse_item_t * item, vlib_parse_value_t * value) { clib_warning ("%U", format_vlib_parse_value, pm); return VLIB_PARSE_MATCH_RULE; } -vlib_parse_match_t eval_factor2 (vlib_parse_main_t *pm, - vlib_parse_item_t *item, - vlib_parse_value_t *value) + +vlib_parse_match_t +eval_factor2 (vlib_parse_main_t * pm, + vlib_parse_item_t * item, vlib_parse_value_t * value) { word a; - int index = vec_len (pm->parse_value)-1; - - a = pm->parse_value [index].value.as_word; - + int index = vec_len (pm->parse_value) - 1; + + a = pm->parse_value[index].value.as_word; + pm->parse_value[index].value.as_word = -a; return VLIB_PARSE_MATCH_RULE; } -vlib_parse_match_t eval_term0 (vlib_parse_main_t *pm, - vlib_parse_item_t *item, - vlib_parse_value_t *value) + +vlib_parse_match_t +eval_term0 (vlib_parse_main_t * pm, + vlib_parse_item_t * item, vlib_parse_value_t * value) { clib_warning ("%U", format_vlib_parse_value, pm); return VLIB_PARSE_MATCH_RULE; } -vlib_parse_match_t eval_term1 (vlib_parse_main_t *pm, - vlib_parse_item_t *item, - vlib_parse_value_t *value) + +vlib_parse_match_t +eval_term1 (vlib_parse_main_t * pm, + vlib_parse_item_t * item, vlib_parse_value_t * value) { uword a, b; - int index = vec_len (pm->parse_value)-2; - - a = pm->parse_value [index].value.as_uword; - b = pm->parse_value [index+1].value.as_uword; - + int index = vec_len (pm->parse_value) - 2; + + a = pm->parse_value[index].value.as_uword; + b = pm->parse_value[index + 1].value.as_uword; + pm->parse_value[index].value.as_uword = a * b; _vec_len (pm->parse_value) -= 1; clib_warning ("%U", format_vlib_parse_value, pm); - + return VLIB_PARSE_MATCH_RULE; } -vlib_parse_match_t eval_term2 (vlib_parse_main_t *pm, - vlib_parse_item_t *item, - vlib_parse_value_t *value) + +vlib_parse_match_t +eval_term2 (vlib_parse_main_t * pm, + vlib_parse_item_t * item, vlib_parse_value_t * value) { uword a, b; - int index = vec_len (pm->parse_value)-2; - - a = pm->parse_value [index].value.as_uword; - b = pm->parse_value [index+1].value.as_uword; - + int index = vec_len (pm->parse_value) - 2; + + a = pm->parse_value[index].value.as_uword; + b = pm->parse_value[index + 1].value.as_uword; + pm->parse_value[index].value.as_uword = a / b; _vec_len (pm->parse_value) -= 1; clib_warning ("%U", format_vlib_parse_value, pm); - + return VLIB_PARSE_MATCH_RULE; } -vlib_parse_match_t eval_exp0 (vlib_parse_main_t *pm, - vlib_parse_item_t *item, - vlib_parse_value_t *value) + +vlib_parse_match_t +eval_exp0 (vlib_parse_main_t * pm, + vlib_parse_item_t * item, vlib_parse_value_t * value) { return VLIB_PARSE_MATCH_RULE; } -vlib_parse_match_t eval_exp1 (vlib_parse_main_t *pm, - vlib_parse_item_t *item, - vlib_parse_value_t *value) + +vlib_parse_match_t +eval_exp1 (vlib_parse_main_t * pm, + vlib_parse_item_t * item, vlib_parse_value_t * value) { uword a, b; - int index = vec_len (pm->parse_value)-2; - - a = pm->parse_value [index].value.as_uword; - b = pm->parse_value [index+1].value.as_uword; - + int index = vec_len (pm->parse_value) - 2; + + a = pm->parse_value[index].value.as_uword; + b = pm->parse_value[index + 1].value.as_uword; + pm->parse_value[index].value.as_uword = a + b; _vec_len (pm->parse_value) -= 1; clib_warning ("%U", format_vlib_parse_value, pm); - + return VLIB_PARSE_MATCH_RULE; } -vlib_parse_match_t eval_exp2 (vlib_parse_main_t *pm, - vlib_parse_item_t *item, - vlib_parse_value_t *value) + +vlib_parse_match_t +eval_exp2 (vlib_parse_main_t * pm, + vlib_parse_item_t * item, vlib_parse_value_t * value) { uword a, b; - int index = vec_len (pm->parse_value)-2; - - a = pm->parse_value [index].value.as_uword; - b = pm->parse_value [index+1].value.as_uword; - + int index = vec_len (pm->parse_value) - 2; + + a = pm->parse_value[index].value.as_uword; + b = pm->parse_value[index + 1].value.as_uword; + pm->parse_value[index].value.as_uword = a - b; _vec_len (pm->parse_value) -= 1; clib_warning ("%U", format_vlib_parse_value, pm); - + return VLIB_PARSE_MATCH_RULE; } -vlib_parse_match_t eval_result (vlib_parse_main_t *pm, - vlib_parse_item_t *item, - vlib_parse_value_t *value) +vlib_parse_match_t +eval_result (vlib_parse_main_t * pm, + vlib_parse_item_t * item, vlib_parse_value_t * value) { clib_warning ("%U", format_vlib_parse_value, pm); return VLIB_PARSE_MATCH_DONE; } -vlib_parse_match_t noop_match_rule (vlib_parse_main_t *pm, - vlib_parse_item_t *item, - vlib_parse_value_t *value) +vlib_parse_match_t +noop_match_rule (vlib_parse_main_t * pm, + vlib_parse_item_t * item, vlib_parse_value_t * value) { clib_warning ("%U", format_vlib_parse_value, pm); return VLIB_PARSE_MATCH_RULE; @@ -330,18 +342,17 @@ vlib_parse_match_t eval##n (vlib_parse_main_t *pm, \ return VLIB_PARSE_MATCH_DONE; \ } foreach_rule_evaluator - #undef _ - PARSE_INIT (r1, "eval <moo>", eval_result); PARSE_INIT (r2, "<moo> = cow", eval0); PARSE_INIT (r4, "<moo> = ", eval1); PARSE_TYPE_INIT (moo, rule_match, 0, 0); -#endif +#endif -clib_error_t *test_init (vlib_main_t *vm) +clib_error_t * +test_init (vlib_main_t * vm) { clib_error_t *error; @@ -356,13 +367,13 @@ VLIB_INIT_FUNCTION (test_init); clib_error_t * vlib_stdlex_init (vlib_main_t * vm) { - vlib_lex_main_t * lm = &vlib_lex_main; + vlib_lex_main_t *lm = &vlib_lex_main; u16 top_index; u16 slash_index, slash_star_index, slash_slash_index, slash_star_star_index; u16 slash_token; u16 word_index; u16 zero_index, octal_index, decimal_index, hex_index, binary_index; - + top_index = vlib_lex_add_table ("top"); #define foreach_top_level_single_character_token \ @@ -395,43 +406,52 @@ vlib_stdlex_init (vlib_main_t * vm) binary_index = vlib_lex_add_table ("binary"); /* Support 0x 0b 0t and 0123 [octal] */ - vlib_lex_set_action_range (top_index, '0', '0', VLIB_LEX_START_NUMBER, 10, zero_index); - vlib_lex_set_action_range (top_index, '1', '9', VLIB_LEX_START_NUMBER, 10, decimal_index); - - vlib_lex_set_action_range (zero_index, 0, 0x7F, VLIB_LEX_RETURN_AND_RESCAN, VLIB_LEX_number, top_index); + vlib_lex_set_action_range (top_index, '0', '0', VLIB_LEX_START_NUMBER, 10, + zero_index); + vlib_lex_set_action_range (top_index, '1', '9', VLIB_LEX_START_NUMBER, 10, + decimal_index); + + vlib_lex_set_action_range (zero_index, 0, 0x7F, VLIB_LEX_RETURN_AND_RESCAN, + VLIB_LEX_number, top_index); + + vlib_lex_set_action_range (zero_index, 'x', 'x', VLIB_LEX_IGNORE, ~0, + hex_index); + vlib_lex_set_action_range (zero_index, 'b', 'b', VLIB_LEX_IGNORE, ~0, + binary_index); + vlib_lex_set_action_range (zero_index, 't', 't', VLIB_LEX_IGNORE, ~0, + decimal_index); + vlib_lex_set_action_range (zero_index, '0', '7', VLIB_LEX_START_NUMBER, 8, + octal_index); - vlib_lex_set_action_range (zero_index, 'x', 'x', VLIB_LEX_IGNORE, ~0, hex_index); - vlib_lex_set_action_range (zero_index, 'b', 'b', VLIB_LEX_IGNORE, ~0, binary_index); - vlib_lex_set_action_range (zero_index, 't', 't', VLIB_LEX_IGNORE, ~0, decimal_index); - vlib_lex_set_action_range (zero_index, '0', '7', VLIB_LEX_START_NUMBER, 8, octal_index); - /* Octal */ vlib_lex_set_action_range (octal_index, 0, 0x7f, VLIB_LEX_RETURN_AND_RESCAN, - VLIB_LEX_number, top_index); - vlib_lex_set_action_range (octal_index, '0', '7', VLIB_LEX_ADD_TO_NUMBER, 8, - octal_index); + VLIB_LEX_number, top_index); + vlib_lex_set_action_range (octal_index, '0', '7', VLIB_LEX_ADD_TO_NUMBER, 8, + octal_index); /* Decimal */ - vlib_lex_set_action_range (decimal_index, 0, 0x7f, VLIB_LEX_RETURN_AND_RESCAN, - VLIB_LEX_number, top_index); - vlib_lex_set_action_range (decimal_index, '0', '9', VLIB_LEX_ADD_TO_NUMBER, 10, - decimal_index); - + vlib_lex_set_action_range (decimal_index, 0, 0x7f, + VLIB_LEX_RETURN_AND_RESCAN, VLIB_LEX_number, + top_index); + vlib_lex_set_action_range (decimal_index, '0', '9', VLIB_LEX_ADD_TO_NUMBER, + 10, decimal_index); + /* Hex */ vlib_lex_set_action_range (hex_index, 0, 0x7f, VLIB_LEX_RETURN_AND_RESCAN, - VLIB_LEX_number, top_index); - vlib_lex_set_action_range (hex_index, '0', '9', VLIB_LEX_ADD_TO_NUMBER, 16, - hex_index); - vlib_lex_set_action_range (hex_index, 'a', 'f', VLIB_LEX_ADD_TO_NUMBER, 16, - hex_index); - vlib_lex_set_action_range (hex_index, 'A', 'F', VLIB_LEX_ADD_TO_NUMBER, 16, - hex_index); - + VLIB_LEX_number, top_index); + vlib_lex_set_action_range (hex_index, '0', '9', VLIB_LEX_ADD_TO_NUMBER, 16, + hex_index); + vlib_lex_set_action_range (hex_index, 'a', 'f', VLIB_LEX_ADD_TO_NUMBER, 16, + hex_index); + vlib_lex_set_action_range (hex_index, 'A', 'F', VLIB_LEX_ADD_TO_NUMBER, 16, + hex_index); + /* Binary */ - vlib_lex_set_action_range (binary_index, 0, 0x7f, VLIB_LEX_RETURN_AND_RESCAN, - VLIB_LEX_number, top_index); - vlib_lex_set_action_range (binary_index, '0', '1', VLIB_LEX_ADD_TO_NUMBER, 2, - binary_index); + vlib_lex_set_action_range (binary_index, 0, 0x7f, + VLIB_LEX_RETURN_AND_RESCAN, VLIB_LEX_number, + top_index); + vlib_lex_set_action_range (binary_index, '0', '1', VLIB_LEX_ADD_TO_NUMBER, + 2, binary_index); /* c/c++ comment syntax is the worst... */ @@ -442,49 +462,66 @@ vlib_stdlex_init (vlib_main_t * vm) slash_token = vlib_lex_add_token (lm, "slash"); /* Top level: see a slash, ignore, go to slash table */ - vlib_lex_set_action_range (top_index, '/', '/', VLIB_LEX_IGNORE, ~0, slash_index); + vlib_lex_set_action_range (top_index, '/', '/', VLIB_LEX_IGNORE, ~0, + slash_index); /* default for slash table: return SLASH, go to top table */ - vlib_lex_set_action_range (slash_index, 1, 0x7F, VLIB_LEX_RETURN_AND_RESCAN, slash_token, - top_index); + vlib_lex_set_action_range (slash_index, 1, 0x7F, VLIB_LEX_RETURN_AND_RESCAN, + slash_token, top_index); /* see slash-slash, go to s-s table */ - vlib_lex_set_action_range (slash_index, '/', '/', VLIB_LEX_IGNORE, ~0, - slash_slash_index); + vlib_lex_set_action_range (slash_index, '/', '/', VLIB_LEX_IGNORE, ~0, + slash_slash_index); /* see slash-star, go to s-* table */ - vlib_lex_set_action_range (slash_index, '*', '*', VLIB_LEX_IGNORE, ~0, - slash_star_index); + vlib_lex_set_action_range (slash_index, '*', '*', VLIB_LEX_IGNORE, ~0, + slash_star_index); /* EOL in s-s table, ignore, go to top table */ - vlib_lex_set_action_range (slash_slash_index, '\n', '\n', VLIB_LEX_IGNORE, ~0, - top_index); + vlib_lex_set_action_range (slash_slash_index, '\n', '\n', VLIB_LEX_IGNORE, + ~0, top_index); /* slash-star blah blah star */ vlib_lex_set_action_range (slash_star_index, '*', '*', VLIB_LEX_IGNORE, ~0, - slash_star_star_index); + slash_star_star_index); /* slash star blah blah star slash */ - vlib_lex_set_action_range (slash_star_star_index, '/', '/', VLIB_LEX_IGNORE, ~0, - top_index); + vlib_lex_set_action_range (slash_star_star_index, '/', '/', VLIB_LEX_IGNORE, + ~0, top_index); /* LT, =, GT */ - vlib_lex_set_action_range (top_index, '<', '<', VLIB_LEX_RETURN, VLIB_LEX_lt, top_index); - vlib_lex_set_action_range (top_index, '=', '=', VLIB_LEX_RETURN, VLIB_LEX_equals, - top_index); - vlib_lex_set_action_range (top_index, '>', '>', VLIB_LEX_RETURN, VLIB_LEX_gt, top_index); + vlib_lex_set_action_range (top_index, '<', '<', VLIB_LEX_RETURN, + VLIB_LEX_lt, top_index); + vlib_lex_set_action_range (top_index, '=', '=', VLIB_LEX_RETURN, + VLIB_LEX_equals, top_index); + vlib_lex_set_action_range (top_index, '>', '>', VLIB_LEX_RETURN, + VLIB_LEX_gt, top_index); /* words, key and otherwise */ word_index = vlib_lex_add_table ("word"); - vlib_lex_set_action_range (top_index, 'a', 'z', VLIB_LEX_ADD_TO_TOKEN, ~0, word_index); - vlib_lex_set_action_range (top_index, 'A', 'Z', VLIB_LEX_ADD_TO_TOKEN, ~0, word_index); + vlib_lex_set_action_range (top_index, 'a', 'z', VLIB_LEX_ADD_TO_TOKEN, ~0, + word_index); + vlib_lex_set_action_range (top_index, 'A', 'Z', VLIB_LEX_ADD_TO_TOKEN, ~0, + word_index); - vlib_lex_set_action_range (word_index, 0, 0x7f, VLIB_LEX_KEYWORD_CHECK, ~0, top_index); + vlib_lex_set_action_range (word_index, 0, 0x7f, VLIB_LEX_KEYWORD_CHECK, ~0, + top_index); + + vlib_lex_set_action_range (word_index, 'a', 'z', VLIB_LEX_ADD_TO_TOKEN, ~0, + word_index); + vlib_lex_set_action_range (word_index, 'A', 'Z', VLIB_LEX_ADD_TO_TOKEN, ~0, + word_index); + vlib_lex_set_action_range (word_index, '_', '_', VLIB_LEX_ADD_TO_TOKEN, ~0, + word_index); + vlib_lex_set_action_range (word_index, '0', '9', VLIB_LEX_ADD_TO_TOKEN, ~0, + word_index); - vlib_lex_set_action_range (word_index, 'a', 'z', VLIB_LEX_ADD_TO_TOKEN, ~0, word_index); - vlib_lex_set_action_range (word_index, 'A', 'Z', VLIB_LEX_ADD_TO_TOKEN, ~0, word_index); - vlib_lex_set_action_range (word_index, '_', '_', VLIB_LEX_ADD_TO_TOKEN, ~0, word_index); - vlib_lex_set_action_range (word_index, '0', '9', VLIB_LEX_ADD_TO_TOKEN, ~0, word_index); - return 0; } +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/buffer.c b/vlib/vlib/buffer.c index f727e67a55a..84cecc27a81 100644 --- a/vlib/vlib/buffer.c +++ b/vlib/vlib/buffer.c @@ -39,9 +39,11 @@ #include <vlib/vlib.h> -uword vlib_buffer_length_in_chain_slow_path (vlib_main_t * vm, vlib_buffer_t * b_first) +uword +vlib_buffer_length_in_chain_slow_path (vlib_main_t * vm, + vlib_buffer_t * b_first) { - vlib_buffer_t * b = b_first; + vlib_buffer_t *b = b_first; uword l_first = b_first->current_length; uword l = 0; while (b->flags & VLIB_BUFFER_NEXT_PRESENT) @@ -54,13 +56,13 @@ uword vlib_buffer_length_in_chain_slow_path (vlib_main_t * vm, vlib_buffer_t * b return l + l_first; } -u8 * format_vlib_buffer (u8 * s, va_list * args) +u8 * +format_vlib_buffer (u8 * s, va_list * args) { - vlib_buffer_t * b = va_arg (*args, vlib_buffer_t *); - + vlib_buffer_t *b = va_arg (*args, vlib_buffer_t *); + s = format (s, "current data %d, length %d, free-list %d", - b->current_data, b->current_length, - b->free_list_index); + b->current_data, b->current_length, b->free_list_index); if (b->flags & VLIB_BUFFER_IS_TRACED) s = format (s, ", trace 0x%x", b->trace_index); @@ -71,10 +73,11 @@ u8 * format_vlib_buffer (u8 * s, va_list * args) return s; } -u8 * format_vlib_buffer_and_data (u8 * s, va_list * args) +u8 * +format_vlib_buffer_and_data (u8 * s, va_list * args) { - vlib_buffer_t * b = va_arg (*args, vlib_buffer_t *); - + vlib_buffer_t *b = va_arg (*args, vlib_buffer_t *); + s = format (s, "%U, %U", format_vlib_buffer, b, format_hex_bytes, vlib_buffer_get_current (b), 64); @@ -82,10 +85,11 @@ u8 * format_vlib_buffer_and_data (u8 * s, va_list * args) return s; } -static u8 * format_vlib_buffer_known_state (u8 * s, va_list * args) +static u8 * +format_vlib_buffer_known_state (u8 * s, va_list * args) { vlib_buffer_known_state_t state = va_arg (*args, vlib_buffer_known_state_t); - char * t; + char *t; switch (state) { @@ -109,16 +113,16 @@ static u8 * format_vlib_buffer_known_state (u8 * s, va_list * args) return format (s, "%s", t); } -u8 * format_vlib_buffer_contents (u8 * s, va_list * va) +u8 * +format_vlib_buffer_contents (u8 * s, va_list * va) { - vlib_main_t * vm = va_arg (*va, vlib_main_t *); - vlib_buffer_t * b = va_arg (*va, vlib_buffer_t *); - + vlib_main_t *vm = va_arg (*va, vlib_main_t *); + vlib_buffer_t *b = va_arg (*va, vlib_buffer_t *); + while (1) { - vec_add (s, vlib_buffer_get_current (b), - b->current_length); - if (! (b->flags & VLIB_BUFFER_NEXT_PRESENT)) + vec_add (s, vlib_buffer_get_current (b), b->current_length); + if (!(b->flags & VLIB_BUFFER_NEXT_PRESENT)) break; b = vlib_get_buffer (vm, b->next_buffer); } @@ -129,41 +133,34 @@ u8 * format_vlib_buffer_contents (u8 * s, va_list * va) static u8 * vlib_validate_buffer_helper (vlib_main_t * vm, u32 bi, - uword follow_buffer_next, - uword ** unique_hash) - + uword follow_buffer_next, uword ** unique_hash) { - vlib_buffer_t * b = vlib_get_buffer (vm, bi); - vlib_buffer_main_t * bm = vm->buffer_main; - vlib_buffer_free_list_t * fl; + vlib_buffer_t *b = vlib_get_buffer (vm, bi); + vlib_buffer_main_t *bm = vm->buffer_main; + vlib_buffer_free_list_t *fl; - if (pool_is_free_index (bm->buffer_free_list_pool, - b->free_list_index)) + if (pool_is_free_index (bm->buffer_free_list_pool, b->free_list_index)) return format (0, "unknown free list 0x%x", b->free_list_index); - fl = pool_elt_at_index (bm->buffer_free_list_pool, - b->free_list_index); + fl = pool_elt_at_index (bm->buffer_free_list_pool, b->free_list_index); - if ((signed) b->current_data < (signed) - VLIB_BUFFER_PRE_DATA_SIZE) + if ((signed) b->current_data < (signed) -VLIB_BUFFER_PRE_DATA_SIZE) return format (0, "current data %d before pre-data", b->current_data); #if DPDK == 0 if (b->current_data + b->current_length > fl->n_data_bytes) return format (0, "%d-%d beyond end of buffer %d", - b->current_data, b->current_length, - fl->n_data_bytes); + b->current_data, b->current_length, fl->n_data_bytes); #endif - if (follow_buffer_next - && (b->flags & VLIB_BUFFER_NEXT_PRESENT)) + if (follow_buffer_next && (b->flags & VLIB_BUFFER_NEXT_PRESENT)) { vlib_buffer_known_state_t k; - u8 * msg, * result; + u8 *msg, *result; k = vlib_buffer_is_known (vm, b->next_buffer); if (k != VLIB_BUFFER_KNOWN_ALLOCATED) return format (0, "next 0x%x: %U", - b->next_buffer, - format_vlib_buffer_known_state, k); + b->next_buffer, format_vlib_buffer_known_state, k); if (unique_hash) { @@ -187,7 +184,10 @@ vlib_validate_buffer_helper (vlib_main_t * vm, u8 * vlib_validate_buffer (vlib_main_t * vm, u32 bi, uword follow_buffer_next) -{ return vlib_validate_buffer_helper (vm, bi, follow_buffer_next, /* unique_hash */ 0); } +{ + return vlib_validate_buffer_helper (vm, bi, follow_buffer_next, + /* unique_hash */ 0); +} u8 * vlib_validate_buffers (vlib_main_t * vm, @@ -197,10 +197,10 @@ vlib_validate_buffers (vlib_main_t * vm, vlib_buffer_known_state_t known_state, uword follow_buffer_next) { - uword i, * hash; - u32 bi, * b = buffers; + uword i, *hash; + u32 bi, *b = buffers; vlib_buffer_known_state_t k; - u8 * msg = 0, * result = 0; + u8 *msg = 0, *result = 0; hash = hash_create (0, 0); for (i = 0; i < n_buffers; i++) @@ -231,7 +231,7 @@ vlib_validate_buffers (vlib_main_t * vm, hash_set1 (hash, bi); } - done: +done: if (msg) { result = format (0, "0x%x: %v", bi, msg); @@ -251,24 +251,24 @@ vlib_buffer_validate_alloc_free (vlib_main_t * vm, uword n_buffers, vlib_buffer_known_state_t expected_state) { - u32 * b; + u32 *b; uword i, bi, is_free; if (CLIB_DEBUG == 0) return; - ASSERT(os_get_cpu_number() == 0); + ASSERT (os_get_cpu_number () == 0); /* smp disaster check */ if (vlib_mains) - ASSERT(vm == vlib_mains[0]); + ASSERT (vm == vlib_mains[0]); is_free = expected_state == VLIB_BUFFER_KNOWN_ALLOCATED; b = buffers; for (i = 0; i < n_buffers; i++) { vlib_buffer_known_state_t known; - + bi = b[0]; b += 1; known = vlib_buffer_is_known (vm, bi); @@ -278,8 +278,7 @@ vlib_buffer_validate_alloc_free (vlib_main_t * vm, vlib_panic_with_msg (vm, "%s %U buffer 0x%x", is_free ? "freeing" : "allocating", - format_vlib_buffer_known_state, known, - bi); + format_vlib_buffer_known_state, known, bi); } vlib_buffer_set_known_state @@ -290,10 +289,10 @@ vlib_buffer_validate_alloc_free (vlib_main_t * vm, /* Aligned copy routine. */ void -vlib_aligned_memcpy (void * _dst, void * _src, int n_bytes) +vlib_aligned_memcpy (void *_dst, void *_src, int n_bytes) { - vlib_copy_unit_t * dst = _dst; - vlib_copy_unit_t * src = _src; + vlib_copy_unit_t *dst = _dst; + vlib_copy_unit_t *src = _src; /* Arguments must be naturally aligned. */ ASSERT (pointer_to_uword (dst) % sizeof (dst[0]) == 0); @@ -341,7 +340,7 @@ vlib_aligned_memcpy (void * _dst, void * _src, int n_bytes) } } else - /* Cache line size unknown: fall back to slow version. */; + /* Cache line size unknown: fall back to slow version. */ ; while (n_bytes > 0) { @@ -412,8 +411,8 @@ merge_free_lists (vlib_buffer_free_list_t * dst, vlib_buffer_free_list_t * src) { uword l; - u32 * d; - + u32 *d; + trim_aligned (src); trim_aligned (dst); @@ -437,10 +436,10 @@ merge_free_lists (vlib_buffer_free_list_t * dst, always_inline u32 vlib_buffer_get_free_list_with_size (vlib_main_t * vm, u32 size) { - vlib_buffer_main_t * bm = vm->buffer_main; + vlib_buffer_main_t *bm = vm->buffer_main; size = vlib_buffer_round_size (size); - uword * p = hash_get (bm->free_list_by_size, size); + uword *p = hash_get (bm->free_list_by_size, size); return p ? p[0] : ~0; } @@ -448,24 +447,27 @@ vlib_buffer_get_free_list_with_size (vlib_main_t * vm, u32 size) static u32 vlib_buffer_create_free_list_helper (vlib_main_t * vm, u32 n_data_bytes, - u32 is_public, - u32 is_default, - u8 * name) + u32 is_public, u32 is_default, u8 * name) { - vlib_buffer_main_t * bm = vm->buffer_main; - vlib_buffer_free_list_t * f; + vlib_buffer_main_t *bm = vm->buffer_main; + vlib_buffer_free_list_t *f; - if (! is_default && pool_elts (bm->buffer_free_list_pool) == 0) + if (!is_default && pool_elts (bm->buffer_free_list_pool) == 0) { u32 default_free_free_list_index; - default_free_free_list_index = - vlib_buffer_create_free_list_helper (vm, - /* default buffer size */ VLIB_BUFFER_DEFAULT_FREE_LIST_BYTES, - /* is_public */ 1, - /* is_default */ 1, - (u8 *) "default"); - ASSERT (default_free_free_list_index == VLIB_BUFFER_DEFAULT_FREE_LIST_INDEX); + default_free_free_list_index = vlib_buffer_create_free_list_helper (vm, + /* default buffer size */ + VLIB_BUFFER_DEFAULT_FREE_LIST_BYTES, + /* is_public */ + 1, + /* is_default */ + 1, + (u8 + *) + "default"); + ASSERT (default_free_free_list_index == + VLIB_BUFFER_DEFAULT_FREE_LIST_INDEX); if (n_data_bytes == VLIB_BUFFER_DEFAULT_FREE_LIST_BYTES && is_public) return default_free_free_list_index; @@ -484,19 +486,20 @@ vlib_buffer_create_free_list_helper (vlib_main_t * vm, if (is_public) { - uword * p = hash_get (bm->free_list_by_size, f->n_data_bytes); - if (! p) + uword *p = hash_get (bm->free_list_by_size, f->n_data_bytes); + if (!p) hash_set (bm->free_list_by_size, f->n_data_bytes, f->index); } return f->index; } -u32 vlib_buffer_create_free_list (vlib_main_t * vm, u32 n_data_bytes, - char * fmt, ...) +u32 +vlib_buffer_create_free_list (vlib_main_t * vm, u32 n_data_bytes, + char *fmt, ...) { va_list va; - u8 * name; + u8 *name; va_start (va, fmt); name = va_format (0, fmt, &va); @@ -508,15 +511,16 @@ u32 vlib_buffer_create_free_list (vlib_main_t * vm, u32 n_data_bytes, name); } -u32 vlib_buffer_get_or_create_free_list (vlib_main_t * vm, u32 n_data_bytes, - char * fmt, ...) +u32 +vlib_buffer_get_or_create_free_list (vlib_main_t * vm, u32 n_data_bytes, + char *fmt, ...) { u32 i = vlib_buffer_get_free_list_with_size (vm, n_data_bytes); if (i == ~0) { va_list va; - u8 * name; + u8 *name; va_start (va, fmt); name = va_format (0, fmt, &va); @@ -527,7 +531,7 @@ u32 vlib_buffer_get_or_create_free_list (vlib_main_t * vm, u32 n_data_bytes, /* is_default */ 0, name); } - + return i; } @@ -545,15 +549,17 @@ del_free_list (vlib_main_t * vm, vlib_buffer_free_list_t * f) } /* Add buffer free list. */ -void vlib_buffer_delete_free_list (vlib_main_t * vm, u32 free_list_index) +void +vlib_buffer_delete_free_list (vlib_main_t * vm, u32 free_list_index) { - vlib_buffer_main_t * bm = vm->buffer_main; - vlib_buffer_free_list_t * f; + vlib_buffer_main_t *bm = vm->buffer_main; + vlib_buffer_free_list_t *f; u32 merge_index; f = vlib_buffer_get_free_list (vm, free_list_index); - ASSERT (vec_len (f->unaligned_buffers) + vec_len (f->aligned_buffers) == f->n_alloc); + ASSERT (vec_len (f->unaligned_buffers) + vec_len (f->aligned_buffers) == + f->n_alloc); merge_index = vlib_buffer_get_free_list_with_size (vm, f->n_data_bytes); if (merge_index != ~0 && merge_index != free_list_index) { @@ -572,12 +578,11 @@ void vlib_buffer_delete_free_list (vlib_main_t * vm, u32 free_list_index) /* Make sure free list has at least given number of free buffers. */ static uword fill_free_list (vlib_main_t * vm, - vlib_buffer_free_list_t * fl, - uword min_free_buffers) + vlib_buffer_free_list_t * fl, uword min_free_buffers) { - vlib_buffer_t * buffers, * b; + vlib_buffer_t *buffers, *b; int n, n_bytes, i; - u32 * bi; + u32 *bi; u32 n_remaining, n_alloc, n_this_chunk; trim_aligned (fl); @@ -598,14 +603,15 @@ fill_free_list (vlib_main_t * vm, while (n_remaining > 0) { n_this_chunk = clib_min (n_remaining, 16); - + n_bytes = n_this_chunk * (sizeof (b[0]) + fl->n_data_bytes); /* drb: removed power-of-2 ASSERT */ buffers = vm->os_physmem_alloc_aligned (&vm->physmem_main, - n_bytes, sizeof (vlib_buffer_t)); - if (! buffers) - return n_alloc; + n_bytes, + sizeof (vlib_buffer_t)); + if (!buffers) + return n_alloc; /* Record chunk as being allocated so we can free it later. */ vec_add1 (fl->buffer_memory_allocated, buffers); @@ -615,48 +621,49 @@ fill_free_list (vlib_main_t * vm, n_remaining -= n_this_chunk; b = buffers; - vec_add2_aligned (fl->aligned_buffers, bi, n_this_chunk, - sizeof (vlib_copy_unit_t)); + vec_add2_aligned (fl->aligned_buffers, bi, n_this_chunk, + sizeof (vlib_copy_unit_t)); for (i = 0; i < n_this_chunk; i++) - { - bi[i] = vlib_get_buffer_index (vm, b); + { + bi[i] = vlib_get_buffer_index (vm, b); - if (CLIB_DEBUG > 0) - vlib_buffer_set_known_state (vm, bi[i], VLIB_BUFFER_KNOWN_FREE); - b = vlib_buffer_next_contiguous (b, fl->n_data_bytes); - } + if (CLIB_DEBUG > 0) + vlib_buffer_set_known_state (vm, bi[i], VLIB_BUFFER_KNOWN_FREE); + b = vlib_buffer_next_contiguous (b, fl->n_data_bytes); + } memset (buffers, 0, n_bytes); /* Initialize all new buffers. */ b = buffers; for (i = 0; i < n_this_chunk; i++) - { - vlib_buffer_init_for_free_list (b, fl); - b = vlib_buffer_next_contiguous (b, fl->n_data_bytes); - } - + { + vlib_buffer_init_for_free_list (b, fl); + b = vlib_buffer_next_contiguous (b, fl->n_data_bytes); + } + if (fl->buffer_init_function) - fl->buffer_init_function (vm, fl, bi, n_this_chunk); + fl->buffer_init_function (vm, fl, bi, n_this_chunk); } return n_alloc; } always_inline uword copy_alignment (u32 * x) -{ return (pointer_to_uword (x) / sizeof (x[0])) % BUFFERS_PER_COPY; } +{ + return (pointer_to_uword (x) / sizeof (x[0])) % BUFFERS_PER_COPY; +} static u32 alloc_from_free_list (vlib_main_t * vm, vlib_buffer_free_list_t * free_list, - u32 * alloc_buffers, - u32 n_alloc_buffers) + u32 * alloc_buffers, u32 n_alloc_buffers) { - u32 * dst, * u_src; + u32 *dst, *u_src; uword u_len, n_left; uword n_unaligned_start, n_unaligned_end, n_filled; - ASSERT(os_get_cpu_number() == 0); + ASSERT (os_get_cpu_number () == 0); n_left = n_alloc_buffers; dst = alloc_buffers; @@ -666,7 +673,7 @@ alloc_from_free_list (vlib_main_t * vm, n_filled = fill_free_list (vm, free_list, n_alloc_buffers); if (n_filled == 0) return 0; - + n_left = n_filled < n_left ? n_filled : n_left; n_alloc_buffers = n_left; @@ -704,11 +711,12 @@ alloc_from_free_list (vlib_main_t * vm, /* Aligned copy. */ { - vlib_copy_unit_t * d, * s; + vlib_copy_unit_t *d, *s; uword n_copy; - if (vec_len(free_list->aligned_buffers) < ((n_left/BUFFERS_PER_COPY)*BUFFERS_PER_COPY)) - abort(); + if (vec_len (free_list->aligned_buffers) < + ((n_left / BUFFERS_PER_COPY) * BUFFERS_PER_COPY)) + abort (); n_copy = n_left / BUFFERS_PER_COPY; n_left = n_left % BUFFERS_PER_COPY; @@ -751,15 +759,14 @@ alloc_from_free_list (vlib_main_t * vm, u_len--; } - if (! free_list->unaligned_buffers) + if (!free_list->unaligned_buffers) ASSERT (u_len == 0); else _vec_len (free_list->unaligned_buffers) = u_len; /* Verify that buffers are known free. */ vlib_buffer_validate_alloc_free (vm, alloc_buffers, - n_alloc_buffers, - VLIB_BUFFER_KNOWN_FREE); + n_alloc_buffers, VLIB_BUFFER_KNOWN_FREE); return n_alloc_buffers; } @@ -767,10 +774,11 @@ alloc_from_free_list (vlib_main_t * vm, /* Allocate a given number of buffers into given array. Returns number actually allocated which will be either zero or number requested. */ -u32 vlib_buffer_alloc (vlib_main_t * vm, u32 * buffers, u32 n_buffers) +u32 +vlib_buffer_alloc (vlib_main_t * vm, u32 * buffers, u32 n_buffers) { - vlib_buffer_main_t * bm = vm->buffer_main; - ASSERT(os_get_cpu_number() == 0); + vlib_buffer_main_t *bm = vm->buffer_main; + ASSERT (os_get_cpu_number () == 0); return alloc_from_free_list (vm, @@ -779,89 +787,92 @@ u32 vlib_buffer_alloc (vlib_main_t * vm, u32 * buffers, u32 n_buffers) buffers, n_buffers); } -u32 vlib_buffer_alloc_from_free_list (vlib_main_t * vm, - u32 * buffers, - u32 n_buffers, - u32 free_list_index) +u32 +vlib_buffer_alloc_from_free_list (vlib_main_t * vm, + u32 * buffers, + u32 n_buffers, u32 free_list_index) { - vlib_buffer_main_t * bm = vm->buffer_main; - vlib_buffer_free_list_t * f; + vlib_buffer_main_t *bm = vm->buffer_main; + vlib_buffer_free_list_t *f; f = pool_elt_at_index (bm->buffer_free_list_pool, free_list_index); return alloc_from_free_list (vm, f, buffers, n_buffers); } always_inline void add_buffer_to_free_list (vlib_main_t * vm, - vlib_buffer_free_list_t * f, + vlib_buffer_free_list_t * f, u32 buffer_index, u8 do_init) { - vlib_buffer_t * b; + vlib_buffer_t *b; b = vlib_get_buffer (vm, buffer_index); - if (PREDICT_TRUE(do_init)) - vlib_buffer_init_for_free_list (b, f); - vec_add1_aligned (f->aligned_buffers, buffer_index, sizeof (vlib_copy_unit_t)); + if (PREDICT_TRUE (do_init)) + vlib_buffer_init_for_free_list (b, f); + vec_add1_aligned (f->aligned_buffers, buffer_index, + sizeof (vlib_copy_unit_t)); } always_inline vlib_buffer_free_list_t * buffer_get_free_list (vlib_main_t * vm, vlib_buffer_t * b, u32 * index) { - vlib_buffer_main_t * bm = vm->buffer_main; + vlib_buffer_main_t *bm = vm->buffer_main; u32 i; *index = i = b->free_list_index; return pool_elt_at_index (bm->buffer_free_list_pool, i); } -void *vlib_set_buffer_free_callback (vlib_main_t *vm, void *fp) +void * +vlib_set_buffer_free_callback (vlib_main_t * vm, void *fp) { - vlib_buffer_main_t * bm = vm->buffer_main; - void * rv = bm->buffer_free_callback; + vlib_buffer_main_t *bm = vm->buffer_main; + void *rv = bm->buffer_free_callback; bm->buffer_free_callback = fp; return rv; } void vnet_buffer_free_dpdk_mb (vlib_buffer_t * b) __attribute__ ((weak)); -void vnet_buffer_free_dpdk_mb (vlib_buffer_t * b) { } +void +vnet_buffer_free_dpdk_mb (vlib_buffer_t * b) +{ +} static_always_inline void vlib_buffer_free_inline (vlib_main_t * vm, - u32 * buffers, - u32 n_buffers, - u32 follow_buffer_next) + u32 * buffers, u32 n_buffers, u32 follow_buffer_next) { - vlib_buffer_main_t * bm = vm->buffer_main; - vlib_buffer_free_list_t * fl; - static u32 * next_to_free[2]; /* smp bad */ - u32 i_next_to_free, * b, * n, * f, fi; + vlib_buffer_main_t *bm = vm->buffer_main; + vlib_buffer_free_list_t *fl; + static u32 *next_to_free[2]; /* smp bad */ + u32 i_next_to_free, *b, *n, *f, fi; uword n_left; int i; - static vlib_buffer_free_list_t ** announce_list; - vlib_buffer_free_list_t * fl0 = 0, * fl1 = 0; - u32 bi0=(u32)~0, bi1=(u32)~0, fi0, fi1 = (u32)~0; - u8 free0, free1=0, free_next0, free_next1; - u32 (*cb)(vlib_main_t * vm, u32 * buffers, u32 n_buffers, - u32 follow_buffer_next); - - ASSERT(os_get_cpu_number() == 0); - + static vlib_buffer_free_list_t **announce_list; + vlib_buffer_free_list_t *fl0 = 0, *fl1 = 0; + u32 bi0 = (u32) ~ 0, bi1 = (u32) ~ 0, fi0, fi1 = (u32) ~ 0; + u8 free0, free1 = 0, free_next0, free_next1; + u32 (*cb) (vlib_main_t * vm, u32 * buffers, u32 n_buffers, + u32 follow_buffer_next); + + ASSERT (os_get_cpu_number () == 0); + cb = bm->buffer_free_callback; if (PREDICT_FALSE (cb != 0)) - n_buffers = (*cb)(vm, buffers, n_buffers, follow_buffer_next); + n_buffers = (*cb) (vm, buffers, n_buffers, follow_buffer_next); - if (! n_buffers) + if (!n_buffers) return; /* Use first buffer to get default free list. */ { u32 bi0 = buffers[0]; - vlib_buffer_t * b0; + vlib_buffer_t *b0; b0 = vlib_get_buffer (vm, bi0); fl = buffer_get_free_list (vm, b0, &fi); if (fl->buffers_added_to_freelist_function) - vec_add1 (announce_list, fl); + vec_add1 (announce_list, fl); } vec_validate (next_to_free[0], n_buffers - 1); @@ -871,11 +882,10 @@ vlib_buffer_free_inline (vlib_main_t * vm, n_left = n_buffers; b = buffers; - again: +again: /* Verify that buffers are known allocated. */ vlib_buffer_validate_alloc_free (vm, b, - n_left, - VLIB_BUFFER_KNOWN_ALLOCATED); + n_left, VLIB_BUFFER_KNOWN_ALLOCATED); vec_add2_aligned (fl->aligned_buffers, f, n_left, /* align */ sizeof (vlib_copy_unit_t)); @@ -883,7 +893,7 @@ vlib_buffer_free_inline (vlib_main_t * vm, n = next_to_free[i_next_to_free]; while (n_left >= 4) { - vlib_buffer_t * b0, * b1, * binit0, * binit1, dummy_buffers[2]; + vlib_buffer_t *b0, *b1, *binit0, *binit1, dummy_buffers[2]; bi0 = b[0]; bi1 = b[1]; @@ -942,23 +952,23 @@ vlib_buffer_free_inline (vlib_main_t * vm, fl1 = pool_elt_at_index (bm->buffer_free_list_pool, fi1); add_buffer_to_free_list (vm, fl0, bi0, free0); - if (PREDICT_FALSE(fl0->buffers_added_to_freelist_function != 0)) - { - int i; - for (i = 0; i < vec_len (announce_list); i++) - if (fl0 == announce_list[i]) - goto no_fl0; - vec_add1(announce_list, fl0); - } + if (PREDICT_FALSE (fl0->buffers_added_to_freelist_function != 0)) + { + int i; + for (i = 0; i < vec_len (announce_list); i++) + if (fl0 == announce_list[i]) + goto no_fl0; + vec_add1 (announce_list, fl0); + } no_fl0: - if (PREDICT_FALSE(fl1->buffers_added_to_freelist_function != 0)) - { - int i; - for (i = 0; i < vec_len (announce_list); i++) - if (fl1 == announce_list[i]) - goto no_fl1; - vec_add1(announce_list, fl1); - } + if (PREDICT_FALSE (fl1->buffers_added_to_freelist_function != 0)) + { + int i; + for (i = 0; i < vec_len (announce_list); i++) + if (fl1 == announce_list[i]) + goto no_fl1; + vec_add1 (announce_list, fl1); + } no_fl1: add_buffer_to_free_list (vm, fl1, bi1, free1); @@ -976,7 +986,7 @@ vlib_buffer_free_inline (vlib_main_t * vm, while (n_left >= 1) { - vlib_buffer_t * b0, * binit0, dummy_buffers[1]; + vlib_buffer_t *b0, *binit0, dummy_buffers[1]; bi0 = b[0]; f[0] = bi0; @@ -1019,15 +1029,15 @@ vlib_buffer_free_inline (vlib_main_t * vm, fl0 = pool_elt_at_index (bm->buffer_free_list_pool, fi0); add_buffer_to_free_list (vm, fl0, bi0, free0); - if (PREDICT_FALSE(fl0->buffers_added_to_freelist_function != 0)) - { - int i; - for (i = 0; i < vec_len (announce_list); i++) - if (fl0 == announce_list[i]) - goto no_fl00; - vec_add1(announce_list, fl0); - } - + if (PREDICT_FALSE (fl0->buffers_added_to_freelist_function != 0)) + { + int i; + for (i = 0; i < vec_len (announce_list); i++) + if (fl0 == announce_list[i]) + goto no_fl00; + vec_add1 (announce_list, fl0); + } + no_fl00: fi = fi0; fl = pool_elt_at_index (bm->buffer_free_list_pool, fi); @@ -1045,62 +1055,63 @@ vlib_buffer_free_inline (vlib_main_t * vm, _vec_len (fl->aligned_buffers) = f - fl->aligned_buffers; - if (vec_len(announce_list)) + if (vec_len (announce_list)) { - vlib_buffer_free_list_t * fl; + vlib_buffer_free_list_t *fl; for (i = 0; i < vec_len (announce_list); i++) - { - fl = announce_list[i]; - fl->buffers_added_to_freelist_function (vm, fl); - } - _vec_len(announce_list) = 0; + { + fl = announce_list[i]; + fl->buffers_added_to_freelist_function (vm, fl); + } + _vec_len (announce_list) = 0; } } -void vlib_buffer_free (vlib_main_t * vm, - u32 * buffers, - u32 n_buffers) +void +vlib_buffer_free (vlib_main_t * vm, u32 * buffers, u32 n_buffers) { - vlib_buffer_free_inline (vm, buffers, n_buffers, /* follow_buffer_next */ 1); + vlib_buffer_free_inline (vm, buffers, n_buffers, /* follow_buffer_next */ + 1); } -void vlib_buffer_free_no_next (vlib_main_t * vm, - u32 * buffers, - u32 n_buffers) +void +vlib_buffer_free_no_next (vlib_main_t * vm, u32 * buffers, u32 n_buffers) { - vlib_buffer_free_inline (vm, buffers, n_buffers, /* follow_buffer_next */ 0); + vlib_buffer_free_inline (vm, buffers, n_buffers, /* follow_buffer_next */ + 0); } /* Copy template packet data into buffers as they are allocated. */ static void vlib_packet_template_buffer_init (vlib_main_t * vm, vlib_buffer_free_list_t * fl, - u32 * buffers, - u32 n_buffers) + u32 * buffers, u32 n_buffers) { - vlib_packet_template_t * t = uword_to_pointer (fl->buffer_init_function_opaque, - vlib_packet_template_t *); + vlib_packet_template_t *t = + uword_to_pointer (fl->buffer_init_function_opaque, + vlib_packet_template_t *); uword i; for (i = 0; i < n_buffers; i++) { - vlib_buffer_t * b = vlib_get_buffer (vm, buffers[i]); + vlib_buffer_t *b = vlib_get_buffer (vm, buffers[i]); ASSERT (b->current_length == vec_len (t->packet_data)); - clib_memcpy (vlib_buffer_get_current (b), t->packet_data, b->current_length); + clib_memcpy (vlib_buffer_get_current (b), t->packet_data, + b->current_length); } } -void vlib_packet_template_init (vlib_main_t * vm, - vlib_packet_template_t * t, - void * packet_data, - uword n_packet_data_bytes, - uword min_n_buffers_each_physmem_alloc, - char * fmt, - ...) +void +vlib_packet_template_init (vlib_main_t * vm, + vlib_packet_template_t * t, + void *packet_data, + uword n_packet_data_bytes, + uword min_n_buffers_each_physmem_alloc, + char *fmt, ...) { - vlib_buffer_free_list_t * fl; + vlib_buffer_free_list_t *fl; va_list va; - u8 * name; + u8 *name; va_start (va, fmt); name = va_format (0, fmt, &va); @@ -1130,12 +1141,11 @@ void vlib_packet_template_init (vlib_main_t * vm, } void * -vlib_packet_template_get_packet (vlib_main_t * vm, - vlib_packet_template_t * t, - u32 * bi_result) +vlib_packet_template_get_packet (vlib_main_t * vm, + vlib_packet_template_t * t, u32 * bi_result) { u32 bi; - vlib_buffer_t * b; + vlib_buffer_t *b; if (vlib_buffer_alloc (vm, &bi, 1) != 1) return 0; @@ -1144,13 +1154,15 @@ vlib_packet_template_get_packet (vlib_main_t * vm, b = vlib_get_buffer (vm, bi); clib_memcpy (vlib_buffer_get_current (b), - t->packet_data, vec_len(t->packet_data)); - b->current_length = vec_len(t->packet_data); + t->packet_data, vec_len (t->packet_data)); + b->current_length = vec_len (t->packet_data); return b->data; } -void vlib_packet_template_get_packet_helper (vlib_main_t * vm, vlib_packet_template_t * t) +void +vlib_packet_template_get_packet_helper (vlib_main_t * vm, + vlib_packet_template_t * t) { word n = t->min_n_buffers_each_physmem_alloc; word l = vec_len (t->packet_data); @@ -1166,14 +1178,14 @@ void vlib_packet_template_get_packet_helper (vlib_main_t * vm, vlib_packet_templ } /* Append given data to end of buffer, possibly allocating new buffers. */ -u32 vlib_buffer_add_data (vlib_main_t * vm, - u32 free_list_index, - u32 buffer_index, - void * data, u32 n_data_bytes) +u32 +vlib_buffer_add_data (vlib_main_t * vm, + u32 free_list_index, + u32 buffer_index, void *data, u32 n_data_bytes) { u32 n_buffer_bytes, n_left, n_left_this_buffer, bi; - vlib_buffer_t * b; - void * d; + vlib_buffer_t *b; + void *d; bi = buffer_index; if (bi == 0 @@ -1183,11 +1195,11 @@ u32 vlib_buffer_add_data (vlib_main_t * vm, d = data; n_left = n_data_bytes; n_buffer_bytes = vlib_buffer_free_list_buffer_size (vm, free_list_index); - + b = vlib_get_buffer (vm, bi); b->flags &= ~VLIB_BUFFER_TOTAL_LENGTH_VALID; - /* Get to the end of the chain before we try to append data...*/ + /* Get to the end of the chain before we try to append data... */ while (b->flags & VLIB_BUFFER_NEXT_PRESENT) b = vlib_get_buffer (vm, b->next_buffer); @@ -1196,7 +1208,8 @@ u32 vlib_buffer_add_data (vlib_main_t * vm, u32 n; ASSERT (n_buffer_bytes >= b->current_length); - n_left_this_buffer = n_buffer_bytes - (b->current_data + b->current_length); + n_left_this_buffer = + n_buffer_bytes - (b->current_data + b->current_length); n = clib_min (n_left_this_buffer, n_left); clib_memcpy (vlib_buffer_get_current (b) + b->current_length, d, n); b->current_length += n; @@ -1205,7 +1218,9 @@ u32 vlib_buffer_add_data (vlib_main_t * vm, break; d += n; - if (1 != vlib_buffer_alloc_from_free_list (vm, &b->next_buffer, 1, free_list_index)) + if (1 != + vlib_buffer_alloc_from_free_list (vm, &b->next_buffer, 1, + free_list_index)) goto out_of_buffers; b->flags |= VLIB_BUFFER_NEXT_PRESENT; @@ -1215,68 +1230,81 @@ u32 vlib_buffer_add_data (vlib_main_t * vm, return bi; - out_of_buffers: +out_of_buffers: clib_error ("out of buffers"); return bi; } u16 -vlib_buffer_chain_append_data_with_alloc(vlib_main_t *vm, - u32 free_list_index, - vlib_buffer_t *first, - vlib_buffer_t **last, - void * data, u16 data_len) { +vlib_buffer_chain_append_data_with_alloc (vlib_main_t * vm, + u32 free_list_index, + vlib_buffer_t * first, + vlib_buffer_t ** last, + void *data, u16 data_len) +{ vlib_buffer_t *l = *last; - u32 n_buffer_bytes = vlib_buffer_free_list_buffer_size (vm, free_list_index); + u32 n_buffer_bytes = + vlib_buffer_free_list_buffer_size (vm, free_list_index); u16 copied = 0; - ASSERT(n_buffer_bytes >= l->current_length + l->current_data); - while (data_len) { - u16 max = n_buffer_bytes - l->current_length - l->current_data; - if (max == 0) { - if (1 != vlib_buffer_alloc_from_free_list (vm, &l->next_buffer, 1, free_list_index)) - return copied; - *last = l = vlib_buffer_chain_buffer(vm, first, l, l->next_buffer); - max = n_buffer_bytes - l->current_length - l->current_data; - } + ASSERT (n_buffer_bytes >= l->current_length + l->current_data); + while (data_len) + { + u16 max = n_buffer_bytes - l->current_length - l->current_data; + if (max == 0) + { + if (1 != + vlib_buffer_alloc_from_free_list (vm, &l->next_buffer, 1, + free_list_index)) + return copied; + *last = l = vlib_buffer_chain_buffer (vm, first, l, l->next_buffer); + max = n_buffer_bytes - l->current_length - l->current_data; + } - u16 len = (data_len > max)?max:data_len; - clib_memcpy(vlib_buffer_get_current (l) + l->current_length, data + copied, len); - vlib_buffer_chain_increase_length(first, l, len); - data_len -= len; - copied += len; - } + u16 len = (data_len > max) ? max : data_len; + clib_memcpy (vlib_buffer_get_current (l) + l->current_length, + data + copied, len); + vlib_buffer_chain_increase_length (first, l, len); + data_len -= len; + copied += len; + } return copied; } /* * Fills in the required rte_mbuf fields for chained buffers given a VLIB chain. */ -void vlib_buffer_chain_validate (vlib_main_t * vm, vlib_buffer_t * b_first) +void +vlib_buffer_chain_validate (vlib_main_t * vm, vlib_buffer_t * b_first) { return; } -static void vlib_serialize_tx (serialize_main_header_t * m, serialize_stream_t * s) +static void +vlib_serialize_tx (serialize_main_header_t * m, serialize_stream_t * s) { - vlib_main_t * vm; - vlib_serialize_buffer_main_t * sm; + vlib_main_t *vm; + vlib_serialize_buffer_main_t *sm; uword n, n_bytes_to_write; - vlib_buffer_t * last; + vlib_buffer_t *last; n_bytes_to_write = s->current_buffer_index; - sm = uword_to_pointer (s->data_function_opaque, vlib_serialize_buffer_main_t *); + sm = + uword_to_pointer (s->data_function_opaque, + vlib_serialize_buffer_main_t *); vm = sm->vlib_main; ASSERT (sm->tx.max_n_data_bytes_per_chain > 0); if (serialize_stream_is_end_of_stream (s) - || sm->tx.n_total_data_bytes + n_bytes_to_write > sm->tx.max_n_data_bytes_per_chain) + || sm->tx.n_total_data_bytes + n_bytes_to_write > + sm->tx.max_n_data_bytes_per_chain) { - vlib_process_t * p = vlib_get_current_process (vm); + vlib_process_t *p = vlib_get_current_process (vm); last = vlib_get_buffer (vm, sm->last_buffer); last->current_length = n_bytes_to_write; - vlib_set_next_frame_buffer (vm, &p->node_runtime, sm->tx.next_index, sm->first_buffer); + vlib_set_next_frame_buffer (vm, &p->node_runtime, sm->tx.next_index, + sm->first_buffer); sm->first_buffer = sm->last_buffer = ~0; sm->tx.n_total_data_bytes = 0; @@ -1286,19 +1314,28 @@ static void vlib_serialize_tx (serialize_main_header_t * m, serialize_stream_t * { ASSERT (sm->first_buffer == ~0); ASSERT (sm->last_buffer == ~0); - n = vlib_buffer_alloc_from_free_list (vm, &sm->first_buffer, 1, sm->tx.free_list_index); + n = + vlib_buffer_alloc_from_free_list (vm, &sm->first_buffer, 1, + sm->tx.free_list_index); if (n != 1) - serialize_error (m, clib_error_create ("vlib_buffer_alloc_from_free_list fails")); + serialize_error (m, + clib_error_create + ("vlib_buffer_alloc_from_free_list fails")); sm->last_buffer = sm->first_buffer; - s->n_buffer_bytes = vlib_buffer_free_list_buffer_size (vm, sm->tx.free_list_index); + s->n_buffer_bytes = + vlib_buffer_free_list_buffer_size (vm, sm->tx.free_list_index); } if (n_bytes_to_write > 0) { - vlib_buffer_t * prev = vlib_get_buffer (vm, sm->last_buffer); - n = vlib_buffer_alloc_from_free_list (vm, &sm->last_buffer, 1, sm->tx.free_list_index); + vlib_buffer_t *prev = vlib_get_buffer (vm, sm->last_buffer); + n = + vlib_buffer_alloc_from_free_list (vm, &sm->last_buffer, 1, + sm->tx.free_list_index); if (n != 1) - serialize_error (m, clib_error_create ("vlib_buffer_alloc_from_free_list fails")); + serialize_error (m, + clib_error_create + ("vlib_buffer_alloc_from_free_list fails")); sm->tx.n_total_data_bytes += n_bytes_to_write; prev->current_length = n_bytes_to_write; prev->next_buffer = sm->last_buffer; @@ -1314,13 +1351,16 @@ static void vlib_serialize_tx (serialize_main_header_t * m, serialize_stream_t * } } -static void vlib_serialize_rx (serialize_main_header_t * m, serialize_stream_t * s) +static void +vlib_serialize_rx (serialize_main_header_t * m, serialize_stream_t * s) { - vlib_main_t * vm; - vlib_serialize_buffer_main_t * sm; - vlib_buffer_t * last; + vlib_main_t *vm; + vlib_serialize_buffer_main_t *sm; + vlib_buffer_t *last; - sm = uword_to_pointer (s->data_function_opaque, vlib_serialize_buffer_main_t *); + sm = + uword_to_pointer (s->data_function_opaque, + vlib_serialize_buffer_main_t *); vm = sm->vlib_main; if (serialize_stream_is_end_of_stream (s)) @@ -1343,8 +1383,11 @@ static void vlib_serialize_rx (serialize_main_header_t * m, serialize_stream_t * { while (clib_fifo_elts (sm->rx.buffer_fifo) == 0) { - sm->rx.ready_one_time_event = vlib_process_create_one_time_event (vm, vlib_current_process (vm), ~0); - vlib_process_wait_for_one_time_event (vm, /* no event data */ 0, sm->rx.ready_one_time_event); + sm->rx.ready_one_time_event = + vlib_process_create_one_time_event (vm, vlib_current_process (vm), + ~0); + vlib_process_wait_for_one_time_event (vm, /* no event data */ 0, + sm->rx.ready_one_time_event); } clib_fifo_sub1 (sm->rx.buffer_fifo, sm->first_buffer); @@ -1362,12 +1405,11 @@ static void vlib_serialize_rx (serialize_main_header_t * m, serialize_stream_t * static void serialize_open_vlib_helper (serialize_main_t * m, vlib_main_t * vm, - vlib_serialize_buffer_main_t * sm, - uword is_read) + vlib_serialize_buffer_main_t * sm, uword is_read) { /* Initialize serialize main but save overflow buffer for re-use between calls. */ { - u8 * save = m->stream.overflow_buffer; + u8 *save = m->stream.overflow_buffer; memset (m, 0, sizeof (m[0])); m->stream.overflow_buffer = save; if (save) @@ -1384,18 +1426,28 @@ serialize_open_vlib_helper (serialize_main_t * m, m->stream.data_function_opaque = pointer_to_uword (sm); } -void serialize_open_vlib_buffer (serialize_main_t * m, vlib_main_t * vm, vlib_serialize_buffer_main_t * sm) -{ serialize_open_vlib_helper (m, vm, sm, /* is_read */ 0); } +void +serialize_open_vlib_buffer (serialize_main_t * m, vlib_main_t * vm, + vlib_serialize_buffer_main_t * sm) +{ + serialize_open_vlib_helper (m, vm, sm, /* is_read */ 0); +} -void unserialize_open_vlib_buffer (serialize_main_t * m, vlib_main_t * vm, vlib_serialize_buffer_main_t * sm) -{ serialize_open_vlib_helper (m, vm, sm, /* is_read */ 1); } +void +unserialize_open_vlib_buffer (serialize_main_t * m, vlib_main_t * vm, + vlib_serialize_buffer_main_t * sm) +{ + serialize_open_vlib_helper (m, vm, sm, /* is_read */ 1); +} -u32 serialize_close_vlib_buffer (serialize_main_t * m) +u32 +serialize_close_vlib_buffer (serialize_main_t * m) { - vlib_serialize_buffer_main_t * sm - = uword_to_pointer (m->stream.data_function_opaque, vlib_serialize_buffer_main_t *); - vlib_buffer_t * last; - serialize_stream_t * s = &m->stream; + vlib_serialize_buffer_main_t *sm + = uword_to_pointer (m->stream.data_function_opaque, + vlib_serialize_buffer_main_t *); + vlib_buffer_t *last; + serialize_stream_t *s = &m->stream; last = vlib_get_buffer (sm->vlib_main, sm->last_buffer); last->current_length = s->current_buffer_index; @@ -1413,10 +1465,12 @@ u32 serialize_close_vlib_buffer (serialize_main_t * m) return sm->first_buffer; } -void unserialize_close_vlib_buffer (serialize_main_t * m) +void +unserialize_close_vlib_buffer (serialize_main_t * m) { - vlib_serialize_buffer_main_t * sm - = uword_to_pointer (m->stream.data_function_opaque, vlib_serialize_buffer_main_t *); + vlib_serialize_buffer_main_t *sm + = uword_to_pointer (m->stream.data_function_opaque, + vlib_serialize_buffer_main_t *); if (sm->first_buffer != ~0) vlib_buffer_free_one (sm->vlib_main, sm->first_buffer); clib_fifo_reset (sm->rx.buffer_fifo); @@ -1424,14 +1478,16 @@ void unserialize_close_vlib_buffer (serialize_main_t * m) _vec_len (m->stream.overflow_buffer) = 0; } -static u8 * format_vlib_buffer_free_list (u8 * s, va_list * va) +static u8 * +format_vlib_buffer_free_list (u8 * s, va_list * va) { - vlib_buffer_free_list_t * f = va_arg (*va, vlib_buffer_free_list_t *); + vlib_buffer_free_list_t *f = va_arg (*va, vlib_buffer_free_list_t *); uword bytes_alloc, bytes_free, n_free, size; - if (! f) + if (!f) return format (s, "%=30s%=12s%=12s%=12s%=12s%=12s%=12s", - "Name", "Index", "Size", "Alloc", "Free", "#Alloc", "#Free"); + "Name", "Index", "Size", "Alloc", "Free", "#Alloc", + "#Free"); size = sizeof (vlib_buffer_t) + f->n_data_bytes; n_free = vec_len (f->aligned_buffers) + vec_len (f->unaligned_buffers); @@ -1441,30 +1497,40 @@ static u8 * format_vlib_buffer_free_list (u8 * s, va_list * va) s = format (s, "%30s%12d%12d%=12U%=12U%=12d%=12d", f->name, f->index, f->n_data_bytes, format_memory_size, bytes_alloc, - format_memory_size, bytes_free, - f->n_alloc, n_free); + format_memory_size, bytes_free, f->n_alloc, n_free); return s; } static clib_error_t * show_buffers (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { - vlib_buffer_main_t * bm = vm->buffer_main; - vlib_buffer_free_list_t * f; + vlib_buffer_main_t *bm = vm->buffer_main; + vlib_buffer_free_list_t *f; vlib_cli_output (vm, "%U", format_vlib_buffer_free_list, 0); + /* *INDENT-OFF* */ pool_foreach (f, bm->buffer_free_list_pool, ({ vlib_cli_output (vm, "%U", format_vlib_buffer_free_list, f); })); +/* *INDENT-ON* */ return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (show_buffers_command, static) = { .path = "show buffers", .short_help = "Show packet buffer allocation", .function = show_buffers, }; +/* *INDENT-ON* */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/buffer.h b/vlib/vlib/buffer.h index bc799bc6223..e47554660ed 100644 --- a/vlib/vlib/buffer.h +++ b/vlib/vlib/buffer.h @@ -51,7 +51,7 @@ #define VLIB_BUFFER_DATA_SIZE (2048) #define VLIB_BUFFER_PRE_DATA_SIZE RTE_PKTMBUF_HEADROOM #else -#include <vlib/config.h> /* for __PRE_DATA_SIZE */ +#include <vlib/config.h> /* for __PRE_DATA_SIZE */ #define VLIB_BUFFER_DATA_SIZE (512) #define VLIB_BUFFER_PRE_DATA_SIZE __PRE_DATA_SIZE #endif @@ -65,23 +65,24 @@ typedef u64 vlib_copy_unit_t; /** \file vlib buffer structure definition and a few select access methods. This structure and the buffer allocation - mechanism should perhaps live in vnet, but it would take a lot + mechanism should perhaps live in vnet, but it would take a lot of typing to make it so. */ - + /* VLIB buffer representation. */ -typedef struct { - CLIB_CACHE_LINE_ALIGN_MARK(cacheline0); +typedef struct +{ + CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); /* Offset within data[] that we are currently processing. - If negative current header points into predata area. */ - i16 current_data; /**< signed offset in data[], pre_data[] + If negative current header points into predata area. */ + i16 current_data; /**< signed offset in data[], pre_data[] that we are currently processing. If negative current header points into predata area. */ - u16 current_length; /**< Nbytes between current data and + u16 current_length; /**< Nbytes between current data and the end of this buffer. */ - u32 flags; /**< buffer flags: + u32 flags; /**< buffer flags: <br> VLIB_BUFFER_IS_TRACED: trace this buffer. <br> VLIB_BUFFER_NEXT_PRESENT: this is a multi-chunk buffer. <br> VLIB_BUFFER_TOTAL_LENGTH_VALID: as it says @@ -91,31 +92,31 @@ typedef struct { */ #define VLIB_BUFFER_IS_TRACED (1 << 0) #define VLIB_BUFFER_LOG2_NEXT_PRESENT (1) -#define VLIB_BUFFER_NEXT_PRESENT (1 << VLIB_BUFFER_LOG2_NEXT_PRESENT) -#define VLIB_BUFFER_IS_RECYCLED (1 << 2) +#define VLIB_BUFFER_NEXT_PRESENT (1 << VLIB_BUFFER_LOG2_NEXT_PRESENT) +#define VLIB_BUFFER_IS_RECYCLED (1 << 2) #define VLIB_BUFFER_TOTAL_LENGTH_VALID (1 << 3) -#define VLIB_BUFFER_REPL_FAIL (1 << 4) +#define VLIB_BUFFER_REPL_FAIL (1 << 4) #define VLIB_BUFFER_RECYCLE (1 << 5) /* User defined buffer flags. */ #define LOG2_VLIB_BUFFER_FLAG_USER(n) (32 - (n)) #define VLIB_BUFFER_FLAG_USER(n) (1 << LOG2_VLIB_BUFFER_FLAG_USER(n)) - u32 free_list_index; /**< Buffer free list that this buffer was - allocated from and will be freed to. + u32 free_list_index; /**< Buffer free list that this buffer was + allocated from and will be freed to. */ - u32 total_length_not_including_first_buffer; + u32 total_length_not_including_first_buffer; /**< Only valid for first buffer in chain. Current length plus total length given here give total number of bytes in buffer chain. */ u32 next_buffer; /**< Next buffer for this linked-list of buffers. - Only valid if VLIB_BUFFER_NEXT_PRESENT flag is set. + Only valid if VLIB_BUFFER_NEXT_PRESENT flag is set. */ - vlib_error_t error; /**< Error code for buffers to be enqueued - to error handler. + vlib_error_t error; /**< Error code for buffers to be enqueued + to error handler. */ u32 current_config_index; /**< Used by feature subgraph arcs to visit enabled feature nodes @@ -126,20 +127,20 @@ typedef struct { Before allocating any of it, discussion required! */ - u32 opaque[8]; /**< Opaque data used by sub-graphs for their own purposes. + u32 opaque[8]; /**< Opaque data used by sub-graphs for their own purposes. See .../vnet/vnet/buffer.h */ - CLIB_CACHE_LINE_ALIGN_MARK(cacheline1); + CLIB_CACHE_LINE_ALIGN_MARK (cacheline1); - u32 trace_index; /**< Specifies index into trace buffer - if VLIB_PACKET_IS_TRACED flag is set. + u32 trace_index; /**< Specifies index into trace buffer + if VLIB_PACKET_IS_TRACED flag is set. */ u32 recycle_count; /**< Used by L2 path recycle code */ u32 opaque2[14]; /**< More opaque data, currently unused */ /***** end of second cache line */ - CLIB_CACHE_LINE_ALIGN_MARK(cacheline2); - u8 pre_data [VLIB_BUFFER_PRE_DATA_SIZE]; /**< Space for inserting data + CLIB_CACHE_LINE_ALIGN_MARK (cacheline2); + u8 pre_data[VLIB_BUFFER_PRE_DATA_SIZE]; /**< Space for inserting data before buffer start. Packet rewrite string will be rewritten backwards and may extend @@ -148,7 +149,7 @@ typedef struct { */ u8 data[0]; /**< Packet data. Hardware DMA here */ -} vlib_buffer_t; /* Must be a multiple of 64B. */ +} vlib_buffer_t; /* Must be a multiple of 64B. */ #define VLIB_BUFFER_HDR_SIZE (sizeof(vlib_buffer_t) - VLIB_BUFFER_PRE_DATA_SIZE) @@ -163,7 +164,9 @@ typedef struct { always_inline vlib_buffer_t * vlib_buffer_next_contiguous (vlib_buffer_t * b, u32 buffer_bytes) -{ return (void *) (b + 1) + buffer_bytes; } +{ + return (void *) (b + 1) + buffer_bytes; +} always_inline void vlib_buffer_struct_is_sane (vlib_buffer_t * b) @@ -178,7 +181,7 @@ vlib_buffer_struct_is_sane (vlib_buffer_t * b) @param b - (vlib_buffer_t *) pointer to the buffer @return - (void *) (b->data + b->current_data) -*/ +*/ always_inline void * vlib_buffer_get_current (vlib_buffer_t * b) @@ -192,7 +195,7 @@ vlib_buffer_get_current (vlib_buffer_t * b) @param b - (vlib_buffer_t *) pointer to the buffer @param l - (word) signed increment -*/ +*/ always_inline void vlib_buffer_advance (vlib_buffer_t * b, word l) { @@ -221,7 +224,9 @@ vlib_buffer_reset (vlib_buffer_t * b) */ always_inline void * vlib_get_buffer_opaque (vlib_buffer_t * b) -{ return (void *) b->opaque; } +{ + return (void *) b->opaque; +} /** \brief Get pointer to buffer's opaque2 data array @@ -230,12 +235,15 @@ vlib_get_buffer_opaque (vlib_buffer_t * b) */ always_inline void * vlib_get_buffer_opaque2 (vlib_buffer_t * b) -{ return (void *) b->opaque2; } +{ + return (void *) b->opaque2; +} /* Forward declaration. */ struct vlib_main_t; -typedef struct vlib_buffer_free_list_t { +typedef struct vlib_buffer_free_list_t +{ /* Template buffer used to initialize first 16 bytes of buffers allocated on this free list. */ vlib_buffer_t buffer_init_template; @@ -257,76 +265,78 @@ typedef struct vlib_buffer_free_list_t { Aligned vectors always has naturally aligned vlib_copy_unit_t sized chunks of buffer indices. Unaligned vector has any left over. This is meant to speed up copy routines. */ - u32 * aligned_buffers, * unaligned_buffers; + u32 *aligned_buffers, *unaligned_buffers; /* Memory chunks allocated for this free list recorded here so they can be freed when free list is deleted. */ - void ** buffer_memory_allocated; + void **buffer_memory_allocated; /* Free list name. */ - u8 * name; + u8 *name; /* Callback functions to initialize newly allocated buffers. If null buffers are zeroed. */ - void (* buffer_init_function) (struct vlib_main_t * vm, - struct vlib_buffer_free_list_t * fl, - u32 * buffers, u32 n_buffers); + void (*buffer_init_function) (struct vlib_main_t * vm, + struct vlib_buffer_free_list_t * fl, + u32 * buffers, u32 n_buffers); /* Callback function to announce that buffers have been added to the freelist */ - void (* buffers_added_to_freelist_function) - (struct vlib_main_t * vm, - struct vlib_buffer_free_list_t * fl); + void (*buffers_added_to_freelist_function) + (struct vlib_main_t * vm, struct vlib_buffer_free_list_t * fl); uword buffer_init_function_opaque; } __attribute__ ((aligned (16))) vlib_buffer_free_list_t; -typedef struct { +typedef struct +{ /* Buffer free callback, for subversive activities */ - u32 (*buffer_free_callback) (struct vlib_main_t *vm, - u32 * buffers, - u32 n_buffers, - u32 follow_buffer_next); + u32 (*buffer_free_callback) (struct vlib_main_t * vm, + u32 * buffers, + u32 n_buffers, u32 follow_buffer_next); /* Pool of buffer free lists. Multiple free lists exist for packet generator which uses separate free lists for each packet stream --- so as to avoid initializing static data for each packet generated. */ - vlib_buffer_free_list_t * buffer_free_list_pool; + vlib_buffer_free_list_t *buffer_free_list_pool; #define VLIB_BUFFER_DEFAULT_FREE_LIST_INDEX (0) #define VLIB_BUFFER_DEFAULT_FREE_LIST_BYTES VLIB_BUFFER_DATA_SIZE /* Hash table mapping buffer size (rounded to next unit of sizeof (vlib_buffer_t)) to free list index. */ - uword * free_list_by_size; + uword *free_list_by_size; /* Hash table mapping buffer index into number 0 => allocated but free, 1 => allocated and not-free. If buffer index is not in hash table then this buffer has never been allocated. */ - uword * buffer_known_hash; + uword *buffer_known_hash; /* List of free-lists needing Blue Light Special announcements */ vlib_buffer_free_list_t **announce_list; /* Vector of rte_mempools per socket */ #if DPDK == 1 - struct rte_mempool ** pktmbuf_pools; + struct rte_mempool **pktmbuf_pools; #endif } vlib_buffer_main_t; -typedef struct { - struct vlib_main_t * vlib_main; +typedef struct +{ + struct vlib_main_t *vlib_main; u32 first_buffer, last_buffer; - union { - struct { + union + { + struct + { /* Total accumulated bytes in chain starting with first_buffer. */ u32 n_total_data_bytes; /* Max number of bytes to accumulate in chain starting with first_buffer. - As this limit is reached buffers are enqueued to next node. */ + As this limit is reached buffers are enqueued to next node. */ u32 max_n_data_bytes_per_chain; /* Next node to enqueue buffers to relative to current process node. */ @@ -336,9 +346,10 @@ typedef struct { u32 free_list_index; } tx; - struct { + struct + { /* CLIB fifo of buffer indices waiting to be unserialized. */ - u32 * buffer_fifo; + u32 *buffer_fifo; /* Event type used to signal that RX buffers have been added to fifo. */ uword ready_one_time_event; @@ -346,8 +357,11 @@ typedef struct { }; } vlib_serialize_buffer_main_t; -void serialize_open_vlib_buffer (serialize_main_t * m, struct vlib_main_t * vm, vlib_serialize_buffer_main_t * sm); -void unserialize_open_vlib_buffer (serialize_main_t * m, struct vlib_main_t * vm, vlib_serialize_buffer_main_t * sm); +void serialize_open_vlib_buffer (serialize_main_t * m, struct vlib_main_t *vm, + vlib_serialize_buffer_main_t * sm); +void unserialize_open_vlib_buffer (serialize_main_t * m, + struct vlib_main_t *vm, + vlib_serialize_buffer_main_t * sm); u32 serialize_close_vlib_buffer (serialize_main_t * m); void unserialize_close_vlib_buffer (serialize_main_t * m); @@ -356,10 +370,12 @@ void *vlib_set_buffer_free_callback (struct vlib_main_t *vm, void *fp); always_inline u32 serialize_vlib_buffer_n_bytes (serialize_main_t * m) { - serialize_stream_t * s = &m->stream; - vlib_serialize_buffer_main_t * sm - = uword_to_pointer (m->stream.data_function_opaque, vlib_serialize_buffer_main_t *); - return sm->tx.n_total_data_bytes + s->current_buffer_index + vec_len (s->overflow_buffer); + serialize_stream_t *s = &m->stream; + vlib_serialize_buffer_main_t *sm + = uword_to_pointer (m->stream.data_function_opaque, + vlib_serialize_buffer_main_t *); + return sm->tx.n_total_data_bytes + s->current_buffer_index + + vec_len (s->overflow_buffer); } #if DPDK > 0 @@ -371,16 +387,24 @@ serialize_vlib_buffer_n_bytes (serialize_main_t * m) */ /** \brief Compile time buffer trajectory tracing option - Turn this on if you run into "bad monkey" contexts, - and you want to know exactly which nodes they've visited... + Turn this on if you run into "bad monkey" contexts, + and you want to know exactly which nodes they've visited... See vlib/main.c... */ #define VLIB_BUFFER_TRACE_TRAJECTORY 0 #if VLIB_BUFFER_TRACE_TRAJECTORY > 0 #define VLIB_BUFFER_TRACE_TRAJECTORY_INIT(b) (b)->pre_data[0]=0 -#else +#else #define VLIB_BUFFER_TRACE_TRAJECTORY_INIT(b) #endif /* VLIB_BUFFER_TRACE_TRAJECTORY */ #endif /* included_vlib_buffer_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/buffer_funcs.h b/vlib/vlib/buffer_funcs.h index d3ad89eb5e1..8b80be16053 100644 --- a/vlib/vlib/buffer_funcs.h +++ b/vlib/vlib/buffer_funcs.h @@ -43,7 +43,7 @@ #include <vppinfra/hash.h> #if DPDK == 1 -#undef always_inline // dpdk and clib use conflicting always_inline macros. +#undef always_inline // dpdk and clib use conflicting always_inline macros. #include <rte_config.h> #include <rte_mbuf.h> @@ -64,12 +64,12 @@ @param vm - (vlib_main_t *) vlib main data structure pointer @param buffer_index - (u32) buffer index @return - (vlib_buffer_t *) buffer pointer -*/ +*/ always_inline vlib_buffer_t * vlib_get_buffer (vlib_main_t * vm, u32 buffer_index) { - return vlib_physmem_at_offset (&vm->physmem_main, ((uword)buffer_index) - << CLIB_LOG2_CACHE_LINE_BYTES); + return vlib_physmem_at_offset (&vm->physmem_main, ((uword) buffer_index) + << CLIB_LOG2_CACHE_LINE_BYTES); } /** \brief Translate buffer pointer into buffer index @@ -77,12 +77,12 @@ vlib_get_buffer (vlib_main_t * vm, u32 buffer_index) @param vm - (vlib_main_t *) vlib main data structure pointer @param b - (void *) buffer pointer @return - (u32) buffer index -*/ +*/ always_inline u32 -vlib_get_buffer_index (vlib_main_t * vm, void * p) +vlib_get_buffer_index (vlib_main_t * vm, void *p) { uword offset = vlib_physmem_offset_of (&vm->physmem_main, p); - ASSERT((offset % (1<<CLIB_LOG2_CACHE_LINE_BYTES)) == 0); + ASSERT ((offset % (1 << CLIB_LOG2_CACHE_LINE_BYTES)) == 0); return offset >> CLIB_LOG2_CACHE_LINE_BYTES; } @@ -91,23 +91,23 @@ vlib_get_buffer_index (vlib_main_t * vm, void * p) @param vm - (vlib_main_t *) vlib main data structure pointer @param b - (void *) buffer pointer @return - (vlib_buffer_t *) next buffer, or NULL -*/ +*/ always_inline vlib_buffer_t * vlib_get_next_buffer (vlib_main_t * vm, vlib_buffer_t * b) { return (b->flags & VLIB_BUFFER_NEXT_PRESENT - ? vlib_get_buffer (vm, b->next_buffer) - : 0); + ? vlib_get_buffer (vm, b->next_buffer) : 0); } -uword vlib_buffer_length_in_chain_slow_path (vlib_main_t * vm, vlib_buffer_t * b_first); +uword vlib_buffer_length_in_chain_slow_path (vlib_main_t * vm, + vlib_buffer_t * b_first); /** \brief Get length in bytes of the buffer chain @param vm - (vlib_main_t *) vlib main data structure pointer @param b - (void *) buffer pointer @return - (uword) length of buffer chain -*/ +*/ always_inline uword vlib_buffer_length_in_chain (vlib_main_t * vm, vlib_buffer_t * b) { @@ -124,11 +124,11 @@ vlib_buffer_length_in_chain (vlib_main_t * vm, vlib_buffer_t * b) @param vm - (vlib_main_t *) vlib main data structure pointer @param bi - (u32) buffer index @return - (uword) length of buffer chain -*/ +*/ always_inline uword vlib_buffer_index_length_in_chain (vlib_main_t * vm, u32 bi) { - vlib_buffer_t * b = vlib_get_buffer (vm, bi); + vlib_buffer_t *b = vlib_get_buffer (vm, bi); return vlib_buffer_length_in_chain (vm, b); } @@ -138,13 +138,13 @@ vlib_buffer_index_length_in_chain (vlib_main_t * vm, u32 bi) @param bi - (u32) buffer index @param contents - (u8 *) memory, <strong>must be large enough</strong> @return - (uword) length of buffer chain -*/ +*/ always_inline uword vlib_buffer_contents (vlib_main_t * vm, u32 buffer_index, u8 * contents) { uword content_len = 0; uword l; - vlib_buffer_t * b; + vlib_buffer_t *b; while (1) { @@ -152,7 +152,7 @@ vlib_buffer_contents (vlib_main_t * vm, u32 buffer_index, u8 * contents) l = b->current_length; clib_memcpy (contents + content_len, b->data + b->current_data, l); content_len += l; - if (! (b->flags & VLIB_BUFFER_NEXT_PRESENT)) + if (!(b->flags & VLIB_BUFFER_NEXT_PRESENT)) break; buffer_index = b->next_buffer; } @@ -165,9 +165,10 @@ always_inline u64 vlib_get_buffer_data_physical_address (vlib_main_t * vm, u32 buffer_index) { return vlib_physmem_offset_to_physical (&vm->physmem_main, - (((uword)buffer_index) << + (((uword) buffer_index) << CLIB_LOG2_CACHE_LINE_BYTES) + - STRUCT_OFFSET_OF (vlib_buffer_t, data)); + STRUCT_OFFSET_OF (vlib_buffer_t, + data)); } /** \brief Prefetch buffer metadata by buffer index @@ -208,7 +209,8 @@ do { \ #if DPDK == 0 -typedef enum { +typedef enum +{ /* Index is unknown. */ VLIB_BUFFER_UNKNOWN, @@ -220,10 +222,10 @@ typedef enum { always_inline vlib_buffer_known_state_t vlib_buffer_is_known (vlib_main_t * vm, u32 buffer_index) { - vlib_buffer_main_t * bm = vm->buffer_main; - ASSERT(os_get_cpu_number() == 0); + vlib_buffer_main_t *bm = vm->buffer_main; + ASSERT (os_get_cpu_number () == 0); - uword * p = hash_get (bm->buffer_known_hash, buffer_index); + uword *p = hash_get (bm->buffer_known_hash, buffer_index); return p ? p[0] : VLIB_BUFFER_UNKNOWN; } @@ -232,55 +234,56 @@ vlib_buffer_set_known_state (vlib_main_t * vm, u32 buffer_index, vlib_buffer_known_state_t state) { - vlib_buffer_main_t * bm = vm->buffer_main; - ASSERT(os_get_cpu_number() == 0); + vlib_buffer_main_t *bm = vm->buffer_main; + ASSERT (os_get_cpu_number () == 0); hash_set (bm->buffer_known_hash, buffer_index, state); } /* Validates sanity of a single buffer. Returns format'ed vector with error message if any. */ -u8 * vlib_validate_buffer (vlib_main_t * vm, u32 buffer_index, uword follow_chain); +u8 *vlib_validate_buffer (vlib_main_t * vm, u32 buffer_index, + uword follow_chain); /* Validate an array of buffers. As above. */ -u8 * vlib_validate_buffers (vlib_main_t * vm, - u32 * buffers, - uword next_buffer_stride, - uword n_buffers, - vlib_buffer_known_state_t known_state, - uword follow_chain); +u8 *vlib_validate_buffers (vlib_main_t * vm, + u32 * buffers, + uword next_buffer_stride, + uword n_buffers, + vlib_buffer_known_state_t known_state, + uword follow_chain); #endif /* DPDK == 0 */ -clib_error_t * -vlib_buffer_pool_create(vlib_main_t * vm, unsigned num_mbufs, - unsigned socket_id); +clib_error_t *vlib_buffer_pool_create (vlib_main_t * vm, unsigned num_mbufs, + unsigned socket_id); /** \brief Allocate buffers into supplied array @param vm - (vlib_main_t *) vlib main data structure pointer @param buffers - (u32 * ) buffer index array @param n_buffers - (u32) number of buffers requested - @return - (u32) number of buffers actually allocated, may be + @return - (u32) number of buffers actually allocated, may be less than the number requested or zero */ u32 vlib_buffer_alloc (vlib_main_t * vm, u32 * buffers, u32 n_buffers); always_inline u32 vlib_buffer_round_size (u32 size) -{ return round_pow2 (size, sizeof (vlib_buffer_t)); } +{ + return round_pow2 (size, sizeof (vlib_buffer_t)); +} /** \brief Allocate buffers from specific freelist into supplied array @param vm - (vlib_main_t *) vlib main data structure pointer @param buffers - (u32 * ) buffer index array @param n_buffers - (u32) number of buffers requested - @return - (u32) number of buffers actually allocated, may be + @return - (u32) number of buffers actually allocated, may be less than the number requested or zero */ u32 vlib_buffer_alloc_from_free_list (vlib_main_t * vm, u32 * buffers, - u32 n_buffers, - u32 free_list_index); + u32 n_buffers, u32 free_list_index); /** \brief Free buffers Frees the entire buffer chain for each buffer @@ -310,7 +313,7 @@ void vlib_buffer_free_no_next (vlib_main_t * vm, u32 n_buffers); /** \brief Free one buffer - Shorthand to free a single buffer chain. + Shorthand to free a single buffer chain. @param vm - (vlib_main_t *) vlib main data structure pointer @param buffer_index - (u32) buffer index to free @@ -322,17 +325,19 @@ vlib_buffer_free_one (vlib_main_t * vm, u32 buffer_index) } /* Add/delete buffer free lists. */ -u32 vlib_buffer_create_free_list (vlib_main_t * vm, u32 n_data_bytes, char * fmt, ...); +u32 vlib_buffer_create_free_list (vlib_main_t * vm, u32 n_data_bytes, + char *fmt, ...); void vlib_buffer_delete_free_list (vlib_main_t * vm, u32 free_list_index); /* Find already existing public free list with given size or create one. */ -u32 vlib_buffer_get_or_create_free_list (vlib_main_t * vm, u32 n_data_bytes, char * fmt, ...); +u32 vlib_buffer_get_or_create_free_list (vlib_main_t * vm, u32 n_data_bytes, + char *fmt, ...); always_inline vlib_buffer_free_list_t * vlib_buffer_get_free_list (vlib_main_t * vm, u32 free_list_index) { - vlib_buffer_main_t * bm = vm->buffer_main; - vlib_buffer_free_list_t * f; + vlib_buffer_main_t *bm = vm->buffer_main; + vlib_buffer_free_list_t *f; f = pool_elt_at_index (bm->buffer_free_list_pool, free_list_index); @@ -345,12 +350,12 @@ vlib_buffer_get_free_list (vlib_main_t * vm, u32 free_list_index) always_inline u32 vlib_buffer_free_list_buffer_size (vlib_main_t * vm, u32 free_list_index) { - vlib_buffer_free_list_t * f = vlib_buffer_get_free_list (vm, free_list_index); + vlib_buffer_free_list_t *f = + vlib_buffer_get_free_list (vm, free_list_index); return f->n_data_bytes; } -void -vlib_aligned_memcpy (void * _dst, void * _src, int n_bytes); +void vlib_aligned_memcpy (void *_dst, void *_src, int n_bytes); /* Reasonably fast buffer copy routine. */ always_inline void @@ -379,9 +384,12 @@ always_inline void * vlib_physmem_alloc_aligned (vlib_main_t * vm, clib_error_t ** error, uword n_bytes, uword alignment) { - void * r = vm->os_physmem_alloc_aligned (&vm->physmem_main, n_bytes, alignment); - if (! r) - *error = clib_error_return (0, "failed to allocate %wd bytes of I/O memory", n_bytes); + void *r = + vm->os_physmem_alloc_aligned (&vm->physmem_main, n_bytes, alignment); + if (!r) + *error = + clib_error_return (0, "failed to allocate %wd bytes of I/O memory", + n_bytes); else *error = 0; return r; @@ -390,16 +398,21 @@ vlib_physmem_alloc_aligned (vlib_main_t * vm, clib_error_t ** error, /* By default allocate I/O memory with cache line alignment. */ always_inline void * vlib_physmem_alloc (vlib_main_t * vm, clib_error_t ** error, uword n_bytes) -{ return vlib_physmem_alloc_aligned (vm, error, n_bytes, CLIB_CACHE_LINE_BYTES); } +{ + return vlib_physmem_alloc_aligned (vm, error, n_bytes, + CLIB_CACHE_LINE_BYTES); +} always_inline void -vlib_physmem_free (vlib_main_t * vm, void * mem) -{ return vm->os_physmem_free (mem); } +vlib_physmem_free (vlib_main_t * vm, void *mem) +{ + return vm->os_physmem_free (mem); +} always_inline u64 -vlib_physmem_virtual_to_physical (vlib_main_t * vm, void * mem) +vlib_physmem_virtual_to_physical (vlib_main_t * vm, void *mem) { - vlib_physmem_main_t * pm = &vm->physmem_main; + vlib_physmem_main_t *pm = &vm->physmem_main; uword o = pointer_to_uword (mem) - pm->virtual.start; return vlib_physmem_offset_to_physical (pm, o); } @@ -407,8 +420,7 @@ vlib_physmem_virtual_to_physical (vlib_main_t * vm, void * mem) /* Append given data to end of buffer, possibly allocating new buffers. */ u32 vlib_buffer_add_data (vlib_main_t * vm, u32 free_list_index, - u32 buffer_index, - void * data, u32 n_data_bytes); + u32 buffer_index, void *data, u32 n_data_bytes); /* * vlib_buffer_chain_* functions provide a way to create long buffers. @@ -417,40 +429,39 @@ u32 vlib_buffer_add_data (vlib_main_t * vm, /* Initializes the buffer as an empty packet with no chained buffers. */ always_inline void -vlib_buffer_chain_init(vlib_buffer_t *first) +vlib_buffer_chain_init (vlib_buffer_t * first) { first->total_length_not_including_first_buffer = 0; first->current_length = 0; first->flags &= ~VLIB_BUFFER_NEXT_PRESENT; first->flags |= VLIB_BUFFER_TOTAL_LENGTH_VALID; #if DPDK == 1 - struct rte_mbuf * mb = rte_mbuf_from_vlib_buffer(first); - rte_pktmbuf_reset(mb); + struct rte_mbuf *mb = rte_mbuf_from_vlib_buffer (first); + rte_pktmbuf_reset (mb); mb->data_off = VLIB_BUFFER_PRE_DATA_SIZE + first->current_data; #endif } /* The provided next_bi buffer index is appended to the end of the packet. */ always_inline vlib_buffer_t * -vlib_buffer_chain_buffer(vlib_main_t *vm, - vlib_buffer_t *first, - vlib_buffer_t *last, - u32 next_bi) +vlib_buffer_chain_buffer (vlib_main_t * vm, + vlib_buffer_t * first, + vlib_buffer_t * last, u32 next_bi) { - vlib_buffer_t *next_buffer = vlib_get_buffer(vm, next_bi); + vlib_buffer_t *next_buffer = vlib_get_buffer (vm, next_bi); last->next_buffer = next_bi; last->flags |= VLIB_BUFFER_NEXT_PRESENT; next_buffer->current_length = 0; next_buffer->flags &= ~VLIB_BUFFER_NEXT_PRESENT; #if DPDK == 1 - struct rte_mbuf * mb; - mb = rte_mbuf_from_vlib_buffer(first); + struct rte_mbuf *mb; + mb = rte_mbuf_from_vlib_buffer (first); mb->nb_segs++; - mb = rte_mbuf_from_vlib_buffer(last); - mb->next = rte_mbuf_from_vlib_buffer(next_buffer); + mb = rte_mbuf_from_vlib_buffer (last); + mb->next = rte_mbuf_from_vlib_buffer (next_buffer); - mb = rte_mbuf_from_vlib_buffer(next_buffer); + mb = rte_mbuf_from_vlib_buffer (next_buffer); mb->data_len = 0; mb->data_off = VLIB_BUFFER_PRE_DATA_SIZE + next_buffer->current_data; mb->next = 0; @@ -463,16 +474,15 @@ vlib_buffer_chain_buffer(vlib_main_t *vm, * Therefore, the added length must be compatible * with the last buffer. */ always_inline void -vlib_buffer_chain_increase_length(vlib_buffer_t *first, - vlib_buffer_t *last, - i32 len) +vlib_buffer_chain_increase_length (vlib_buffer_t * first, + vlib_buffer_t * last, i32 len) { last->current_length += len; if (first != last) first->total_length_not_including_first_buffer += len; #if DPDK == 1 - struct rte_mbuf * mb_first = rte_mbuf_from_vlib_buffer(first); - struct rte_mbuf * mb_last = rte_mbuf_from_vlib_buffer(last); + struct rte_mbuf *mb_first = rte_mbuf_from_vlib_buffer (first); + struct rte_mbuf *mb_last = rte_mbuf_from_vlib_buffer (last); mb_first->pkt_len += len; mb_last->data_len += len; #endif @@ -482,17 +492,20 @@ vlib_buffer_chain_increase_length(vlib_buffer_t *first, * It does not allocate new buffers. * Returns the number of copied bytes. */ always_inline u16 -vlib_buffer_chain_append_data(vlib_main_t *vm, - u32 free_list_index, - vlib_buffer_t *first, - vlib_buffer_t *last, - void *data, u16 data_len) +vlib_buffer_chain_append_data (vlib_main_t * vm, + u32 free_list_index, + vlib_buffer_t * first, + vlib_buffer_t * last, void *data, u16 data_len) { - u32 n_buffer_bytes = vlib_buffer_free_list_buffer_size (vm, free_list_index); - ASSERT(n_buffer_bytes >= last->current_length + last->current_data); - u16 len = clib_min(data_len, n_buffer_bytes - last->current_length - last->current_data); - clib_memcpy(vlib_buffer_get_current (last) + last->current_length, data, len); - vlib_buffer_chain_increase_length(first, last, len); + u32 n_buffer_bytes = + vlib_buffer_free_list_buffer_size (vm, free_list_index); + ASSERT (n_buffer_bytes >= last->current_length + last->current_data); + u16 len = clib_min (data_len, + n_buffer_bytes - last->current_length - + last->current_data); + clib_memcpy (vlib_buffer_get_current (last) + last->current_length, data, + len); + vlib_buffer_chain_increase_length (first, last, len); return len; } @@ -502,18 +515,20 @@ vlib_buffer_chain_append_data(vlib_main_t *vm, * 'last' value is modified whenever new buffers are allocated and * chained and points to the last buffer in the chain. */ u16 -vlib_buffer_chain_append_data_with_alloc(vlib_main_t *vm, - u32 free_list_index, - vlib_buffer_t *first, - vlib_buffer_t **last, - void * data, u16 data_len); -void vlib_buffer_chain_validate(vlib_main_t *vm, vlib_buffer_t *first); +vlib_buffer_chain_append_data_with_alloc (vlib_main_t * vm, + u32 free_list_index, + vlib_buffer_t * first, + vlib_buffer_t ** last, + void *data, u16 data_len); +void vlib_buffer_chain_validate (vlib_main_t * vm, vlib_buffer_t * first); -format_function_t format_vlib_buffer, format_vlib_buffer_and_data, format_vlib_buffer_contents; +format_function_t format_vlib_buffer, format_vlib_buffer_and_data, + format_vlib_buffer_contents; -typedef struct { +typedef struct +{ /* Vector of packet data. */ - u8 * packet_data; + u8 *packet_data; /* Note: the next three fields are unused if DPDK == 1 */ @@ -524,7 +539,7 @@ typedef struct { /* Buffer free list for this template. */ u32 free_list_index; - u32 * free_buffers; + u32 *free_buffers; } vlib_packet_template_t; void vlib_packet_template_get_packet_helper (vlib_main_t * vm, @@ -532,15 +547,14 @@ void vlib_packet_template_get_packet_helper (vlib_main_t * vm, void vlib_packet_template_init (vlib_main_t * vm, vlib_packet_template_t * t, - void * packet_data, + void *packet_data, uword n_packet_data_bytes, uword min_n_buffers_each_physmem_alloc, - char * fmt, ...); + char *fmt, ...); -void * -vlib_packet_template_get_packet (vlib_main_t * vm, - vlib_packet_template_t * t, - u32 * bi_result); +void *vlib_packet_template_get_packet (vlib_main_t * vm, + vlib_packet_template_t * t, + u32 * bi_result); always_inline void vlib_packet_template_free (vlib_main_t * vm, vlib_packet_template_t * t) @@ -551,16 +565,17 @@ vlib_packet_template_free (vlib_main_t * vm, vlib_packet_template_t * t) always_inline u32 unserialize_vlib_buffer_n_bytes (serialize_main_t * m) { - serialize_stream_t * s = &m->stream; - vlib_serialize_buffer_main_t * sm - = uword_to_pointer (m->stream.data_function_opaque, vlib_serialize_buffer_main_t *); - vlib_main_t * vm = sm->vlib_main; - u32 n, * f; + serialize_stream_t *s = &m->stream; + vlib_serialize_buffer_main_t *sm + = uword_to_pointer (m->stream.data_function_opaque, + vlib_serialize_buffer_main_t *); + vlib_main_t *vm = sm->vlib_main; + u32 n, *f; n = s->n_buffer_bytes - s->current_buffer_index; if (sm->last_buffer != ~0) { - vlib_buffer_t * b = vlib_get_buffer (vm, sm->last_buffer); + vlib_buffer_t *b = vlib_get_buffer (vm, sm->last_buffer); while (b->flags & VLIB_BUFFER_NEXT_PRESENT) { b = vlib_get_buffer (vm, b->next_buffer); @@ -568,17 +583,21 @@ unserialize_vlib_buffer_n_bytes (serialize_main_t * m) } } + /* *INDENT-OFF* */ clib_fifo_foreach (f, sm->rx.buffer_fifo, ({ n += vlib_buffer_index_length_in_chain (vm, f[0]); })); +/* *INDENT-ON* */ return n; } -typedef union { +typedef union +{ vlib_buffer_t b; vlib_copy_unit_t i[sizeof (vlib_buffer_t) / sizeof (vlib_copy_unit_t)]; -} vlib_buffer_union_t; +} +vlib_buffer_union_t; /* Set a buffer quickly into "uninitialized" state. We want this to be extremely cheap and arrange for all fields that need to be @@ -587,13 +606,16 @@ always_inline void vlib_buffer_init_for_free_list (vlib_buffer_t * _dst, vlib_buffer_free_list_t * fl) { - vlib_buffer_union_t * dst = (vlib_buffer_union_t *) _dst; - vlib_buffer_union_t * src = (vlib_buffer_union_t *) &fl->buffer_init_template; + vlib_buffer_union_t *dst = (vlib_buffer_union_t *) _dst; + vlib_buffer_union_t *src = + (vlib_buffer_union_t *) & fl->buffer_init_template; /* Make sure vlib_buffer_t is cacheline aligned and sized */ - ASSERT(STRUCT_OFFSET_OF(vlib_buffer_t, cacheline0) == 0); - ASSERT(STRUCT_OFFSET_OF(vlib_buffer_t, cacheline1) == CLIB_CACHE_LINE_BYTES); - ASSERT(STRUCT_OFFSET_OF(vlib_buffer_t, cacheline2) == CLIB_CACHE_LINE_BYTES * 2); + ASSERT (STRUCT_OFFSET_OF (vlib_buffer_t, cacheline0) == 0); + ASSERT (STRUCT_OFFSET_OF (vlib_buffer_t, cacheline1) == + CLIB_CACHE_LINE_BYTES); + ASSERT (STRUCT_OFFSET_OF (vlib_buffer_t, cacheline2) == + CLIB_CACHE_LINE_BYTES * 2); /* Make sure buffer template is sane. */ ASSERT (fl->index == fl->buffer_init_template.free_list_index); @@ -607,10 +629,10 @@ vlib_buffer_init_for_free_list (vlib_buffer_t * _dst, /* Make sure it really worked. */ #define _(f) ASSERT (dst->b.f == src->b.f) - _ (current_data); - _ (current_length); - _ (flags); - _ (free_list_index); + _(current_data); + _(current_length); + _(flags); + _(free_list_index); #undef _ ASSERT (dst->b.total_length_not_including_first_buffer == 0); } @@ -620,9 +642,10 @@ vlib_buffer_init_two_for_free_list (vlib_buffer_t * _dst0, vlib_buffer_t * _dst1, vlib_buffer_free_list_t * fl) { - vlib_buffer_union_t * dst0 = (vlib_buffer_union_t *) _dst0; - vlib_buffer_union_t * dst1 = (vlib_buffer_union_t *) _dst1; - vlib_buffer_union_t * src = (vlib_buffer_union_t *) &fl->buffer_init_template; + vlib_buffer_union_t *dst0 = (vlib_buffer_union_t *) _dst0; + vlib_buffer_union_t *dst1 = (vlib_buffer_union_t *) _dst1; + vlib_buffer_union_t *src = + (vlib_buffer_union_t *) & fl->buffer_init_template; /* Make sure buffer template is sane. */ ASSERT (fl->index == fl->buffer_init_template.free_list_index); @@ -636,27 +659,27 @@ vlib_buffer_init_two_for_free_list (vlib_buffer_t * _dst0, /* Make sure it really worked. */ #define _(f) ASSERT (dst0->b.f == src->b.f && dst1->b.f == src->b.f) - _ (current_data); - _ (current_length); - _ (flags); - _ (free_list_index); + _(current_data); + _(current_length); + _(flags); + _(free_list_index); #undef _ ASSERT (dst0->b.total_length_not_including_first_buffer == 0); ASSERT (dst1->b.total_length_not_including_first_buffer == 0); } #if CLIB_DEBUG > 0 -u32 * vlib_buffer_state_validation_lock; -uword * vlib_buffer_state_validation_hash; -void * vlib_buffer_state_heap; +u32 *vlib_buffer_state_validation_lock; +uword *vlib_buffer_state_validation_hash; +void *vlib_buffer_state_heap; #endif -static inline void +static inline void vlib_validate_buffer_in_use (vlib_buffer_t * b, u32 expected) { #if CLIB_DEBUG > 0 - uword * p; - void * oldheap; + uword *p; + void *oldheap; oldheap = clib_mem_set_heap (vlib_buffer_state_heap); @@ -671,36 +694,35 @@ vlib_validate_buffer_in_use (vlib_buffer_t * b, u32 expected) hash_set (vlib_buffer_state_validation_hash, b, expected); goto out; } - + if (p[0] != expected) { - void cj_stop(void); + void cj_stop (void); u32 bi; - vlib_main_t * vm = &vlib_global_main; - - cj_stop(); - + vlib_main_t *vm = &vlib_global_main; + + cj_stop (); + bi = vlib_get_buffer_index (vm, b); clib_mem_set_heap (oldheap); - clib_warning ("%.6f buffer %llx (%d): %s, not %s", - vlib_time_now(vm), bi, - p[0] ? "busy" : "free", - expected ? "busy" : "free"); - os_panic(); + clib_warning ("%.6f buffer %llx (%d): %s, not %s", + vlib_time_now (vm), bi, + p[0] ? "busy" : "free", expected ? "busy" : "free"); + os_panic (); } - out: - CLIB_MEMORY_BARRIER(); +out: + CLIB_MEMORY_BARRIER (); *vlib_buffer_state_validation_lock = 0; clib_mem_set_heap (oldheap); #endif } -static inline void +static inline void vlib_validate_buffer_set_in_use (vlib_buffer_t * b, u32 expected) { #if CLIB_DEBUG > 0 - void * oldheap; + void *oldheap; oldheap = clib_mem_set_heap (vlib_buffer_state_heap); @@ -709,10 +731,18 @@ vlib_validate_buffer_set_in_use (vlib_buffer_t * b, u32 expected) hash_set (vlib_buffer_state_validation_hash, b, expected); - CLIB_MEMORY_BARRIER(); + CLIB_MEMORY_BARRIER (); *vlib_buffer_state_validation_lock = 0; clib_mem_set_heap (oldheap); -#endif +#endif } #endif /* included_vlib_buffer_funcs_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/buffer_node.h b/vlib/vlib/buffer_node.h index 5985ccf500d..f98a5408b03 100644 --- a/vlib/vlib/buffer_node.h +++ b/vlib/vlib/buffer_node.h @@ -40,13 +40,13 @@ #ifndef included_vlib_buffer_node_h #define included_vlib_buffer_node_h -/** \file +/** \file vlib buffer/node functions */ /** \brief Finish enqueueing two buffers forward in the graph. Standard dual loop boilerplate element. This is a MACRO, - with MULTIPLE SIDE EFFECTS. In the ideal case, + with MULTIPLE SIDE EFFECTS. In the ideal case, <code>next_index == next0 == next1</code>, which means that the speculative enqueue at the top of the dual loop has correctly dealt with both packets. In that case, the macro does @@ -146,20 +146,20 @@ generic_buffer_node_inline (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame, uword sizeof_trace, - void * opaque1, + void *opaque1, uword opaque2, - void (* two_buffers) (vlib_main_t * vm, - void * opaque1, - uword opaque2, - vlib_buffer_t * b0, vlib_buffer_t * b1, - u32 * next0, u32 * next1), - void (* one_buffer) (vlib_main_t * vm, - void * opaque1, + void (*two_buffers) (vlib_main_t * vm, + void *opaque1, uword opaque2, vlib_buffer_t * b0, - u32 * next0)) + vlib_buffer_t * b1, + u32 * next0, u32 * next1), + void (*one_buffer) (vlib_main_t * vm, + void *opaque1, uword opaque2, + vlib_buffer_t * b0, + u32 * next0)) { - u32 n_left_from, * from, * to_next; + u32 n_left_from, *from, *to_next; u32 next_index; from = vlib_frame_vector_args (frame); @@ -174,18 +174,17 @@ generic_buffer_node_inline (vlib_main_t * vm, { u32 n_left_to_next; - vlib_get_next_frame (vm, node, next_index, - to_next, n_left_to_next); + vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next); while (n_left_from >= 4 && n_left_to_next >= 2) { - vlib_buffer_t * p0, * p1; + vlib_buffer_t *p0, *p1; u32 pi0, next0; u32 pi1, next1; /* Prefetch next iteration. */ { - vlib_buffer_t * p2, * p3; + vlib_buffer_t *p2, *p3; p2 = vlib_get_buffer (vm, from[2]); p3 = vlib_get_buffer (vm, from[3]); @@ -213,10 +212,10 @@ generic_buffer_node_inline (vlib_main_t * vm, to_next, n_left_to_next, pi0, pi1, next0, next1); } - + while (n_left_from > 0 && n_left_to_next > 0) { - vlib_buffer_t * p0; + vlib_buffer_t *p0; u32 pi0, next0; pi0 = from[0]; @@ -242,3 +241,11 @@ generic_buffer_node_inline (vlib_main_t * vm, } #endif /* included_vlib_buffer_node_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/cli.c b/vlib/vlib/cli.c index 60f41db1794..79db99f9632 100644 --- a/vlib/vlib/cli.c +++ b/vlib/vlib/cli.c @@ -40,40 +40,48 @@ #include <vlib/vlib.h> /* Root of all show commands. */ +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (vlib_cli_show_command, static) = { .path = "show", .short_help = "Show commands", }; +/* *INDENT-ON* */ /* Root of all clear commands. */ +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (vlib_cli_clear_command, static) = { .path = "clear", .short_help = "Clear commands", }; +/* *INDENT-ON* */ /* Root of all set commands. */ +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (vlib_cli_set_command, static) = { .path = "set", .short_help = "Set commands", }; +/* *INDENT-ON* */ /* Root of all test commands. */ +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (vlib_cli_test_command, static) = { .path = "test", .short_help = "Test commands", }; +/* *INDENT-ON* */ /* Returns bitmap of commands which match key. */ static uword * vlib_cli_sub_command_match (vlib_cli_command_t * c, unformat_input_t * input) { int i, n; - uword * match = 0; - vlib_cli_parse_position_t * p; + uword *match = 0; + vlib_cli_parse_position_t *p; unformat_skip_white_space (input); - for (i = 0; ; i++) + for (i = 0;; i++) { uword k; @@ -83,10 +91,14 @@ vlib_cli_sub_command_match (vlib_cli_command_t * c, unformat_input_t * input) case 'a' ... 'z': case 'A' ... 'Z': case '0' ... '9': - case '-': case '_': + case '-': + case '_': break; - case ' ': case '\t': case '\r': case '\n': + case ' ': + case '\t': + case '\r': + case '\n': case UNFORMAT_END_OF_INPUT: /* White space or end of input removes any non-white matches that were before possible. */ @@ -128,15 +140,16 @@ vlib_cli_sub_command_match (vlib_cli_command_t * c, unformat_input_t * input) goto no_match; } - done: +done: return match; } /* Looks for string based sub-input formatted { SUB-INPUT }. */ -uword unformat_vlib_cli_sub_input (unformat_input_t * i, va_list * args) +uword +unformat_vlib_cli_sub_input (unformat_input_t * i, va_list * args) { - unformat_input_t * sub_input = va_arg (*args, unformat_input_t *); - u8 * s; + unformat_input_t *sub_input = va_arg (*args, unformat_input_t *); + u8 *s; uword c; while (1) @@ -144,8 +157,10 @@ uword unformat_vlib_cli_sub_input (unformat_input_t * i, va_list * args) c = unformat_get_input (i); switch (c) { - case ' ': case '\t': - case '\n': case '\r': + case ' ': + case '\t': + case '\n': + case '\r': case '\f': break; @@ -169,39 +184,40 @@ uword unformat_vlib_cli_sub_input (unformat_input_t * i, va_list * args) static vlib_cli_command_t * get_sub_command (vlib_cli_main_t * cm, vlib_cli_command_t * parent, u32 si) { - vlib_cli_sub_command_t * s = vec_elt_at_index (parent->sub_commands, si); + vlib_cli_sub_command_t *s = vec_elt_at_index (parent->sub_commands, si); return vec_elt_at_index (cm->commands, s->index); } -static uword unformat_vlib_cli_sub_command (unformat_input_t * i, va_list * args) +static uword +unformat_vlib_cli_sub_command (unformat_input_t * i, va_list * args) { - vlib_main_t * vm = va_arg (*args, vlib_main_t *); - vlib_cli_command_t * c = va_arg (*args, vlib_cli_command_t *); - vlib_cli_command_t ** result = va_arg (*args, vlib_cli_command_t **); - vlib_cli_main_t * cm = &vm->cli_main; - uword * match_bitmap, is_unique, index; + vlib_main_t *vm = va_arg (*args, vlib_main_t *); + vlib_cli_command_t *c = va_arg (*args, vlib_cli_command_t *); + vlib_cli_command_t **result = va_arg (*args, vlib_cli_command_t **); + vlib_cli_main_t *cm = &vm->cli_main; + uword *match_bitmap, is_unique, index; { - vlib_cli_sub_rule_t * sr; - vlib_cli_parse_rule_t * r; + vlib_cli_sub_rule_t *sr; + vlib_cli_parse_rule_t *r; vec_foreach (sr, c->sub_rules) - { - void ** d; - r = vec_elt_at_index (cm->parse_rules, sr->rule_index); - vec_add2 (cm->parse_rule_data, d, 1); - vec_reset_length (d[0]); - if (r->data_size) - d[0] = _vec_resize (d[0], - /* length increment */ 1, - r->data_size, - /* header_bytes */ 0, - /* data align */ sizeof (uword)); - if (unformat_user (i, r->unformat_function, vm, d[0])) - { - *result = vec_elt_at_index (cm->commands, sr->command_index); - return 1; - } - } + { + void **d; + r = vec_elt_at_index (cm->parse_rules, sr->rule_index); + vec_add2 (cm->parse_rule_data, d, 1); + vec_reset_length (d[0]); + if (r->data_size) + d[0] = _vec_resize (d[0], + /* length increment */ 1, + r->data_size, + /* header_bytes */ 0, + /* data align */ sizeof (uword)); + if (unformat_user (i, r->unformat_function, vm, d[0])) + { + *result = vec_elt_at_index (cm->commands, sr->command_index); + return 1; + } + } } match_bitmap = vlib_cli_sub_command_match (c, i); @@ -217,9 +233,10 @@ static uword unformat_vlib_cli_sub_command (unformat_input_t * i, va_list * args return is_unique; } -static u8 * format_vlib_cli_command_help (u8 * s, va_list * args) +static u8 * +format_vlib_cli_command_help (u8 * s, va_list * args) { - vlib_cli_command_t * c = va_arg (*args, vlib_cli_command_t *); + vlib_cli_command_t *c = va_arg (*args, vlib_cli_command_t *); int is_long = va_arg (*args, int); if (is_long && c->long_help) s = format (s, "%s", c->long_help); @@ -230,15 +247,17 @@ static u8 * format_vlib_cli_command_help (u8 * s, va_list * args) return s; } -static u8 * format_vlib_cli_parse_rule_name (u8 * s, va_list * args) +static u8 * +format_vlib_cli_parse_rule_name (u8 * s, va_list * args) { - vlib_cli_parse_rule_t * r = va_arg (*args, vlib_cli_parse_rule_t *); + vlib_cli_parse_rule_t *r = va_arg (*args, vlib_cli_parse_rule_t *); return format (s, "<%U>", format_c_identifier, r->name); } -static u8 * format_vlib_cli_path (u8 * s, va_list * args) +static u8 * +format_vlib_cli_path (u8 * s, va_list * args) { - u8 * path = va_arg (*args, u8 *); + u8 *path = va_arg (*args, u8 *); int i, in_rule; in_rule = 0; for (i = 0; i < vec_len (path); i++) @@ -258,7 +277,7 @@ static u8 * format_vlib_cli_path (u8 * s, va_list * args) case ' ': if (in_rule) { - vec_add1 (s, '>'); /* end of <RULE> */ + vec_add1 (s, '>'); /* end of <RULE> */ in_rule = 0; } vec_add1 (s, ' '); @@ -277,39 +296,36 @@ static u8 * format_vlib_cli_path (u8 * s, va_list * args) } static vlib_cli_command_t * -all_subs (vlib_cli_main_t * cm, - vlib_cli_command_t * subs, - u32 command_index) +all_subs (vlib_cli_main_t * cm, vlib_cli_command_t * subs, u32 command_index) { - vlib_cli_command_t * c = vec_elt_at_index (cm->commands, command_index); - vlib_cli_sub_command_t * sc; - vlib_cli_sub_rule_t * sr; + vlib_cli_command_t *c = vec_elt_at_index (cm->commands, command_index); + vlib_cli_sub_command_t *sc; + vlib_cli_sub_rule_t *sr; if (c->function) vec_add1 (subs, c[0]); vec_foreach (sr, c->sub_rules) subs = all_subs (cm, subs, sr->command_index); - vec_foreach (sc, c->sub_commands) - subs = all_subs (cm, subs, sc->index); + vec_foreach (sc, c->sub_commands) subs = all_subs (cm, subs, sc->index); return subs; } static int -vlib_cli_cmp_rule (void * a1, void * a2) +vlib_cli_cmp_rule (void *a1, void *a2) { - vlib_cli_sub_rule_t * r1 = a1; - vlib_cli_sub_rule_t * r2 = a2; + vlib_cli_sub_rule_t *r1 = a1; + vlib_cli_sub_rule_t *r2 = a2; return vec_cmp (r1->name, r2->name); } static int -vlib_cli_cmp_command (void * a1, void * a2) +vlib_cli_cmp_command (void *a1, void *a2) { - vlib_cli_command_t * c1 = a1; - vlib_cli_command_t * c2 = a2; + vlib_cli_command_t *c1 = a1; + vlib_cli_command_t *c2 = a2; return vec_cmp (c1->path, c2->path); } @@ -320,10 +336,10 @@ vlib_cli_dispatch_sub_commands (vlib_main_t * vm, unformat_input_t * input, uword parent_command_index) { - vlib_cli_command_t * parent, * c; - clib_error_t * error = 0; + vlib_cli_command_t *parent, *c; + clib_error_t *error = 0; unformat_input_t sub_input; - u8 * string; + u8 *string; uword is_main_dispatch = cm == &vm->cli_main; parent = vec_elt_at_index (cm->commands, parent_command_index); @@ -331,53 +347,60 @@ vlib_cli_dispatch_sub_commands (vlib_main_t * vm, { uword help_at_end_of_line, i; - help_at_end_of_line = unformat_check_input (input) == UNFORMAT_END_OF_INPUT; + help_at_end_of_line = + unformat_check_input (input) == UNFORMAT_END_OF_INPUT; while (1) - { + { c = parent; - if (unformat_user (input, unformat_vlib_cli_sub_command, vm, c, &parent)) + if (unformat_user + (input, unformat_vlib_cli_sub_command, vm, c, &parent)) ; - else if (! (unformat_check_input (input) == UNFORMAT_END_OF_INPUT)) + else if (!(unformat_check_input (input) == UNFORMAT_END_OF_INPUT)) goto unknown; else break; - } - + } + /* help SUB-COMMAND => long format help. - "help" at end of line: show all commands. */ - if (! help_at_end_of_line) - vlib_cli_output (vm, "%U", format_vlib_cli_command_help, c, /* is_long */ 1); + "help" at end of line: show all commands. */ + if (!help_at_end_of_line) + vlib_cli_output (vm, "%U", format_vlib_cli_command_help, c, + /* is_long */ 1); else if (vec_len (c->sub_commands) + vec_len (c->sub_rules) == 0) vlib_cli_output (vm, "%v: no sub-commands", c->path); else { - vlib_cli_sub_command_t * sc; - vlib_cli_sub_rule_t * sr, * subs; + vlib_cli_sub_command_t *sc; + vlib_cli_sub_rule_t *sr, *subs; subs = vec_dup (c->sub_rules); /* Add in rules if any. */ vec_foreach (sc, c->sub_commands) - { - vec_add2 (subs, sr, 1); - sr->name = sc->name; - sr->command_index = sc->index; - sr->rule_index = ~0; - } + { + vec_add2 (subs, sr, 1); + sr->name = sc->name; + sr->command_index = sc->index; + sr->rule_index = ~0; + } vec_sort_with_function (subs, vlib_cli_cmp_rule); - for (i = 0; i < vec_len (subs); i++) + for (i = 0; i < vec_len (subs); i++) { - vlib_cli_command_t * d; - vlib_cli_parse_rule_t * r; + vlib_cli_command_t *d; + vlib_cli_parse_rule_t *r; d = vec_elt_at_index (cm->commands, subs[i].command_index); - r = subs[i].rule_index != ~0 ? vec_elt_at_index (cm->parse_rules, subs[i].rule_index) : 0; + r = + subs[i].rule_index != ~0 ? vec_elt_at_index (cm->parse_rules, + subs + [i].rule_index) : + 0; if (r) vlib_cli_output @@ -394,10 +417,11 @@ vlib_cli_dispatch_sub_commands (vlib_main_t * vm, vec_free (subs); } } - - else if (is_main_dispatch && (unformat (input, "choices") || unformat (input, "?"))) + + else if (is_main_dispatch + && (unformat (input, "choices") || unformat (input, "?"))) { - vlib_cli_command_t * sub, * subs; + vlib_cli_command_t *sub, *subs; subs = all_subs (cm, 0, parent_command_index); vec_sort_with_function (subs, vlib_cli_cmp_command); @@ -412,55 +436,59 @@ vlib_cli_dispatch_sub_commands (vlib_main_t * vm, { vec_free (string); } - + else if (unformat (input, "uncomment %U", unformat_vlib_cli_sub_input, &sub_input)) { - error = vlib_cli_dispatch_sub_commands (vm, cm, &sub_input, parent_command_index); + error = + vlib_cli_dispatch_sub_commands (vm, cm, &sub_input, + parent_command_index); unformat_free (&sub_input); } - - else if (unformat_user (input, unformat_vlib_cli_sub_command, vm, parent, &c)) + + else + if (unformat_user (input, unformat_vlib_cli_sub_command, vm, parent, &c)) { - unformat_input_t * si; - uword has_sub_commands = vec_len (c->sub_commands) + vec_len (c->sub_rules) > 0; - + unformat_input_t *si; + uword has_sub_commands = + vec_len (c->sub_commands) + vec_len (c->sub_rules) > 0; + si = input; if (unformat_user (input, unformat_vlib_cli_sub_input, &sub_input)) si = &sub_input; - + if (has_sub_commands) error = vlib_cli_dispatch_sub_commands (vm, cm, si, c - cm->commands); - if (has_sub_commands && ! error) - /* Found valid sub-command. */; + if (has_sub_commands && !error) + /* Found valid sub-command. */ ; else if (c->function) { - clib_error_t * c_error; + clib_error_t *c_error; /* Skip white space for benefit of called function. */ unformat_skip_white_space (si); if (unformat (si, "?")) { - vlib_cli_output (vm, " %-40U %U", - format_vlib_cli_path, c->path, - format_vlib_cli_command_help, c, /* is_long */ 0); + vlib_cli_output (vm, " %-40U %U", format_vlib_cli_path, c->path, format_vlib_cli_command_help, c, /* is_long */ + 0); } else { - if (!c->is_mp_safe) - vlib_worker_thread_barrier_sync(vm); + if (!c->is_mp_safe) + vlib_worker_thread_barrier_sync (vm); c_error = c->function (vm, si, c); - if (!c->is_mp_safe) - vlib_worker_thread_barrier_release(vm); + if (!c->is_mp_safe) + vlib_worker_thread_barrier_release (vm); if (c_error) { - error = clib_error_return (0, "%v: %v", c->path, c_error->what); + error = + clib_error_return (0, "%v: %v", c->path, c_error->what); clib_error_free (c_error); /* Free sub input. */ if (si != input) @@ -474,7 +502,7 @@ vlib_cli_dispatch_sub_commands (vlib_main_t * vm, clib_error_free (error); } - else if (! error) + else if (!error) error = clib_error_return (0, "%v: no sub-commands", c->path); /* Free sub input. */ @@ -487,29 +515,34 @@ vlib_cli_dispatch_sub_commands (vlib_main_t * vm, return error; - unknown: +unknown: if (parent->path) - return clib_error_return (0, "%v: unknown input `%U'", parent->path, format_unformat_error, input); + return clib_error_return (0, "%v: unknown input `%U'", parent->path, + format_unformat_error, input); else - return clib_error_return (0, "unknown input `%U'", format_unformat_error, input); + return clib_error_return (0, "unknown input `%U'", format_unformat_error, + input); } -void vlib_unix_error_report (vlib_main_t *, clib_error_t *) - __attribute__ ((weak)); +void vlib_unix_error_report (vlib_main_t *, clib_error_t *) + __attribute__ ((weak)); -void vlib_unix_error_report (vlib_main_t * vm, clib_error_t * error) { } +void +vlib_unix_error_report (vlib_main_t * vm, clib_error_t * error) +{ +} /* Process CLI input. */ -void vlib_cli_input (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_output_function_t * function, - uword function_arg) +void +vlib_cli_input (vlib_main_t * vm, + unformat_input_t * input, + vlib_cli_output_function_t * function, uword function_arg) { - vlib_process_t * cp = vlib_get_current_process(vm); - vlib_cli_main_t * cm = &vm->cli_main; - clib_error_t * error; - vlib_cli_output_function_t * save_function; + vlib_process_t *cp = vlib_get_current_process (vm); + vlib_cli_main_t *cm = &vm->cli_main; + clib_error_t *error; + vlib_cli_output_function_t *save_function; uword save_function_arg; save_function = cp->output_function; @@ -518,10 +551,13 @@ void vlib_cli_input (vlib_main_t * vm, cp->output_function = function; cp->output_function_arg = function_arg; - do { - vec_reset_length (cm->parse_rule_data); - error = vlib_cli_dispatch_sub_commands (vm, &vm->cli_main, input, /* parent */ 0); - } while (! error && ! unformat (input, "%U", unformat_eof)); + do + { + vec_reset_length (cm->parse_rule_data); + error = vlib_cli_dispatch_sub_commands (vm, &vm->cli_main, input, /* parent */ + 0); + } + while (!error && !unformat (input, "%U", unformat_eof)); if (error) { @@ -535,21 +571,22 @@ void vlib_cli_input (vlib_main_t * vm, } /* Output to current CLI connection. */ -void vlib_cli_output (vlib_main_t * vm, char * fmt, ...) +void +vlib_cli_output (vlib_main_t * vm, char *fmt, ...) { - vlib_process_t * cp = vlib_get_current_process(vm); + vlib_process_t *cp = vlib_get_current_process (vm); va_list va; - u8 * s; + u8 *s; va_start (va, fmt); s = va_format (0, fmt, &va); va_end (va); /* Terminate with \n if not present. */ - if (vec_len (s) > 0 && s[vec_len (s)-1] != '\n') + if (vec_len (s) > 0 && s[vec_len (s) - 1] != '\n') vec_add1 (s, '\n'); - if ((! cp) || (! cp->output_function)) + if ((!cp) || (!cp->output_function)) fformat (stdout, "%v", s); else cp->output_function (cp->output_function_arg, s, vec_len (s)); @@ -559,48 +596,52 @@ void vlib_cli_output (vlib_main_t * vm, char * fmt, ...) static clib_error_t * show_memory_usage (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { int verbose = 0; - clib_error_t * error; + clib_error_t *error; u32 index = 0; - while (unformat_check_input(input) != UNFORMAT_END_OF_INPUT) + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { - if (unformat (input, "verbose")) - verbose = 1; - else { - error = clib_error_return (0, "unknown input `%U'", - format_unformat_error, input); - return error; - } - } + if (unformat (input, "verbose")) + verbose = 1; + else + { + error = clib_error_return (0, "unknown input `%U'", + format_unformat_error, input); + return error; + } + } + /* *INDENT-OFF* */ foreach_vlib_main ( ({ vlib_cli_output (vm, "Thread %d %v\n", index, vlib_worker_threads[index].name); vlib_cli_output (vm, "%U\n", format_mheap, clib_per_cpu_mheaps[index], verbose); index++; })); + /* *INDENT-ON* */ return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (show_memory_usage_command, static) = { .path = "show memory", .short_help = "Show current memory usage", .function = show_memory_usage, }; +/* *INDENT-ON* */ static clib_error_t * enable_disable_memory_trace (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { - clib_error_t * error = 0; + clib_error_t *error = 0; int enable; - if (! unformat_user (input, unformat_vlib_enable_disable, &enable)) + if (!unformat_user (input, unformat_vlib_enable_disable, &enable)) { error = clib_error_return (0, "expecting enable/on or disable/off"); goto done; @@ -608,26 +649,30 @@ enable_disable_memory_trace (vlib_main_t * vm, clib_mem_trace (enable); - done: +done: return error; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (enable_disable_memory_trace_command, static) = { .path = "memory-trace", .short_help = "Enable/disable memory allocation trace", .function = enable_disable_memory_trace, }; +/* *INDENT-ON* */ static clib_error_t * test_heap_validate (vlib_main_t * vm, unformat_input_t * input, - vlib_cli_command_t * cmd) + vlib_cli_command_t * cmd) { - clib_error_t * error = 0; - void * heap; - mheap_t *mheap; + clib_error_t *error = 0; + void *heap; + mheap_t *mheap; - if (unformat(input, "on")) { + if (unformat (input, "on")) + { + /* *INDENT-OFF* */ foreach_vlib_main({ heap = clib_per_cpu_mheaps[this_vlib_main->cpu_index]; mheap = mheap_header(heap); @@ -635,36 +680,48 @@ test_heap_validate (vlib_main_t * vm, unformat_input_t * input, // Turn off small object cache because it delays detection of errors mheap->flags &= ~MHEAP_FLAG_SMALL_OBJECT_CACHE; }); + /* *INDENT-ON* */ - } else if (unformat(input, "off")) { + } + else if (unformat (input, "off")) + { + /* *INDENT-OFF* */ foreach_vlib_main({ heap = clib_per_cpu_mheaps[this_vlib_main->cpu_index]; mheap = mheap_header(heap); mheap->flags &= ~MHEAP_FLAG_VALIDATE; mheap->flags |= MHEAP_FLAG_SMALL_OBJECT_CACHE; }); - - } else if (unformat(input, "now")) { + /* *INDENT-ON* */ + } + else if (unformat (input, "now")) + { + /* *INDENT-OFF* */ foreach_vlib_main({ heap = clib_per_cpu_mheaps[this_vlib_main->cpu_index]; mheap = mheap_header(heap); mheap_validate(heap); }); - vlib_cli_output(vm, "heap validation complete"); + /* *INDENT-ON* */ + vlib_cli_output (vm, "heap validation complete"); - } else { - return clib_error_return(0, "unknown input `%U'", - format_unformat_error, input); + } + else + { + return clib_error_return (0, "unknown input `%U'", + format_unformat_error, input); } - return error; + return error; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (cmd_test_heap_validate,static) = { .path = "test heap-validate", .short_help = "<on/off/now> validate heap on future allocs/frees or right now", .function = test_heap_validate, }; +/* *INDENT-ON* */ #ifdef TEST_CODE /* @@ -674,34 +731,36 @@ VLIB_CLI_COMMAND (cmd_test_heap_validate,static) = { static clib_error_t * sleep_ten_seconds (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { u16 i; - u16 my_id = rand(); + u16 my_id = rand (); - vlib_cli_output(vm, "Starting 10 seconds sleep with id %u\n", my_id); + vlib_cli_output (vm, "Starting 10 seconds sleep with id %u\n", my_id); - for(i=0; i<10; i++) + for (i = 0; i < 10; i++) { - vlib_process_wait_for_event_or_clock(vm, 1.0); - vlib_cli_output(vm, "Iteration number %u, my id: %u\n", i, my_id); + vlib_process_wait_for_event_or_clock (vm, 1.0); + vlib_cli_output (vm, "Iteration number %u, my id: %u\n", i, my_id); } - vlib_cli_output(vm, "Done with sleep with id %u\n", my_id); + vlib_cli_output (vm, "Done with sleep with id %u\n", my_id); return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (ping_command, static) = { .path = "test sleep", .function = sleep_ten_seconds, .short_help = "Sleep for 10 seconds", }; +/* *INDENT-ON* */ #endif /* ifdef TEST_CODE */ -static uword vlib_cli_normalize_path (char * input, char ** result) +static uword +vlib_cli_normalize_path (char *input, char **result) { - char * i = input; - char * s = 0; + char *i = input; + char *s = 0; uword l = 0; uword index_of_last_space = ~0; @@ -715,7 +774,7 @@ static uword vlib_cli_normalize_path (char * input, char ** result) case '\t': case '\n': case '\r': - if (l > 0 && s[l-1] != ' ') + if (l > 0 && s[l - 1] != ' ') { vec_add1 (s, ' '); l++; @@ -723,7 +782,7 @@ static uword vlib_cli_normalize_path (char * input, char ** result) break; default: - if (l > 0 && s[l-1] == ' ') + if (l > 0 && s[l - 1] == ' ') index_of_last_space = vec_len (s); vec_add1 (s, c); l++; @@ -732,7 +791,7 @@ static uword vlib_cli_normalize_path (char * input, char ** result) } /* Remove any extra space at end. */ - if (l > 0 && s[l-1] == ' ') + if (l > 0 && s[l - 1] == ' ') _vec_len (s) -= 1; *result = s; @@ -740,7 +799,7 @@ static uword vlib_cli_normalize_path (char * input, char ** result) } always_inline uword -parent_path_len (char * path) +parent_path_len (char *path) { word i; for (i = vec_len (path) - 1; i >= 0; i--) @@ -751,13 +810,12 @@ parent_path_len (char * path) return ~0; } -static void add_sub_command (vlib_cli_main_t * cm, - uword parent_index, - uword child_index) +static void +add_sub_command (vlib_cli_main_t * cm, uword parent_index, uword child_index) { - vlib_cli_command_t * p, * c; - vlib_cli_sub_command_t * sub_c; - u8 * sub_name; + vlib_cli_command_t *p, *c; + vlib_cli_sub_command_t *sub_c; + u8 *sub_name; word i, l; p = vec_elt_at_index (cm->commands, parent_index); @@ -775,17 +833,16 @@ static void add_sub_command (vlib_cli_main_t * cm, if (sub_name[0] == '%') { - uword * q; - vlib_cli_sub_rule_t * sr; + uword *q; + vlib_cli_sub_rule_t *sr; /* Remove %. */ vec_delete (sub_name, 1, 0); - if (! p->sub_rule_index_by_name) - p->sub_rule_index_by_name - = hash_create_vec (/* initial length */ 32, - sizeof (sub_name[0]), - sizeof (uword)); + if (!p->sub_rule_index_by_name) + p->sub_rule_index_by_name = hash_create_vec ( /* initial length */ 32, + sizeof (sub_name[0]), + sizeof (uword)); q = hash_get_mem (p->sub_rule_index_by_name, sub_name); if (q) { @@ -795,11 +852,12 @@ static void add_sub_command (vlib_cli_main_t * cm, } q = hash_get_mem (cm->parse_rule_index_by_name, sub_name); - if (! q) + if (!q) clib_error ("reference to unknown rule `%%%v' in path `%v'", sub_name, c->path); - hash_set_mem (p->sub_rule_index_by_name, sub_name, vec_len (p->sub_rules)); + hash_set_mem (p->sub_rule_index_by_name, sub_name, + vec_len (p->sub_rules)); vec_add2 (p->sub_rules, sr, 1); sr->name = sub_name; sr->rule_index = q[0]; @@ -807,11 +865,10 @@ static void add_sub_command (vlib_cli_main_t * cm, return; } - if (! p->sub_command_index_by_name) - p->sub_command_index_by_name - = hash_create_vec (/* initial length */ 32, - sizeof (c->path[0]), - sizeof (uword)); + if (!p->sub_command_index_by_name) + p->sub_command_index_by_name = hash_create_vec ( /* initial length */ 32, + sizeof (c->path[0]), + sizeof (uword)); /* Check if sub-command has already been created. */ if (hash_get_mem (p->sub_command_index_by_name, sub_name)) @@ -823,17 +880,18 @@ static void add_sub_command (vlib_cli_main_t * cm, vec_add2 (p->sub_commands, sub_c, 1); sub_c->index = child_index; sub_c->name = sub_name; - hash_set_mem (p->sub_command_index_by_name, sub_c->name, sub_c - p->sub_commands); + hash_set_mem (p->sub_command_index_by_name, sub_c->name, + sub_c - p->sub_commands); vec_validate (p->sub_command_positions, vec_len (sub_c->name) - 1); for (i = 0; i < vec_len (sub_c->name); i++) { int n; - vlib_cli_parse_position_t * pos; + vlib_cli_parse_position_t *pos; pos = vec_elt_at_index (p->sub_command_positions, i); - if (! pos->bitmaps) + if (!pos->bitmaps) pos->min_char = sub_c->name[i]; n = sub_c->name[i] - pos->min_char; @@ -845,16 +903,17 @@ static void add_sub_command (vlib_cli_main_t * cm, } vec_validate (pos->bitmaps, n); - pos->bitmaps[n] = clib_bitmap_ori (pos->bitmaps[n], sub_c - p->sub_commands); + pos->bitmaps[n] = + clib_bitmap_ori (pos->bitmaps[n], sub_c - p->sub_commands); } } static void vlib_cli_make_parent (vlib_cli_main_t * cm, uword ci) { - uword p_len, pi, * p; - char * p_path; - vlib_cli_command_t * c, * parent; + uword p_len, pi, *p; + char *p_path; + vlib_cli_command_t *c, *parent; /* Root command (index 0) should have already been added. */ ASSERT (vec_len (cm->commands) > 0); @@ -862,7 +921,7 @@ vlib_cli_make_parent (vlib_cli_main_t * cm, uword ci) c = vec_elt_at_index (cm->commands, ci); p_len = parent_path_len (c->path); - /* No space? Parent is root command. */ + /* No space? Parent is root command. */ if (p_len == ~0) { add_sub_command (cm, 0, ci); @@ -875,12 +934,13 @@ vlib_cli_make_parent (vlib_cli_main_t * cm, uword ci) p = hash_get_mem (cm->command_index_by_path, p_path); /* Parent exists? */ - if (! p) + if (!p) { /* Parent does not exist; create it. */ vec_add2 (cm->commands, parent, 1); parent->path = p_path; - hash_set_mem (cm->command_index_by_path, parent->path, parent - cm->commands); + hash_set_mem (cm->command_index_by_path, parent->path, + parent - cm->commands); pi = parent - cm->commands; } else @@ -892,32 +952,31 @@ vlib_cli_make_parent (vlib_cli_main_t * cm, uword ci) add_sub_command (cm, pi, ci); /* Create parent's parent. */ - if (! p) + if (!p) vlib_cli_make_parent (cm, pi); } always_inline uword vlib_cli_command_is_empty (vlib_cli_command_t * c) { - return (c->long_help == 0 - && c->short_help == 0 - && c->function == 0); + return (c->long_help == 0 && c->short_help == 0 && c->function == 0); } -clib_error_t * vlib_cli_register (vlib_main_t * vm, vlib_cli_command_t * c) +clib_error_t * +vlib_cli_register (vlib_main_t * vm, vlib_cli_command_t * c) { - vlib_cli_main_t * cm = &vm->cli_main; - clib_error_t * error = 0; - uword ci, * p; - char * normalized_path; + vlib_cli_main_t *cm = &vm->cli_main; + clib_error_t *error = 0; + uword ci, *p; + char *normalized_path; if ((error = vlib_call_init_function (vm, vlib_cli_init))) return error; (void) vlib_cli_normalize_path (c->path, &normalized_path); - if (! cm->command_index_by_path) - cm->command_index_by_path = hash_create_vec (/* initial length */ 32, + if (!cm->command_index_by_path) + cm->command_index_by_path = hash_create_vec ( /* initial length */ 32, sizeof (c->path[0]), sizeof (uword)); @@ -925,18 +984,18 @@ clib_error_t * vlib_cli_register (vlib_main_t * vm, vlib_cli_command_t * c) p = hash_get_mem (cm->command_index_by_path, normalized_path); if (p) { - vlib_cli_command_t * d; + vlib_cli_command_t *d; ci = p[0]; d = vec_elt_at_index (cm->commands, ci); /* If existing command was created via vlib_cli_make_parent - replaced it with callers data. */ + replaced it with callers data. */ if (vlib_cli_command_is_empty (d)) { vlib_cli_command_t save = d[0]; - ASSERT (! vlib_cli_command_is_empty (c)); + ASSERT (!vlib_cli_command_is_empty (c)); /* Copy callers fields. */ d[0] = c[0]; @@ -949,7 +1008,9 @@ clib_error_t * vlib_cli_register (vlib_main_t * vm, vlib_cli_command_t * c) d->sub_rules = save.sub_rules; } else - error = clib_error_return (0, "duplicate command name with path %v", normalized_path); + error = + clib_error_return (0, "duplicate command name with path %v", + normalized_path); vec_free (normalized_path); if (error) @@ -986,14 +1047,14 @@ clib_error_t * vlib_cli_register (vlib_main_t * vm, vlib_cli_command_t * c) clib_error_t * vlib_cli_register_parse_rule (vlib_main_t * vm, vlib_cli_parse_rule_t * r_reg) { - vlib_cli_main_t * cm = &vm->cli_main; - vlib_cli_parse_rule_t * r; - clib_error_t * error = 0; - u8 * r_name; - uword * p; - - if (! cm->parse_rule_index_by_name) - cm->parse_rule_index_by_name = hash_create_vec (/* initial length */ 32, + vlib_cli_main_t *cm = &vm->cli_main; + vlib_cli_parse_rule_t *r; + clib_error_t *error = 0; + u8 *r_name; + uword *p; + + if (!cm->parse_rule_index_by_name) + cm->parse_rule_index_by_name = hash_create_vec ( /* initial length */ 32, sizeof (r->name[0]), sizeof (uword)); @@ -1003,7 +1064,8 @@ vlib_cli_register_parse_rule (vlib_main_t * vm, vlib_cli_parse_rule_t * r_reg) if ((p = hash_get_mem (cm->parse_rule_index_by_name, r_name))) { vec_free (r_name); - return clib_error_return (0, "duplicate parse rule name `%s'", r_reg->name); + return clib_error_return (0, "duplicate parse rule name `%s'", + r_reg->name); } vec_add2 (cm->parse_rules, r, 1); @@ -1016,19 +1078,19 @@ vlib_cli_register_parse_rule (vlib_main_t * vm, vlib_cli_parse_rule_t * r_reg) #if 0 /* $$$ turn back on again someday, maybe */ -static clib_error_t * -vlib_cli_register_parse_rules (vlib_main_t * vm, - vlib_cli_parse_rule_t * lo, - vlib_cli_parse_rule_t * hi) - - __attribute__((unused)) +static clib_error_t *vlib_cli_register_parse_rules (vlib_main_t * vm, + vlib_cli_parse_rule_t * + lo, + vlib_cli_parse_rule_t * + hi) + __attribute__ ((unused)) { - clib_error_t * error = 0; - vlib_cli_parse_rule_t * r; + clib_error_t *error = 0; + vlib_cli_parse_rule_t *r; for (r = lo; r < hi; r = clib_elf_section_data_next (r, 0)) { - if (! r->name || strlen (r->name) == 0) + if (!r->name || strlen (r->name) == 0) { error = clib_error_return (0, "parse rule with no name"); goto done; @@ -1039,16 +1101,17 @@ vlib_cli_register_parse_rules (vlib_main_t * vm, goto done; } - done: +done: return error; } #endif -static clib_error_t * vlib_cli_init (vlib_main_t * vm) +static clib_error_t * +vlib_cli_init (vlib_main_t * vm) { - vlib_cli_main_t * cm = &vm->cli_main; - clib_error_t * error = 0; - vlib_cli_command_t * cmd; + vlib_cli_main_t *cm = &vm->cli_main; + clib_error_t *error = 0; + vlib_cli_command_t *cmd; cmd = cm->cli_command_registrations; @@ -1056,10 +1119,18 @@ static clib_error_t * vlib_cli_init (vlib_main_t * vm) { error = vlib_cli_register (vm, cmd); if (error) - return error; + return error; cmd = cmd->next_cli_command; } return error; } VLIB_INIT_FUNCTION (vlib_cli_init); + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/cli.h b/vlib/vlib/cli.h index a9e08ba1f6e..009c7e82cf7 100644 --- a/vlib/vlib/cli.h +++ b/vlib/vlib/cli.h @@ -44,58 +44,62 @@ struct vlib_cli_command_t; -typedef struct { +typedef struct +{ u32 min_char; /* Indexed by name[position] - min_char. */ - uword ** bitmaps; + uword **bitmaps; } vlib_cli_parse_position_t; -typedef struct { - u8 * name; +typedef struct +{ + u8 *name; u32 index; } vlib_cli_sub_command_t; -typedef struct { - u8 * name; +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; +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; + 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) +typedef clib_error_t *(vlib_cli_command_function_t) (struct vlib_main_t * vm, - unformat_input_t * input, - struct vlib_cli_command_t * cmd); + unformat_input_t * input, struct vlib_cli_command_t * cmd); -typedef struct vlib_cli_command_t { +typedef struct vlib_cli_command_t +{ /* Command path (e.g. "show something"). Spaces delimit elements of path. */ - char * path; + char *path; /* Short/long help strings. */ - char * short_help; - char * long_help; + char *short_help; + char *long_help; /* Callback function. */ - vlib_cli_command_function_t * function; + vlib_cli_command_function_t *function; /* Opaque. */ uword function_arg; @@ -104,44 +108,44 @@ typedef struct vlib_cli_command_t { uword is_mp_safe; /* Sub commands for this command. */ - vlib_cli_sub_command_t * sub_commands; + 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; + 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; + 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; + uword *sub_rule_index_by_name; /* Vector of possible parse rules for this path. */ - vlib_cli_sub_rule_t * sub_rules; + vlib_cli_sub_rule_t *sub_rules; /* List of CLI commands, built by constructors */ - struct vlib_cli_command_t * next_cli_command; + 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 { + u8 * buffer, uword buffer_bytes); +typedef struct +{ /* Vector of all known commands. */ - vlib_cli_command_t * commands; + vlib_cli_command_t *commands; /* Hash table mapping normalized path to index into all_commands. */ - uword * command_index_by_path; + uword *command_index_by_path; /* Vector of all known parse rules. */ - vlib_cli_parse_rule_t * 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; + uword *parse_rule_index_by_name; /* Data parsed for rules. */ - void ** parse_rule_data; + void **parse_rule_data; /* registration list added by constructors */ vlib_cli_command_t *cli_command_registrations; @@ -158,26 +162,31 @@ static void __vlib_cli_command_registration_##x (void) \ x.next_cli_command = cm->cli_command_registrations; \ cm->cli_command_registrations = &x; \ } \ -__VA_ARGS__ vlib_cli_command_t x - - +__VA_ARGS__ vlib_cli_command_t x #define VLIB_CLI_PARSE_RULE(x) \ - vlib_cli_parse_rule_t x - + vlib_cli_parse_rule_t x /* Output to current CLI connection. */ -void vlib_cli_output (struct vlib_main_t * vm, char * fmt, ...); +void vlib_cli_output (struct vlib_main_t *vm, char *fmt, ...); /* Process CLI input. */ -void vlib_cli_input (struct vlib_main_t * vm, +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); +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); #endif /* included_vlib_cli_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/cli_funcs.h b/vlib/vlib/cli_funcs.h index a43ed20a2c2..78aef73ba2d 100644 --- a/vlib/vlib/cli_funcs.h +++ b/vlib/vlib/cli_funcs.h @@ -43,8 +43,16 @@ always_inline void * vlib_cli_get_parse_rule_result (vlib_main_t * vm, uword index) { - vlib_cli_main_t * cm = &vm->cli_main; + vlib_cli_main_t *cm = &vm->cli_main; return vec_elt (cm->parse_rule_data, index); } #endif /* included_vlib_cli_funcs_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/counter.c b/vlib/vlib/counter.c index 9c5e0db8427..9f66e04d88e 100644 --- a/vlib/vlib/counter.c +++ b/vlib/vlib/counter.c @@ -39,20 +39,21 @@ #include <vlib/vlib.h> -void vlib_clear_simple_counters (vlib_simple_counter_main_t * cm) +void +vlib_clear_simple_counters (vlib_simple_counter_main_t * cm) { uword i, j; - u16 * my_minis; + u16 *my_minis; - for (i = 0; i < vec_len(cm->minis); i++) + for (i = 0; i < vec_len (cm->minis); i++) { my_minis = cm->minis[i]; - + for (j = 0; j < vec_len (my_minis); j++) - { - cm->maxi[j] += my_minis[j]; - my_minis[j] = 0; - } + { + cm->maxi[j] += my_minis[j]; + my_minis[j] = 0; + } } j = vec_len (cm->maxi); @@ -62,22 +63,23 @@ void vlib_clear_simple_counters (vlib_simple_counter_main_t * cm) cm->value_at_last_clear[i] = cm->maxi[i]; } -void vlib_clear_combined_counters (vlib_combined_counter_main_t * cm) +void +vlib_clear_combined_counters (vlib_combined_counter_main_t * cm) { uword i, j; - vlib_mini_counter_t * my_minis; + vlib_mini_counter_t *my_minis; - for (i = 0; i < vec_len(cm->minis); i++) + for (i = 0; i < vec_len (cm->minis); i++) { my_minis = cm->minis[i]; - + for (j = 0; j < vec_len (my_minis); j++) - { - cm->maxi[j].packets += my_minis[j].packets; - cm->maxi[j].bytes += my_minis[j].bytes; - my_minis[j].packets = 0; - my_minis[j].bytes = 0; - } + { + cm->maxi[j].packets += my_minis[j].packets; + cm->maxi[j].bytes += my_minis[j].bytes; + my_minis[j].packets = 0; + my_minis[j].bytes = 0; + } } j = vec_len (cm->maxi); @@ -86,15 +88,16 @@ void vlib_clear_combined_counters (vlib_combined_counter_main_t * cm) for (i = 0; i < j; i++) { - vlib_counter_t * c = vec_elt_at_index (cm->value_at_last_clear, i); + vlib_counter_t *c = vec_elt_at_index (cm->value_at_last_clear, i); c[0] = cm->maxi[i]; } } -void vlib_validate_simple_counter (vlib_simple_counter_main_t *cm, u32 index) +void +vlib_validate_simple_counter (vlib_simple_counter_main_t * cm, u32 index) { - vlib_thread_main_t * tm = vlib_get_thread_main(); + vlib_thread_main_t *tm = vlib_get_thread_main (); int i; vec_validate (cm->minis, tm->n_vlib_mains - 1); @@ -103,33 +106,46 @@ void vlib_validate_simple_counter (vlib_simple_counter_main_t *cm, u32 index) vec_validate_aligned (cm->maxi, index, CLIB_CACHE_LINE_BYTES); } -void vlib_validate_combined_counter (vlib_combined_counter_main_t *cm, u32 index) +void +vlib_validate_combined_counter (vlib_combined_counter_main_t * cm, u32 index) { - vlib_thread_main_t * tm = vlib_get_thread_main(); + vlib_thread_main_t *tm = vlib_get_thread_main (); int i; vec_validate (cm->minis, tm->n_vlib_mains - 1); - for (i = 0; i < tm->n_vlib_mains ; i++) + for (i = 0; i < tm->n_vlib_mains; i++) vec_validate_aligned (cm->minis[i], index, CLIB_CACHE_LINE_BYTES); vec_validate_aligned (cm->maxi, index, CLIB_CACHE_LINE_BYTES); } -void serialize_vlib_simple_counter_main (serialize_main_t * m, va_list * va) +void +serialize_vlib_simple_counter_main (serialize_main_t * m, va_list * va) { clib_warning ("unimplemented"); } -void unserialize_vlib_simple_counter_main (serialize_main_t * m, va_list * va) +void +unserialize_vlib_simple_counter_main (serialize_main_t * m, va_list * va) { clib_warning ("unimplemented"); } -void serialize_vlib_combined_counter_main (serialize_main_t * m, va_list * va) +void +serialize_vlib_combined_counter_main (serialize_main_t * m, va_list * va) { clib_warning ("unimplemented"); } -void unserialize_vlib_combined_counter_main (serialize_main_t * m, va_list * va) +void +unserialize_vlib_combined_counter_main (serialize_main_t * m, va_list * va) { clib_warning ("unimplemented"); } + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/counter.h b/vlib/vlib/counter.h index 8db999c3a94..845bd4ebffc 100644 --- a/vlib/vlib/counter.h +++ b/vlib/vlib/counter.h @@ -40,40 +40,39 @@ #ifndef included_vlib_counter_h #define included_vlib_counter_h -/* +/* * Annoyingly enough, counters are created long before * the CPU configuration is available, so we have to * preallocate the mini-counter per-cpu vectors */ -typedef struct { +typedef struct +{ /* Compact counters that (rarely) can overflow. */ - u16 ** minis; + u16 **minis; /* Counters to hold overflow. */ - u64 * maxi; + u64 *maxi; /* Counter values as of last clear. */ - u64 * value_at_last_clear; + u64 *value_at_last_clear; /* Values as of last serialize. */ - u64 * value_at_last_serialize; + u64 *value_at_last_serialize; /* Last counter index serialized incrementally. */ u32 last_incremental_serialize_index; /* Counter name. */ - char * name; + char *name; } vlib_simple_counter_main_t; always_inline void vlib_increment_simple_counter (vlib_simple_counter_main_t * cm, - u32 cpu_index, - u32 index, - u32 increment) + u32 cpu_index, u32 index, u32 increment) { - u16 * my_minis; - u16 * mini; + u16 *my_minis; + u16 *mini; u32 old, new; my_minis = cm->minis[cpu_index]; @@ -100,7 +99,7 @@ vlib_get_simple_counter (vlib_simple_counter_main_t * cm, u32 index) v = 0; - for (i = 0; i < vec_len(cm->minis); i++) + for (i = 0; i < vec_len (cm->minis); i++) { my_minis = cm->minis[i]; mini = vec_elt_at_index (my_minis, index); @@ -121,12 +120,12 @@ vlib_get_simple_counter (vlib_simple_counter_main_t * cm, u32 index) always_inline void vlib_zero_simple_counter (vlib_simple_counter_main_t * cm, u32 index) { - u16 * my_minis; + u16 *my_minis; int i; ASSERT (index < vec_len (cm->maxi)); - for (i = 0; i < vec_len(cm->minis); i++) + for (i = 0; i < vec_len (cm->minis); i++) { my_minis = cm->minis[i]; my_minis[index] = 0; @@ -140,7 +139,8 @@ vlib_zero_simple_counter (vlib_simple_counter_main_t * cm, u32 index) /* Combined counters hold both packets and byte differences. */ /* Maxi-packet/byte counter. */ -typedef struct { +typedef struct +{ u64 packets, bytes; } vlib_counter_t; @@ -162,10 +162,13 @@ vlib_counter_sub (vlib_counter_t * a, vlib_counter_t * b) always_inline void vlib_counter_zero (vlib_counter_t * a) -{ a->packets = a->bytes = 0; } +{ + a->packets = a->bytes = 0; +} /* Micro-counter: 16 bits of packets and 16 bits of byte difference. */ -typedef struct { +typedef struct +{ /* Packet count. */ u16 packets; @@ -173,21 +176,22 @@ typedef struct { i16 bytes; } vlib_mini_counter_t; -typedef struct { +typedef struct +{ /* Compact counters that (rarely) can overflow. */ - vlib_mini_counter_t ** minis; + vlib_mini_counter_t **minis; /* Counters to hold overflow. */ - vlib_counter_t * maxi; + vlib_counter_t *maxi; /* Debug counters for testing. */ - vlib_counter_t * debug; + vlib_counter_t *debug; /* Counter values as of last clear. */ - vlib_counter_t * value_at_last_clear; + vlib_counter_t *value_at_last_clear; /* Counter values as of last serialize. */ - vlib_counter_t * value_at_last_serialize; + vlib_counter_t *value_at_last_serialize; /* Last counter index serialized incrementally. */ u32 last_incremental_serialize_index; @@ -199,7 +203,7 @@ typedef struct { u32 ave_packets, ave_bytes; /* Counter name. */ - char * name; + char *name; } vlib_combined_counter_main_t; @@ -208,12 +212,11 @@ void vlib_clear_combined_counters (vlib_combined_counter_main_t * cm); always_inline void vlib_increment_combined_counter (vlib_combined_counter_main_t * cm, - u32 cpu_index, + u32 cpu_index, u32 index, - u32 packet_increment, - u32 byte_increment) + u32 packet_increment, u32 byte_increment) { - vlib_mini_counter_t * my_minis, * mini; + vlib_mini_counter_t *my_minis, *mini; u32 old_packets, new_packets; i32 old_bytes, new_bytes; @@ -233,7 +236,7 @@ vlib_increment_combined_counter (vlib_combined_counter_main_t * cm, /* Bytes always overflow before packets.. */ if (PREDICT_FALSE (mini->bytes != new_bytes)) { - vlib_counter_t * maxi = vec_elt_at_index (cm->maxi, index); + vlib_counter_t *maxi = vec_elt_at_index (cm->maxi, index); __sync_fetch_and_add (&maxi->packets, new_packets); __sync_fetch_and_add (&maxi->bytes, new_bytes); @@ -246,17 +249,16 @@ vlib_increment_combined_counter (vlib_combined_counter_main_t * cm, /* This is never done in the speed path */ static inline void vlib_get_combined_counter (vlib_combined_counter_main_t * cm, - u32 index, - vlib_counter_t * result) + u32 index, vlib_counter_t * result) { - vlib_mini_counter_t * my_minis, * mini; - vlib_counter_t * maxi; + vlib_mini_counter_t *my_minis, *mini; + vlib_counter_t *maxi; int i; result->packets = 0; result->bytes = 0; - for (i = 0; i < vec_len(cm->minis); i++) + for (i = 0; i < vec_len (cm->minis); i++) { my_minis = cm->minis[i]; @@ -274,13 +276,12 @@ vlib_get_combined_counter (vlib_combined_counter_main_t * cm, } always_inline void -vlib_zero_combined_counter (vlib_combined_counter_main_t * cm, - u32 index) +vlib_zero_combined_counter (vlib_combined_counter_main_t * cm, u32 index) { - vlib_mini_counter_t * mini, * my_minis; + vlib_mini_counter_t *mini, *my_minis; int i; - for (i = 0; i < vec_len(cm->minis); i++) + for (i = 0; i < vec_len (cm->minis); i++) { my_minis = cm->minis[i]; @@ -294,13 +295,25 @@ vlib_zero_combined_counter (vlib_combined_counter_main_t * cm, vlib_counter_zero (&cm->value_at_last_clear[index]); } -void vlib_validate_simple_counter (vlib_simple_counter_main_t *cm, u32 index); -void vlib_validate_combined_counter (vlib_combined_counter_main_t *cm, u32 index); +void vlib_validate_simple_counter (vlib_simple_counter_main_t * cm, + u32 index); +void vlib_validate_combined_counter (vlib_combined_counter_main_t * cm, + u32 index); /* Number of simple/combined counters allocated. */ #define vlib_counter_len(cm) vec_len((cm)->maxi) -serialize_function_t serialize_vlib_simple_counter_main, unserialize_vlib_simple_counter_main; -serialize_function_t serialize_vlib_combined_counter_main, unserialize_vlib_combined_counter_main; +serialize_function_t serialize_vlib_simple_counter_main, + unserialize_vlib_simple_counter_main; +serialize_function_t serialize_vlib_combined_counter_main, + unserialize_vlib_combined_counter_main; #endif /* included_vlib_counter_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/defs.h b/vlib/vlib/defs.h index ff9046861f3..ad58bc04681 100644 --- a/vlib/vlib/defs.h +++ b/vlib/vlib/defs.h @@ -41,7 +41,8 @@ #define included_vlib_defs_h /* Receive or transmit. */ -typedef enum { +typedef enum +{ VLIB_RX, VLIB_TX, VLIB_N_RX_TX = 2, /* Used to size arrays. */ @@ -50,21 +51,32 @@ typedef enum { #define vlib_foreach_rx_tx(v) for (v = 0; v < VLIB_N_RX_TX; v++) /* Read/write. */ -typedef enum { +typedef enum +{ VLIB_READ, VLIB_WRITE, } vlib_read_or_write_t; /* Up/down. */ -typedef enum { +typedef enum +{ VLIB_DOWN = 0, VLIB_UP = 1, } vlib_up_or_down_t; /* Enable/disable. */ -typedef enum { +typedef enum +{ VLIB_DISABLE = 0, VLIB_ENABLE = 1, } vlib_enable_or_disable_t; #endif /* included_vlib_defs_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/dpdk_buffer.c b/vlib/vlib/dpdk_buffer.c index c0094938479..7e6e84247d5 100644 --- a/vlib/vlib/dpdk_buffer.c +++ b/vlib/vlib/dpdk_buffer.c @@ -70,9 +70,11 @@ #pragma weak rte_socket_id #pragma weak rte_pktmbuf_pool_create -uword vlib_buffer_length_in_chain_slow_path (vlib_main_t * vm, vlib_buffer_t * b_first) +uword +vlib_buffer_length_in_chain_slow_path (vlib_main_t * vm, + vlib_buffer_t * b_first) { - vlib_buffer_t * b = b_first; + vlib_buffer_t *b = b_first; uword l_first = b_first->current_length; uword l = 0; while (b->flags & VLIB_BUFFER_NEXT_PRESENT) @@ -85,14 +87,14 @@ uword vlib_buffer_length_in_chain_slow_path (vlib_main_t * vm, vlib_buffer_t * b return l + l_first; } -u8 * format_vlib_buffer (u8 * s, va_list * args) +u8 * +format_vlib_buffer (u8 * s, va_list * args) { - vlib_buffer_t * b = va_arg (*args, vlib_buffer_t *); + vlib_buffer_t *b = va_arg (*args, vlib_buffer_t *); uword indent = format_get_indent (s); s = format (s, "current data %d, length %d, free-list %d", - b->current_data, b->current_length, - b->free_list_index); + b->current_data, b->current_length, b->free_list_index); if (b->flags & VLIB_BUFFER_TOTAL_LENGTH_VALID) s = format (s, ", totlen-nifb %d", @@ -103,9 +105,9 @@ u8 * format_vlib_buffer (u8 * s, va_list * args) while (b->flags & VLIB_BUFFER_NEXT_PRESENT) { - vlib_main_t * vm = vlib_get_main(); + vlib_main_t *vm = vlib_get_main (); u32 next_buffer = b->next_buffer; - b = vlib_get_buffer(vm, next_buffer); + b = vlib_get_buffer (vm, next_buffer); s = format (s, "\n%Unext-buffer 0x%x, segment length %d", format_white_space, indent, next_buffer, b->current_length); @@ -115,10 +117,11 @@ u8 * format_vlib_buffer (u8 * s, va_list * args) return s; } -u8 * format_vlib_buffer_and_data (u8 * s, va_list * args) +u8 * +format_vlib_buffer_and_data (u8 * s, va_list * args) { - vlib_buffer_t * b = va_arg (*args, vlib_buffer_t *); - + vlib_buffer_t *b = va_arg (*args, vlib_buffer_t *); + s = format (s, "%U, %U", format_vlib_buffer, b, format_hex_bytes, vlib_buffer_get_current (b), 64); @@ -126,16 +129,16 @@ u8 * format_vlib_buffer_and_data (u8 * s, va_list * args) return s; } -u8 * format_vlib_buffer_contents (u8 * s, va_list * va) +u8 * +format_vlib_buffer_contents (u8 * s, va_list * va) { - vlib_main_t * vm = va_arg (*va, vlib_main_t *); - vlib_buffer_t * b = va_arg (*va, vlib_buffer_t *); - + vlib_main_t *vm = va_arg (*va, vlib_main_t *); + vlib_buffer_t *b = va_arg (*va, vlib_buffer_t *); + while (1) { - vec_add (s, vlib_buffer_get_current (b), - b->current_length); - if (! (b->flags & VLIB_BUFFER_NEXT_PRESENT)) + vec_add (s, vlib_buffer_get_current (b), b->current_length); + if (!(b->flags & VLIB_BUFFER_NEXT_PRESENT)) break; b = vlib_get_buffer (vm, b->next_buffer); } @@ -147,10 +150,10 @@ vlib_main_t **vlib_mains; /* Aligned copy routine. */ void -vlib_aligned_memcpy (void * _dst, void * _src, int n_bytes) +vlib_aligned_memcpy (void *_dst, void *_src, int n_bytes) { - vlib_copy_unit_t * dst = _dst; - vlib_copy_unit_t * src = _src; + vlib_copy_unit_t *dst = _dst; + vlib_copy_unit_t *src = _src; /* Arguments must be naturally aligned. */ ASSERT (pointer_to_uword (dst) % sizeof (dst[0]) == 0); @@ -198,7 +201,7 @@ vlib_aligned_memcpy (void * _dst, void * _src, int n_bytes) } } else - /* Cache line size unknown: fall back to slow version. */; + /* Cache line size unknown: fall back to slow version. */ ; while (n_bytes > 0) { @@ -269,8 +272,8 @@ merge_free_lists (vlib_buffer_free_list_t * dst, vlib_buffer_free_list_t * src) { uword l; - u32 * d; - + u32 *d; + trim_aligned (src); trim_aligned (dst); @@ -294,10 +297,10 @@ merge_free_lists (vlib_buffer_free_list_t * dst, always_inline u32 vlib_buffer_get_free_list_with_size (vlib_main_t * vm, u32 size) { - vlib_buffer_main_t * bm = vm->buffer_main; + vlib_buffer_main_t *bm = vm->buffer_main; size = vlib_buffer_round_size (size); - uword * p = hash_get (bm->free_list_by_size, size); + uword *p = hash_get (bm->free_list_by_size, size); return p ? p[0] : ~0; } @@ -305,24 +308,26 @@ vlib_buffer_get_free_list_with_size (vlib_main_t * vm, u32 size) static u32 vlib_buffer_create_free_list_helper (vlib_main_t * vm, u32 n_data_bytes, - u32 is_public, - u32 is_default, - u8 * name) + u32 is_public, u32 is_default, u8 * name) { - vlib_buffer_main_t * bm = vm->buffer_main; - vlib_buffer_free_list_t * f; + vlib_buffer_main_t *bm = vm->buffer_main; + vlib_buffer_free_list_t *f; - if (! is_default && pool_elts (bm->buffer_free_list_pool) == 0) + if (!is_default && pool_elts (bm->buffer_free_list_pool) == 0) { u32 default_free_free_list_index; + /* *INDENT-OFF* */ default_free_free_list_index = - vlib_buffer_create_free_list_helper (vm, - /* default buffer size */ VLIB_BUFFER_DEFAULT_FREE_LIST_BYTES, - /* is_public */ 1, - /* is_default */ 1, - (u8 *) "default"); - ASSERT (default_free_free_list_index == VLIB_BUFFER_DEFAULT_FREE_LIST_INDEX); + vlib_buffer_create_free_list_helper + (vm, + /* default buffer size */ VLIB_BUFFER_DEFAULT_FREE_LIST_BYTES, + /* is_public */ 1, + /* is_default */ 1, + (u8 *) "default"); + /* *INDENT-ON* */ + ASSERT (default_free_free_list_index == + VLIB_BUFFER_DEFAULT_FREE_LIST_INDEX); if (n_data_bytes == VLIB_BUFFER_DEFAULT_FREE_LIST_BYTES && is_public) return default_free_free_list_index; @@ -341,19 +346,20 @@ vlib_buffer_create_free_list_helper (vlib_main_t * vm, if (is_public) { - uword * p = hash_get (bm->free_list_by_size, f->n_data_bytes); - if (! p) + uword *p = hash_get (bm->free_list_by_size, f->n_data_bytes); + if (!p) hash_set (bm->free_list_by_size, f->n_data_bytes, f->index); } return f->index; } -u32 vlib_buffer_create_free_list (vlib_main_t * vm, u32 n_data_bytes, - char * fmt, ...) +u32 +vlib_buffer_create_free_list (vlib_main_t * vm, u32 n_data_bytes, + char *fmt, ...) { va_list va; - u8 * name; + u8 *name; va_start (va, fmt); name = va_format (0, fmt, &va); @@ -365,15 +371,16 @@ u32 vlib_buffer_create_free_list (vlib_main_t * vm, u32 n_data_bytes, name); } -u32 vlib_buffer_get_or_create_free_list (vlib_main_t * vm, u32 n_data_bytes, - char * fmt, ...) +u32 +vlib_buffer_get_or_create_free_list (vlib_main_t * vm, u32 n_data_bytes, + char *fmt, ...) { u32 i = vlib_buffer_get_free_list_with_size (vm, n_data_bytes); if (i == ~0) { va_list va; - u8 * name; + u8 *name; va_start (va, fmt); name = va_format (0, fmt, &va); @@ -384,7 +391,7 @@ u32 vlib_buffer_get_or_create_free_list (vlib_main_t * vm, u32 n_data_bytes, /* is_default */ 0, name); } - + return i; } @@ -395,28 +402,31 @@ del_free_list (vlib_main_t * vm, vlib_buffer_free_list_t * f) struct rte_mbuf *mb; vlib_buffer_t *b; - for (i = 0; i < vec_len (f->unaligned_buffers); i++) { + for (i = 0; i < vec_len (f->unaligned_buffers); i++) + { b = vlib_get_buffer (vm, f->unaligned_buffers[i]); - mb = rte_mbuf_from_vlib_buffer(b); - ASSERT(rte_mbuf_refcnt_read(mb) == 1); + mb = rte_mbuf_from_vlib_buffer (b); + ASSERT (rte_mbuf_refcnt_read (mb) == 1); rte_pktmbuf_free (mb); - } - for (i = 0; i < vec_len (f->aligned_buffers); i++) { + } + for (i = 0; i < vec_len (f->aligned_buffers); i++) + { b = vlib_get_buffer (vm, f->aligned_buffers[i]); - mb = rte_mbuf_from_vlib_buffer(b); - ASSERT(rte_mbuf_refcnt_read(mb) == 1); + mb = rte_mbuf_from_vlib_buffer (b); + ASSERT (rte_mbuf_refcnt_read (mb) == 1); rte_pktmbuf_free (mb); - } + } vec_free (f->name); vec_free (f->unaligned_buffers); vec_free (f->aligned_buffers); } /* Add buffer free list. */ -void vlib_buffer_delete_free_list (vlib_main_t * vm, u32 free_list_index) +void +vlib_buffer_delete_free_list (vlib_main_t * vm, u32 free_list_index) { - vlib_buffer_main_t * bm = vm->buffer_main; - vlib_buffer_free_list_t * f; + vlib_buffer_main_t *bm = vm->buffer_main; + vlib_buffer_free_list_t *f; u32 merge_index; f = vlib_buffer_get_free_list (vm, free_list_index); @@ -439,19 +449,18 @@ void vlib_buffer_delete_free_list (vlib_main_t * vm, u32 free_list_index) /* Make sure free list has at least given number of free buffers. */ static uword fill_free_list (vlib_main_t * vm, - vlib_buffer_free_list_t * fl, - uword min_free_buffers) + vlib_buffer_free_list_t * fl, uword min_free_buffers) { - vlib_buffer_t * b; + vlib_buffer_t *b; int n, i; u32 bi; u32 n_remaining = 0, n_alloc = 0; - unsigned socket_id = rte_socket_id ? rte_socket_id() : 0; + unsigned socket_id = rte_socket_id ? rte_socket_id () : 0; struct rte_mempool *rmp = vm->buffer_main->pktmbuf_pools[socket_id]; struct rte_mbuf *mb; - + /* Too early? */ - if (PREDICT_FALSE(rmp == 0)) + if (PREDICT_FALSE (rmp == 0)) return 0; trim_aligned (fl); @@ -467,8 +476,8 @@ fill_free_list (vlib_main_t * vm, /* Always allocate new buffers in reasonably large sized chunks. */ n = clib_max (n, fl->min_n_buffers_each_physmem_alloc); - vec_validate (vm->mbuf_alloc_list, n-1); - + vec_validate (vm->mbuf_alloc_list, n - 1); + if (rte_mempool_get_bulk (rmp, vm->mbuf_alloc_list, n) < 0) return 0; @@ -478,23 +487,23 @@ fill_free_list (vlib_main_t * vm, { mb = vm->mbuf_alloc_list[i]; - ASSERT(rte_mbuf_refcnt_read(mb) == 0); - rte_mbuf_refcnt_set(mb, 1); + ASSERT (rte_mbuf_refcnt_read (mb) == 0); + rte_mbuf_refcnt_set (mb, 1); mb->next = NULL; mb->data_off = RTE_PKTMBUF_HEADROOM; mb->nb_segs = 1; - b = vlib_buffer_from_rte_mbuf(mb); + b = vlib_buffer_from_rte_mbuf (mb); bi = vlib_get_buffer_index (vm, b); - + vec_add1_aligned (fl->aligned_buffers, bi, sizeof (vlib_copy_unit_t)); n_alloc++; n_remaining--; vlib_buffer_init_for_free_list (b, fl); - + if (fl->buffer_init_function) - fl->buffer_init_function (vm, fl, &bi, 1); + fl->buffer_init_function (vm, fl, &bi, 1); } fl->n_alloc += n; @@ -504,15 +513,16 @@ fill_free_list (vlib_main_t * vm, always_inline uword copy_alignment (u32 * x) -{ return (pointer_to_uword (x) / sizeof (x[0])) % BUFFERS_PER_COPY; } +{ + return (pointer_to_uword (x) / sizeof (x[0])) % BUFFERS_PER_COPY; +} static u32 alloc_from_free_list (vlib_main_t * vm, vlib_buffer_free_list_t * free_list, - u32 * alloc_buffers, - u32 n_alloc_buffers) + u32 * alloc_buffers, u32 n_alloc_buffers) { - u32 * dst, * u_src; + u32 *dst, *u_src; uword u_len, n_left; uword n_unaligned_start, n_unaligned_end, n_filled; @@ -524,7 +534,7 @@ alloc_from_free_list (vlib_main_t * vm, n_filled = fill_free_list (vm, free_list, n_alloc_buffers); if (n_filled == 0) return 0; - + n_left = n_filled < n_left ? n_filled : n_left; n_alloc_buffers = n_left; @@ -562,11 +572,12 @@ alloc_from_free_list (vlib_main_t * vm, /* Aligned copy. */ { - vlib_copy_unit_t * d, * s; + vlib_copy_unit_t *d, *s; uword n_copy; - if (vec_len(free_list->aligned_buffers) < ((n_left/BUFFERS_PER_COPY)*BUFFERS_PER_COPY)) - abort(); + if (vec_len (free_list->aligned_buffers) < + ((n_left / BUFFERS_PER_COPY) * BUFFERS_PER_COPY)) + abort (); n_copy = n_left / BUFFERS_PER_COPY; n_left = n_left % BUFFERS_PER_COPY; @@ -609,7 +620,7 @@ alloc_from_free_list (vlib_main_t * vm, u_len--; } - if (! free_list->unaligned_buffers) + if (!free_list->unaligned_buffers) ASSERT (u_len == 0); else _vec_len (free_list->unaligned_buffers) = u_len; @@ -620,9 +631,10 @@ alloc_from_free_list (vlib_main_t * vm, /* Allocate a given number of buffers into given array. Returns number actually allocated which will be either zero or number requested. */ -u32 vlib_buffer_alloc (vlib_main_t * vm, u32 * buffers, u32 n_buffers) +u32 +vlib_buffer_alloc (vlib_main_t * vm, u32 * buffers, u32 n_buffers) { - vlib_buffer_main_t * bm = vm->buffer_main; + vlib_buffer_main_t *bm = vm->buffer_main; return alloc_from_free_list (vm, @@ -631,43 +643,45 @@ u32 vlib_buffer_alloc (vlib_main_t * vm, u32 * buffers, u32 n_buffers) buffers, n_buffers); } -u32 vlib_buffer_alloc_from_free_list (vlib_main_t * vm, - u32 * buffers, - u32 n_buffers, - u32 free_list_index) +u32 +vlib_buffer_alloc_from_free_list (vlib_main_t * vm, + u32 * buffers, + u32 n_buffers, u32 free_list_index) { - vlib_buffer_main_t * bm = vm->buffer_main; - vlib_buffer_free_list_t * f; + vlib_buffer_main_t *bm = vm->buffer_main; + vlib_buffer_free_list_t *f; f = pool_elt_at_index (bm->buffer_free_list_pool, free_list_index); return alloc_from_free_list (vm, f, buffers, n_buffers); } always_inline void add_buffer_to_free_list (vlib_main_t * vm, - vlib_buffer_free_list_t * f, + vlib_buffer_free_list_t * f, u32 buffer_index, u8 do_init) { - vlib_buffer_t * b; + vlib_buffer_t *b; b = vlib_get_buffer (vm, buffer_index); - if (PREDICT_TRUE(do_init)) - vlib_buffer_init_for_free_list (b, f); - vec_add1_aligned (f->aligned_buffers, buffer_index, sizeof (vlib_copy_unit_t)); + if (PREDICT_TRUE (do_init)) + vlib_buffer_init_for_free_list (b, f); + vec_add1_aligned (f->aligned_buffers, buffer_index, + sizeof (vlib_copy_unit_t)); } always_inline vlib_buffer_free_list_t * buffer_get_free_list (vlib_main_t * vm, vlib_buffer_t * b, u32 * index) { - vlib_buffer_main_t * bm = vm->buffer_main; + vlib_buffer_main_t *bm = vm->buffer_main; u32 i; *index = i = b->free_list_index; return pool_elt_at_index (bm->buffer_free_list_pool, i); } -void *vlib_set_buffer_free_callback (vlib_main_t *vm, void *fp) +void * +vlib_set_buffer_free_callback (vlib_main_t * vm, void *fp) { - vlib_buffer_main_t * bm = vm->buffer_main; - void * rv = bm->buffer_free_callback; + vlib_buffer_main_t *bm = vm->buffer_main; + void *rv = bm->buffer_free_callback; bm->buffer_free_callback = fp; return rv; @@ -675,137 +689,135 @@ void *vlib_set_buffer_free_callback (vlib_main_t *vm, void *fp) static_always_inline void vlib_buffer_free_inline (vlib_main_t * vm, - u32 * buffers, - u32 n_buffers, - u32 follow_buffer_next) + u32 * buffers, u32 n_buffers, u32 follow_buffer_next) { - vlib_buffer_main_t * bm = vm->buffer_main; - vlib_buffer_free_list_t * fl; + vlib_buffer_main_t *bm = vm->buffer_main; + vlib_buffer_free_list_t *fl; u32 fi; int i; - u32 (*cb)(vlib_main_t * vm, u32 * buffers, u32 n_buffers, - u32 follow_buffer_next); + u32 (*cb) (vlib_main_t * vm, u32 * buffers, u32 n_buffers, + u32 follow_buffer_next); cb = bm->buffer_free_callback; if (PREDICT_FALSE (cb != 0)) - n_buffers = (*cb)(vm, buffers, n_buffers, follow_buffer_next); + n_buffers = (*cb) (vm, buffers, n_buffers, follow_buffer_next); - if (! n_buffers) + if (!n_buffers) return; - for (i = 0; i < n_buffers; i++) + for (i = 0; i < n_buffers; i++) { - vlib_buffer_t * b; - struct rte_mbuf * mb; - + vlib_buffer_t *b; + struct rte_mbuf *mb; + b = vlib_get_buffer (vm, buffers[i]); fl = buffer_get_free_list (vm, b, &fi); - + /* The only current use of this callback: multicast recycle */ - if (PREDICT_FALSE (fl->buffers_added_to_freelist_function != 0)) - { - int j; - - add_buffer_to_free_list - (vm, fl, buffers[i], - (b->flags & VLIB_BUFFER_RECYCLE) == 0); - - for (j = 0; j < vec_len (bm->announce_list); j++) - { - if (fl == bm->announce_list[j]) - goto already_announced; - } - vec_add1 (bm->announce_list, fl); - already_announced: - ; - } + if (PREDICT_FALSE (fl->buffers_added_to_freelist_function != 0)) + { + int j; + + add_buffer_to_free_list + (vm, fl, buffers[i], (b->flags & VLIB_BUFFER_RECYCLE) == 0); + + for (j = 0; j < vec_len (bm->announce_list); j++) + { + if (fl == bm->announce_list[j]) + goto already_announced; + } + vec_add1 (bm->announce_list, fl); + already_announced: + ; + } else - { - if (PREDICT_TRUE ((b->flags & VLIB_BUFFER_RECYCLE) == 0)) + { + if (PREDICT_TRUE ((b->flags & VLIB_BUFFER_RECYCLE) == 0)) { - mb = rte_mbuf_from_vlib_buffer(b); - ASSERT(rte_mbuf_refcnt_read(mb) == 1); + mb = rte_mbuf_from_vlib_buffer (b); + ASSERT (rte_mbuf_refcnt_read (mb) == 1); rte_pktmbuf_free (mb); } } } - if (vec_len(bm->announce_list)) + if (vec_len (bm->announce_list)) { - vlib_buffer_free_list_t * fl; + vlib_buffer_free_list_t *fl; for (i = 0; i < vec_len (bm->announce_list); i++) - { - fl = bm->announce_list[i]; - fl->buffers_added_to_freelist_function (vm, fl); - } - _vec_len(bm->announce_list) = 0; + { + fl = bm->announce_list[i]; + fl->buffers_added_to_freelist_function (vm, fl); + } + _vec_len (bm->announce_list) = 0; } } -void vlib_buffer_free (vlib_main_t * vm, - u32 * buffers, - u32 n_buffers) +void +vlib_buffer_free (vlib_main_t * vm, u32 * buffers, u32 n_buffers) { - vlib_buffer_free_inline (vm, buffers, n_buffers, /* follow_buffer_next */ 1); + vlib_buffer_free_inline (vm, buffers, n_buffers, /* follow_buffer_next */ + 1); } -void vlib_buffer_free_no_next (vlib_main_t * vm, - u32 * buffers, - u32 n_buffers) +void +vlib_buffer_free_no_next (vlib_main_t * vm, u32 * buffers, u32 n_buffers) { - vlib_buffer_free_inline (vm, buffers, n_buffers, /* follow_buffer_next */ 0); + vlib_buffer_free_inline (vm, buffers, n_buffers, /* follow_buffer_next */ + 0); } /* Copy template packet data into buffers as they are allocated. */ -__attribute__((unused)) static void -vlib_packet_template_buffer_init (vlib_main_t * vm, - vlib_buffer_free_list_t * fl, - u32 * buffers, - u32 n_buffers) +__attribute__ ((unused)) + static void + vlib_packet_template_buffer_init (vlib_main_t * vm, + vlib_buffer_free_list_t * fl, + u32 * buffers, u32 n_buffers) { - vlib_packet_template_t * t = uword_to_pointer (fl->buffer_init_function_opaque, - vlib_packet_template_t *); + vlib_packet_template_t *t = + uword_to_pointer (fl->buffer_init_function_opaque, + vlib_packet_template_t *); uword i; for (i = 0; i < n_buffers; i++) { - vlib_buffer_t * b = vlib_get_buffer (vm, buffers[i]); + vlib_buffer_t *b = vlib_get_buffer (vm, buffers[i]); ASSERT (b->current_length == vec_len (t->packet_data)); - clib_memcpy (vlib_buffer_get_current (b), t->packet_data, b->current_length); + clib_memcpy (vlib_buffer_get_current (b), t->packet_data, + b->current_length); } } -void vlib_packet_template_init (vlib_main_t * vm, - vlib_packet_template_t * t, - void * packet_data, - uword n_packet_data_bytes, - uword min_n_buffers_each_physmem_alloc, - char * fmt, - ...) +void +vlib_packet_template_init (vlib_main_t * vm, + vlib_packet_template_t * t, + void *packet_data, + uword n_packet_data_bytes, + uword min_n_buffers_each_physmem_alloc, + char *fmt, ...) { va_list va; - __attribute__((unused)) u8 * name; + __attribute__ ((unused)) u8 *name; va_start (va, fmt); name = va_format (0, fmt, &va); va_end (va); - vlib_worker_thread_barrier_sync(vm); + vlib_worker_thread_barrier_sync (vm); memset (t, 0, sizeof (t[0])); vec_add (t->packet_data, packet_data, n_packet_data_bytes); - vlib_worker_thread_barrier_release(vm); + vlib_worker_thread_barrier_release (vm); } void * -vlib_packet_template_get_packet (vlib_main_t * vm, - vlib_packet_template_t * t, - u32 * bi_result) +vlib_packet_template_get_packet (vlib_main_t * vm, + vlib_packet_template_t * t, u32 * bi_result) { u32 bi; - vlib_buffer_t * b; + vlib_buffer_t *b; if (vlib_buffer_alloc (vm, &bi, 1) != 1) return 0; @@ -814,12 +826,12 @@ vlib_packet_template_get_packet (vlib_main_t * vm, b = vlib_get_buffer (vm, bi); clib_memcpy (vlib_buffer_get_current (b), - t->packet_data, vec_len(t->packet_data)); - b->current_length = vec_len(t->packet_data); + t->packet_data, vec_len (t->packet_data)); + b->current_length = vec_len (t->packet_data); /* Fix up mbuf header length fields */ - struct rte_mbuf * mb; - mb = rte_mbuf_from_vlib_buffer(b); + struct rte_mbuf *mb; + mb = rte_mbuf_from_vlib_buffer (b); mb->data_len = b->current_length; mb->pkt_len = b->current_length; @@ -827,14 +839,14 @@ vlib_packet_template_get_packet (vlib_main_t * vm, } /* Append given data to end of buffer, possibly allocating new buffers. */ -u32 vlib_buffer_add_data (vlib_main_t * vm, - u32 free_list_index, - u32 buffer_index, - void * data, u32 n_data_bytes) +u32 +vlib_buffer_add_data (vlib_main_t * vm, + u32 free_list_index, + u32 buffer_index, void *data, u32 n_data_bytes) { u32 n_buffer_bytes, n_left, n_left_this_buffer, bi; - vlib_buffer_t * b; - void * d; + vlib_buffer_t *b; + void *d; bi = buffer_index; if (bi == 0 @@ -844,11 +856,11 @@ u32 vlib_buffer_add_data (vlib_main_t * vm, d = data; n_left = n_data_bytes; n_buffer_bytes = vlib_buffer_free_list_buffer_size (vm, free_list_index); - + b = vlib_get_buffer (vm, bi); b->flags &= ~VLIB_BUFFER_TOTAL_LENGTH_VALID; - /* Get to the end of the chain before we try to append data...*/ + /* Get to the end of the chain before we try to append data... */ while (b->flags & VLIB_BUFFER_NEXT_PRESENT) b = vlib_get_buffer (vm, b->next_buffer); @@ -857,7 +869,8 @@ u32 vlib_buffer_add_data (vlib_main_t * vm, u32 n; ASSERT (n_buffer_bytes >= b->current_length); - n_left_this_buffer = n_buffer_bytes - (b->current_data + b->current_length); + n_left_this_buffer = + n_buffer_bytes - (b->current_data + b->current_length); n = clib_min (n_left_this_buffer, n_left); clib_memcpy (vlib_buffer_get_current (b) + b->current_length, d, n); b->current_length += n; @@ -866,7 +879,9 @@ u32 vlib_buffer_add_data (vlib_main_t * vm, break; d += n; - if (1 != vlib_buffer_alloc_from_free_list (vm, &b->next_buffer, 1, free_list_index)) + if (1 != + vlib_buffer_alloc_from_free_list (vm, &b->next_buffer, 1, + free_list_index)) goto out_of_buffers; b->flags |= VLIB_BUFFER_NEXT_PRESENT; @@ -876,115 +891,123 @@ u32 vlib_buffer_add_data (vlib_main_t * vm, return bi; - out_of_buffers: +out_of_buffers: clib_error ("out of buffers"); return bi; } u16 -vlib_buffer_chain_append_data_with_alloc(vlib_main_t *vm, - u32 free_list_index, - vlib_buffer_t *first, - vlib_buffer_t **last, - void * data, u16 data_len) { +vlib_buffer_chain_append_data_with_alloc (vlib_main_t * vm, + u32 free_list_index, + vlib_buffer_t * first, + vlib_buffer_t ** last, + void *data, u16 data_len) +{ vlib_buffer_t *l = *last; - u32 n_buffer_bytes = vlib_buffer_free_list_buffer_size (vm, free_list_index); + u32 n_buffer_bytes = + vlib_buffer_free_list_buffer_size (vm, free_list_index); u16 copied = 0; - ASSERT(n_buffer_bytes >= l->current_length + l->current_data); - while (data_len) { - u16 max = n_buffer_bytes - l->current_length - l->current_data; - if (max == 0) { - if (1 != vlib_buffer_alloc_from_free_list (vm, &l->next_buffer, 1, free_list_index)) - return copied; - *last = l = vlib_buffer_chain_buffer(vm, first, l, l->next_buffer); - max = n_buffer_bytes - l->current_length - l->current_data; - } + ASSERT (n_buffer_bytes >= l->current_length + l->current_data); + while (data_len) + { + u16 max = n_buffer_bytes - l->current_length - l->current_data; + if (max == 0) + { + if (1 != + vlib_buffer_alloc_from_free_list (vm, &l->next_buffer, 1, + free_list_index)) + return copied; + *last = l = vlib_buffer_chain_buffer (vm, first, l, l->next_buffer); + max = n_buffer_bytes - l->current_length - l->current_data; + } - u16 len = (data_len > max)?max:data_len; - clib_memcpy(vlib_buffer_get_current (l) + l->current_length, data + copied, len); - vlib_buffer_chain_increase_length(first, l, len); - data_len -= len; - copied += len; - } + u16 len = (data_len > max) ? max : data_len; + clib_memcpy (vlib_buffer_get_current (l) + l->current_length, + data + copied, len); + vlib_buffer_chain_increase_length (first, l, len); + data_len -= len; + copied += len; + } return copied; } /* * Fills in the required rte_mbuf fields for chained buffers given a VLIB chain. */ -void vlib_buffer_chain_validate (vlib_main_t * vm, vlib_buffer_t * b_first) +void +vlib_buffer_chain_validate (vlib_main_t * vm, vlib_buffer_t * b_first) { vlib_buffer_t *b = b_first, *prev = b_first; struct rte_mbuf *mb_prev, *mb, *mb_first; - mb_first = rte_mbuf_from_vlib_buffer(b_first); + mb_first = rte_mbuf_from_vlib_buffer (b_first); mb_first->pkt_len = mb_first->data_len = b_first->current_length; - while (b->flags & VLIB_BUFFER_NEXT_PRESENT) { - b = vlib_get_buffer(vm, b->next_buffer); - mb = rte_mbuf_from_vlib_buffer(b); - mb_prev = rte_mbuf_from_vlib_buffer(prev); + while (b->flags & VLIB_BUFFER_NEXT_PRESENT) + { + b = vlib_get_buffer (vm, b->next_buffer); + mb = rte_mbuf_from_vlib_buffer (b); + mb_prev = rte_mbuf_from_vlib_buffer (prev); mb_first->nb_segs++; mb_first->pkt_len += b->current_length; mb_prev->next = mb; mb->data_len = b->current_length; prev = b; - } + } } clib_error_t * -vlib_buffer_pool_create(vlib_main_t * vm, unsigned num_mbufs, - unsigned socket_id) +vlib_buffer_pool_create (vlib_main_t * vm, unsigned num_mbufs, + unsigned socket_id) { - vlib_buffer_main_t * bm = vm->buffer_main; - vlib_physmem_main_t * vpm = &vm->physmem_main; - struct rte_mempool * rmp; + vlib_buffer_main_t *bm = vm->buffer_main; + vlib_physmem_main_t *vpm = &vm->physmem_main; + struct rte_mempool *rmp; uword new_start, new_size; int i; if (!rte_pktmbuf_pool_create) return clib_error_return (0, "not linked with DPDK"); - vec_validate_aligned(bm->pktmbuf_pools, socket_id, CLIB_CACHE_LINE_BYTES); + vec_validate_aligned (bm->pktmbuf_pools, socket_id, CLIB_CACHE_LINE_BYTES); /* pool already exists, nothing to do */ if (bm->pktmbuf_pools[socket_id]) return 0; - u8 * pool_name = format(0, "mbuf_pool_socket%u%c",socket_id, 0); + u8 *pool_name = format (0, "mbuf_pool_socket%u%c", socket_id, 0); - rmp = rte_pktmbuf_pool_create((char *) pool_name, /* pool name */ - num_mbufs, /* number of mbufs */ - 512, /* cache size */ - VLIB_BUFFER_HDR_SIZE, /* priv size */ - VLIB_BUFFER_PRE_DATA_SIZE - + VLIB_BUFFER_DATA_SIZE, /* dataroom size */ - socket_id); /* cpu socket */ + rmp = rte_pktmbuf_pool_create ((char *) pool_name, /* pool name */ + num_mbufs, /* number of mbufs */ + 512, /* cache size */ + VLIB_BUFFER_HDR_SIZE, /* priv size */ + VLIB_BUFFER_PRE_DATA_SIZE + VLIB_BUFFER_DATA_SIZE, /* dataroom size */ + socket_id); /* cpu socket */ - vec_free(pool_name); + vec_free (pool_name); if (rmp) { - new_start = pointer_to_uword(rmp); + new_start = pointer_to_uword (rmp); new_size = rmp->elt_va_end - new_start; if (vpm->virtual.size > 0) - { - ASSERT(new_start != vpm->virtual.start); - if (new_start < vpm->virtual.start) - { - new_size = vpm->virtual.size + vpm->virtual.start - new_start; - } - else - { - new_size += new_start - vpm->virtual.start; - new_start = vpm->virtual.start; - } - - /* check if fits into buffer index range */ - if ( (u64)new_size > ( (u64) 1 << (32 + CLIB_LOG2_CACHE_LINE_BYTES))) - rmp = 0; - } + { + ASSERT (new_start != vpm->virtual.start); + if (new_start < vpm->virtual.start) + { + new_size = vpm->virtual.size + vpm->virtual.start - new_start; + } + else + { + new_size += new_start - vpm->virtual.start; + new_start = vpm->virtual.start; + } + + /* check if fits into buffer index range */ + if ((u64) new_size > ((u64) 1 << (32 + CLIB_LOG2_CACHE_LINE_BYTES))) + rmp = 0; + } } if (rmp) @@ -997,44 +1020,50 @@ vlib_buffer_pool_create(vlib_main_t * vm, unsigned num_mbufs, } /* no usable pool for this socket, try to use pool from another one */ - for (i = 0; i < vec_len(bm->pktmbuf_pools); i++) + for (i = 0; i < vec_len (bm->pktmbuf_pools); i++) { - if(bm->pktmbuf_pools[i]) - { - clib_warning("WARNING: Failed to allocate mempool for CPU socket %u. " - "Threads running on socket %u will use socket %u mempool.", - socket_id, socket_id, i); - bm->pktmbuf_pools[socket_id] = bm->pktmbuf_pools[i]; - return 0; - } + if (bm->pktmbuf_pools[i]) + { + clib_warning + ("WARNING: Failed to allocate mempool for CPU socket %u. " + "Threads running on socket %u will use socket %u mempool.", + socket_id, socket_id, i); + bm->pktmbuf_pools[socket_id] = bm->pktmbuf_pools[i]; + return 0; + } } return clib_error_return (0, "failed to allocate mempool on socket %u", - socket_id); + socket_id); } -static void vlib_serialize_tx (serialize_main_header_t * m, serialize_stream_t * s) +static void +vlib_serialize_tx (serialize_main_header_t * m, serialize_stream_t * s) { - vlib_main_t * vm; - vlib_serialize_buffer_main_t * sm; + vlib_main_t *vm; + vlib_serialize_buffer_main_t *sm; uword n, n_bytes_to_write; - vlib_buffer_t * last; + vlib_buffer_t *last; n_bytes_to_write = s->current_buffer_index; - sm = uword_to_pointer (s->data_function_opaque, vlib_serialize_buffer_main_t *); + sm = + uword_to_pointer (s->data_function_opaque, + vlib_serialize_buffer_main_t *); vm = sm->vlib_main; ASSERT (sm->tx.max_n_data_bytes_per_chain > 0); if (serialize_stream_is_end_of_stream (s) - || sm->tx.n_total_data_bytes + n_bytes_to_write > sm->tx.max_n_data_bytes_per_chain) + || sm->tx.n_total_data_bytes + n_bytes_to_write > + sm->tx.max_n_data_bytes_per_chain) { - vlib_process_t * p = vlib_get_current_process (vm); + vlib_process_t *p = vlib_get_current_process (vm); last = vlib_get_buffer (vm, sm->last_buffer); last->current_length = n_bytes_to_write; - vlib_set_next_frame_buffer (vm, &p->node_runtime, sm->tx.next_index, sm->first_buffer); + vlib_set_next_frame_buffer (vm, &p->node_runtime, sm->tx.next_index, + sm->first_buffer); sm->first_buffer = sm->last_buffer = ~0; sm->tx.n_total_data_bytes = 0; @@ -1044,19 +1073,28 @@ static void vlib_serialize_tx (serialize_main_header_t * m, serialize_stream_t * { ASSERT (sm->first_buffer == ~0); ASSERT (sm->last_buffer == ~0); - n = vlib_buffer_alloc_from_free_list (vm, &sm->first_buffer, 1, sm->tx.free_list_index); + n = + vlib_buffer_alloc_from_free_list (vm, &sm->first_buffer, 1, + sm->tx.free_list_index); if (n != 1) - serialize_error (m, clib_error_create ("vlib_buffer_alloc_from_free_list fails")); + serialize_error (m, + clib_error_create + ("vlib_buffer_alloc_from_free_list fails")); sm->last_buffer = sm->first_buffer; - s->n_buffer_bytes = vlib_buffer_free_list_buffer_size (vm, sm->tx.free_list_index); + s->n_buffer_bytes = + vlib_buffer_free_list_buffer_size (vm, sm->tx.free_list_index); } if (n_bytes_to_write > 0) { - vlib_buffer_t * prev = vlib_get_buffer (vm, sm->last_buffer); - n = vlib_buffer_alloc_from_free_list (vm, &sm->last_buffer, 1, sm->tx.free_list_index); + vlib_buffer_t *prev = vlib_get_buffer (vm, sm->last_buffer); + n = + vlib_buffer_alloc_from_free_list (vm, &sm->last_buffer, 1, + sm->tx.free_list_index); if (n != 1) - serialize_error (m, clib_error_create ("vlib_buffer_alloc_from_free_list fails")); + serialize_error (m, + clib_error_create + ("vlib_buffer_alloc_from_free_list fails")); sm->tx.n_total_data_bytes += n_bytes_to_write; prev->current_length = n_bytes_to_write; prev->next_buffer = sm->last_buffer; @@ -1072,13 +1110,16 @@ static void vlib_serialize_tx (serialize_main_header_t * m, serialize_stream_t * } } -static void vlib_serialize_rx (serialize_main_header_t * m, serialize_stream_t * s) +static void +vlib_serialize_rx (serialize_main_header_t * m, serialize_stream_t * s) { - vlib_main_t * vm; - vlib_serialize_buffer_main_t * sm; - vlib_buffer_t * last; + vlib_main_t *vm; + vlib_serialize_buffer_main_t *sm; + vlib_buffer_t *last; - sm = uword_to_pointer (s->data_function_opaque, vlib_serialize_buffer_main_t *); + sm = + uword_to_pointer (s->data_function_opaque, + vlib_serialize_buffer_main_t *); vm = sm->vlib_main; if (serialize_stream_is_end_of_stream (s)) @@ -1101,8 +1142,11 @@ static void vlib_serialize_rx (serialize_main_header_t * m, serialize_stream_t * { while (clib_fifo_elts (sm->rx.buffer_fifo) == 0) { - sm->rx.ready_one_time_event = vlib_process_create_one_time_event (vm, vlib_current_process (vm), ~0); - vlib_process_wait_for_one_time_event (vm, /* no event data */ 0, sm->rx.ready_one_time_event); + sm->rx.ready_one_time_event = + vlib_process_create_one_time_event (vm, vlib_current_process (vm), + ~0); + vlib_process_wait_for_one_time_event (vm, /* no event data */ 0, + sm->rx.ready_one_time_event); } clib_fifo_sub1 (sm->rx.buffer_fifo, sm->first_buffer); @@ -1120,12 +1164,11 @@ static void vlib_serialize_rx (serialize_main_header_t * m, serialize_stream_t * static void serialize_open_vlib_helper (serialize_main_t * m, vlib_main_t * vm, - vlib_serialize_buffer_main_t * sm, - uword is_read) + vlib_serialize_buffer_main_t * sm, uword is_read) { /* Initialize serialize main but save overflow buffer for re-use between calls. */ { - u8 * save = m->stream.overflow_buffer; + u8 *save = m->stream.overflow_buffer; memset (m, 0, sizeof (m[0])); m->stream.overflow_buffer = save; if (save) @@ -1142,18 +1185,28 @@ serialize_open_vlib_helper (serialize_main_t * m, m->stream.data_function_opaque = pointer_to_uword (sm); } -void serialize_open_vlib_buffer (serialize_main_t * m, vlib_main_t * vm, vlib_serialize_buffer_main_t * sm) -{ serialize_open_vlib_helper (m, vm, sm, /* is_read */ 0); } +void +serialize_open_vlib_buffer (serialize_main_t * m, vlib_main_t * vm, + vlib_serialize_buffer_main_t * sm) +{ + serialize_open_vlib_helper (m, vm, sm, /* is_read */ 0); +} -void unserialize_open_vlib_buffer (serialize_main_t * m, vlib_main_t * vm, vlib_serialize_buffer_main_t * sm) -{ serialize_open_vlib_helper (m, vm, sm, /* is_read */ 1); } +void +unserialize_open_vlib_buffer (serialize_main_t * m, vlib_main_t * vm, + vlib_serialize_buffer_main_t * sm) +{ + serialize_open_vlib_helper (m, vm, sm, /* is_read */ 1); +} -u32 serialize_close_vlib_buffer (serialize_main_t * m) +u32 +serialize_close_vlib_buffer (serialize_main_t * m) { - vlib_serialize_buffer_main_t * sm - = uword_to_pointer (m->stream.data_function_opaque, vlib_serialize_buffer_main_t *); - vlib_buffer_t * last; - serialize_stream_t * s = &m->stream; + vlib_serialize_buffer_main_t *sm + = uword_to_pointer (m->stream.data_function_opaque, + vlib_serialize_buffer_main_t *); + vlib_buffer_t *last; + serialize_stream_t *s = &m->stream; last = vlib_get_buffer (sm->vlib_main, sm->last_buffer); last->current_length = s->current_buffer_index; @@ -1171,10 +1224,12 @@ u32 serialize_close_vlib_buffer (serialize_main_t * m) return sm->first_buffer; } -void unserialize_close_vlib_buffer (serialize_main_t * m) +void +unserialize_close_vlib_buffer (serialize_main_t * m) { - vlib_serialize_buffer_main_t * sm - = uword_to_pointer (m->stream.data_function_opaque, vlib_serialize_buffer_main_t *); + vlib_serialize_buffer_main_t *sm + = uword_to_pointer (m->stream.data_function_opaque, + vlib_serialize_buffer_main_t *); if (sm->first_buffer != ~0) vlib_buffer_free_one (sm->vlib_main, sm->first_buffer); clib_fifo_reset (sm->rx.buffer_fifo); @@ -1182,15 +1237,17 @@ void unserialize_close_vlib_buffer (serialize_main_t * m) _vec_len (m->stream.overflow_buffer) = 0; } -static u8 * format_vlib_buffer_free_list (u8 * s, va_list * va) +static u8 * +format_vlib_buffer_free_list (u8 * s, va_list * va) { - vlib_buffer_free_list_t * f = va_arg (*va, vlib_buffer_free_list_t *); - u32 threadnum= va_arg (*va, u32); + vlib_buffer_free_list_t *f = va_arg (*va, vlib_buffer_free_list_t *); + u32 threadnum = va_arg (*va, u32); uword bytes_alloc, bytes_free, n_free, size; - if (! f) + if (!f) return format (s, "%=7s%=30s%=12s%=12s%=12s%=12s%=12s%=12s", - "Thread", "Name", "Index", "Size", "Alloc", "Free", "#Alloc", "#Free"); + "Thread", "Name", "Index", "Size", "Alloc", "Free", + "#Alloc", "#Free"); size = sizeof (vlib_buffer_t) + f->n_data_bytes; n_free = vec_len (f->aligned_buffers) + vec_len (f->unaligned_buffers); @@ -1198,68 +1255,80 @@ static u8 * format_vlib_buffer_free_list (u8 * s, va_list * va) bytes_free = size * n_free; s = format (s, "%7d%30s%12d%12d%=12U%=12U%=12d%=12d", - threadnum, + threadnum, f->name, f->index, f->n_data_bytes, format_memory_size, bytes_alloc, - format_memory_size, bytes_free, - f->n_alloc, n_free); + format_memory_size, bytes_free, f->n_alloc, n_free); return s; } static clib_error_t * show_buffers (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { - vlib_buffer_main_t * bm; - vlib_buffer_free_list_t * f; + vlib_buffer_main_t *bm; + vlib_buffer_free_list_t *f; vlib_main_t *curr_vm; u32 vm_index = 0; vlib_cli_output (vm, "%U", format_vlib_buffer_free_list, 0, 0); - do { - curr_vm = vec_len(vlib_mains) ? vlib_mains[vm_index] : vm; - bm = curr_vm->buffer_main; - + do + { + curr_vm = vec_len (vlib_mains) ? vlib_mains[vm_index] : vm; + bm = curr_vm->buffer_main; + + /* *INDENT-OFF* */ pool_foreach (f, bm->buffer_free_list_pool, ({ vlib_cli_output (vm, "%U", format_vlib_buffer_free_list, f, vm_index); })); + /* *INDENT-ON* */ - vm_index++; - } while (vm_index < vec_len(vlib_mains)); + vm_index++; + } + while (vm_index < vec_len (vlib_mains)); return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (show_buffers_command, static) = { .path = "show buffers", .short_help = "Show packet buffer allocation", .function = show_buffers, }; +/* *INDENT-ON* */ #if CLIB_DEBUG > 0 -u32 * vlib_buffer_state_validation_lock; -uword * vlib_buffer_state_validation_hash; -void * vlib_buffer_state_heap; +u32 *vlib_buffer_state_validation_lock; +uword *vlib_buffer_state_validation_hash; +void *vlib_buffer_state_heap; -static clib_error_t * +static clib_error_t * buffer_state_validation_init (vlib_main_t * vm) { - void * oldheap; + void *oldheap; - vlib_buffer_state_heap = mheap_alloc (0, 10<<20); + vlib_buffer_state_heap = mheap_alloc (0, 10 << 20); oldheap = clib_mem_set_heap (vlib_buffer_state_heap); - vlib_buffer_state_validation_hash = hash_create (0, sizeof(uword)); - vec_validate_aligned (vlib_buffer_state_validation_lock, 0, - CLIB_CACHE_LINE_BYTES); + vlib_buffer_state_validation_hash = hash_create (0, sizeof (uword)); + vec_validate_aligned (vlib_buffer_state_validation_lock, 0, + CLIB_CACHE_LINE_BYTES); clib_mem_set_heap (oldheap); return 0; } VLIB_INIT_FUNCTION (buffer_state_validation_init); #endif + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/elog_samples.c b/vlib/vlib/elog_samples.c index 0a5cd202252..a8c800df959 100644 --- a/vlib/vlib/elog_samples.c +++ b/vlib/vlib/elog_samples.c @@ -16,14 +16,17 @@ #include <vlib/vlib.h> #include <vppinfra/elog.h> -static inline void elog_four_int_sample (u32 *data) +static inline void +elog_four_int_sample (u32 * data) { - ELOG_TYPE_DECLARE(e) = - { - .format = "four int: first %d second %d third %d fourth %d", - .format_args = "i4i4i4i4", - }; - struct { u32 data[4];} * ed; + ELOG_TYPE_DECLARE (e) = + { + .format = "four int: first %d second %d third %d fourth %d",.format_args = + "i4i4i4i4",}; + struct + { + u32 data[4]; + } *ed; ed = ELOG_DATA (&vlib_global_main.elog_main, e); ed->data[0] = data[0]; ed->data[1] = data[1]; @@ -31,15 +34,19 @@ static inline void elog_four_int_sample (u32 *data) ed->data[3] = data[3]; } -static inline void elog_four_int_track_sample (u32 *data) +static inline void +elog_four_int_track_sample (u32 * data) { - ELOG_TYPE_DECLARE(e) = - { - .format = "four_int_track: first %d second %d third %d fourth %d", - .format_args = "i4i4i4i4", - }; - struct { u32 data[4];} * ed; - ELOG_TRACK(sample_track); + ELOG_TYPE_DECLARE (e) = + { + .format = + "four_int_track: first %d second %d third %d fourth %d",.format_args = + "i4i4i4i4",}; + struct + { + u32 data[4]; + } *ed; + ELOG_TRACK (sample_track); ed = ELOG_TRACK_DATA (&vlib_global_main.elog_main, e, sample_track); ed->data[0] = data[0]; ed->data[1] = data[1]; @@ -47,39 +54,36 @@ static inline void elog_four_int_track_sample (u32 *data) ed->data[3] = data[3]; } -static inline void elog_enum_sample (u8 which) +static inline void +elog_enum_sample (u8 which) { - ELOG_TYPE_DECLARE (e) = + ELOG_TYPE_DECLARE (e) = + { + .format = "my enum: %s",.format_args = "t1",.n_enum_strings = + 2,.enum_strings = { - .format = "my enum: %s", - .format_args = "t1", - .n_enum_strings = 2, - .enum_strings = - { - "string 1", - "string 2", - }, - }; - struct { u8 which;} * ed; + "string 1", "string 2",},}; + struct + { + u8 which; + } *ed; ed = ELOG_DATA (&vlib_global_main.elog_main, e); ed->which = which; } -static inline void elog_one_datum_sample (u32 data) +static inline void +elog_one_datum_sample (u32 data) { - ELOG_TYPE_DECLARE (e) = - { - .format = "one datum: %d", - .format_args = "i4", - }; - + ELOG_TYPE_DECLARE (e) = + { + .format = "one datum: %d",.format_args = "i4",}; + elog (&vlib_global_main.elog_main, &e, data); } static clib_error_t * test_elog_command_fn (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { int i; u32 samples[4]; @@ -87,9 +91,9 @@ test_elog_command_fn (vlib_main_t * vm, for (i = 0; i < 10; i++) { samples[0] = i; - samples[1] = i+1; - samples[2] = i+2; - samples[3] = i+3; + samples[1] = i + 1; + samples[2] = i + 2; + samples[3] = i + 3; elog_four_int_sample (samples); elog_four_int_track_sample (samples); @@ -101,8 +105,18 @@ test_elog_command_fn (vlib_main_t * vm, return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (test_elog_command, static) = { .path = "test elog sample", .short_help = "test elog sample", .function = test_elog_command_fn, }; +/* *INDENT-ON* */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/error.c b/vlib/vlib/error.c index e7380364f48..a2c2317686b 100644 --- a/vlib/vlib/error.c +++ b/vlib/vlib/error.c @@ -47,10 +47,9 @@ vlib_error_drop_buffers (vlib_main_t * vm, u32 next_buffer_stride, u32 n_buffers, u32 next_index, - u32 drop_error_node, - u32 drop_error_code) + u32 drop_error_node, u32 drop_error_code) { - u32 n_left_this_frame, n_buffers_left, * args, n_args_left; + u32 n_left_this_frame, n_buffers_left, *args, n_args_left; vlib_error_t drop_error; drop_error = vlib_error_set (drop_error_node, drop_error_code); @@ -67,7 +66,7 @@ vlib_error_drop_buffers (vlib_main_t * vm, while (n_left_this_frame >= 4) { u32 bi0, bi1, bi2, bi3; - vlib_buffer_t * b0, * b1, * b2, * b3; + vlib_buffer_t *b0, *b1, *b2, *b3; args[0] = bi0 = buffers[0]; args[1] = bi1 = buffers[1]; @@ -92,7 +91,7 @@ vlib_error_drop_buffers (vlib_main_t * vm, while (n_left_this_frame >= 1) { u32 bi0; - vlib_buffer_t * b0; + vlib_buffer_t *b0; args[0] = bi0 = buffers[0]; @@ -113,22 +112,21 @@ vlib_error_drop_buffers (vlib_main_t * vm, /* Convenience node to drop a vector of buffers with a "misc error". */ static uword misc_drop_buffers (vlib_main_t * vm, - vlib_node_runtime_t * node, - vlib_frame_t * frame) + vlib_node_runtime_t * node, vlib_frame_t * frame) { - return vlib_error_drop_buffers (vm, node, - vlib_frame_args (frame), - /* buffer stride */ 1, - frame->n_vectors, - /* next */ 0, - node->node_index, - /* error */ 0); + return vlib_error_drop_buffers (vm, node, vlib_frame_args (frame), + /* buffer stride */ 1, + frame->n_vectors, + /* next */ 0, + node->node_index, + /* error */ 0); } -static char * misc_drop_buffers_error_strings[] = { - [0] = "misc. errors", +static char *misc_drop_buffers_error_strings[] = { + [0] = "misc. errors", }; +/* *INDENT-OFF* */ VLIB_REGISTER_NODE (misc_drop_buffers_node,static) = { .function = misc_drop_buffers, .name = "misc-drop-buffers", @@ -140,18 +138,18 @@ VLIB_REGISTER_NODE (misc_drop_buffers_node,static) = { }, .error_strings = misc_drop_buffers_error_strings, }; +/* *INDENT-ON* */ /* Reserves given number of error codes for given node. */ -void vlib_register_errors (vlib_main_t * vm, - u32 node_index, - u32 n_errors, - char * error_strings[]) +void +vlib_register_errors (vlib_main_t * vm, + u32 node_index, u32 n_errors, char *error_strings[]) { - vlib_error_main_t * em = &vm->error_main; - vlib_node_t * n = vlib_get_node (vm, node_index); + vlib_error_main_t *em = &vm->error_main; + vlib_node_t *n = vlib_get_node (vm, node_index); uword l; - ASSERT(os_get_cpu_number() == 0); + ASSERT (os_get_cpu_number () == 0); /* Free up any previous error strings. */ if (n->n_errors > 0) @@ -164,14 +162,12 @@ void vlib_register_errors (vlib_main_t * vm, return; n->error_heap_index = - heap_alloc (em->error_strings_heap, n_errors, - n->error_heap_handle); + heap_alloc (em->error_strings_heap, n_errors, n->error_heap_handle); l = vec_len (em->error_strings_heap); clib_memcpy (vec_elt_at_index (em->error_strings_heap, n->error_heap_index), - error_strings, - n_errors * sizeof (error_strings[0])); + error_strings, n_errors * sizeof (error_strings[0])); /* Allocate a counter/elog type for each error. */ vec_validate (em->counters, l - 1); @@ -180,12 +176,11 @@ void vlib_register_errors (vlib_main_t * vm, /* Zero counters for re-registrations of errors. */ if (n->error_heap_index + n_errors <= vec_len (em->counters_last_clear)) clib_memcpy (em->counters + n->error_heap_index, - em->counters_last_clear + n->error_heap_index, - n_errors * sizeof (em->counters[0])); + em->counters_last_clear + n->error_heap_index, + n_errors * sizeof (em->counters[0])); else memset (em->counters + n->error_heap_index, - 0, - n_errors * sizeof (em->counters[0])); + 0, n_errors * sizeof (em->counters[0])); { elog_event_type_t t; @@ -195,8 +190,7 @@ void vlib_register_errors (vlib_main_t * vm, for (i = 0; i < n_errors; i++) { t.format = (char *) format (0, "%v %s: %%d", - n->name, - error_strings[i]); + n->name, error_strings[i]); vm->error_elog_event_types[n->error_heap_index + i] = t; } } @@ -204,35 +198,37 @@ void vlib_register_errors (vlib_main_t * vm, static clib_error_t * show_errors (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { - vlib_error_main_t * em = &vm->error_main; - vlib_node_t * n; + vlib_error_main_t *em = &vm->error_main; + vlib_node_t *n; u32 code, i, ni; u64 c; int index = 0; int verbose = 0; - u64 * sums = 0; + u64 *sums = 0; if (unformat (input, "verbose %d", &verbose)) ; else if (unformat (input, "verbose")) verbose = 1; - vec_validate(sums, vec_len(em->counters)); + vec_validate (sums, vec_len (em->counters)); if (verbose) - vlib_cli_output (vm, "%=10s%=40s%=20s%=6s", "Count", "Node", "Reason", - "Index"); + vlib_cli_output (vm, "%=10s%=40s%=20s%=6s", "Count", "Node", "Reason", + "Index"); else vlib_cli_output (vm, "%=10s%=40s%=6s", "Count", "Node", "Reason"); + + /* *INDENT-OFF* */ foreach_vlib_main(({ em = &this_vlib_main->error_main; if (verbose) - vlib_cli_output(vm, "Thread %u (%v):", index, vlib_worker_threads[index].name); + vlib_cli_output(vm, "Thread %u (%v):", index, + vlib_worker_threads[index].name); for (ni = 0; ni < vec_len (this_vlib_main->node_main.nodes); ni++) { @@ -249,18 +245,19 @@ show_errors (vlib_main_t * vm, continue; if (verbose) - vlib_cli_output (vm, "%10Ld%=40v%=20s%=6d", c, n->name, + vlib_cli_output (vm, "%10Ld%=40v%=20s%=6d", c, n->name, em->error_strings_heap[i], i); else - vlib_cli_output (vm, "%10d%=40v%s", c, n->name, + vlib_cli_output (vm, "%10d%=40v%s", c, n->name, em->error_strings_heap[i]); } } index++; })); + /* *INDENT-ON* */ if (verbose) - vlib_cli_output(vm, "Total:"); + vlib_cli_output (vm, "Total:"); for (ni = 0; ni < vec_len (vm->node_main.nodes); ni++) { @@ -269,56 +266,73 @@ show_errors (vlib_main_t * vm, { i = n->error_heap_index + code; if (sums[i]) - { - if (verbose) - vlib_cli_output (vm, "%10Ld%=40v%=20s%=10d", sums[i], n->name, - em->error_strings_heap[i], i); - } + { + if (verbose) + vlib_cli_output (vm, "%10Ld%=40v%=20s%=10d", sums[i], n->name, + em->error_strings_heap[i], i); + } } } - vec_free(sums); + vec_free (sums); return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (cli_show_errors, static) = { .path = "show errors", .short_help = "Show error counts", .function = show_errors, }; +/* *INDENT-ON* */ +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (cli_show_node_counters, static) = { .path = "show node counters", .short_help = "Show node counters", .function = show_errors, }; +/* *INDENT-ON* */ static clib_error_t * clear_error_counters (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { - vlib_error_main_t * em; + vlib_error_main_t *em; u32 i; + /* *INDENT-OFF* */ foreach_vlib_main(({ em = &this_vlib_main->error_main; vec_validate (em->counters_last_clear, vec_len (em->counters) - 1); for (i = 0; i < vec_len (em->counters); i++) em->counters_last_clear[i] = em->counters[i]; })); + /* *INDENT-ON* */ return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (cli_clear_error_counters, static) = { .path = "clear errors", .short_help = "Clear error counters", .function = clear_error_counters, }; +/* *INDENT-ON* */ +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (cli_clear_node_counters, static) = { .path = "clear node counters", .short_help = "Clear node counters", .function = clear_error_counters, }; +/* *INDENT-ON* */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/error.h b/vlib/vlib/error.h index 4bf0b926718..df2075c306d 100644 --- a/vlib/vlib/error.h +++ b/vlib/vlib/error.h @@ -45,11 +45,15 @@ typedef u32 vlib_error_t; always_inline u32 vlib_error_get_node (vlib_error_t e) -{ return e >> 12; } +{ + return e >> 12; +} always_inline u32 vlib_error_get_code (vlib_error_t e) -{ return e & 0xfff; } +{ + return e & 0xfff; +} always_inline vlib_error_t vlib_error_set (u32 node_index, u32 code) @@ -68,22 +72,30 @@ vlib_error_set_code (vlib_error_t e, u32 code) return e; } -typedef struct { +typedef struct +{ /* Error counters. */ - u64 * counters; + u64 *counters; /* Counter values as of last counter clear. */ - u64 * counters_last_clear; + u64 *counters_last_clear; /* Error name strings in heap. Heap index indexes counter vector. */ - char ** error_strings_heap; + char **error_strings_heap; } vlib_error_main_t; /* Per node error registration. */ -void vlib_register_errors (struct vlib_main_t * vm, +void vlib_register_errors (struct vlib_main_t *vm, u32 node_index, - u32 n_errors, - char * error_strings[]); + u32 n_errors, char *error_strings[]); #endif /* included_vlib_error_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/error_funcs.h b/vlib/vlib/error_funcs.h index acdd5d2d898..1a3602e92c6 100644 --- a/vlib/vlib/error_funcs.h +++ b/vlib/vlib/error_funcs.h @@ -45,17 +45,18 @@ always_inline void vlib_error_elog_count (vlib_main_t * vm, uword counter, uword increment) { - elog_main_t * em = &vm->elog_main; + elog_main_t *em = &vm->elog_main; if (VLIB_ELOG_MAIN_LOOP > 0 && increment > 0) - elog (em, vec_elt_at_index (vm->error_elog_event_types, counter), increment); + elog (em, vec_elt_at_index (vm->error_elog_event_types, counter), + increment); } always_inline void vlib_error_count (vlib_main_t * vm, uword node_index, uword counter, uword increment) { - vlib_node_t * n = vlib_get_node (vm, node_index); - vlib_error_main_t * em = &vm->error_main; + vlib_node_t *n = vlib_get_node (vm, node_index); + vlib_error_main_t *em = &vm->error_main; ASSERT (counter < n->n_errors); counter += n->error_heap_index; @@ -74,7 +75,14 @@ vlib_error_drop_buffers (vlib_main_t * vm, u32 next_buffer_stride, u32 n_buffers, u32 error_next_index, - u32 error_node, - u32 error_code); + u32 error_node, u32 error_code); #endif /* included_vlib_error_funcs_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/format.c b/vlib/vlib/format.c index 3c77d8dbd18..79a4d6866db 100644 --- a/vlib/vlib/format.c +++ b/vlib/vlib/format.c @@ -39,32 +39,46 @@ #include <vlib/vlib.h> -u8 * format_vlib_rx_tx (u8 * s, va_list * args) +u8 * +format_vlib_rx_tx (u8 * s, va_list * args) { vlib_rx_or_tx_t r = va_arg (*args, vlib_rx_or_tx_t); - char * t; + char *t; switch (r) { - case VLIB_RX: t = "rx"; break; - case VLIB_TX: t = "tx"; break; - default: t = "INVALID"; break; + case VLIB_RX: + t = "rx"; + break; + case VLIB_TX: + t = "tx"; + break; + default: + t = "INVALID"; + break; } vec_add (s, t, strlen (t)); return s; } -u8 * format_vlib_read_write (u8 * s, va_list * args) +u8 * +format_vlib_read_write (u8 * s, va_list * args) { vlib_rx_or_tx_t r = va_arg (*args, vlib_rx_or_tx_t); - char * t; + char *t; switch (r) { - case VLIB_READ: t = "read"; break; - case VLIB_WRITE: t = "write"; break; - default: t = "INVALID"; break; + case VLIB_READ: + t = "read"; + break; + case VLIB_WRITE: + t = "write"; + break; + default: + t = "INVALID"; + break; } vec_add (s, t, strlen (t)); @@ -72,9 +86,10 @@ u8 * format_vlib_read_write (u8 * s, va_list * args) } /* Formats buffer data as printable ascii or as hex. */ -u8 * format_vlib_buffer_data (u8 * s, va_list * args) +u8 * +format_vlib_buffer_data (u8 * s, va_list * args) { - u8 * data = va_arg (*args, u8 *); + u8 *data = va_arg (*args, u8 *); u32 n_data_bytes = va_arg (*args, u32); u32 i, is_printable; @@ -87,7 +102,7 @@ u8 * format_vlib_buffer_data (u8 * s, va_list * args) else if (c >= 0x7f) is_printable = 0; } - + if (is_printable) vec_add (s, data, n_data_bytes); else @@ -97,9 +112,10 @@ u8 * format_vlib_buffer_data (u8 * s, va_list * args) } /* Enable/on => 1; disable/off => 0. */ -uword unformat_vlib_enable_disable (unformat_input_t * input, va_list * args) +uword +unformat_vlib_enable_disable (unformat_input_t * input, va_list * args) { - int * result = va_arg (*args, int *); + int *result = va_arg (*args, int *); int enable; if (unformat (input, "enable") || unformat (input, "on")) @@ -114,9 +130,10 @@ uword unformat_vlib_enable_disable (unformat_input_t * input, va_list * args) } /* rx/tx => VLIB_RX/VLIB_TX. */ -uword unformat_vlib_rx_tx (unformat_input_t * input, va_list * args) +uword +unformat_vlib_rx_tx (unformat_input_t * input, va_list * args) { - int * result = va_arg (*args, int *); + int *result = va_arg (*args, int *); if (unformat (input, "rx")) *result = VLIB_RX; else if (unformat (input, "tx")) @@ -127,29 +144,29 @@ uword unformat_vlib_rx_tx (unformat_input_t * input, va_list * args) } /* Parse an int either %d or 0x%x. */ -uword unformat_vlib_number (unformat_input_t * input, va_list * args) +uword +unformat_vlib_number (unformat_input_t * input, va_list * args) { - int * result = va_arg (*args, int *); + int *result = va_arg (*args, int *); - return (unformat (input, "0x%x", result) - || unformat (input, "%d", result)); + return (unformat (input, "0x%x", result) || unformat (input, "%d", result)); } /* Parse a-zA-Z0-9_ token and hash to value. */ -uword unformat_vlib_number_by_name (unformat_input_t * input, va_list * args) +uword +unformat_vlib_number_by_name (unformat_input_t * input, va_list * args) { - uword * hash = va_arg (*args, uword *); - int * result = va_arg (*args, int *); - uword * p; - u8 * token; + uword *hash = va_arg (*args, uword *); + int *result = va_arg (*args, int *); + uword *p; + u8 *token; int i; - if (! unformat_user (input, unformat_token, "a-zA-Z0-9_", &token)) + if (!unformat_user (input, unformat_token, "a-zA-Z0-9_", &token)) return 0; /* Null terminate. */ - if (vec_len (token) > 0 && - token[vec_len (token) - 1] != 0) + if (vec_len (token) > 0 && token[vec_len (token) - 1] != 0) vec_add1 (token, 0); /* Check for exact match. */ @@ -163,9 +180,17 @@ uword unformat_vlib_number_by_name (unformat_input_t * input, va_list * args) token[i] = 'A' + token[i] - 'a'; p = hash_get_mem (hash, token); - done: +done: vec_free (token); if (p) *result = p[0]; return p != 0; } + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/format_funcs.h b/vlib/vlib/format_funcs.h index 02d8a555d78..f60b8940d14 100644 --- a/vlib/vlib/format_funcs.h +++ b/vlib/vlib/format_funcs.h @@ -41,11 +41,11 @@ #define included_vlib_format_h /* Format vlib_rx_or_tx_t/vlib_read_or_write_t enum as string. */ -u8 * format_vlib_rx_tx (u8 * s, va_list * args); -u8 * format_vlib_read_write (u8 * s, va_list * args); +u8 *format_vlib_rx_tx (u8 * s, va_list * args); +u8 *format_vlib_read_write (u8 * s, va_list * args); /* Formats buffer data as printable ascii or as hex. */ -u8 * format_vlib_buffer_data (u8 * s, va_list * args); +u8 *format_vlib_buffer_data (u8 * s, va_list * args); /* Enable/on => 1; disable/off => 0. */ uword unformat_vlib_enable_disable (unformat_input_t * input, va_list * args); @@ -65,3 +65,11 @@ uword unformat_vlib_number (unformat_input_t * input, va_list * args); #define FORMAT_VLIB_HEADER_NO_RECURSION (~0) #endif /* included_vlib_format_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/global_funcs.h b/vlib/vlib/global_funcs.h index 406ce7d71b6..bbdbdef50b2 100644 --- a/vlib/vlib/global_funcs.h +++ b/vlib/vlib/global_funcs.h @@ -22,16 +22,24 @@ always_inline vlib_main_t * vlib_get_main (void) { - vlib_main_t * vm; - vm = vlib_mains ? vlib_mains[os_get_cpu_number()] : &vlib_global_main; - ASSERT(vm); + vlib_main_t *vm; + vm = vlib_mains ? vlib_mains[os_get_cpu_number ()] : &vlib_global_main; + ASSERT (vm); return vm; } always_inline vlib_thread_main_t * -vlib_get_thread_main() +vlib_get_thread_main () { return &vlib_thread_main; } #endif /* included_vlib_global_funcs_h_ */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/i2c.c b/vlib/vlib/i2c.c index 83a702edbd6..97f5bb21cc7 100644 --- a/vlib/vlib/i2c.c +++ b/vlib/vlib/i2c.c @@ -19,7 +19,7 @@ static inline void i2c_delay (i2c_bus_t * b, f64 timeout) { - vlib_main_t * vm = vlib_get_main(); + vlib_main_t *vm = vlib_get_main (); vlib_time_wait (vm, timeout); } @@ -31,7 +31,7 @@ i2c_wait_for_scl (i2c_bus_t * b) while (t < b->hold_time) { int sda, scl; - i2c_delay(b, b->rise_fall_time); + i2c_delay (b, b->rise_fall_time); b->get_bits (b, &scl, &sda); if (scl) @@ -87,7 +87,7 @@ i2c_write_bit (i2c_bus_t * b, int sda) } static void -i2c_read_bit (i2c_bus_t * b, int * sda) +i2c_read_bit (i2c_bus_t * b, int *sda) { int scl; @@ -116,7 +116,7 @@ i2c_write_byte (i2c_bus_t * b, u8 data) b->put_bits (b, 0, 1); i2c_delay (b, b->rise_fall_time); - i2c_read_bit(b, &sda); + i2c_read_bit (b, &sda); if (sda) b->timeout = 1; @@ -171,35 +171,37 @@ vlib_i2c_xfer (i2c_bus_t * bus, i2c_msg_t * msgs) int i; vec_foreach (msg, msgs) - { - i2c_start (bus); - i2c_write_byte (bus, (msg->addr << 1) + (msg->flags == I2C_MSG_FLAG_READ)); - - if (msg->flags & I2C_MSG_FLAG_READ) - for (i=0; i< msg->len; i++) - { - i2c_read_byte (bus, &msg->buffer[i], /* ack */ i + 1 != msg->len); - if (bus->timeout) - goto done; - } - - else - for (i=0; i< msg->len; i++) - { - i2c_write_byte (bus, msg->buffer[i]); - if (bus->timeout) - goto done; - } - } + { + i2c_start (bus); + i2c_write_byte (bus, + (msg->addr << 1) + (msg->flags == I2C_MSG_FLAG_READ)); + + if (msg->flags & I2C_MSG_FLAG_READ) + for (i = 0; i < msg->len; i++) + { + i2c_read_byte (bus, &msg->buffer[i], /* ack */ i + 1 != msg->len); + if (bus->timeout) + goto done; + } + + else + for (i = 0; i < msg->len; i++) + { + i2c_write_byte (bus, msg->buffer[i]); + if (bus->timeout) + goto done; + } + } done: - i2c_stop(bus); + i2c_stop (bus); } void -vlib_i2c_read_eeprom (i2c_bus_t * bus, u8 i2c_addr, u16 start_addr, u16 length, u8 * data) +vlib_i2c_read_eeprom (i2c_bus_t * bus, u8 i2c_addr, u16 start_addr, + u16 length, u8 * data) { - i2c_msg_t * msg = 0; + i2c_msg_t *msg = 0; u8 start_address[1]; vec_validate (msg, 1); @@ -207,7 +209,7 @@ vlib_i2c_read_eeprom (i2c_bus_t * bus, u8 i2c_addr, u16 start_addr, u16 length, start_address[0] = start_addr; msg[0].addr = i2c_addr; msg[0].flags = I2C_MSG_FLAG_WRITE; - msg[0].buffer = (u8 *) &start_address; + msg[0].buffer = (u8 *) & start_address; msg[0].len = 1; msg[1].addr = i2c_addr; @@ -215,8 +217,15 @@ vlib_i2c_read_eeprom (i2c_bus_t * bus, u8 i2c_addr, u16 start_addr, u16 length, msg[1].buffer = data; msg[1].len = length; - vlib_i2c_xfer(bus, msg); + vlib_i2c_xfer (bus, msg); vec_free (msg); } +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/i2c.h b/vlib/vlib/i2c.h index 451957d8513..b79bdc75b81 100644 --- a/vlib/vlib/i2c.h +++ b/vlib/vlib/i2c.h @@ -22,16 +22,18 @@ #define I2C_MSG_FLAG_WRITE 0 #define I2C_MSG_FLAG_READ 1 -typedef struct { - u8 addr; - u8 flags; - u16 len; - u8 * buffer; +typedef struct +{ + u8 addr; + u8 flags; + u16 len; + u8 *buffer; } i2c_msg_t; -typedef struct i2c_bus_t { - void (* put_bits) (struct i2c_bus_t * b, int scl, int sda); - void (* get_bits) (struct i2c_bus_t * b, int *scl, int *sda); +typedef struct i2c_bus_t +{ + void (*put_bits) (struct i2c_bus_t * b, int scl, int sda); + void (*get_bits) (struct i2c_bus_t * b, int *scl, int *sda); int timeout; u32 clock; @@ -45,13 +47,21 @@ typedef struct i2c_bus_t { void vlib_i2c_init (i2c_bus_t * bus); void vlib_i2c_xfer (i2c_bus_t * bus, i2c_msg_t * msgs); -void vlib_i2c_read_eeprom (i2c_bus_t * bus, u8 i2c_addr, u16 start_addr, u16 length, u8 * data); +void vlib_i2c_read_eeprom (i2c_bus_t * bus, u8 i2c_addr, u16 start_addr, + u16 length, u8 * data); static inline int -vlib_i2c_bus_timed_out(i2c_bus_t * bus) +vlib_i2c_bus_timed_out (i2c_bus_t * bus) { return bus->timeout; } #endif /* included_vlib_i2c_h */ +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/init.c b/vlib/vlib/init.c index 3991c800147..8d4784513ab 100644 --- a/vlib/vlib/init.c +++ b/vlib/vlib/init.c @@ -40,30 +40,31 @@ #include <vlib/vlib.h> clib_error_t * -vlib_call_init_exit_functions (vlib_main_t * vm, - _vlib_init_function_list_elt_t *head, - int call_once) +vlib_call_init_exit_functions (vlib_main_t * vm, + _vlib_init_function_list_elt_t * head, + int call_once) { - clib_error_t * error = 0; - _vlib_init_function_list_elt_t * i; + clib_error_t *error = 0; + _vlib_init_function_list_elt_t *i; i = head; while (i) { if (call_once && !hash_get (vm->init_functions_called, i->f)) - { - if (call_once) - hash_set1 (vm->init_functions_called, i->f); - error = i->f (vm); - if (error) - return error; - } + { + if (call_once) + hash_set1 (vm->init_functions_called, i->f); + error = i->f (vm); + if (error) + return error; + } i = i->next_init_function; } return error; } -clib_error_t * vlib_call_all_init_functions (vlib_main_t * vm) +clib_error_t * +vlib_call_all_init_functions (vlib_main_t * vm) { /* Call dummy functions to make sure purely static modules are linked in. */ @@ -71,29 +72,31 @@ clib_error_t * vlib_call_all_init_functions (vlib_main_t * vm) foreach_vlib_module_reference; #undef _ - return vlib_call_init_exit_functions - (vm, vm->init_function_registrations, 1 /* call_once */); + return vlib_call_init_exit_functions + (vm, vm->init_function_registrations, 1 /* call_once */ ); } -clib_error_t * vlib_call_all_main_loop_enter_functions (vlib_main_t * vm) -{ - return vlib_call_init_exit_functions - (vm, vm->main_loop_enter_function_registrations, 1 /* call_once */); +clib_error_t * +vlib_call_all_main_loop_enter_functions (vlib_main_t * vm) +{ + return vlib_call_init_exit_functions + (vm, vm->main_loop_enter_function_registrations, 1 /* call_once */ ); } -clib_error_t * vlib_call_all_main_loop_exit_functions (vlib_main_t * vm) -{ - return vlib_call_init_exit_functions - (vm, vm->main_loop_exit_function_registrations, 1 /* call_once */); +clib_error_t * +vlib_call_all_main_loop_exit_functions (vlib_main_t * vm) +{ + return vlib_call_init_exit_functions + (vm, vm->main_loop_exit_function_registrations, 1 /* call_once */ ); } -clib_error_t * vlib_call_all_config_functions (vlib_main_t * vm, - unformat_input_t * input, - int is_early) +clib_error_t * +vlib_call_all_config_functions (vlib_main_t * vm, + unformat_input_t * input, int is_early) { - clib_error_t * error = 0; - vlib_config_function_runtime_t * c, ** all; - uword * hash = 0, * p; + clib_error_t *error = 0; + vlib_config_function_runtime_t *c, **all; + uword *hash = 0, *p; uword i; hash = hash_create_string (0, sizeof (uword)); @@ -111,10 +114,9 @@ clib_error_t * vlib_call_all_config_functions (vlib_main_t * vm, while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { - u8 * s, * v; + u8 *s, *v; - if (! unformat (input, "%s %v", &s, &v) - || ! (p = hash_get_mem (hash, s))) + if (!unformat (input, "%s %v", &s, &v) || !(p = hash_get_mem (hash, s))) { error = clib_error_create ("unknown input `%s %v'", s, v); goto done; @@ -134,7 +136,7 @@ clib_error_t * vlib_call_all_config_functions (vlib_main_t * vm, /* Is this an early config? Are we doing early configs? */ if (is_early ^ c->is_early) - continue; + continue; /* Already called? */ if (hash_get (vm->init_functions_called, c->function)) @@ -146,7 +148,7 @@ clib_error_t * vlib_call_all_config_functions (vlib_main_t * vm, goto done; } - done: +done: for (i = 0; i < vec_len (all); i++) { c = all[i]; @@ -156,3 +158,11 @@ clib_error_t * vlib_call_all_config_functions (vlib_main_t * vm, hash_free (hash); return error; } + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/init.h b/vlib/vlib/init.h index c2a4014fd5b..4fa5b304590 100644 --- a/vlib/vlib/init.h +++ b/vlib/vlib/init.h @@ -48,27 +48,29 @@ functions are typically used to register and setup packet processing nodes. */ -typedef clib_error_t * (vlib_init_function_t) (struct vlib_main_t * vm); +typedef clib_error_t *(vlib_init_function_t) (struct vlib_main_t * vm); -typedef struct _vlib_init_function_list_elt { - struct _vlib_init_function_list_elt * next_init_function; - vlib_init_function_t * f; +typedef struct _vlib_init_function_list_elt +{ + struct _vlib_init_function_list_elt *next_init_function; + vlib_init_function_t *f; } _vlib_init_function_list_elt_t; /* Configuration functions: called with configuration input just before main polling loop starts. */ -typedef clib_error_t * (vlib_config_function_t) (struct vlib_main_t * vm, - unformat_input_t * input); +typedef clib_error_t *(vlib_config_function_t) (struct vlib_main_t * vm, + unformat_input_t * input); -typedef struct vlib_config_function_runtime_t { +typedef struct vlib_config_function_runtime_t +{ /* Function to call. Set to null once function has already been called. */ - vlib_config_function_t * function; + vlib_config_function_t *function; /* Input for function. */ unformat_input_t input; /* next config function registration */ - struct vlib_config_function_runtime_t * next_registration; + struct vlib_config_function_runtime_t *next_registration; /* To be invoked as soon as the clib heap is available */ u8 is_early; @@ -104,7 +106,7 @@ static void __vlib_add_##tag##_function_##x (void) \ = vm->tag##_function_registrations; \ vm->tag##_function_registrations = &_vlib_init_function; \ _vlib_init_function.f = &x; \ -} +} #define VLIB_INIT_FUNCTION(x) VLIB_DECLARE_INIT_FUNCTION(x,init) @@ -207,16 +209,16 @@ static void __vlib_add_config_function_##x (void) \ }) /* External functions. */ -clib_error_t * vlib_call_all_init_functions (struct vlib_main_t * vm); -clib_error_t * vlib_call_all_config_functions (struct vlib_main_t * vm, - unformat_input_t * input, - int is_early); -clib_error_t * vlib_call_all_main_loop_enter_functions (struct vlib_main_t * vm); -clib_error_t * vlib_call_all_main_loop_exit_functions (struct vlib_main_t * vm); -clib_error_t * -vlib_call_init_exit_functions (struct vlib_main_t * vm, - _vlib_init_function_list_elt_t *head, - int call_once); +clib_error_t *vlib_call_all_init_functions (struct vlib_main_t *vm); +clib_error_t *vlib_call_all_config_functions (struct vlib_main_t *vm, + unformat_input_t * input, + int is_early); +clib_error_t *vlib_call_all_main_loop_enter_functions (struct vlib_main_t + *vm); +clib_error_t *vlib_call_all_main_loop_exit_functions (struct vlib_main_t *vm); +clib_error_t *vlib_call_init_exit_functions (struct vlib_main_t *vm, + _vlib_init_function_list_elt_t * + head, int call_once); #define foreach_vlib_module_reference \ _ (node_cli) \ @@ -226,5 +228,11 @@ vlib_call_init_exit_functions (struct vlib_main_t * vm, #define _(x) void vlib_##x##_reference (void); foreach_vlib_module_reference #undef _ - #endif /* included_vlib_init_h */ +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/lex.c b/vlib/vlib/lex.c index de650900c11..1cc8f1678d2 100644 --- a/vlib/vlib/lex.c +++ b/vlib/vlib/lex.c @@ -19,10 +19,11 @@ vlib_lex_main_t vlib_lex_main; #define LEX_DEBUG 0 -u8 * format_vlib_lex_token (u8 * s, va_list * args) +u8 * +format_vlib_lex_token (u8 * s, va_list * args) { vlib_lex_main_t *lm = va_arg (*args, vlib_lex_main_t *); - vlib_lex_token_t *t = va_arg (*args, vlib_lex_token_t *); + vlib_lex_token_t *t = va_arg (*args, vlib_lex_token_t *); if (t->token == VLIB_LEX_word) s = format (s, "%s", t->value.as_pointer); @@ -31,7 +32,8 @@ u8 * format_vlib_lex_token (u8 * s, va_list * args) return s; } -void vlib_lex_get_token (vlib_lex_main_t * lm, vlib_lex_token_t * rv) +void +vlib_lex_get_token (vlib_lex_main_t * lm, vlib_lex_token_t * rv) { u8 c; vlib_lex_table_t *t; @@ -40,7 +42,7 @@ void vlib_lex_get_token (vlib_lex_main_t * lm, vlib_lex_token_t * rv) if (PREDICT_FALSE (lm->pushback_sp >= 0)) { - rv[0] = lm->pushback_vector [lm->pushback_sp--]; + rv[0] = lm->pushback_vector[lm->pushback_sp--]; return; } @@ -48,15 +50,15 @@ void vlib_lex_get_token (vlib_lex_main_t * lm, vlib_lex_token_t * rv) while (1) { - if (PREDICT_FALSE(lm->current_index >= vec_len (lm->input_vector))) + if (PREDICT_FALSE (lm->current_index >= vec_len (lm->input_vector))) { rv->token = VLIB_LEX_eof; return; } t = vec_elt_at_index (lm->lex_tables, lm->current_table_index); - c = (lm->input_vector [lm->current_index++]) & 0x7f; - e = &t->entries [c]; + c = (lm->input_vector[lm->current_index++]) & 0x7f; + e = &t->entries[c]; lm->current_table_index = e->next_table_index; switch (e->action) @@ -82,43 +84,44 @@ void vlib_lex_get_token (vlib_lex_main_t * lm, vlib_lex_token_t * rv) continue; case VLIB_LEX_ADD_TO_TOKEN: - vec_add1(lm->token_buffer, c); + vec_add1 (lm->token_buffer, c); continue; - case VLIB_LEX_KEYWORD_CHECK: { - uword * p; - - vec_add1 (lm->token_buffer, 0); - - /* It's either a keyword or just a word. */ - p = hash_get_mem (lm->lex_keywords, lm->token_buffer); - if (p) - { - rv->token = p[0]; - if (LEX_DEBUG > 0) - clib_warning ("keyword '%s' token %s", - lm->token_buffer, - lm->lex_token_names[rv->token]); - } - else - { - /* it's a WORD */ - rv->token = VLIB_LEX_word; - rv->value.as_pointer = vec_dup (lm->token_buffer); - if (LEX_DEBUG > 0) - clib_warning ("%s, value '%s'", - lm->lex_token_names[VLIB_LEX_word], - rv->value.as_pointer); - } - _vec_len (lm->token_buffer) = 0; - - /* Rescan the character which terminated the keyword/word. */ - lm->current_index--; - return; - } + case VLIB_LEX_KEYWORD_CHECK: + { + uword *p; + + vec_add1 (lm->token_buffer, 0); + + /* It's either a keyword or just a word. */ + p = hash_get_mem (lm->lex_keywords, lm->token_buffer); + if (p) + { + rv->token = p[0]; + if (LEX_DEBUG > 0) + clib_warning ("keyword '%s' token %s", + lm->token_buffer, + lm->lex_token_names[rv->token]); + } + else + { + /* it's a WORD */ + rv->token = VLIB_LEX_word; + rv->value.as_pointer = vec_dup (lm->token_buffer); + if (LEX_DEBUG > 0) + clib_warning ("%s, value '%s'", + lm->lex_token_names[VLIB_LEX_word], + rv->value.as_pointer); + } + _vec_len (lm->token_buffer) = 0; + + /* Rescan the character which terminated the keyword/word. */ + lm->current_index--; + return; + } case VLIB_LEX_RETURN_AND_RESCAN: - ASSERT(lm->current_index); + ASSERT (lm->current_index); lm->current_index--; /* note flow-through */ @@ -128,11 +131,12 @@ void vlib_lex_get_token (vlib_lex_main_t * lm, vlib_lex_token_t * rv) lm->current_token_value = ~0; if (LEX_DEBUG > 0) { - clib_warning ("table %s char '%c'(0x%02x) next table %s return %s", - t->name, c, c, lm->lex_tables[e->next_table_index].name, - lm->lex_token_names[e->token]); - if (rv->token == VLIB_LEX_number) - clib_warning (" numeric value 0x%x (%d)", rv->value, + clib_warning + ("table %s char '%c'(0x%02x) next table %s return %s", + t->name, c, c, lm->lex_tables[e->next_table_index].name, + lm->lex_token_names[e->token]); + if (rv->token == VLIB_LEX_number) + clib_warning (" numeric value 0x%x (%d)", rv->value, rv->value); } return; @@ -140,7 +144,8 @@ void vlib_lex_get_token (vlib_lex_main_t * lm, vlib_lex_token_t * rv) } } -u16 vlib_lex_add_token (vlib_lex_main_t *lm, char *token_name) +u16 +vlib_lex_add_token (vlib_lex_main_t * lm, char *token_name) { uword *p; u16 rv; @@ -157,7 +162,8 @@ u16 vlib_lex_add_token (vlib_lex_main_t *lm, char *token_name) return rv; } -static u16 add_keyword (vlib_lex_main_t *lm, char *keyword, char *token_name) +static u16 +add_keyword (vlib_lex_main_t * lm, char *keyword, char *token_name) { uword *p; u16 token; @@ -172,14 +178,17 @@ static u16 add_keyword (vlib_lex_main_t *lm, char *keyword, char *token_name) return token; } -u16 vlib_lex_find_or_add_keyword (vlib_lex_main_t *lm, char *keyword, char *token_name) +u16 +vlib_lex_find_or_add_keyword (vlib_lex_main_t * lm, char *keyword, + char *token_name) { - uword * p = hash_get_mem (lm->lex_keywords, keyword); + uword *p = hash_get_mem (lm->lex_keywords, keyword); return p ? p[0] : add_keyword (lm, keyword, token_name); } -void vlib_lex_set_action_range (u32 table_index, u8 lo, u8 hi, u16 action, - u16 token, u32 next_table_index) +void +vlib_lex_set_action_range (u32 table_index, u8 lo, u8 hi, u16 action, + u16 token, u32 next_table_index) { int i; vlib_lex_main_t *lm = &vlib_lex_main; @@ -194,7 +203,8 @@ void vlib_lex_set_action_range (u32 table_index, u8 lo, u8 hi, u16 action, } } -u16 vlib_lex_add_table (char *name) +u16 +vlib_lex_add_table (char *name) { vlib_lex_main_t *lm = &vlib_lex_main; vlib_lex_table_t *t; @@ -202,7 +212,7 @@ u16 vlib_lex_add_table (char *name) p = hash_get_mem (lm->lex_tables_by_name, name); - ASSERT(p == 0); + ASSERT (p == 0); pool_get_aligned (lm->lex_tables, t, CLIB_CACHE_LINE_BYTES); @@ -213,13 +223,14 @@ u16 vlib_lex_add_table (char *name) vlib_lex_set_action_range (t - lm->lex_tables, 1, 0x7F, VLIB_LEX_IGNORE, ~0, t - lm->lex_tables); - vlib_lex_set_action_range (t - lm->lex_tables, 0, 0, VLIB_LEX_RETURN, VLIB_LEX_eof, - t - lm->lex_tables); + vlib_lex_set_action_range (t - lm->lex_tables, 0, 0, VLIB_LEX_RETURN, + VLIB_LEX_eof, t - lm->lex_tables); return t - lm->lex_tables; } -void vlib_lex_reset (vlib_lex_main_t *lm, u8 *input_vector) +void +vlib_lex_reset (vlib_lex_main_t * lm, u8 * input_vector) { if (lm->pushback_vector) _vec_len (lm->pushback_vector) = 0; @@ -229,7 +240,8 @@ void vlib_lex_reset (vlib_lex_main_t *lm, u8 *input_vector) lm->current_index = 0; } -static clib_error_t * lex_onetime_init (vlib_main_t * vm) +static clib_error_t * +lex_onetime_init (vlib_main_t * vm) { vlib_lex_main_t *lm = &vlib_lex_main; @@ -249,3 +261,11 @@ static clib_error_t * lex_onetime_init (vlib_main_t * vm) } VLIB_INIT_FUNCTION (lex_onetime_init); + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/lex.h b/vlib/vlib/lex.h index d5ea509915c..4ae58f468c1 100644 --- a/vlib/vlib/lex.h +++ b/vlib/vlib/lex.h @@ -37,57 +37,64 @@ _ (lpar) \ _ (rpar) -typedef enum { +typedef enum +{ #define _(f) VLIB_LEX_##f, foreach_vlib_lex_global_token #undef _ } vlib_lex_global_token_t; -typedef enum { +typedef enum +{ VLIB_LEX_IGNORE, VLIB_LEX_ADD_TO_TOKEN, VLIB_LEX_RETURN, VLIB_LEX_RETURN_AND_RESCAN, VLIB_LEX_KEYWORD_CHECK, - VLIB_LEX_START_NUMBER, + VLIB_LEX_START_NUMBER, VLIB_LEX_ADD_TO_NUMBER, } vlib_lex_action_t; -typedef struct { +typedef struct +{ u16 action; u16 next_table_index; u16 token; } vlib_lex_table_entry_t; -typedef struct { +typedef struct +{ char *name; - vlib_lex_table_entry_t entries [128]; + vlib_lex_table_entry_t entries[128]; } vlib_lex_table_t; -typedef struct { +typedef struct +{ u32 token; - union { + union + { uword as_uword; - void * as_pointer; - char * as_string; + void *as_pointer; + char *as_string; } value; } vlib_lex_token_t; -typedef struct { - vlib_lex_table_t * lex_tables; - uword * lex_tables_by_name; +typedef struct +{ + vlib_lex_table_t *lex_tables; + uword *lex_tables_by_name; /* Vector of token strings. */ - char ** lex_token_names; + char **lex_token_names; /* Hash mapping c string name to token index. */ - uword * lex_tokens_by_name; + uword *lex_tokens_by_name; /* Hash mapping c string keyword name to token index. */ - uword * lex_keywords; + uword *lex_keywords; - vlib_lex_token_t * pushback_vector; + vlib_lex_token_t *pushback_vector; i32 pushback_sp; @@ -104,7 +111,7 @@ typedef struct { u32 current_index; /* Re-used vector for forming token strings and hashing them. */ - u8 * token_buffer; + u8 *token_buffer; } vlib_lex_main_t; vlib_lex_main_t vlib_lex_main; @@ -114,17 +121,25 @@ vlib_lex_cleanup_token (vlib_lex_token_t * t) { if (t->token == VLIB_LEX_word) { - u8 * tv = t->value.as_pointer; + u8 *tv = t->value.as_pointer; vec_free (tv); } } u16 vlib_lex_add_table (char *name); -void vlib_lex_get_token (vlib_lex_main_t *lm, vlib_lex_token_t * result); -u16 vlib_lex_add_token (vlib_lex_main_t *lm, char *token_name); -void vlib_lex_set_action_range (u32 table_index, u8 lo, u8 hi, u16 action, +void vlib_lex_get_token (vlib_lex_main_t * lm, vlib_lex_token_t * result); +u16 vlib_lex_add_token (vlib_lex_main_t * lm, char *token_name); +void vlib_lex_set_action_range (u32 table_index, u8 lo, u8 hi, u16 action, u16 token, u32 next_table_index); -void vlib_lex_reset (vlib_lex_main_t *lm, u8 *input_vector); +void vlib_lex_reset (vlib_lex_main_t * lm, u8 * input_vector); format_function_t format_vlib_lex_token; #endif /* included_vlib_lex_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/main.c b/vlib/vlib/main.c index f7a27cfd6bb..c4062a7f333 100644 --- a/vlib/vlib/main.c +++ b/vlib/vlib/main.c @@ -78,7 +78,7 @@ vlib_frame_bytes (u32 n_scalar_bytes, u32 n_vector_bytes) always_inline u32 * vlib_frame_find_magic (vlib_frame_t * f, vlib_node_t * node) { - void * p = f; + void *p = f; p += vlib_frame_vector_byte_offset (node->scalar_size); @@ -92,7 +92,7 @@ get_frame_size_info (vlib_node_main_t * nm, u32 n_scalar_bytes, u32 n_vector_bytes) { uword key = (n_scalar_bytes << 16) | n_vector_bytes; - uword * p, i; + uword *p, i; p = hash_get (nm->frame_size_hash, key); if (p) @@ -108,12 +108,13 @@ get_frame_size_info (vlib_node_main_t * nm, } static u32 -vlib_frame_alloc_to_node (vlib_main_t * vm, u32 to_node_index, u32 frame_flags) +vlib_frame_alloc_to_node (vlib_main_t * vm, u32 to_node_index, + u32 frame_flags) { - vlib_node_main_t * nm = &vm->node_main; - vlib_frame_size_t * fs; - vlib_node_t * to_node; - vlib_frame_t * f; + vlib_node_main_t *nm = &vm->node_main; + vlib_frame_size_t *fs; + vlib_node_t *to_node; + vlib_frame_t *f; u32 fi, l, n, scalar_size, vector_size; to_node = vlib_get_node (vm, to_node_index); @@ -149,7 +150,7 @@ vlib_frame_alloc_to_node (vlib_main_t * vm, u32 to_node_index, u32 frame_flags) /* Insert magic number. */ { - u32 * magic; + u32 *magic; magic = vlib_frame_find_magic (f, to_node); *magic = VLIB_FRAME_MAGIC; @@ -168,15 +169,15 @@ vlib_frame_alloc_to_node (vlib_main_t * vm, u32 to_node_index, u32 frame_flags) /* Allocate a frame for from FROM_NODE to TO_NODE via TO_NEXT_INDEX. Returns frame index. */ static u32 -vlib_frame_alloc (vlib_main_t * vm, vlib_node_runtime_t * from_node_runtime, u32 to_next_index) +vlib_frame_alloc (vlib_main_t * vm, vlib_node_runtime_t * from_node_runtime, + u32 to_next_index) { - vlib_node_t * from_node; + vlib_node_t *from_node; from_node = vlib_get_node (vm, from_node_runtime->node_index); ASSERT (to_next_index < vec_len (from_node->next_nodes)); - return vlib_frame_alloc_to_node (vm, - from_node->next_nodes[to_next_index], + return vlib_frame_alloc_to_node (vm, from_node->next_nodes[to_next_index], /* frame_flags */ 0); } @@ -184,14 +185,16 @@ vlib_frame_t * vlib_get_frame_to_node (vlib_main_t * vm, u32 to_node_index) { u32 fi = vlib_frame_alloc_to_node (vm, to_node_index, - /* frame_flags */ VLIB_FRAME_FREE_AFTER_DISPATCH); + /* frame_flags */ + VLIB_FRAME_FREE_AFTER_DISPATCH); return vlib_get_frame (vm, fi); } -void vlib_put_frame_to_node (vlib_main_t * vm, u32 to_node_index, vlib_frame_t * f) +void +vlib_put_frame_to_node (vlib_main_t * vm, u32 to_node_index, vlib_frame_t * f) { - vlib_pending_frame_t * p; - vlib_node_t * to_node; + vlib_pending_frame_t *p; + vlib_node_t *to_node; if (f->n_vectors == 0) return; @@ -208,15 +211,13 @@ void vlib_put_frame_to_node (vlib_main_t * vm, u32 to_node_index, vlib_frame_t * /* Free given frame. */ void -vlib_frame_free (vlib_main_t * vm, - vlib_node_runtime_t * r, - vlib_frame_t * f) +vlib_frame_free (vlib_main_t * vm, vlib_node_runtime_t * r, vlib_frame_t * f) { - vlib_node_main_t * nm = &vm->node_main; - vlib_node_t * node; - vlib_frame_size_t * fs; + vlib_node_main_t *nm = &vm->node_main; + vlib_node_t *node; + vlib_frame_size_t *fs; u32 frame_index; - + ASSERT (f->flags & VLIB_FRAME_IS_ALLOCATED); node = vlib_get_node (vm, r->node_index); @@ -229,7 +230,7 @@ vlib_frame_free (vlib_main_t * vm, /* No next frames may point to freed frame. */ if (CLIB_DEBUG > 0) { - vlib_next_frame_t * nf; + vlib_next_frame_t *nf; vec_foreach (nf, vm->node_main.next_frames) ASSERT (nf->frame_index != frame_index); } @@ -243,31 +244,32 @@ vlib_frame_free (vlib_main_t * vm, static clib_error_t * show_frame_stats (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { - vlib_node_main_t * nm = &vm->node_main; - vlib_frame_size_t * fs; - + vlib_node_main_t *nm = &vm->node_main; + vlib_frame_size_t *fs; + vlib_cli_output (vm, "%=6s%=12s%=12s", "Size", "# Alloc", "# Free"); vec_foreach (fs, nm->frame_sizes) - { - u32 n_alloc = fs->n_alloc_frames; - u32 n_free = vec_len (fs->free_frame_indices); + { + u32 n_alloc = fs->n_alloc_frames; + u32 n_free = vec_len (fs->free_frame_indices); - if (n_alloc + n_free > 0) - vlib_cli_output (vm, "%=6d%=12d%=12d", - fs - nm->frame_sizes, n_alloc, n_free); - } + if (n_alloc + n_free > 0) + vlib_cli_output (vm, "%=6d%=12d%=12d", + fs - nm->frame_sizes, n_alloc, n_free); + } return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (show_frame_stats_cli, static) = { .path = "show vlib frame-allocation", .short_help = "Show node dispatch frame statistics", .function = show_frame_stats, }; +/* *INDENT-ON* */ /* Change ownership of enqueue rights to given next node. */ static void @@ -275,9 +277,9 @@ vlib_next_frame_change_ownership (vlib_main_t * vm, vlib_node_runtime_t * node_runtime, u32 next_index) { - vlib_node_main_t * nm = &vm->node_main; - vlib_next_frame_t * next_frame; - vlib_node_t * node, * next_node; + vlib_node_main_t *nm = &vm->node_main; + vlib_next_frame_t *next_frame; + vlib_node_t *node, *next_node; node = vec_elt (nm->nodes, node_runtime->node_index); @@ -288,13 +290,14 @@ vlib_next_frame_change_ownership (vlib_main_t * vm, ASSERT (vec_len (node->next_nodes) == node_runtime->n_next_nodes); - next_frame = vlib_node_runtime_get_next_frame (vm, node_runtime, next_index); + next_frame = + vlib_node_runtime_get_next_frame (vm, node_runtime, next_index); next_node = vec_elt (nm->nodes, node->next_nodes[next_index]); if (next_node->owner_node_index != VLIB_INVALID_NODE_INDEX) { /* Get frame from previous owner. */ - vlib_next_frame_t * owner_next_frame; + vlib_next_frame_t *owner_next_frame; vlib_next_frame_t tmp; owner_next_frame = @@ -312,66 +315,63 @@ vlib_next_frame_change_ownership (vlib_main_t * vm, * all pending frames and fix their next_frame_index fields. */ if (next_frame->flags & VLIB_FRAME_PENDING) - { - vlib_pending_frame_t * p; - if (next_frame->frame_index != ~0) - { - vec_foreach (p, nm->pending_frames) - { - if (p->frame_index == next_frame->frame_index) - { - p->next_frame_index = - next_frame - vm->node_main.next_frames; - } - } - } - } + { + vlib_pending_frame_t *p; + if (next_frame->frame_index != ~0) + { + vec_foreach (p, nm->pending_frames) + { + if (p->frame_index == next_frame->frame_index) + { + p->next_frame_index = + next_frame - vm->node_main.next_frames; + } + } + } + } } else { /* No previous owner. Take ownership. */ next_frame->flags |= VLIB_FRAME_OWNER; } - + /* Record new owner. */ next_node->owner_node_index = node->index; next_node->owner_next_index = next_index; /* Now we should be owner. */ ASSERT (next_frame->flags & VLIB_FRAME_OWNER); -} +} /* Make sure that magic number is still there. Otherwise, it is likely that caller has overrun frame arguments. */ always_inline void validate_frame_magic (vlib_main_t * vm, - vlib_frame_t * f, - vlib_node_t * n, - uword next_index) + vlib_frame_t * f, vlib_node_t * n, uword next_index) { - vlib_node_t * next_node = vlib_get_node (vm, n->next_nodes[next_index]); - u32 * magic = vlib_frame_find_magic (f, next_node); + vlib_node_t *next_node = vlib_get_node (vm, n->next_nodes[next_index]); + u32 *magic = vlib_frame_find_magic (f, next_node); ASSERT (VLIB_FRAME_MAGIC == magic[0]); } vlib_frame_t * vlib_get_next_frame_internal (vlib_main_t * vm, vlib_node_runtime_t * node, - u32 next_index, - u32 allocate_new_next_frame) + u32 next_index, u32 allocate_new_next_frame) { - vlib_frame_t * f; - vlib_next_frame_t * nf; + vlib_frame_t *f; + vlib_next_frame_t *nf; u32 n_used; nf = vlib_node_runtime_get_next_frame (vm, node, next_index); /* Make sure this next frame owns right to enqueue to destination frame. */ - if (PREDICT_FALSE (! (nf->flags & VLIB_FRAME_OWNER))) + if (PREDICT_FALSE (!(nf->flags & VLIB_FRAME_OWNER))) vlib_next_frame_change_ownership (vm, node, next_index); /* ??? Don't need valid flag: can use frame_index == ~0 */ - if (PREDICT_FALSE (! (nf->flags & VLIB_FRAME_IS_ALLOCATED))) + if (PREDICT_FALSE (!(nf->flags & VLIB_FRAME_IS_ALLOCATED))) { nf->frame_index = vlib_frame_alloc (vm, node, next_index); nf->flags |= VLIB_FRAME_IS_ALLOCATED; @@ -381,7 +381,7 @@ vlib_get_next_frame_internal (vlib_main_t * vm, /* Has frame been removed from pending vector (e.g. finished dispatching)? If so we can reuse frame. */ - if ((nf->flags & VLIB_FRAME_PENDING) && ! (f->flags & VLIB_FRAME_PENDING)) + if ((nf->flags & VLIB_FRAME_PENDING) && !(f->flags & VLIB_FRAME_PENDING)) { nf->flags &= ~VLIB_FRAME_PENDING; f->n_vectors = 0; @@ -392,10 +392,10 @@ vlib_get_next_frame_internal (vlib_main_t * vm, if (n_used >= VLIB_FRAME_SIZE || (allocate_new_next_frame && n_used > 0)) { /* Old frame may need to be freed after dispatch, since we'll have - two redundant frames from node -> next node. */ - if (! (nf->flags & VLIB_FRAME_NO_FREE_AFTER_DISPATCH)) + two redundant frames from node -> next node. */ + if (!(nf->flags & VLIB_FRAME_NO_FREE_AFTER_DISPATCH)) { - vlib_frame_t * f_old = vlib_get_frame (vm, nf->frame_index); + vlib_frame_t *f_old = vlib_get_frame (vm, nf->frame_index); f_old->flags |= VLIB_FRAME_FREE_AFTER_DISPATCH; } @@ -411,8 +411,7 @@ vlib_get_next_frame_internal (vlib_main_t * vm, if (CLIB_DEBUG > 0) { validate_frame_magic (vm, f, - vlib_get_node (vm, node->node_index), - next_index); + vlib_get_node (vm, node->node_index), next_index); } return f; @@ -421,14 +420,13 @@ vlib_get_next_frame_internal (vlib_main_t * vm, static void vlib_put_next_frame_validate (vlib_main_t * vm, vlib_node_runtime_t * rt, - u32 next_index, - u32 n_vectors_left) + u32 next_index, u32 n_vectors_left) { - vlib_node_main_t * nm = &vm->node_main; - vlib_next_frame_t * nf; - vlib_frame_t * f; - vlib_node_runtime_t * next_rt; - vlib_node_t * next_node; + vlib_node_main_t *nm = &vm->node_main; + vlib_next_frame_t *nf; + vlib_frame_t *f; + vlib_node_runtime_t *next_rt; + vlib_node_t *next_node; u32 n_before, n_after; nf = vlib_node_runtime_get_next_frame (vm, rt, next_index); @@ -445,7 +443,7 @@ vlib_put_next_frame_validate (vlib_main_t * vm, next_node = vlib_get_node (vm, next_rt->node_index); if (n_after > 0 && next_node->validate_frame) { - u8 * msg = next_node->validate_frame (vm, rt, f); + u8 *msg = next_node->validate_frame (vm, rt, f); if (msg) { clib_warning ("%v", msg); @@ -458,12 +456,11 @@ vlib_put_next_frame_validate (vlib_main_t * vm, void vlib_put_next_frame (vlib_main_t * vm, vlib_node_runtime_t * r, - u32 next_index, - u32 n_vectors_left) + u32 next_index, u32 n_vectors_left) { - vlib_node_main_t * nm = &vm->node_main; - vlib_next_frame_t * nf; - vlib_frame_t * f; + vlib_node_main_t *nm = &vm->node_main; + vlib_next_frame_t *nf; + vlib_frame_t *f; u32 n_vectors_in_frame; if (DPDK == 0 && CLIB_DEBUG > 0) @@ -476,7 +473,7 @@ vlib_put_next_frame (vlib_main_t * vm, has overrun frame meta data. */ if (CLIB_DEBUG > 0) { - vlib_node_t * node = vlib_get_node (vm, r->node_index); + vlib_node_t *node = vlib_get_node (vm, r->node_index); validate_frame_magic (vm, f, node, next_index); } @@ -489,51 +486,53 @@ vlib_put_next_frame (vlib_main_t * vm, /* If vectors were added to frame, add to pending vector. */ if (PREDICT_TRUE (n_vectors_in_frame > 0)) { - vlib_pending_frame_t * p; + vlib_pending_frame_t *p; u32 v0, v1; - + r->cached_next_index = next_index; if (!(f->flags & VLIB_FRAME_PENDING)) - { - __attribute__((unused)) vlib_node_t *node; - vlib_node_t *next_node; - vlib_node_runtime_t *next_runtime; - - node = vlib_get_node (vm, r->node_index); - next_node = vlib_get_next_node (vm, r->node_index, next_index); - next_runtime = vlib_node_get_runtime (vm, next_node->index); - - vec_add2 (nm->pending_frames, p, 1); - - p->frame_index = nf->frame_index; - p->node_runtime_index = nf->node_runtime_index; - p->next_frame_index = nf - nm->next_frames; - nf->flags |= VLIB_FRAME_PENDING; - f->flags |= VLIB_FRAME_PENDING; - - /* - * If we're going to dispatch this frame on another thread, - * force allocation of a new frame. Otherwise, we create - * a dangling frame reference. Each thread has its own copy of - * the next_frames vector. - */ - if (0 && r->cpu_index != next_runtime->cpu_index) - { - nf->frame_index = ~0; - nf->flags &= ~(VLIB_FRAME_PENDING | VLIB_FRAME_IS_ALLOCATED); - } - } + { + __attribute__ ((unused)) vlib_node_t *node; + vlib_node_t *next_node; + vlib_node_runtime_t *next_runtime; + + node = vlib_get_node (vm, r->node_index); + next_node = vlib_get_next_node (vm, r->node_index, next_index); + next_runtime = vlib_node_get_runtime (vm, next_node->index); + + vec_add2 (nm->pending_frames, p, 1); + + p->frame_index = nf->frame_index; + p->node_runtime_index = nf->node_runtime_index; + p->next_frame_index = nf - nm->next_frames; + nf->flags |= VLIB_FRAME_PENDING; + f->flags |= VLIB_FRAME_PENDING; + + /* + * If we're going to dispatch this frame on another thread, + * force allocation of a new frame. Otherwise, we create + * a dangling frame reference. Each thread has its own copy of + * the next_frames vector. + */ + if (0 && r->cpu_index != next_runtime->cpu_index) + { + nf->frame_index = ~0; + nf->flags &= ~(VLIB_FRAME_PENDING | VLIB_FRAME_IS_ALLOCATED); + } + } /* Copy trace flag from next_frame and from runtime. */ - nf->flags |= (nf->flags & VLIB_NODE_FLAG_TRACE) | (r->flags & VLIB_NODE_FLAG_TRACE); + nf->flags |= + (nf->flags & VLIB_NODE_FLAG_TRACE) | (r-> + flags & VLIB_NODE_FLAG_TRACE); v0 = nf->vectors_since_last_overflow; v1 = v0 + n_vectors_in_frame; nf->vectors_since_last_overflow = v1; if (PREDICT_FALSE (v1 < v0)) { - vlib_node_t * node = vlib_get_node (vm, r->node_index); + vlib_node_t *node = vlib_get_node (vm, r->node_index); vec_elt (node->n_vectors_by_next_node, next_index) += v0; } } @@ -543,11 +542,9 @@ vlib_put_next_frame (vlib_main_t * vm, never_inline void vlib_node_runtime_sync_stats (vlib_main_t * vm, vlib_node_runtime_t * r, - uword n_calls, - uword n_vectors, - uword n_clocks) + uword n_calls, uword n_vectors, uword n_clocks) { - vlib_node_t * n = vlib_get_node (vm, r->node_index); + vlib_node_t *n = vlib_get_node (vm, r->node_index); n->stats_total.calls += n_calls + r->calls_since_last_overflow; n->stats_total.vectors += n_vectors + r->vectors_since_last_overflow; @@ -560,47 +557,50 @@ vlib_node_runtime_sync_stats (vlib_main_t * vm, r->clocks_since_last_overflow = 0; } -always_inline void __attribute__((unused)) +always_inline void __attribute__ ((unused)) vlib_process_sync_stats (vlib_main_t * vm, vlib_process_t * p, - uword n_calls, - uword n_vectors, - uword n_clocks) + uword n_calls, uword n_vectors, uword n_clocks) { - vlib_node_runtime_t * rt = &p->node_runtime; - vlib_node_t * n = vlib_get_node (vm, rt->node_index); + vlib_node_runtime_t *rt = &p->node_runtime; + vlib_node_t *n = vlib_get_node (vm, rt->node_index); vlib_node_runtime_sync_stats (vm, rt, n_calls, n_vectors, n_clocks); n->stats_total.suspends += p->n_suspends; p->n_suspends = 0; } -void vlib_node_sync_stats (vlib_main_t * vm, vlib_node_t * n) +void +vlib_node_sync_stats (vlib_main_t * vm, vlib_node_t * n) { - vlib_node_runtime_t * rt; + vlib_node_runtime_t *rt; if (n->type == VLIB_NODE_TYPE_PROCESS) { /* Nothing to do for PROCESS nodes except in main thread */ - if (vm != &vlib_global_main) return; + if (vm != &vlib_global_main) + return; - vlib_process_t * p = vlib_get_process_from_node (vm, n); + vlib_process_t *p = vlib_get_process_from_node (vm, n); n->stats_total.suspends += p->n_suspends; p->n_suspends = 0; rt = &p->node_runtime; } else - rt = vec_elt_at_index (vm->node_main.nodes_by_type[n->type], n->runtime_index); + rt = + vec_elt_at_index (vm->node_main.nodes_by_type[n->type], + n->runtime_index); vlib_node_runtime_sync_stats (vm, rt, 0, 0, 0); /* Sync up runtime next frame vector counters with main node structure. */ { - vlib_next_frame_t * nf; + vlib_next_frame_t *nf; uword i; for (i = 0; i < rt->n_next_nodes; i++) { nf = vlib_node_runtime_get_next_frame (vm, rt, i); - vec_elt (n->n_vectors_by_next_node, i) += nf->vectors_since_last_overflow; + vec_elt (n->n_vectors_by_next_node, i) += + nf->vectors_since_last_overflow; nf->vectors_since_last_overflow = 0; } } @@ -610,8 +610,7 @@ always_inline u32 vlib_node_runtime_update_stats (vlib_main_t * vm, vlib_node_runtime_t * node, uword n_calls, - uword n_vectors, - uword n_clocks) + uword n_vectors, uword n_clocks) { u32 ca0, ca1, v0, v1, cl0, cl1, r; @@ -627,9 +626,8 @@ vlib_node_runtime_update_stats (vlib_main_t * vm, node->clocks_since_last_overflow = cl1; node->vectors_since_last_overflow = v1; node->max_clock_n = node->max_clock > n_clocks ? - node->max_clock_n : n_vectors; - node->max_clock = node->max_clock > n_clocks ? - node->max_clock : n_clocks; + node->max_clock_n : n_vectors; + node->max_clock = node->max_clock > n_clocks ? node->max_clock : n_clocks; r = vlib_node_runtime_update_main_loop_vector_stats (vm, node, n_vectors); @@ -647,9 +645,7 @@ vlib_node_runtime_update_stats (vlib_main_t * vm, always_inline void vlib_process_update_stats (vlib_main_t * vm, vlib_process_t * p, - uword n_calls, - uword n_vectors, - uword n_clocks) + uword n_calls, uword n_vectors, uword n_clocks) { vlib_node_runtime_update_stats (vm, &p->node_runtime, n_calls, n_vectors, n_clocks); @@ -657,30 +653,30 @@ vlib_process_update_stats (vlib_main_t * vm, static clib_error_t * vlib_cli_elog_clear (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { elog_reset_buffer (&vm->elog_main); return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (elog_clear_cli, static) = { .path = "event-logger clear", .short_help = "Clear the event log", .function = vlib_cli_elog_clear, }; +/* *INDENT-ON* */ #ifdef CLIB_UNIX static clib_error_t * elog_save_buffer (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { - elog_main_t * em = &vm->elog_main; - char * file, * chroot_file; - clib_error_t * error = 0; + elog_main_t *em = &vm->elog_main; + char *file, *chroot_file; + clib_error_t *error = 0; - if (! unformat (input, "%s", &file)) + if (!unformat (input, "%s", &file)) { vlib_cli_output (vm, "expected file name, got `%U'", format_unformat_error, input); @@ -688,7 +684,7 @@ elog_save_buffer (vlib_main_t * vm, } /* It's fairly hard to get "../oopsie" through unformat; just in case */ - if (strstr(file, "..") || index(file, '/')) + if (strstr (file, "..") || index (file, '/')) { vlib_cli_output (vm, "illegal characters in filename '%s'", file); return 0; @@ -696,32 +692,32 @@ elog_save_buffer (vlib_main_t * vm, chroot_file = (char *) format (0, "/tmp/%s%c", file, 0); - vec_free(file); + vec_free (file); vlib_cli_output (vm, "Saving %wd of %wd events to %s", - elog_n_events_in_buffer (em), - elog_buffer_capacity (em), - chroot_file); - + elog_n_events_in_buffer (em), + elog_buffer_capacity (em), chroot_file); + vlib_worker_thread_barrier_sync (vm); - error = elog_write_file (em, chroot_file); - vlib_worker_thread_barrier_release(vm); + error = elog_write_file (em, chroot_file); + vlib_worker_thread_barrier_release (vm); vec_free (chroot_file); return error; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (elog_save_cli, static) = { .path = "event-logger save", .short_help = "event-logger save <filename> (saves log in /tmp/<filename>)", .function = elog_save_buffer, }; +/* *INDENT-ON* */ static clib_error_t * elog_stop (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { - elog_main_t * em = &vm->elog_main; + elog_main_t *em = &vm->elog_main; em->n_total_events_disable_limit = em->n_total_events; @@ -729,18 +725,19 @@ elog_stop (vlib_main_t * vm, return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (elog_stop_cli, static) = { .path = "event-logger stop", .short_help = "Stop the event-logger", .function = elog_stop, }; +/* *INDENT-ON* */ static clib_error_t * elog_restart (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { - elog_main_t * em = &vm->elog_main; + elog_main_t *em = &vm->elog_main; em->n_total_events_disable_limit = ~0; @@ -748,18 +745,19 @@ elog_restart (vlib_main_t * vm, return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (elog_restart_cli, static) = { .path = "event-logger restart", .short_help = "Restart the event-logger", .function = elog_restart, }; +/* *INDENT-ON* */ static clib_error_t * elog_resize (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { - elog_main_t * em = &vm->elog_main; + elog_main_t *em = &vm->elog_main; u32 tmp; /* Stop the parade */ @@ -770,56 +768,57 @@ elog_resize (vlib_main_t * vm, elog_alloc (em, tmp); em->n_total_events_disable_limit = ~0; } - else + else return clib_error_return (0, "Must specify how many events in the ring"); vlib_cli_output (vm, "Resized ring and restarted the event logger..."); return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (elog_resize_cli, static) = { .path = "event-logger resize", .short_help = "event-logger resize <nnn>", .function = elog_resize, }; +/* *INDENT-ON* */ #endif /* CLIB_UNIX */ -static void elog_show_buffer_internal (vlib_main_t * vm, u32 n_events_to_show) +static void +elog_show_buffer_internal (vlib_main_t * vm, u32 n_events_to_show) { - elog_main_t * em = &vm->elog_main; - elog_event_t * e, * es; + elog_main_t *em = &vm->elog_main; + elog_event_t *e, *es; f64 dt; /* Show events in VLIB time since log clock starts after VLIB clock. */ - dt = (em->init_time.cpu - vm->clib_time.init_cpu_time) + dt = (em->init_time.cpu - vm->clib_time.init_cpu_time) * vm->clib_time.seconds_per_clock; es = elog_peek_events (em); - vlib_cli_output (vm, "%d of %d events in buffer, logger %s", vec_len (es), - em->event_ring_size, - em->n_total_events < em->n_total_events_disable_limit ? - "running" : "stopped"); + vlib_cli_output (vm, "%d of %d events in buffer, logger %s", vec_len (es), + em->event_ring_size, + em->n_total_events < em->n_total_events_disable_limit ? + "running" : "stopped"); vec_foreach (e, es) - { - vlib_cli_output (vm, "%18.9f: %U", - e->time + dt, - format_elog_event, em, e); - n_events_to_show--; - if (n_events_to_show == 0) - break; - } + { + vlib_cli_output (vm, "%18.9f: %U", + e->time + dt, format_elog_event, em, e); + n_events_to_show--; + if (n_events_to_show == 0) + break; + } vec_free (es); - + } static clib_error_t * elog_show_buffer (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { u32 n_events_to_show; - clib_error_t * error = 0; + clib_error_t *error = 0; n_events_to_show = 250; while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) @@ -835,44 +834,46 @@ elog_show_buffer (vlib_main_t * vm, return error; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (elog_show_cli, static) = { .path = "show event-logger", .short_help = "Show event logger info", .function = elog_show_buffer, }; +/* *INDENT-ON* */ -void vlib_gdb_show_event_log (void) +void +vlib_gdb_show_event_log (void) { - elog_show_buffer_internal (vlib_get_main(), (u32)~0); + elog_show_buffer_internal (vlib_get_main (), (u32) ~ 0); } static inline void vlib_elog_main_loop_event (vlib_main_t * vm, u32 node_index, - u64 time, - u32 n_vectors, - u32 is_return) + u64 time, u32 n_vectors, u32 is_return) { - vlib_main_t * evm = &vlib_global_main; - elog_main_t * em = &evm->elog_main; + vlib_main_t *evm = &vlib_global_main; + elog_main_t *em = &evm->elog_main; if (VLIB_ELOG_MAIN_LOOP && n_vectors) elog_track (em, - /* event type */ - vec_elt_at_index (is_return - ? evm->node_return_elog_event_types - : evm->node_call_elog_event_types, - node_index), - /* track */ - (vm->cpu_index ? &vlib_worker_threads[vm->cpu_index].elog_track : - &em->default_track), - /* data to log */ n_vectors); + /* event type */ + vec_elt_at_index (is_return + ? evm->node_return_elog_event_types + : evm->node_call_elog_event_types, + node_index), + /* track */ + (vm->cpu_index ? &vlib_worker_threads[vm->cpu_index]. + elog_track : &em->default_track), + /* data to log */ n_vectors); } -void vlib_dump_context_trace (vlib_main_t *vm, u32 bi) +void +vlib_dump_context_trace (vlib_main_t * vm, u32 bi) { - vlib_node_main_t * vnm = &vm->node_main; - vlib_buffer_t * b; + vlib_node_main_t *vnm = &vm->node_main; + vlib_buffer_t *b; u8 i, n; if (VLIB_BUFFER_TRACE_TRAJECTORY) @@ -880,36 +881,36 @@ void vlib_dump_context_trace (vlib_main_t *vm, u32 bi) b = vlib_get_buffer (vm, bi); n = b->pre_data[0]; - fformat(stderr, "Context trace for bi %d b 0x%llx, visited %d\n", - bi, b, n); + fformat (stderr, "Context trace for bi %d b 0x%llx, visited %d\n", + bi, b, n); if (n == 0 || n > 20) - { - fformat(stderr, "n is unreasonable\n"); - return; - } + { + fformat (stderr, "n is unreasonable\n"); + return; + } for (i = 0; i < n; i++) - { - u32 node_index; - - node_index = b->pre_data[i+1]; - - if (node_index > vec_len (vnm->nodes)) - { - fformat(stderr, "Skip bogus node index %d\n", node_index); - continue; - } - - fformat(stderr, "%v (%d)\n", vnm->nodes[node_index]->name, - node_index); - } + { + u32 node_index; + + node_index = b->pre_data[i + 1]; + + if (node_index > vec_len (vnm->nodes)) + { + fformat (stderr, "Skip bogus node index %d\n", node_index); + continue; + } + + fformat (stderr, "%v (%d)\n", vnm->nodes[node_index]->name, + node_index); + } } else { - fformat(stderr, - "in vlib/buffers.h, #define VLIB_BUFFER_TRACE_TRAJECTORY 1\n"); + fformat (stderr, + "in vlib/buffers.h, #define VLIB_BUFFER_TRACE_TRAJECTORY 1\n"); } } @@ -919,17 +920,16 @@ dispatch_node (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_node_type_t type, vlib_node_state_t dispatch_state, - vlib_frame_t * frame, - u64 last_time_stamp) + vlib_frame_t * frame, u64 last_time_stamp) { uword n, v; u64 t; - vlib_node_main_t * nm = &vm->node_main; - vlib_next_frame_t * nf; + vlib_node_main_t *nm = &vm->node_main; + vlib_next_frame_t *nf; if (CLIB_DEBUG > 0) { - vlib_node_t * n = vlib_get_node (vm, node->node_index); + vlib_node_t *n = vlib_get_node (vm, node->node_index); ASSERT (n->type == type); } @@ -961,112 +961,123 @@ dispatch_node (vlib_main_t * vm, vm->cpu_time_last_node_dispatch = last_time_stamp; - if (1 /* || vm->cpu_index == node->cpu_index */) + if (1 /* || vm->cpu_index == node->cpu_index */ ) { vlib_main_t *stat_vm; stat_vm = /* vlib_mains ? vlib_mains[0] : */ vm; vlib_elog_main_loop_event (vm, node->node_index, - last_time_stamp, - frame ? frame->n_vectors : 0, - /* is_after */ 0); - + last_time_stamp, + frame ? frame->n_vectors : 0, + /* is_after */ 0); + /* * Turn this on if you run into * "bad monkey" contexts, and you want to know exactly * which nodes they've visited... See ixge.c... */ if (VLIB_BUFFER_TRACE_TRAJECTORY && frame) - { - int i; - int log_index; - u32 * from; - from = vlib_frame_vector_args (frame); - for (i = 0; i < frame->n_vectors; i++) - { - vlib_buffer_t *b = vlib_get_buffer (vm, from[i]); - ASSERT (b->pre_data[0] < 32); - log_index = b->pre_data[0]++ + 1; - b->pre_data[log_index] = node->node_index; - } - n = node->function (vm, node, frame); - } + { + int i; + int log_index; + u32 *from; + from = vlib_frame_vector_args (frame); + for (i = 0; i < frame->n_vectors; i++) + { + vlib_buffer_t *b = vlib_get_buffer (vm, from[i]); + ASSERT (b->pre_data[0] < 32); + log_index = b->pre_data[0]++ + 1; + b->pre_data[log_index] = node->node_index; + } + n = node->function (vm, node, frame); + } else - n = node->function (vm, node, frame); + n = node->function (vm, node, frame); t = clib_cpu_time_now (); - vlib_elog_main_loop_event (vm, node->node_index, t, n, /* is_after */ 1); + vlib_elog_main_loop_event (vm, node->node_index, t, n, /* is_after */ + 1); vm->main_loop_vectors_processed += n; vm->main_loop_nodes_processed += n > 0; v = vlib_node_runtime_update_stats (stat_vm, node, - /* n_calls */ 1, - /* n_vectors */ n, - /* n_clocks */ t - last_time_stamp); + /* n_calls */ 1, + /* n_vectors */ n, + /* n_clocks */ t - last_time_stamp); /* When in interrupt mode and vector rate crosses threshold switch to polling mode. */ if ((DPDK == 0 && dispatch_state == VLIB_NODE_STATE_INTERRUPT) - || (DPDK == 0 && dispatch_state == VLIB_NODE_STATE_POLLING - && (node->flags - & VLIB_NODE_FLAG_SWITCH_FROM_INTERRUPT_TO_POLLING_MODE))) - { - ELOG_TYPE_DECLARE (e) = { - .function = (char *) __FUNCTION__, - .format = "%s vector length %d, switching to %s", - .format_args = "T4i4t4", - .n_enum_strings = 2, - .enum_strings = { - "interrupt", "polling", - }, - }; - struct { u32 node_name, vector_length, is_polling; } * ed; - - if (dispatch_state == VLIB_NODE_STATE_INTERRUPT - && v >= nm->polling_threshold_vector_length) - { - vlib_node_t * n = vlib_get_node (vm, node->node_index); - n->state = VLIB_NODE_STATE_POLLING; - node->state = VLIB_NODE_STATE_POLLING; - ASSERT (! (node->flags & VLIB_NODE_FLAG_SWITCH_FROM_INTERRUPT_TO_POLLING_MODE)); - node->flags &= ~VLIB_NODE_FLAG_SWITCH_FROM_POLLING_TO_INTERRUPT_MODE; - node->flags |= VLIB_NODE_FLAG_SWITCH_FROM_INTERRUPT_TO_POLLING_MODE; - nm->input_node_counts_by_state[VLIB_NODE_STATE_INTERRUPT] -= 1; - nm->input_node_counts_by_state[VLIB_NODE_STATE_POLLING] += 1; - - ed = ELOG_DATA (&vm->elog_main, e); - ed->node_name = n->name_elog_string; - ed->vector_length = v; - ed->is_polling = 1; - } - else if (dispatch_state == VLIB_NODE_STATE_POLLING - && v <= nm->interrupt_threshold_vector_length) - { - vlib_node_t * n = vlib_get_node (vm, node->node_index); - if (node->flags & VLIB_NODE_FLAG_SWITCH_FROM_POLLING_TO_INTERRUPT_MODE) - { - /* Switch to interrupt mode after dispatch in polling one more time. - This allows driver to re-enable interrupts. */ - n->state = VLIB_NODE_STATE_INTERRUPT; - node->state = VLIB_NODE_STATE_INTERRUPT; - node->flags &= ~VLIB_NODE_FLAG_SWITCH_FROM_INTERRUPT_TO_POLLING_MODE; - nm->input_node_counts_by_state[VLIB_NODE_STATE_POLLING] -= 1; - nm->input_node_counts_by_state[VLIB_NODE_STATE_INTERRUPT] += 1; - - } - else - { - node->flags |= VLIB_NODE_FLAG_SWITCH_FROM_POLLING_TO_INTERRUPT_MODE; - ed = ELOG_DATA (&vm->elog_main, e); - ed->node_name = n->name_elog_string; - ed->vector_length = v; - ed->is_polling = 0; - } - } - } + || (DPDK == 0 && dispatch_state == VLIB_NODE_STATE_POLLING + && (node->flags + & VLIB_NODE_FLAG_SWITCH_FROM_INTERRUPT_TO_POLLING_MODE))) + { + ELOG_TYPE_DECLARE (e) = + { + .function = (char *) __FUNCTION__,.format = + "%s vector length %d, switching to %s",.format_args = + "T4i4t4",.n_enum_strings = 2,.enum_strings = + { + "interrupt", "polling",},}; + struct + { + u32 node_name, vector_length, is_polling; + } *ed; + + if (dispatch_state == VLIB_NODE_STATE_INTERRUPT + && v >= nm->polling_threshold_vector_length) + { + vlib_node_t *n = vlib_get_node (vm, node->node_index); + n->state = VLIB_NODE_STATE_POLLING; + node->state = VLIB_NODE_STATE_POLLING; + ASSERT (! + (node->flags & + VLIB_NODE_FLAG_SWITCH_FROM_INTERRUPT_TO_POLLING_MODE)); + node->flags &= + ~VLIB_NODE_FLAG_SWITCH_FROM_POLLING_TO_INTERRUPT_MODE; + node->flags |= + VLIB_NODE_FLAG_SWITCH_FROM_INTERRUPT_TO_POLLING_MODE; + nm->input_node_counts_by_state[VLIB_NODE_STATE_INTERRUPT] -= 1; + nm->input_node_counts_by_state[VLIB_NODE_STATE_POLLING] += 1; + + ed = ELOG_DATA (&vm->elog_main, e); + ed->node_name = n->name_elog_string; + ed->vector_length = v; + ed->is_polling = 1; + } + else if (dispatch_state == VLIB_NODE_STATE_POLLING + && v <= nm->interrupt_threshold_vector_length) + { + vlib_node_t *n = vlib_get_node (vm, node->node_index); + if (node->flags & + VLIB_NODE_FLAG_SWITCH_FROM_POLLING_TO_INTERRUPT_MODE) + { + /* Switch to interrupt mode after dispatch in polling one more time. + This allows driver to re-enable interrupts. */ + n->state = VLIB_NODE_STATE_INTERRUPT; + node->state = VLIB_NODE_STATE_INTERRUPT; + node->flags &= + ~VLIB_NODE_FLAG_SWITCH_FROM_INTERRUPT_TO_POLLING_MODE; + nm->input_node_counts_by_state[VLIB_NODE_STATE_POLLING] -= + 1; + nm->input_node_counts_by_state[VLIB_NODE_STATE_INTERRUPT] += + 1; + + } + else + { + node->flags |= + VLIB_NODE_FLAG_SWITCH_FROM_POLLING_TO_INTERRUPT_MODE; + ed = ELOG_DATA (&vm->elog_main, e); + ed->node_name = n->name_elog_string; + ed->vector_length = v; + ed->is_polling = 0; + } + } + } } return t; @@ -1074,13 +1085,12 @@ dispatch_node (vlib_main_t * vm, /* static */ u64 dispatch_pending_node (vlib_main_t * vm, - vlib_pending_frame_t * p, - u64 last_time_stamp) + vlib_pending_frame_t * p, u64 last_time_stamp) { - vlib_node_main_t * nm = &vm->node_main; - vlib_frame_t * f; - vlib_next_frame_t * nf, nf_dummy; - vlib_node_runtime_t * n; + vlib_node_main_t *nm = &vm->node_main; + vlib_frame_t *f; + vlib_next_frame_t *nf, nf_dummy; + vlib_node_runtime_t *n; u32 restore_frame_index; n = vec_elt_at_index (nm->nodes_by_type[VLIB_NODE_TYPE_INTERNAL], @@ -1106,7 +1116,7 @@ dispatch_pending_node (vlib_main_t * vm, { nf->frame_index = ~0; nf->flags &= ~VLIB_FRAME_IS_ALLOCATED; - if (! (n->flags & VLIB_NODE_FLAG_FRAME_NO_FREE_AFTER_DISPATCH)) + if (!(n->flags & VLIB_NODE_FLAG_FRAME_NO_FREE_AFTER_DISPATCH)) restore_frame_index = p->frame_index; } @@ -1132,7 +1142,7 @@ dispatch_pending_node (vlib_main_t * vm, if (restore_frame_index != ~0) { /* p->next_frame_index can change during node dispatch if node - function decides to change graph hook up. */ + function decides to change graph hook up. */ nf = vec_elt_at_index (nm->next_frames, p->next_frame_index); nf->frame_index = restore_frame_index; nf->flags |= VLIB_FRAME_IS_ALLOCATED; @@ -1140,7 +1150,7 @@ dispatch_pending_node (vlib_main_t * vm, if (f->flags & VLIB_FRAME_FREE_AFTER_DISPATCH) { - ASSERT (! (n->flags & VLIB_NODE_FLAG_FRAME_NO_FREE_AFTER_DISPATCH)); + ASSERT (!(n->flags & VLIB_NODE_FLAG_FRAME_NO_FREE_AFTER_DISPATCH)); vlib_frame_free (vm, n, f); } @@ -1149,22 +1159,26 @@ dispatch_pending_node (vlib_main_t * vm, always_inline uword vlib_process_stack_is_valid (vlib_process_t * p) -{ return p->stack[0] == VLIB_PROCESS_STACK_MAGIC; } +{ + return p->stack[0] == VLIB_PROCESS_STACK_MAGIC; +} -typedef struct { - vlib_main_t * vm; - vlib_process_t * process; - vlib_frame_t * frame; +typedef struct +{ + vlib_main_t *vm; + vlib_process_t *process; + vlib_frame_t *frame; } vlib_process_bootstrap_args_t; /* Called in process stack. */ -static uword vlib_process_bootstrap (uword _a) +static uword +vlib_process_bootstrap (uword _a) { - vlib_process_bootstrap_args_t * a; - vlib_main_t * vm; - vlib_node_runtime_t * node; - vlib_frame_t * f; - vlib_process_t * p; + vlib_process_bootstrap_args_t *a; + vlib_main_t *vm; + vlib_node_runtime_t *node; + vlib_frame_t *f; + vlib_process_t *p; uword n; a = uword_to_pointer (_a, vlib_process_bootstrap_args_t *); @@ -1185,9 +1199,7 @@ static uword vlib_process_bootstrap (uword _a) /* Called in main stack. */ static_always_inline uword -vlib_process_startup (vlib_main_t * vm, - vlib_process_t * p, - vlib_frame_t * f) +vlib_process_startup (vlib_main_t * vm, vlib_process_t * p, vlib_frame_t * f) { vlib_process_bootstrap_args_t a; uword r; @@ -1219,13 +1231,11 @@ vlib_process_resume (vlib_process_t * p) static u64 dispatch_process (vlib_main_t * vm, - vlib_process_t * p, - vlib_frame_t * f, - u64 last_time_stamp) + vlib_process_t * p, vlib_frame_t * f, u64 last_time_stamp) { - vlib_node_main_t * nm = &vm->node_main; - vlib_node_runtime_t * node_runtime = &p->node_runtime; - vlib_node_t * node = vlib_get_node (vm, node_runtime->node_index); + vlib_node_main_t *nm = &vm->node_main; + vlib_node_runtime_t *node_runtime = &p->node_runtime; + vlib_node_t *node = vlib_get_node (vm, node_runtime->node_index); u64 t; uword n_vectors, is_suspend; @@ -1251,7 +1261,7 @@ dispatch_process (vlib_main_t * vm, is_suspend = n_vectors == VLIB_PROCESS_RETURN_LONGJMP_SUSPEND; if (is_suspend) { - vlib_pending_frame_t * pf; + vlib_pending_frame_t *pf; n_vectors = 0; pool_get (nm->suspended_process_frames, pf); @@ -1264,59 +1274,64 @@ dispatch_process (vlib_main_t * vm, if (p->flags & VLIB_PROCESS_IS_SUSPENDED_WAITING_FOR_CLOCK) timing_wheel_insert (&nm->timing_wheel, p->resume_cpu_time, - vlib_timing_wheel_data_set_suspended_process (node->runtime_index)); + vlib_timing_wheel_data_set_suspended_process + (node->runtime_index)); } else p->flags &= ~VLIB_PROCESS_IS_RUNNING; t = clib_cpu_time_now (); - vlib_elog_main_loop_event (vm, node_runtime->node_index, t, is_suspend, /* is_after */ 1); + vlib_elog_main_loop_event (vm, node_runtime->node_index, t, is_suspend, + /* is_after */ 1); vlib_process_update_stats (vm, p, - /* n_calls */ ! is_suspend, + /* n_calls */ !is_suspend, /* n_vectors */ n_vectors, /* n_clocks */ t - last_time_stamp); return t; } -void vlib_start_process (vlib_main_t * vm, uword process_index) +void +vlib_start_process (vlib_main_t * vm, uword process_index) { - vlib_node_main_t * nm = &vm->node_main; - vlib_process_t * p = vec_elt (nm->processes, process_index); + vlib_node_main_t *nm = &vm->node_main; + vlib_process_t *p = vec_elt (nm->processes, process_index); dispatch_process (vm, p, /* frame */ 0, /* cpu_time_now */ 0); } static u64 dispatch_suspended_process (vlib_main_t * vm, - uword process_index, - u64 last_time_stamp) + uword process_index, u64 last_time_stamp) { - vlib_node_main_t * nm = &vm->node_main; - vlib_node_runtime_t * node_runtime; - vlib_node_t * node; - vlib_frame_t * f; - vlib_process_t * p; - vlib_pending_frame_t * pf; + vlib_node_main_t *nm = &vm->node_main; + vlib_node_runtime_t *node_runtime; + vlib_node_t *node; + vlib_frame_t *f; + vlib_process_t *p; + vlib_pending_frame_t *pf; u64 t, n_vectors, is_suspend; - + t = last_time_stamp; p = vec_elt (nm->processes, process_index); - if (PREDICT_FALSE (! (p->flags & VLIB_PROCESS_IS_RUNNING))) + if (PREDICT_FALSE (!(p->flags & VLIB_PROCESS_IS_RUNNING))) return last_time_stamp; ASSERT (p->flags & (VLIB_PROCESS_IS_SUSPENDED_WAITING_FOR_CLOCK | VLIB_PROCESS_IS_SUSPENDED_WAITING_FOR_EVENT)); - pf = pool_elt_at_index (nm->suspended_process_frames, p->suspended_process_frame_index); + pf = + pool_elt_at_index (nm->suspended_process_frames, + p->suspended_process_frame_index); node_runtime = &p->node_runtime; node = vlib_get_node (vm, node_runtime->node_index); f = pf->frame_index != ~0 ? vlib_get_frame (vm, pf->frame_index) : 0; - vlib_elog_main_loop_event (vm, node_runtime->node_index, t, f ? f->n_vectors : 0, /* is_after */ 0); + vlib_elog_main_loop_event (vm, node_runtime->node_index, t, + f ? f->n_vectors : 0, /* is_after */ 0); /* Save away current process for suspend. */ nm->current_process_index = node->runtime_index; @@ -1334,7 +1349,8 @@ dispatch_suspended_process (vlib_main_t * vm, p->n_suspends += 1; if (p->flags & VLIB_PROCESS_IS_SUSPENDED_WAITING_FOR_CLOCK) timing_wheel_insert (&nm->timing_wheel, p->resume_cpu_time, - vlib_timing_wheel_data_set_suspended_process (node->runtime_index)); + vlib_timing_wheel_data_set_suspended_process + (node->runtime_index)); } else { @@ -1344,19 +1360,21 @@ dispatch_suspended_process (vlib_main_t * vm, } t = clib_cpu_time_now (); - vlib_elog_main_loop_event (vm, node_runtime->node_index, t, ! is_suspend, /* is_after */ 1); + vlib_elog_main_loop_event (vm, node_runtime->node_index, t, !is_suspend, + /* is_after */ 1); vlib_process_update_stats (vm, p, - /* n_calls */ ! is_suspend, + /* n_calls */ !is_suspend, /* n_vectors */ n_vectors, /* n_clocks */ t - last_time_stamp); return t; } -static void vlib_main_loop (vlib_main_t * vm) +static void +vlib_main_loop (vlib_main_t * vm) { - vlib_node_main_t * nm = &vm->node_main; + vlib_node_main_t *nm = &vm->node_main; uword i; u64 cpu_time_now; @@ -1373,16 +1391,15 @@ static void vlib_main_loop (vlib_main_t * vm) nm->timing_wheel.min_sched_time = 10e-6; nm->timing_wheel.max_sched_time = 10e-3; timing_wheel_init (&nm->timing_wheel, - cpu_time_now, - vm->clib_time.clocks_per_second); + cpu_time_now, vm->clib_time.clocks_per_second); /* Pre-allocate expired nodes. */ vec_alloc (nm->data_from_advancing_timing_wheel, 32); vec_alloc (nm->pending_interrupt_node_runtime_indices, 32); - if (! nm->polling_threshold_vector_length) + if (!nm->polling_threshold_vector_length) nm->polling_threshold_vector_length = 10; - if (! nm->interrupt_threshold_vector_length) + if (!nm->interrupt_threshold_vector_length) nm->interrupt_threshold_vector_length = 5; nm->current_process_index = ~0; @@ -1391,12 +1408,13 @@ static void vlib_main_loop (vlib_main_t * vm) { uword i; for (i = 0; i < vec_len (nm->processes); i++) - cpu_time_now = dispatch_process (vm, nm->processes[i], /* frame */ 0, cpu_time_now); + cpu_time_now = + dispatch_process (vm, nm->processes[i], /* frame */ 0, cpu_time_now); } while (1) { - vlib_node_runtime_t * n; + vlib_node_runtime_t *n; /* Process pre-input nodes. */ vec_foreach (n, nm->nodes_by_type[VLIB_NODE_TYPE_PRE_INPUT]) @@ -1415,7 +1433,7 @@ static void vlib_main_loop (vlib_main_t * vm) cpu_time_now); if (PREDICT_TRUE (vm->queue_signal_pending == 0)) - vm->queue_signal_callback (vm); + vm->queue_signal_callback (vm); /* Next handle interrupts. */ { @@ -1427,12 +1445,14 @@ static void vlib_main_loop (vlib_main_t * vm) for (i = 0; i < l; i++) { n = vec_elt_at_index (nm->nodes_by_type[VLIB_NODE_TYPE_INPUT], - nm->pending_interrupt_node_runtime_indices[i]); - cpu_time_now = dispatch_node (vm, n, - VLIB_NODE_TYPE_INPUT, - VLIB_NODE_STATE_INTERRUPT, - /* frame */ 0, - cpu_time_now); + nm-> + pending_interrupt_node_runtime_indices + [i]); + cpu_time_now = + dispatch_node (vm, n, VLIB_NODE_TYPE_INPUT, + VLIB_NODE_STATE_INTERRUPT, + /* frame */ 0, + cpu_time_now); } } } @@ -1449,31 +1469,41 @@ static void vlib_main_loop (vlib_main_t * vm) uword i; processes_timing_wheel_data: - for (i = 0; i < _vec_len (nm->data_from_advancing_timing_wheel); i++) + for (i = 0; i < _vec_len (nm->data_from_advancing_timing_wheel); + i++) { u32 d = nm->data_from_advancing_timing_wheel[i]; u32 di = vlib_timing_wheel_data_get_index (d); if (vlib_timing_wheel_data_is_timed_event (d)) { - vlib_signal_timed_event_data_t * te = pool_elt_at_index (nm->signal_timed_event_data_pool, di); - vlib_node_t * n = vlib_get_node (vm, te->process_node_index); - vlib_process_t * p = vec_elt (nm->processes, n->runtime_index); - void * data; - data = vlib_process_signal_event_helper (nm, n, p, te->event_type_index, te->n_data_elts, te->n_data_elt_bytes); + vlib_signal_timed_event_data_t *te = + pool_elt_at_index (nm->signal_timed_event_data_pool, di); + vlib_node_t *n = vlib_get_node (vm, te->process_node_index); + vlib_process_t *p = + vec_elt (nm->processes, n->runtime_index); + void *data; + data = + vlib_process_signal_event_helper (nm, n, p, + te->event_type_index, + te->n_data_elts, + te->n_data_elt_bytes); if (te->n_data_bytes < sizeof (te->inline_event_data)) - clib_memcpy (data, te->inline_event_data, te->n_data_bytes); + clib_memcpy (data, te->inline_event_data, + te->n_data_bytes); else { - clib_memcpy (data, te->event_data_as_vector, te->n_data_bytes); + clib_memcpy (data, te->event_data_as_vector, + te->n_data_bytes); vec_free (te->event_data_as_vector); } pool_put (nm->signal_timed_event_data_pool, te); } else { - cpu_time_now = clib_cpu_time_now(); - cpu_time_now = dispatch_suspended_process (vm, di, cpu_time_now); + cpu_time_now = clib_cpu_time_now (); + cpu_time_now = + dispatch_suspended_process (vm, di, cpu_time_now); } } @@ -1485,11 +1515,11 @@ static void vlib_main_loop (vlib_main_t * vm) Process pending vector until there is nothing left. All pending vectors will be processed from input -> output. */ for (i = 0; i < _vec_len (nm->pending_frames); i++) - cpu_time_now = dispatch_pending_node (vm, nm->pending_frames + i, - cpu_time_now); + cpu_time_now = dispatch_pending_node (vm, nm->pending_frames + i, + cpu_time_now); /* Reset pending vector for next iteration. */ _vec_len (nm->pending_frames) = 0; - + /* Pending internal nodes may resume processes. */ if (_vec_len (nm->data_from_advancing_timing_wheel) > 0) goto processes_timing_wheel_data; @@ -1497,11 +1527,11 @@ static void vlib_main_loop (vlib_main_t * vm) vlib_increment_main_loop_counter (vm); /* Record time stamp in case there are no enabled nodes and above - calls do not update time stamp. */ + calls do not update time stamp. */ cpu_time_now = clib_cpu_time_now (); } } - + vlib_main_t vlib_global_main; static clib_error_t * @@ -1532,25 +1562,29 @@ vlib_main_configure (vlib_main_t * vm, unformat_input_t * input) VLIB_EARLY_CONFIG_FUNCTION (vlib_main_configure, "vlib"); -static void dummy_queue_signal_callback (vlib_main_t * vm) { } +static void +dummy_queue_signal_callback (vlib_main_t * vm) +{ +} /* Main function. */ -int vlib_main (vlib_main_t * vm, unformat_input_t * input) +int +vlib_main (vlib_main_t * vm, unformat_input_t * input) { - clib_error_t * error; + clib_error_t *error; vm->queue_signal_callback = dummy_queue_signal_callback; clib_time_init (&vm->clib_time); /* Turn on event log. */ - if (! vm->elog_main.event_ring_size) + if (!vm->elog_main.event_ring_size) vm->elog_main.event_ring_size = 128 << 10; elog_init (&vm->elog_main, vm->elog_main.event_ring_size); elog_enable_disable (&vm->elog_main, 1); /* Default name. */ - if (! vm->name) + if (!vm->name) vm->name = "VLIB"; vec_validate (vm->buffer_main, 0); @@ -1566,7 +1600,7 @@ int vlib_main (vlib_main_t * vm, unformat_input_t * input) /* Set seed for random number generator. Allow user to specify seed to make random sequence deterministic. */ - if (! unformat (input, "seed %wd", &vm->random_seed)) + if (!unformat (input, "seed %wd", &vm->random_seed)) vm->random_seed = clib_cpu_time_now (); clib_random_buffer_init (&vm->random_buffer, vm->random_seed); @@ -1582,12 +1616,13 @@ int vlib_main (vlib_main_t * vm, unformat_input_t * input) /* See unix/main.c; most likely already set up */ if (vm->init_functions_called == 0) - vm->init_functions_called = hash_create (0, /* value bytes */ 0); + vm->init_functions_called = hash_create (0, /* value bytes */ 0); if ((error = vlib_call_all_init_functions (vm))) goto done; /* Create default buffer free list. */ - vlib_buffer_get_or_create_free_list (vm, VLIB_BUFFER_DEFAULT_FREE_LIST_BYTES, + vlib_buffer_get_or_create_free_list (vm, + VLIB_BUFFER_DEFAULT_FREE_LIST_BYTES, "default"); switch (clib_setjmp (&vm->main_loop_exit, VLIB_MAIN_LOOP_EXIT_NONE)) @@ -1604,12 +1639,12 @@ int vlib_main (vlib_main_t * vm, unformat_input_t * input) goto done; } - if ((error = vlib_call_all_config_functions (vm, input, 0 /* is_early */))) + if ((error = vlib_call_all_config_functions (vm, input, 0 /* is_early */ ))) goto done; /* Call all main loop enter functions. */ { - clib_error_t * sub_error; + clib_error_t *sub_error; sub_error = vlib_call_all_main_loop_enter_functions (vm); if (sub_error) clib_error_report (sub_error); @@ -1617,10 +1652,10 @@ int vlib_main (vlib_main_t * vm, unformat_input_t * input) vlib_main_loop (vm); - done: +done: /* Call all exit functions. */ { - clib_error_t * sub_error; + clib_error_t *sub_error; sub_error = vlib_call_all_main_loop_exit_functions (vm); if (sub_error) clib_error_report (sub_error); @@ -1631,3 +1666,11 @@ int vlib_main (vlib_main_t * vm, unformat_input_t * input) return 0; } + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/main.h b/vlib/vlib/main.h index ea279c36bdd..579ef09b255 100644 --- a/vlib/vlib/main.h +++ b/vlib/vlib/main.h @@ -56,7 +56,8 @@ #define VLIB_ELOG_MAIN_LOOP 0 #endif -typedef struct vlib_main_t { +typedef struct vlib_main_t +{ /* Instruction level timing state. */ clib_time_t clib_time; @@ -91,25 +92,24 @@ typedef struct vlib_main_t { #define VLIB_MAIN_LOOP_EXIT_CLI 2 /* Error marker to use when exiting main loop. */ - clib_error_t * main_loop_error; + clib_error_t *main_loop_error; /* Name for e.g. syslog. */ - char * name; + char *name; /* Start and size of CLIB heap. */ - void * heap_base; + void *heap_base; uword heap_size; - vlib_buffer_main_t * buffer_main; + vlib_buffer_main_t *buffer_main; vlib_physmem_main_t physmem_main; /* Allocate/free buffer memory for DMA transfers, descriptor rings, etc. buffer memory is guaranteed to be cache-aligned. */ - void * (* os_physmem_alloc_aligned) (vlib_physmem_main_t * pm, - uword n_bytes, - uword alignment); - void (* os_physmem_free) (void * x); + void *(*os_physmem_alloc_aligned) (vlib_physmem_main_t * pm, + uword n_bytes, uword alignment); + void (*os_physmem_free) (void *x); /* Node graph main structure. */ vlib_node_main_t node_main; @@ -125,26 +125,26 @@ typedef struct vlib_main_t { /* Punt packets to underlying operating system for when fast switching code does not know what to do. */ - void (* os_punt_frame) (struct vlib_main_t * vm, - struct vlib_node_runtime_t * node, - vlib_frame_t * frame); + void (*os_punt_frame) (struct vlib_main_t * vm, + struct vlib_node_runtime_t * node, + vlib_frame_t * frame); /* Multicast distribution. Set to zero for MC disabled. */ - mc_main_t * mc_main; + mc_main_t *mc_main; /* Stream index to use for distribution when MC is enabled. */ u32 mc_stream_index; - vlib_one_time_waiting_process_t * procs_waiting_for_mc_stream_join; + vlib_one_time_waiting_process_t *procs_waiting_for_mc_stream_join; /* Event logger. */ elog_main_t elog_main; /* Node call and return event types. */ - elog_event_type_t * node_call_elog_event_types; - elog_event_type_t * node_return_elog_event_types; + elog_event_type_t *node_call_elog_event_types; + elog_event_type_t *node_return_elog_event_types; - elog_event_type_t * error_elog_event_types; + elog_event_type_t *error_elog_event_types; /* Seed for random number generator. */ uword random_seed; @@ -153,7 +153,7 @@ typedef struct vlib_main_t { clib_random_buffer_t random_buffer; /* Hash table to record which init functions have been called. */ - uword * init_functions_called; + uword *init_functions_called; /* to compare with node runtime */ u32 cpu_index; @@ -166,12 +166,12 @@ typedef struct vlib_main_t { _vlib_init_function_list_elt_t *main_loop_exit_function_registrations; _vlib_init_function_list_elt_t *api_init_function_registrations; vlib_config_function_runtime_t *config_function_registrations; - mc_serialize_msg_t *mc_msg_registrations; /* mc_main is a pointer... */ + mc_serialize_msg_t *mc_msg_registrations; /* mc_main is a pointer... */ /* control-plane API queue signal pending, length indication */ volatile u32 queue_signal_pending; volatile u32 api_queue_nonempty; - void (*queue_signal_callback)(struct vlib_main_t *); + void (*queue_signal_callback) (struct vlib_main_t *); u8 **argv; } vlib_main_t; @@ -180,11 +180,15 @@ vlib_main_t vlib_global_main; always_inline f64 vlib_time_now (vlib_main_t * vm) -{ return clib_time_now (&vm->clib_time); } +{ + return clib_time_now (&vm->clib_time); +} always_inline f64 vlib_time_now_ticks (vlib_main_t * vm, u64 n) -{ return clib_time_now_internal (&vm->clib_time, n); } +{ + return clib_time_now_internal (&vm->clib_time, n); +} /* Busy wait for specified time. */ always_inline void @@ -231,7 +235,9 @@ vlib_panic_with_error (vlib_main_t * vm, clib_error_t * error) always_inline void vlib_panic (vlib_main_t * vm) -{ vlib_panic_with_error (vm, 0); } +{ + vlib_panic_with_error (vm, 0); +} always_inline u32 vlib_vector_input_stats_index (vlib_main_t * vm, word delta) @@ -284,7 +290,7 @@ vlib_increment_main_loop_counter (vlib_main_t * vm) is_wrap = (c & pow2_mask (VLIB_LOG2_MAIN_LOOPS_PER_STATS_UPDATE)) == 0; if (is_wrap) - wraps++; + wraps++; i = vlib_vector_input_stats_index (vm, /* delta */ is_wrap); @@ -299,8 +305,8 @@ vlib_increment_main_loop_counter (vlib_main_t * vm) vm->node_counts_per_main_loop[i] = n; } -always_inline void vlib_set_queue_signal_callback -(vlib_main_t *vm, void (*fp)(vlib_main_t *)) +always_inline void vlib_set_queue_signal_callback + (vlib_main_t * vm, void (*fp) (vlib_main_t *)) { vm->queue_signal_callback = fp; } @@ -317,3 +323,11 @@ u32 vlib_app_num_thread_stacks_needed (void) __attribute__ ((weak)); extern void vlib_node_sync_stats (vlib_main_t * vm, vlib_node_t * n); #endif /* included_vlib_main_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/mc.c b/vlib/vlib/mc.c index 0942666713e..8fde091389e 100644 --- a/vlib/vlib/mc.c +++ b/vlib/vlib/mc.c @@ -17,7 +17,7 @@ #include <vlib/vlib.h> -/* +/* * 1 to enable msg id training wheels, which are useful for tracking * down catchup and/or partitioned network problems */ @@ -25,32 +25,32 @@ static format_function_t format_mc_stream_state; -static u32 elog_id_for_peer_id (mc_main_t * m, u64 peer_id) +static u32 +elog_id_for_peer_id (mc_main_t * m, u64 peer_id) { - uword * p, r; - mhash_t * h = &m->elog_id_by_peer_id; + uword *p, r; + mhash_t *h = &m->elog_id_by_peer_id; - if (! m->elog_id_by_peer_id.hash) + if (!m->elog_id_by_peer_id.hash) mhash_init (h, sizeof (uword), sizeof (mc_peer_id_t)); - + p = mhash_get (h, &peer_id); if (p) return p[0]; - r = elog_string (m->elog_main, "%U", - m->transport.format_peer_id, peer_id); + r = elog_string (m->elog_main, "%U", m->transport.format_peer_id, peer_id); mhash_set (h, &peer_id, r, /* old_value */ 0); return r; } -static u32 elog_id_for_msg_name (mc_main_t * m, char *msg_name) +static u32 +elog_id_for_msg_name (mc_main_t * m, char *msg_name) { - uword * p, r; - uword * h = m->elog_id_by_msg_name; + uword *p, r; + uword *h = m->elog_id_by_msg_name; u8 *name_copy; - if (! h) - h = m->elog_id_by_msg_name - = hash_create_string (0, sizeof (uword)); + if (!h) + h = m->elog_id_by_msg_name = hash_create_string (0, sizeof (uword)); p = hash_get_mem (h, msg_name); if (p) @@ -65,15 +65,23 @@ static u32 elog_id_for_msg_name (mc_main_t * m, char *msg_name) return r; } -static void elog_tx_msg (mc_main_t * m, u32 stream_id, u32 local_sequence, u32 retry_count) +static void +elog_tx_msg (mc_main_t * m, u32 stream_id, u32 local_sequence, + u32 retry_count) { if (MC_EVENT_LOGGING > 0) { - ELOG_TYPE_DECLARE (e) = { - .format = "tx-msg: stream %d local seq %d attempt %d", - .format_args = "i4i4i4", - }; - struct { u32 stream_id, local_sequence, retry_count; } * ed; + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (e) = + { + .format = "tx-msg: stream %d local seq %d attempt %d", + .format_args = "i4i4i4", + }; + /* *INDENT-ON* */ + struct + { + u32 stream_id, local_sequence, retry_count; + } *ed; ed = ELOG_DATA (m->elog_main, e); ed->stream_id = stream_id; ed->local_sequence = local_sequence; @@ -83,7 +91,7 @@ static void elog_tx_msg (mc_main_t * m, u32 stream_id, u32 local_sequence, u32 r /* * seq_cmp - * correctly compare two unsigned sequence numbers. + * correctly compare two unsigned sequence numbers. * This function works so long as x and y are within 2**(n-1) of each * other, where n = bits(x, y). * @@ -92,13 +100,17 @@ static void elog_tx_msg (mc_main_t * m, u32 stream_id, u32 local_sequence, u32 r * seq_cmp < 0 => x is "in the past" with respect to y * seq_cmp > 0 => x is "in the future" with respect to y */ -always_inline i32 mc_seq_cmp (u32 x, u32 y) -{ return (i32) x - (i32) y;} +always_inline i32 +mc_seq_cmp (u32 x, u32 y) +{ + return (i32) x - (i32) y; +} -void * mc_get_vlib_buffer (vlib_main_t * vm, u32 n_bytes, u32 * bi_return) +void * +mc_get_vlib_buffer (vlib_main_t * vm, u32 n_bytes, u32 * bi_return) { u32 n_alloc, bi; - vlib_buffer_t * b; + vlib_buffer_t *b; n_alloc = vlib_buffer_alloc (vm, &bi, 1); ASSERT (n_alloc == 1); @@ -111,10 +123,9 @@ void * mc_get_vlib_buffer (vlib_main_t * vm, u32 n_bytes, u32 * bi_return) static void delete_peer_with_index (mc_main_t * mcm, mc_stream_t * s, - uword index, - int notify_application) + uword index, int notify_application) { - mc_stream_peer_t * p = pool_elt_at_index (s->peers, index); + mc_stream_peer_t *p = pool_elt_at_index (s->peers, index); ASSERT (p != 0); if (s->config.peer_died && notify_application) s->config.peer_died (mcm, s, p->id); @@ -123,11 +134,17 @@ delete_peer_with_index (mc_main_t * mcm, mc_stream_t * s, if (MC_EVENT_LOGGING > 0) { - ELOG_TYPE_DECLARE (e) = { - .format = "delete peer %s from all_peer_bitmap", - .format_args = "T4", - }; - struct { u32 peer; } * ed = 0; + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (e) = + { + .format = "delete peer %s from all_peer_bitmap", + .format_args = "T4", + }; + /* *INDENT-ON* */ + struct + { + u32 peer; + } *ed = 0; ed = ELOG_DATA (mcm->elog_main, e); ed->peer = elog_id_for_peer_id (mcm, p->id.as_u64); @@ -137,11 +154,10 @@ delete_peer_with_index (mc_main_t * mcm, mc_stream_t * s, static mc_stream_peer_t * get_or_create_peer_with_id (mc_main_t * mcm, - mc_stream_t * s, mc_peer_id_t id, - int * created) + mc_stream_t * s, mc_peer_id_t id, int *created) { - uword * q = mhash_get (&s->peer_index_by_id, &id); - mc_stream_peer_t * p; + uword *q = mhash_get (&s->peer_index_by_id, &id); + mc_stream_peer_t *p; if (q) { @@ -157,16 +173,24 @@ get_or_create_peer_with_id (mc_main_t * mcm, if (created) *created = 1; - done: +done: if (MC_EVENT_LOGGING > 0) { - ELOG_TYPE_DECLARE (e) = { - .format = "get_or_create %s peer %s stream %d seq %d", - .format_args = "t4T4i4i4", - .n_enum_strings = 2, - .enum_strings = { "old", "new", }, - }; - struct { u32 is_new, peer, stream_index, rx_sequence; } * ed = 0; + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (e) = + { + .format = "get_or_create %s peer %s stream %d seq %d", + .format_args = "t4T4i4i4", + .n_enum_strings = 2, + .enum_strings = { + "old", "new", + }, + }; + /* *INDENT-ON* */ + struct + { + u32 is_new, peer, stream_index, rx_sequence; + } *ed = 0; ed = ELOG_DATA (mcm->elog_main, e); ed->is_new = q ? 0 : 1; @@ -179,9 +203,10 @@ get_or_create_peer_with_id (mc_main_t * mcm, return p; } -static void maybe_send_window_open_event (vlib_main_t * vm, mc_stream_t * stream) +static void +maybe_send_window_open_event (vlib_main_t * vm, mc_stream_t * stream) { - vlib_one_time_waiting_process_t * p; + vlib_one_time_waiting_process_t *p; if (pool_elts (stream->retry_pool) >= stream->config.window_size) return; @@ -193,64 +218,77 @@ static void maybe_send_window_open_event (vlib_main_t * vm, mc_stream_t * stream _vec_len (stream->procs_waiting_for_open_window) = 0; } -static void mc_retry_free (mc_main_t * mcm, mc_stream_t *s, mc_retry_t * r) +static void +mc_retry_free (mc_main_t * mcm, mc_stream_t * s, mc_retry_t * r) { mc_retry_t record, *retp; - + if (r->unacked_by_peer_bitmap) _vec_len (r->unacked_by_peer_bitmap) = 0; - if (clib_fifo_elts (s->retired_fifo) >= 2 * s->config.window_size) + if (clib_fifo_elts (s->retired_fifo) >= 2 * s->config.window_size) { clib_fifo_sub1 (s->retired_fifo, record); vlib_buffer_free_one (mcm->vlib_main, record.buffer_index); } - + clib_fifo_add2 (s->retired_fifo, retp); - + retp->buffer_index = r->buffer_index; retp->local_sequence = r->local_sequence; r->buffer_index = ~0; /* poison buffer index in this retry */ } -static void mc_resend_retired (mc_main_t *mcm, mc_stream_t *s, u32 local_sequence) +static void +mc_resend_retired (mc_main_t * mcm, mc_stream_t * s, u32 local_sequence) { mc_retry_t *retry; if (MC_EVENT_LOGGING > 0) { - ELOG_TYPE_DECLARE (e) = { - .format = "resend-retired: search for local seq %d", - .format_args = "i4", - }; - struct { u32 local_sequence; } * ed; + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (e) = + { + .format = "resend-retired: search for local seq %d", + .format_args = "i4", + }; + /* *INDENT-ON* */ + struct + { + u32 local_sequence; + } *ed; ed = ELOG_DATA (mcm->elog_main, e); ed->local_sequence = local_sequence; } - clib_fifo_foreach - (retry, s->retired_fifo, - ({ - if (retry->local_sequence == local_sequence) - { - elog_tx_msg (mcm, s->index, retry->local_sequence, -13); - - mcm->transport.tx_buffer - (mcm->transport.opaque, - MC_TRANSPORT_USER_REQUEST_TO_RELAY, - retry->buffer_index); - return; - } - })); + /* *INDENT-OFF* */ + clib_fifo_foreach (retry, s->retired_fifo, + ({ + if (retry->local_sequence == local_sequence) + { + elog_tx_msg (mcm, s->index, retry-> local_sequence, -13); + mcm->transport.tx_buffer (mcm->transport.opaque, + MC_TRANSPORT_USER_REQUEST_TO_RELAY, + retry->buffer_index); + return; + } + })); + /* *INDENT-ON* */ if (MC_EVENT_LOGGING > 0) { - ELOG_TYPE_DECLARE (e) = { - .format = "resend-retired: FAILED search for local seq %d", - .format_args = "i4", - }; - struct { u32 local_sequence; } * ed; + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (e) = + { + .format = "resend-retired: FAILED search for local seq %d", + .format_args = "i4", + }; + /* *INDENT-ON* */ + struct + { + u32 local_sequence; + } *ed; ed = ELOG_DATA (mcm->elog_main, e); ed->local_sequence = local_sequence; } @@ -259,11 +297,11 @@ static void mc_resend_retired (mc_main_t *mcm, mc_stream_t *s, u32 local_sequenc static uword * delete_retry_fifo_elt (mc_main_t * mcm, mc_stream_t * stream, - mc_retry_t * r, - uword * dead_peer_bitmap) + mc_retry_t * r, uword * dead_peer_bitmap) { - mc_stream_peer_t * p; + mc_stream_peer_t *p; + /* *INDENT-OFF* */ pool_foreach (p, stream->peers, ({ uword pi = p - stream->peers; uword is_alive = 0 == clib_bitmap_get (r->unacked_by_peer_bitmap, pi); @@ -285,7 +323,8 @@ delete_retry_fifo_elt (mc_main_t * mcm, ed->is_alive = is_alive; } })); - + /* *INDENT-ON* */ + hash_unset (stream->retry_index_by_local_sequence, r->local_sequence); mc_retry_free (mcm, stream, r); @@ -296,23 +335,21 @@ always_inline mc_retry_t * prev_retry (mc_stream_t * s, mc_retry_t * r) { return (r->prev_index != ~0 - ? pool_elt_at_index (s->retry_pool, r->prev_index) - : 0); + ? pool_elt_at_index (s->retry_pool, r->prev_index) : 0); } always_inline mc_retry_t * next_retry (mc_stream_t * s, mc_retry_t * r) { return (r->next_index != ~0 - ? pool_elt_at_index (s->retry_pool, r->next_index) - : 0); + ? pool_elt_at_index (s->retry_pool, r->next_index) : 0); } always_inline void remove_retry_from_pool (mc_stream_t * s, mc_retry_t * r) { - mc_retry_t * p = prev_retry (s, r); - mc_retry_t * n = next_retry (s, r); + mc_retry_t *p = prev_retry (s, r); + mc_retry_t *n = next_retry (s, r); if (p) p->next_index = r->next_index; @@ -326,12 +363,13 @@ remove_retry_from_pool (mc_stream_t * s, mc_retry_t * r) pool_put_index (s->retry_pool, r - s->retry_pool); } -static void check_retry (mc_main_t * mcm, mc_stream_t * s) +static void +check_retry (mc_main_t * mcm, mc_stream_t * s) { - mc_retry_t * r; - vlib_main_t * vm = mcm->vlib_main; - f64 now = vlib_time_now(vm); - uword * dead_peer_bitmap = 0; + mc_retry_t *r; + vlib_main_t *vm = mcm->vlib_main; + f64 now = vlib_time_now (vm); + uword *dead_peer_bitmap = 0; u32 ri, ri_next; for (ri = s->retry_head_index; ri != ~0; ri = ri_next) @@ -353,12 +391,17 @@ static void check_retry (mc_main_t * mcm, mc_stream_t * s) { if (MC_EVENT_LOGGING > 0) { - mc_stream_peer_t * p; - ELOG_TYPE_DECLARE (t) = { - .format = "resend local seq %d attempt %d", - .format_args = "i4i4", - }; + mc_stream_peer_t *p; + + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (t) = + { + .format = "resend local seq %d attempt %d", + .format_args = "i4i4", + }; + /* *INDENT-ON* */ + /* *INDENT-OFF* */ pool_foreach (p, s->peers, ({ if (clib_bitmap_get (r->unacked_by_peer_bitmap, p - s->peers)) { @@ -372,8 +415,13 @@ static void check_retry (mc_main_t * mcm, mc_stream_t * s) ed->rx_sequence = r->local_sequence; } })); + /* *INDENT-ON* */ - struct { u32 sequence; u32 trail; } * ed; + struct + { + u32 sequence; + u32 trail; + } *ed; ed = ELOG_DATA (mcm->elog_main, t); ed->sequence = r->local_sequence; ed->trail = r->n_retries; @@ -385,19 +433,19 @@ static void check_retry (mc_main_t * mcm, mc_stream_t * s) elog_tx_msg (mcm, s->index, r->local_sequence, r->n_retries); mcm->transport.tx_buffer - (mcm->transport.opaque, - MC_TRANSPORT_USER_REQUEST_TO_RELAY, - r->buffer_index); + (mcm->transport.opaque, + MC_TRANSPORT_USER_REQUEST_TO_RELAY, r->buffer_index); } } maybe_send_window_open_event (mcm->vlib_main, s); /* Delete any dead peers we've found. */ - if (! clib_bitmap_is_zero (dead_peer_bitmap)) + if (!clib_bitmap_is_zero (dead_peer_bitmap)) { uword i; + /* *INDENT-OFF* */ clib_bitmap_foreach (i, dead_peer_bitmap, ({ delete_peer_with_index (mcm, s, i, /* notify_application */ 1); @@ -407,6 +455,7 @@ static void check_retry (mc_main_t * mcm, mc_stream_t * s) clib_bitmap_andnoti (r->unacked_by_peer_bitmap, i); })); })); +/* *INDENT-ON* */ clib_bitmap_free (dead_peer_bitmap); } } @@ -414,38 +463,38 @@ static void check_retry (mc_main_t * mcm, mc_stream_t * s) always_inline mc_main_t * mc_node_get_main (vlib_node_runtime_t * node) { - mc_main_t ** p = (void *) node->runtime_data; + mc_main_t **p = (void *) node->runtime_data; return p[0]; } static uword mc_retry_process (vlib_main_t * vm, - vlib_node_runtime_t * node, - vlib_frame_t * f) + vlib_node_runtime_t * node, vlib_frame_t * f) { - mc_main_t * mcm = mc_node_get_main (node); - mc_stream_t * s; - + mc_main_t *mcm = mc_node_get_main (node); + mc_stream_t *s; + while (1) { vlib_process_suspend (vm, 1.0); vec_foreach (s, mcm->stream_vector) - { - if (s->state != MC_STREAM_STATE_invalid) - check_retry (mcm, s); - } + { + if (s->state != MC_STREAM_STATE_invalid) + check_retry (mcm, s); + } } - return 0; /* not likely */ + return 0; /* not likely */ } -static void send_join_or_leave_request (mc_main_t * mcm, u32 stream_index, u32 is_join) +static void +send_join_or_leave_request (mc_main_t * mcm, u32 stream_index, u32 is_join) { - vlib_main_t * vm = mcm->vlib_main; - mc_msg_join_or_leave_request_t * mp; + vlib_main_t *vm = mcm->vlib_main; + mc_msg_join_or_leave_request_t *mp; u32 bi; mp = mc_get_vlib_buffer (vm, sizeof (mp[0]), &bi); - memset(mp, 0, sizeof (*mp)); + memset (mp, 0, sizeof (*mp)); mp->type = MC_MSG_TYPE_join_or_leave_request; mp->peer_id = mcm->transport.our_ack_peer_id; mp->stream_index = stream_index; @@ -453,104 +502,111 @@ static void send_join_or_leave_request (mc_main_t * mcm, u32 stream_index, u32 i mc_byte_swap_msg_join_or_leave_request (mp); - /* + /* * These msgs are unnumbered, unordered so send on the from-relay - * channel. + * channel. */ mcm->transport.tx_buffer (mcm->transport.opaque, MC_TRANSPORT_JOIN, bi); -} +} static uword mc_join_ager_process (vlib_main_t * vm, - vlib_node_runtime_t * node, - vlib_frame_t * f) + vlib_node_runtime_t * node, vlib_frame_t * f) { - mc_main_t * mcm = mc_node_get_main (node); - + mc_main_t *mcm = mc_node_get_main (node); + while (1) { if (mcm->joins_in_progress) { - mc_stream_t * s; - vlib_one_time_waiting_process_t * p; + mc_stream_t *s; + vlib_one_time_waiting_process_t *p; f64 now = vlib_time_now (vm); vec_foreach (s, mcm->stream_vector) - { - if (s->state != MC_STREAM_STATE_join_in_progress) - continue; + { + if (s->state != MC_STREAM_STATE_join_in_progress) + continue; - if (now > s->join_timeout) - { - s->state = MC_STREAM_STATE_ready; - - if (MC_EVENT_LOGGING > 0) - { - ELOG_TYPE_DECLARE (e) = { - .format = "stream %d join timeout", - }; - ELOG (mcm->elog_main, e, s->index); - } - /* Make sure that this app instance exists as a stream peer, - or we may answer a catchup request with a NULL - all_peer_bitmap... */ - (void) get_or_create_peer_with_id - (mcm, s, mcm->transport.our_ack_peer_id, /* created */ 0); - - vec_foreach (p, s->procs_waiting_for_join_done) - vlib_signal_one_time_waiting_process (vm, p); - if (s->procs_waiting_for_join_done) - _vec_len (s->procs_waiting_for_join_done) = 0; - - mcm->joins_in_progress--; - ASSERT (mcm->joins_in_progress >= 0); - } - else - { - /* Resent join request which may have been lost. */ - send_join_or_leave_request (mcm, s->index, - 1 /* is_join */); - - /* We're *not* alone, retry for as long as it takes */ - if (mcm->relay_state == MC_RELAY_STATE_SLAVE) - s->join_timeout = vlib_time_now (vm) + 2.0; - - - if (MC_EVENT_LOGGING > 0) - { - ELOG_TYPE_DECLARE (e) = { - .format = "stream %d resend join request", - }; - ELOG (mcm->elog_main, e, s->index); - } - } - } + if (now > s->join_timeout) + { + s->state = MC_STREAM_STATE_ready; + + if (MC_EVENT_LOGGING > 0) + { + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (e) = + { + .format = "stream %d join timeout", + }; + /* *INDENT-ON* */ + ELOG (mcm->elog_main, e, s->index); + } + /* Make sure that this app instance exists as a stream peer, + or we may answer a catchup request with a NULL + all_peer_bitmap... */ + (void) get_or_create_peer_with_id + (mcm, s, mcm->transport.our_ack_peer_id, /* created */ 0); + + vec_foreach (p, s->procs_waiting_for_join_done) + vlib_signal_one_time_waiting_process (vm, p); + if (s->procs_waiting_for_join_done) + _vec_len (s->procs_waiting_for_join_done) = 0; + + mcm->joins_in_progress--; + ASSERT (mcm->joins_in_progress >= 0); + } + else + { + /* Resent join request which may have been lost. */ + send_join_or_leave_request (mcm, s->index, 1 /* is_join */ ); + + /* We're *not* alone, retry for as long as it takes */ + if (mcm->relay_state == MC_RELAY_STATE_SLAVE) + s->join_timeout = vlib_time_now (vm) + 2.0; + + + if (MC_EVENT_LOGGING > 0) + { + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (e) = + { + .format = "stream %d resend join request", + }; + /* *INDENT-ON* */ + ELOG (mcm->elog_main, e, s->index); + } + } + } } vlib_process_suspend (vm, .5); } - return 0; /* not likely */ + return 0; /* not likely */ } -static void serialize_mc_register_stream_name (serialize_main_t * m, va_list * va) +static void +serialize_mc_register_stream_name (serialize_main_t * m, va_list * va) { - char * name = va_arg (*va, char *); + char *name = va_arg (*va, char *); serialize_cstring (m, name); } -static void elog_stream_name (char * buf, int n_buf_bytes, char * v) +static void +elog_stream_name (char *buf, int n_buf_bytes, char *v) { clib_memcpy (buf, v, clib_min (n_buf_bytes - 1, vec_len (v))); buf[n_buf_bytes - 1] = 0; } -static void unserialize_mc_register_stream_name (serialize_main_t * m, va_list * va) +static void +unserialize_mc_register_stream_name (serialize_main_t * m, va_list * va) { - mc_main_t * mcm = va_arg (*va, mc_main_t *); - char * name; - mc_stream_t * s; - uword * p; + mc_main_t *mcm = va_arg (*va, mc_main_t *); + char *name; + mc_stream_t *s; + uword *p; unserialize_cstring (m, &name); @@ -558,11 +614,18 @@ static void unserialize_mc_register_stream_name (serialize_main_t * m, va_list * { if (MC_EVENT_LOGGING > 0) { - ELOG_TYPE_DECLARE (e) = { - .format = "stream index %d already named %s", - .format_args = "i4s16", - }; - struct { u32 stream_index; char name[16]; } * ed; + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (e) = + { + .format = "stream index %d already named %s", + .format_args = "i4s16", + }; + /* *INDENT-ON* */ + struct + { + u32 stream_index; + char name[16]; + } *ed; ed = ELOG_DATA (mcm->elog_main, e); ed->stream_index = p[0]; elog_stream_name (ed->name, sizeof (ed->name), name); @@ -580,11 +643,18 @@ static void unserialize_mc_register_stream_name (serialize_main_t * m, va_list * if (MC_EVENT_LOGGING > 0) { - ELOG_TYPE_DECLARE (e) = { - .format = "stream index %d named %s", - .format_args = "i4s16", - }; - struct { u32 stream_index; char name[16]; } * ed; + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (e) = + { + .format = "stream index %d named %s", + .format_args = "i4s16", + }; + /* *INDENT-ON* */ + struct + { + u32 stream_index; + char name[16]; + } *ed; ed = ELOG_DATA (mcm->elog_main, e); ed->stream_index = s->index; elog_stream_name (ed->name, sizeof (ed->name), name); @@ -595,7 +665,7 @@ static void unserialize_mc_register_stream_name (serialize_main_t * m, va_list * p = hash_get (mcm->procs_waiting_for_stream_name_by_name, name); if (p) { - vlib_one_time_waiting_process_t * wp, ** w; + vlib_one_time_waiting_process_t *wp, **w; w = pool_elt_at_index (mcm->procs_waiting_for_stream_name_pool, p[0]); vec_foreach (wp, w[0]) vlib_signal_one_time_waiting_process (mcm->vlib_main, wp); @@ -604,18 +674,22 @@ static void unserialize_mc_register_stream_name (serialize_main_t * m, va_list * } } -MC_SERIALIZE_MSG (mc_register_stream_name_msg, static) = { +/* *INDENT-OFF* */ +MC_SERIALIZE_MSG (mc_register_stream_name_msg, static) = +{ .name = "mc_register_stream_name", .serialize = serialize_mc_register_stream_name, .unserialize = unserialize_mc_register_stream_name, }; +/* *INDENT-ON* */ void mc_rx_buffer_unserialize (mc_main_t * mcm, mc_stream_t * stream, - mc_peer_id_t peer_id, - u32 buffer_index) -{ return mc_unserialize (mcm, stream, buffer_index); } + mc_peer_id_t peer_id, u32 buffer_index) +{ + return mc_unserialize (mcm, stream, buffer_index); +} static u8 * mc_internal_catchup_snapshot (mc_main_t * mcm, @@ -633,9 +707,7 @@ mc_internal_catchup_snapshot (mc_main_t * mcm, } static void -mc_internal_catchup (mc_main_t * mcm, - u8 * data, - u32 n_data_bytes) +mc_internal_catchup (mc_main_t * mcm, u8 * data, u32 n_data_bytes) { serialize_main_t s; @@ -646,20 +718,22 @@ mc_internal_catchup (mc_main_t * mcm, /* Overridden from the application layer, not actually used here */ void mc_stream_join_process_hold (void) __attribute__ ((weak)); -void mc_stream_join_process_hold (void) { } +void +mc_stream_join_process_hold (void) +{ +} static u32 mc_stream_join_helper (mc_main_t * mcm, - mc_stream_config_t * config, - u32 is_internal) + mc_stream_config_t * config, u32 is_internal) { - mc_stream_t * s; - vlib_main_t * vm = mcm->vlib_main; - + mc_stream_t *s; + vlib_main_t *vm = mcm->vlib_main; + s = 0; - if (! is_internal) + if (!is_internal) { - uword * p; + uword *p; /* Already have a stream with given name? */ if ((s = mc_stream_by_name (mcm, config->name))) @@ -670,10 +744,10 @@ mc_stream_join_helper (mc_main_t * mcm, } /* First join MC internal stream. */ - if (! mcm->stream_vector - || (mcm->stream_vector[MC_STREAM_INDEX_INTERNAL].state - == MC_STREAM_STATE_invalid)) - { + if (!mcm->stream_vector + || (mcm->stream_vector[MC_STREAM_INDEX_INTERNAL].state + == MC_STREAM_STATE_invalid)) + { static mc_stream_config_t c = { .name = "mc-internal", .rx_buffer = mc_rx_buffer_unserialize, @@ -681,35 +755,39 @@ mc_stream_join_helper (mc_main_t * mcm, .catchup_snapshot = mc_internal_catchup_snapshot, }; - c.save_snapshot = config->save_snapshot; + c.save_snapshot = config->save_snapshot; mc_stream_join_helper (mcm, &c, /* is_internal */ 1); } /* If stream is still unknown register this name and wait for - sequenced message to name stream. This way all peers agree - on stream name to index mappings. */ + sequenced message to name stream. This way all peers agree + on stream name to index mappings. */ s = mc_stream_by_name (mcm, config->name); - if (! s) + if (!s) { - vlib_one_time_waiting_process_t * wp, ** w; - u8 * name_copy = format (0, "%s", config->name); + vlib_one_time_waiting_process_t *wp, **w; + u8 *name_copy = format (0, "%s", config->name); mc_serialize_stream (mcm, MC_STREAM_INDEX_INTERNAL, - &mc_register_stream_name_msg, - config->name); + &mc_register_stream_name_msg, config->name); /* Wait for this stream to be named. */ - p = hash_get_mem (mcm->procs_waiting_for_stream_name_by_name, name_copy); + p = + hash_get_mem (mcm->procs_waiting_for_stream_name_by_name, + name_copy); if (p) - w = pool_elt_at_index (mcm->procs_waiting_for_stream_name_pool, p[0]); + w = + pool_elt_at_index (mcm->procs_waiting_for_stream_name_pool, + p[0]); else { pool_get (mcm->procs_waiting_for_stream_name_pool, w); - if (! mcm->procs_waiting_for_stream_name_by_name) - mcm->procs_waiting_for_stream_name_by_name - = hash_create_string (/* elts */ 0, /* value size */ sizeof (uword)); + if (!mcm->procs_waiting_for_stream_name_by_name) + mcm->procs_waiting_for_stream_name_by_name = hash_create_string ( /* elts */ 0, /* value size */ + sizeof + (uword)); hash_set_mem (mcm->procs_waiting_for_stream_name_by_name, name_copy, w - mcm->procs_waiting_for_stream_name_pool); @@ -727,7 +805,7 @@ mc_stream_join_helper (mc_main_t * mcm, ASSERT (s->state == MC_STREAM_STATE_name_known); } - if (! s) + if (!s) { vec_add2 (mcm->stream_vector, s, 1); mc_stream_init (s); @@ -736,7 +814,7 @@ mc_stream_join_helper (mc_main_t * mcm, { /* Save name since we could have already used it as hash key. */ - char * name_save = s->config.name; + char *name_save = s->config.name; s->config = config[0]; @@ -748,16 +826,16 @@ mc_stream_join_helper (mc_main_t * mcm, s->config.window_size = 8; if (s->config.retry_interval == 0.0) - s->config.retry_interval = 1.0; + s->config.retry_interval = 1.0; /* Sanity. */ ASSERT (s->config.retry_interval < 30); if (s->config.retry_limit == 0) - s->config.retry_limit = 7; + s->config.retry_limit = 7; s->state = MC_STREAM_STATE_join_in_progress; - if (! s->peer_index_by_id.hash) + if (!s->peer_index_by_id.hash) mhash_init (&s->peer_index_by_id, sizeof (uword), sizeof (mc_peer_id_t)); /* If we don't hear from someone in 5 seconds, we're alone */ @@ -766,21 +844,28 @@ mc_stream_join_helper (mc_main_t * mcm, if (MC_EVENT_LOGGING > 0) { - ELOG_TYPE_DECLARE (e) = { - .format = "stream index %d join request %s", - .format_args = "i4s16", + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (e) = + { + .format = "stream index %d join request %s", + .format_args = "i4s16", }; - struct { u32 stream_index; char name[16]; } * ed; + /* *INDENT-ON* */ + struct + { + u32 stream_index; + char name[16]; + } *ed; ed = ELOG_DATA (mcm->elog_main, e); ed->stream_index = s->index; elog_stream_name (ed->name, sizeof (ed->name), s->config.name); } - send_join_or_leave_request (mcm, s->index, 1 /* join */); - + send_join_or_leave_request (mcm, s->index, 1 /* join */ ); + vlib_current_process_wait_for_one_time_event_vector (vm, &s->procs_waiting_for_join_done); - + if (MC_EVENT_LOGGING) { ELOG_TYPE (e, "join complete stream %d"); @@ -790,77 +875,84 @@ mc_stream_join_helper (mc_main_t * mcm, return s->index; } -u32 mc_stream_join (mc_main_t * mcm, mc_stream_config_t * config) -{ return mc_stream_join_helper (mcm, config, /* is_internal */ 0); } +u32 +mc_stream_join (mc_main_t * mcm, mc_stream_config_t * config) +{ + return mc_stream_join_helper (mcm, config, /* is_internal */ 0); +} -void mc_stream_leave (mc_main_t * mcm, u32 stream_index) +void +mc_stream_leave (mc_main_t * mcm, u32 stream_index) { - mc_stream_t * s = mc_stream_by_index (mcm, stream_index); - - if (! s) + mc_stream_t *s = mc_stream_by_index (mcm, stream_index); + + if (!s) return; if (MC_EVENT_LOGGING) { - ELOG_TYPE_DECLARE (t) = { - .format = "leave-stream: %d", - .format_args = "i4", - }; - struct { u32 index; } * ed; + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (t) = + { + .format = "leave-stream: %d",.format_args = "i4", + }; + /* *INDENT-ON* */ + struct + { + u32 index; + } *ed; ed = ELOG_DATA (mcm->elog_main, t); ed->index = stream_index; } - send_join_or_leave_request (mcm, stream_index, 0 /* is_join */); + send_join_or_leave_request (mcm, stream_index, 0 /* is_join */ ); mc_stream_free (s); s->state = MC_STREAM_STATE_name_known; } -void mc_msg_join_or_leave_request_handler (mc_main_t * mcm, - mc_msg_join_or_leave_request_t * req, - u32 buffer_index) +void +mc_msg_join_or_leave_request_handler (mc_main_t * mcm, + mc_msg_join_or_leave_request_t * req, + u32 buffer_index) { - mc_stream_t * s; - mc_msg_join_reply_t * rep; + mc_stream_t *s; + mc_msg_join_reply_t *rep; u32 bi; mc_byte_swap_msg_join_or_leave_request (req); s = mc_stream_by_index (mcm, req->stream_index); - if (! s || s->state != MC_STREAM_STATE_ready) + if (!s || s->state != MC_STREAM_STATE_ready) return; /* If the peer is joining, create it */ - if (req->is_join) + if (req->is_join) { - mc_stream_t * this_s; + mc_stream_t *this_s; /* We're not in a position to catch up a peer until all stream joins are complete. */ if (0) - { - /* XXX This is hard to test so we've. */ - vec_foreach (this_s, mcm->stream_vector) - { - if (this_s->state != MC_STREAM_STATE_ready - && this_s->state != MC_STREAM_STATE_name_known) - return; - } - } - else - if (mcm->joins_in_progress > 0) - return; - - (void) get_or_create_peer_with_id (mcm, - s, - req->peer_id, - /* created */ 0); + { + /* XXX This is hard to test so we've. */ + vec_foreach (this_s, mcm->stream_vector) + { + if (this_s->state != MC_STREAM_STATE_ready + && this_s->state != MC_STREAM_STATE_name_known) + return; + } + } + else if (mcm->joins_in_progress > 0) + return; + + (void) get_or_create_peer_with_id (mcm, s, req->peer_id, + /* created */ 0); rep = mc_get_vlib_buffer (mcm->vlib_main, sizeof (rep[0]), &bi); memset (rep, 0, sizeof (rep[0])); rep->type = MC_MSG_TYPE_join_reply; rep->stream_index = req->stream_index; - + mc_byte_swap_msg_join_reply (rep); /* These two are already in network byte order... */ rep->peer_id = mcm->transport.our_ack_peer_id; @@ -875,32 +967,32 @@ void mc_msg_join_or_leave_request_handler (mc_main_t * mcm, } } -void mc_msg_join_reply_handler (mc_main_t * mcm, - mc_msg_join_reply_t * mp, - u32 buffer_index) +void +mc_msg_join_reply_handler (mc_main_t * mcm, + mc_msg_join_reply_t * mp, u32 buffer_index) { - mc_stream_t * s; + mc_stream_t *s; mc_byte_swap_msg_join_reply (mp); s = mc_stream_by_index (mcm, mp->stream_index); - if (! s || s->state != MC_STREAM_STATE_join_in_progress) + if (!s || s->state != MC_STREAM_STATE_join_in_progress) return; - /* Switch to catchup state; next join reply + /* Switch to catchup state; next join reply for this stream will be ignored. */ s->state = MC_STREAM_STATE_catchup; mcm->joins_in_progress--; mcm->transport.catchup_request_fun (mcm->transport.opaque, - mp->stream_index, - mp->catchup_peer_id); + mp->stream_index, mp->catchup_peer_id); } -void mc_wait_for_stream_ready (mc_main_t * m, char * stream_name) +void +mc_wait_for_stream_ready (mc_main_t * m, char *stream_name) { - mc_stream_t * s; + mc_stream_t *s; while (1) { @@ -920,16 +1012,17 @@ void mc_wait_for_stream_ready (mc_main_t * m, char * stream_name) (m->vlib_main, &s->procs_waiting_for_join_done); } -u32 mc_stream_send (mc_main_t * mcm, u32 stream_index, u32 buffer_index) +u32 +mc_stream_send (mc_main_t * mcm, u32 stream_index, u32 buffer_index) { - mc_stream_t * s = mc_stream_by_index (mcm, stream_index); - vlib_main_t * vm = mcm->vlib_main; - mc_retry_t * r; - mc_msg_user_request_t * mp; - vlib_buffer_t * b = vlib_get_buffer (vm, buffer_index); + mc_stream_t *s = mc_stream_by_index (mcm, stream_index); + vlib_main_t *vm = mcm->vlib_main; + mc_retry_t *r; + mc_msg_user_request_t *mp; + vlib_buffer_t *b = vlib_get_buffer (vm, buffer_index); u32 ri; - if (! s) + if (!s) return 0; if (s->state != MC_STREAM_STATE_ready) @@ -953,7 +1046,7 @@ u32 mc_stream_send (mc_main_t * mcm, u32 stream_index, u32 buffer_index) s->retry_head_index = ri; else { - mc_retry_t * p = pool_elt_at_index (s->retry_pool, r->prev_index); + mc_retry_t *p = pool_elt_at_index (s->retry_pool, r->prev_index); p->next_index = ri; } @@ -965,24 +1058,27 @@ u32 mc_stream_send (mc_main_t * mcm, u32 stream_index, u32 buffer_index) mp->global_sequence = 0xdeadbeef; mp->stream_index = s->index; mp->local_sequence = s->our_local_sequence++; - mp->n_data_bytes = vlib_buffer_index_length_in_chain (vm, buffer_index) - sizeof (mp[0]); + mp->n_data_bytes = + vlib_buffer_index_length_in_chain (vm, buffer_index) - sizeof (mp[0]); r->buffer_index = buffer_index; r->local_sequence = mp->local_sequence; - r->sent_at = vlib_time_now(vm); + r->sent_at = vlib_time_now (vm); r->n_retries = 0; /* Retry will be freed when all currently known peers have acked. */ vec_validate (r->unacked_by_peer_bitmap, vec_len (s->all_peer_bitmap) - 1); vec_copy (r->unacked_by_peer_bitmap, s->all_peer_bitmap); - hash_set (s->retry_index_by_local_sequence, r->local_sequence, r - s->retry_pool); + hash_set (s->retry_index_by_local_sequence, r->local_sequence, + r - s->retry_pool); elog_tx_msg (mcm, s->index, mp->local_sequence, r->n_retries); mc_byte_swap_msg_user_request (mp); - mcm->transport.tx_buffer (mcm->transport.opaque, MC_TRANSPORT_USER_REQUEST_TO_RELAY, buffer_index); + mcm->transport.tx_buffer (mcm->transport.opaque, + MC_TRANSPORT_USER_REQUEST_TO_RELAY, buffer_index); s->user_requests_sent++; @@ -990,40 +1086,48 @@ u32 mc_stream_send (mc_main_t * mcm, u32 stream_index, u32 buffer_index) return s->config.window_size - pool_elts (s->retry_pool); } -void mc_msg_user_request_handler (mc_main_t * mcm, mc_msg_user_request_t * mp, u32 buffer_index) +void +mc_msg_user_request_handler (mc_main_t * mcm, mc_msg_user_request_t * mp, + u32 buffer_index) { - vlib_main_t * vm = mcm->vlib_main; - mc_stream_t * s; - mc_stream_peer_t * peer; + vlib_main_t *vm = mcm->vlib_main; + mc_stream_t *s; + mc_stream_peer_t *peer; i32 seq_cmp_result; - static int once=0; + static int once = 0; mc_byte_swap_msg_user_request (mp); s = mc_stream_by_index (mcm, mp->stream_index); /* Not signed up for this stream? Turf-o-matic */ - if (! s || s->state != MC_STREAM_STATE_ready) + if (!s || s->state != MC_STREAM_STATE_ready) { vlib_buffer_free_one (vm, buffer_index); return; } /* Find peer, including ourselves. */ - peer = get_or_create_peer_with_id (mcm, - s, mp->peer_id, + peer = get_or_create_peer_with_id (mcm, s, mp->peer_id, /* created */ 0); - seq_cmp_result = mc_seq_cmp (mp->local_sequence, + seq_cmp_result = mc_seq_cmp (mp->local_sequence, peer->last_sequence_received + 1); if (MC_EVENT_LOGGING > 0) { - ELOG_TYPE_DECLARE (e) = { - .format = "rx-msg: peer %s stream %d rx seq %d seq_cmp %d", - .format_args = "T4i4i4i4", - }; - struct { u32 peer, stream_index, rx_sequence; i32 seq_cmp_result; } * ed; + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (e) = + { + .format = "rx-msg: peer %s stream %d rx seq %d seq_cmp %d", + .format_args = "T4i4i4i4", + }; + /* *INDENT-ON* */ + struct + { + u32 peer, stream_index, rx_sequence; + i32 seq_cmp_result; + } *ed; ed = ELOG_DATA (mcm->elog_main, e); ed->peer = elog_id_for_peer_id (mcm, peer->id.as_u64); ed->stream_index = mp->stream_index; @@ -1031,11 +1135,11 @@ void mc_msg_user_request_handler (mc_main_t * mcm, mc_msg_user_request_t * mp, u ed->seq_cmp_result = seq_cmp_result; } - if (0 && mp->stream_index == 1 && once == 0) + if (0 && mp->stream_index == 1 && once == 0) { once = 1; ELOG_TYPE (e, "FAKE lost msg on stream 1"); - ELOG (mcm->elog_main,e,0); + ELOG (mcm->elog_main, e, 0); return; } @@ -1043,12 +1147,12 @@ void mc_msg_user_request_handler (mc_main_t * mcm, mc_msg_user_request_t * mp, u s->user_requests_received++; if (seq_cmp_result > 0) - peer->stats.n_msgs_from_future += 1; + peer->stats.n_msgs_from_future += 1; /* Send ack even if msg from future */ if (1) { - mc_msg_user_ack_t * rp; + mc_msg_user_ack_t *rp; u32 bi; rp = mc_get_vlib_buffer (vm, sizeof (rp[0]), &bi); @@ -1059,11 +1163,18 @@ void mc_msg_user_request_handler (mc_main_t * mcm, mc_msg_user_request_t * mp, u if (MC_EVENT_LOGGING > 0) { - ELOG_TYPE_DECLARE (e) = { - .format = "tx-ack: stream %d local seq %d", - .format_args = "i4i4", - }; - struct { u32 stream_index; u32 local_sequence; } * ed; + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (e) = + { + .format = "tx-ack: stream %d local seq %d", + .format_args = "i4i4", + }; + /* *INDENT-ON* */ + struct + { + u32 stream_index; + u32 local_sequence; + } *ed; ed = ELOG_DATA (mcm->elog_main, e); ed->stream_index = rp->stream_index; ed->local_sequence = rp->local_sequence; @@ -1073,21 +1184,21 @@ void mc_msg_user_request_handler (mc_main_t * mcm, mc_msg_user_request_t * mp, u mcm->transport.tx_ack (mcm->transport.opaque, mp->peer_id, bi); /* Msg from past? If so, free the buffer... */ - if (seq_cmp_result < 0) - { - vlib_buffer_free_one (vm, buffer_index); - peer->stats.n_msgs_from_past += 1; - } + if (seq_cmp_result < 0) + { + vlib_buffer_free_one (vm, buffer_index); + peer->stats.n_msgs_from_past += 1; + } } - + if (seq_cmp_result == 0) { - vlib_buffer_t * b = vlib_get_buffer (vm, buffer_index); + vlib_buffer_t *b = vlib_get_buffer (vm, buffer_index); switch (s->state) { case MC_STREAM_STATE_ready: vlib_buffer_advance (b, sizeof (mp[0])); - s->config.rx_buffer(mcm, s, mp->peer_id, buffer_index); + s->config.rx_buffer (mcm, s, mp->peer_id, buffer_index); /* Stream vector can change address via rx callback for mc-internal stream. */ @@ -1108,13 +1219,15 @@ void mc_msg_user_request_handler (mc_main_t * mcm, mc_msg_user_request_t * mp, u } } -void mc_msg_user_ack_handler (mc_main_t * mcm, mc_msg_user_ack_t * mp, u32 buffer_index) +void +mc_msg_user_ack_handler (mc_main_t * mcm, mc_msg_user_ack_t * mp, + u32 buffer_index) { - vlib_main_t * vm = mcm->vlib_main; + vlib_main_t *vm = mcm->vlib_main; uword *p; - mc_stream_t * s; - mc_stream_peer_t * peer; - mc_retry_t * r; + mc_stream_t *s; + mc_stream_peer_t *peer; + mc_retry_t *r; int peer_created = 0; mc_byte_swap_msg_user_ack (mp); @@ -1123,11 +1236,20 @@ void mc_msg_user_ack_handler (mc_main_t * mcm, mc_msg_user_ack_t * mp, u32 buffe if (MC_EVENT_LOGGING > 0) { - ELOG_TYPE_DECLARE (t) = { - .format = "rx-ack: local seq %d peer %s seq_cmp_result %d", - .format_args = "i4T4i4", - }; - struct { u32 local_sequence; u32 peer; i32 seq_cmp_result;} * ed; + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (t) = + { + .format = "rx-ack: local seq %d peer %s seq_cmp_result %d", + .format_args = "i4T4i4", + }; + /* *INDENT-ON* */ + + struct + { + u32 local_sequence; + u32 peer; + i32 seq_cmp_result; + } *ed; ed = ELOG_DATA (mcm->elog_main, t); ed->local_sequence = mp->local_sequence; ed->peer = elog_id_for_peer_id (mcm, mp->peer_id.as_u64); @@ -1135,35 +1257,35 @@ void mc_msg_user_ack_handler (mc_main_t * mcm, mc_msg_user_ack_t * mp, u32 buffe } /* Unknown stream? */ - if (! s) + if (!s) return; /* Find the peer which just ack'ed. */ peer = get_or_create_peer_with_id (mcm, s, mp->peer_id, /* created */ &peer_created); - /* + /* * Peer reports message from the future. If it's not in the retry - * fifo, look for a retired message. + * fifo, look for a retired message. */ if (mp->seq_cmp_result > 0) { - p = hash_get (s->retry_index_by_local_sequence, mp->local_sequence - - mp->seq_cmp_result); + p = hash_get (s->retry_index_by_local_sequence, mp->local_sequence - + mp->seq_cmp_result); if (p == 0) - mc_resend_retired (mcm, s, mp->local_sequence - mp->seq_cmp_result); + mc_resend_retired (mcm, s, mp->local_sequence - mp->seq_cmp_result); /* Normal retry should fix it... */ return; } - /* + /* * Pointer to the indicated retry fifo entry. * Worth hashing because we could use a window size of 100 or 1000. */ p = hash_get (s->retry_index_by_local_sequence, mp->local_sequence); - /* + /* * Is this a duplicate ACK, received after we've retired the * fifo entry. This can happen when learning about new * peers. @@ -1171,21 +1293,28 @@ void mc_msg_user_ack_handler (mc_main_t * mcm, mc_msg_user_ack_t * mp, u32 buffe if (p == 0) { if (MC_EVENT_LOGGING > 0) - { - ELOG_TYPE_DECLARE (t) = + { + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (t) = { .format = "ack: for seq %d from peer %s no fifo elt", .format_args = "i4T4", - }; - struct { u32 seq; u32 peer; } * ed; - ed = ELOG_DATA (mcm->elog_main, t); - ed->seq = mp->local_sequence; - ed->peer = elog_id_for_peer_id (mcm, mp->peer_id.as_u64); - } + }; + /* *INDENT-ON* */ + + struct + { + u32 seq; + u32 peer; + } *ed; + ed = ELOG_DATA (mcm->elog_main, t); + ed->seq = mp->local_sequence; + ed->peer = elog_id_for_peer_id (mcm, mp->peer_id.as_u64); + } return; } - + r = pool_elt_at_index (s->retry_pool, p[0]); /* Make sure that this new peer ACKs our msgs from now on */ @@ -1203,61 +1332,79 @@ void mc_msg_user_ack_handler (mc_main_t * mcm, mc_msg_user_ack_t * mp, u32 buffe } ASSERT (mp->local_sequence == r->local_sequence); - + /* If we weren't expecting to hear from this peer */ - if (!peer_created && - ! clib_bitmap_get (r->unacked_by_peer_bitmap, peer - s->peers)) + if (!peer_created && + !clib_bitmap_get (r->unacked_by_peer_bitmap, peer - s->peers)) { if (MC_EVENT_LOGGING > 0) - { - ELOG_TYPE_DECLARE (t) = + { + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (t) = { .format = "dup-ack: for seq %d from peer %s", .format_args = "i4T4", - }; - struct { u32 seq; u32 peer; } * ed; - ed = ELOG_DATA (mcm->elog_main, t); - ed->seq = r->local_sequence; - ed->peer = elog_id_for_peer_id (mcm, peer->id.as_u64); - } - if (! clib_bitmap_is_zero (r->unacked_by_peer_bitmap)) + }; + /* *INDENT-ON* */ + struct + { + u32 seq; + u32 peer; + } *ed; + ed = ELOG_DATA (mcm->elog_main, t); + ed->seq = r->local_sequence; + ed->peer = elog_id_for_peer_id (mcm, peer->id.as_u64); + } + if (!clib_bitmap_is_zero (r->unacked_by_peer_bitmap)) return; } if (MC_EVENT_LOGGING > 0) { - ELOG_TYPE_DECLARE (t) = + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (t) = { .format = "ack: for seq %d from peer %s", .format_args = "i4T4", }; - struct { u32 seq; u32 peer; } * ed; + /* *INDENT-ON* */ + struct + { + u32 seq; + u32 peer; + } *ed; ed = ELOG_DATA (mcm->elog_main, t); ed->seq = mp->local_sequence; ed->peer = elog_id_for_peer_id (mcm, peer->id.as_u64); } - r->unacked_by_peer_bitmap = + r->unacked_by_peer_bitmap = clib_bitmap_andnoti (r->unacked_by_peer_bitmap, peer - s->peers); - + /* Not all clients have ack'ed */ - if (! clib_bitmap_is_zero (r->unacked_by_peer_bitmap)) + if (!clib_bitmap_is_zero (r->unacked_by_peer_bitmap)) { return; } if (MC_EVENT_LOGGING > 0) { - ELOG_TYPE_DECLARE (t) = + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (t) = { .format = "ack: retire fifo elt loc seq %d after %d acks", .format_args = "i4i4", }; - struct { u32 seq; u32 npeers; } * ed; + /* *INDENT-ON* */ + struct + { + u32 seq; + u32 npeers; + } *ed; ed = ELOG_DATA (mcm->elog_main, t); ed->seq = r->local_sequence; ed->npeers = pool_elts (s->peers); } - + hash_unset (s->retry_index_by_local_sequence, mp->local_sequence); mc_retry_free (mcm, s, r); remove_retry_from_pool (s, r); @@ -1268,25 +1415,24 @@ void mc_msg_user_ack_handler (mc_main_t * mcm, mc_msg_user_ack_t * mp, u32 buffe static uword mc_catchup_process (vlib_main_t * vm, - vlib_node_runtime_t * node, - vlib_frame_t * f) + vlib_node_runtime_t * node, vlib_frame_t * f) { - mc_main_t * mcm = mc_node_get_main (node); + mc_main_t *mcm = mc_node_get_main (node); uword *event_data = 0; - mc_catchup_process_arg_t * args; + mc_catchup_process_arg_t *args; int i; - + while (1) { if (event_data) - _vec_len(event_data) = 0; - vlib_process_wait_for_event_with_type (vm, &event_data, EVENT_MC_SEND_CATCHUP_DATA); + _vec_len (event_data) = 0; + vlib_process_wait_for_event_with_type (vm, &event_data, + EVENT_MC_SEND_CATCHUP_DATA); - for (i = 0; i < vec_len(event_data); i++) + for (i = 0; i < vec_len (event_data); i++) { - args = pool_elt_at_index (mcm->catchup_process_args, - event_data[i]); - + args = pool_elt_at_index (mcm->catchup_process_args, event_data[i]); + mcm->transport.catchup_send_fun (mcm->transport.opaque, args->catchup_opaque, args->catchup_snapshot); @@ -1296,40 +1442,46 @@ mc_catchup_process (vlib_main_t * vm, } } - return 0; /* not likely */ + return 0; /* not likely */ } -static void serialize_mc_stream (serialize_main_t * m, va_list * va) +static void +serialize_mc_stream (serialize_main_t * m, va_list * va) { - mc_stream_t * s = va_arg (*va, mc_stream_t *); - mc_stream_peer_t * p; + mc_stream_t *s = va_arg (*va, mc_stream_t *); + mc_stream_peer_t *p; serialize_integer (m, pool_elts (s->peers), sizeof (u32)); + /* *INDENT-OFF* */ pool_foreach (p, s->peers, ({ u8 * x = serialize_get (m, sizeof (p->id)); clib_memcpy (x, p->id.as_u8, sizeof (p->id)); - serialize_integer (m, p->last_sequence_received, + serialize_integer (m, p->last_sequence_received, sizeof (p->last_sequence_received)); })); +/* *INDENT-ON* */ serialize_bitmap (m, s->all_peer_bitmap); } -void unserialize_mc_stream (serialize_main_t * m, va_list * va) +void +unserialize_mc_stream (serialize_main_t * m, va_list * va) { - mc_stream_t * s = va_arg (*va, mc_stream_t *); + mc_stream_t *s = va_arg (*va, mc_stream_t *); u32 i, n_peers; - mc_stream_peer_t * p; + mc_stream_peer_t *p; unserialize_integer (m, &n_peers, sizeof (u32)); mhash_init (&s->peer_index_by_id, sizeof (uword), sizeof (mc_peer_id_t)); for (i = 0; i < n_peers; i++) { - u8 * x; + u8 *x; pool_get (s->peers, p); x = unserialize_get (m, sizeof (p->id)); clib_memcpy (p->id.as_u8, x, sizeof (p->id)); - unserialize_integer (m, &p->last_sequence_received, sizeof (p->last_sequence_received)); - mhash_set (&s->peer_index_by_id, &p->id, p - s->peers, /* old_value */ 0); + unserialize_integer (m, &p->last_sequence_received, + sizeof (p->last_sequence_received)); + mhash_set (&s->peer_index_by_id, &p->id, p - s->peers, /* old_value */ + 0); } s->all_peer_bitmap = unserialize_bitmap (m); @@ -1338,38 +1490,46 @@ void unserialize_mc_stream (serialize_main_t * m, va_list * va) clib_warning ("BUG: stream %s all_peer_bitmap NULL", s->config.name); } -void mc_msg_catchup_request_handler (mc_main_t * mcm, mc_msg_catchup_request_t * req, u32 catchup_opaque) +void +mc_msg_catchup_request_handler (mc_main_t * mcm, + mc_msg_catchup_request_t * req, + u32 catchup_opaque) { - vlib_main_t * vm = mcm->vlib_main; - mc_stream_t * s; - mc_catchup_process_arg_t * args; + vlib_main_t *vm = mcm->vlib_main; + mc_stream_t *s; + mc_catchup_process_arg_t *args; mc_byte_swap_msg_catchup_request (req); s = mc_stream_by_index (mcm, req->stream_index); - if (! s || s->state != MC_STREAM_STATE_ready) + if (!s || s->state != MC_STREAM_STATE_ready) return; - + if (MC_EVENT_LOGGING > 0) { - ELOG_TYPE_DECLARE (t) = - { - .format = "catchup-request: from %s stream %d", - .format_args = "T4i4", - }; - struct { u32 peer, stream; } * ed; + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (t) = + { + .format = "catchup-request: from %s stream %d", + .format_args = "T4i4", + }; + /* *INDENT-ON* */ + struct + { + u32 peer, stream; + } *ed; ed = ELOG_DATA (mcm->elog_main, t); ed->peer = elog_id_for_peer_id (mcm, req->peer_id.as_u64); ed->stream = req->stream_index; } - /* - * The application has to snapshoot its data structures right - * here, right now. If we process any messages after - * noting the last global sequence we've processed, the client + /* + * The application has to snapshoot its data structures right + * here, right now. If we process any messages after + * noting the last global sequence we've processed, the client * won't be able to accurately reconstruct our data structures. * - * Once the data structures are e.g. vec_dup()'ed, we + * Once the data structures are e.g. vec_dup()'ed, we * send the resulting messages from a separate process, to * make sure that we don't cause a bunch of message retransmissions */ @@ -1382,7 +1542,7 @@ void mc_msg_catchup_request_handler (mc_main_t * mcm, mc_msg_catchup_request_t * /* Construct catchup reply and snapshot state for stream to send as catchup reply payload. */ { - mc_msg_catchup_reply_t * rep; + mc_msg_catchup_reply_t *rep; serialize_main_t m; vec_resize (args->catchup_snapshot, sizeof (rep[0])); @@ -1403,9 +1563,7 @@ void mc_msg_catchup_request_handler (mc_main_t * mcm, mc_msg_catchup_request_t * /* Actually copy internal state */ args->catchup_snapshot = s->config.catchup_snapshot - (mcm, - args->catchup_snapshot, - rep->last_global_sequence_included); + (mcm, args->catchup_snapshot, rep->last_global_sequence_included); rep = (void *) args->catchup_snapshot; rep->n_data_bytes = vec_len (args->catchup_snapshot) - sizeof (rep[0]); @@ -1415,14 +1573,16 @@ void mc_msg_catchup_request_handler (mc_main_t * mcm, mc_msg_catchup_request_t * /* now go send it... */ vlib_process_signal_event (vm, mcm->catchup_process, - EVENT_MC_SEND_CATCHUP_DATA, - args - mcm->catchup_process_args); + EVENT_MC_SEND_CATCHUP_DATA, + args - mcm->catchup_process_args); } #define EVENT_MC_UNSERIALIZE_BUFFER 0 #define EVENT_MC_UNSERIALIZE_CATCHUP 1 -void mc_msg_catchup_reply_handler (mc_main_t * mcm, mc_msg_catchup_reply_t * mp, u32 catchup_opaque) +void +mc_msg_catchup_reply_handler (mc_main_t * mcm, mc_msg_catchup_reply_t * mp, + u32 catchup_opaque) { vlib_process_signal_event (mcm->vlib_main, mcm->unserialize_process, @@ -1430,36 +1590,40 @@ void mc_msg_catchup_reply_handler (mc_main_t * mcm, mc_msg_catchup_reply_t * mp, pointer_to_uword (mp)); } -static void perform_catchup (mc_main_t * mcm, mc_msg_catchup_reply_t * mp) +static void +perform_catchup (mc_main_t * mcm, mc_msg_catchup_reply_t * mp) { - mc_stream_t * s; + mc_stream_t *s; i32 seq_cmp_result; - + mc_byte_swap_msg_catchup_reply (mp); s = mc_stream_by_index (mcm, mp->stream_index); /* Never heard of this stream or already caught up. */ - if (! s || s->state == MC_STREAM_STATE_ready) + if (!s || s->state == MC_STREAM_STATE_ready) return; - + { serialize_main_t m; - mc_stream_peer_t * p; + mc_stream_peer_t *p; u32 n_stream_bytes; /* For offline sim replay: save the entire catchup snapshot... */ if (s->config.save_snapshot) - s->config.save_snapshot (mcm, /* is_catchup */ 1, mp->data, mp->n_data_bytes); + s->config.save_snapshot (mcm, /* is_catchup */ 1, mp->data, + mp->n_data_bytes); unserialize_open_data (&m, mp->data, mp->n_data_bytes); unserialize (&m, unserialize_mc_stream, s); /* Make sure we start numbering our messages as expected */ + /* *INDENT-OFF* */ pool_foreach (p, s->peers, ({ if (p->id.as_u64 == mcm->transport.our_ack_peer_id.as_u64) s->our_local_sequence = p->last_sequence_received + 1; })); +/* *INDENT-ON* */ n_stream_bytes = m.stream.current_buffer_index; @@ -1467,7 +1631,7 @@ static void perform_catchup (mc_main_t * mcm, mc_msg_catchup_reply_t * mp) /* After serialized stream is user's catchup data. */ s->config.catchup (mcm, mp->data + n_stream_bytes, - mp->n_data_bytes - n_stream_bytes); + mp->n_data_bytes - n_stream_bytes); } /* Vector could have been moved by catchup. @@ -1478,12 +1642,12 @@ static void perform_catchup (mc_main_t * mcm, mc_msg_catchup_reply_t * mp) while (clib_fifo_elts (s->catchup_fifo)) { - mc_msg_user_request_t * gp; + mc_msg_user_request_t *gp; u32 bi; - vlib_buffer_t * b; + vlib_buffer_t *b; + + clib_fifo_sub1 (s->catchup_fifo, bi); - clib_fifo_sub1(s->catchup_fifo, bi); - b = vlib_get_buffer (mcm->vlib_main, bi); gp = vlib_buffer_get_current (b); @@ -1499,11 +1663,17 @@ static void perform_catchup (mc_main_t * mcm, mc_msg_catchup_reply_t * mp) if (MC_EVENT_LOGGING) { - ELOG_TYPE_DECLARE (t) = { - .format = "catchup replay local sequence 0x%x", - .format_args = "i4", - }; - struct { u32 local_sequence; } * ed; + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (t) = + { + .format = "catchup replay local sequence 0x%x", + .format_args = "i4", + }; + /* *INDENT-ON* */ + struct + { + u32 local_sequence; + } *ed; ed = ELOG_DATA (mcm->elog_main, t); ed->local_sequence = gp->local_sequence; } @@ -1512,11 +1682,17 @@ static void perform_catchup (mc_main_t * mcm, mc_msg_catchup_reply_t * mp) { if (MC_EVENT_LOGGING) { - ELOG_TYPE_DECLARE (t) = { - .format = "catchup discard local sequence 0x%x", - .format_args = "i4", - }; - struct { u32 local_sequence; } * ed; + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (t) = + { + .format = "catchup discard local sequence 0x%x", + .format_args = "i4", + }; + /* *INDENT-ON* */ + struct + { + u32 local_sequence; + } *ed; ed = ELOG_DATA (mcm->elog_main, t); ed->local_sequence = gp->local_sequence; } @@ -1529,7 +1705,7 @@ static void perform_catchup (mc_main_t * mcm, mc_msg_catchup_reply_t * mp) /* Now that we are caught up wake up joining process. */ { - vlib_one_time_waiting_process_t * wp; + vlib_one_time_waiting_process_t *wp; vec_foreach (wp, s->procs_waiting_for_join_done) vlib_signal_one_time_waiting_process (mcm->vlib_main, wp); if (s->procs_waiting_for_join_done) @@ -1537,20 +1713,21 @@ static void perform_catchup (mc_main_t * mcm, mc_msg_catchup_reply_t * mp) } } -static void this_node_maybe_master (mc_main_t * mcm) +static void +this_node_maybe_master (mc_main_t * mcm) { - vlib_main_t * vm = mcm->vlib_main; - mc_msg_master_assert_t * mp; + vlib_main_t *vm = mcm->vlib_main; + mc_msg_master_assert_t *mp; uword event_type; int timeouts = 0; int is_master = mcm->relay_state == MC_RELAY_STATE_MASTER; - clib_error_t * error; + clib_error_t *error; f64 now, time_last_master_assert = -1; u32 bi; while (1) { - if (! mcm->we_can_be_relay_master) + if (!mcm->we_can_be_relay_master) { mcm->relay_state = MC_RELAY_STATE_SLAVE; if (MC_EVENT_LOGGING) @@ -1570,25 +1747,33 @@ static void this_node_maybe_master (mc_main_t * mcm) mp->peer_id = mcm->transport.our_ack_peer_id; mp->global_sequence = mcm->relay_global_sequence; - /* - * these messages clog the event log, set MC_EVENT_LOGGING higher - * if you want them - */ + /* + * these messages clog the event log, set MC_EVENT_LOGGING higher + * if you want them + */ if (MC_EVENT_LOGGING > 1) { - ELOG_TYPE_DECLARE (e) = { - .format = "tx-massert: peer %s global seq %u", - .format_args = "T4i4", - }; - struct { u32 peer, global_sequence; } * ed; + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (e) = + { + .format = "tx-massert: peer %s global seq %u", + .format_args = "T4i4", + }; + /* *INDENT-ON* */ + struct + { + u32 peer, global_sequence; + } *ed; ed = ELOG_DATA (mcm->elog_main, e); ed->peer = elog_id_for_peer_id (mcm, mp->peer_id.as_u64); ed->global_sequence = mp->global_sequence; } - mc_byte_swap_msg_master_assert (mp); + mc_byte_swap_msg_master_assert (mp); - error = mcm->transport.tx_buffer (mcm->transport.opaque, MC_TRANSPORT_MASTERSHIP, bi); + error = + mcm->transport.tx_buffer (mcm->transport.opaque, + MC_TRANSPORT_MASTERSHIP, bi); if (error) clib_error_report (error); } @@ -1599,10 +1784,11 @@ static void this_node_maybe_master (mc_main_t * mcm) switch (event_type) { case ~0: - if (! is_master && timeouts++ > 2) + if (!is_master && timeouts++ > 2) { mcm->relay_state = MC_RELAY_STATE_MASTER; - mcm->relay_master_peer_id = mcm->transport.our_ack_peer_id.as_u64; + mcm->relay_master_peer_id = + mcm->transport.our_ack_peer_id.as_u64; if (MC_EVENT_LOGGING) { ELOG_TYPE (e, "become master (was maybe_master)"); @@ -1611,7 +1797,7 @@ static void this_node_maybe_master (mc_main_t * mcm) return; } break; - + case MC_RELAY_STATE_SLAVE: mcm->relay_state = MC_RELAY_STATE_SLAVE; if (MC_EVENT_LOGGING && mcm->relay_state != MC_RELAY_STATE_SLAVE) @@ -1624,9 +1810,10 @@ static void this_node_maybe_master (mc_main_t * mcm) } } -static void this_node_slave (mc_main_t * mcm) +static void +this_node_slave (mc_main_t * mcm) { - vlib_main_t * vm = mcm->vlib_main; + vlib_main_t *vm = mcm->vlib_main; uword event_type; int timeouts = 0; @@ -1667,18 +1854,17 @@ static void this_node_slave (mc_main_t * mcm) static uword mc_mastership_process (vlib_main_t * vm, - vlib_node_runtime_t * node, - vlib_frame_t * f) + vlib_node_runtime_t * node, vlib_frame_t * f) { - mc_main_t * mcm = mc_node_get_main (node); - + mc_main_t *mcm = mc_node_get_main (node); + while (1) { switch (mcm->relay_state) { case MC_RELAY_STATE_NEGOTIATE: case MC_RELAY_STATE_MASTER: - this_node_maybe_master(mcm); + this_node_maybe_master (mcm); break; case MC_RELAY_STATE_SLAVE: @@ -1686,21 +1872,24 @@ mc_mastership_process (vlib_main_t * vm, break; } } - return 0; /* not likely */ + return 0; /* not likely */ } -void mc_enable_disable_mastership (mc_main_t * mcm, int we_can_be_master) +void +mc_enable_disable_mastership (mc_main_t * mcm, int we_can_be_master) { if (we_can_be_master != mcm->we_can_be_relay_master) { mcm->we_can_be_relay_master = we_can_be_master; - vlib_process_signal_event (mcm->vlib_main, + vlib_process_signal_event (mcm->vlib_main, mcm->mastership_process, MC_RELAY_STATE_NEGOTIATE, 0); } } -void mc_msg_master_assert_handler (mc_main_t * mcm, mc_msg_master_assert_t * mp, u32 buffer_index) +void +mc_msg_master_assert_handler (mc_main_t * mcm, mc_msg_master_assert_t * mp, + u32 buffer_index) { mc_peer_id_t his_peer_id, our_peer_id; i32 seq_cmp_result; @@ -1718,9 +1907,10 @@ void mc_msg_master_assert_handler (mc_main_t * mcm, mc_msg_master_assert_t * mp, /* If the sender has a lower peer id and the sender's sequence >= our global sequence, we become a slave. Otherwise we are master. */ - if (mc_peer_id_compare (his_peer_id, our_peer_id) < 0 && seq_cmp_result >= 0) + if (mc_peer_id_compare (his_peer_id, our_peer_id) < 0 + && seq_cmp_result >= 0) { - vlib_process_signal_event (mcm->vlib_main, + vlib_process_signal_event (mcm->vlib_main, mcm->mastership_process, MC_RELAY_STATE_SLAVE, 0); signal_slave = 1; @@ -1734,8 +1924,8 @@ void mc_msg_master_assert_handler (mc_main_t * mcm, mc_msg_master_assert_t * mp, } { - uword * q = mhash_get (&mcm->mastership_peer_index_by_id, &his_peer_id); - mc_mastership_peer_t * p; + uword *q = mhash_get (&mcm->mastership_peer_index_by_id, &his_peer_id); + mc_mastership_peer_t *p; if (q) p = vec_elt_at_index (mcm->mastership_peers, q[0]); @@ -1743,28 +1933,34 @@ void mc_msg_master_assert_handler (mc_main_t * mcm, mc_msg_master_assert_t * mp, { vec_add2 (mcm->mastership_peers, p, 1); p->peer_id = his_peer_id; - mhash_set (&mcm->mastership_peer_index_by_id, &p->peer_id, p - mcm->mastership_peers, + mhash_set (&mcm->mastership_peer_index_by_id, &p->peer_id, + p - mcm->mastership_peers, /* old_value */ 0); } p->time_last_master_assert_received = vlib_time_now (mcm->vlib_main); } - /* + /* * these messages clog the event log, set MC_EVENT_LOGGING higher * if you want them. */ if (MC_EVENT_LOGGING > 1) { - ELOG_TYPE_DECLARE (e) = { - .format = "rx-massert: peer %s global seq %u upd %d slave %d", - .format_args = "T4i4i1i1", - }; - struct { + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (e) = + { + .format = "rx-massert: peer %s global seq %u upd %d slave %d", + .format_args = "T4i4i1i1", + }; + /* *INDENT-ON* */ + + struct + { u32 peer; - u32 global_sequence; + u32 global_sequence; u8 update_sequence; u8 slave; - } * ed; + } *ed; ed = ELOG_DATA (mcm->elog_main, e); ed->peer = elog_id_for_peer_id (mcm, his_peer_id.as_u64); ed->global_sequence = mp->global_sequence; @@ -1776,20 +1972,18 @@ void mc_msg_master_assert_handler (mc_main_t * mcm, mc_msg_master_assert_t * mp, static void mc_serialize_init (mc_main_t * mcm) { - mc_serialize_msg_t * m; - vlib_main_t * vm = vlib_get_main(); + mc_serialize_msg_t *m; + vlib_main_t *vm = vlib_get_main (); mcm->global_msg_index_by_name - = hash_create_string (/* elts */ 0, sizeof (uword)); + = hash_create_string ( /* elts */ 0, sizeof (uword)); m = vm->mc_msg_registrations; - + while (m) { m->global_index = vec_len (mcm->global_msgs); - hash_set_mem (mcm->global_msg_index_by_name, - m->name, - m->global_index); + hash_set_mem (mcm->global_msg_index_by_name, m->name, m->global_index); vec_add1 (mcm->global_msgs, m); m = m->next_registration; } @@ -1797,19 +1991,18 @@ mc_serialize_init (mc_main_t * mcm) clib_error_t * mc_serialize_va (mc_main_t * mc, - u32 stream_index, + u32 stream_index, u32 multiple_messages_per_vlib_buffer, - mc_serialize_msg_t * msg, - va_list * va) + mc_serialize_msg_t * msg, va_list * va) { - mc_stream_t * s; - clib_error_t * error; - serialize_main_t * m = &mc->serialize_mains[VLIB_TX]; - vlib_serialize_buffer_main_t * sbm = &mc->serialize_buffer_mains[VLIB_TX]; + mc_stream_t *s; + clib_error_t *error; + serialize_main_t *m = &mc->serialize_mains[VLIB_TX]; + vlib_serialize_buffer_main_t *sbm = &mc->serialize_buffer_mains[VLIB_TX]; u32 bi, n_before, n_after, n_total, n_this_msg; u32 si, gi; - if (! sbm->vlib_main) + if (!sbm->vlib_main) { sbm->tx.max_n_data_bytes_per_chain = 4096; sbm->tx.free_list_index = VLIB_BUFFER_DEFAULT_FREE_LIST_INDEX; @@ -1831,16 +2024,22 @@ mc_serialize_va (mc_main_t * mc, serialize_likely_small_unsigned_integer (m, si); /* For first time message is sent, use name to identify message. */ - if (si == ~0 || MSG_ID_DEBUG) + if (si == ~0 || MSG_ID_DEBUG) serialize_cstring (m, msg->name); if (MSG_ID_DEBUG && MC_EVENT_LOGGING > 0) { - ELOG_TYPE_DECLARE (e) = { - .format = "serialize-msg: %s index %d", - .format_args = "T4i4", - }; - struct { u32 c[2]; } * ed; + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (e) = + { + .format = "serialize-msg: %s index %d", + .format_args = "T4i4", + }; + /* *INDENT-ON* */ + struct + { + u32 c[2]; + } *ed; ed = ELOG_DATA (mc->elog_main, e); ed->c[0] = elog_id_for_msg_name (mc, msg->name); ed->c[1] = si; @@ -1854,15 +2053,17 @@ mc_serialize_va (mc_main_t * mc, /* For max message size ignore first message where string name is sent. */ if (si != ~0) - msg->max_n_bytes_serialized = clib_max (msg->max_n_bytes_serialized, n_this_msg); + msg->max_n_bytes_serialized = + clib_max (msg->max_n_bytes_serialized, n_this_msg); - if (! multiple_messages_per_vlib_buffer + if (!multiple_messages_per_vlib_buffer || si == ~0 - || n_total + msg->max_n_bytes_serialized > mc->transport.max_packet_size) + || n_total + msg->max_n_bytes_serialized > + mc->transport.max_packet_size) { bi = serialize_close_vlib_buffer (m); sbm->first_buffer = 0; - if (! error) + if (!error) mc_stream_send (mc, stream_index, bi); else if (bi != ~0) vlib_buffer_free_one (mc->vlib_main, bi); @@ -1875,12 +2076,11 @@ clib_error_t * mc_serialize_internal (mc_main_t * mc, u32 stream_index, u32 multiple_messages_per_vlib_buffer, - mc_serialize_msg_t * msg, - ...) + mc_serialize_msg_t * msg, ...) { - vlib_main_t * vm = mc->vlib_main; + vlib_main_t *vm = mc->vlib_main; va_list va; - clib_error_t * error; + clib_error_t *error; if (stream_index == ~0) { @@ -1892,125 +2092,146 @@ mc_serialize_internal (mc_main_t * mc, va_start (va, msg); error = mc_serialize_va (mc, stream_index, - multiple_messages_per_vlib_buffer, - msg, &va); + multiple_messages_per_vlib_buffer, msg, &va); va_end (va); return error; } -uword mc_unserialize_message (mc_main_t * mcm, - mc_stream_t * s, - serialize_main_t * m) +uword +mc_unserialize_message (mc_main_t * mcm, + mc_stream_t * s, serialize_main_t * m) { - mc_serialize_stream_msg_t * sm; + mc_serialize_stream_msg_t *sm; u32 gi, si; si = unserialize_likely_small_unsigned_integer (m); - if (! (si == ~0 || MSG_ID_DEBUG)) + if (!(si == ~0 || MSG_ID_DEBUG)) { sm = vec_elt_at_index (s->stream_msgs, si); gi = sm->global_index; } else { - char * name; + char *name; unserialize_cstring (m, &name); if (MSG_ID_DEBUG && MC_EVENT_LOGGING > 0) - { - ELOG_TYPE_DECLARE (e) = { - .format = "unserialize-msg: %s rx index %d", - .format_args = "T4i4", - }; - struct { u32 c[2]; } * ed; - ed = ELOG_DATA (mcm->elog_main, e); - ed->c[0] = elog_id_for_msg_name (mcm, name); - ed->c[1] = si; - } + { + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (e) = + { + .format = "unserialize-msg: %s rx index %d", + .format_args = "T4i4", + }; + /* *INDENT-ON* */ + struct + { + u32 c[2]; + } *ed; + ed = ELOG_DATA (mcm->elog_main, e); + ed->c[0] = elog_id_for_msg_name (mcm, name); + ed->c[1] = si; + } { - uword * p = hash_get_mem (mcm->global_msg_index_by_name, name); - gi = p ? p[0] : ~0; + uword *p = hash_get_mem (mcm->global_msg_index_by_name, name); + gi = p ? p[0] : ~0; } /* Unknown message? */ if (gi == ~0) - { - vec_free (name); - goto done; - } + { + vec_free (name); + goto done; + } vec_validate_init_empty (s->stream_msg_index_by_global_index, gi, ~0); si = s->stream_msg_index_by_global_index[gi]; /* Stream local index unknown? Create it. */ if (si == ~0) - { - vec_add2 (s->stream_msgs, sm, 1); + { + vec_add2 (s->stream_msgs, sm, 1); - si = sm - s->stream_msgs; - sm->global_index = gi; - s->stream_msg_index_by_global_index[gi] = si; + si = sm - s->stream_msgs; + sm->global_index = gi; + s->stream_msg_index_by_global_index[gi] = si; - if (MC_EVENT_LOGGING > 0) - { - ELOG_TYPE_DECLARE (e) = { - .format = "msg-bind: stream %d %s to index %d", - .format_args = "i4T4i4", - }; - struct { u32 c[3]; } * ed; - ed = ELOG_DATA (mcm->elog_main, e); - ed->c[0] = s->index; - ed->c[1] = elog_id_for_msg_name (mcm, name); - ed->c[2] = si; - } - } + if (MC_EVENT_LOGGING > 0) + { + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (e) = + { + .format = "msg-bind: stream %d %s to index %d", + .format_args = "i4T4i4", + }; + /* *INDENT-ON* */ + struct + { + u32 c[3]; + } *ed; + ed = ELOG_DATA (mcm->elog_main, e); + ed->c[0] = s->index; + ed->c[1] = elog_id_for_msg_name (mcm, name); + ed->c[2] = si; + } + } else - { - sm = vec_elt_at_index (s->stream_msgs, si); - if (gi != sm->global_index && MC_EVENT_LOGGING > 0) - { - ELOG_TYPE_DECLARE (e) = { - .format = "msg-id-ERROR: %s index %d expected %d", - .format_args = "T4i4i4", - }; - struct { u32 c[3]; } * ed; - ed = ELOG_DATA (mcm->elog_main, e); - ed->c[0] = elog_id_for_msg_name (mcm, name); - ed->c[1] = si; - ed->c[2] = ~0; - if (sm->global_index < vec_len (s->stream_msg_index_by_global_index)) - ed->c[2] = s->stream_msg_index_by_global_index[sm->global_index]; - } - } + { + sm = vec_elt_at_index (s->stream_msgs, si); + if (gi != sm->global_index && MC_EVENT_LOGGING > 0) + { + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (e) = + { + .format = "msg-id-ERROR: %s index %d expected %d", + .format_args = "T4i4i4", + }; + /* *INDENT-ON* */ + struct + { + u32 c[3]; + } *ed; + ed = ELOG_DATA (mcm->elog_main, e); + ed->c[0] = elog_id_for_msg_name (mcm, name); + ed->c[1] = si; + ed->c[2] = ~0; + if (sm->global_index < + vec_len (s->stream_msg_index_by_global_index)) + ed->c[2] = + s->stream_msg_index_by_global_index[sm->global_index]; + } + } vec_free (name); } if (gi != ~0) { - mc_serialize_msg_t * msg; + mc_serialize_msg_t *msg; msg = vec_elt (mcm->global_msgs, gi); unserialize (m, msg->unserialize, mcm); } - done: +done: return gi != ~0; } void mc_unserialize_internal (mc_main_t * mcm, u32 stream_and_buffer_index) { - vlib_main_t * vm = mcm->vlib_main; - serialize_main_t * m = &mcm->serialize_mains[VLIB_RX]; - vlib_serialize_buffer_main_t * sbm = &mcm->serialize_buffer_mains[VLIB_RX]; - mc_stream_and_buffer_t * sb; - mc_stream_t * stream; + vlib_main_t *vm = mcm->vlib_main; + serialize_main_t *m = &mcm->serialize_mains[VLIB_RX]; + vlib_serialize_buffer_main_t *sbm = &mcm->serialize_buffer_mains[VLIB_RX]; + mc_stream_and_buffer_t *sb; + mc_stream_t *stream; u32 buffer_index; - sb = pool_elt_at_index (mcm->mc_unserialize_stream_and_buffers, stream_and_buffer_index); + sb = + pool_elt_at_index (mcm->mc_unserialize_stream_and_buffers, + stream_and_buffer_index); buffer_index = sb->buffer_index; stream = vec_elt_at_index (mcm->stream_vector, sb->stream_index); pool_put (mcm->mc_unserialize_stream_and_buffers, sb); @@ -2018,11 +2239,12 @@ mc_unserialize_internal (mc_main_t * mcm, u32 stream_and_buffer_index) if (stream->config.save_snapshot) { u32 n_bytes = vlib_buffer_index_length_in_chain (vm, buffer_index); - static u8 * contents; + static u8 *contents; vec_reset_length (contents); vec_validate (contents, n_bytes - 1); vlib_buffer_contents (vm, buffer_index, contents); - stream->config.save_snapshot (mcm, /* is_catchup */ 0, contents, n_bytes); + stream->config.save_snapshot (mcm, /* is_catchup */ 0, contents, + n_bytes); } ASSERT (vlib_in_process_context (vm)); @@ -2041,28 +2263,28 @@ mc_unserialize_internal (mc_main_t * mcm, u32 stream_and_buffer_index) void mc_unserialize (mc_main_t * mcm, mc_stream_t * s, u32 buffer_index) { - vlib_main_t * vm = mcm->vlib_main; - mc_stream_and_buffer_t * sb; + vlib_main_t *vm = mcm->vlib_main; + mc_stream_and_buffer_t *sb; pool_get (mcm->mc_unserialize_stream_and_buffers, sb); sb->stream_index = s->index; sb->buffer_index = buffer_index; - vlib_process_signal_event (vm, mcm->unserialize_process, - EVENT_MC_UNSERIALIZE_BUFFER, sb - mcm->mc_unserialize_stream_and_buffers); + vlib_process_signal_event (vm, mcm->unserialize_process, + EVENT_MC_UNSERIALIZE_BUFFER, + sb - mcm->mc_unserialize_stream_and_buffers); } static uword mc_unserialize_process (vlib_main_t * vm, - vlib_node_runtime_t * node, - vlib_frame_t * f) + vlib_node_runtime_t * node, vlib_frame_t * f) { - mc_main_t * mcm = mc_node_get_main (node); - uword event_type, * event_data = 0; + mc_main_t *mcm = mc_node_get_main (node); + uword event_type, *event_data = 0; int i; - + while (1) { if (event_data) - _vec_len(event_data) = 0; + _vec_len (event_data) = 0; vlib_process_wait_for_event (vm); event_type = vlib_process_get_events (vm, &event_data); @@ -2076,7 +2298,7 @@ mc_unserialize_process (vlib_main_t * vm, case EVENT_MC_UNSERIALIZE_CATCHUP: for (i = 0; i < vec_len (event_data); i++) { - u8 * mp = uword_to_pointer (event_data[i], u8 *); + u8 *mp = uword_to_pointer (event_data[i], u8 *); perform_catchup (mcm, (void *) mp); vec_free (mp); } @@ -2087,57 +2309,58 @@ mc_unserialize_process (vlib_main_t * vm, } } - return 0; /* not likely */ + return 0; /* not likely */ } -void serialize_mc_main (serialize_main_t * m, va_list * va) +void +serialize_mc_main (serialize_main_t * m, va_list * va) { - mc_main_t * mcm = va_arg (*va, mc_main_t *); - mc_stream_t * s; - mc_serialize_stream_msg_t * sm; - mc_serialize_msg_t * msg; + mc_main_t *mcm = va_arg (*va, mc_main_t *); + mc_stream_t *s; + mc_serialize_stream_msg_t *sm; + mc_serialize_msg_t *msg; serialize_integer (m, vec_len (mcm->stream_vector), sizeof (u32)); vec_foreach (s, mcm->stream_vector) - { - /* Stream name. */ - serialize_cstring (m, s->config.name); + { + /* Stream name. */ + serialize_cstring (m, s->config.name); - /* Serialize global names for all sent messages. */ - serialize_integer (m, vec_len (s->stream_msgs), sizeof (u32)); - vec_foreach (sm, s->stream_msgs) - { - msg = vec_elt (mcm->global_msgs, sm->global_index); - serialize_cstring (m, msg->name); - } + /* Serialize global names for all sent messages. */ + serialize_integer (m, vec_len (s->stream_msgs), sizeof (u32)); + vec_foreach (sm, s->stream_msgs) + { + msg = vec_elt (mcm->global_msgs, sm->global_index); + serialize_cstring (m, msg->name); } + } } -void unserialize_mc_main (serialize_main_t * m, va_list * va) +void +unserialize_mc_main (serialize_main_t * m, va_list * va) { - mc_main_t * mcm = va_arg (*va, mc_main_t *); + mc_main_t *mcm = va_arg (*va, mc_main_t *); u32 i, n_streams, n_stream_msgs; - char * name; - mc_stream_t * s; - mc_serialize_stream_msg_t * sm; + char *name; + mc_stream_t *s; + mc_serialize_stream_msg_t *sm; unserialize_integer (m, &n_streams, sizeof (u32)); for (i = 0; i < n_streams; i++) { unserialize_cstring (m, &name); - if (i != MC_STREAM_INDEX_INTERNAL - && ! mc_stream_by_name (mcm, name)) - { - vec_validate (mcm->stream_vector, i); - s = vec_elt_at_index (mcm->stream_vector, i); - mc_stream_init (s); - s->index = s - mcm->stream_vector; - s->config.name = name; - s->state = MC_STREAM_STATE_name_known; - hash_set_mem (mcm->stream_index_by_name, s->config.name, s->index); - } + if (i != MC_STREAM_INDEX_INTERNAL && !mc_stream_by_name (mcm, name)) + { + vec_validate (mcm->stream_vector, i); + s = vec_elt_at_index (mcm->stream_vector, i); + mc_stream_init (s); + s->index = s - mcm->stream_vector; + s->config.name = name; + s->state = MC_STREAM_STATE_name_known; + hash_set_mem (mcm->stream_index_by_name, s->config.name, s->index); + } else - vec_free (name); + vec_free (name); s = vec_elt_at_index (mcm->stream_vector, i); @@ -2147,45 +2370,53 @@ void unserialize_mc_main (serialize_main_t * m, va_list * va) unserialize_integer (m, &n_stream_msgs, sizeof (u32)); vec_resize (s->stream_msgs, n_stream_msgs); vec_foreach (sm, s->stream_msgs) - { - uword * p; - u32 si, gi; - - unserialize_cstring (m, &name); - p = hash_get (mcm->global_msg_index_by_name, name); - gi = p ? p[0] : ~0; - si = sm - s->stream_msgs; - - if (MC_EVENT_LOGGING > 0) - { - ELOG_TYPE_DECLARE (e) = { + { + uword *p; + u32 si, gi; + + unserialize_cstring (m, &name); + p = hash_get (mcm->global_msg_index_by_name, name); + gi = p ? p[0] : ~0; + si = sm - s->stream_msgs; + + if (MC_EVENT_LOGGING > 0) + { + /* *INDENT-OFF* */ + ELOG_TYPE_DECLARE (e) = + { .format = "catchup-bind: %s to %d global index %d stream %d", .format_args = "T4i4i4i4", }; - struct { u32 c[4]; } * ed; - ed = ELOG_DATA (mcm->elog_main, e); - ed->c[0] = elog_id_for_msg_name (mcm, name); - ed->c[1] = si; - ed->c[2] = gi; - ed->c[3] = s->index; - } - - vec_free (name); - - sm->global_index = gi; - if (gi != ~0) + /* *INDENT-ON* */ + + struct { - vec_validate_init_empty (s->stream_msg_index_by_global_index, - gi, ~0); - s->stream_msg_index_by_global_index[gi] = si; - } - } + u32 c[4]; + } *ed; + ed = ELOG_DATA (mcm->elog_main, e); + ed->c[0] = elog_id_for_msg_name (mcm, name); + ed->c[1] = si; + ed->c[2] = gi; + ed->c[3] = s->index; + } + + vec_free (name); + + sm->global_index = gi; + if (gi != ~0) + { + vec_validate_init_empty (s->stream_msg_index_by_global_index, + gi, ~0); + s->stream_msg_index_by_global_index[gi] = si; + } + } } } -void mc_main_init (mc_main_t * mcm, char * tag) +void +mc_main_init (mc_main_t * mcm, char *tag) { - vlib_main_t * vm = vlib_get_main(); + vlib_main_t *vm = vlib_get_main (); mcm->vlib_main = vm; mcm->elog_main = &vm->elog_main; @@ -2194,7 +2425,7 @@ void mc_main_init (mc_main_t * mcm, char * tag) mcm->relay_state = MC_RELAY_STATE_NEGOTIATE; mcm->stream_index_by_name - = hash_create_string (/* elts */ 0, /* value size */ sizeof (uword)); + = hash_create_string ( /* elts */ 0, /* value size */ sizeof (uword)); { vlib_node_registration_t r; @@ -2229,16 +2460,19 @@ void mc_main_init (mc_main_t * mcm, char * tag) } if (MC_EVENT_LOGGING > 0) - mhash_init (&mcm->elog_id_by_peer_id, sizeof (uword), sizeof (mc_peer_id_t)); + mhash_init (&mcm->elog_id_by_peer_id, sizeof (uword), + sizeof (mc_peer_id_t)); - mhash_init (&mcm->mastership_peer_index_by_id, sizeof (uword), sizeof (mc_peer_id_t)); + mhash_init (&mcm->mastership_peer_index_by_id, sizeof (uword), + sizeof (mc_peer_id_t)); mc_serialize_init (mcm); } -static u8 * format_mc_relay_state (u8 * s, va_list * args) +static u8 * +format_mc_relay_state (u8 * s, va_list * args) { mc_relay_state_t state = va_arg (*args, mc_relay_state_t); - char * t = 0; + char *t = 0; switch (state) { case MC_RELAY_STATE_NEGOTIATE: @@ -2257,10 +2491,11 @@ static u8 * format_mc_relay_state (u8 * s, va_list * args) return format (s, "%s", t); } -static u8 * format_mc_stream_state (u8 * s, va_list * args) +static u8 * +format_mc_stream_state (u8 * s, va_list * args) { mc_stream_state_t state = va_arg (*args, mc_stream_state_t); - char * t = 0; + char *t = 0; switch (state) { #define _(f) case MC_STREAM_STATE_##f: t = #f; break; @@ -2274,90 +2509,101 @@ static u8 * format_mc_stream_state (u8 * s, va_list * args) } static int -mc_peer_comp (void * a1, void * a2) +mc_peer_comp (void *a1, void *a2) { - mc_stream_peer_t * p1 = a1; - mc_stream_peer_t * p2 = a2; + mc_stream_peer_t *p1 = a1; + mc_stream_peer_t *p2 = a2; return mc_peer_id_compare (p1->id, p2->id); } -u8 * format_mc_main (u8 * s, va_list * args) +u8 * +format_mc_main (u8 * s, va_list * args) { - mc_main_t * mcm = va_arg (*args, mc_main_t *); - mc_stream_t * t; - mc_stream_peer_t * p, * ps; + mc_main_t *mcm = va_arg (*args, mc_main_t *); + mc_stream_t *t; + mc_stream_peer_t *p, *ps; uword indent = format_get_indent (s); - s = format (s, "MC state %U, %d streams joined, global sequence 0x%x", - format_mc_relay_state, mcm->relay_state, - vec_len (mcm->stream_vector), - mcm->relay_global_sequence); + s = format (s, "MC state %U, %d streams joined, global sequence 0x%x", + format_mc_relay_state, mcm->relay_state, + vec_len (mcm->stream_vector), mcm->relay_global_sequence); { - mc_mastership_peer_t * mp; + mc_mastership_peer_t *mp; f64 now = vlib_time_now (mcm->vlib_main); s = format (s, "\n%UMost recent mastership peers:", format_white_space, indent + 2); vec_foreach (mp, mcm->mastership_peers) - { - s = format (s, "\n%U%-30U%.4e", - format_white_space, indent + 4, - mcm->transport.format_peer_id, mp->peer_id, - now - mp->time_last_master_assert_received); - } - } - - vec_foreach (t, mcm->stream_vector) { - s = format (s, "\n%Ustream `%s' index %d", - format_white_space, indent + 2, - t->config.name, t->index); - - s = format (s, "\n%Ustate %U", - format_white_space, indent + 4, - format_mc_stream_state, t->state); - - s = format (s, "\n%Uretries: interval %.0f sec, limit %d, pool elts %d, %Ld sent", - format_white_space, indent + 4, t->config.retry_interval, - t->config.retry_limit, - pool_elts (t->retry_pool), - t->stats.n_retries - t->stats_last_clear.n_retries); - - s = format (s, "\n%U%Ld/%Ld user requests sent/received", + s = format (s, "\n%U%-30U%.4e", format_white_space, indent + 4, - t->user_requests_sent, t->user_requests_received); - - s = format (s, "\n%U%d peers, local/global sequence 0x%x/0x%x", - format_white_space, indent + 4, - pool_elts (t->peers), - t->our_local_sequence, - t->last_global_sequence_processed); - - ps = 0; - pool_foreach (p, t->peers, - ({ - if (clib_bitmap_get (t->all_peer_bitmap, p - t->peers)) - vec_add1 (ps, p[0]); - })); - vec_sort_with_function (ps, mc_peer_comp); - s = format (s, "\n%U%=30s%10s%16s%16s", - format_white_space, indent + 6, - "Peer", "Last seq", "Retries", "Future"); - - vec_foreach (p, ps) - { - s = format (s, "\n%U%-30U0x%08x%16Ld%16Ld%s", - format_white_space, indent + 6, - mcm->transport.format_peer_id, p->id.as_u64, - p->last_sequence_received, - p->stats.n_msgs_from_past - p->stats_last_clear.n_msgs_from_past, - p->stats.n_msgs_from_future - p->stats_last_clear.n_msgs_from_future, - (mcm->transport.our_ack_peer_id.as_u64 == p->id.as_u64 - ? " (self)" : "")); - } - vec_free (ps); + mcm->transport.format_peer_id, mp->peer_id, + now - mp->time_last_master_assert_received); } + } + + vec_foreach (t, mcm->stream_vector) + { + s = format (s, "\n%Ustream `%s' index %d", + format_white_space, indent + 2, t->config.name, t->index); + + s = format (s, "\n%Ustate %U", + format_white_space, indent + 4, + format_mc_stream_state, t->state); + + s = + format (s, + "\n%Uretries: interval %.0f sec, limit %d, pool elts %d, %Ld sent", + format_white_space, indent + 4, t->config.retry_interval, + t->config.retry_limit, pool_elts (t->retry_pool), + t->stats.n_retries - t->stats_last_clear.n_retries); + + s = format (s, "\n%U%Ld/%Ld user requests sent/received", + format_white_space, indent + 4, + t->user_requests_sent, t->user_requests_received); + + s = format (s, "\n%U%d peers, local/global sequence 0x%x/0x%x", + format_white_space, indent + 4, + pool_elts (t->peers), + t->our_local_sequence, t->last_global_sequence_processed); + + ps = 0; + /* *INDENT-OFF* */ + pool_foreach (p, t->peers, + ({ + if (clib_bitmap_get (t->all_peer_bitmap, p - t->peers)) + vec_add1 (ps, p[0]); + })); + /* *INDENT-ON* */ + vec_sort_with_function (ps, mc_peer_comp); + s = format (s, "\n%U%=30s%10s%16s%16s", + format_white_space, indent + 6, + "Peer", "Last seq", "Retries", "Future"); + + vec_foreach (p, ps) + { + s = format (s, "\n%U%-30U0x%08x%16Ld%16Ld%s", + format_white_space, indent + 6, + mcm->transport.format_peer_id, p->id.as_u64, + p->last_sequence_received, + p->stats.n_msgs_from_past - + p->stats_last_clear.n_msgs_from_past, + p->stats.n_msgs_from_future - + p->stats_last_clear.n_msgs_from_future, + (mcm->transport.our_ack_peer_id.as_u64 == + p->id.as_u64 ? " (self)" : "")); + } + vec_free (ps); + } return s; } + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/mc.h b/vlib/vlib/mc.h index 55dce2822c6..8614050c241 100644 --- a/vlib/vlib/mc.h +++ b/vlib/vlib/mc.h @@ -29,20 +29,23 @@ always_inline uword mc_need_byte_swap (void) -{ return CLIB_ARCH_IS_LITTLE_ENDIAN; } +{ + return CLIB_ARCH_IS_LITTLE_ENDIAN; +} -/* - * Used to uniquely identify hosts. - * For IP4 this would be ip4_address plus tcp/udp port. +/* + * Used to uniquely identify hosts. + * For IP4 this would be ip4_address plus tcp/udp port. */ -typedef union { +typedef union +{ u8 as_u8[8]; u64 as_u64; } mc_peer_id_t; always_inline mc_peer_id_t mc_byte_swap_peer_id (mc_peer_id_t i) -{ +{ /* Peer id is already in network byte order. */ return i; } @@ -56,13 +59,12 @@ mc_peer_id_compare (mc_peer_id_t a, mc_peer_id_t b) /* Assert mastership. Lowest peer_id amount all peers wins mastership. Only sent/received over mastership channel (MC_TRANSPORT_MASTERSHIP). So, we don't need a message opcode. */ -typedef CLIB_PACKED (struct { - /* Peer id asserting mastership. */ - mc_peer_id_t peer_id; - - /* Global sequence number asserted. */ - u32 global_sequence; -}) mc_msg_master_assert_t; +typedef CLIB_PACKED (struct + { + /* Peer id asserting mastership. */ + mc_peer_id_t peer_id; + /* Global sequence number asserted. */ + u32 global_sequence;}) mc_msg_master_assert_t; always_inline void mc_byte_swap_msg_master_assert (mc_msg_master_assert_t * r) @@ -83,24 +85,22 @@ mc_byte_swap_msg_master_assert (mc_msg_master_assert_t * r) _ (catchup_request) \ _ (catchup_reply) -typedef enum { +typedef enum +{ #define _(f) MC_MSG_TYPE_##f, foreach_mc_msg_type #undef _ } mc_relay_msg_type_t; /* Request to join a given stream. Multicast over MC_TRANSPORT_JOIN. */ -typedef CLIB_PACKED (struct { - mc_peer_id_t peer_id; - - mc_relay_msg_type_t type : 32; /* MC_MSG_TYPE_join_or_leave_request */ - - /* Stream to join or leave. */ - u32 stream_index; - - /* join = 1, leave = 0 */ - u8 is_join; -}) mc_msg_join_or_leave_request_t; +typedef CLIB_PACKED (struct + { +mc_peer_id_t peer_id; mc_relay_msg_type_t type:32; + /* MC_MSG_TYPE_join_or_leave_request */ + /* Stream to join or leave. */ + u32 stream_index; + /* join = 1, leave = 0 */ + u8 is_join;}) mc_msg_join_or_leave_request_t; always_inline void mc_byte_swap_msg_join_or_leave_request (mc_msg_join_or_leave_request_t * r) @@ -114,16 +114,13 @@ mc_byte_swap_msg_join_or_leave_request (mc_msg_join_or_leave_request_t * r) } /* Join reply. Multicast over MC_TRANSPORT_JOIN. */ -typedef CLIB_PACKED (struct { - mc_peer_id_t peer_id; - - mc_relay_msg_type_t type : 32; /* MC_MSG_TYPE_join_reply */ - - u32 stream_index; - - /* Peer ID to contact to catchup with this stream. */ - mc_peer_id_t catchup_peer_id; -}) mc_msg_join_reply_t; +typedef CLIB_PACKED (struct + { +mc_peer_id_t peer_id; mc_relay_msg_type_t type:32; + /* MC_MSG_TYPE_join_reply */ + u32 stream_index; + /* Peer ID to contact to catchup with this stream. */ + mc_peer_id_t catchup_peer_id;}) mc_msg_join_reply_t; always_inline void mc_byte_swap_msg_join_reply (mc_msg_join_reply_t * r) @@ -139,23 +136,17 @@ mc_byte_swap_msg_join_reply (mc_msg_join_reply_t * r) /* Generic (application) request. Multicast over MC_TRANSPORT_USER_REQUEST_TO_RELAY and then relayed by relay master after filling in global sequence number. */ -typedef CLIB_PACKED (struct { - mc_peer_id_t peer_id; - - u32 stream_index; - - /* Global sequence number as filled in by relay master. */ - u32 global_sequence; - - /* Local sequence number as filled in by peer sending message. */ - u32 local_sequence; - - /* Size of request data. */ - u32 n_data_bytes; - - /* Opaque request data. */ - u8 data[0]; -}) mc_msg_user_request_t; +typedef CLIB_PACKED (struct + { + mc_peer_id_t peer_id; u32 stream_index; + /* Global sequence number as filled in by relay master. */ + u32 global_sequence; + /* Local sequence number as filled in by peer sending message. */ + u32 local_sequence; + /* Size of request data. */ + u32 n_data_bytes; + /* Opaque request data. */ + u8 data[0];}) mc_msg_user_request_t; always_inline void mc_byte_swap_msg_user_request (mc_msg_user_request_t * r) @@ -171,13 +162,13 @@ mc_byte_swap_msg_user_request (mc_msg_user_request_t * r) } /* Sent unicast over ACK channel. */ -typedef CLIB_PACKED (struct { - mc_peer_id_t peer_id; - u32 global_sequence; - u32 stream_index; - u32 local_sequence; - i32 seq_cmp_result; -}) mc_msg_user_ack_t; +typedef CLIB_PACKED (struct + { + mc_peer_id_t peer_id; + u32 global_sequence; + u32 stream_index; + u32 local_sequence; + i32 seq_cmp_result;}) mc_msg_user_ack_t; always_inline void mc_byte_swap_msg_user_ack (mc_msg_user_ack_t * r) @@ -193,10 +184,10 @@ mc_byte_swap_msg_user_ack (mc_msg_user_ack_t * r) } /* Sent/received unicast over catchup channel (e.g. using TCP). */ -typedef CLIB_PACKED (struct { - mc_peer_id_t peer_id; - u32 stream_index; -}) mc_msg_catchup_request_t; +typedef CLIB_PACKED (struct + { + mc_peer_id_t peer_id; + u32 stream_index;}) mc_msg_catchup_request_t; always_inline void mc_byte_swap_msg_catchup_request (mc_msg_catchup_request_t * r) @@ -209,20 +200,15 @@ mc_byte_swap_msg_catchup_request (mc_msg_catchup_request_t * r) } /* Sent/received unicast over catchup channel. */ -typedef CLIB_PACKED (struct { - mc_peer_id_t peer_id; - - u32 stream_index; - - /* Last global sequence number included in catchup data. */ - u32 last_global_sequence_included; - - /* Size of catchup data. */ - u32 n_data_bytes; - - /* Catchup data. */ - u8 data[0]; -}) mc_msg_catchup_reply_t; +typedef CLIB_PACKED (struct + { + mc_peer_id_t peer_id; u32 stream_index; + /* Last global sequence number included in catchup data. */ + u32 last_global_sequence_included; + /* Size of catchup data. */ + u32 n_data_bytes; + /* Catchup data. */ + u8 data[0];}) mc_msg_catchup_reply_t; always_inline void mc_byte_swap_msg_catchup_reply (mc_msg_catchup_reply_t * r) @@ -231,18 +217,20 @@ mc_byte_swap_msg_catchup_reply (mc_msg_catchup_reply_t * r) { r->peer_id = mc_byte_swap_peer_id (r->peer_id); r->stream_index = clib_byte_swap_u32 (r->stream_index); - r->last_global_sequence_included = clib_byte_swap_u32 (r->last_global_sequence_included); + r->last_global_sequence_included = + clib_byte_swap_u32 (r->last_global_sequence_included); r->n_data_bytes = clib_byte_swap_u32 (r->n_data_bytes); } } -typedef struct _mc_serialize_msg { +typedef struct _mc_serialize_msg +{ /* Name for this type. */ - char * name; + char *name; /* Functions to serialize/unserialize data. */ - serialize_function_t * serialize; - serialize_function_t * unserialize; + serialize_function_t *serialize; + serialize_function_t *unserialize; /* Maximum message size in bytes when serialized. If zero then this will be set to the largest sent message. */ @@ -255,10 +243,11 @@ typedef struct _mc_serialize_msg { u32 global_index; /* Registration list */ - struct _mc_serialize_msg * next_registration; + struct _mc_serialize_msg *next_registration; } mc_serialize_msg_t; -typedef struct { +typedef struct +{ /* Index into global message vector. */ u32 global_index; } mc_serialize_stream_msg_t; @@ -273,9 +262,10 @@ static void __mc_serialize_msg_registration_##x (void) \ x.next_registration = vm->mc_msg_registrations; \ vm->mc_msg_registrations = &x; \ } \ -__VA_ARGS__ mc_serialize_msg_t x +__VA_ARGS__ mc_serialize_msg_t x -typedef enum { +typedef enum +{ MC_TRANSPORT_MASTERSHIP, MC_TRANSPORT_JOIN, MC_TRANSPORT_USER_REQUEST_TO_RELAY, @@ -283,18 +273,23 @@ typedef enum { MC_N_TRANSPORT_TYPE, } mc_transport_type_t; -typedef struct { - clib_error_t * (* tx_buffer) (void * opaque, mc_transport_type_t type, u32 buffer_index); +typedef struct +{ + clib_error_t *(*tx_buffer) (void *opaque, mc_transport_type_t type, + u32 buffer_index); - clib_error_t * (* tx_ack) (void * opaque, mc_peer_id_t peer_id, u32 buffer_index); + clib_error_t *(*tx_ack) (void *opaque, mc_peer_id_t peer_id, + u32 buffer_index); /* Returns catchup opaque. */ - uword (* catchup_request_fun) (void * opaque, u32 stream_index, mc_peer_id_t catchup_peer_id); + uword (*catchup_request_fun) (void *opaque, u32 stream_index, + mc_peer_id_t catchup_peer_id); - void (* catchup_send_fun) (void * opaque, uword catchup_opaque, u8 * data_vector); + void (*catchup_send_fun) (void *opaque, uword catchup_opaque, + u8 * data_vector); /* Opaque passed to callbacks. */ - void * opaque; + void *opaque; mc_peer_id_t our_ack_peer_id; mc_peer_id_t our_catchup_peer_id; @@ -303,17 +298,19 @@ typedef struct { For IP this is interface MTU less IP + UDP header size. */ u32 max_packet_size; - format_function_t * format_peer_id; + format_function_t *format_peer_id; } mc_transport_t; -typedef struct { +typedef struct +{ /* Count of messages received from this peer from the past/future (with seq_cmp != 0). */ u64 n_msgs_from_past; u64 n_msgs_from_future; } mc_stream_peer_stats_t; -typedef struct { +typedef struct +{ /* ID of this peer. */ mc_peer_id_t id; @@ -323,7 +320,8 @@ typedef struct { mc_stream_peer_stats_t stats, stats_last_clear; } mc_stream_peer_t; -typedef struct { +typedef struct +{ u32 buffer_index; /* Cached copy of local sequence number from buffer. */ @@ -336,13 +334,14 @@ typedef struct { u32 prev_index, next_index; /* Bitmap of all peers which have acked this msg */ - uword * unacked_by_peer_bitmap; + uword *unacked_by_peer_bitmap; /* Message send or resend time */ f64 sent_at; } mc_retry_t; -typedef struct { +typedef struct +{ /* Number of retries sent for this stream. */ u64 n_retries; } mc_stream_stats_t; @@ -350,9 +349,10 @@ typedef struct { struct mc_main_t; struct mc_stream_t; -typedef struct { +typedef struct +{ /* Stream name. */ - char * name; + char *name; /* Number of outstanding messages. */ u32 window_size; @@ -364,31 +364,27 @@ typedef struct { u32 retry_limit; /* User rx buffer callback */ - void (* rx_buffer) (struct mc_main_t * mc_main, - struct mc_stream_t * stream, - mc_peer_id_t peer_id, - u32 buffer_index); + void (*rx_buffer) (struct mc_main_t * mc_main, + struct mc_stream_t * stream, + mc_peer_id_t peer_id, u32 buffer_index); /* User callback to create a snapshot */ - u8 * (* catchup_snapshot) (struct mc_main_t *mc_main, - u8 * snapshot_vector, - u32 last_global_sequence_included); + u8 *(*catchup_snapshot) (struct mc_main_t * mc_main, + u8 * snapshot_vector, + u32 last_global_sequence_included); /* User callback to replay a snapshot */ - void (* catchup) (struct mc_main_t *mc_main, - u8 * snapshot_data, - u32 n_snapshot_data_bytes); + void (*catchup) (struct mc_main_t * mc_main, + u8 * snapshot_data, u32 n_snapshot_data_bytes); /* Callback to save a snapshot for offline replay */ - void (* save_snapshot) (struct mc_main_t *mc_main, - u32 is_catchup, - u8 * snapshot_data, - u32 n_snapshot_data_bytes); + void (*save_snapshot) (struct mc_main_t * mc_main, + u32 is_catchup, + u8 * snapshot_data, u32 n_snapshot_data_bytes); /* Called when a peer dies */ - void (* peer_died) (struct mc_main_t * mc_main, - struct mc_stream_t * stream, - mc_peer_id_t peer_id); + void (*peer_died) (struct mc_main_t * mc_main, + struct mc_stream_t * stream, mc_peer_id_t peer_id); } mc_stream_config_t; #define foreach_mc_stream_state \ @@ -398,13 +394,15 @@ typedef struct { _ (catchup) \ _ (ready) -typedef enum { +typedef enum +{ #define _(f) MC_STREAM_STATE_##f, foreach_mc_stream_state #undef _ } mc_stream_state_t; -typedef struct mc_stream_t { +typedef struct mc_stream_t +{ mc_stream_config_t config; mc_stream_state_t state; @@ -415,33 +413,33 @@ typedef struct mc_stream_t { /* Stream index 0 is always for MC internal use. */ #define MC_STREAM_INDEX_INTERNAL 0 - mc_retry_t * retry_pool; + mc_retry_t *retry_pool; /* Head and tail index of retry pool. */ u32 retry_head_index, retry_tail_index; - /* + /* * Country club for recently retired messages * If the set of peers is expanding and a new peer * misses a message, we can easily retire the FIFO * element before we even know about the new peer */ - mc_retry_t * retired_fifo; + mc_retry_t *retired_fifo; /* Hash mapping local sequence to retry pool index. */ - uword * retry_index_by_local_sequence; + uword *retry_index_by_local_sequence; /* catch-up fifo of VLIB buffer indices. start recording when catching up. */ - u32 * catchup_fifo; + u32 *catchup_fifo; mc_stream_stats_t stats, stats_last_clear; /* Peer pool. */ - mc_stream_peer_t * peers; + mc_stream_peer_t *peers; /* Bitmap with ones for all peers in peer pool. */ - uword * all_peer_bitmap; + uword *all_peer_bitmap; /* Map of 64 bit id to index in stream pool. */ mhash_t peer_index_by_id; @@ -449,14 +447,14 @@ typedef struct mc_stream_t { /* Timeout, in case we're alone in the world */ f64 join_timeout; - vlib_one_time_waiting_process_t * procs_waiting_for_join_done; + vlib_one_time_waiting_process_t *procs_waiting_for_join_done; - vlib_one_time_waiting_process_t * procs_waiting_for_open_window; + vlib_one_time_waiting_process_t *procs_waiting_for_open_window; /* Next sequence number to use */ u32 our_local_sequence; - /* + /* * Last global sequence we processed. * When supplying catchup data, we need to tell * the client precisely where to start replaying @@ -464,13 +462,13 @@ typedef struct mc_stream_t { u32 last_global_sequence_processed; /* Vector of unique messages we've sent on this stream. */ - mc_serialize_stream_msg_t * stream_msgs; + mc_serialize_stream_msg_t *stream_msgs; /* Vector global message index into per stream message index. */ - u32 * stream_msg_index_by_global_index; + u32 *stream_msg_index_by_global_index; /* Hashed by message name. */ - uword * stream_msg_index_by_name; + uword *stream_msg_index_by_name; u64 user_requests_sent; u64 user_requests_received; @@ -495,30 +493,35 @@ mc_stream_init (mc_stream_t * s) s->retry_head_index = s->retry_tail_index = ~0; } -typedef struct { +typedef struct +{ u32 stream_index; u32 catchup_opaque; u8 *catchup_snapshot; } mc_catchup_process_arg_t; -typedef enum { +typedef enum +{ MC_RELAY_STATE_NEGOTIATE, MC_RELAY_STATE_MASTER, MC_RELAY_STATE_SLAVE, } mc_relay_state_t; -typedef struct { +typedef struct +{ mc_peer_id_t peer_id; f64 time_last_master_assert_received; } mc_mastership_peer_t; -typedef struct { +typedef struct +{ u32 stream_index; u32 buffer_index; } mc_stream_and_buffer_t; -typedef struct mc_main_t { +typedef struct mc_main_t +{ mc_relay_state_t relay_state; /* Mastership */ @@ -526,30 +529,30 @@ typedef struct mc_main_t { u64 relay_master_peer_id; - mc_mastership_peer_t * mastership_peers; + mc_mastership_peer_t *mastership_peers; /* Map of 64 bit id to index in stream pool. */ mhash_t mastership_peer_index_by_id; /* The transport we're using. */ mc_transport_t transport; - + /* Last-used global sequence number. */ u32 relay_global_sequence; /* Vector of streams. */ - mc_stream_t * stream_vector; + mc_stream_t *stream_vector; /* Hash table mapping stream name to pool index. */ - uword * stream_index_by_name; + uword *stream_index_by_name; - uword * procs_waiting_for_stream_name_by_name; + uword *procs_waiting_for_stream_name_by_name; - vlib_one_time_waiting_process_t ** procs_waiting_for_stream_name_pool; + vlib_one_time_waiting_process_t **procs_waiting_for_stream_name_pool; int joins_in_progress; - mc_catchup_process_arg_t * catchup_process_args; + mc_catchup_process_arg_t *catchup_process_args; /* Node indices for mastership, join ager, retry and catchup processes. */ @@ -560,10 +563,10 @@ typedef struct mc_main_t { u32 unserialize_process; /* Global vector of messages. */ - mc_serialize_msg_t ** global_msgs; + mc_serialize_msg_t **global_msgs; /* Hash table mapping message name to index. */ - uword * global_msg_index_by_name; + uword *global_msg_index_by_name; /* Shared serialize/unserialize main. */ serialize_main_t serialize_mains[VLIB_N_RX_TX]; @@ -571,8 +574,8 @@ typedef struct mc_main_t { vlib_serialize_buffer_main_t serialize_buffer_mains[VLIB_N_RX_TX]; /* Convenience variables */ - struct vlib_main_t * vlib_main; - elog_main_t * elog_main; + struct vlib_main_t *vlib_main; + elog_main_t *elog_main; /* Maps 64 bit peer id to elog string table offset for this formatted peer id. */ mhash_t elog_id_by_peer_id; @@ -580,13 +583,13 @@ typedef struct mc_main_t { uword *elog_id_by_msg_name; /* For mc_unserialize. */ - mc_stream_and_buffer_t * mc_unserialize_stream_and_buffers; + mc_stream_and_buffer_t *mc_unserialize_stream_and_buffers; } mc_main_t; always_inline mc_stream_t * -mc_stream_by_name (mc_main_t * m, char * name) +mc_stream_by_name (mc_main_t * m, char *name) { - uword * p = hash_get (m->stream_index_by_name, name); + uword *p = hash_get (m->stream_index_by_name, name); return p ? vec_elt_at_index (m->stream_vector, p[0]) : 0; } @@ -599,51 +602,49 @@ mc_stream_by_index (mc_main_t * m, u32 i) always_inline void mc_clear_stream_stats (mc_main_t * m) { - mc_stream_t * s; - mc_stream_peer_t * p; + mc_stream_t *s; + mc_stream_peer_t *p; vec_foreach (s, m->stream_vector) - { - s->stats_last_clear = s->stats; + { + s->stats_last_clear = s->stats; + /* *INDENT-OFF* */ pool_foreach (p, s->peers, ({ p->stats_last_clear = p->stats; })); - } + /* *INDENT-ON* */ + } } /* Declare all message handlers. */ #define _(f) void mc_msg_##f##_handler (mc_main_t * mcm, mc_msg_##f##_t * msg, u32 buffer_index); foreach_mc_msg_type #undef _ - -u32 mc_stream_join (mc_main_t * mcm, mc_stream_config_t *); + u32 mc_stream_join (mc_main_t * mcm, mc_stream_config_t *); void mc_stream_leave (mc_main_t * mcm, u32 stream_index); -void mc_wait_for_stream_ready (mc_main_t * m, char * stream_name); +void mc_wait_for_stream_ready (mc_main_t * m, char *stream_name); u32 mc_stream_send (mc_main_t * mcm, u32 stream_index, u32 buffer_index); -void mc_main_init (mc_main_t * mcm, char * tag); +void mc_main_init (mc_main_t * mcm, char *tag); void mc_enable_disable_mastership (mc_main_t * mcm, int we_can_be_master); -void * mc_get_vlib_buffer (struct vlib_main_t * vm, u32 n_bytes, u32 * bi_return); +void *mc_get_vlib_buffer (struct vlib_main_t *vm, u32 n_bytes, + u32 * bi_return); format_function_t format_mc_main; -clib_error_t * -mc_serialize_internal (mc_main_t * mc, - u32 stream_index, - u32 multiple_messages_per_vlib_buffer, - mc_serialize_msg_t * msg, - ...); +clib_error_t *mc_serialize_internal (mc_main_t * mc, + u32 stream_index, + u32 multiple_messages_per_vlib_buffer, + mc_serialize_msg_t * msg, ...); -clib_error_t * -mc_serialize_va (mc_main_t * mc, - u32 stream_index, - u32 multiple_messages_per_vlib_buffer, - mc_serialize_msg_t * msg, - va_list * va); +clib_error_t *mc_serialize_va (mc_main_t * mc, + u32 stream_index, + u32 multiple_messages_per_vlib_buffer, + mc_serialize_msg_t * msg, va_list * va); #define mc_serialize_stream(mc,si,msg,args...) \ mc_serialize_internal((mc),(si),(0),(msg),(msg)->serialize,args) @@ -656,19 +657,32 @@ mc_serialize_va (mc_main_t * mc, void mc_unserialize (mc_main_t * mcm, mc_stream_t * s, u32 buffer_index); uword mc_unserialize_message (mc_main_t * mcm, mc_stream_t * s, - serialize_main_t * m); + serialize_main_t * m); serialize_function_t serialize_mc_main, unserialize_mc_main; always_inline uword mc_max_message_size_in_bytes (mc_main_t * mcm) -{ return mcm->transport.max_packet_size - sizeof (mc_msg_user_request_t); } +{ + return mcm->transport.max_packet_size - sizeof (mc_msg_user_request_t); +} always_inline word mc_serialize_n_bytes_left (mc_main_t * mcm, serialize_main_t * m) -{ return mc_max_message_size_in_bytes (mcm) - serialize_vlib_buffer_n_bytes (m); } +{ + return mc_max_message_size_in_bytes (mcm) - + serialize_vlib_buffer_n_bytes (m); +} void unserialize_mc_stream (serialize_main_t * m, va_list * va); void mc_stream_join_process_hold (void); #endif /* included_vlib_mc_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/node.c b/vlib/vlib/node.c index 5d250d00a6f..838f34199bd 100644 --- a/vlib/vlib/node.c +++ b/vlib/vlib/node.c @@ -41,12 +41,13 @@ #include <vlib/threads.h> /* Query node given name. */ -vlib_node_t * vlib_get_node_by_name (vlib_main_t * vm, u8 * name) +vlib_node_t * +vlib_get_node_by_name (vlib_main_t * vm, u8 * name) { - vlib_node_main_t * nm = &vm->node_main; - uword * p; - u8 * key = name; - if (! clib_mem_is_heap_object (key)) + vlib_node_main_t *nm = &vm->node_main; + uword *p; + u8 *key = name; + if (!clib_mem_is_heap_object (key)) key = format (0, "%s", key); p = hash_get (nm->node_by_name, key); if (key != name) @@ -54,10 +55,11 @@ vlib_node_t * vlib_get_node_by_name (vlib_main_t * vm, u8 * name) return p ? vec_elt (nm->nodes, p[0]) : 0; } -static void node_set_elog_name (vlib_main_t * vm, uword node_index) +static void +node_set_elog_name (vlib_main_t * vm, uword node_index) { - vlib_node_t * n = vlib_get_node (vm, node_index); - elog_event_type_t * t; + vlib_node_t *n = vlib_get_node (vm, node_index); + elog_event_type_t *t; t = vec_elt_at_index (vm->node_call_elog_event_types, node_index); vec_free (t->format); @@ -67,14 +69,15 @@ static void node_set_elog_name (vlib_main_t * vm, uword node_index) vec_free (t->format); t->format = (char *) format (0, "%v-return: %%d%c", n->name, 0); - n->name_elog_string = elog_string (&vm->elog_main, "%v%c", n->name,0); + n->name_elog_string = elog_string (&vm->elog_main, "%v%c", n->name, 0); } -void vlib_node_rename (vlib_main_t * vm, u32 node_index, char * fmt, ...) +void +vlib_node_rename (vlib_main_t * vm, u32 node_index, char *fmt, ...) { va_list va; - vlib_node_main_t * nm = &vm->node_main; - vlib_node_t * n = vlib_get_node (vm, node_index); + vlib_node_main_t *nm = &vm->node_main; + vlib_node_t *n = vlib_get_node (vm, node_index); va_start (va, fmt); hash_unset (nm->node_by_name, n->name); @@ -87,20 +90,18 @@ void vlib_node_rename (vlib_main_t * vm, u32 node_index, char * fmt, ...) } static void -vlib_node_runtime_update (vlib_main_t * vm, - u32 node_index, - u32 next_index) +vlib_node_runtime_update (vlib_main_t * vm, u32 node_index, u32 next_index) { - vlib_node_main_t * nm = &vm->node_main; - vlib_node_runtime_t * r, * s; - vlib_node_t * node, * next_node; - vlib_next_frame_t * nf; - vlib_pending_frame_t * pf; + vlib_node_main_t *nm = &vm->node_main; + vlib_node_runtime_t *r, *s; + vlib_node_t *node, *next_node; + vlib_next_frame_t *nf; + vlib_pending_frame_t *pf; i32 i, j, n_insert; - ASSERT(os_get_cpu_number() == 0); + ASSERT (os_get_cpu_number () == 0); - vlib_worker_thread_barrier_sync(vm); + vlib_worker_thread_barrier_sync (vm); node = vec_elt (nm->nodes, node_index); r = vlib_node_get_runtime (vm, node_index); @@ -119,22 +120,23 @@ vlib_node_runtime_update (vlib_main_t * vm, for (j = 0; j < vec_len (nm->nodes); j++) { s = vlib_node_get_runtime (vm, j); - if (j != node_index - && s->next_frame_index >= i) + if (j != node_index && s->next_frame_index >= i) s->next_frame_index += n_insert; } /* Pending frames may need to be relocated also. */ vec_foreach (pf, nm->pending_frames) - { - if (pf->next_frame_index != VLIB_PENDING_FRAME_NO_NEXT_FRAME - && pf->next_frame_index >= i) - pf->next_frame_index += n_insert; - } + { + if (pf->next_frame_index != VLIB_PENDING_FRAME_NO_NEXT_FRAME + && pf->next_frame_index >= i) + pf->next_frame_index += n_insert; + } + /* *INDENT-OFF* */ pool_foreach (pf, nm->suspended_process_frames, ({ if (pf->next_frame_index != ~0 && pf->next_frame_index >= i) pf->next_frame_index += n_insert; })); + /* *INDENT-ON* */ r->n_next_nodes = vec_len (node->next_nodes); } @@ -144,27 +146,26 @@ vlib_node_runtime_update (vlib_main_t * vm, nf = nm->next_frames + r->next_frame_index + next_index; nf->node_runtime_index = next_node->runtime_index; - vlib_worker_thread_node_runtime_update(); + vlib_worker_thread_node_runtime_update (); - vlib_worker_thread_barrier_release(vm); + vlib_worker_thread_barrier_release (vm); } /* Add next node to given node in given slot. */ uword vlib_node_add_next_with_slot (vlib_main_t * vm, uword node_index, - uword next_node_index, - uword slot) + uword next_node_index, uword slot) { - vlib_node_main_t * nm = &vm->node_main; - vlib_node_t * node, * next; - uword * p; + vlib_node_main_t *nm = &vm->node_main; + vlib_node_t *node, *next; + uword *p; node = vec_elt (nm->nodes, node_index); next = vec_elt (nm->nodes, next_node_index); /* Runtime has to be initialized. */ - ASSERT(nm->flags & VLIB_NODE_MAIN_RUNTIME_STARTED); + ASSERT (nm->flags & VLIB_NODE_MAIN_RUNTIME_STARTED); if ((p = hash_get (node->next_slot_by_node, next_node_index))) { @@ -191,7 +192,8 @@ vlib_node_add_next_with_slot (vlib_main_t * vm, /* Siblings all get same node structure. */ { uword sib_node_index, sib_slot; - vlib_node_t * sib_node; + vlib_node_t *sib_node; + /* *INDENT-OFF* */ clib_bitmap_foreach (sib_node_index, node->sibling_bitmap, ({ sib_node = vec_elt (nm->nodes, sib_node_index); if (sib_node != node) @@ -200,6 +202,7 @@ vlib_node_add_next_with_slot (vlib_main_t * vm, ASSERT (sib_slot == slot); } })); + /* *INDENT-ON* */ } return slot; @@ -208,18 +211,16 @@ vlib_node_add_next_with_slot (vlib_main_t * vm, /* Add named next node to given node in given slot. */ uword vlib_node_add_named_next_with_slot (vlib_main_t * vm, - uword node, - char * name, - uword slot) + uword node, char *name, uword slot) { - vlib_node_main_t * nm; - vlib_node_t * n, * n_next; + vlib_node_main_t *nm; + vlib_node_t *n, *n_next; nm = &vm->node_main; n = vlib_get_node (vm, node); n_next = vlib_get_node_by_name (vm, (u8 *) name); - if (! n_next) + if (!n_next) { if (nm->flags & VLIB_NODE_MAIN_RUNTIME_STARTED) return ~0; @@ -235,7 +236,8 @@ vlib_node_add_named_next_with_slot (vlib_main_t * vm, return vlib_node_add_next_with_slot (vm, node, n_next->index, slot); } -static void node_elog_init (vlib_main_t * vm, uword ni) +static void +node_elog_init (vlib_main_t * vm, uword ni) { elog_event_type_t t; @@ -258,18 +260,18 @@ static void node_elog_init (vlib_main_t * vm, uword ni) #define STACK_ALIGN CLIB_CACHE_LINE_BYTES #endif -static void register_node (vlib_main_t * vm, - vlib_node_registration_t * r) +static void +register_node (vlib_main_t * vm, vlib_node_registration_t * r) { - vlib_node_main_t * nm = &vm->node_main; - vlib_node_t * n; - u32 page_size = clib_mem_get_page_size(); + vlib_node_main_t *nm = &vm->node_main; + vlib_node_t *n; + u32 page_size = clib_mem_get_page_size (); int i; if (CLIB_DEBUG > 0) { /* Default (0) type should match INTERNAL. */ - vlib_node_t zero = {0}; + vlib_node_t zero = { 0 }; ASSERT (VLIB_NODE_TYPE_INTERNAL == zero.type); } @@ -280,21 +282,20 @@ static void register_node (vlib_main_t * vm, n->index = vec_len (nm->nodes); vec_add1 (nm->nodes, n); - + /* Name is always a vector so it can be formatted with %v. */ if (clib_mem_is_heap_object (vec_header (r->name, 0))) n->name = vec_dup ((u8 *) r->name); else n->name = format (0, "%s", r->name); - if (! nm->node_by_name) - nm->node_by_name = hash_create_vec (/* size */ 32, - sizeof (n->name[0]), - sizeof (uword)); + if (!nm->node_by_name) + nm->node_by_name = hash_create_vec ( /* size */ 32, + sizeof (n->name[0]), sizeof (uword)); /* Node names must be unique. */ { - vlib_node_t * o = vlib_get_node_by_name (vm, n->name); + vlib_node_t *o = vlib_get_node_by_name (vm, n->name); if (o) clib_error ("more than one node named `%v'", n->name); } @@ -314,21 +315,21 @@ static void register_node (vlib_main_t * vm, #define _(f) n->f = r->f - _ (type); - _ (flags); - _ (state); - _ (scalar_size); - _ (vector_size); - _ (format_buffer); - _ (unformat_buffer); - _ (format_trace); - _ (validate_frame); + _(type); + _(flags); + _(state); + _(scalar_size); + _(vector_size); + _(format_buffer); + _(unformat_buffer); + _(format_trace); + _(validate_frame); /* Register error counters. */ vlib_register_errors (vm, n->index, r->n_errors, r->error_strings); node_elog_init (vm, n->index); - _ (runtime_data_bytes); + _(runtime_data_bytes); if (r->runtime_data_bytes > 0) { vec_resize (n->runtime_data, r->runtime_data_bytes); @@ -347,36 +348,37 @@ static void register_node (vlib_main_t * vm, /* Initialize node runtime. */ { - vlib_node_runtime_t * rt; + vlib_node_runtime_t *rt; u32 i; if (n->type == VLIB_NODE_TYPE_PROCESS) { - vlib_process_t * p; + vlib_process_t *p; uword log2_n_stack_bytes; log2_n_stack_bytes = clib_max (r->process_log2_n_stack_bytes, 15); #ifdef CLIB_UNIX - /* - * Bump the stack size if running over a kernel with a large page size, - * and the stack isn't any too big to begin with. Otherwise, we'll - * trip over the stack guard page for sure. - */ - if ((page_size > (4<<10)) && log2_n_stack_bytes < 19) - { - if ((1<<log2_n_stack_bytes) <= page_size) - log2_n_stack_bytes = min_log2 (page_size) + 1; - else - log2_n_stack_bytes++; - } + /* + * Bump the stack size if running over a kernel with a large page size, + * and the stack isn't any too big to begin with. Otherwise, we'll + * trip over the stack guard page for sure. + */ + if ((page_size > (4 << 10)) && log2_n_stack_bytes < 19) + { + if ((1 << log2_n_stack_bytes) <= page_size) + log2_n_stack_bytes = min_log2 (page_size) + 1; + else + log2_n_stack_bytes++; + } #endif - p = clib_mem_alloc_aligned_at_offset - (sizeof (p[0]) + (1 << log2_n_stack_bytes), - STACK_ALIGN, STRUCT_OFFSET_OF (vlib_process_t, stack)); - if (p == 0) - clib_panic ("failed to allocate process stack (%d bytes)", 1<<log2_n_stack_bytes); + p = clib_mem_alloc_aligned_at_offset + (sizeof (p[0]) + (1 << log2_n_stack_bytes), + STACK_ALIGN, STRUCT_OFFSET_OF (vlib_process_t, stack)); + if (p == 0) + clib_panic ("failed to allocate process stack (%d bytes)", + 1 << log2_n_stack_bytes); memset (p, 0, sizeof (p[0])); p->log2_n_stack_bytes = log2_n_stack_bytes; @@ -395,12 +397,12 @@ static void register_node (vlib_main_t * vm, rt = &p->node_runtime; #ifdef CLIB_UNIX - /* - * Disallow writes to the bottom page of the stack, to - * catch stack overflows. - */ - if (mprotect (p->stack, page_size, PROT_READ) < 0) - clib_unix_warning ("process stack"); + /* + * Disallow writes to the bottom page of the stack, to + * catch stack overflows. + */ + if (mprotect (p->stack, page_size, PROT_READ) < 0) + clib_unix_warning ("process stack"); #endif } @@ -432,56 +434,62 @@ static void register_node (vlib_main_t * vm, ASSERT (vec_len (n->runtime_data) <= sizeof (rt->runtime_data)); if (vec_len (n->runtime_data) > 0) - clib_memcpy (rt->runtime_data, n->runtime_data, vec_len (n->runtime_data)); + clib_memcpy (rt->runtime_data, n->runtime_data, + vec_len (n->runtime_data)); vec_free (n->runtime_data); } } /* Register new packet processing node. */ -u32 vlib_register_node (vlib_main_t * vm, vlib_node_registration_t * r) +u32 +vlib_register_node (vlib_main_t * vm, vlib_node_registration_t * r) { register_node (vm, r); return r->index; } -void vlib_register_all_static_nodes (vlib_main_t * vm) +void +vlib_register_all_static_nodes (vlib_main_t * vm) { - vlib_node_registration_t * r; - + vlib_node_registration_t *r; + r = vm->node_main.node_registrations; - while (r) { - register_node (vm, r); - r = r->next_registration; - } + while (r) + { + register_node (vm, r); + r = r->next_registration; + } } clib_error_t * vlib_node_main_init (vlib_main_t * vm) { - vlib_node_main_t * nm = &vm->node_main; - clib_error_t * error = 0; - vlib_node_t * n; + vlib_node_main_t *nm = &vm->node_main; + clib_error_t *error = 0; + vlib_node_t *n; uword ni; nm->flags |= VLIB_NODE_MAIN_RUNTIME_STARTED; /* Generate sibling relationships */ { - vlib_node_t * n, * sib; + vlib_node_t *n, *sib; uword si; for (ni = 0; ni < vec_len (nm->nodes); ni++) { n = vec_elt (nm->nodes, ni); - if (! n->sibling_of) + if (!n->sibling_of) continue; sib = vlib_get_node_by_name (vm, (u8 *) n->sibling_of); - if (! sib) - clib_error ("sibling `%s' not found for node `%v'", n->sibling_of, n->name); + if (!sib) + clib_error ("sibling `%s' not found for node `%v'", n->sibling_of, + n->name); + /* *INDENT-OFF* */ clib_bitmap_foreach (si, sib->sibling_bitmap, ({ vlib_node_t * m = vec_elt (nm->nodes, si); @@ -491,6 +499,7 @@ vlib_node_main_init (vlib_main_t * vm) /* Connect us to all of sibling's siblings. */ n->sibling_bitmap = clib_bitmap_ori (n->sibling_bitmap, si); })); + /* *INDENT-ON* */ /* Connect sibling to us. */ sib->sibling_bitmap = clib_bitmap_ori (sib->sibling_bitmap, n->index); @@ -509,9 +518,9 @@ vlib_node_main_init (vlib_main_t * vm) for (i = 0; i < vec_len (n->next_node_names); i++) { - char * a = n->next_node_names[i]; + char *a = n->next_node_names[i]; - if (! a) + if (!a) continue; if (~0 == vlib_node_add_named_next_with_slot (vm, n->index, a, i)) @@ -528,7 +537,7 @@ vlib_node_main_init (vlib_main_t * vm) /* Set previous node pointers. */ for (ni = 0; ni < vec_len (nm->nodes); ni++) { - vlib_node_t * n_next; + vlib_node_t *n_next; uword i; n = vec_elt (nm->nodes, ni); @@ -545,33 +554,41 @@ vlib_node_main_init (vlib_main_t * vm) } { - vlib_next_frame_t * nf; - vlib_node_runtime_t * r; - vlib_node_t * next; + vlib_next_frame_t *nf; + vlib_node_runtime_t *r; + vlib_node_t *next; uword i; vec_foreach (r, nm->nodes_by_type[VLIB_NODE_TYPE_INTERNAL]) - { - if (r->n_next_nodes == 0) - continue; + { + if (r->n_next_nodes == 0) + continue; - n = vlib_get_node (vm, r->node_index); - nf = vec_elt_at_index (nm->next_frames, r->next_frame_index); + n = vlib_get_node (vm, r->node_index); + nf = vec_elt_at_index (nm->next_frames, r->next_frame_index); - for (i = 0; i < vec_len (n->next_nodes); i++) - { - next = vlib_get_node (vm, n->next_nodes[i]); + for (i = 0; i < vec_len (n->next_nodes); i++) + { + next = vlib_get_node (vm, n->next_nodes[i]); - /* Validate node runtime indices are correctly initialized. */ - ASSERT (nf[i].node_runtime_index == next->runtime_index); + /* Validate node runtime indices are correctly initialized. */ + ASSERT (nf[i].node_runtime_index == next->runtime_index); - nf[i].flags = 0; - if (next->flags & VLIB_NODE_FLAG_FRAME_NO_FREE_AFTER_DISPATCH) - nf[i].flags |= VLIB_FRAME_NO_FREE_AFTER_DISPATCH; - } - } + nf[i].flags = 0; + if (next->flags & VLIB_NODE_FLAG_FRAME_NO_FREE_AFTER_DISPATCH) + nf[i].flags |= VLIB_FRAME_NO_FREE_AFTER_DISPATCH; + } + } } - done: +done: return error; } + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/node.h b/vlib/vlib/node.h index e9842275b0e..795856e6d7f 100644 --- a/vlib/vlib/node.h +++ b/vlib/vlib/node.h @@ -55,7 +55,8 @@ typedef uword (vlib_node_function_t) (struct vlib_main_t * vm, struct vlib_node_runtime_t * node, struct vlib_frame_t * frame); -typedef enum { +typedef enum +{ /* An internal node on the call graph (could be output). */ VLIB_NODE_TYPE_INTERNAL, @@ -74,15 +75,16 @@ typedef enum { VLIB_N_NODE_TYPE, } vlib_node_type_t; -typedef struct _vlib_node_registration { +typedef struct _vlib_node_registration +{ /* Vector processing function for this node. */ - vlib_node_function_t * function; + vlib_node_function_t *function; /* Node name. */ - char * name; + char *name; /* Name of sibling (if applicable). */ - char * sibling_of; + char *sibling_of; /* Node index filled in by registration. */ u32 index; @@ -91,23 +93,23 @@ typedef struct _vlib_node_registration { vlib_node_type_t type; /* Error strings indexed by error code for this node. */ - char ** error_strings; + char **error_strings; /* Buffer format/unformat for this node. */ - format_function_t * format_buffer; - unformat_function_t * unformat_buffer; + format_function_t *format_buffer; + unformat_function_t *unformat_buffer; /* Trace format/unformat for this node. */ - format_function_t * format_trace; - unformat_function_t * unformat_trace; + format_function_t *format_trace; + unformat_function_t *unformat_trace; /* Function to validate incoming frames. */ - u8 * (* validate_frame) (struct vlib_main_t * vm, - struct vlib_node_runtime_t *, - struct vlib_frame_t * f); + u8 *(*validate_frame) (struct vlib_main_t * vm, + struct vlib_node_runtime_t *, + struct vlib_frame_t * f); /* Per-node runtime data. */ - void * runtime_data; + void *runtime_data; /* Process stack size. */ u16 process_log2_n_stack_bytes; @@ -131,10 +133,10 @@ typedef struct _vlib_node_registration { u16 n_next_nodes; /* Constructor link-list, don't ask... */ - struct _vlib_node_registration * next_registration; + struct _vlib_node_registration *next_registration; /* Names of next nodes which this node feeds into. */ - char * next_nodes[]; + char *next_nodes[]; } vlib_node_registration_t; @@ -148,7 +150,7 @@ static void __vlib_add_node_registration_##x (void) \ x.next_registration = vm->node_main.node_registrations; \ vm->node_main.node_registrations = &x; \ } \ -__VA_ARGS__ vlib_node_registration_t x +__VA_ARGS__ vlib_node_registration_t x #if CLIB_DEBUG > 0 #define VLIB_NODE_FUNCTION_CLONE_TEMPLATE(arch, fn) @@ -179,11 +181,14 @@ __VA_ARGS__ vlib_node_registration_t x always_inline vlib_node_registration_t * vlib_node_next_registered (vlib_node_registration_t * c) { - c = clib_elf_section_data_next (c, c->n_next_nodes * sizeof (c->next_nodes[0])); + c = + clib_elf_section_data_next (c, + c->n_next_nodes * sizeof (c->next_nodes[0])); return c; } -typedef struct { +typedef struct +{ /* Total calls, clock ticks and vector elements processed for this node. */ u64 calls, vectors, clocks, suspends; u64 max_clock; @@ -199,19 +204,21 @@ typedef struct { /* Input node is never called. */ \ _ (DISABLED) -typedef enum { +typedef enum +{ #define _(f) VLIB_NODE_STATE_##f, foreach_vlib_node_state #undef _ - VLIB_N_NODE_STATE, + VLIB_N_NODE_STATE, } vlib_node_state_t; -typedef struct vlib_node_t { +typedef struct vlib_node_t +{ /* Vector processing function for this node. */ - vlib_node_function_t * function; + vlib_node_function_t *function; /* Node name. */ - u8 * name; + u8 *name; /* Node name index in elog string table. */ u32 name_elog_string; @@ -233,7 +240,7 @@ typedef struct vlib_node_t { u32 runtime_index; /* Runtime data for this node. */ - void * runtime_data; + void *runtime_data; /* Node flags. */ u16 flags; @@ -271,48 +278,48 @@ typedef struct vlib_node_t { u32 error_heap_index; /* Error strings indexed by error code for this node. */ - char ** error_strings; + char **error_strings; /* Vector of next node names. Only used before next_nodes array is initialized. */ - char ** next_node_names; + char **next_node_names; /* Next node indices for this node. */ - u32 * next_nodes; + u32 *next_nodes; /* Name of node that we are sibling of. */ - char * sibling_of; + char *sibling_of; /* Bitmap of all of this node's siblings. */ - uword * sibling_bitmap; + uword *sibling_bitmap; /* Total number of vectors sent to each next node. */ - u64 * n_vectors_by_next_node; + u64 *n_vectors_by_next_node; /* Hash table mapping next node index into slot in next_nodes vector. Quickly determines whether this node is connected to given next node and, if so, with which slot. */ - uword * next_slot_by_node; + uword *next_slot_by_node; /* Bitmap of node indices which feed this node. */ - uword * prev_node_bitmap; + uword *prev_node_bitmap; /* Node/next-index which own enqueue rights with to this node. */ u32 owner_node_index, owner_next_index; /* Buffer format/unformat for this node. */ - format_function_t * format_buffer; - unformat_function_t * unformat_buffer; + format_function_t *format_buffer; + unformat_function_t *unformat_buffer; /* Trace buffer format/unformat for this node. */ - format_function_t * format_trace; + format_function_t *format_trace; /* Function to validate incoming frames. */ - u8 * (* validate_frame) (struct vlib_main_t * vm, - struct vlib_node_runtime_t *, - struct vlib_frame_t * f); + u8 *(*validate_frame) (struct vlib_main_t * vm, + struct vlib_node_runtime_t *, + struct vlib_frame_t * f); /* for pretty-printing, not typically valid */ - u8 * state_string; + u8 *state_string; } vlib_node_t; #define VLIB_INVALID_NODE_INDEX ((u32) ~0) @@ -322,7 +329,8 @@ typedef struct vlib_node_t { #define VLIB_FRAME_ALIGN VLIB_MAX_CPUS /* Calling frame (think stack frame) for a node. */ -typedef struct vlib_frame_t { +typedef struct vlib_frame_t +{ /* Frame flags. */ u16 flags; @@ -342,7 +350,8 @@ typedef struct vlib_frame_t { u8 arguments[0]; } vlib_frame_t; -typedef struct { +typedef struct +{ /* Frame index. */ u32 frame_index; @@ -385,7 +394,8 @@ vlib_next_frame_init (vlib_next_frame_t * nf) } /* A frame pending dispatch by main loop. */ -typedef struct { +typedef struct +{ /* Node and runtime for this frame. */ u32 node_runtime_index; @@ -399,12 +409,13 @@ typedef struct { #define VLIB_PENDING_FRAME_NO_NEXT_FRAME ((u32) ~0) } vlib_pending_frame_t; -typedef struct vlib_node_runtime_t { +typedef struct vlib_node_runtime_t +{ /* Node function to call. */ - vlib_node_function_t * function; + vlib_node_function_t *function; /* Vector of errors for this node. */ - vlib_error_t * errors; + vlib_error_t *errors; /* Number of clock cycles. */ u32 clocks_since_last_overflow; @@ -459,22 +470,26 @@ typedef struct vlib_node_runtime_t { - 1 * sizeof (vlib_error_t *) - 11 * sizeof (u32) - 5 * sizeof (u16)) / sizeof (uword)]; -} vlib_node_runtime_t; +} +vlib_node_runtime_t; -typedef struct { +typedef struct +{ /* Number of allocated frames for this scalar/vector size. */ u32 n_alloc_frames; /* Vector of free frame indices for this scalar/vector size. */ - u32 * free_frame_indices; + u32 *free_frame_indices; } vlib_frame_size_t; -typedef struct { +typedef struct +{ /* Users opaque value for event type. */ uword opaque; } vlib_process_event_type_t; -typedef struct { +typedef struct +{ /* Node runtime for this process. */ vlib_node_runtime_t node_runtime; @@ -507,20 +522,20 @@ typedef struct { u32 n_suspends; /* Vectors of pending event data indexed by event type index. */ - void ** pending_event_data_by_type_index; + void **pending_event_data_by_type_index; /* Bitmap of event type-indices with non-empty vectors. */ - uword * non_empty_event_type_bitmap; + uword *non_empty_event_type_bitmap; /* Bitmap of event type-indices which are one time events. */ - uword * one_time_event_type_bitmap; + uword *one_time_event_type_bitmap; /* Type is opaque pointer -- typically a pointer to an event handler function. Hash table to map opaque to a type index. */ - uword * event_type_index_by_type_opaque; + uword *event_type_index_by_type_opaque; /* Pool of currently valid event types. */ - vlib_process_event_type_t * event_type_pool; + vlib_process_event_type_t *event_type_pool; /* When suspending saves cpu cycle counter when process is to be resumed. */ u64 resume_cpu_time; @@ -547,17 +562,25 @@ typedef struct { #ifdef CLIB_UNIX /* Ensure that the stack is aligned on the multiple of the page size */ -typedef char assert_process_stack_must_be_aligned_exactly_to_page_size_multiple - [(sizeof(vlib_process_t) - PAGE_SIZE_MULTIPLE) == 0 ? 0 : -1]; +typedef char + assert_process_stack_must_be_aligned_exactly_to_page_size_multiple[(sizeof + (vlib_process_t) + - + PAGE_SIZE_MULTIPLE) + == + 0 ? 0 : + -1]; #endif -typedef struct { - u32 node_index; +typedef struct +{ + u32 node_index; - u32 one_time_event; + u32 one_time_event; } vlib_one_time_waiting_process_t; -typedef struct { +typedef struct +{ u16 n_data_elts; u16 n_data_elt_bytes; @@ -570,46 +593,57 @@ typedef struct { u32 event_type_index; - union { + union + { u8 inline_event_data[64 - 3 * sizeof (u32) - 2 * sizeof (u16)]; /* Vector of event data used only when data does not fit inline. */ - u8 * event_data_as_vector; + u8 *event_data_as_vector; }; -} vlib_signal_timed_event_data_t; +} +vlib_signal_timed_event_data_t; always_inline uword vlib_timing_wheel_data_is_timed_event (u32 d) -{ return d & 1; } +{ + return d & 1; +} always_inline u32 vlib_timing_wheel_data_set_suspended_process (u32 i) -{ return 0 + 2*i; } +{ + return 0 + 2 * i; +} always_inline u32 vlib_timing_wheel_data_set_timed_event (u32 i) -{ return 1 + 2*i; } +{ + return 1 + 2 * i; +} always_inline uword vlib_timing_wheel_data_get_index (u32 d) -{ return d / 2; } +{ + return d / 2; +} -typedef struct { +typedef struct +{ /* Public nodes. */ - vlib_node_t ** nodes; + vlib_node_t **nodes; /* Node index hashed by node name. */ - uword * node_by_name; + uword *node_by_name; u32 flags; #define VLIB_NODE_MAIN_RUNTIME_STARTED (1 << 0) /* Nodes segregated by type for cache locality. Does not apply to nodes of type VLIB_NODE_TYPE_INTERNAL. */ - vlib_node_runtime_t * nodes_by_type[VLIB_N_NODE_TYPE]; + vlib_node_runtime_t *nodes_by_type[VLIB_N_NODE_TYPE]; /* Node runtime indices for input nodes with pending interrupts. */ - u32 * pending_interrupt_node_runtime_indices; + u32 *pending_interrupt_node_runtime_indices; /* Input nodes are switched from/to interrupt to/from polling mode when average vector length goes above/below polling/interrupt @@ -618,55 +652,56 @@ typedef struct { u32 interrupt_threshold_vector_length; /* Vector of next frames. */ - vlib_next_frame_t * next_frames; + vlib_next_frame_t *next_frames; /* Vector of internal node's frames waiting to be called. */ - vlib_pending_frame_t * pending_frames; + vlib_pending_frame_t *pending_frames; /* Timing wheel for scheduling time-based node dispatch. */ timing_wheel_t timing_wheel; - vlib_signal_timed_event_data_t * signal_timed_event_data_pool; + vlib_signal_timed_event_data_t *signal_timed_event_data_pool; /* Opaque data vector added via timing_wheel_advance. */ - u32 * data_from_advancing_timing_wheel; + u32 *data_from_advancing_timing_wheel; /* CPU time of next process to be ready on timing wheel. */ u64 cpu_time_next_process_ready; /* Vector of process nodes. One for each node of type VLIB_NODE_TYPE_PROCESS. */ - vlib_process_t ** processes; + vlib_process_t **processes; /* Current running process or ~0 if no process running. */ u32 current_process_index; /* Pool of pending process frames. */ - vlib_pending_frame_t * suspended_process_frames; + vlib_pending_frame_t *suspended_process_frames; /* Vector of event data vectors pending recycle. */ - void ** recycled_event_data_vectors; + void **recycled_event_data_vectors; /* Current counts of nodes in each state. */ u32 input_node_counts_by_state[VLIB_N_NODE_STATE]; /* Hash of (scalar_size,vector_size) to frame_sizes index. */ - uword * frame_size_hash; + uword *frame_size_hash; /* Per-size frame allocation information. */ - vlib_frame_size_t * frame_sizes; + vlib_frame_size_t *frame_sizes; /* Time of last node runtime stats clear. */ f64 time_last_runtime_stats_clear; /* Node registrations added by constructors */ - vlib_node_registration_t * node_registrations; + vlib_node_registration_t *node_registrations; } vlib_node_main_t; #define FRAME_QUEUE_MAX_NELTS 32 -typedef struct { - CLIB_CACHE_LINE_ALIGN_MARK(cacheline0); +typedef struct +{ + CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); u64 head; u64 head_hint; u64 tail; @@ -677,8 +712,17 @@ typedef struct { i32 n_vectors[FRAME_QUEUE_MAX_NELTS]; } frame_queue_trace_t; -typedef struct { +typedef struct +{ u64 count[FRAME_QUEUE_MAX_NELTS]; } frame_queue_nelt_counter_t; #endif /* included_vlib_node_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/node_cli.c b/vlib/vlib/node_cli.c index 13a1b91ef81..af9b47dd05d 100644 --- a/vlib/vlib/node_cli.c +++ b/vlib/vlib/node_cli.c @@ -41,21 +41,20 @@ #include <vlib/threads.h> static int -node_cmp (void * a1, void *a2) +node_cmp (void *a1, void *a2) { - vlib_node_t ** n1 = a1; - vlib_node_t ** n2 = a2; + vlib_node_t **n1 = a1; + vlib_node_t **n2 = a2; return vec_cmp (n1[0]->name, n2[0]->name); } static clib_error_t * show_node_graph (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { - vlib_node_main_t * nm = &vm->node_main; - vlib_node_t * n; + vlib_node_main_t *nm = &vm->node_main; + vlib_node_t *n; u32 node_index; vlib_cli_output (vm, "%U\n", format_vlib_node_graph, nm, 0); @@ -67,7 +66,7 @@ show_node_graph (vlib_main_t * vm, } else { - vlib_node_t ** nodes = vec_dup (nm->nodes); + vlib_node_t **nodes = vec_dup (nm->nodes); uword i; vec_sort_with_function (nodes, node_cmp); @@ -81,37 +80,42 @@ show_node_graph (vlib_main_t * vm, return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (show_node_graph_command, static) = { .path = "show vlib graph", .short_help = "Show packet processing node graph", .function = show_node_graph, }; +/* *INDENT-ON* */ -static u8 * format_vlib_node_stats (u8 * s, va_list * va) +static u8 * +format_vlib_node_stats (u8 * s, va_list * va) { - vlib_main_t * vm = va_arg (*va, vlib_main_t *); - vlib_node_t * n = va_arg (*va, vlib_node_t *); + vlib_main_t *vm = va_arg (*va, vlib_main_t *); + vlib_node_t *n = va_arg (*va, vlib_node_t *); int max = va_arg (*va, int); f64 v; - char * state; - u8 * ns; - u8 * misc_info = 0; + char *state; + u8 *ns; + u8 *misc_info = 0; u64 c, p, l, d; f64 x; - f64 maxc, maxcn; + f64 maxc, maxcn; u32 maxn; uword indent; - if (! n) + if (!n) { - if (max) - return format (s, - "%=30s%=17s%=16s%=16s%=16s%=16s", - "Name", "Max Node Clocks", "Vectors at Max", "Max Clocks", "Avg Clocks", "Avg Vectors/Call"); + if (max) + return format (s, + "%=30s%=17s%=16s%=16s%=16s%=16s", + "Name", "Max Node Clocks", "Vectors at Max", + "Max Clocks", "Avg Clocks", "Avg Vectors/Call"); else - return format (s, - "%=30s%=12s%=16s%=16s%=16s%=16s%=16s", - "Name", "State", "Calls", "Vectors", "Suspends", "Clocks", "Vectors/Call"); + return format (s, + "%=30s%=12s%=16s%=16s%=16s%=16s%=16s", + "Name", "State", "Calls", "Vectors", "Suspends", + "Clocks", "Vectors/Call"); } indent = format_get_indent (s); @@ -120,11 +124,11 @@ static u8 * format_vlib_node_stats (u8 * s, va_list * va) c = n->stats_total.calls - n->stats_last_clear.calls; p = n->stats_total.vectors - n->stats_last_clear.vectors; d = n->stats_total.suspends - n->stats_last_clear.suspends; - maxc = (f64)n->stats_total.max_clock; + maxc = (f64) n->stats_total.max_clock; maxn = n->stats_total.max_clock_n; - if (n->stats_total.max_clock_n) - maxcn = (f64)n->stats_total.max_clock / (f64)maxn; - else + if (n->stats_total.max_clock_n) + maxcn = (f64) n->stats_total.max_clock / (f64) maxn; + else maxcn = 0.0; /* Clocks per packet, per call or per suspend. */ @@ -135,27 +139,27 @@ static u8 * format_vlib_node_stats (u8 * s, va_list * va) x = (f64) l / (f64) c; else if (d > 0) x = (f64) l / (f64) d; - + if (c > 0) - v = (double)p / (double)c; + v = (double) p / (double) c; else v = 0; state = "active"; if (n->type == VLIB_NODE_TYPE_PROCESS) { - vlib_process_t * p = vlib_get_process_from_node (vm, n); + vlib_process_t *p = vlib_get_process_from_node (vm, n); /* Show processes with events pending. This helps spot bugs where events are not - being handled. */ - if (! clib_bitmap_is_zero (p->non_empty_event_type_bitmap)) + being handled. */ + if (!clib_bitmap_is_zero (p->non_empty_event_type_bitmap)) misc_info = format (misc_info, "events pending, "); switch (p->flags & (VLIB_PROCESS_IS_SUSPENDED_WAITING_FOR_CLOCK | VLIB_PROCESS_IS_SUSPENDED_WAITING_FOR_EVENT)) { default: - if (! (p->flags & VLIB_PROCESS_IS_RUNNING)) + if (!(p->flags & VLIB_PROCESS_IS_RUNNING)) state = "done"; break; @@ -167,12 +171,12 @@ static u8 * format_vlib_node_stats (u8 * s, va_list * va) state = "event wait"; break; - case (VLIB_PROCESS_IS_SUSPENDED_WAITING_FOR_EVENT - | VLIB_PROCESS_IS_SUSPENDED_WAITING_FOR_CLOCK): - state = "any wait"; + case (VLIB_PROCESS_IS_SUSPENDED_WAITING_FOR_EVENT | VLIB_PROCESS_IS_SUSPENDED_WAITING_FOR_CLOCK): + state = + "any wait"; break; } - } + } else if (n->type != VLIB_NODE_TYPE_INTERNAL) { state = "polling"; @@ -186,10 +190,10 @@ static u8 * format_vlib_node_stats (u8 * s, va_list * va) if (max) s = format (s, "%-30v%=17.2e%=16d%=16.2e%=16.2e%=16.2e", - ns, maxc, maxn, maxcn, x, v); + ns, maxc, maxn, maxcn, x, v); else s = format (s, "%-30v%=12s%16Ld%16Ld%16Ld%16.2e%16.2f", ns, state, - c, p, d, x, v); + c, p, d, x, v); if (ns != n->name) vec_free (ns); @@ -205,16 +209,15 @@ static u8 * format_vlib_node_stats (u8 * s, va_list * va) static clib_error_t * show_node_runtime (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { - vlib_node_main_t * nm = &vm->node_main; - vlib_node_t * n; + vlib_node_main_t *nm = &vm->node_main; + vlib_node_t *n; f64 time_now; u32 node_index; - vlib_node_t *** node_dups = 0; - f64 * vectors_per_main_loop = 0; - f64 * last_vector_length_per_node = 0; + vlib_node_t ***node_dups = 0; + f64 *vectors_per_main_loop = 0; + f64 *last_vector_length_per_node = 0; time_now = vlib_time_now (vm); @@ -227,7 +230,7 @@ show_node_runtime (vlib_main_t * vm, } else { - vlib_node_t ** nodes; + vlib_node_t **nodes; uword i, j; f64 dt; u64 n_input, n_output, n_drop, n_punt; @@ -235,143 +238,144 @@ show_node_runtime (vlib_main_t * vm, u64 n_clocks, l, v, c, d; int brief = 1; int max = 0; - vlib_main_t ** stat_vms = 0, *stat_vm; + vlib_main_t **stat_vms = 0, *stat_vm; /* Suppress nodes with zero calls since last clear */ if (unformat (input, "brief") || unformat (input, "b")) - brief = 1; - if (unformat (input, "verbose") || unformat(input, "v")) - brief = 0; - if (unformat (input, "max") || unformat(input, "m")) - max = 1; - - if (vec_len(vlib_mains) == 0) - vec_add1 (stat_vms, vm); + brief = 1; + if (unformat (input, "verbose") || unformat (input, "v")) + brief = 0; + if (unformat (input, "max") || unformat (input, "m")) + max = 1; + + if (vec_len (vlib_mains) == 0) + vec_add1 (stat_vms, vm); else - { - for (i = 0; i < vec_len (vlib_mains); i++) - { - stat_vm = vlib_mains[i]; - if (stat_vm) - vec_add1 (stat_vms, stat_vm); - } - } - - /* + { + for (i = 0; i < vec_len (vlib_mains); i++) + { + stat_vm = vlib_mains[i]; + if (stat_vm) + vec_add1 (stat_vms, stat_vm); + } + } + + /* * Barrier sync across stats scraping. * Otherwise, the counts will be grossly inaccurate. */ - vlib_worker_thread_barrier_sync(vm); + vlib_worker_thread_barrier_sync (vm); for (j = 0; j < vec_len (stat_vms); j++) - { - stat_vm = stat_vms[j]; - nm = &stat_vm->node_main; - - for (i = 0; i < vec_len (nm->nodes); i++) - { - n = nm->nodes[i]; - vlib_node_sync_stats (stat_vm, n); - } - - nodes = vec_dup (nm->nodes); - - vec_add1(node_dups, nodes); - vec_add1 (vectors_per_main_loop, - vlib_last_vectors_per_main_loop_as_f64 (stat_vm)); - vec_add1 (last_vector_length_per_node, - vlib_last_vector_length_per_node (stat_vm)); - } - vlib_worker_thread_barrier_release(vm); + { + stat_vm = stat_vms[j]; + nm = &stat_vm->node_main; + + for (i = 0; i < vec_len (nm->nodes); i++) + { + n = nm->nodes[i]; + vlib_node_sync_stats (stat_vm, n); + } + + nodes = vec_dup (nm->nodes); + + vec_add1 (node_dups, nodes); + vec_add1 (vectors_per_main_loop, + vlib_last_vectors_per_main_loop_as_f64 (stat_vm)); + vec_add1 (last_vector_length_per_node, + vlib_last_vector_length_per_node (stat_vm)); + } + vlib_worker_thread_barrier_release (vm); for (j = 0; j < vec_len (stat_vms); j++) - { - stat_vm = stat_vms[j]; - nodes = node_dups[j]; - - vec_sort_with_function (nodes, node_cmp); - - n_input = n_output = n_drop = n_punt = n_clocks = 0; - n_internal_vectors = n_internal_calls = 0; - for (i = 0; i < vec_len (nodes); i++) - { - n = nodes[i]; - - l = n->stats_total.clocks - n->stats_last_clear.clocks; - n_clocks += l; - - v = n->stats_total.vectors - n->stats_last_clear.vectors; - c = n->stats_total.calls - n->stats_last_clear.calls; - - switch (n->type) - { - default: - continue; - - case VLIB_NODE_TYPE_INTERNAL: - n_output += (n->flags & VLIB_NODE_FLAG_IS_OUTPUT) ? v : 0; - n_drop += (n->flags & VLIB_NODE_FLAG_IS_DROP) ? v : 0; - n_punt += (n->flags & VLIB_NODE_FLAG_IS_PUNT) ? v : 0; - if (! (n->flags & VLIB_NODE_FLAG_IS_OUTPUT)) - { - n_internal_vectors += v; - n_internal_calls += c; - } - if (n->flags & VLIB_NODE_FLAG_IS_HANDOFF) - n_input += v; - break; - - case VLIB_NODE_TYPE_INPUT: - n_input += v; - break; - } - } - - if (vec_len (vlib_mains)) - { - vlib_worker_thread_t *w = vlib_worker_threads + j; - if (j > 0) - vlib_cli_output (vm, "---------------"); - - if ( w->dpdk_lcore_id > -1) - vlib_cli_output (vm, "Thread %d %s (lcore %u)", j, w->name, - w->dpdk_lcore_id); - else - vlib_cli_output (vm, "Thread %d %s", j, - w->name); - } - - dt = time_now - nm->time_last_runtime_stats_clear; - vlib_cli_output - (vm, - "Time %.1f, average vectors/node %.2f, last %d main loops %.2f per node %.2f" - "\n vector rates in %.4e, out %.4e, drop %.4e, punt %.4e", - dt, - (n_internal_calls > 0 - ? (f64) n_internal_vectors / (f64) n_internal_calls - : 0), - 1 << VLIB_LOG2_MAIN_LOOPS_PER_STATS_UPDATE, - vectors_per_main_loop [j], - last_vector_length_per_node [j], - (f64) n_input / dt, - (f64) n_output / dt, - (f64) n_drop / dt, - (f64) n_punt / dt); - - vlib_cli_output (vm, "%U", format_vlib_node_stats, stat_vm, 0, max); - for (i = 0; i < vec_len (nodes); i++) - { - c = nodes[i]->stats_total.calls - nodes[i]->stats_last_clear.calls; - d = nodes[i]->stats_total.suspends - nodes[i]->stats_last_clear.suspends; - if (c || d || ! brief) - { - vlib_cli_output (vm, "%U", format_vlib_node_stats, stat_vm, - nodes[i], max); - } - } - vec_free (nodes); - } + { + stat_vm = stat_vms[j]; + nodes = node_dups[j]; + + vec_sort_with_function (nodes, node_cmp); + + n_input = n_output = n_drop = n_punt = n_clocks = 0; + n_internal_vectors = n_internal_calls = 0; + for (i = 0; i < vec_len (nodes); i++) + { + n = nodes[i]; + + l = n->stats_total.clocks - n->stats_last_clear.clocks; + n_clocks += l; + + v = n->stats_total.vectors - n->stats_last_clear.vectors; + c = n->stats_total.calls - n->stats_last_clear.calls; + + switch (n->type) + { + default: + continue; + + case VLIB_NODE_TYPE_INTERNAL: + n_output += (n->flags & VLIB_NODE_FLAG_IS_OUTPUT) ? v : 0; + n_drop += (n->flags & VLIB_NODE_FLAG_IS_DROP) ? v : 0; + n_punt += (n->flags & VLIB_NODE_FLAG_IS_PUNT) ? v : 0; + if (!(n->flags & VLIB_NODE_FLAG_IS_OUTPUT)) + { + n_internal_vectors += v; + n_internal_calls += c; + } + if (n->flags & VLIB_NODE_FLAG_IS_HANDOFF) + n_input += v; + break; + + case VLIB_NODE_TYPE_INPUT: + n_input += v; + break; + } + } + + if (vec_len (vlib_mains)) + { + vlib_worker_thread_t *w = vlib_worker_threads + j; + if (j > 0) + vlib_cli_output (vm, "---------------"); + + if (w->dpdk_lcore_id > -1) + vlib_cli_output (vm, "Thread %d %s (lcore %u)", j, w->name, + w->dpdk_lcore_id); + else + vlib_cli_output (vm, "Thread %d %s", j, w->name); + } + + dt = time_now - nm->time_last_runtime_stats_clear; + vlib_cli_output + (vm, + "Time %.1f, average vectors/node %.2f, last %d main loops %.2f per node %.2f" + "\n vector rates in %.4e, out %.4e, drop %.4e, punt %.4e", + dt, + (n_internal_calls > 0 + ? (f64) n_internal_vectors / (f64) n_internal_calls + : 0), + 1 << VLIB_LOG2_MAIN_LOOPS_PER_STATS_UPDATE, + vectors_per_main_loop[j], + last_vector_length_per_node[j], + (f64) n_input / dt, + (f64) n_output / dt, (f64) n_drop / dt, (f64) n_punt / dt); + + vlib_cli_output (vm, "%U", format_vlib_node_stats, stat_vm, 0, max); + for (i = 0; i < vec_len (nodes); i++) + { + c = + nodes[i]->stats_total.calls - + nodes[i]->stats_last_clear.calls; + d = + nodes[i]->stats_total.suspends - + nodes[i]->stats_last_clear.suspends; + if (c || d || !brief) + { + vlib_cli_output (vm, "%U", format_vlib_node_stats, stat_vm, + nodes[i], max); + } + } + vec_free (nodes); + } vec_free (stat_vms); vec_free (node_dups); vec_free (vectors_per_main_loop); @@ -381,68 +385,82 @@ show_node_runtime (vlib_main_t * vm, return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (show_node_runtime_command, static) = { .path = "show runtime", .short_help = "Show packet processing runtime", .function = show_node_runtime, .is_mp_safe = 1, }; +/* *INDENT-ON* */ static clib_error_t * clear_node_runtime (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { - vlib_node_main_t * nm; - vlib_node_t * n; + vlib_node_main_t *nm; + vlib_node_t *n; int i, j; - vlib_main_t ** stat_vms = 0, *stat_vm; - vlib_node_runtime_t * r; + vlib_main_t **stat_vms = 0, *stat_vm; + vlib_node_runtime_t *r; - if (vec_len(vlib_mains) == 0) + if (vec_len (vlib_mains) == 0) vec_add1 (stat_vms, vm); else { for (i = 0; i < vec_len (vlib_mains); i++) - { - stat_vm = vlib_mains[i]; - if (stat_vm) - vec_add1 (stat_vms, stat_vm); - } + { + stat_vm = vlib_mains[i]; + if (stat_vm) + vec_add1 (stat_vms, stat_vm); + } } - - vlib_worker_thread_barrier_sync(vm); + + vlib_worker_thread_barrier_sync (vm); for (j = 0; j < vec_len (stat_vms); j++) { stat_vm = stat_vms[j]; nm = &stat_vm->node_main; - + for (i = 0; i < vec_len (nm->nodes); i++) - { - n = nm->nodes[i]; - vlib_node_sync_stats (stat_vm, n); - n->stats_last_clear = n->stats_total; - - r = vlib_node_get_runtime (stat_vm, n->index); - r->max_clock = 0; - } + { + n = nm->nodes[i]; + vlib_node_sync_stats (stat_vm, n); + n->stats_last_clear = n->stats_total; + + r = vlib_node_get_runtime (stat_vm, n->index); + r->max_clock = 0; + } /* Note: input/output rates computed using vlib_global_main */ nm->time_last_runtime_stats_clear = vlib_time_now (vm); } - vlib_worker_thread_barrier_release(vm); - + vlib_worker_thread_barrier_release (vm); + vec_free (stat_vms); return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (clear_node_runtime_command, static) = { .path = "clear runtime", .short_help = "Clear packet processing runtime statistics", .function = clear_node_runtime, }; +/* *INDENT-ON* */ /* Dummy function to get us linked in. */ -void vlib_node_cli_reference (void) {} +void +vlib_node_cli_reference (void) +{ +} + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/node_format.c b/vlib/vlib/node_format.c index d1d415e1376..e9dde40fa70 100644 --- a/vlib/vlib/node_format.c +++ b/vlib/vlib/node_format.c @@ -39,24 +39,24 @@ #include <vlib/vlib.h> -u8 * format_vlib_node_graph (u8 * s, va_list * va) +u8 * +format_vlib_node_graph (u8 * s, va_list * va) { - vlib_node_main_t * nm = va_arg (*va, vlib_node_main_t *); - vlib_node_t * n = va_arg (*va, vlib_node_t *); + vlib_node_main_t *nm = va_arg (*va, vlib_node_main_t *); + vlib_node_t *n = va_arg (*va, vlib_node_t *); int i, j; uword indent; - typedef struct { + typedef struct + { u32 next_node; u32 next_slot; u32 prev_node; } tmp_t; - tmp_t * tmps = 0; - tmp_t empty = { .next_node = ~0, .prev_node = ~0 }; + tmp_t *tmps = 0; + tmp_t empty = {.next_node = ~0,.prev_node = ~0 }; - if (! n) - return format (s, - "%=26s%=26s%=26s", - "Name", "Next", "Previous"); + if (!n) + return format (s, "%=26s%=26s%=26s", "Name", "Next", "Previous"); s = format (s, "%-26v", n->name); @@ -73,11 +73,13 @@ u8 * format_vlib_node_graph (u8 * s, va_list * va) } j = 0; + /* *INDENT-OFF* */ clib_bitmap_foreach (i, n->prev_node_bitmap, ({ vec_validate_init_empty (tmps, j, empty); tmps[j].prev_node = i; j++; })); + /* *INDENT-ON* */ for (i = 0; i < vec_len (tmps); i++) { @@ -86,8 +88,8 @@ u8 * format_vlib_node_graph (u8 * s, va_list * va) if (tmps[i].next_node != ~0) { - vlib_node_t * x; - u8 * t = 0; + vlib_node_t *x; + u8 *t = 0; x = vec_elt (nm->nodes, tmps[i].next_node); t = format (t, "%v [%d]", x->name, tmps[i].next_slot); @@ -99,7 +101,7 @@ u8 * format_vlib_node_graph (u8 * s, va_list * va) if (tmps[i].prev_node != ~0) { - vlib_node_t * x; + vlib_node_t *x; x = vec_elt (nm->nodes, tmps[i].prev_node); s = format (s, "%=26v", x->name); } @@ -110,60 +112,76 @@ u8 * format_vlib_node_graph (u8 * s, va_list * va) return s; } -u8 * format_vlib_node_and_next (u8 * s, va_list * va) +u8 * +format_vlib_node_and_next (u8 * s, va_list * va) { - vlib_main_t * vm = va_arg (*va, vlib_main_t *); - vlib_node_t * n = va_arg (*va, vlib_node_t *); + vlib_main_t *vm = va_arg (*va, vlib_main_t *); + vlib_node_t *n = va_arg (*va, vlib_node_t *); u32 next_index = va_arg (*va, u32); - vlib_node_t * n_next; - u32 * ni; + vlib_node_t *n_next; + u32 *ni; ni = vec_elt_at_index (n->next_nodes, next_index); n_next = vlib_get_node (vm, ni[0]); return format (s, "%v -> %v", n->name, n_next->name); } -u8 * format_vlib_node_name (u8 * s, va_list * va) +u8 * +format_vlib_node_name (u8 * s, va_list * va) { - vlib_main_t * vm = va_arg (*va, vlib_main_t *); + vlib_main_t *vm = va_arg (*va, vlib_main_t *); u32 node_index = va_arg (*va, u32); - vlib_node_t * n = vlib_get_node (vm, node_index); + vlib_node_t *n = vlib_get_node (vm, node_index); return format (s, "%v", n->name); } -u8 * format_vlib_next_node_name (u8 * s, va_list * va) +u8 * +format_vlib_next_node_name (u8 * s, va_list * va) { - vlib_main_t * vm = va_arg (*va, vlib_main_t *); + vlib_main_t *vm = va_arg (*va, vlib_main_t *); u32 node_index = va_arg (*va, u32); u32 next_index = va_arg (*va, u32); - vlib_node_t * next = vlib_get_next_node (vm, node_index, next_index); + vlib_node_t *next = vlib_get_next_node (vm, node_index, next_index); return format (s, "%v", next->name); } /* Parse node name -> node index. */ -uword unformat_vlib_node (unformat_input_t * input, va_list * args) +uword +unformat_vlib_node (unformat_input_t * input, va_list * args) { - vlib_main_t * vm = va_arg (*args, vlib_main_t *); - u32 * result = va_arg (*args, u32 *); + vlib_main_t *vm = va_arg (*args, vlib_main_t *); + u32 *result = va_arg (*args, u32 *); return unformat_user (input, unformat_hash_vec_string, vm->node_main.node_by_name, result); } -u8 * format_vlib_time (u8 * s, va_list * va) +u8 * +format_vlib_time (u8 * s, va_list * va) { CLIB_UNUSED (vlib_main_t * vm) = va_arg (*va, vlib_main_t *); f64 time = va_arg (*va, f64); return format (s, "%12.4f", time); } -u8 * format_vlib_cpu_time (u8 * s, va_list * va) +u8 * +format_vlib_cpu_time (u8 * s, va_list * va) { - vlib_main_t * vm = va_arg (*va, vlib_main_t *); + vlib_main_t *vm = va_arg (*va, vlib_main_t *); u64 cpu_time = va_arg (*va, u64); f64 dt; - - dt = (cpu_time - vm->clib_time.init_cpu_time) * vm->clib_time.seconds_per_clock; + + dt = + (cpu_time - + vm->clib_time.init_cpu_time) * vm->clib_time.seconds_per_clock; return format (s, "%U", format_vlib_time, vm, dt); } + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/node_funcs.h b/vlib/vlib/node_funcs.h index f567ce54909..b5b7dd5f6ba 100644 --- a/vlib/vlib/node_funcs.h +++ b/vlib/vlib/node_funcs.h @@ -37,7 +37,7 @@ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/** \file +/** \file vlib node functions */ @@ -56,7 +56,9 @@ always_inline vlib_node_t * vlib_get_node (vlib_main_t * vm, u32 i) -{ return vec_elt (vm->node_main.nodes, i); } +{ + return vec_elt (vm->node_main.nodes, i); +} /** \brief Get vlib node by graph arc (next) index. @param vm vlib_main_t pointer, varies by thread @@ -68,8 +70,8 @@ vlib_get_node (vlib_main_t * vm, u32 i) always_inline vlib_node_t * vlib_get_next_node (vlib_main_t * vm, u32 node_index, u32 next_index) { - vlib_node_main_t * nm = &vm->node_main; - vlib_node_t * n; + vlib_node_main_t *nm = &vm->node_main; + vlib_node_t *n; n = vec_elt (nm->nodes, node_index); ASSERT (next_index < vec_len (n->next_nodes)); @@ -85,9 +87,9 @@ vlib_get_next_node (vlib_main_t * vm, u32 node_index, u32 next_index) always_inline vlib_node_runtime_t * vlib_node_get_runtime (vlib_main_t * vm, u32 node_index) { - vlib_node_main_t * nm = &vm->node_main; - vlib_node_t * n = vec_elt (nm->nodes, node_index); - vlib_process_t * p; + vlib_node_main_t *nm = &vm->node_main; + vlib_node_t *n = vec_elt (nm->nodes, node_index); + vlib_process_t *p; if (n->type != VLIB_NODE_TYPE_PROCESS) return vec_elt_at_index (nm->nodes_by_type[n->type], n->runtime_index); else @@ -106,7 +108,7 @@ vlib_node_get_runtime (vlib_main_t * vm, u32 node_index) always_inline void * vlib_node_get_runtime_data (vlib_main_t * vm, u32 node_index) { - vlib_node_runtime_t * r = vlib_node_get_runtime (vm, node_index); + vlib_node_runtime_t *r = vlib_node_get_runtime (vm, node_index); return r->runtime_data; } @@ -119,11 +121,10 @@ vlib_node_get_runtime_data (vlib_main_t * vm, u32 node_index) always_inline void vlib_node_set_runtime_data (vlib_main_t * vm, u32 node_index, - void * runtime_data, - u32 n_runtime_data_bytes) + void *runtime_data, u32 n_runtime_data_bytes) { - vlib_node_t * n = vlib_get_node (vm, node_index); - vlib_node_runtime_t * r = vlib_node_get_runtime (vm, node_index); + vlib_node_t *n = vlib_get_node (vm, node_index); + vlib_node_runtime_t *r = vlib_node_get_runtime (vm, node_index); n->runtime_data_bytes = n_runtime_data_bytes; vec_free (n->runtime_data); @@ -140,16 +141,17 @@ vlib_node_set_runtime_data (vlib_main_t * vm, u32 node_index, @param new_state new state for node, see vlib_node_state_t */ always_inline void -vlib_node_set_state (vlib_main_t * vm, u32 node_index, vlib_node_state_t new_state) +vlib_node_set_state (vlib_main_t * vm, u32 node_index, + vlib_node_state_t new_state) { - vlib_node_main_t * nm = &vm->node_main; - vlib_node_t * n; - vlib_node_runtime_t * r; + vlib_node_main_t *nm = &vm->node_main; + vlib_node_t *n; + vlib_node_runtime_t *r; n = vec_elt (nm->nodes, node_index); if (n->type == VLIB_NODE_TYPE_PROCESS) { - vlib_process_t * p = vec_elt (nm->processes, n->runtime_index); + vlib_process_t *p = vec_elt (nm->processes, n->runtime_index); r = &p->node_runtime; /* When disabling make sure flags are cleared. */ @@ -176,8 +178,8 @@ vlib_node_set_state (vlib_main_t * vm, u32 node_index, vlib_node_state_t new_sta always_inline void vlib_node_set_interrupt_pending (vlib_main_t * vm, u32 node_index) { - vlib_node_main_t * nm = &vm->node_main; - vlib_node_t * n = vec_elt (nm->nodes, node_index); + vlib_node_main_t *nm = &vm->node_main; + vlib_node_t *n = vec_elt (nm->nodes, node_index); ASSERT (n->type == VLIB_NODE_TYPE_INPUT); vec_add1 (nm->pending_interrupt_node_runtime_indices, n->runtime_index); } @@ -185,7 +187,7 @@ vlib_node_set_interrupt_pending (vlib_main_t * vm, u32 node_index) always_inline vlib_process_t * vlib_get_process_from_node (vlib_main_t * vm, vlib_node_t * node) { - vlib_node_main_t * nm = &vm->node_main; + vlib_node_main_t *nm = &vm->node_main; ASSERT (node->type == VLIB_NODE_TYPE_PROCESS); return vec_elt (nm->processes, node->runtime_index); } @@ -194,7 +196,7 @@ vlib_get_process_from_node (vlib_main_t * vm, vlib_node_t * node) always_inline vlib_frame_t * vlib_get_frame_no_check (vlib_main_t * vm, uword frame_index) { - vlib_frame_t * f; + vlib_frame_t *f; u32 cpu_index = frame_index & VLIB_CPU_MASK; u32 offset = frame_index & VLIB_OFFSET_MASK; vm = vlib_mains ? vlib_mains[cpu_index] : vm; @@ -207,7 +209,7 @@ vlib_frame_index_no_check (vlib_main_t * vm, vlib_frame_t * f) { u32 i; - ASSERT (((uword)f & VLIB_CPU_MASK)==0); + ASSERT (((uword) f & VLIB_CPU_MASK) == 0); vm = vlib_mains ? vlib_mains[f->cpu_index] : vm; @@ -218,7 +220,7 @@ vlib_frame_index_no_check (vlib_main_t * vm, vlib_frame_t * f) always_inline vlib_frame_t * vlib_get_frame (vlib_main_t * vm, uword frame_index) { - vlib_frame_t * f = vlib_get_frame_no_check (vm, frame_index); + vlib_frame_t *f = vlib_get_frame_no_check (vm, frame_index); ASSERT (f->flags & VLIB_FRAME_IS_ALLOCATED); return f; } @@ -264,23 +266,23 @@ vlib_frame_vector_args (vlib_frame_t * f) */ always_inline void * vlib_frame_args (vlib_frame_t * f) -{ return vlib_frame_vector_args (f) - f->scalar_size; } +{ + return vlib_frame_vector_args (f) - f->scalar_size; +} always_inline vlib_next_frame_t * vlib_node_runtime_get_next_frame (vlib_main_t * vm, - vlib_node_runtime_t * n, - u32 next_index) + vlib_node_runtime_t * n, u32 next_index) { - vlib_node_main_t * nm = &vm->node_main; - vlib_next_frame_t * nf; + vlib_node_main_t *nm = &vm->node_main; + vlib_next_frame_t *nf; ASSERT (next_index < n->n_next_nodes); - nf = vec_elt_at_index (nm->next_frames, - n->next_frame_index + next_index); + nf = vec_elt_at_index (nm->next_frames, n->next_frame_index + next_index); if (CLIB_DEBUG > 0) { - vlib_node_t * node, * next; + vlib_node_t *node, *next; node = vec_elt (nm->nodes, n->node_index); next = vec_elt (nm->nodes, node->next_nodes[next_index]); ASSERT (nf->node_runtime_index == next->runtime_index); @@ -304,24 +306,21 @@ vlib_node_runtime_get_next_frame (vlib_main_t * vm, */ always_inline vlib_next_frame_t * -vlib_node_get_next_frame (vlib_main_t * vm, - u32 node_index, - u32 next_index) +vlib_node_get_next_frame (vlib_main_t * vm, u32 node_index, u32 next_index) { - vlib_node_main_t * nm = &vm->node_main; - vlib_node_t * n; - vlib_node_runtime_t * r; + vlib_node_main_t *nm = &vm->node_main; + vlib_node_t *n; + vlib_node_runtime_t *r; n = vec_elt (nm->nodes, node_index); r = vec_elt_at_index (nm->nodes_by_type[n->type], n->runtime_index); return vlib_node_runtime_get_next_frame (vm, r, next_index); } -vlib_frame_t * -vlib_get_next_frame_internal (vlib_main_t * vm, - vlib_node_runtime_t * node, - u32 next_index, - u32 alloc_new_frame); +vlib_frame_t *vlib_get_next_frame_internal (vlib_main_t * vm, + vlib_node_runtime_t * node, + u32 next_index, + u32 alloc_new_frame); #define vlib_get_next_frame_macro(vm,node,next_index,vectors,n_vectors_left,alloc_new_frame) \ do { \ @@ -334,7 +333,7 @@ do { \ } while (0) -/** \brief Get pointer to next frame vector data by +/** \brief Get pointer to next frame vector data by (@c vlib_node_runtime_t, @c next_index). Standard single/dual loop boilerplate element. @attention This is a MACRO, with SIDE EFFECTS. @@ -366,8 +365,7 @@ do { \ void vlib_put_next_frame (vlib_main_t * vm, vlib_node_runtime_t * r, - u32 next_index, - u32 n_packets_left); + u32 next_index, u32 n_packets_left); /* Combination get plus put. Returns vector argument just added. */ #define vlib_set_next_frame(vm,node,next_index,v) \ @@ -382,43 +380,49 @@ vlib_put_next_frame (vlib_main_t * vm, always_inline void vlib_set_next_frame_buffer (vlib_main_t * vm, vlib_node_runtime_t * node, - u32 next_index, - u32 buffer_index) + u32 next_index, u32 buffer_index) { - u32 * p; + u32 *p; p = vlib_set_next_frame (vm, node, next_index, p); p[0] = buffer_index; } -vlib_frame_t * vlib_get_frame_to_node (vlib_main_t * vm, u32 to_node_index); -void vlib_put_frame_to_node (vlib_main_t * vm, u32 to_node_index, vlib_frame_t * f); +vlib_frame_t *vlib_get_frame_to_node (vlib_main_t * vm, u32 to_node_index); +void vlib_put_frame_to_node (vlib_main_t * vm, u32 to_node_index, + vlib_frame_t * f); always_inline vlib_process_t * vlib_get_current_process (vlib_main_t * vm) { - vlib_node_main_t * nm = &vm->node_main; + vlib_node_main_t *nm = &vm->node_main; return vec_elt (nm->processes, nm->current_process_index); } always_inline uword vlib_in_process_context (vlib_main_t * vm) -{ return vm->node_main.current_process_index != ~0; } +{ + return vm->node_main.current_process_index != ~0; +} always_inline uword vlib_current_process (vlib_main_t * vm) -{ return vlib_get_current_process (vm)->node_runtime.node_index; } +{ + return vlib_get_current_process (vm)->node_runtime.node_index; +} /* Anything less than 1e-6 is considered zero. */ always_inline uword vlib_process_suspend_time_is_zero (f64 dt) -{ return dt < 1e-6; } +{ + return dt < 1e-6; +} always_inline uword vlib_process_suspend (vlib_main_t * vm, f64 dt) { uword r; - vlib_node_main_t * nm = &vm->node_main; - vlib_process_t * p = vec_elt (nm->processes, nm->current_process_index); + vlib_node_main_t *nm = &vm->node_main; + vlib_process_t *p = vec_elt (nm->processes, nm->current_process_index); u64 dt_cpu = dt * vm->clib_time.clocks_per_second; if (vlib_process_suspend_time_is_zero (dt)) @@ -436,9 +440,10 @@ vlib_process_suspend (vlib_main_t * vm, f64 dt) } always_inline void -vlib_process_free_event_type (vlib_process_t * p, uword t, uword is_one_time_event) +vlib_process_free_event_type (vlib_process_t * p, uword t, + uword is_one_time_event) { - ASSERT (! pool_is_free_index (p->event_type_pool, t)); + ASSERT (!pool_is_free_index (p->event_type_pool, t)); pool_put_index (p->event_type_pool, t); if (is_one_time_event) p->one_time_event_type_bitmap = @@ -448,19 +453,20 @@ vlib_process_free_event_type (vlib_process_t * p, uword t, uword is_one_time_eve always_inline void vlib_process_maybe_free_event_type (vlib_process_t * p, uword t) { - ASSERT (! pool_is_free_index (p->event_type_pool, t)); + ASSERT (!pool_is_free_index (p->event_type_pool, t)); if (clib_bitmap_get (p->one_time_event_type_bitmap, t)) vlib_process_free_event_type (p, t, /* is_one_time_event */ 1); } always_inline void * -vlib_process_get_event_data (vlib_main_t * vm, uword * return_event_type_opaque) +vlib_process_get_event_data (vlib_main_t * vm, + uword * return_event_type_opaque) { - vlib_node_main_t * nm = &vm->node_main; - vlib_process_t * p; - vlib_process_event_type_t * et; + vlib_node_main_t *nm = &vm->node_main; + vlib_process_t *p; + vlib_process_event_type_t *et; uword t, l; - void * event_data_vector; + void *event_data_vector; p = vec_elt (nm->processes, nm->current_process_index); @@ -470,7 +476,8 @@ vlib_process_get_event_data (vlib_main_t * vm, uword * return_event_type_opaque) if (t == ~0) return 0; - p->non_empty_event_type_bitmap = clib_bitmap_andnoti (p->non_empty_event_type_bitmap, t); + p->non_empty_event_type_bitmap = + clib_bitmap_andnoti (p->non_empty_event_type_bitmap, t); l = _vec_len (p->pending_event_data_by_type_index[t]); ASSERT (l > 0); @@ -490,9 +497,9 @@ vlib_process_get_event_data (vlib_main_t * vm, uword * return_event_type_opaque) /* Return event data vector for later reuse. We reuse event data to avoid repeatedly allocating event vectors in cases where we care about speed. */ always_inline void -vlib_process_put_event_data (vlib_main_t * vm, void * event_data) +vlib_process_put_event_data (vlib_main_t * vm, void *event_data) { - vlib_node_main_t * nm = &vm->node_main; + vlib_node_main_t *nm = &vm->node_main; vec_add1 (nm->recycled_event_data_vectors, event_data); } @@ -500,9 +507,9 @@ vlib_process_put_event_data (vlib_main_t * vm, void * event_data) always_inline uword vlib_process_get_events (vlib_main_t * vm, uword ** data_vector) { - vlib_node_main_t * nm = &vm->node_main; - vlib_process_t * p; - vlib_process_event_type_t * et; + vlib_node_main_t *nm = &vm->node_main; + vlib_process_t *p; + vlib_process_event_type_t *et; uword r, t, l; p = vec_elt (nm->processes, nm->current_process_index); @@ -513,7 +520,8 @@ vlib_process_get_events (vlib_main_t * vm, uword ** data_vector) if (t == ~0) return t; - p->non_empty_event_type_bitmap = clib_bitmap_andnoti (p->non_empty_event_type_bitmap, t); + p->non_empty_event_type_bitmap = + clib_bitmap_andnoti (p->non_empty_event_type_bitmap, t); l = _vec_len (p->pending_event_data_by_type_index[t]); if (data_vector) @@ -531,11 +539,13 @@ vlib_process_get_events (vlib_main_t * vm, uword ** data_vector) } always_inline uword -vlib_process_get_events_helper (vlib_process_t * p, uword t, uword ** data_vector) +vlib_process_get_events_helper (vlib_process_t * p, uword t, + uword ** data_vector) { uword l; - p->non_empty_event_type_bitmap = clib_bitmap_andnoti (p->non_empty_event_type_bitmap, t); + p->non_empty_event_type_bitmap = + clib_bitmap_andnoti (p->non_empty_event_type_bitmap, t); l = _vec_len (p->pending_event_data_by_type_index[t]); if (data_vector) @@ -553,19 +563,19 @@ always_inline uword vlib_process_get_events_with_type (vlib_main_t * vm, uword ** data_vector, uword with_type_opaque) { - vlib_node_main_t * nm = &vm->node_main; - vlib_process_t * p; - uword t, * h; + vlib_node_main_t *nm = &vm->node_main; + vlib_process_t *p; + uword t, *h; p = vec_elt (nm->processes, nm->current_process_index); h = hash_get (p->event_type_index_by_type_opaque, with_type_opaque); - if (! h) + if (!h) /* This can happen when an event has not yet been signaled with given opaque type. */ return 0; t = h[0]; - if (! clib_bitmap_get (p->non_empty_event_type_bitmap, t)) + if (!clib_bitmap_get (p->non_empty_event_type_bitmap, t)) return 0; return vlib_process_get_events_helper (p, t, data_vector); @@ -574,17 +584,19 @@ vlib_process_get_events_with_type (vlib_main_t * vm, uword ** data_vector, always_inline uword * vlib_process_wait_for_event (vlib_main_t * vm) { - vlib_node_main_t * nm = &vm->node_main; - vlib_process_t * p; + vlib_node_main_t *nm = &vm->node_main; + vlib_process_t *p; uword r; p = vec_elt (nm->processes, nm->current_process_index); if (clib_bitmap_is_zero (p->non_empty_event_type_bitmap)) { p->flags |= VLIB_PROCESS_IS_SUSPENDED_WAITING_FOR_EVENT; - r = clib_setjmp (&p->resume_longjmp, VLIB_PROCESS_RESUME_LONGJMP_SUSPEND); + r = + clib_setjmp (&p->resume_longjmp, VLIB_PROCESS_RESUME_LONGJMP_SUSPEND); if (r == VLIB_PROCESS_RESUME_LONGJMP_SUSPEND) - clib_longjmp (&p->return_longjmp, VLIB_PROCESS_RETURN_LONGJMP_SUSPEND); + clib_longjmp (&p->return_longjmp, + VLIB_PROCESS_RETURN_LONGJMP_SUSPEND); } return p->non_empty_event_type_bitmap; @@ -595,18 +607,20 @@ vlib_process_wait_for_one_time_event (vlib_main_t * vm, uword ** data_vector, uword with_type_index) { - vlib_node_main_t * nm = &vm->node_main; - vlib_process_t * p; + vlib_node_main_t *nm = &vm->node_main; + vlib_process_t *p; uword r; p = vec_elt (nm->processes, nm->current_process_index); - ASSERT (! pool_is_free_index (p->event_type_pool, with_type_index)); - while (! clib_bitmap_get (p->non_empty_event_type_bitmap, with_type_index)) + ASSERT (!pool_is_free_index (p->event_type_pool, with_type_index)); + while (!clib_bitmap_get (p->non_empty_event_type_bitmap, with_type_index)) { p->flags |= VLIB_PROCESS_IS_SUSPENDED_WAITING_FOR_EVENT; - r = clib_setjmp (&p->resume_longjmp, VLIB_PROCESS_RESUME_LONGJMP_SUSPEND); + r = + clib_setjmp (&p->resume_longjmp, VLIB_PROCESS_RESUME_LONGJMP_SUSPEND); if (r == VLIB_PROCESS_RESUME_LONGJMP_SUSPEND) - clib_longjmp (&p->return_longjmp, VLIB_PROCESS_RETURN_LONGJMP_SUSPEND); + clib_longjmp (&p->return_longjmp, + VLIB_PROCESS_RETURN_LONGJMP_SUSPEND); } return vlib_process_get_events_helper (p, with_type_index, data_vector); @@ -617,21 +631,23 @@ vlib_process_wait_for_event_with_type (vlib_main_t * vm, uword ** data_vector, uword with_type_opaque) { - vlib_node_main_t * nm = &vm->node_main; - vlib_process_t * p; - uword r, * h; + vlib_node_main_t *nm = &vm->node_main; + vlib_process_t *p; + uword r, *h; p = vec_elt (nm->processes, nm->current_process_index); h = hash_get (p->event_type_index_by_type_opaque, with_type_opaque); - while (! h || ! clib_bitmap_get (p->non_empty_event_type_bitmap, h[0])) + while (!h || !clib_bitmap_get (p->non_empty_event_type_bitmap, h[0])) { p->flags |= VLIB_PROCESS_IS_SUSPENDED_WAITING_FOR_EVENT; - r = clib_setjmp (&p->resume_longjmp, VLIB_PROCESS_RESUME_LONGJMP_SUSPEND); + r = + clib_setjmp (&p->resume_longjmp, VLIB_PROCESS_RESUME_LONGJMP_SUSPEND); if (r == VLIB_PROCESS_RESUME_LONGJMP_SUSPEND) - clib_longjmp (&p->return_longjmp, VLIB_PROCESS_RETURN_LONGJMP_SUSPEND); + clib_longjmp (&p->return_longjmp, + VLIB_PROCESS_RETURN_LONGJMP_SUSPEND); /* See if unknown event type has been signaled now. */ - if (! h) + if (!h) h = hash_get (p->event_type_index_by_type_opaque, with_type_opaque); } @@ -641,15 +657,15 @@ vlib_process_wait_for_event_with_type (vlib_main_t * vm, always_inline f64 vlib_process_wait_for_event_or_clock (vlib_main_t * vm, f64 dt) { - vlib_node_main_t * nm = &vm->node_main; - vlib_process_t * p; + vlib_node_main_t *nm = &vm->node_main; + vlib_process_t *p; f64 wakeup_time; uword r; p = vec_elt (nm->processes, nm->current_process_index); if (vlib_process_suspend_time_is_zero (dt) - || ! clib_bitmap_is_zero (p->non_empty_event_type_bitmap)) + || !clib_bitmap_is_zero (p->non_empty_event_type_bitmap)) return dt; wakeup_time = vlib_time_now (vm) + dt; @@ -674,33 +690,36 @@ vlib_process_wait_for_event_or_clock (vlib_main_t * vm, f64 dt) always_inline vlib_process_event_type_t * vlib_process_new_event_type (vlib_process_t * p, uword with_type_opaque) { - vlib_process_event_type_t * et; + vlib_process_event_type_t *et; pool_get (p->event_type_pool, et); et->opaque = with_type_opaque; return et; } always_inline uword -vlib_process_create_one_time_event (vlib_main_t * vm, uword node_index, uword with_type_opaque) +vlib_process_create_one_time_event (vlib_main_t * vm, uword node_index, + uword with_type_opaque) { - vlib_node_main_t * nm = &vm->node_main; - vlib_node_t * n = vlib_get_node (vm, node_index); - vlib_process_t * p = vec_elt (nm->processes, n->runtime_index); - vlib_process_event_type_t * et; + vlib_node_main_t *nm = &vm->node_main; + vlib_node_t *n = vlib_get_node (vm, node_index); + vlib_process_t *p = vec_elt (nm->processes, n->runtime_index); + vlib_process_event_type_t *et; uword t; et = vlib_process_new_event_type (p, with_type_opaque); t = et - p->event_type_pool; - p->one_time_event_type_bitmap = clib_bitmap_ori (p->one_time_event_type_bitmap, t); + p->one_time_event_type_bitmap = + clib_bitmap_ori (p->one_time_event_type_bitmap, t); return t; } always_inline void -vlib_process_delete_one_time_event (vlib_main_t * vm, uword node_index, uword t) +vlib_process_delete_one_time_event (vlib_main_t * vm, uword node_index, + uword t) { - vlib_node_main_t * nm = &vm->node_main; - vlib_node_t * n = vlib_get_node (vm, node_index); - vlib_process_t * p = vec_elt (nm->processes, n->runtime_index); + vlib_node_main_t *nm = &vm->node_main; + vlib_node_t *n = vlib_get_node (vm, node_index); + vlib_process_t *p = vec_elt (nm->processes, n->runtime_index); ASSERT (clib_bitmap_get (p->one_time_event_type_bitmap, t)); vlib_process_free_event_type (p, t, /* is_one_time_event */ 1); @@ -711,22 +730,21 @@ vlib_process_signal_event_helper (vlib_node_main_t * nm, vlib_node_t * n, vlib_process_t * p, uword t, - uword n_data_elts, - uword n_data_elt_bytes) + uword n_data_elts, uword n_data_elt_bytes) { uword p_flags, add_to_pending, delete_from_wheel; - void * data_to_be_written_by_caller; + void *data_to_be_written_by_caller; - ASSERT (! pool_is_free_index (p->event_type_pool, t)); + ASSERT (!pool_is_free_index (p->event_type_pool, t)); vec_validate (p->pending_event_data_by_type_index, t); /* Resize data vector and return caller's data to be written. */ { - void * data_vec = p->pending_event_data_by_type_index[t]; + void *data_vec = p->pending_event_data_by_type_index[t]; uword l; - if (! data_vec && vec_len (nm->recycled_event_data_vectors)) + if (!data_vec && vec_len (nm->recycled_event_data_vectors)) { data_vec = vec_pop (nm->recycled_event_data_vectors); _vec_len (data_vec) = 0; @@ -736,14 +754,16 @@ vlib_process_signal_event_helper (vlib_node_main_t * nm, data_vec = _vec_resize (data_vec, /* length_increment */ n_data_elts, - /* total size after increment */ (l + n_data_elts) * n_data_elt_bytes, + /* total size after increment */ + (l + n_data_elts) * n_data_elt_bytes, /* header_bytes */ 0, /* data_align */ 0); p->pending_event_data_by_type_index[t] = data_vec; data_to_be_written_by_caller = data_vec + l * n_data_elt_bytes; } - p->non_empty_event_type_bitmap = clib_bitmap_ori (p->non_empty_event_type_bitmap, t); + p->non_empty_event_type_bitmap = + clib_bitmap_ori (p->non_empty_event_type_bitmap, t); p_flags = p->flags; @@ -773,7 +793,7 @@ vlib_process_signal_event_helper (vlib_node_main_t * nm, p->flags = p_flags | VLIB_PROCESS_RESUME_PENDING; vec_add1 (nm->data_from_advancing_timing_wheel, x); if (delete_from_wheel) - timing_wheel_delete (&nm->timing_wheel, x); + timing_wheel_delete (&nm->timing_wheel, x); } return data_to_be_written_by_caller; @@ -783,25 +803,26 @@ always_inline void * vlib_process_signal_event_data (vlib_main_t * vm, uword node_index, uword type_opaque, - uword n_data_elts, - uword n_data_elt_bytes) + uword n_data_elts, uword n_data_elt_bytes) { - vlib_node_main_t * nm = &vm->node_main; - vlib_node_t * n = vlib_get_node (vm, node_index); - vlib_process_t * p = vec_elt (nm->processes, n->runtime_index); - uword * h, t; + vlib_node_main_t *nm = &vm->node_main; + vlib_node_t *n = vlib_get_node (vm, node_index); + vlib_process_t *p = vec_elt (nm->processes, n->runtime_index); + uword *h, t; h = hash_get (p->event_type_index_by_type_opaque, type_opaque); - if (! h) + if (!h) { - vlib_process_event_type_t * et = vlib_process_new_event_type (p, type_opaque); + vlib_process_event_type_t *et = + vlib_process_new_event_type (p, type_opaque); t = et - p->event_type_pool; hash_set (p->event_type_index_by_type_opaque, type_opaque, t); } else t = h[0]; - return vlib_process_signal_event_helper (nm, n, p, t, n_data_elts, n_data_elt_bytes); + return vlib_process_signal_event_helper (nm, n, p, t, n_data_elts, + n_data_elt_bytes); } always_inline void * @@ -809,18 +830,18 @@ vlib_process_signal_event_at_time (vlib_main_t * vm, f64 dt, uword node_index, uword type_opaque, - uword n_data_elts, - uword n_data_elt_bytes) + uword n_data_elts, uword n_data_elt_bytes) { - vlib_node_main_t * nm = &vm->node_main; - vlib_node_t * n = vlib_get_node (vm, node_index); - vlib_process_t * p = vec_elt (nm->processes, n->runtime_index); - uword * h, t; + vlib_node_main_t *nm = &vm->node_main; + vlib_node_t *n = vlib_get_node (vm, node_index); + vlib_process_t *p = vec_elt (nm->processes, n->runtime_index); + uword *h, t; h = hash_get (p->event_type_index_by_type_opaque, type_opaque); - if (! h) + if (!h) { - vlib_process_event_type_t * et = vlib_process_new_event_type (p, type_opaque); + vlib_process_event_type_t *et = + vlib_process_new_event_type (p, type_opaque); t = et - p->event_type_pool; hash_set (p->event_type_index_by_type_opaque, type_opaque, t); } @@ -828,10 +849,11 @@ vlib_process_signal_event_at_time (vlib_main_t * vm, t = h[0]; if (vlib_process_suspend_time_is_zero (dt)) - return vlib_process_signal_event_helper (nm, n, p, t, n_data_elts, n_data_elt_bytes); + return vlib_process_signal_event_helper (nm, n, p, t, n_data_elts, + n_data_elt_bytes); else { - vlib_signal_timed_event_data_t * te; + vlib_signal_timed_event_data_t *te; u64 dt_cpu = dt * vm->clib_time.clocks_per_second; pool_get_aligned (nm->signal_timed_event_data_pool, te, sizeof (te[0])); @@ -849,7 +871,9 @@ vlib_process_signal_event_at_time (vlib_main_t * vm, te->event_type_index = t; timing_wheel_insert (&nm->timing_wheel, clib_cpu_time_now () + dt_cpu, - vlib_timing_wheel_data_set_timed_event (te - nm->signal_timed_event_data_pool)); + vlib_timing_wheel_data_set_timed_event (te - + nm-> + signal_timed_event_data_pool)); /* Inline data big enough to hold event? */ if (te->n_data_bytes < sizeof (te->inline_event_data)) @@ -870,68 +894,70 @@ vlib_process_signal_one_time_event_data (vlib_main_t * vm, uword n_data_elts, uword n_data_elt_bytes) { - vlib_node_main_t * nm = &vm->node_main; - vlib_node_t * n = vlib_get_node (vm, node_index); - vlib_process_t * p = vec_elt (nm->processes, n->runtime_index); - return vlib_process_signal_event_helper (nm, n, p, type_index, n_data_elts, n_data_elt_bytes); + vlib_node_main_t *nm = &vm->node_main; + vlib_node_t *n = vlib_get_node (vm, node_index); + vlib_process_t *p = vec_elt (nm->processes, n->runtime_index); + return vlib_process_signal_event_helper (nm, n, p, type_index, n_data_elts, + n_data_elt_bytes); } always_inline void vlib_process_signal_event (vlib_main_t * vm, - uword node_index, - uword type_opaque, - uword data) + uword node_index, uword type_opaque, uword data) { - uword * d = vlib_process_signal_event_data (vm, node_index, type_opaque, - 1 /* elts */, sizeof (uword)); + uword *d = vlib_process_signal_event_data (vm, node_index, type_opaque, + 1 /* elts */ , sizeof (uword)); d[0] = data; } always_inline void vlib_process_signal_event_pointer (vlib_main_t * vm, uword node_index, - uword type_opaque, - void * data) + uword type_opaque, void *data) { - void ** d = vlib_process_signal_event_data (vm, node_index, type_opaque, - 1 /* elts */, sizeof (data)); + void **d = vlib_process_signal_event_data (vm, node_index, type_opaque, + 1 /* elts */ , sizeof (data)); d[0] = data; } always_inline void vlib_process_signal_one_time_event (vlib_main_t * vm, uword node_index, - uword type_index, - uword data) + uword type_index, uword data) { - uword * d = vlib_process_signal_one_time_event_data (vm, node_index, type_index, - 1 /* elts */, sizeof (uword)); + uword *d = + vlib_process_signal_one_time_event_data (vm, node_index, type_index, + 1 /* elts */ , sizeof (uword)); d[0] = data; } always_inline void -vlib_signal_one_time_waiting_process (vlib_main_t * vm, vlib_one_time_waiting_process_t * p) +vlib_signal_one_time_waiting_process (vlib_main_t * vm, + vlib_one_time_waiting_process_t * p) { - vlib_process_signal_one_time_event (vm, p->node_index, p->one_time_event, /* data */ ~0); + vlib_process_signal_one_time_event (vm, p->node_index, p->one_time_event, + /* data */ ~0); memset (p, ~0, sizeof (p[0])); } always_inline void vlib_signal_one_time_waiting_process_vector (vlib_main_t * vm, - vlib_one_time_waiting_process_t ** wps) + vlib_one_time_waiting_process_t + ** wps) { - vlib_one_time_waiting_process_t * wp; - vec_foreach (wp, *wps) - vlib_signal_one_time_waiting_process (vm, wp); + vlib_one_time_waiting_process_t *wp; + vec_foreach (wp, *wps) vlib_signal_one_time_waiting_process (vm, wp); vec_free (*wps); } always_inline void -vlib_current_process_wait_for_one_time_event (vlib_main_t * vm, vlib_one_time_waiting_process_t * p) +vlib_current_process_wait_for_one_time_event (vlib_main_t * vm, + vlib_one_time_waiting_process_t + * p) { p->node_index = vlib_current_process (vm); - p->one_time_event = - vlib_process_create_one_time_event (vm, p->node_index, /* type opaque */ ~0); + p->one_time_event = vlib_process_create_one_time_event (vm, p->node_index, /* type opaque */ + ~0); vlib_process_wait_for_one_time_event (vm, /* don't care about data */ 0, p->one_time_event); @@ -939,9 +965,10 @@ vlib_current_process_wait_for_one_time_event (vlib_main_t * vm, vlib_one_time_wa always_inline void vlib_current_process_wait_for_one_time_event_vector (vlib_main_t * vm, - vlib_one_time_waiting_process_t ** wps) + vlib_one_time_waiting_process_t + ** wps) { - vlib_one_time_waiting_process_t * wp; + vlib_one_time_waiting_process_t *wp; vec_add2 (*wps, wp, 1); vlib_current_process_wait_for_one_time_event (vm, wp); } @@ -960,7 +987,9 @@ vlib_node_runtime_update_main_loop_vector_stats (vlib_main_t * vm, i0 = i ^ 0; i1 = i ^ 1; d = ((vm->main_loop_count >> VLIB_LOG2_MAIN_LOOPS_PER_STATS_UPDATE) - - (node->main_loop_count_last_dispatch >> VLIB_LOG2_MAIN_LOOPS_PER_STATS_UPDATE)); + - + (node->main_loop_count_last_dispatch >> + VLIB_LOG2_MAIN_LOOPS_PER_STATS_UPDATE)); vi0 = node->main_loop_vector_stats[i0]; vi1 = node->main_loop_vector_stats[i1]; vi0 = d == 0 ? vi0 : 0; @@ -976,59 +1005,57 @@ vlib_node_runtime_update_main_loop_vector_stats (vlib_main_t * vm, always_inline f64 vlib_node_vectors_per_main_loop_as_float (vlib_main_t * vm, u32 node_index) { - vlib_node_runtime_t * rt = vlib_node_get_runtime (vm, node_index); + vlib_node_runtime_t *rt = vlib_node_get_runtime (vm, node_index); u32 v; - v = vlib_node_runtime_update_main_loop_vector_stats (vm, rt, /* n_vectors */ 0); + v = vlib_node_runtime_update_main_loop_vector_stats (vm, rt, /* n_vectors */ + 0); return (f64) v / (1 << VLIB_LOG2_MAIN_LOOPS_PER_STATS_UPDATE); } always_inline u32 vlib_node_vectors_per_main_loop_as_integer (vlib_main_t * vm, u32 node_index) { - vlib_node_runtime_t * rt = vlib_node_get_runtime (vm, node_index); + vlib_node_runtime_t *rt = vlib_node_get_runtime (vm, node_index); u32 v; - v = vlib_node_runtime_update_main_loop_vector_stats (vm, rt, /* n_vectors */ 0); + v = vlib_node_runtime_update_main_loop_vector_stats (vm, rt, /* n_vectors */ + 0); return v >> VLIB_LOG2_MAIN_LOOPS_PER_STATS_UPDATE; } void -vlib_frame_free (vlib_main_t * vm, - vlib_node_runtime_t * r, - vlib_frame_t * f); +vlib_frame_free (vlib_main_t * vm, vlib_node_runtime_t * r, vlib_frame_t * f); /* Add next node to given node in given slot. */ uword vlib_node_add_next_with_slot (vlib_main_t * vm, - uword node, - uword next_node, - uword slot); + uword node, uword next_node, uword slot); /* As above but adds to end of node's next vector. */ always_inline uword vlib_node_add_next (vlib_main_t * vm, uword node, uword next_node) -{ return vlib_node_add_next_with_slot (vm, node, next_node, ~0); } +{ + return vlib_node_add_next_with_slot (vm, node, next_node, ~0); +} /* Add next node to given node in given slot. */ uword vlib_node_add_named_next_with_slot (vlib_main_t * vm, - uword node, - char * next_name, - uword slot); + uword node, char *next_name, uword slot); /* As above but adds to end of node's next vector. */ always_inline uword -vlib_node_add_named_next (vlib_main_t * vm, - uword node, - char * name) -{ return vlib_node_add_named_next_with_slot (vm, node, name, ~0); } +vlib_node_add_named_next (vlib_main_t * vm, uword node, char *name) +{ + return vlib_node_add_named_next_with_slot (vm, node, name, ~0); +} /* Query node given name. */ -vlib_node_t * vlib_get_node_by_name (vlib_main_t * vm, u8 * name); +vlib_node_t *vlib_get_node_by_name (vlib_main_t * vm, u8 * name); /* Rename a node. */ -void vlib_node_rename (vlib_main_t * vm, u32 node_index, char * fmt, ...); +void vlib_node_rename (vlib_main_t * vm, u32 node_index, char *fmt, ...); /* Register new packet processing node. Nodes can be registered dynamically via this call or statically via the VLIB_REGISTER_NODE @@ -1042,11 +1069,10 @@ void vlib_register_all_static_nodes (vlib_main_t * vm); void vlib_start_process (vlib_main_t * vm, uword process_index); /* Sync up runtime and main node stats. */ -void -vlib_node_sync_stats (vlib_main_t * vm, vlib_node_t * n); +void vlib_node_sync_stats (vlib_main_t * vm, vlib_node_t * n); /* Node graph initialization function. */ -clib_error_t * vlib_node_main_init (vlib_main_t * vm); +clib_error_t *vlib_node_main_init (vlib_main_t * vm); format_function_t format_vlib_node_graph; format_function_t format_vlib_node_name; @@ -1057,14 +1083,22 @@ format_function_t format_vlib_time; /* Parse node name -> node index. */ unformat_function_t unformat_vlib_node; -always_inline void -vlib_node_increment_counter (vlib_main_t *vm, u32 node_index, - u32 counter_index, u64 increment) +always_inline void +vlib_node_increment_counter (vlib_main_t * vm, u32 node_index, + u32 counter_index, u64 increment) { - vlib_node_t * n = vlib_get_node (vm, node_index); - vlib_error_main_t * em = &vm->error_main; + vlib_node_t *n = vlib_get_node (vm, node_index); + vlib_error_main_t *em = &vm->error_main; u32 node_counter_base_index = n->error_heap_index; em->counters[node_counter_base_index + counter_index] += increment; } #endif /* included_vlib_node_funcs_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/parse.c b/vlib/vlib/parse.c index cea8f7515a0..1c4500ce85a 100644 --- a/vlib/vlib/parse.c +++ b/vlib/vlib/parse.c @@ -17,10 +17,11 @@ #define PARSE_DEBUG 0 u16 word_type_index, number_type_index, eof_type_index, rule_eof_type_index, - plus_type_index, minus_type_index, star_type_index, slash_type_index, - lpar_type_index, rpar_type_index; + plus_type_index, minus_type_index, star_type_index, slash_type_index, + lpar_type_index, rpar_type_index; -u8 * format_vlib_parse_value (u8 * s, va_list * args) +u8 * +format_vlib_parse_value (u8 * s, va_list * args) { vlib_parse_main_t *pm = va_arg (*args, vlib_parse_main_t *); vlib_parse_type_t *type; @@ -29,37 +30,41 @@ u8 * format_vlib_parse_value (u8 * s, va_list * args) s = format (s, "%d items:\n", vec_len (pm->parse_value)); vec_foreach (v, pm->parse_value) - { - type_index = v->type; - type = pool_elt_at_index (pm->parse_types, type_index); - if (type->format_value) - s = format (s, "[%d]: %U\n", v - pm->parse_value, - type->format_value, v); - else - s = format (s, "[%d]: (nofun)\n", v - pm->parse_value); - } + { + type_index = v->type; + type = pool_elt_at_index (pm->parse_types, type_index); + if (type->format_value) + s = format (s, "[%d]: %U\n", v - pm->parse_value, + type->format_value, v); + else + s = format (s, "[%d]: (nofun)\n", v - pm->parse_value); + } return s; } -static u8 * format_vlib_parse_match (u8 * s, va_list * args) +static u8 * +format_vlib_parse_match (u8 * s, va_list * args) { vlib_parse_match_t m = va_arg (*args, vlib_parse_match_t); - char * t = 0; + char *t = 0; switch (m) { #define _(a) case VLIB_PARSE_##a: t = #a; break; foreach_parse_match_type #undef _ - default: t = 0; break; + default: + t = 0; + break; } - + if (t) return format (s, "%s", t); else return format (s, "unknown 0x%x", m); } -static u8 * format_vlib_parse_item (u8 * s, va_list * args) +static u8 * +format_vlib_parse_item (u8 * s, va_list * args) { vlib_parse_main_t *pm = va_arg (*args, vlib_parse_main_t *); vlib_parse_item_t *item = va_arg (*args, vlib_parse_item_t *); @@ -72,7 +77,8 @@ static u8 * format_vlib_parse_item (u8 * s, va_list * args) return s; } -static u8 * format_vlib_parse_graph (u8 * s, va_list * args) +static u8 * +format_vlib_parse_graph (u8 * s, va_list * args) { vlib_parse_main_t *pm = va_arg (*args, vlib_parse_main_t *); vlib_parse_graph_t *node = va_arg (*args, vlib_parse_graph_t *); @@ -80,11 +86,13 @@ static u8 * format_vlib_parse_graph (u8 * s, va_list * args) vlib_parse_type_t *type; /* $$$ hash table */ - pool_foreach (type, pm->parse_types, + /* *INDENT-OFF* */ + pool_foreach (type, pm->parse_types, ({ if (type->rule_index == node - pm->parse_graph) s = format (s, "\n<%s>\n", type->name); })); +/* *INDENT-ON* */ if (pm->root_index == (node - pm->parse_graph)) s = format (s, "\n<root>\n"); @@ -94,12 +102,12 @@ static u8 * format_vlib_parse_graph (u8 * s, va_list * args) s = format (s, "[%d] %U ", node - pm->parse_graph, format_vlib_parse_item, pm, item); - if (node->peer == (u32)~0) + if (node->peer == (u32) ~ 0) s = format (s, "peer nil "); else s = format (s, "peer %4u ", node->peer); - if (node->deeper == (u32)~0) + if (node->deeper == (u32) ~ 0) s = format (s, "deeper nil "); else s = format (s, "deeper %4u ", node->deeper); @@ -107,78 +115,81 @@ static u8 * format_vlib_parse_graph (u8 * s, va_list * args) return s; } -void dump_parse_graph (void) +void +dump_parse_graph (void) { vlib_parse_main_t *pm = &vlib_parse_main; vlib_parse_graph_t *node; + /* *INDENT-OFF* */ pool_foreach (node, pm->parse_graph, ({ fformat(stdout, "%U\n", format_vlib_parse_graph, pm, node); })); +/* *INDENT-ON* */ } always_inline void -parse_cleanup_value (vlib_parse_main_t *pm, vlib_parse_value_t *pv) +parse_cleanup_value (vlib_parse_main_t * pm, vlib_parse_value_t * pv) { vlib_parse_type_t *type = pool_elt_at_index (pm->parse_types, pv->type); if (type->value_cleanup_function) type->value_cleanup_function (pv); } -static void parse_reset (vlib_parse_main_t *pm, u8 *input) +static void +parse_reset (vlib_parse_main_t * pm, u8 * input) { vlib_lex_token_t *t; vlib_parse_value_t *pv; vlib_lex_reset (pm->lex_main, input); - vec_foreach (t, pm->tokens) - vlib_lex_cleanup_token (t); + vec_foreach (t, pm->tokens) vlib_lex_cleanup_token (t); - vec_foreach (pv, pm->parse_value) - parse_cleanup_value (pm, pv); + vec_foreach (pv, pm->parse_value) parse_cleanup_value (pm, pv); _vec_len (pm->parse_value) = 0; _vec_len (pm->tokens) = 0; pm->current_token_index = 0; } -static void parse_help (vlib_parse_main_t *pm, u32 index) +static void +parse_help (vlib_parse_main_t * pm, u32 index) { vlib_parse_graph_t *node; - vlib_parse_item_t *item; - vlib_parse_type_t *type; + vlib_parse_item_t *item; + vlib_parse_type_t *type; vlib_main_t *vm = pm->vlib_main; u8 *help_input; int i; - + help_input = vec_dup (pm->lex_main->input_vector); - for (i = vec_len(help_input)-1; i >= 0; i--) + for (i = vec_len (help_input) - 1; i >= 0; i--) if (help_input[i] == '?') { help_input[i] = 0; - _vec_len(help_input) = i; + _vec_len (help_input) = i; break; } - for (i = vec_len(help_input)-1; i >= 0; i--) + for (i = vec_len (help_input) - 1; i >= 0; i--) { if (help_input[i] != ' ' && help_input[i] != '\t') break; help_input[i] = 0; break; } - _vec_len(help_input) = i+1; + _vec_len (help_input) = i + 1; - while (index != (u32)~0) + while (index != (u32) ~ 0) { node = pool_elt_at_index (pm->parse_graph, index); item = pool_elt_at_index (pm->parse_items, node->item); type = pool_elt_at_index (pm->parse_types, item->type); - + if (item->type == eof_type_index && vec_len (pm->match_items) == 0) - /* do nothing */; + /* do nothing */ ; else if (item->type == word_type_index) vlib_cli_output (vm, "%s %s\n", help_input, item->value.as_pointer); else @@ -189,26 +200,26 @@ static void parse_help (vlib_parse_main_t *pm, u32 index) } static vlib_parse_match_t -parse_eval_internal (vlib_parse_main_t *pm, u32 index) +parse_eval_internal (vlib_parse_main_t * pm, u32 index) { vlib_parse_graph_t *node; - vlib_parse_item_t *item; - vlib_parse_type_t *type; + vlib_parse_item_t *item; + vlib_parse_type_t *type; vlib_parse_value_t value, *pv; vlib_parse_match_t rv; u32 *partial_matches = 0; vlib_lex_token_t *t; - u32 save_token_index=(u32)~0, save_match_items=0; + u32 save_token_index = (u32) ~ 0, save_match_items = 0; int had_value = 0; - if (pm->current_token_index >= vec_len(pm->tokens)) + if (pm->current_token_index >= vec_len (pm->tokens)) return VLIB_PARSE_MATCH_FAIL; /* current token */ t = vec_elt_at_index (pm->tokens, pm->current_token_index); /* Help ? */ - if (PREDICT_FALSE(t->token == VLIB_LEX_qmark)) + if (PREDICT_FALSE (t->token == VLIB_LEX_qmark)) { parse_help (pm, index); _vec_len (pm->match_items) = 0; @@ -216,107 +227,106 @@ parse_eval_internal (vlib_parse_main_t *pm, u32 index) } /* Across all peers at this level of the parse graph */ - while (index != (u32)~0) + while (index != (u32) ~ 0) { node = pool_elt_at_index (pm->parse_graph, index); item = pool_elt_at_index (pm->parse_items, node->item); type = pool_elt_at_index (pm->parse_types, item->type); - - /* + + /* * Save the token index. We may have to back up several - * trie plies. Type-specific match functions can consume + * trie plies. Type-specific match functions can consume * multiple tokens, and they may not be optimally careful */ save_token_index = pm->current_token_index; save_match_items = vec_len (pm->match_items); vec_add1 (pm->match_items, node->item); - + if (PARSE_DEBUG > 1) - clib_warning ("Try to match token %U against node %d", - format_vlib_lex_token, pm->lex_main, t, index); - + clib_warning ("Try to match token %U against node %d", + format_vlib_lex_token, pm->lex_main, t, index); + /* Call the type-specific match function */ rv = type->match_function (pm, type, t, &value); - + if (PARSE_DEBUG > 1) - clib_warning ("returned %U", format_vlib_parse_match, rv); - + clib_warning ("returned %U", format_vlib_parse_match, rv); + switch (rv) - { - case VLIB_PARSE_MATCH_VALUE: - /* - * Matched, and returned a value to append to the - * set of args passed to the action function - */ - value.type = item->type; - vec_add1 (pm->parse_value, value); - had_value = 1; - /* fallthrough */ - - case VLIB_PARSE_MATCH_FULL: - unambiguous_partial_match: - /* Consume the matched token */ - pm->current_token_index++; - - /* continue matching along this path */ - rv = parse_eval_internal (pm, node->deeper); - - /* this is not the right path */ - if (rv == VLIB_PARSE_MATCH_FAIL) - { - if (had_value) - { - /* Delete the value */ - value = pm->parse_value [vec_len (pm->parse_value)-1]; - parse_cleanup_value (pm, &value); - _vec_len (pm->parse_value) -= 1; - } - /* Continue with the next sibling */ - pm->current_token_index = save_token_index; - _vec_len (pm->match_items) = save_match_items; - index = node->peer; - break; - } - return rv; - - case VLIB_PARSE_MATCH_PARTIAL: - /* Partial (substring) match, remember it but keep going */ - vec_add1 (partial_matches, node - pm->parse_graph); - index = node->peer; - break; - - case VLIB_PARSE_MATCH_FAIL: - /* Continue with the next sibling */ - index = node->peer; - _vec_len (pm->match_items) = save_match_items; - break; - - case VLIB_PARSE_MATCH_DONE: - /* Parse complete, invoke the action function */ - if (PARSE_DEBUG > 0) - clib_warning ("parse_value: %U", format_vlib_parse_value, pm); - - { - vlib_parse_eval_function_t * f = item->value.as_pointer; - if (f) + { + case VLIB_PARSE_MATCH_VALUE: + /* + * Matched, and returned a value to append to the + * set of args passed to the action function + */ + value.type = item->type; + vec_add1 (pm->parse_value, value); + had_value = 1; + /* fallthrough */ + + case VLIB_PARSE_MATCH_FULL: + unambiguous_partial_match: + /* Consume the matched token */ + pm->current_token_index++; + + /* continue matching along this path */ + rv = parse_eval_internal (pm, node->deeper); + + /* this is not the right path */ + if (rv == VLIB_PARSE_MATCH_FAIL) + { + if (had_value) + { + /* Delete the value */ + value = pm->parse_value[vec_len (pm->parse_value) - 1]; + parse_cleanup_value (pm, &value); + _vec_len (pm->parse_value) -= 1; + } + /* Continue with the next sibling */ + pm->current_token_index = save_token_index; + _vec_len (pm->match_items) = save_match_items; + index = node->peer; + break; + } + return rv; + + case VLIB_PARSE_MATCH_PARTIAL: + /* Partial (substring) match, remember it but keep going */ + vec_add1 (partial_matches, node - pm->parse_graph); + index = node->peer; + break; + + case VLIB_PARSE_MATCH_FAIL: + /* Continue with the next sibling */ + index = node->peer; + _vec_len (pm->match_items) = save_match_items; + break; + + case VLIB_PARSE_MATCH_DONE: + /* Parse complete, invoke the action function */ + if (PARSE_DEBUG > 0) + clib_warning ("parse_value: %U", format_vlib_parse_value, pm); + + { + vlib_parse_eval_function_t *f = item->value.as_pointer; + if (f) rv = f (pm, item, pm->parse_value); - } - - vec_foreach (pv, pm->parse_value) - parse_cleanup_value (pm, pv); - _vec_len (pm->parse_value) = 0; - _vec_len (pm->match_items) = 0; - return rv; - - case VLIB_PARSE_MATCH_AMBIGUOUS: - case VLIB_PARSE_MATCH_EVAL_FAIL: - case VLIB_PARSE_MATCH_RULE: - _vec_len (pm->match_items) = save_match_items; - return rv; - } + } + + vec_foreach (pv, pm->parse_value) parse_cleanup_value (pm, pv); + _vec_len (pm->parse_value) = 0; + _vec_len (pm->match_items) = 0; + return rv; + + case VLIB_PARSE_MATCH_AMBIGUOUS: + case VLIB_PARSE_MATCH_EVAL_FAIL: + case VLIB_PARSE_MATCH_RULE: + _vec_len (pm->match_items) = save_match_items; + return rv; + } } - /* + /* * Out of siblings. If we have exactly one partial match * we win */ @@ -342,18 +352,16 @@ parse_eval_internal (vlib_parse_main_t *pm, u32 index) return rv; } -vlib_parse_match_t rule_match (vlib_parse_main_t *pm, vlib_parse_type_t *type, - vlib_lex_token_t *t, - vlib_parse_value_t *valuep) +vlib_parse_match_t +rule_match (vlib_parse_main_t * pm, vlib_parse_type_t * type, + vlib_lex_token_t * t, vlib_parse_value_t * valuep) { vlib_parse_match_t rv; static int recursion_level; if (PARSE_DEBUG > 1) - clib_warning ("[%d]: try to match type %s graph index %d", - recursion_level, - type->name, - type->rule_index); + clib_warning ("[%d]: try to match type %s graph index %d", + recursion_level, type->name, type->rule_index); recursion_level++; rv = parse_eval_internal (pm, type->rule_index); recursion_level--; @@ -362,42 +370,47 @@ vlib_parse_match_t rule_match (vlib_parse_main_t *pm, vlib_parse_type_t *type, if (rv == VLIB_PARSE_MATCH_RULE) { if (PARSE_DEBUG > 1) - clib_warning ("[%d]: type %s matched", recursion_level, type->name); + clib_warning ("[%d]: type %s matched", recursion_level, type->name); return VLIB_PARSE_MATCH_FULL; - } - else + } + else { if (PARSE_DEBUG > 1) - clib_warning ("[%d]: type %s returns %U", recursion_level, type->name, - format_vlib_parse_match, rv); + clib_warning ("[%d]: type %s returns %U", recursion_level, type->name, + format_vlib_parse_match, rv); } return rv; } -static int parse_eval (vlib_parse_main_t *pm, u8 *input) +static int +parse_eval (vlib_parse_main_t * pm, u8 * input) { - vlib_lex_token_t * t; + vlib_lex_token_t *t; parse_reset (pm, input); - + /* Tokenize the entire input vector */ - do { - vec_add2 (pm->tokens, t, 1); - vlib_lex_get_token (pm->lex_main, t); - } while (t->token != VLIB_LEX_eof); + do + { + vec_add2 (pm->tokens, t, 1); + vlib_lex_get_token (pm->lex_main, t); + } + while (t->token != VLIB_LEX_eof); /* Feed it to the parser */ return parse_eval_internal (pm, pm->root_index); } /* Temporary vlib stub */ -vlib_parse_match_t vlib_parse_eval (u8 *input) +vlib_parse_match_t +vlib_parse_eval (u8 * input) { return parse_eval (&vlib_parse_main, input); } -u16 parse_type_find_or_create (vlib_parse_main_t *pm, vlib_parse_type_t *t) +u16 +parse_type_find_or_create (vlib_parse_main_t * pm, vlib_parse_type_t * t) { uword *p; vlib_parse_type_t *n; @@ -409,7 +422,7 @@ u16 parse_type_find_or_create (vlib_parse_main_t *pm, vlib_parse_type_t *t) pool_get (pm->parse_types, n); *n = *t; - n->rule_index = (u32) ~0; + n->rule_index = (u32) ~ 0; name_copy = format (0, "%s%c", n->name, 0); @@ -417,7 +430,8 @@ u16 parse_type_find_or_create (vlib_parse_main_t *pm, vlib_parse_type_t *t) return n - pm->parse_types; } -u16 parse_type_find_by_name (vlib_parse_main_t *pm, char *name) +u16 +parse_type_find_by_name (vlib_parse_main_t * pm, char *name) { uword *p; @@ -425,11 +439,11 @@ u16 parse_type_find_by_name (vlib_parse_main_t *pm, char *name) if (p) return p[0]; - return (u16) ~0; + return (u16) ~ 0; } -u32 parse_item_find_or_create (vlib_parse_main_t *pm, vlib_parse_item_t *item) - +u32 +parse_item_find_or_create (vlib_parse_main_t * pm, vlib_parse_item_t * item) { uword *p; vlib_parse_item_t *i; @@ -446,7 +460,8 @@ u32 parse_item_find_or_create (vlib_parse_main_t *pm, vlib_parse_item_t *item) return i - pm->parse_items; } -static void parse_type_and_graph_init (vlib_parse_main_t *pm) +static void +parse_type_and_graph_init (vlib_parse_main_t * pm) { u32 eof_index; vlib_parse_type_t type; @@ -467,14 +482,13 @@ static void parse_type_and_graph_init (vlib_parse_main_t *pm) _ (rpar) #define _(a) a##_type_index = parse_type_find_by_name (pm, #a); - foreach_token_type + foreach_token_type #undef _ - - memset (&item, 0, sizeof (item)); + memset (&item, 0, sizeof (item)); item.type = eof_type_index; - + eof_index = parse_item_find_or_create (pm, &item); - pm->root_index = (u32)~0; + pm->root_index = (u32) ~ 0; #if 0 pool_get (pm->parse_graph, g); @@ -486,41 +500,44 @@ static void parse_type_and_graph_init (vlib_parse_main_t *pm) -static void tokenize (vlib_parse_main_t *pm, parse_registration_t *pr) +static void +tokenize (vlib_parse_main_t * pm, parse_registration_t * pr) { vlib_lex_token_t *t; - pm->register_input = format (pm->register_input, - "%s%c", pr->initializer, 0); - + pm->register_input = format (pm->register_input, + "%s%c", pr->initializer, 0); + parse_reset (pm, pm->register_input); - - do { - vec_add2 (pm->tokens, t, 1); - vlib_lex_get_token (pm->lex_main, t); - } while (t->token != VLIB_LEX_eof); + + do + { + vec_add2 (pm->tokens, t, 1); + vlib_lex_get_token (pm->lex_main, t); + } + while (t->token != VLIB_LEX_eof); _vec_len (pm->register_input) = 0; } -static int is_typed_rule (vlib_parse_main_t *pm) +static int +is_typed_rule (vlib_parse_main_t * pm) { vlib_lex_token_t *t = vec_elt_at_index (pm->tokens, 0); - + /* <mytype> = blah blah blah */ - if (vec_len(pm->tokens) >= 4 + if (vec_len (pm->tokens) >= 4 && t[0].token == VLIB_LEX_lt && t[1].token == VLIB_LEX_word - && t[2].token == VLIB_LEX_gt - && t[3].token == VLIB_LEX_equals) + && t[2].token == VLIB_LEX_gt && t[3].token == VLIB_LEX_equals) return 1; return 0; } -static int token_matches_graph_node (vlib_parse_main_t *pm, - vlib_lex_token_t *t, - vlib_parse_graph_t *node, - vlib_parse_item_t *item, - vlib_parse_type_t *type, - u32 *token_increment) +static int +token_matches_graph_node (vlib_parse_main_t * pm, + vlib_lex_token_t * t, + vlib_parse_graph_t * node, + vlib_parse_item_t * item, + vlib_parse_type_t * type, u32 * token_increment) { /* EOFs don't match */ if (t->token == VLIB_LEX_eof) @@ -531,11 +548,11 @@ static int token_matches_graph_node (vlib_parse_main_t *pm, { /* but the item in hand is not a word */ if (item->type != word_type_index) - return 0; - + return 0; + /* Or it's not this particular word */ if (strcmp (t->value.as_pointer, item->value.as_pointer)) - return 0; + return 0; *token_increment = 1; return 1; } @@ -543,26 +560,25 @@ static int token_matches_graph_node (vlib_parse_main_t *pm, if (t->token == VLIB_LEX_lt) { u16 token_type_index; - + /* < TYPE > */ - if (t[1].token != VLIB_LEX_word || - t[2].token != VLIB_LEX_gt) - { - clib_warning (0, "broken type name in '%s'", pm->register_input); - return 0; - } - + if (t[1].token != VLIB_LEX_word || t[2].token != VLIB_LEX_gt) + { + clib_warning (0, "broken type name in '%s'", pm->register_input); + return 0; + } + token_type_index = parse_type_find_by_name (pm, t[1].value.as_pointer); - if (token_type_index == (u16)~0) - { - clib_warning (0, "unknown type '%s'", t[1].value.as_pointer); - return 0; - } - + if (token_type_index == (u16) ~ 0) + { + clib_warning (0, "unknown type '%s'", t[1].value.as_pointer); + return 0; + } + /* Its a known type but does not match. */ if (item->type != token_type_index) - return 0; - + return 0; + *token_increment = 3; return 1; } @@ -570,15 +586,15 @@ static int token_matches_graph_node (vlib_parse_main_t *pm, return 0; } -u32 generate_subgraph_from_tokens (vlib_parse_main_t *pm, - vlib_lex_token_t *t, - u32 *new_subgraph_depth, - parse_registration_t *pr, - int not_a_rule) +u32 +generate_subgraph_from_tokens (vlib_parse_main_t * pm, + vlib_lex_token_t * t, + u32 * new_subgraph_depth, + parse_registration_t * pr, int not_a_rule) { vlib_parse_graph_t *g, *last_g; vlib_parse_item_t new_item; - u32 rv = (u32)~0, new_item_index, last_index = (u32)~0; + u32 rv = (u32) ~ 0, new_item_index, last_index = (u32) ~ 0; u16 token_type_index; u32 depth = 0; @@ -591,73 +607,73 @@ u32 generate_subgraph_from_tokens (vlib_parse_main_t *pm, new_item.type = word_type_index; new_item.value.as_pointer = vec_dup ((u8 *) t->value.as_pointer); new_item_index = parse_item_find_or_create (pm, &new_item); - t++; + t++; } else if (t->token == VLIB_LEX_lt) { - if (t[1].token != VLIB_LEX_word || - t[2].token != VLIB_LEX_gt) + if (t[1].token != VLIB_LEX_word || t[2].token != VLIB_LEX_gt) { clib_warning ("broken type name in '%s'", pm->register_input); - goto screwed; + goto screwed; } - token_type_index = parse_type_find_by_name (pm, - t[1].value.as_pointer); - if (token_type_index == (u16)~0) + token_type_index = parse_type_find_by_name (pm, + t[1].value.as_pointer); + if (token_type_index == (u16) ~ 0) { - clib_warning ("unknown type 2 '%s'", t[1].value.as_pointer); - goto screwed; + clib_warning ("unknown type 2 '%s'", t[1].value.as_pointer); + goto screwed; } new_item.type = token_type_index; new_item.value.as_pointer = 0; new_item_index = parse_item_find_or_create (pm, &new_item); - t += 3; /* skip < <type-name> and > */ + t += 3; /* skip < <type-name> and > */ } else if (t->token == VLIB_LEX_eof) { - screwed: + screwed: new_item.type = not_a_rule ? eof_type_index : rule_eof_type_index; new_item.value.as_pointer = pr->eof_match; new_item_index = parse_item_find_or_create (pm, &new_item); - t++; + t++; } else { - clib_warning ("unexpected token %U index %d in '%s'", - format_vlib_lex_token, pm->lex_main, t, - t - pm->tokens, pm->register_input); - goto screwed; + clib_warning ("unexpected token %U index %d in '%s'", + format_vlib_lex_token, pm->lex_main, t, + t - pm->tokens, pm->register_input); + goto screwed; } pool_get (pm->parse_graph, g); memset (g, 0xff, sizeof (*g)); g->item = new_item_index; depth++; - - if (rv == (u32)~0) - { - rv = g - pm->parse_graph; - last_index = rv; - } + + if (rv == (u32) ~ 0) + { + rv = g - pm->parse_graph; + last_index = rv; + } else - { - last_g = pool_elt_at_index (pm->parse_graph, last_index); - last_index = last_g->deeper = g - pm->parse_graph; - } + { + last_g = pool_elt_at_index (pm->parse_graph, last_index); + last_index = last_g->deeper = g - pm->parse_graph; + } } *new_subgraph_depth = depth; return rv; } -static u32 measure_depth (vlib_parse_main_t *pm, u32 index) +static u32 +measure_depth (vlib_parse_main_t * pm, u32 index) { vlib_parse_graph_t *node; vlib_parse_item_t *item; - u32 max=0; + u32 max = 0; u32 depth; - if (index == (u32)~0) + if (index == (u32) ~ 0) return 0; node = pool_elt_at_index (pm->parse_graph, index); @@ -666,47 +682,48 @@ static u32 measure_depth (vlib_parse_main_t *pm, u32 index) if (item->type == eof_type_index) return 1; - while (index != (u32)~0) + while (index != (u32) ~ 0) { node = pool_elt_at_index (pm->parse_graph, index); depth = measure_depth (pm, node->deeper); if (max < depth) - max = depth; + max = depth; index = node->peer; } return max + 1; } -static void add_subgraph_to_graph (vlib_parse_main_t *pm, - u32 last_matching_index, - u32 graph_root_index, - u32 new_subgraph_index, - u32 new_subgraph_depth) +static void +add_subgraph_to_graph (vlib_parse_main_t * pm, + u32 last_matching_index, + u32 graph_root_index, + u32 new_subgraph_index, u32 new_subgraph_depth) { vlib_parse_graph_t *parent_node; int new_subgraph_longest = 1; u32 current_peer_index; u32 current_depth; vlib_parse_graph_t *current_peer = 0; - vlib_parse_graph_t *new_subgraph_node = + vlib_parse_graph_t *new_subgraph_node = pool_elt_at_index (pm->parse_graph, new_subgraph_index); - /* + /* * Case 1: top-level peer. Splice into the top-level - * peer chain according to rule depth + * peer chain according to rule depth */ - if (last_matching_index == (u32)~0) + if (last_matching_index == (u32) ~ 0) { u32 index = graph_root_index; - while (1) { - current_peer = pool_elt_at_index (pm->parse_graph, index); - current_depth = measure_depth (pm, index); - if (current_depth < new_subgraph_depth - || current_peer->peer == (u32)~0) - break; - index = current_peer->peer; - } + while (1) + { + current_peer = pool_elt_at_index (pm->parse_graph, index); + current_depth = measure_depth (pm, index); + if (current_depth < new_subgraph_depth + || current_peer->peer == (u32) ~ 0) + break; + index = current_peer->peer; + } new_subgraph_node->peer = current_peer->peer; current_peer->peer = new_subgraph_index; return; @@ -715,12 +732,12 @@ static void add_subgraph_to_graph (vlib_parse_main_t *pm, parent_node = pool_elt_at_index (pm->parse_graph, last_matching_index); current_peer_index = parent_node->deeper; - while (current_peer_index != (u32)~0) + while (current_peer_index != (u32) ~ 0) { current_peer = pool_elt_at_index (pm->parse_graph, current_peer_index); current_depth = measure_depth (pm, current_peer_index); if (current_depth < new_subgraph_depth) - break; + break; new_subgraph_longest = 0; current_peer_index = current_peer->peer; } @@ -740,10 +757,10 @@ static void add_subgraph_to_graph (vlib_parse_main_t *pm, } static clib_error_t * -parse_register_one (vlib_parse_main_t *pm, parse_registration_t *pr) +parse_register_one (vlib_parse_main_t * pm, parse_registration_t * pr) { u32 graph_root_index; - u16 subgraph_type_index = (u16)~0; + u16 subgraph_type_index = (u16) ~ 0; vlib_parse_type_t *subgraph_type = 0; vlib_lex_token_t *t; vlib_parse_graph_t *node; @@ -755,22 +772,23 @@ parse_register_one (vlib_parse_main_t *pm, parse_registration_t *pr) int use_main_graph = 1; tokenize (pm, pr); - + /* A typed rule? */ if (is_typed_rule (pm)) { /* Get the type and its current subgraph root, if any */ t = vec_elt_at_index (pm->tokens, 1); subgraph_type_index = parse_type_find_by_name (pm, t->value.as_pointer); - if (subgraph_type_index == (u16)~0) - return clib_error_return (0, "undeclared type '%s'", - t->value.as_pointer); - subgraph_type = pool_elt_at_index (pm->parse_types, subgraph_type_index); + if (subgraph_type_index == (u16) ~ 0) + return clib_error_return (0, "undeclared type '%s'", + t->value.as_pointer); + subgraph_type = + pool_elt_at_index (pm->parse_types, subgraph_type_index); graph_root_index = subgraph_type->rule_index; /* Skip "mytype> = */ t += 3; use_main_graph = 0; - } + } else { /* top-level graph */ @@ -778,55 +796,54 @@ parse_register_one (vlib_parse_main_t *pm, parse_registration_t *pr) t = vec_elt_at_index (pm->tokens, 0); } - last_matching_index = (u32)~0; + last_matching_index = (u32) ~ 0; last_index = node_index = graph_root_index; /* Find the first token which isn't already being parsed */ - while (t < pm->tokens + vec_len (pm->tokens) && node_index != (u32) ~0) + while (t < pm->tokens + vec_len (pm->tokens) && node_index != (u32) ~ 0) { node = pool_elt_at_index (pm->parse_graph, node_index); item = pool_elt_at_index (pm->parse_items, node->item); type = pool_elt_at_index (pm->parse_types, item->type); last_index = node_index; - - if (token_matches_graph_node (pm, t, node, item, type, &token_increment)) - { - t += token_increment; - last_matching_index = node_index; - node_index = node->deeper; - } + + if (token_matches_graph_node + (pm, t, node, item, type, &token_increment)) + { + t += token_increment; + last_matching_index = node_index; + node_index = node->deeper; + } else - node_index = node->peer; + node_index = node->peer; } - - new_subgraph_index = - generate_subgraph_from_tokens (pm, t, &new_subgraph_depth, pr, - use_main_graph); - + + new_subgraph_index = + generate_subgraph_from_tokens (pm, t, &new_subgraph_depth, pr, + use_main_graph); + /* trivial cases: first graph node or first type rule */ - if (graph_root_index == (u32)~0) + if (graph_root_index == (u32) ~ 0) { if (use_main_graph) - pm->root_index = new_subgraph_index; + pm->root_index = new_subgraph_index; else - subgraph_type->rule_index = new_subgraph_index; + subgraph_type->rule_index = new_subgraph_index; return 0; } - + add_subgraph_to_graph (pm, last_matching_index, graph_root_index, - new_subgraph_index, - new_subgraph_depth); + new_subgraph_index, new_subgraph_depth); return 0; } static clib_error_t * parse_register (vlib_main_t * vm, - parse_registration_t * lo, - parse_registration_t * hi, - vlib_parse_main_t *pm) + parse_registration_t * lo, + parse_registration_t * hi, vlib_parse_main_t * pm) { - parse_registration_t * pr; - + parse_registration_t *pr; + for (pr = lo; pr < hi; pr = vlib_elf_section_data_next (pr, 0)) vec_add1 (pm->parse_registrations, pr); @@ -834,39 +851,41 @@ parse_register (vlib_main_t * vm, } static clib_error_t * -parse_register_one_type (vlib_parse_main_t *pm, vlib_parse_type_t *rp) +parse_register_one_type (vlib_parse_main_t * pm, vlib_parse_type_t * rp) { - (void) parse_type_find_or_create (pm, (vlib_parse_type_t *)rp); + (void) parse_type_find_or_create (pm, (vlib_parse_type_t *) rp); return 0; } static clib_error_t * parse_type_register (vlib_main_t * vm, - vlib_parse_type_t * lo, - vlib_parse_type_t * hi, - vlib_parse_main_t *pm) + vlib_parse_type_t * lo, + vlib_parse_type_t * hi, vlib_parse_main_t * pm) { - clib_error_t * error = 0; - vlib_parse_type_t * ptr; - - for (ptr = lo; ptr < hi; ptr = vlib_elf_section_data_next (ptr, 0)) { - error = parse_register_one_type (pm, ptr); - if (error) - goto done; - } - - done: + clib_error_t *error = 0; + vlib_parse_type_t *ptr; + + for (ptr = lo; ptr < hi; ptr = vlib_elf_section_data_next (ptr, 0)) + { + error = parse_register_one_type (pm, ptr); + if (error) + goto done; + } + +done: return error; } -clib_error_t *vlib_stdlex_init (vlib_main_t *vm) __attribute__((weak)); -clib_error_t *vlib_stdlex_init (vlib_main_t *vm) -{ +clib_error_t *vlib_stdlex_init (vlib_main_t * vm) __attribute__ ((weak)); +clib_error_t * +vlib_stdlex_init (vlib_main_t * vm) +{ (void) vlib_lex_add_table ("ignore_everything"); - return 0; + return 0; } -static int compute_rule_length (parse_registration_t *r) +static int +compute_rule_length (parse_registration_t * r) { int length, i; vlib_parse_main_t *pm = &vlib_parse_main; @@ -886,14 +905,14 @@ static int compute_rule_length (parse_registration_t *r) for (i = 0; i < vec_len (pm->tokens); i++) { switch (pm->tokens[i].token) - { - case VLIB_LEX_lt: - case VLIB_LEX_gt: - length -= 1; - - default: - break; - } + { + case VLIB_LEX_lt: + case VLIB_LEX_gt: + length -= 1; + + default: + break; + } } ASSERT (length > 0); @@ -901,8 +920,8 @@ static int compute_rule_length (parse_registration_t *r) return length; } -static int rule_length_compare (parse_registration_t *r1, - parse_registration_t *r2) +static int +rule_length_compare (parse_registration_t * r1, parse_registration_t * r2) { compute_rule_length (r1); compute_rule_length (r2); @@ -911,19 +930,20 @@ static int rule_length_compare (parse_registration_t *r1, } -static clib_error_t * parse_init (vlib_main_t *vm) +static clib_error_t * +parse_init (vlib_main_t * vm) { vlib_parse_main_t *pm = &vlib_parse_main; vlib_lex_main_t *lm = &vlib_lex_main; - vlib_elf_section_bounds_t * b, * bounds; - clib_error_t * error = 0; + vlib_elf_section_bounds_t *b, *bounds; + clib_error_t *error = 0; parse_registration_t *rule; int i; if ((error = vlib_call_init_function (vm, lex_onetime_init))) return error; - if ((error = vlib_stdlex_init(vm))) + if ((error = vlib_stdlex_init (vm))) return error; if ((error = vlib_call_init_function (vm, parse_builtin_init))) @@ -947,22 +967,22 @@ static clib_error_t * parse_init (vlib_main_t *vm) bounds = vlib_get_elf_section_bounds (vm, "parse_type_registrations"); vec_foreach (b, bounds) - { - error = parse_type_register (vm, b->lo, b->hi, pm); - if (error) - break; - } + { + error = parse_type_register (vm, b->lo, b->hi, pm); + if (error) + break; + } vec_free (bounds); parse_type_and_graph_init (pm); bounds = vlib_get_elf_section_bounds (vm, "parse_registrations"); vec_foreach (b, bounds) - { - error = parse_register (vm, b->lo, b->hi, pm); - if (error) - break; - } + { + error = parse_register (vm, b->lo, b->hi, pm); + if (error) + break; + } vec_free (bounds); vec_sort_with_function (pm->parse_registrations, rule_length_compare); @@ -977,3 +997,11 @@ static clib_error_t * parse_init (vlib_main_t *vm) } VLIB_INIT_FUNCTION (parse_init); + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/parse.h b/vlib/vlib/parse.h index 5b9acebf774..036e744723b 100644 --- a/vlib/vlib/parse.h +++ b/vlib/vlib/parse.h @@ -19,11 +19,13 @@ #include <vlib/lex.h> #include <vppinfra/mhash.h> -typedef struct { +typedef struct +{ /* Word aligned value. */ - union { + union + { u8 as_u8[32 - 1 * sizeof (u16)]; - void * as_pointer; + void *as_pointer; uword as_uword; word as_word; u64 as_u64; @@ -31,32 +33,44 @@ typedef struct { /* 16 bit type at end so that 30 bytes of value are aligned. */ u16 type; -} __attribute ((packed)) vlib_parse_value_t; +} __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; + 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) \ @@ -68,84 +82,112 @@ typedef struct { _(MATCH_AMBIGUOUS) \ _(MATCH_EVAL_FAIL) -typedef enum { + typedef enum + { #define _(a) VLIB_PARSE_##a, - foreach_parse_match_type + 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; + } 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; + 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) @@ -169,3 +211,11 @@ static _PARSE_TYPE_REGISTRATION_DATA(n) = { \ }; #endif /* included_vlib_parse_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/parse_builtin.c b/vlib/vlib/parse_builtin.c index df830db4e21..0ce716b539e 100644 --- a/vlib/vlib/parse_builtin.c +++ b/vlib/vlib/parse_builtin.c @@ -17,32 +17,40 @@ always_inline void * parse_last_match_value (vlib_parse_main_t * pm) { - vlib_parse_item_t * i; + vlib_parse_item_t *i; i = pool_elt_at_index (pm->parse_items, - vec_elt (pm->match_items, vec_len (pm->match_items) - 1)); + vec_elt (pm->match_items, + vec_len (pm->match_items) - 1)); return i->value.as_pointer; } -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) -{ return t->token == VLIB_LEX_eof ? VLIB_PARSE_MATCH_DONE : VLIB_PARSE_MATCH_FAIL; } +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) +{ + return t->token == + VLIB_LEX_eof ? VLIB_PARSE_MATCH_DONE : VLIB_PARSE_MATCH_FAIL; +} -PARSE_TYPE_INIT (eof, eof_match, 0 /* cleanup value */, 0 /* format value */); +PARSE_TYPE_INIT (eof, eof_match, 0 /* cleanup value */ , + 0 /* format value */ ); -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) +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) { - vlib_parse_match_function_t * fp = parse_last_match_value (pm); + vlib_parse_match_function_t *fp = parse_last_match_value (pm); pm->current_token_index--; return fp ? fp (pm, type, t, valuep) : VLIB_PARSE_MATCH_RULE; } PARSE_TYPE_INIT (rule_eof, rule_eof_match, 0, 0); -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) +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) { - u8 * tv, * iv; + u8 *tv, *iv; int i; if (t->token != VLIB_LEX_word) @@ -60,10 +68,12 @@ vlib_parse_match_t word_match (vlib_parse_main_t *pm, vlib_parse_type_t *type, return iv[i] == 0 ? VLIB_PARSE_MATCH_FULL : VLIB_PARSE_MATCH_PARTIAL; } -PARSE_TYPE_INIT (word, word_match, 0 /* clnup value */, 0 /* format value */); +PARSE_TYPE_INIT (word, word_match, 0 /* clnup value */ , + 0 /* format value */ ); -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) +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) { if (t->token == VLIB_LEX_number) { @@ -73,20 +83,21 @@ vlib_parse_match_t number_match (vlib_parse_main_t *pm, vlib_parse_type_t *type, return VLIB_PARSE_MATCH_FAIL; } -static u8 * format_value_number (u8 * s, va_list * args) +static u8 * +format_value_number (u8 * s, va_list * args) { - vlib_parse_value_t * v = va_arg (*args, vlib_parse_value_t *); + vlib_parse_value_t *v = va_arg (*args, vlib_parse_value_t *); uword a = v->value.as_uword; - if (BITS(uword) == 64) + if (BITS (uword) == 64) s = format (s, "%lld(0x%llx)", a, a); - else + else s = format (s, "%ld(0x%lx)", a, a); return s; } -PARSE_TYPE_INIT (number, number_match, 0 /* cln value */, - format_value_number /* fmt value */); +PARSE_TYPE_INIT (number, number_match, 0 /* cln value */ , + format_value_number /* fmt value */ ); #define foreach_vanilla_lex_match_function \ @@ -121,7 +132,6 @@ PARSE_TYPE_INIT (name, name##_match, 0 /* cln value */, \ foreach_vanilla_lex_match_function #undef _ - /* So we're linked in. */ static clib_error_t * parse_builtin_init (vlib_main_t * vm) @@ -130,3 +140,11 @@ parse_builtin_init (vlib_main_t * vm) } VLIB_INIT_FUNCTION (parse_builtin_init); + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/pci/linux_pci.c b/vlib/vlib/pci/linux_pci.c index 6cc70e6d6aa..ba6defeb2f1 100644 --- a/vlib/vlib/pci/linux_pci.c +++ b/vlib/vlib/pci/linux_pci.c @@ -50,12 +50,13 @@ #include <linux/ethtool.h> #include <linux/sockios.h> -typedef struct { +typedef struct +{ /* /sys/bus/pci/devices/... directory name for this device. */ - u8 * dev_dir_name; + u8 *dev_dir_name; /* Resource file descriptors. */ - int * resource_fds; + int *resource_fds; /* File descriptor for config space read/write. */ int config_fd; @@ -72,9 +73,10 @@ typedef struct { } linux_pci_device_t; /* Pool of PCI devices. */ -typedef struct { - vlib_main_t * vlib_main; - linux_pci_device_t * linux_pci_devices; +typedef struct +{ + vlib_main_t *vlib_main; + linux_pci_device_t *linux_pci_devices; } linux_pci_main_t; extern linux_pci_main_t linux_pci_main; @@ -82,22 +84,23 @@ extern linux_pci_main_t linux_pci_main; /* Call to allocate/initialize the pci subsystem. This is not an init function so that users can explicitly enable pci only when it's needed. */ -clib_error_t * pci_bus_init (vlib_main_t * vm); +clib_error_t *pci_bus_init (vlib_main_t * vm); -clib_error_t * vlib_pci_bind_to_uio (vlib_pci_device_t * d, char * uio_driver_name); +clib_error_t *vlib_pci_bind_to_uio (vlib_pci_device_t * d, + char *uio_driver_name); linux_pci_main_t linux_pci_main; clib_error_t * -vlib_pci_bind_to_uio (vlib_pci_device_t * d, char * uio_driver_name) +vlib_pci_bind_to_uio (vlib_pci_device_t * d, char *uio_driver_name) { - clib_error_t * error = 0; + clib_error_t *error = 0; u8 *s = 0; DIR *dir = 0; struct dirent *e; int fd; - pci_config_header_t * c; - u8 * dev_dir_name = format(0, "/sys/bus/pci/devices/%U", + pci_config_header_t *c; + u8 *dev_dir_name = format (0, "/sys/bus/pci/devices/%U", format_vlib_pci_addr, &d->bus_address); c = &d->config0.header; @@ -105,14 +108,14 @@ vlib_pci_bind_to_uio (vlib_pci_device_t * d, char * uio_driver_name) /* if uio sub-directory exists, we are fine, device is already bound to UIO driver */ s = format (s, "%v/uio%c", dev_dir_name, 0); - if (access ( (char *) s, F_OK) == 0) + if (access ((char *) s, F_OK) == 0) goto done; vec_reset_length (s); /* walk trough all linux interfaces and if interface belonging to this device is founf check if interface is admin up */ dir = opendir ("/sys/class/net"); - s = format(s, "%U%c", format_vlib_pci_addr, &d->bus_address, 0); + s = format (s, "%U%c", format_vlib_pci_addr, &d->bus_address, 0); if (!dir) { @@ -122,50 +125,50 @@ vlib_pci_bind_to_uio (vlib_pci_device_t * d, char * uio_driver_name) goto done; } - fd = socket(PF_INET, SOCK_DGRAM, 0); + fd = socket (PF_INET, SOCK_DGRAM, 0); if (fd < 0) { error = clib_error_return_unix (0, "socket"); goto done; } - while((e = readdir (dir))) + while ((e = readdir (dir))) { struct ifreq ifr; struct ethtool_drvinfo drvinfo; - if (e->d_name[0] == '.') /* skip . and .. */ + if (e->d_name[0] == '.') /* skip . and .. */ continue; - memset(&ifr, 0, sizeof ifr); - memset(&drvinfo, 0, sizeof drvinfo); + memset (&ifr, 0, sizeof ifr); + memset (&drvinfo, 0, sizeof drvinfo); ifr.ifr_data = (char *) &drvinfo; - strncpy(ifr.ifr_name, e->d_name, IFNAMSIZ - 1); + strncpy (ifr.ifr_name, e->d_name, IFNAMSIZ - 1); drvinfo.cmd = ETHTOOL_GDRVINFO; if (ioctl (fd, SIOCETHTOOL, &ifr) < 0) - { - if (errno == ENOTSUP) - /* Some interfaces (eg "lo") don't support this ioctl */ - continue; + { + if (errno == ENOTSUP) + /* Some interfaces (eg "lo") don't support this ioctl */ + continue; - error = clib_error_return_unix (0, "ioctl fetch intf %s bus info", - e->d_name); - close (fd); - goto done; - } + error = clib_error_return_unix (0, "ioctl fetch intf %s bus info", + e->d_name); + close (fd); + goto done; + } if (strcmp ((char *) s, drvinfo.bus_info)) continue; - memset (&ifr, 0, sizeof(ifr)); + memset (&ifr, 0, sizeof (ifr)); strncpy (ifr.ifr_name, e->d_name, IFNAMSIZ - 1); if (ioctl (fd, SIOCGIFFLAGS, &ifr) < 0) - { - error = clib_error_return_unix (0, "ioctl fetch intf %s flags", - e->d_name); - close (fd); - goto done; - } + { + error = clib_error_return_unix (0, "ioctl fetch intf %s flags", + e->d_name); + close (fd); + goto done; + } if (ifr.ifr_flags & IFF_UP) { @@ -173,7 +176,7 @@ vlib_pci_bind_to_uio (vlib_pci_device_t * d, char * uio_driver_name) "interface %s is up", format_vlib_pci_addr, &d->bus_address, e->d_name); - close (fd); + close (fd); goto done; } } @@ -201,51 +204,54 @@ done: static clib_error_t * -scan_uio_dir (void * arg, u8 * path_name, u8 * file_name) +scan_uio_dir (void *arg, u8 * path_name, u8 * file_name) { - linux_pci_device_t * l = arg; + linux_pci_device_t *l = arg; unformat_input_t input; unformat_init_string (&input, (char *) file_name, vec_len (file_name)); - if (! unformat (&input, "uio%d", &l->uio_minor)) + if (!unformat (&input, "uio%d", &l->uio_minor)) abort (); unformat_free (&input); return 0; } -static clib_error_t * linux_pci_uio_read_ready (unix_file_t * uf) +static clib_error_t * +linux_pci_uio_read_ready (unix_file_t * uf) { - vlib_pci_main_t * pm = &pci_main; - vlib_pci_device_t * d; + vlib_pci_main_t *pm = &pci_main; + vlib_pci_device_t *d; int __attribute__ ((unused)) rv; u32 icount; - rv = read(uf->file_descriptor, &icount, 4); + rv = read (uf->file_descriptor, &icount, 4); d = pool_elt_at_index (pm->pci_devs, uf->private_data); if (d->interrupt_handler) - d->interrupt_handler(d); + d->interrupt_handler (d); - vlib_pci_intr_enable(d); + vlib_pci_intr_enable (d); return /* no error */ 0; } -static clib_error_t *linux_pci_uio_error_ready (unix_file_t *uf) +static clib_error_t * +linux_pci_uio_error_ready (unix_file_t * uf) { u32 error_index = (u32) uf->private_data; return clib_error_return (0, "pci device %d: error", error_index); } -static void add_device (vlib_pci_device_t * dev, linux_pci_device_t * pdev) +static void +add_device (vlib_pci_device_t * dev, linux_pci_device_t * pdev) { - vlib_pci_main_t * pm = &pci_main; - linux_pci_main_t * lpm = &linux_pci_main; - linux_pci_device_t * l; + vlib_pci_main_t *pm = &pci_main; + linux_pci_main_t *lpm = &linux_pci_main; + linux_pci_device_t *l; pool_get (lpm->linux_pci_devices, l); l[0] = pdev[0]; @@ -255,13 +261,14 @@ static void add_device (vlib_pci_device_t * dev, linux_pci_device_t * pdev) dev->os_handle = l - lpm->linux_pci_devices; { - u8 * uio_dir = format (0, "%s/uio", l->dev_dir_name); - foreach_directory_file ((char *) uio_dir, scan_uio_dir, l, /* scan_dirs */ 1); + u8 *uio_dir = format (0, "%s/uio", l->dev_dir_name); + foreach_directory_file ((char *) uio_dir, scan_uio_dir, l, /* scan_dirs */ + 1); vec_free (uio_dir); } { - char * uio_name = (char *) format (0, "/dev/uio%d%c", l->uio_minor, 0); + char *uio_name = (char *) format (0, "/dev/uio%d%c", l->uio_minor, 0); l->uio_fd = open (uio_name, O_RDWR); if (l->uio_fd < 0) clib_unix_error ("open `%s'", uio_name); @@ -269,8 +276,8 @@ static void add_device (vlib_pci_device_t * dev, linux_pci_device_t * pdev) } { - unix_file_t template = {0}; - unix_main_t * um = &unix_main; + unix_file_t template = { 0 }; + unix_main_t *um = &unix_main; template.read_function = linux_pci_uio_read_ready; template.file_descriptor = l->uio_fd; @@ -281,7 +288,8 @@ static void add_device (vlib_pci_device_t * dev, linux_pci_device_t * pdev) } } -static void linux_pci_device_free (linux_pci_device_t * l) +static void +linux_pci_device_free (linux_pci_device_t * l) { int i; for (i = 0; i < vec_len (l->resource_fds); i++) @@ -299,12 +307,10 @@ static void linux_pci_device_free (linux_pci_device_t * l) clib_error_t * vlib_pci_read_write_config (vlib_pci_device_t * dev, vlib_read_or_write_t read_or_write, - uword address, - void * data, - u32 n_bytes) + uword address, void *data, u32 n_bytes) { - linux_pci_main_t * lpm = &linux_pci_main; - linux_pci_device_t * p; + linux_pci_main_t *lpm = &linux_pci_main; + linux_pci_device_t *p; int n; p = pool_elt_at_index (lpm->linux_pci_devices, dev->os_handle); @@ -324,16 +330,14 @@ vlib_pci_read_write_config (vlib_pci_device_t * dev, static clib_error_t * os_map_pci_resource_internal (uword os_handle, - u32 resource, - u8 *addr, - void ** result) + u32 resource, u8 * addr, void **result) { - linux_pci_main_t * pm = &linux_pci_main; - linux_pci_device_t * p; + linux_pci_main_t *pm = &linux_pci_main; + linux_pci_device_t *p; struct stat stat_buf; - u8 * file_name; + u8 *file_name; int fd; - clib_error_t * error; + clib_error_t *error; int flags = MAP_SHARED; error = 0; @@ -360,8 +364,7 @@ os_map_pci_resource_internal (uword os_handle, *result = mmap (addr, /* size */ stat_buf.st_size, - PROT_READ | PROT_WRITE, - flags, + PROT_READ | PROT_WRITE, flags, /* file */ fd, /* offset */ 0); if (*result == (void *) -1) @@ -370,7 +373,7 @@ os_map_pci_resource_internal (uword os_handle, goto done; } - done: +done: if (error) { if (fd >= 0) @@ -381,34 +384,33 @@ os_map_pci_resource_internal (uword os_handle, } clib_error_t * -vlib_pci_map_resource (vlib_pci_device_t * dev, - u32 resource, - void ** result) +vlib_pci_map_resource (vlib_pci_device_t * dev, u32 resource, void **result) { - return (os_map_pci_resource_internal (dev->os_handle, resource, 0 /* addr */, - result)); + return (os_map_pci_resource_internal + (dev->os_handle, resource, 0 /* addr */ , + result)); } clib_error_t * vlib_pci_map_resource_fixed (vlib_pci_device_t * dev, - u32 resource, - u8 *addr, - void ** result) + u32 resource, u8 * addr, void **result) { - return (os_map_pci_resource_internal (dev->os_handle, resource, addr, result)); + return (os_map_pci_resource_internal + (dev->os_handle, resource, addr, result)); } -void vlib_pci_free_device (vlib_pci_device_t * dev) +void +vlib_pci_free_device (vlib_pci_device_t * dev) { - linux_pci_main_t * pm = &linux_pci_main; - linux_pci_device_t * l; + linux_pci_main_t *pm = &linux_pci_main; + linux_pci_device_t *l; l = pool_elt_at_index (pm->linux_pci_devices, dev->os_handle); linux_pci_device_free (l); pool_put (pm->linux_pci_devices, l); } -pci_device_registration_t * __attribute__((unused)) +pci_device_registration_t * __attribute__ ((unused)) pci_device_next_registered (pci_device_registration_t * r) { uword i; @@ -425,11 +427,11 @@ init_device_from_registered (vlib_main_t * vm, vlib_pci_device_t * dev, linux_pci_device_t * pdev) { - vlib_pci_main_t * pm = &pci_main; - pci_device_registration_t * r; - pci_device_id_t * i; - pci_config_header_t * c; - clib_error_t * error; + vlib_pci_main_t *pm = &pci_main; + pci_device_registration_t *r; + pci_device_id_t *i; + pci_config_header_t *c; + clib_error_t *error; c = &dev->config0.header; @@ -438,8 +440,8 @@ init_device_from_registered (vlib_main_t * vm, while (r) { for (i = r->supported_devices; i->vendor_id != 0; i++) - if (i->vendor_id == c->vendor_id && i->device_id == c->device_id) - { + if (i->vendor_id == c->vendor_id && i->device_id == c->device_id) + { error = vlib_pci_bind_to_uio (dev, "uio_pci_generic"); if (error) { @@ -447,12 +449,12 @@ init_device_from_registered (vlib_main_t * vm, continue; } - add_device (dev, pdev); + add_device (dev, pdev); dev->interrupt_handler = r->interrupt_handler; - return r->init_function (vm, dev); - } + return r->init_function (vm, dev); + } r = r->next_registration; - } + } /* No driver, close the PCI config-space FD */ close (pdev->config_fd); return 0; @@ -460,22 +462,21 @@ init_device_from_registered (vlib_main_t * vm, static clib_error_t * init_device (vlib_main_t * vm, - vlib_pci_device_t * dev, - linux_pci_device_t * pdev) + vlib_pci_device_t * dev, linux_pci_device_t * pdev) { return init_device_from_registered (vm, dev, pdev); } static clib_error_t * -scan_device (void * arg, u8 * dev_dir_name, u8 * ignored) +scan_device (void *arg, u8 * dev_dir_name, u8 * ignored) { - vlib_main_t * vm = arg; - vlib_pci_main_t * pm = &pci_main; + vlib_main_t *vm = arg; + vlib_pci_main_t *pm = &pci_main; int fd; - u8 * f; - clib_error_t * error = 0; - vlib_pci_device_t * dev; - linux_pci_device_t pdev = {0}; + u8 *f; + clib_error_t *error = 0; + vlib_pci_device_t *dev; + linux_pci_device_t pdev = { 0 }; f = format (0, "%v/config%c", dev_dir_name, 0); fd = open ((char *) f, O_RDWR); @@ -494,8 +495,10 @@ scan_device (void * arg, u8 * dev_dir_name, u8 * ignored) /* You can only read more that 64 bytes of config space as root; so we try to read the full space but fall back to just the first 64 bytes. */ - if (read (fd, &dev->config_data, sizeof (dev->config_data)) != sizeof (dev->config_data) - && read (fd, &dev->config0, sizeof (dev->config0)) != sizeof (dev->config0)) + if (read (fd, &dev->config_data, sizeof (dev->config_data)) != + sizeof (dev->config_data) + && read (fd, &dev->config0, + sizeof (dev->config0)) != sizeof (dev->config0)) { pool_put (pm->pci_devs, dev); error = clib_error_return_unix (0, "read `%s'", f); @@ -508,11 +511,11 @@ scan_device (void * arg, u8 * dev_dir_name, u8 * ignored) if (all_ones.vendor_id == 0) memset (&all_ones, ~0, sizeof (all_ones)); - if (! memcmp (&dev->config0.header, &all_ones, sizeof (all_ones))) + if (!memcmp (&dev->config0.header, &all_ones, sizeof (all_ones))) { - pool_put (pm->pci_devs, dev); + pool_put (pm->pci_devs, dev); error = clib_error_return (0, "invalid PCI config for `%s'", f); - close (fd); + close (fd); goto done; } } @@ -529,8 +532,8 @@ scan_device (void * arg, u8 * dev_dir_name, u8 * ignored) unformat_init_string (&input, (char *) dev_dir_name, vec_len (dev_dir_name)); - if (! unformat (&input, "/sys/bus/pci/devices/%U", - unformat_vlib_pci_addr, &dev->bus_address)) + if (!unformat (&input, "/sys/bus/pci/devices/%U", + unformat_vlib_pci_addr, &dev->bus_address)) abort (); unformat_free (&input); @@ -541,20 +544,20 @@ scan_device (void * arg, u8 * dev_dir_name, u8 * ignored) pdev.config_fd = fd; pdev.dev_dir_name = dev_dir_name; - hash_set(pm->pci_dev_index_by_pci_addr, dev->bus_address.as_u32, - dev - pm->pci_devs); + hash_set (pm->pci_dev_index_by_pci_addr, dev->bus_address.as_u32, + dev - pm->pci_devs); error = init_device (vm, dev, &pdev); - vec_reset_length(f); + vec_reset_length (f); f = format (f, "%v/vpd%c", dev_dir_name, 0); fd = open ((char *) f, O_RDONLY); - if (fd >= 0) + if (fd >= 0) { while (1) { u8 tag[3]; - u8 * data = 0; + u8 *data = 0; int len; if (read (fd, &tag, 3) != 3) @@ -564,7 +567,7 @@ scan_device (void * arg, u8 * dev_dir_name, u8 * ignored) break; len = (tag[2] << 8) | tag[1]; - vec_validate(data, len); + vec_validate (data, len); if (read (fd, data, len) != len) { @@ -583,34 +586,36 @@ scan_device (void * arg, u8 * dev_dir_name, u8 * ignored) close (fd); } - vec_reset_length(f); + vec_reset_length (f); f = format (f, "%v/driver%c", dev_dir_name, 0); - dev->driver_name = vlib_sysfs_link_to_name((char *) f); + dev->driver_name = vlib_sysfs_link_to_name ((char *) f); dev->numa_node = -1; - vec_reset_length(f); + vec_reset_length (f); f = format (f, "%v/numa_node%c", dev_dir_name, 0); vlib_sysfs_read ((char *) f, "%u", &dev->numa_node); - done: +done: vec_free (f); return error; } -clib_error_t * linux_pci_init (vlib_main_t * vm) +clib_error_t * +linux_pci_init (vlib_main_t * vm) { - vlib_pci_main_t * pm = &pci_main; - clib_error_t * error; + vlib_pci_main_t *pm = &pci_main; + clib_error_t *error; pm->vlib_main = vm; if ((error = vlib_call_init_function (vm, unix_input_init))) return error; - ASSERT(sizeof(vlib_pci_addr_t) == sizeof(u32)); + ASSERT (sizeof (vlib_pci_addr_t) == sizeof (u32)); pm->pci_dev_index_by_pci_addr = hash_create (0, sizeof (uword)); - error = foreach_directory_file ("/sys/bus/pci/devices", scan_device, vm, /* scan_dirs */ 0); + error = foreach_directory_file ("/sys/bus/pci/devices", scan_device, vm, + /* scan_dirs */ 0); /* Complain and continue. might not be root, etc. */ if (error) @@ -620,3 +625,11 @@ clib_error_t * linux_pci_init (vlib_main_t * vm) } VLIB_INIT_FUNCTION (linux_pci_init); + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/pci/pci.c b/vlib/vlib/pci/pci.c index bbd122153d5..73ae541320a 100644 --- a/vlib/vlib/pci/pci.c +++ b/vlib/vlib/pci/pci.c @@ -54,27 +54,28 @@ vlib_pci_main_t pci_main; static clib_error_t * show_pci_fn (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { - vlib_pci_main_t * pm = &pci_main; - vlib_pci_device_t * d; - pci_config_header_t * c; + vlib_pci_main_t *pm = &pci_main; + vlib_pci_device_t *d; + pci_config_header_t *c; int show_all = 0; - u8 * s = 0; + u8 *s = 0; while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { if (unformat (input, "all")) - show_all = 1; + show_all = 1; else - return clib_error_return (0, "unknown input `%U'", - format_unformat_error, input); + return clib_error_return (0, "unknown input `%U'", + format_unformat_error, input); } vlib_cli_output (vm, "%-13s%-7s%-12s%-15s%-20s%-40s", - "Address", "Socket", "VID:PID", "Link Speed", "Driver", "Product Name"); + "Address", "Socket", "VID:PID", "Link Speed", "Driver", + "Product Name"); + /* *INDENT-OFF* */ pool_foreach (d, pm->pci_devs, ({ c = &d->config0.header; @@ -93,23 +94,24 @@ show_pci_fn (vlib_main_t * vm, d->driver_name ? (char *) d->driver_name : "", d->product_name); })); +/* *INDENT-ON* */ - vec_free(s); + vec_free (s); return 0; } uword unformat_vlib_pci_addr (unformat_input_t * input, va_list * args) { - vlib_pci_addr_t * addr = va_arg (* args, vlib_pci_addr_t *); + vlib_pci_addr_t *addr = va_arg (*args, vlib_pci_addr_t *); u32 x[4]; if (!unformat (input, "%x:%x:%x.%x", &x[0], &x[1], &x[2], &x[3])) return 0; - addr->domain = x[0]; - addr->bus = x[1]; - addr->slot = x[2]; + addr->domain = x[0]; + addr->bus = x[1]; + addr->slot = x[2]; addr->function = x[3]; return 1; @@ -118,7 +120,7 @@ unformat_vlib_pci_addr (unformat_input_t * input, va_list * args) u8 * format_vlib_pci_addr (u8 * s, va_list * va) { - vlib_pci_addr_t * addr = va_arg (* va, vlib_pci_addr_t *); + vlib_pci_addr_t *addr = va_arg (*va, vlib_pci_addr_t *); return format (s, "%04x:%02x:%02x.%x", addr->domain, addr->bus, addr->slot, addr->function); } @@ -126,15 +128,16 @@ format_vlib_pci_addr (u8 * s, va_list * va) u8 * format_vlib_pci_handle (u8 * s, va_list * va) { - vlib_pci_addr_t * addr = va_arg (* va, vlib_pci_addr_t *); + vlib_pci_addr_t *addr = va_arg (*va, vlib_pci_addr_t *); return format (s, "%x/%x/%x", addr->bus, addr->slot, addr->function); } u8 * -format_vlib_pci_link_speed (u8 *s, va_list * va) +format_vlib_pci_link_speed (u8 * s, va_list * va) { - vlib_pci_device_t * d = va_arg (* va, vlib_pci_device_t *); - pcie_config_regs_t * r = pci_config_find_capability (&d->config0, PCI_CAP_ID_PCIE); + vlib_pci_device_t *d = va_arg (*va, vlib_pci_device_t *); + pcie_config_regs_t *r = + pci_config_find_capability (&d->config0, PCI_CAP_ID_PCIE); int width; if (!r) @@ -152,15 +155,26 @@ format_vlib_pci_link_speed (u8 *s, va_list * va) } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (show_pci_command, static) = { .path = "show pci", .short_help = "show pci [all]", .function = show_pci_fn, }; +/* *INDENT-ON* */ -clib_error_t * pci_bus_init (vlib_main_t * vm) +clib_error_t * +pci_bus_init (vlib_main_t * vm) { return 0; } VLIB_INIT_FUNCTION (pci_bus_init); + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/pci/pci.h b/vlib/vlib/pci/pci.h index 7e8a9fcc80b..06e10b80e59 100644 --- a/vlib/vlib/pci/pci.h +++ b/vlib/vlib/pci/pci.h @@ -43,72 +43,74 @@ #include <vlib/vlib.h> #include <vlib/pci/pci_config.h> -typedef CLIB_PACKED (union { - struct { - u16 domain; - u8 bus; - u8 slot:5; - u8 function:3; - }; - u32 as_u32; -}) vlib_pci_addr_t; - -typedef struct vlib_pci_device { +typedef CLIB_PACKED (union + { + struct + { +u16 domain; u8 bus; u8 slot: 5; u8 function:3;}; + u32 as_u32;}) vlib_pci_addr_t; + +typedef struct vlib_pci_device +{ /* Operating system handle for this device. */ uword os_handle; vlib_pci_addr_t bus_address; /* First 64 bytes of configuration space. */ - union { + union + { pci_config_type0_regs_t config0; pci_config_type1_regs_t config1; u8 config_data[256]; }; /* Interrupt handler */ - void (* interrupt_handler) (struct vlib_pci_device * dev); + void (*interrupt_handler) (struct vlib_pci_device * dev); /* Driver name */ - u8 * driver_name; + u8 *driver_name; /* Numa Node */ int numa_node; /* Vital Product Data */ - u8 * product_name; - u8 * vpd_r; - u8 * vpd_w; + u8 *product_name; + u8 *vpd_r; + u8 *vpd_w; /* Private data */ uword private_data; } vlib_pci_device_t; -typedef struct { +typedef struct +{ u16 vendor_id, device_id; } pci_device_id_t; -typedef struct _pci_device_registration { +typedef struct _pci_device_registration +{ /* Driver init function. */ - clib_error_t * (* init_function) (vlib_main_t * vm, vlib_pci_device_t * dev); + clib_error_t *(*init_function) (vlib_main_t * vm, vlib_pci_device_t * dev); /* Interrupt handler */ - void (* interrupt_handler) (vlib_pci_device_t * dev); + void (*interrupt_handler) (vlib_pci_device_t * dev); /* List of registrations */ - struct _pci_device_registration * next_registration; + struct _pci_device_registration *next_registration; /* Vendor/device ids supported by this driver. */ pci_device_id_t supported_devices[]; } pci_device_registration_t; /* Pool of PCI devices. */ -typedef struct { - vlib_main_t * vlib_main; - vlib_pci_device_t * pci_devs; - pci_device_registration_t * pci_device_registrations; - uword * pci_dev_index_by_pci_addr; +typedef struct +{ + vlib_main_t *vlib_main; + vlib_pci_device_t *pci_devs; + pci_device_registration_t *pci_device_registrations; + uword *pci_dev_index_by_pci_addr; } vlib_pci_main_t; extern vlib_pci_main_t pci_main; @@ -125,16 +127,14 @@ static void __vlib_add_pci_device_registration_##x (void) \ } \ __VA_ARGS__ pci_device_registration_t x -clib_error_t * -vlib_pci_bind_to_uio (vlib_pci_device_t * d, char * uio_driver_name); +clib_error_t *vlib_pci_bind_to_uio (vlib_pci_device_t * d, + char *uio_driver_name); /* Configuration space read/write. */ -clib_error_t * -vlib_pci_read_write_config (vlib_pci_device_t * dev, - vlib_read_or_write_t read_or_write, - uword address, - void * data, - u32 n_bytes); +clib_error_t *vlib_pci_read_write_config (vlib_pci_device_t * dev, + vlib_read_or_write_t read_or_write, + uword address, + void *data, u32 n_bytes); #define _(t) \ static inline clib_error_t * \ @@ -145,9 +145,9 @@ vlib_pci_read_config_##t (vlib_pci_device_t * dev, \ sizeof (data[0])); \ } -_ (u32); -_ (u16); -_ (u8); +_(u32); +_(u16); +_(u8); #undef _ @@ -160,52 +160,52 @@ vlib_pci_write_config_##t (vlib_pci_device_t * dev, uword address, \ address, data, sizeof (data[0])); \ } -_ (u32); -_ (u16); -_ (u8); +_(u32); +_(u16); +_(u8); #undef _ static inline clib_error_t * -vlib_pci_intr_enable(vlib_pci_device_t * dev) +vlib_pci_intr_enable (vlib_pci_device_t * dev) { u16 command; - clib_error_t * err; + clib_error_t *err; - err = vlib_pci_read_config_u16(dev, 4, &command); + err = vlib_pci_read_config_u16 (dev, 4, &command); if (err) return err; command &= ~PCI_COMMAND_INTX_DISABLE; - return vlib_pci_write_config_u16(dev, 4, &command); + return vlib_pci_write_config_u16 (dev, 4, &command); } static inline clib_error_t * -vlib_pci_intr_disable(vlib_pci_device_t * dev) +vlib_pci_intr_disable (vlib_pci_device_t * dev) { u16 command; - clib_error_t * err; + clib_error_t *err; - err = vlib_pci_read_config_u16(dev, 4, &command); + err = vlib_pci_read_config_u16 (dev, 4, &command); if (err) return err; command |= PCI_COMMAND_INTX_DISABLE; - return vlib_pci_write_config_u16(dev, 4, &command); + return vlib_pci_write_config_u16 (dev, 4, &command); } static inline clib_error_t * -vlib_pci_bus_master_enable(vlib_pci_device_t * dev) +vlib_pci_bus_master_enable (vlib_pci_device_t * dev) { - clib_error_t * err; + clib_error_t *err; u16 command; /* Set bus master enable (BME) */ - err = vlib_pci_read_config_u16(dev, 4, &command); + err = vlib_pci_read_config_u16 (dev, 4, &command); if (err) return err; @@ -215,19 +215,18 @@ vlib_pci_bus_master_enable(vlib_pci_device_t * dev) command |= PCI_COMMAND_BUS_MASTER; - return vlib_pci_write_config_u16(dev, 4, &command); + return vlib_pci_write_config_u16 (dev, 4, &command); } -clib_error_t * -vlib_pci_map_resource (vlib_pci_device_t * dev, u32 resource, void ** result); +clib_error_t *vlib_pci_map_resource (vlib_pci_device_t * dev, u32 resource, + void **result); -clib_error_t * -vlib_pci_map_resource_fixed (vlib_pci_device_t * dev, u32 resource, u8 * addr, - void ** result); +clib_error_t *vlib_pci_map_resource_fixed (vlib_pci_device_t * dev, + u32 resource, u8 * addr, + void **result); /* Free's device. */ -void -vlib_pci_free_device (vlib_pci_device_t * dev); +void vlib_pci_free_device (vlib_pci_device_t * dev); unformat_function_t unformat_vlib_pci_addr; format_function_t format_vlib_pci_addr; @@ -235,3 +234,11 @@ format_function_t format_vlib_pci_handle; format_function_t format_vlib_pci_link_speed; #endif /* included_vlib_pci_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/pci/pci_config.h b/vlib/vlib/pci/pci_config.h index 9d6f08a7207..f65a36cac5a 100644 --- a/vlib/vlib/pci/pci_config.h +++ b/vlib/vlib/pci/pci_config.h @@ -43,7 +43,8 @@ #include <vppinfra/byte_order.h> #include <vppinfra/error.h> -typedef enum { +typedef enum +{ PCI_CLASS_NOT_DEFINED = 0x0000, PCI_CLASS_NOT_DEFINED_VGA = 0x0001, @@ -156,50 +157,53 @@ typedef enum { static inline pci_device_class_t pci_device_class_base (pci_device_class_t c) -{ return c &~ 0xff; } +{ + return c & ~0xff; +} /* * Under PCI, each device has 256 bytes of configuration address space, * of which the first 64 bytes are standardized as follows: */ -typedef struct { +typedef struct +{ u16 vendor_id; u16 device_id; u16 command; -#define PCI_COMMAND_IO (1 << 0) /* Enable response in I/O space */ -#define PCI_COMMAND_MEMORY (1 << 1) /* Enable response in Memory space */ -#define PCI_COMMAND_BUS_MASTER (1 << 2) /* Enable bus mastering */ -#define PCI_COMMAND_SPECIAL (1 << 3) /* Enable response to special cycles */ -#define PCI_COMMAND_WRITE_INVALIDATE (1 << 4) /* Use memory write and invalidate */ +#define PCI_COMMAND_IO (1 << 0) /* Enable response in I/O space */ +#define PCI_COMMAND_MEMORY (1 << 1) /* Enable response in Memory space */ +#define PCI_COMMAND_BUS_MASTER (1 << 2) /* Enable bus mastering */ +#define PCI_COMMAND_SPECIAL (1 << 3) /* Enable response to special cycles */ +#define PCI_COMMAND_WRITE_INVALIDATE (1 << 4) /* Use memory write and invalidate */ #define PCI_COMMAND_VGA_PALETTE_SNOOP (1 << 5) #define PCI_COMMAND_PARITY (1 << 6) -#define PCI_COMMAND_WAIT (1 << 7) /* Enable address/data stepping */ -#define PCI_COMMAND_SERR (1 << 8) /* Enable SERR */ +#define PCI_COMMAND_WAIT (1 << 7) /* Enable address/data stepping */ +#define PCI_COMMAND_SERR (1 << 8) /* Enable SERR */ #define PCI_COMMAND_BACK_TO_BACK_WRITE (1 << 9) -#define PCI_COMMAND_INTX_DISABLE (1 << 10) /* INTx Emulation Disable */ +#define PCI_COMMAND_INTX_DISABLE (1 << 10) /* INTx Emulation Disable */ u16 status; #define PCI_STATUS_INTX_PENDING (1 << 3) #define PCI_STATUS_CAPABILITY_LIST (1 << 4) -#define PCI_STATUS_66MHZ (1 << 5) /* Support 66 Mhz PCI 2.1 bus */ -#define PCI_STATUS_UDF (1 << 6) /* Support User Definable Features (obsolete) */ -#define PCI_STATUS_BACK_TO_BACK_WRITE (1 << 7) /* Accept fast-back to back */ -#define PCI_STATUS_PARITY_ERROR (1 << 8) /* Detected parity error */ +#define PCI_STATUS_66MHZ (1 << 5) /* Support 66 Mhz PCI 2.1 bus */ +#define PCI_STATUS_UDF (1 << 6) /* Support User Definable Features (obsolete) */ +#define PCI_STATUS_BACK_TO_BACK_WRITE (1 << 7) /* Accept fast-back to back */ +#define PCI_STATUS_PARITY_ERROR (1 << 8) /* Detected parity error */ #define PCI_STATUS_DEVSEL_GET(x) ((x >> 9) & 3) /* DEVSEL timing */ #define PCI_STATUS_DEVSEL_FAST (0 << 9) #define PCI_STATUS_DEVSEL_MEDIUM (1 << 9) #define PCI_STATUS_DEVSEL_SLOW (2 << 9) -#define PCI_STATUS_SIG_TARGET_ABORT (1 << 11) /* Set on target abort */ -#define PCI_STATUS_REC_TARGET_ABORT (1 << 12) /* Master ack of " */ -#define PCI_STATUS_REC_MASTER_ABORT (1 << 13) /* Set on master abort */ -#define PCI_STATUS_SIG_SYSTEM_ERROR (1 << 14) /* Set when we drive SERR */ +#define PCI_STATUS_SIG_TARGET_ABORT (1 << 11) /* Set on target abort */ +#define PCI_STATUS_REC_TARGET_ABORT (1 << 12) /* Master ack of " */ +#define PCI_STATUS_REC_MASTER_ABORT (1 << 13) /* Set on master abort */ +#define PCI_STATUS_SIG_SYSTEM_ERROR (1 << 14) /* Set when we drive SERR */ #define PCI_STATUS_DETECTED_PARITY_ERROR (1 << 15) u8 revision_id; - u8 programming_interface_class; /* Reg. Level Programming Interface */ + u8 programming_interface_class; /* Reg. Level Programming Interface */ - pci_device_class_t device_class : 16; + pci_device_class_t device_class:16; u8 cache_size; u8 latency_timer; @@ -219,25 +223,26 @@ typedef struct { always_inline void pci_config_header_little_to_host (pci_config_header_t * r) { - if (! CLIB_ARCH_IS_BIG_ENDIAN) + if (!CLIB_ARCH_IS_BIG_ENDIAN) return; #define _(f,t) r->f = clib_byte_swap_##t (r->f) - _ (vendor_id, u16); - _ (device_id, u16); - _ (command, u16); - _ (status, u16); - _ (device_class, u16); + _(vendor_id, u16); + _(device_id, u16); + _(command, u16); + _(status, u16); + _(device_class, u16); #undef _ } /* Header type 0 (normal devices) */ -typedef struct { +typedef struct +{ pci_config_header_t header; /* * Base addresses specify locations in memory or I/O space. - * Decoded size can be determined by writing a value of - * 0xffffffff to the register, and reading it back. Only + * Decoded size can be determined by writing a value of + * 0xffffffff to the register, and reading it back. Only * 1 bits are decoded. */ u32 base_address[6]; @@ -251,9 +256,9 @@ typedef struct { #define PCI_ROM_ADDRESS 0x30 /* Bits 31..11 are address, 10..1 reserved */ #define PCI_ROM_ADDRESS_ENABLE 0x01 #define PCI_ROM_ADDRESS_MASK (~0x7ffUL) - + u8 first_capability_offset; - CLIB_PAD_FROM_TO (0x35, 0x3c); + CLIB_PAD_FROM_TO (0x35, 0x3c); u8 interrupt_line; u8 interrupt_pin; @@ -267,21 +272,22 @@ always_inline void pci_config_type0_little_to_host (pci_config_type0_regs_t * r) { int i; - if (! CLIB_ARCH_IS_BIG_ENDIAN) + if (!CLIB_ARCH_IS_BIG_ENDIAN) return; pci_config_header_little_to_host (&r->header); #define _(f,t) r->f = clib_byte_swap_##t (r->f) for (i = 0; i < ARRAY_LEN (r->base_address); i++) - _ (base_address[i], u32); - _ (cardbus_cis, u16); - _ (subsystem_vendor_id, u16); - _ (subsystem_id, u16); - _ (rom_address, u32); + _(base_address[i], u32); + _(cardbus_cis, u16); + _(subsystem_vendor_id, u16); + _(subsystem_id, u16); + _(rom_address, u32); #undef _ } /* Header type 1 (PCI-to-PCI bridges) */ -typedef struct { +typedef struct +{ pci_config_header_t header; u32 base_address[2]; @@ -319,17 +325,17 @@ typedef struct { /* Same as for type 0. */ u8 capability_list_offset; - CLIB_PAD_FROM_TO (0x35, 0x37); + CLIB_PAD_FROM_TO (0x35, 0x37); u32 rom_address; - CLIB_PAD_FROM_TO (0x3c, 0x3e); + CLIB_PAD_FROM_TO (0x3c, 0x3e); u16 bridge_control; #define PCI_BRIDGE_CTL_PARITY 0x01 /* Enable parity detection on secondary interface */ #define PCI_BRIDGE_CTL_SERR 0x02 /* The same for SERR forwarding */ #define PCI_BRIDGE_CTL_NO_ISA 0x04 /* Disable bridging of ISA ports */ #define PCI_BRIDGE_CTL_VGA 0x08 /* Forward VGA addresses */ -#define PCI_BRIDGE_CTL_MASTER_ABORT 0x20 /* Report master aborts */ +#define PCI_BRIDGE_CTL_MASTER_ABORT 0x20 /* Report master aborts */ #define PCI_BRIDGE_CTL_BUS_RESET 0x40 /* Secondary bus reset */ #define PCI_BRIDGE_CTL_FAST_BACK 0x80 /* Fast Back2Back enabled on secondary interface */ @@ -340,28 +346,29 @@ always_inline void pci_config_type1_little_to_host (pci_config_type1_regs_t * r) { int i; - if (! CLIB_ARCH_IS_BIG_ENDIAN) + if (!CLIB_ARCH_IS_BIG_ENDIAN) return; pci_config_header_little_to_host (&r->header); #define _(f,t) r->f = clib_byte_swap_##t (r->f) for (i = 0; i < ARRAY_LEN (r->base_address); i++) - _ (base_address[i], u32); - _ (secondary_status, u16); - _ (memory_base, u16); - _ (memory_limit, u16); - _ (prefetchable_memory_base, u16); - _ (prefetchable_memory_limit, u16); - _ (prefetchable_memory_base_upper_32bits, u32); - _ (prefetchable_memory_limit_upper_32bits, u32); - _ (io_base_upper_16bits, u16); - _ (io_limit_upper_16bits, u16); - _ (rom_address, u32); - _ (bridge_control, u16); + _(base_address[i], u32); + _(secondary_status, u16); + _(memory_base, u16); + _(memory_limit, u16); + _(prefetchable_memory_base, u16); + _(prefetchable_memory_limit, u16); + _(prefetchable_memory_base_upper_32bits, u32); + _(prefetchable_memory_limit_upper_32bits, u32); + _(io_base_upper_16bits, u16); + _(io_limit_upper_16bits, u16); + _(rom_address, u32); + _(bridge_control, u16); #undef _ } /* Capabilities. */ -typedef enum pci_capability_type { +typedef enum pci_capability_type +{ /* Power Management */ PCI_CAP_ID_PM = 1, @@ -378,7 +385,7 @@ typedef enum pci_capability_type { PCI_CAP_ID_MSI = 5, /* CompactPCI HotSwap */ - PCI_CAP_ID_CHSWP = 6, + PCI_CAP_ID_CHSWP = 6, /* PCI-X */ PCI_CAP_ID_PCIX = 7, @@ -397,26 +404,25 @@ typedef enum pci_capability_type { } pci_capability_type_t; /* Common header for capabilities. */ -typedef CLIB_PACKED (struct { - enum pci_capability_type type : 8; - - u8 next_offset; -}) pci_capability_regs_t; +typedef CLIB_PACKED (struct + { + enum pci_capability_type type:8; + u8 next_offset;}) pci_capability_regs_t; always_inline void * pci_config_find_capability (pci_config_type0_regs_t * t, int cap_type) { - pci_capability_regs_t * c; + pci_capability_regs_t *c; u32 next_offset; u32 ttl = 48; - if (! (t->header.status & PCI_STATUS_CAPABILITY_LIST)) + if (!(t->header.status & PCI_STATUS_CAPABILITY_LIST)) return 0; next_offset = t->first_capability_offset; while (ttl-- && next_offset >= 0x40) { - c = (void *) t + (next_offset &~ 3); + c = (void *) t + (next_offset & ~3); if ((u8) c->type == 0xff) break; if (c->type == cap_type) @@ -427,49 +433,41 @@ pci_config_find_capability (pci_config_type0_regs_t * t, int cap_type) } /* Power Management Registers */ -typedef CLIB_PACKED (struct { - pci_capability_regs_t header; - - u16 capabilities; +typedef CLIB_PACKED (struct + { + pci_capability_regs_t header; u16 capabilities; #define PCI_PM_CAP_VER_MASK 0x0007 /* Version */ #define PCI_PM_CAP_PME_CLOCK 0x0008 /* PME clock required */ -#define PCI_PM_CAP_RESERVED 0x0010 /* Reserved field */ +#define PCI_PM_CAP_RESERVED 0x0010 /* Reserved field */ #define PCI_PM_CAP_DSI 0x0020 /* Device specific initialization */ #define PCI_PM_CAP_AUX_POWER 0x01C0 /* Auxilliary power support mask */ #define PCI_PM_CAP_D1 0x0200 /* D1 power state support */ #define PCI_PM_CAP_D2 0x0400 /* D2 power state support */ #define PCI_PM_CAP_PME 0x0800 /* PME pin supported */ -#define PCI_PM_CAP_PME_MASK 0xF800 /* PME Mask of all supported states */ -#define PCI_PM_CAP_PME_D0 0x0800 /* PME# from D0 */ -#define PCI_PM_CAP_PME_D1 0x1000 /* PME# from D1 */ -#define PCI_PM_CAP_PME_D2 0x2000 /* PME# from D2 */ -#define PCI_PM_CAP_PME_D3 0x4000 /* PME# from D3 (hot) */ -#define PCI_PM_CAP_PME_D3cold 0x8000 /* PME# from D3 (cold) */ - - u16 control; +#define PCI_PM_CAP_PME_MASK 0xF800 /* PME Mask of all supported states */ +#define PCI_PM_CAP_PME_D0 0x0800 /* PME# from D0 */ +#define PCI_PM_CAP_PME_D1 0x1000 /* PME# from D1 */ +#define PCI_PM_CAP_PME_D2 0x2000 /* PME# from D2 */ +#define PCI_PM_CAP_PME_D3 0x4000 /* PME# from D3 (hot) */ +#define PCI_PM_CAP_PME_D3cold 0x8000 /* PME# from D3 (cold) */ + u16 control; #define PCI_PM_CTRL_STATE_MASK 0x0003 /* Current power state (D0 to D3) */ #define PCI_PM_CTRL_PME_ENABLE 0x0100 /* PME pin enable */ #define PCI_PM_CTRL_DATA_SEL_MASK 0x1e00 /* Data select (??) */ #define PCI_PM_CTRL_DATA_SCALE_MASK 0x6000 /* Data scale (??) */ #define PCI_PM_CTRL_PME_STATUS 0x8000 /* PME pin status */ - - u8 extensions; + u8 extensions; #define PCI_PM_PPB_B2_B3 0x40 /* Stop clock when in D3hot (??) */ #define PCI_PM_BPCC_ENABLE 0x80 /* Bus power/clock control enable (??) */ - - u8 data; -}) pci_power_management_regs_t; + u8 data;}) pci_power_management_regs_t; /* AGP registers */ -typedef CLIB_PACKED (struct { - pci_capability_regs_t header; - u8 version; - u8 rest_of_capability_flags; - - u32 status; - u32 command; - /* Command & status common bits. */ -#define PCI_AGP_RQ_MASK 0xff000000 /* Maximum number of requests - 1 */ +typedef CLIB_PACKED (struct + { + pci_capability_regs_t header; u8 version; + u8 rest_of_capability_flags; u32 status; u32 command; + /* Command & status common bits. */ +#define PCI_AGP_RQ_MASK 0xff000000 /* Maximum number of requests - 1 */ #define PCI_AGP_SBA 0x0200 /* Sideband addressing supported */ #define PCI_AGP_64BIT 0x0020 /* 64-bit addressing supported */ #define PCI_AGP_ALLOW_TRANSACTIONS 0x0100 /* Allow processing of AGP transactions */ @@ -477,58 +475,47 @@ typedef CLIB_PACKED (struct { #define PCI_AGP_RATE4 0x0004 /* 4x transfer rate supported */ #define PCI_AGP_RATE2 0x0002 /* 2x transfer rate supported */ #define PCI_AGP_RATE1 0x0001 /* 1x transfer rate supported */ -}) pci_agp_regs_t; + }) pci_agp_regs_t; /* Vital Product Data */ -typedef CLIB_PACKED (struct { - pci_capability_regs_t header; - u16 address; +typedef CLIB_PACKED (struct + { + pci_capability_regs_t header; u16 address; #define PCI_VPD_ADDR_MASK 0x7fff /* Address mask */ #define PCI_VPD_ADDR_F 0x8000 /* Write 0, 1 indicates completion */ - - u32 data; -}) pci_vpd_regs_t; + u32 data;}) pci_vpd_regs_t; /* Slot Identification */ -typedef CLIB_PACKED (struct { - pci_capability_regs_t header; - u8 esr; +typedef CLIB_PACKED (struct + { + pci_capability_regs_t header; u8 esr; #define PCI_SID_ESR_NSLOTS 0x1f /* Number of expansion slots available */ #define PCI_SID_ESR_FIC 0x20 /* First In Chassis Flag */ - u8 chassis; -}) pci_sid_regs_t; + u8 chassis;}) pci_sid_regs_t; /* Message Signalled Interrupts registers */ -typedef CLIB_PACKED (struct { - pci_capability_regs_t header; - - u16 flags; -#define PCI_MSI_FLAGS_ENABLE (1 << 0) /* MSI feature enabled */ +typedef CLIB_PACKED (struct + { + pci_capability_regs_t header; u16 flags; +#define PCI_MSI_FLAGS_ENABLE (1 << 0) /* MSI feature enabled */ #define PCI_MSI_FLAGS_GET_MAX_QUEUE_SIZE(x) ((x >> 1) & 0x7) #define PCI_MSI_FLAGS_MAX_QUEUE_SIZE(x) (((x) & 0x7) << 1) #define PCI_MSI_FLAGS_GET_QUEUE_SIZE(x) ((x >> 4) & 0x7) #define PCI_MSI_FLAGS_QUEUE_SIZE(x) (((x) & 0x7) << 4) -#define PCI_MSI_FLAGS_64BIT (1 << 7) /* 64-bit addresses allowed */ -#define PCI_MSI_FLAGS_MASKBIT (1 << 8) /* 64-bit mask bits allowed */ - - u32 address; - u32 data; - u32 mask_bits; -}) pci_msi32_regs_t; - -typedef CLIB_PACKED (struct { - pci_capability_regs_t header; - u16 flags; - u32 address[2]; - u32 data; - u32 mask_bits; -}) pci_msi64_regs_t; +#define PCI_MSI_FLAGS_64BIT (1 << 7) /* 64-bit addresses allowed */ +#define PCI_MSI_FLAGS_MASKBIT (1 << 8) /* 64-bit mask bits allowed */ + u32 address; u32 data; u32 mask_bits;}) pci_msi32_regs_t; -/* CompactPCI Hotswap Register */ -typedef CLIB_PACKED (struct { - pci_capability_regs_t header; +typedef CLIB_PACKED (struct + { + pci_capability_regs_t header; u16 flags; + u32 address[2]; + u32 data; u32 mask_bits;}) pci_msi64_regs_t; - u16 control_status; +/* CompactPCI Hotswap Register */ +typedef CLIB_PACKED (struct + { + pci_capability_regs_t header; u16 control_status; #define PCI_CHSWP_DHA 0x01 /* Device Hiding Arm */ #define PCI_CHSWP_EIM 0x02 /* ENUM# Signal Mask */ #define PCI_CHSWP_PIE 0x04 /* Pending Insert or Extract */ @@ -536,20 +523,18 @@ typedef CLIB_PACKED (struct { #define PCI_CHSWP_PI 0x30 /* Programming Interface */ #define PCI_CHSWP_EXT 0x40 /* ENUM# status - extraction */ #define PCI_CHSWP_INS 0x80 /* ENUM# status - insertion */ -}) pci_chswp_regs_t; + }) pci_chswp_regs_t; /* PCIX registers */ -typedef CLIB_PACKED (struct { - pci_capability_regs_t header; - - u16 command; +typedef CLIB_PACKED (struct + { + pci_capability_regs_t header; u16 command; #define PCIX_CMD_DPERR_E 0x0001 /* Data Parity Error Recovery Enable */ #define PCIX_CMD_ERO 0x0002 /* Enable Relaxed Ordering */ #define PCIX_CMD_MAX_READ 0x000c /* Max Memory Read Byte Count */ #define PCIX_CMD_MAX_SPLIT 0x0070 /* Max Outstanding Split Transactions */ -#define PCIX_CMD_VERSION(x) (((x) >> 12) & 3) /* Version */ - - u32 status; +#define PCIX_CMD_VERSION(x) (((x) >> 12) & 3) /* Version */ + u32 status; #define PCIX_STATUS_DEVFN 0x000000ff /* A copy of devfn */ #define PCIX_STATUS_BUS 0x0000ff00 /* A copy of bus nr */ #define PCIX_STATUS_64BIT 0x00010000 /* 64-bit device */ @@ -563,16 +548,18 @@ typedef CLIB_PACKED (struct { #define PCIX_STATUS_SPL_ERR 0x20000000 /* Rcvd Split Completion Error Msg */ #define PCIX_STATUS_266MHZ 0x40000000 /* 266 MHz capable */ #define PCIX_STATUS_533MHZ 0x80000000 /* 533 MHz capable */ -}) pcix_config_regs_t; + }) pcix_config_regs_t; -static inline int pcie_size_to_code (int bytes) +static inline int +pcie_size_to_code (int bytes) { ASSERT (is_pow2 (bytes)); ASSERT (bytes <= 4096); return min_log2 (bytes) - 7; } -static inline int pcie_code_to_size (int code) +static inline int +pcie_code_to_size (int code) { int size = 1 << (code + 7); ASSERT (size <= 4096); @@ -580,27 +567,25 @@ static inline int pcie_code_to_size (int code) } /* PCI Express capability registers */ -typedef CLIB_PACKED (struct { - pci_capability_regs_t header; - - u16 pcie_capabilities; +typedef CLIB_PACKED (struct + { + pci_capability_regs_t header; u16 pcie_capabilities; #define PCIE_CAP_VERSION(x) (((x) >> 0) & 0xf) #define PCIE_CAP_DEVICE_TYPE(x) (((x) >> 4) & 0xf) #define PCIE_DEVICE_TYPE_ENDPOINT 0 #define PCIE_DEVICE_TYPE_LEGACY_ENDPOINT 1 #define PCIE_DEVICE_TYPE_ROOT_PORT 4 - /* Upstream/downstream port of PCI Express switch. */ + /* Upstream/downstream port of PCI Express switch. */ #define PCIE_DEVICE_TYPE_SWITCH_UPSTREAM 5 #define PCIE_DEVICE_TYPE_SWITCH_DOWNSTREAM 6 #define PCIE_DEVICE_TYPE_PCIE_TO_PCI_BRIDGE 7 #define PCIE_DEVICE_TYPE_PCI_TO_PCIE_BRIDGE 8 - /* Root complex integrated endpoint. */ + /* Root complex integrated endpoint. */ #define PCIE_DEVICE_TYPE_ROOT_COMPLEX_ENDPOINT 9 #define PCIE_DEVICE_TYPE_ROOT_COMPLEX_EVENT_COLLECTOR 10 #define PCIE_CAP_SLOW_IMPLEMENTED (1 << 8) #define PCIE_CAP_MSI_IRQ(x) (((x) >> 9) & 0x1f) - - u32 dev_capabilities; + u32 dev_capabilities; #define PCIE_DEVCAP_MAX_PAYLOAD(x) (128 << (((x) >> 0) & 0x7)) #define PCIE_DEVCAP_PHANTOM_BITS(x) (((x) >> 3) & 0x3) #define PCIE_DEVCAP_EXTENTED_TAG (1 << 5) @@ -609,59 +594,45 @@ typedef CLIB_PACKED (struct { #define PCIE_DEVCAP_ATN_BUT 0x1000 /* Attention Button Present */ #define PCIE_DEVCAP_ATN_IND 0x2000 /* Attention Indicator Present */ #define PCIE_DEVCAP_PWR_IND 0x4000 /* Power Indicator Present */ -#define PCIE_DEVCAP_PWR_VAL 0x3fc0000 /* Slot Power Limit Value */ -#define PCIE_DEVCAP_PWR_SCL 0xc000000 /* Slot Power Limit Scale */ - - u16 dev_control; +#define PCIE_DEVCAP_PWR_VAL 0x3fc0000 /* Slot Power Limit Value */ +#define PCIE_DEVCAP_PWR_SCL 0xc000000 /* Slot Power Limit Scale */ + u16 dev_control; #define PCIE_CTRL_CERE 0x0001 /* Correctable Error Reporting En. */ #define PCIE_CTRL_NFERE 0x0002 /* Non-Fatal Error Reporting Enable */ #define PCIE_CTRL_FERE 0x0004 /* Fatal Error Reporting Enable */ #define PCIE_CTRL_URRE 0x0008 /* Unsupported Request Reporting En. */ -#define PCIE_CTRL_RELAX_EN 0x0010 /* Enable relaxed ordering */ +#define PCIE_CTRL_RELAX_EN 0x0010 /* Enable relaxed ordering */ #define PCIE_CTRL_MAX_PAYLOAD(n) (((n) & 7) << 5) #define PCIE_CTRL_EXT_TAG 0x0100 /* Extended Tag Field Enable */ #define PCIE_CTRL_PHANTOM 0x0200 /* Phantom Functions Enable */ #define PCIE_CTRL_AUX_PME 0x0400 /* Auxiliary Power PM Enable */ -#define PCIE_CTRL_NOSNOOP_EN 0x0800 /* Enable No Snoop */ +#define PCIE_CTRL_NOSNOOP_EN 0x0800 /* Enable No Snoop */ #define PCIE_CTRL_MAX_READ_REQUEST(n) (((n) & 7) << 12) - - u16 dev_status; + u16 dev_status; #define PCIE_DEVSTA_AUXPD 0x10 /* AUX Power Detected */ #define PCIE_DEVSTA_TRPND 0x20 /* Transactions Pending */ - - u32 link_capabilities; - u16 link_control; - u16 link_status; - - u32 slot_capabilities; - u16 slot_control; - u16 slot_status; - - u16 root_control; + u32 link_capabilities; u16 link_control; u16 link_status; + u32 slot_capabilities; + u16 slot_control; u16 slot_status; u16 root_control; #define PCIE_RTCTL_SECEE 0x01 /* System Error on Correctable Error */ #define PCIE_RTCTL_SENFEE 0x02 /* System Error on Non-Fatal Error */ #define PCIE_RTCTL_SEFEE 0x04 /* System Error on Fatal Error */ #define PCIE_RTCTL_PMEIE 0x08 /* PME Interrupt Enable */ #define PCIE_RTCTL_CRSSVE 0x10 /* CRS Software Visibility Enable */ - - u16 root_capabilities; - u32 root_status; - - u32 dev_capabilities2; - u16 dev_control2; - u16 dev_status2; - - u32 link_capabilities2; - u16 link_control2; - u16 link_status2; - - u32 slot_capabilities2; - u16 slot_control2; - u16 slot_status2; -}) pcie_config_regs_t; + u16 root_capabilities; + u32 root_status; + u32 dev_capabilities2; + u16 dev_control2; + u16 dev_status2; + u32 link_capabilities2; + u16 link_control2; + u16 link_status2; + u32 slot_capabilities2; u16 slot_control2; + u16 slot_status2;}) pcie_config_regs_t; /* PCI express extended capabilities. */ -typedef enum pcie_capability_type { +typedef enum pcie_capability_type +{ PCIE_CAP_ADVANCED_ERROR = 1, PCIE_CAP_VC = 2, PCIE_CAP_DSN = 3, @@ -669,18 +640,14 @@ typedef enum pcie_capability_type { } pcie_capability_type_t; /* Common header for capabilities. */ -typedef CLIB_PACKED (struct { - enum pcie_capability_type type : 16; - - u16 version : 4; - - u16 next_capability : 12; -}) pcie_capability_regs_t; - -typedef CLIB_PACKED (struct { - pcie_capability_regs_t header; - - u32 uncorrectable_status; +typedef CLIB_PACKED (struct + { +enum pcie_capability_type type:16; u16 version: 4; u16 next_capability:12;}) + pcie_capability_regs_t; + +typedef CLIB_PACKED (struct + { + pcie_capability_regs_t header; u32 uncorrectable_status; #define PCIE_ERROR_UNC_LINK_TRAINING (1 << 0) #define PCIE_ERROR_UNC_DATA_LINK_PROTOCOL (1 << 4) #define PCIE_ERROR_UNC_SURPRISE_DOWN (1 << 5) @@ -693,27 +660,20 @@ typedef CLIB_PACKED (struct { #define PCIE_ERROR_UNC_MALFORMED_TLP (1 << 18) #define PCIE_ERROR_UNC_CRC_ERROR (1 << 19) #define PCIE_ERROR_UNC_UNSUPPORTED_REQUEST (1 << 20) - u32 uncorrectable_mask; - u32 uncorrectable_severity; - - u32 correctable_status; + u32 uncorrectable_mask; + u32 uncorrectable_severity; u32 correctable_status; #define PCIE_ERROR_COR_RX_ERROR (1 << 0) #define PCIE_ERROR_COR_BAD_TLP (1 << 6) #define PCIE_ERROR_COR_BAD_DLLP (1 << 7) #define PCIE_ERROR_COR_REPLAY_ROLLOVER (1 << 8) #define PCIE_ERROR_COR_REPLAY_TIMER (1 << 12) #define PCIE_ERROR_COR_ADVISORY (1 << 13) - - u32 correctable_mask; - u32 control; - u32 log[4]; - - u32 root_command; - - u32 root_status; - u16 correctable_error_source; - u16 error_source; -}) pcie_advanced_error_regs_t; + u32 correctable_mask; + u32 control; + u32 log[4]; + u32 root_command; + u32 root_status; u16 correctable_error_source; + u16 error_source;}) pcie_advanced_error_regs_t; /* Virtual Channel */ #define PCI_VC_PORT_REG1 4 @@ -727,13 +687,21 @@ typedef CLIB_PACKED (struct { /* Power Budgeting */ #define PCI_PWR_DSR 4 /* Data Select Register */ #define PCI_PWR_DATA 8 /* Data Register */ -#define PCI_PWR_DATA_BASE(x) ((x) & 0xff) /* Base Power */ -#define PCI_PWR_DATA_SCALE(x) (((x) >> 8) & 3) /* Data Scale */ -#define PCI_PWR_DATA_PM_SUB(x) (((x) >> 10) & 7) /* PM Sub State */ -#define PCI_PWR_DATA_PM_STATE(x) (((x) >> 13) & 3) /* PM State */ -#define PCI_PWR_DATA_TYPE(x) (((x) >> 15) & 7) /* Type */ -#define PCI_PWR_DATA_RAIL(x) (((x) >> 18) & 7) /* Power Rail */ +#define PCI_PWR_DATA_BASE(x) ((x) & 0xff) /* Base Power */ +#define PCI_PWR_DATA_SCALE(x) (((x) >> 8) & 3) /* Data Scale */ +#define PCI_PWR_DATA_PM_SUB(x) (((x) >> 10) & 7) /* PM Sub State */ +#define PCI_PWR_DATA_PM_STATE(x) (((x) >> 13) & 3) /* PM State */ +#define PCI_PWR_DATA_TYPE(x) (((x) >> 15) & 7) /* Type */ +#define PCI_PWR_DATA_RAIL(x) (((x) >> 18) & 7) /* Power Rail */ #define PCI_PWR_CAP 12 /* Capability */ #define PCI_PWR_CAP_BUDGET(x) ((x) & 1) /* Included in system budget */ #endif /* included_vlib_pci_config_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/physmem.h b/vlib/vlib/physmem.h index 6f75a0f3662..9e7d52a6226 100644 --- a/vlib/vlib/physmem.h +++ b/vlib/vlib/physmem.h @@ -40,11 +40,13 @@ #ifndef included_vlib_physmem_h #define included_vlib_physmem_h -typedef struct { +typedef struct +{ uword start, end, size; } vlib_physmem_region_t; -typedef struct { +typedef struct +{ vlib_physmem_region_t virtual; uword log2_n_bytes_per_page; @@ -52,7 +54,7 @@ typedef struct { /* 1 << log2_n_bytes_per_page - 1. */ uword page_mask; - u64 * page_table; + u64 *page_table; /* is fake physmem */ u8 is_fake; @@ -69,10 +71,12 @@ vlib_physmem_offset_to_physical (vlib_physmem_main_t * pm, uword o) always_inline int vlib_physmem_is_virtual (vlib_physmem_main_t * pm, uword p) -{ return p >= pm->virtual.start && p < pm->virtual.end; } +{ + return p >= pm->virtual.start && p < pm->virtual.end; +} always_inline uword -vlib_physmem_offset_of (vlib_physmem_main_t * pm, void * p) +vlib_physmem_offset_of (vlib_physmem_main_t * pm, void *p) { uword a = pointer_to_uword (p); uword o; @@ -94,3 +98,11 @@ vlib_physmem_at_offset (vlib_physmem_main_t * pm, uword offset) } #endif /* included_vlib_physmem_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/threads.c b/vlib/vlib/threads.c index d2ce449f6ce..47db218dc0e 100644 --- a/vlib/vlib/threads.c +++ b/vlib/vlib/threads.c @@ -41,12 +41,13 @@ DECLARE_CJ_GLOBAL_LOG; * Weak definitions of DPDK symbols used in this file. * Needed for linking test programs without DPDK libs. */ -unsigned __thread __attribute__((weak)) RTE_PER_LCORE(_lcore_id); -struct lcore_config __attribute__((weak)) lcore_config[]; -unsigned __attribute__((weak)) rte_socket_id(); -int __attribute__((weak)) rte_eal_remote_launch(); +unsigned __thread __attribute__ ((weak)) RTE_PER_LCORE (_lcore_id); +struct lcore_config __attribute__ ((weak)) lcore_config[]; +unsigned __attribute__ ((weak)) rte_socket_id (); +int __attribute__ ((weak)) rte_eal_remote_launch (); #endif -u32 vl(void *p) +u32 +vl (void *p) { return vec_len (p); } @@ -56,7 +57,7 @@ vlib_thread_main_t vlib_thread_main; uword os_get_cpu_number (void) { - void * sp; + void *sp; uword n; u32 len; @@ -67,8 +68,8 @@ os_get_cpu_number (void) /* Get any old stack address. */ sp = &sp; - n = ((uword)sp - (uword)vlib_thread_stacks[0]) - >> VLIB_LOG2_THREAD_STACK_SIZE; + n = ((uword) sp - (uword) vlib_thread_stacks[0]) + >> VLIB_LOG2_THREAD_STACK_SIZE; /* "processes" have their own stacks, and they always run in thread 0 */ n = n >= len ? 0 : n; @@ -80,23 +81,24 @@ void vlib_set_thread_name (char *name) { int pthread_setname_np (pthread_t __target_thread, const char *__name); - pthread_t thread = pthread_self(); + pthread_t thread = pthread_self (); - if (thread) - pthread_setname_np(thread, name); + if (thread) + pthread_setname_np (thread, name); } -static int sort_registrations_by_no_clone (void *a0, void * a1) -{ - vlib_thread_registration_t ** tr0 = a0; - vlib_thread_registration_t ** tr1 = a1; +static int +sort_registrations_by_no_clone (void *a0, void *a1) +{ + vlib_thread_registration_t **tr0 = a0; + vlib_thread_registration_t **tr1 = a1; - return ((i32)((*tr0)->no_data_structure_clone) - - ((i32)((*tr1)->no_data_structure_clone))); + return ((i32) ((*tr0)->no_data_structure_clone) + - ((i32) ((*tr1)->no_data_structure_clone))); } static uword * -vlib_sysfs_list_to_bitmap(char * filename) +vlib_sysfs_list_to_bitmap (char *filename) { FILE *fp; uword *r = 0; @@ -105,17 +107,18 @@ vlib_sysfs_list_to_bitmap(char * filename) if (fp != NULL) { - u8 * buffer = 0; - vec_validate (buffer, 256-1); - if (fgets ((char *)buffer, 256, fp)) - { - unformat_input_t in; - unformat_init_string (&in, (char *) buffer, strlen ((char *) buffer)); - unformat(&in, "%U", unformat_bitmap_list, &r); - unformat_free (&in); - } - vec_free(buffer); - fclose(fp); + u8 *buffer = 0; + vec_validate (buffer, 256 - 1); + if (fgets ((char *) buffer, 256, fp)) + { + unformat_input_t in; + unformat_init_string (&in, (char *) buffer, + strlen ((char *) buffer)); + unformat (&in, "%U", unformat_bitmap_list, &r); + unformat_free (&in); + } + vec_free (buffer); + fclose (fp); } return r; } @@ -126,73 +129,73 @@ vlib_sysfs_list_to_bitmap(char * filename) clib_error_t * vlib_thread_init (vlib_main_t * vm) { - vlib_thread_main_t * tm = &vlib_thread_main; - vlib_worker_thread_t * w; - vlib_thread_registration_t * tr; + vlib_thread_main_t *tm = &vlib_thread_main; + vlib_worker_thread_t *w; + vlib_thread_registration_t *tr; u32 n_vlib_mains = 1; u32 first_index = 1; u32 i; - uword * avail_cpu; + uword *avail_cpu; /* get bitmaps of active cpu cores and sockets */ tm->cpu_core_bitmap = - vlib_sysfs_list_to_bitmap("/sys/devices/system/cpu/online"); + vlib_sysfs_list_to_bitmap ("/sys/devices/system/cpu/online"); tm->cpu_socket_bitmap = - vlib_sysfs_list_to_bitmap("/sys/devices/system/node/online"); + vlib_sysfs_list_to_bitmap ("/sys/devices/system/node/online"); - avail_cpu = clib_bitmap_dup(tm->cpu_core_bitmap); + avail_cpu = clib_bitmap_dup (tm->cpu_core_bitmap); /* skip cores */ - for (i=0; i < tm->skip_cores; i++) + for (i = 0; i < tm->skip_cores; i++) { - uword c = clib_bitmap_first_set(avail_cpu); + uword c = clib_bitmap_first_set (avail_cpu); if (c == ~0) - return clib_error_return (0, "no available cpus to skip"); + return clib_error_return (0, "no available cpus to skip"); - avail_cpu = clib_bitmap_set(avail_cpu, c, 0); + avail_cpu = clib_bitmap_set (avail_cpu, c, 0); } /* grab cpu for main thread */ if (!tm->main_lcore) { - tm->main_lcore = clib_bitmap_first_set(avail_cpu); - if (tm->main_lcore == (u8) ~0) - return clib_error_return (0, "no available cpus to be used for the" - " main thread"); + tm->main_lcore = clib_bitmap_first_set (avail_cpu); + if (tm->main_lcore == (u8) ~ 0) + return clib_error_return (0, "no available cpus to be used for the" + " main thread"); } else { - if (clib_bitmap_get(avail_cpu, tm->main_lcore) == 0) - return clib_error_return (0, "cpu %u is not available to be used" - " for the main thread", tm->main_lcore); + if (clib_bitmap_get (avail_cpu, tm->main_lcore) == 0) + return clib_error_return (0, "cpu %u is not available to be used" + " for the main thread", tm->main_lcore); } - avail_cpu = clib_bitmap_set(avail_cpu, tm->main_lcore, 0); + avail_cpu = clib_bitmap_set (avail_cpu, tm->main_lcore, 0); /* assume that there is socket 0 only if there is no data from sysfs */ if (!tm->cpu_socket_bitmap) - tm->cpu_socket_bitmap = clib_bitmap_set(0, 0, 1); + tm->cpu_socket_bitmap = clib_bitmap_set (0, 0, 1); /* pin main thread to main_lcore */ #if DPDK==0 { - cpu_set_t cpuset; - CPU_ZERO(&cpuset); - CPU_SET(tm->main_lcore, &cpuset); - pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + cpu_set_t cpuset; + CPU_ZERO (&cpuset); + CPU_SET (tm->main_lcore, &cpuset); + pthread_setaffinity_np (pthread_self (), sizeof (cpu_set_t), &cpuset); } #endif /* as many threads as stacks... */ - vec_validate_aligned (vlib_worker_threads, vec_len(vlib_thread_stacks)-1, - CLIB_CACHE_LINE_BYTES); + vec_validate_aligned (vlib_worker_threads, vec_len (vlib_thread_stacks) - 1, + CLIB_CACHE_LINE_BYTES); /* Preallocate thread 0 */ - _vec_len(vlib_worker_threads) = 1; + _vec_len (vlib_worker_threads) = 1; w = vlib_worker_threads; - w->thread_mheap = clib_mem_get_heap(); + w->thread_mheap = clib_mem_get_heap (); w->thread_stack = vlib_thread_stacks[0]; w->dpdk_lcore_id = -1; - w->lwp = syscall(SYS_gettid); + w->lwp = syscall (SYS_gettid); tm->n_vlib_mains = 1; /* assign threads to cores and set n_vlib_mains */ @@ -204,8 +207,7 @@ vlib_thread_init (vlib_main_t * vm) tr = tr->next; } - vec_sort_with_function - (tm->registrations, sort_registrations_by_no_clone); + vec_sort_with_function (tm->registrations, sort_registrations_by_no_clone); for (i = 0; i < vec_len (tm->registrations); i++) { @@ -217,11 +219,12 @@ vlib_thread_init (vlib_main_t * vm) /* construct coremask */ if (tr->use_pthreads || !tr->count) - continue; + continue; if (tr->coremask) - { - uword c; + { + uword c; + /* *INDENT-OFF* */ clib_bitmap_foreach (c, tr->coremask, ({ if (clib_bitmap_get(avail_cpu, c) == 0) return clib_error_return (0, "cpu %u is not available to be used" @@ -229,92 +232,98 @@ vlib_thread_init (vlib_main_t * vm) avail_cpu = clib_bitmap_set(avail_cpu, c, 0); })); +/* *INDENT-ON* */ - } + } else - { - for (j=0; j < tr->count; j++) - { - uword c = clib_bitmap_first_set(avail_cpu); - if (c == ~0) - return clib_error_return (0, "no available cpus to be used for" - " the '%s' thread", tr->name); - - avail_cpu = clib_bitmap_set(avail_cpu, c, 0); - tr->coremask = clib_bitmap_set(tr->coremask, c, 1); - } - } + { + for (j = 0; j < tr->count; j++) + { + uword c = clib_bitmap_first_set (avail_cpu); + if (c == ~0) + return clib_error_return (0, + "no available cpus to be used for" + " the '%s' thread", tr->name); + + avail_cpu = clib_bitmap_set (avail_cpu, c, 0); + tr->coremask = clib_bitmap_set (tr->coremask, c, 1); + } + } } - clib_bitmap_free(avail_cpu); + clib_bitmap_free (avail_cpu); tm->n_vlib_mains = n_vlib_mains; - vec_validate_aligned (vlib_worker_threads, first_index-1, - CLIB_CACHE_LINE_BYTES); + vec_validate_aligned (vlib_worker_threads, first_index - 1, + CLIB_CACHE_LINE_BYTES); tm->efd.enabled = VLIB_EFD_DISABLED; tm->efd.queue_hi_thresh = ((VLIB_EFD_DEF_WORKER_HI_THRESH_PCT * - FRAME_QUEUE_NELTS)/100); + FRAME_QUEUE_NELTS) / 100); return 0; } vlib_worker_thread_t * vlib_alloc_thread (vlib_main_t * vm) { - vlib_worker_thread_t * w; + vlib_worker_thread_t *w; - if (vec_len(vlib_worker_threads) >= vec_len (vlib_thread_stacks)) + if (vec_len (vlib_worker_threads) >= vec_len (vlib_thread_stacks)) { clib_warning ("out of worker threads... Quitting..."); - exit(1); + exit (1); } vec_add2 (vlib_worker_threads, w, 1); w->thread_stack = vlib_thread_stacks[w - vlib_worker_threads]; return w; } -vlib_frame_queue_t * vlib_frame_queue_alloc (int nelts) +vlib_frame_queue_t * +vlib_frame_queue_alloc (int nelts) { - vlib_frame_queue_t * fq; + vlib_frame_queue_t *fq; - fq = clib_mem_alloc_aligned(sizeof (*fq), CLIB_CACHE_LINE_BYTES); + fq = clib_mem_alloc_aligned (sizeof (*fq), CLIB_CACHE_LINE_BYTES); memset (fq, 0, sizeof (*fq)); fq->nelts = nelts; - fq->vector_threshold = 128; // packets - vec_validate_aligned (fq->elts, nelts-1, CLIB_CACHE_LINE_BYTES); + fq->vector_threshold = 128; // packets + vec_validate_aligned (fq->elts, nelts - 1, CLIB_CACHE_LINE_BYTES); if (1) - { - if (((uword)&fq->tail) & (CLIB_CACHE_LINE_BYTES - 1)) - fformat(stderr, "WARNING: fq->tail unaligned\n"); - if (((uword)&fq->head) & (CLIB_CACHE_LINE_BYTES - 1)) - fformat(stderr, "WARNING: fq->head unaligned\n"); - if (((uword)fq->elts) & (CLIB_CACHE_LINE_BYTES - 1)) - fformat(stderr, "WARNING: fq->elts unaligned\n"); - - if (sizeof (fq->elts[0]) % CLIB_CACHE_LINE_BYTES) - fformat(stderr, "WARNING: fq->elts[0] size %d\n", - sizeof (fq->elts[0])); - if (nelts & (nelts -1)) - { - fformat (stderr, "FATAL: nelts MUST be a power of 2\n"); - abort(); - } - } - + { + if (((uword) & fq->tail) & (CLIB_CACHE_LINE_BYTES - 1)) + fformat (stderr, "WARNING: fq->tail unaligned\n"); + if (((uword) & fq->head) & (CLIB_CACHE_LINE_BYTES - 1)) + fformat (stderr, "WARNING: fq->head unaligned\n"); + if (((uword) fq->elts) & (CLIB_CACHE_LINE_BYTES - 1)) + fformat (stderr, "WARNING: fq->elts unaligned\n"); + + if (sizeof (fq->elts[0]) % CLIB_CACHE_LINE_BYTES) + fformat (stderr, "WARNING: fq->elts[0] size %d\n", + sizeof (fq->elts[0])); + if (nelts & (nelts - 1)) + { + fformat (stderr, "FATAL: nelts MUST be a power of 2\n"); + abort (); + } + } + return (fq); } void vl_msg_api_handler_no_free (void *) __attribute__ ((weak)); -void vl_msg_api_handler_no_free (void *v) { } +void +vl_msg_api_handler_no_free (void *v) +{ +} /* Turned off, save as reference material... */ #if 0 -static inline int vlib_frame_queue_dequeue_internal (int thread_id, - vlib_main_t *vm, - vlib_node_main_t *nm) +static inline int +vlib_frame_queue_dequeue_internal (int thread_id, + vlib_main_t * vm, vlib_node_main_t * nm) { vlib_frame_queue_t *fq = vlib_frame_queues[thread_id]; vlib_frame_queue_elt_t *elt; @@ -325,78 +334,79 @@ static inline int vlib_frame_queue_dequeue_internal (int thread_id, int msg_type; u64 before; int processed = 0; - - ASSERT(vm == vlib_mains[thread_id]); + + ASSERT (vm == vlib_mains[thread_id]); while (1) { if (fq->head == fq->tail) - return processed; + return processed; - elt = fq->elts + ((fq->head+1) & (fq->nelts-1)); + elt = fq->elts + ((fq->head + 1) & (fq->nelts - 1)); if (!elt->valid) - return processed; + return processed; - before = clib_cpu_time_now(); + before = clib_cpu_time_now (); f = elt->frame; node_runtime_index = elt->node_runtime_index; msg_type = elt->msg_type; switch (msg_type) - { - case VLIB_FRAME_QUEUE_ELT_FREE_BUFFERS: - vlib_buffer_free (vm, vlib_frame_vector_args (f), f->n_vectors); - /* note fallthrough... */ - case VLIB_FRAME_QUEUE_ELT_FREE_FRAME: - r = vec_elt_at_index (nm->nodes_by_type[VLIB_NODE_TYPE_INTERNAL], - node_runtime_index); - vlib_frame_free (vm, r, f); - break; - case VLIB_FRAME_QUEUE_ELT_DISPATCH_FRAME: - vec_add2 (vm->node_main.pending_frames, p, 1); - f->flags |= (VLIB_FRAME_PENDING | VLIB_FRAME_FREE_AFTER_DISPATCH); - p->node_runtime_index = elt->node_runtime_index; - p->frame_index = vlib_frame_index (vm, f); - p->next_frame_index = VLIB_PENDING_FRAME_NO_NEXT_FRAME; - fq->dequeue_vectors += (u64) f->n_vectors; - break; - case VLIB_FRAME_QUEUE_ELT_API_MSG: - vl_msg_api_handler_no_free (f); - break; - default: - clib_warning ("bogus frame queue message, type %d", msg_type); - break; - } + { + case VLIB_FRAME_QUEUE_ELT_FREE_BUFFERS: + vlib_buffer_free (vm, vlib_frame_vector_args (f), f->n_vectors); + /* note fallthrough... */ + case VLIB_FRAME_QUEUE_ELT_FREE_FRAME: + r = vec_elt_at_index (nm->nodes_by_type[VLIB_NODE_TYPE_INTERNAL], + node_runtime_index); + vlib_frame_free (vm, r, f); + break; + case VLIB_FRAME_QUEUE_ELT_DISPATCH_FRAME: + vec_add2 (vm->node_main.pending_frames, p, 1); + f->flags |= (VLIB_FRAME_PENDING | VLIB_FRAME_FREE_AFTER_DISPATCH); + p->node_runtime_index = elt->node_runtime_index; + p->frame_index = vlib_frame_index (vm, f); + p->next_frame_index = VLIB_PENDING_FRAME_NO_NEXT_FRAME; + fq->dequeue_vectors += (u64) f->n_vectors; + break; + case VLIB_FRAME_QUEUE_ELT_API_MSG: + vl_msg_api_handler_no_free (f); + break; + default: + clib_warning ("bogus frame queue message, type %d", msg_type); + break; + } elt->valid = 0; fq->dequeues++; - fq->dequeue_ticks += clib_cpu_time_now() - before; - CLIB_MEMORY_BARRIER(); + fq->dequeue_ticks += clib_cpu_time_now () - before; + CLIB_MEMORY_BARRIER (); fq->head++; processed++; } - ASSERT(0); + ASSERT (0); return processed; } -int vlib_frame_queue_dequeue (int thread_id, - vlib_main_t *vm, - vlib_node_main_t *nm) +int +vlib_frame_queue_dequeue (int thread_id, + vlib_main_t * vm, vlib_node_main_t * nm) { return vlib_frame_queue_dequeue_internal (thread_id, vm, nm); } -int vlib_frame_queue_enqueue (vlib_main_t *vm, u32 node_runtime_index, - u32 frame_queue_index, vlib_frame_t *frame, - vlib_frame_queue_msg_type_t type) +int +vlib_frame_queue_enqueue (vlib_main_t * vm, u32 node_runtime_index, + u32 frame_queue_index, vlib_frame_t * frame, + vlib_frame_queue_msg_type_t type) { vlib_frame_queue_t *fq = vlib_frame_queues[frame_queue_index]; vlib_frame_queue_elt_t *elt; u32 save_count; u64 new_tail; - u64 before = clib_cpu_time_now(); - + u64 before = clib_cpu_time_now (); + ASSERT (fq); new_tail = __sync_add_and_fetch (&fq->tail, 1); @@ -410,10 +420,10 @@ int vlib_frame_queue_enqueue (vlib_main_t *vm, u32 node_runtime_index, // vlib_frame_queue_dequeue (vm->cpu_index, vm, nm); } - elt = fq->elts + (new_tail & (fq->nelts-1)); + elt = fq->elts + (new_tail & (fq->nelts - 1)); /* this would be very bad... */ - while (elt->valid) + while (elt->valid) { } @@ -423,7 +433,7 @@ int vlib_frame_queue_enqueue (vlib_main_t *vm, u32 node_runtime_index, elt->frame = frame; elt->node_runtime_index = node_runtime_index; elt->msg_type = type; - CLIB_MEMORY_BARRIER(); + CLIB_MEMORY_BARRIER (); elt->valid = 1; return save_count; @@ -431,10 +441,11 @@ int vlib_frame_queue_enqueue (vlib_main_t *vm, u32 node_runtime_index, #endif /* 0 */ /* To be called by vlib worker threads upon startup */ -void vlib_worker_thread_init (vlib_worker_thread_t * w) +void +vlib_worker_thread_init (vlib_worker_thread_t * w) { - vlib_thread_main_t *tm = vlib_get_thread_main(); - + vlib_thread_main_t *tm = vlib_get_thread_main (); + /* worker threads wants no signals. */ { sigset_t s; @@ -444,13 +455,11 @@ void vlib_worker_thread_init (vlib_worker_thread_t * w) clib_mem_set_heap (w->thread_mheap); - if (vec_len(tm->thread_prefix) && w->registration->short_name) + if (vec_len (tm->thread_prefix) && w->registration->short_name) { - w->name = format(0, "%v_%s_%d%c", tm->thread_prefix, - w->registration->short_name, - w->instance_id, - '\0'); - vlib_set_thread_name((char *)w->name); + w->name = format (0, "%v_%s_%d%c", tm->thread_prefix, + w->registration->short_name, w->instance_id, '\0'); + vlib_set_thread_name ((char *) w->name); } if (!w->registration->use_pthreads) @@ -460,79 +469,80 @@ void vlib_worker_thread_init (vlib_worker_thread_t * w) clib_smp_atomic_add (vlib_worker_threads->workers_at_barrier, 1); while (*vlib_worker_threads->wait_at_barrier) - ; + ; clib_smp_atomic_add (vlib_worker_threads->workers_at_barrier, -1); } } -void *vlib_worker_thread_bootstrap_fn (void *arg) +void * +vlib_worker_thread_bootstrap_fn (void *arg) { void *rv; vlib_worker_thread_t *w = arg; - - w->lwp = syscall(SYS_gettid); + + w->lwp = syscall (SYS_gettid); w->dpdk_lcore_id = -1; #if DPDK==1 - if (w->registration && !w->registration->use_pthreads && - rte_socket_id) /* do we really have dpdk linked */ + if (w->registration && !w->registration->use_pthreads && rte_socket_id) /* do we really have dpdk linked */ { - unsigned lcore = rte_lcore_id(); + unsigned lcore = rte_lcore_id (); lcore = lcore < RTE_MAX_LCORE ? lcore : -1; w->dpdk_lcore_id = lcore; } #endif - rv = (void *) clib_calljmp - ((uword (*)(uword)) w->thread_function, - (uword) arg, w->thread_stack + VLIB_THREAD_STACK_SIZE); + rv = (void *) clib_calljmp + ((uword (*)(uword)) w->thread_function, + (uword) arg, w->thread_stack + VLIB_THREAD_STACK_SIZE); /* NOTREACHED, we hope */ return rv; } static int -vlib_launch_thread (void *fp, vlib_worker_thread_t *w, unsigned lcore_id) +vlib_launch_thread (void *fp, vlib_worker_thread_t * w, unsigned lcore_id) { - void *(*fp_arg)(void *) = fp; + void *(*fp_arg) (void *) = fp; #if DPDK==1 if (!w->registration->use_pthreads) - if (rte_eal_remote_launch) /* do we have dpdk linked */ - return rte_eal_remote_launch (fp, (void *)w, lcore_id); + if (rte_eal_remote_launch) /* do we have dpdk linked */ + return rte_eal_remote_launch (fp, (void *) w, lcore_id); else return -1; else #endif - { - int ret; - pthread_t worker; - cpu_set_t cpuset; - CPU_ZERO(&cpuset); - CPU_SET(lcore_id, &cpuset); - - ret = pthread_create (&worker, NULL /* attr */, fp_arg, (void *)w); - if(ret == 0) - return pthread_setaffinity_np(worker, sizeof(cpu_set_t), &cpuset); - else - return ret; - } + { + int ret; + pthread_t worker; + cpu_set_t cpuset; + CPU_ZERO (&cpuset); + CPU_SET (lcore_id, &cpuset); + + ret = pthread_create (&worker, NULL /* attr */ , fp_arg, (void *) w); + if (ret == 0) + return pthread_setaffinity_np (worker, sizeof (cpu_set_t), &cpuset); + else + return ret; + } } -static clib_error_t * start_workers (vlib_main_t * vm) +static clib_error_t * +start_workers (vlib_main_t * vm) { int i, j; vlib_worker_thread_t *w; vlib_main_t *vm_clone; void *oldheap; vlib_frame_queue_t *fq; - vlib_thread_main_t * tm = &vlib_thread_main; - vlib_thread_registration_t * tr; - vlib_node_runtime_t * rt; + vlib_thread_main_t *tm = &vlib_thread_main; + vlib_thread_registration_t *tr; + vlib_node_runtime_t *rt; u32 n_vlib_mains = tm->n_vlib_mains; u32 worker_thread_index; - u8 * main_heap = clib_mem_get_per_cpu_heap(); - mheap_t * main_heap_header = mheap_header (main_heap); - + u8 *main_heap = clib_mem_get_per_cpu_heap (); + mheap_t *main_heap_header = mheap_header (main_heap); + vec_reset_length (vlib_worker_threads); /* Set up the main thread */ @@ -540,32 +550,31 @@ static clib_error_t * start_workers (vlib_main_t * vm) w->elog_track.name = "main thread"; elog_track_register (&vm->elog_main, &w->elog_track); - if (vec_len(tm->thread_prefix)) + if (vec_len (tm->thread_prefix)) { - w->name = format(0, "%v_main%c", tm->thread_prefix, '\0'); - vlib_set_thread_name((char *)w->name); + w->name = format (0, "%v_main%c", tm->thread_prefix, '\0'); + vlib_set_thread_name ((char *) w->name); } #if DPDK==1 w->dpdk_lcore_id = -1; - if (rte_socket_id) /* do we really have dpdk linked */ + if (rte_socket_id) /* do we really have dpdk linked */ { - unsigned lcore = rte_lcore_id(); + unsigned lcore = rte_lcore_id (); w->dpdk_lcore_id = lcore < RTE_MAX_LCORE ? lcore : -1;; } #endif - /* + /* * Truth of the matter: we always use at least two - * threads. So, make the main heap thread-safe + * threads. So, make the main heap thread-safe * and make the event log thread-safe. */ main_heap_header->flags |= MHEAP_FLAG_THREAD_SAFE; - vm->elog_main.lock = - clib_mem_alloc_aligned (CLIB_CACHE_LINE_BYTES, - CLIB_CACHE_LINE_BYTES); + vm->elog_main.lock = + clib_mem_alloc_aligned (CLIB_CACHE_LINE_BYTES, CLIB_CACHE_LINE_BYTES); vm->elog_main.lock[0] = 0; - + if (n_vlib_mains > 1) { vec_validate (vlib_mains, tm->n_vlib_mains - 1); @@ -577,10 +586,10 @@ static clib_error_t * start_workers (vlib_main_t * vm) fq = vlib_frame_queue_alloc (FRAME_QUEUE_NELTS); vec_add1 (vlib_frame_queues, fq); - vlib_worker_threads->wait_at_barrier = - clib_mem_alloc_aligned (sizeof (u32), CLIB_CACHE_LINE_BYTES); + vlib_worker_threads->wait_at_barrier = + clib_mem_alloc_aligned (sizeof (u32), CLIB_CACHE_LINE_BYTES); vlib_worker_threads->workers_at_barrier = - clib_mem_alloc_aligned (sizeof (u32), CLIB_CACHE_LINE_BYTES); + clib_mem_alloc_aligned (sizeof (u32), CLIB_CACHE_LINE_BYTES); /* Ask for an initial barrier sync */ *vlib_worker_threads->workers_at_barrier = 0; @@ -588,132 +597,139 @@ static clib_error_t * start_workers (vlib_main_t * vm) worker_thread_index = 1; - for (i = 0; i < vec_len(tm->registrations); i++) - { - vlib_node_main_t *nm, *nm_clone; - vlib_buffer_main_t *bm_clone; - vlib_buffer_free_list_t *fl_clone, *fl_orig; - vlib_buffer_free_list_t *orig_freelist_pool; - int k; - - tr = tm->registrations[i]; - - if (tr->count == 0) - continue; - - for (k = 0; k < tr->count; k++) - { - vec_add2 (vlib_worker_threads, w, 1); - if (tr->mheap_size) - w->thread_mheap = mheap_alloc (0 /* use VM */, tr->mheap_size); - else - w->thread_mheap = main_heap; - w->thread_stack = vlib_thread_stacks[w - vlib_worker_threads]; - w->thread_function = tr->function; - w->thread_function_arg = w; - w->instance_id = k; - w->registration = tr; - - w->elog_track.name = - (char *) format (0, "%s %d", tr->name, k+1); - vec_add1 (w->elog_track.name, 0); - elog_track_register (&vm->elog_main, &w->elog_track); - - if (tr->no_data_structure_clone) - continue; - - /* Allocate "to-worker-N" frame queue */ - if (tr->frame_queue_nelts) { - fq = vlib_frame_queue_alloc (tr->frame_queue_nelts); - } else { - fq = vlib_frame_queue_alloc (FRAME_QUEUE_NELTS); - } - - vec_validate (vlib_frame_queues, worker_thread_index); - vlib_frame_queues[worker_thread_index] = fq; - - /* Fork vlib_global_main et al. Look for bugs here */ - oldheap = clib_mem_set_heap (w->thread_mheap); - - vm_clone = clib_mem_alloc (sizeof (*vm_clone)); - clib_memcpy (vm_clone, vlib_mains[0], sizeof (*vm_clone)); - - vm_clone->cpu_index = worker_thread_index; - vm_clone->heap_base = w->thread_mheap; - vm_clone->mbuf_alloc_list = 0; - memset (&vm_clone->random_buffer, 0, sizeof (vm_clone->random_buffer)); - - nm = &vlib_mains[0]->node_main; - nm_clone = &vm_clone->node_main; - /* fork next frames array, preserving node runtime indices */ - nm_clone->next_frames = vec_dup (nm->next_frames); - for (j = 0; j < vec_len (nm_clone->next_frames); j++) - { - vlib_next_frame_t *nf = &nm_clone->next_frames[j]; - u32 save_node_runtime_index; - u32 save_flags; - - save_node_runtime_index = nf->node_runtime_index; - save_flags = nf->flags & VLIB_FRAME_NO_FREE_AFTER_DISPATCH; - vlib_next_frame_init (nf); - nf->node_runtime_index = save_node_runtime_index; - nf->flags = save_flags; - } - - /* fork the frame dispatch queue */ - nm_clone->pending_frames = 0; - vec_validate (nm_clone->pending_frames, 10); /* $$$$$?????? */ - _vec_len (nm_clone->pending_frames) = 0; - - /* fork nodes */ - nm_clone->nodes = 0; - for (j = 0; j < vec_len (nm->nodes); j++) - { - vlib_node_t *n; - n = clib_mem_alloc_no_fail (sizeof(*n)); - clib_memcpy (n, nm->nodes[j], sizeof (*n)); - /* none of the copied nodes have enqueue rights given out */ - n->owner_node_index = VLIB_INVALID_NODE_INDEX; - memset (&n->stats_total, 0, sizeof (n->stats_total)); - memset (&n->stats_last_clear, 0, sizeof (n->stats_last_clear)); - vec_add1 (nm_clone->nodes, n); - } - nm_clone->nodes_by_type[VLIB_NODE_TYPE_INTERNAL] = - vec_dup (nm->nodes_by_type[VLIB_NODE_TYPE_INTERNAL]); - - nm_clone->nodes_by_type[VLIB_NODE_TYPE_INPUT] = - vec_dup (nm->nodes_by_type[VLIB_NODE_TYPE_INPUT]); - vec_foreach(rt, nm_clone->nodes_by_type[VLIB_NODE_TYPE_INPUT]) - rt->cpu_index = vm_clone->cpu_index; - - nm_clone->processes = vec_dup (nm->processes); - - /* zap the (per worker) frame freelists, etc */ - nm_clone->frame_sizes = 0; - nm_clone->frame_size_hash = 0; - - /* Packet trace buffers are guaranteed to be empty, nothing to do here */ - - clib_mem_set_heap (oldheap); - vec_add1 (vlib_mains, vm_clone); - - vm_clone->error_main.counters = - vec_dup(vlib_mains[0]->error_main.counters); - vm_clone->error_main.counters_last_clear = - vec_dup(vlib_mains[0]->error_main.counters_last_clear); - - /* Fork the vlib_buffer_main_t free lists, etc. */ - bm_clone = vec_dup (vm_clone->buffer_main); - vm_clone->buffer_main = bm_clone; - - orig_freelist_pool = bm_clone->buffer_free_list_pool; - bm_clone->buffer_free_list_pool = 0; - + for (i = 0; i < vec_len (tm->registrations); i++) + { + vlib_node_main_t *nm, *nm_clone; + vlib_buffer_main_t *bm_clone; + vlib_buffer_free_list_t *fl_clone, *fl_orig; + vlib_buffer_free_list_t *orig_freelist_pool; + int k; + + tr = tm->registrations[i]; + + if (tr->count == 0) + continue; + + for (k = 0; k < tr->count; k++) + { + vec_add2 (vlib_worker_threads, w, 1); + if (tr->mheap_size) + w->thread_mheap = + mheap_alloc (0 /* use VM */ , tr->mheap_size); + else + w->thread_mheap = main_heap; + w->thread_stack = vlib_thread_stacks[w - vlib_worker_threads]; + w->thread_function = tr->function; + w->thread_function_arg = w; + w->instance_id = k; + w->registration = tr; + + w->elog_track.name = + (char *) format (0, "%s %d", tr->name, k + 1); + vec_add1 (w->elog_track.name, 0); + elog_track_register (&vm->elog_main, &w->elog_track); + + if (tr->no_data_structure_clone) + continue; + + /* Allocate "to-worker-N" frame queue */ + if (tr->frame_queue_nelts) + { + fq = vlib_frame_queue_alloc (tr->frame_queue_nelts); + } + else + { + fq = vlib_frame_queue_alloc (FRAME_QUEUE_NELTS); + } + + vec_validate (vlib_frame_queues, worker_thread_index); + vlib_frame_queues[worker_thread_index] = fq; + + /* Fork vlib_global_main et al. Look for bugs here */ + oldheap = clib_mem_set_heap (w->thread_mheap); + + vm_clone = clib_mem_alloc (sizeof (*vm_clone)); + clib_memcpy (vm_clone, vlib_mains[0], sizeof (*vm_clone)); + + vm_clone->cpu_index = worker_thread_index; + vm_clone->heap_base = w->thread_mheap; + vm_clone->mbuf_alloc_list = 0; + memset (&vm_clone->random_buffer, 0, + sizeof (vm_clone->random_buffer)); + + nm = &vlib_mains[0]->node_main; + nm_clone = &vm_clone->node_main; + /* fork next frames array, preserving node runtime indices */ + nm_clone->next_frames = vec_dup (nm->next_frames); + for (j = 0; j < vec_len (nm_clone->next_frames); j++) + { + vlib_next_frame_t *nf = &nm_clone->next_frames[j]; + u32 save_node_runtime_index; + u32 save_flags; + + save_node_runtime_index = nf->node_runtime_index; + save_flags = nf->flags & VLIB_FRAME_NO_FREE_AFTER_DISPATCH; + vlib_next_frame_init (nf); + nf->node_runtime_index = save_node_runtime_index; + nf->flags = save_flags; + } + + /* fork the frame dispatch queue */ + nm_clone->pending_frames = 0; + vec_validate (nm_clone->pending_frames, 10); /* $$$$$?????? */ + _vec_len (nm_clone->pending_frames) = 0; + + /* fork nodes */ + nm_clone->nodes = 0; + for (j = 0; j < vec_len (nm->nodes); j++) + { + vlib_node_t *n; + n = clib_mem_alloc_no_fail (sizeof (*n)); + clib_memcpy (n, nm->nodes[j], sizeof (*n)); + /* none of the copied nodes have enqueue rights given out */ + n->owner_node_index = VLIB_INVALID_NODE_INDEX; + memset (&n->stats_total, 0, sizeof (n->stats_total)); + memset (&n->stats_last_clear, 0, + sizeof (n->stats_last_clear)); + vec_add1 (nm_clone->nodes, n); + } + nm_clone->nodes_by_type[VLIB_NODE_TYPE_INTERNAL] = + vec_dup (nm->nodes_by_type[VLIB_NODE_TYPE_INTERNAL]); + + nm_clone->nodes_by_type[VLIB_NODE_TYPE_INPUT] = + vec_dup (nm->nodes_by_type[VLIB_NODE_TYPE_INPUT]); + vec_foreach (rt, nm_clone->nodes_by_type[VLIB_NODE_TYPE_INPUT]) + rt->cpu_index = vm_clone->cpu_index; + + nm_clone->processes = vec_dup (nm->processes); + + /* zap the (per worker) frame freelists, etc */ + nm_clone->frame_sizes = 0; + nm_clone->frame_size_hash = 0; + + /* Packet trace buffers are guaranteed to be empty, nothing to do here */ + + clib_mem_set_heap (oldheap); + vec_add1 (vlib_mains, vm_clone); + + vm_clone->error_main.counters = + vec_dup (vlib_mains[0]->error_main.counters); + vm_clone->error_main.counters_last_clear = + vec_dup (vlib_mains[0]->error_main.counters_last_clear); + + /* Fork the vlib_buffer_main_t free lists, etc. */ + bm_clone = vec_dup (vm_clone->buffer_main); + vm_clone->buffer_main = bm_clone; + + orig_freelist_pool = bm_clone->buffer_free_list_pool; + bm_clone->buffer_free_list_pool = 0; + + /* *INDENT-OFF* */ pool_foreach (fl_orig, orig_freelist_pool, ({ - pool_get_aligned (bm_clone->buffer_free_list_pool, + pool_get_aligned (bm_clone->buffer_free_list_pool, fl_clone, CLIB_CACHE_LINE_BYTES); - ASSERT (fl_orig - orig_freelist_pool + ASSERT (fl_orig - orig_freelist_pool == fl_clone - bm_clone->buffer_free_list_pool); fl_clone[0] = fl_orig[0]; @@ -721,36 +737,38 @@ static clib_error_t * start_workers (vlib_main_t * vm) fl_clone->unaligned_buffers = 0; fl_clone->n_alloc = 0; })); +/* *INDENT-ON* */ - worker_thread_index++; - } - } + worker_thread_index++; + } + } } else { /* only have non-data-structure copy threads to create... */ - for (i = 0; i < vec_len(tm->registrations); i++) - { - tr = tm->registrations[i]; - - for (j = 0; j < tr->count; j++) - { - vec_add2 (vlib_worker_threads, w, 1); - if (tr->mheap_size) - w->thread_mheap = mheap_alloc (0 /* use VM */, tr->mheap_size); - else - w->thread_mheap = main_heap; - w->thread_stack = vlib_thread_stacks[w - vlib_worker_threads]; - w->thread_function = tr->function; - w->thread_function_arg = w; - w->instance_id = j; - w->elog_track.name = - (char *) format (0, "%s %d", tr->name, j+1); - w->registration = tr; - vec_add1 (w->elog_track.name, 0); - elog_track_register (&vm->elog_main, &w->elog_track); - } - } + for (i = 0; i < vec_len (tm->registrations); i++) + { + tr = tm->registrations[i]; + + for (j = 0; j < tr->count; j++) + { + vec_add2 (vlib_worker_threads, w, 1); + if (tr->mheap_size) + w->thread_mheap = + mheap_alloc (0 /* use VM */ , tr->mheap_size); + else + w->thread_mheap = main_heap; + w->thread_stack = vlib_thread_stacks[w - vlib_worker_threads]; + w->thread_function = tr->function; + w->thread_function_arg = w; + w->instance_id = j; + w->elog_track.name = + (char *) format (0, "%s %d", tr->name, j + 1); + w->registration = tr; + vec_add1 (w->elog_track.name, 0); + elog_track_register (&vm->elog_main, &w->elog_track); + } + } } worker_thread_index = 1; @@ -762,50 +780,53 @@ static clib_error_t * start_workers (vlib_main_t * vm) tr = tm->registrations[i]; if (tr->use_pthreads || tm->use_pthreads) - { - for (j = 0; j < tr->count; j++) - { - w = vlib_worker_threads + worker_thread_index++; - if (vlib_launch_thread (vlib_worker_thread_bootstrap_fn, w, 0) < 0) - clib_warning ("Couldn't start '%s' pthread ", tr->name); - } - } + { + for (j = 0; j < tr->count; j++) + { + w = vlib_worker_threads + worker_thread_index++; + if (vlib_launch_thread (vlib_worker_thread_bootstrap_fn, w, 0) < + 0) + clib_warning ("Couldn't start '%s' pthread ", tr->name); + } + } else - { - uword c; + { + uword c; + /* *INDENT-OFF* */ clib_bitmap_foreach (c, tr->coremask, ({ w = vlib_worker_threads + worker_thread_index++; if (vlib_launch_thread (vlib_worker_thread_bootstrap_fn, w, c) < 0) clib_warning ("Couldn't start DPDK lcore %d", c); })); - } +/* *INDENT-ON* */ + } } - vlib_worker_thread_barrier_sync(vm); - vlib_worker_thread_barrier_release(vm); + vlib_worker_thread_barrier_sync (vm); + vlib_worker_thread_barrier_release (vm); return 0; } VLIB_MAIN_LOOP_ENTER_FUNCTION (start_workers); -void vlib_worker_thread_node_runtime_update(void) +void +vlib_worker_thread_node_runtime_update (void) { int i, j; vlib_worker_thread_t *w; vlib_main_t *vm; vlib_node_main_t *nm, *nm_clone; - vlib_node_t ** old_nodes_clone; + vlib_node_t **old_nodes_clone; vlib_main_t *vm_clone; - vlib_node_runtime_t * rt, * old_rt; + vlib_node_runtime_t *rt, *old_rt; void *oldheap; never_inline void vlib_node_runtime_sync_stats (vlib_main_t * vm, - vlib_node_runtime_t * r, - uword n_calls, - uword n_vectors, - uword n_clocks); - - ASSERT (os_get_cpu_number() == 0); + vlib_node_runtime_t * r, + uword n_calls, + uword n_vectors, uword n_clocks); + + ASSERT (os_get_cpu_number () == 0); if (vec_len (vlib_mains) == 0) return; @@ -813,51 +834,52 @@ void vlib_worker_thread_node_runtime_update(void) vm = vlib_mains[0]; nm = &vm->node_main; - ASSERT (os_get_cpu_number() == 0); + ASSERT (os_get_cpu_number () == 0); ASSERT (*vlib_worker_threads->wait_at_barrier == 1); - /* + /* * Scrape all runtime stats, so we don't lose node runtime(s) with * pending counts, or throw away worker / io thread counts. */ - for (j = 0; j < vec_len (nm->nodes); j++) + for (j = 0; j < vec_len (nm->nodes); j++) { - vlib_node_t * n; + vlib_node_t *n; n = nm->nodes[j]; vlib_node_sync_stats (vm, n); } for (i = 1; i < vec_len (vlib_mains); i++) { - vlib_node_t * n; - + vlib_node_t *n; + vm_clone = vlib_mains[i]; nm_clone = &vm_clone->node_main; - for (j = 0; j < vec_len (nm_clone->nodes); j++) - { - n = nm_clone->nodes[j]; + for (j = 0; j < vec_len (nm_clone->nodes); j++) + { + n = nm_clone->nodes[j]; - rt = vlib_node_get_runtime (vm_clone, n->index); - vlib_node_runtime_sync_stats (vm_clone, rt, 0, 0, 0); - } + rt = vlib_node_get_runtime (vm_clone, n->index); + vlib_node_runtime_sync_stats (vm_clone, rt, 0, 0, 0); + } } for (i = 1; i < vec_len (vlib_mains); i++) { - vlib_node_runtime_t * rt; + vlib_node_runtime_t *rt; w = vlib_worker_threads + i; oldheap = clib_mem_set_heap (w->thread_mheap); vm_clone = vlib_mains[i]; /* Re-clone error heap */ - u64 * old_counters = vm_clone->error_main.counters; - u64 * old_counters_all_clear = vm_clone->error_main.counters_last_clear; - clib_memcpy (&vm_clone->error_main, &vm->error_main, sizeof (vm->error_main)); - j = vec_len(vm->error_main.counters) - 1; - vec_validate_aligned(old_counters, j, CLIB_CACHE_LINE_BYTES); - vec_validate_aligned(old_counters_all_clear, j, CLIB_CACHE_LINE_BYTES); + u64 *old_counters = vm_clone->error_main.counters; + u64 *old_counters_all_clear = vm_clone->error_main.counters_last_clear; + clib_memcpy (&vm_clone->error_main, &vm->error_main, + sizeof (vm->error_main)); + j = vec_len (vm->error_main.counters) - 1; + vec_validate_aligned (old_counters, j, CLIB_CACHE_LINE_BYTES); + vec_validate_aligned (old_counters_all_clear, j, CLIB_CACHE_LINE_BYTES); vm_clone->error_main.counters = old_counters; vm_clone->error_main.counters_last_clear = old_counters_all_clear; @@ -866,85 +888,86 @@ void vlib_worker_thread_node_runtime_update(void) nm_clone->next_frames = vec_dup (nm->next_frames); for (j = 0; j < vec_len (nm_clone->next_frames); j++) - { - vlib_next_frame_t *nf = &nm_clone->next_frames[j]; - u32 save_node_runtime_index; - u32 save_flags; - - save_node_runtime_index = nf->node_runtime_index; - save_flags = nf->flags & VLIB_FRAME_NO_FREE_AFTER_DISPATCH; - vlib_next_frame_init (nf); - nf->node_runtime_index = save_node_runtime_index; - nf->flags = save_flags; - } + { + vlib_next_frame_t *nf = &nm_clone->next_frames[j]; + u32 save_node_runtime_index; + u32 save_flags; + + save_node_runtime_index = nf->node_runtime_index; + save_flags = nf->flags & VLIB_FRAME_NO_FREE_AFTER_DISPATCH; + vlib_next_frame_init (nf); + nf->node_runtime_index = save_node_runtime_index; + nf->flags = save_flags; + } old_nodes_clone = nm_clone->nodes; nm_clone->nodes = 0; /* re-fork nodes */ - for (j = 0; j < vec_len (nm->nodes); j++) { - vlib_node_t *old_n_clone; - vlib_node_t *new_n, *new_n_clone; - - new_n = nm->nodes[j]; - old_n_clone = old_nodes_clone[j]; - - new_n_clone = clib_mem_alloc_no_fail (sizeof(*new_n_clone)); - clib_memcpy (new_n_clone, new_n, sizeof (*new_n)); - /* none of the copied nodes have enqueue rights given out */ - new_n_clone->owner_node_index = VLIB_INVALID_NODE_INDEX; - - if (j >= vec_len (old_nodes_clone)) - { - /* new node, set to zero */ - memset (&new_n_clone->stats_total, 0, - sizeof (new_n_clone->stats_total)); - memset (&new_n_clone->stats_last_clear, 0, - sizeof (new_n_clone->stats_last_clear)); - } - else - { - /* Copy stats if the old data is valid */ - clib_memcpy (&new_n_clone->stats_total, - &old_n_clone->stats_total, - sizeof (new_n_clone->stats_total)); - clib_memcpy (&new_n_clone->stats_last_clear, - &old_n_clone->stats_last_clear, - sizeof (new_n_clone->stats_last_clear)); - - /* keep previous node state */ - new_n_clone->state = old_n_clone->state; - } - vec_add1 (nm_clone->nodes, new_n_clone); - } + for (j = 0; j < vec_len (nm->nodes); j++) + { + vlib_node_t *old_n_clone; + vlib_node_t *new_n, *new_n_clone; + + new_n = nm->nodes[j]; + old_n_clone = old_nodes_clone[j]; + + new_n_clone = clib_mem_alloc_no_fail (sizeof (*new_n_clone)); + clib_memcpy (new_n_clone, new_n, sizeof (*new_n)); + /* none of the copied nodes have enqueue rights given out */ + new_n_clone->owner_node_index = VLIB_INVALID_NODE_INDEX; + + if (j >= vec_len (old_nodes_clone)) + { + /* new node, set to zero */ + memset (&new_n_clone->stats_total, 0, + sizeof (new_n_clone->stats_total)); + memset (&new_n_clone->stats_last_clear, 0, + sizeof (new_n_clone->stats_last_clear)); + } + else + { + /* Copy stats if the old data is valid */ + clib_memcpy (&new_n_clone->stats_total, + &old_n_clone->stats_total, + sizeof (new_n_clone->stats_total)); + clib_memcpy (&new_n_clone->stats_last_clear, + &old_n_clone->stats_last_clear, + sizeof (new_n_clone->stats_last_clear)); + + /* keep previous node state */ + new_n_clone->state = old_n_clone->state; + } + vec_add1 (nm_clone->nodes, new_n_clone); + } /* Free the old node clone */ - for (j = 0; j < vec_len(old_nodes_clone); j++) - clib_mem_free (old_nodes_clone[j]); + for (j = 0; j < vec_len (old_nodes_clone); j++) + clib_mem_free (old_nodes_clone[j]); vec_free (old_nodes_clone); - + vec_free (nm_clone->nodes_by_type[VLIB_NODE_TYPE_INTERNAL]); nm_clone->nodes_by_type[VLIB_NODE_TYPE_INTERNAL] = - vec_dup (nm->nodes_by_type[VLIB_NODE_TYPE_INTERNAL]); + vec_dup (nm->nodes_by_type[VLIB_NODE_TYPE_INTERNAL]); /* clone input node runtime */ old_rt = nm_clone->nodes_by_type[VLIB_NODE_TYPE_INPUT]; nm_clone->nodes_by_type[VLIB_NODE_TYPE_INPUT] = - vec_dup (nm->nodes_by_type[VLIB_NODE_TYPE_INPUT]); + vec_dup (nm->nodes_by_type[VLIB_NODE_TYPE_INPUT]); - vec_foreach(rt, nm_clone->nodes_by_type[VLIB_NODE_TYPE_INPUT]) - { - rt->cpu_index = vm_clone->cpu_index; - } + vec_foreach (rt, nm_clone->nodes_by_type[VLIB_NODE_TYPE_INPUT]) + { + rt->cpu_index = vm_clone->cpu_index; + } - for (j=0; j < vec_len(old_rt); j++) - { - rt = vlib_node_get_runtime (vm_clone, old_rt[j].node_index); - rt->state = old_rt[j].state; - } + for (j = 0; j < vec_len (old_rt); j++) + { + rt = vlib_node_get_runtime (vm_clone, old_rt[j].node_index); + rt->state = old_rt[j].state; + } - vec_free(old_rt); + vec_free (old_rt); nm_clone->processes = vec_dup (nm->processes); @@ -958,86 +981,88 @@ static clib_error_t * cpu_config (vlib_main_t * vm, unformat_input_t * input) { vlib_thread_registration_t *tr; - uword * p; - vlib_thread_main_t * tm = &vlib_thread_main; - u8 * name; + uword *p; + vlib_thread_main_t *tm = &vlib_thread_main; + u8 *name; u64 coremask; - uword * bitmap; + uword *bitmap; u32 count; tm->thread_registrations_by_name = hash_create_string (0, sizeof (uword)); - tm->n_thread_stacks = 1; /* account for main thread */ + tm->n_thread_stacks = 1; /* account for main thread */ tr = tm->next; while (tr) { - hash_set_mem (tm->thread_registrations_by_name, tr->name, (uword)tr); + hash_set_mem (tm->thread_registrations_by_name, tr->name, (uword) tr); tr = tr->next; } - while (unformat_check_input(input) != UNFORMAT_END_OF_INPUT) + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { if (unformat (input, "use-pthreads")) - tm->use_pthreads = 1; + tm->use_pthreads = 1; else if (unformat (input, "thread-prefix %v", &tm->thread_prefix)) - ; + ; else if (unformat (input, "main-core %u", &tm->main_lcore)) - ; + ; else if (unformat (input, "skip-cores %u", &tm->skip_cores)) - ; + ; else if (unformat (input, "coremask-%s %llx", &name, &coremask)) - { - p = hash_get_mem (tm->thread_registrations_by_name, name); - if (p == 0) - return clib_error_return (0, "no such thread type '%s'", name); + { + p = hash_get_mem (tm->thread_registrations_by_name, name); + if (p == 0) + return clib_error_return (0, "no such thread type '%s'", name); - tr = (vlib_thread_registration_t *)p[0]; + tr = (vlib_thread_registration_t *) p[0]; - if (tr->use_pthreads) - return clib_error_return (0, "coremask cannot be set for '%s' threads", - name); + if (tr->use_pthreads) + return clib_error_return (0, + "coremask cannot be set for '%s' threads", + name); - tr->coremask = clib_bitmap_set_multiple - (tr->coremask, 0, coremask, BITS(coremask)); - tr->count = clib_bitmap_count_set_bits (tr->coremask); - } + tr->coremask = clib_bitmap_set_multiple + (tr->coremask, 0, coremask, BITS (coremask)); + tr->count = clib_bitmap_count_set_bits (tr->coremask); + } else if (unformat (input, "corelist-%s %U", &name, unformat_bitmap_list, - &bitmap)) - { - p = hash_get_mem (tm->thread_registrations_by_name, name); - if (p == 0) - return clib_error_return (0, "no such thread type '%s'", name); + &bitmap)) + { + p = hash_get_mem (tm->thread_registrations_by_name, name); + if (p == 0) + return clib_error_return (0, "no such thread type '%s'", name); - tr = (vlib_thread_registration_t *)p[0]; + tr = (vlib_thread_registration_t *) p[0]; - if (tr->use_pthreads) - return clib_error_return (0, "corelist cannot be set for '%s' threads", - name); + if (tr->use_pthreads) + return clib_error_return (0, + "corelist cannot be set for '%s' threads", + name); - tr->coremask = bitmap; - tr->count = clib_bitmap_count_set_bits (tr->coremask); - } + tr->coremask = bitmap; + tr->count = clib_bitmap_count_set_bits (tr->coremask); + } else if (unformat (input, "%s %u", &name, &count)) - { - p = hash_get_mem (tm->thread_registrations_by_name, name); - if (p == 0) - return clib_error_return (0, "no such thread type '%s'", name); - - tr = (vlib_thread_registration_t *)p[0]; - if (tr->fixed_count) - return clib_error_return - (0, "number of %s threads not configurable", tr->name); - tr->count = count; - } - else - break; + { + p = hash_get_mem (tm->thread_registrations_by_name, name); + if (p == 0) + return clib_error_return (0, "no such thread type '%s'", name); + + tr = (vlib_thread_registration_t *) p[0]; + if (tr->fixed_count) + return clib_error_return + (0, "number of %s threads not configurable", tr->name); + tr->count = count; + } + else + break; } tr = tm->next; if (!tm->thread_prefix) - tm->thread_prefix = format(0, "vpp"); + tm->thread_prefix = format (0, "vpp"); while (tr) { @@ -1053,30 +1078,37 @@ cpu_config (vlib_main_t * vm, unformat_input_t * input) VLIB_EARLY_CONFIG_FUNCTION (cpu_config, "cpu"); #if !defined (__x86_64__) && !defined (__aarch64__) && !defined (__powerpc64__) && !defined(__arm__) -void __sync_fetch_and_add_8 (void) +void +__sync_fetch_and_add_8 (void) { - fformat(stderr, "%s called\n", __FUNCTION__); - abort(); + fformat (stderr, "%s called\n", __FUNCTION__); + abort (); } -void __sync_add_and_fetch_8 (void) + +void +__sync_add_and_fetch_8 (void) { - fformat(stderr, "%s called\n", __FUNCTION__); - abort(); + fformat (stderr, "%s called\n", __FUNCTION__); + abort (); } #endif void vnet_main_fixup (vlib_fork_fixup_t which) __attribute__ ((weak)); -void vnet_main_fixup (vlib_fork_fixup_t which) { } +void +vnet_main_fixup (vlib_fork_fixup_t which) +{ +} -void vlib_worker_thread_fork_fixup (vlib_fork_fixup_t which) +void +vlib_worker_thread_fork_fixup (vlib_fork_fixup_t which) { - vlib_main_t * vm = vlib_get_main(); + vlib_main_t *vm = vlib_get_main (); if (vlib_mains == 0) return; - ASSERT(os_get_cpu_number() == 0); - vlib_worker_thread_barrier_sync(vm); + ASSERT (os_get_cpu_number () == 0); + vlib_worker_thread_barrier_sync (vm); switch (which) { @@ -1085,48 +1117,50 @@ void vlib_worker_thread_fork_fixup (vlib_fork_fixup_t which) break; default: - ASSERT(0); + ASSERT (0); } - vlib_worker_thread_barrier_release(vm); + vlib_worker_thread_barrier_release (vm); } -void vlib_worker_thread_barrier_sync(vlib_main_t *vm) +void +vlib_worker_thread_barrier_sync (vlib_main_t * vm) { f64 deadline; u32 count; - + if (!vlib_mains) - return; + return; count = vec_len (vlib_mains) - 1; /* Tolerate recursive calls */ if (++vlib_worker_threads[0].recursion_level > 1) - return; + return; vlib_worker_threads[0].barrier_sync_count++; - ASSERT (os_get_cpu_number() == 0); + ASSERT (os_get_cpu_number () == 0); deadline = vlib_time_now (vm) + BARRIER_SYNC_TIMEOUT; *vlib_worker_threads->wait_at_barrier = 1; while (*vlib_worker_threads->workers_at_barrier != count) { - if (vlib_time_now(vm) > deadline) - { - fformat(stderr, "%s: worker thread deadlock\n", __FUNCTION__); - os_panic(); - } + if (vlib_time_now (vm) > deadline) + { + fformat (stderr, "%s: worker thread deadlock\n", __FUNCTION__); + os_panic (); + } } } -void vlib_worker_thread_barrier_release(vlib_main_t * vm) +void +vlib_worker_thread_barrier_release (vlib_main_t * vm) { f64 deadline; if (!vlib_mains) - return; + return; if (--vlib_worker_threads[0].recursion_level > 0) return; @@ -1137,41 +1171,42 @@ void vlib_worker_thread_barrier_release(vlib_main_t * vm) while (*vlib_worker_threads->workers_at_barrier > 0) { - if (vlib_time_now(vm) > deadline) - { - fformat(stderr, "%s: worker thread deadlock\n", __FUNCTION__); - os_panic(); - } + if (vlib_time_now (vm) > deadline) + { + fformat (stderr, "%s: worker thread deadlock\n", __FUNCTION__); + os_panic (); + } } } /* * Check the frame queue to see if any frames are available. - * If so, pull the packets off the frames and put them to + * If so, pull the packets off the frames and put them to * the handoff node. */ -static inline int vlib_frame_queue_dequeue_internal (vlib_main_t *vm) +static inline int +vlib_frame_queue_dequeue_internal (vlib_main_t * vm) { u32 thread_id = vm->cpu_index; vlib_frame_queue_t *fq = vlib_frame_queues[thread_id]; vlib_frame_queue_elt_t *elt; - u32 * from, * to; - vlib_frame_t * f; + u32 *from, *to; + vlib_frame_t *f; int msg_type; int processed = 0; u32 n_left_to_node; u32 vectors = 0; - vlib_thread_main_t *tm = vlib_get_thread_main(); + vlib_thread_main_t *tm = vlib_get_thread_main (); ASSERT (fq); - ASSERT(vm == vlib_mains[thread_id]); + ASSERT (vm == vlib_mains[thread_id]); if (PREDICT_FALSE (tm->handoff_dispatch_node_index == ~0)) - return 0; + return 0; /* * Gather trace data for frame queues */ - if (PREDICT_FALSE(fq->trace)) + if (PREDICT_FALSE (fq->trace)) { frame_queue_trace_t *fqt; frame_queue_nelt_counter_t *fqh; @@ -1185,41 +1220,43 @@ static inline int vlib_frame_queue_dequeue_internal (vlib_main_t *vm) fqt->tail = fq->tail; fqt->threshold = fq->vector_threshold; fqt->n_in_use = fqt->tail - fqt->head; - if (fqt->n_in_use >= fqt->nelts){ - // if beyond max then use max - fqt->n_in_use = fqt->nelts-1; - } + if (fqt->n_in_use >= fqt->nelts) + { + // if beyond max then use max + fqt->n_in_use = fqt->nelts - 1; + } /* Record the number of elements in use in the histogram */ fqh = &tm->frame_queue_histogram[thread_id]; - fqh->count[ fqt->n_in_use ]++; + fqh->count[fqt->n_in_use]++; /* Record a snapshot of the elements in use */ - for (elix=0; elix<fqt->nelts; elix++) { - elt = fq->elts + ((fq->head+1 + elix) & (fq->nelts-1)); - if (1 || elt->valid) - { - fqt->n_vectors[elix] = elt->n_vectors; - } - } + for (elix = 0; elix < fqt->nelts; elix++) + { + elt = fq->elts + ((fq->head + 1 + elix) & (fq->nelts - 1)); + if (1 || elt->valid) + { + fqt->n_vectors[elix] = elt->n_vectors; + } + } fqt->written = 1; } while (1) { if (fq->head == fq->tail) - { - fq->head_hint = fq->head; - return processed; - } + { + fq->head_hint = fq->head; + return processed; + } - elt = fq->elts + ((fq->head+1) & (fq->nelts-1)); + elt = fq->elts + ((fq->head + 1) & (fq->nelts - 1)); if (!elt->valid) - { - fq->head_hint = fq->head; - return processed; - } + { + fq->head_hint = fq->head; + return processed; + } from = elt->buffer_index; msg_type = elt->msg_type; @@ -1234,23 +1271,23 @@ static inline int vlib_frame_queue_dequeue_internal (vlib_main_t *vm) n_left_to_node = elt->n_vectors; while (n_left_to_node >= 4) - { - to[0] = from[0]; - to[1] = from[1]; - to[2] = from[2]; - to[3] = from[3]; - to += 4; - from += 4; - n_left_to_node -= 4; - } + { + to[0] = from[0]; + to[1] = from[1]; + to[2] = from[2]; + to[3] = from[3]; + to += 4; + from += 4; + n_left_to_node -= 4; + } while (n_left_to_node > 0) - { - to[0] = from[0]; - to++; - from++; - n_left_to_node--; - } + { + to[0] = from[0]; + to++; + from++; + n_left_to_node--; + } vectors += elt->n_vectors; f->n_vectors = elt->n_vectors; @@ -1259,7 +1296,7 @@ static inline int vlib_frame_queue_dequeue_internal (vlib_main_t *vm) elt->valid = 0; elt->n_vectors = 0; elt->msg_type = 0xfefefefe; - CLIB_MEMORY_BARRIER(); + CLIB_MEMORY_BARRIER (); fq->head++; processed++; @@ -1267,19 +1304,19 @@ static inline int vlib_frame_queue_dequeue_internal (vlib_main_t *vm) * Limit the number of packets pushed into the graph */ if (vectors >= fq->vector_threshold) - { - fq->head_hint = fq->head; - return processed; - } + { + fq->head_hint = fq->head; + return processed; + } } - ASSERT(0); + ASSERT (0); return processed; } static_always_inline void -vlib_worker_thread_internal (vlib_main_t *vm) +vlib_worker_thread_internal (vlib_main_t * vm) { - vlib_node_main_t * nm = &vm->node_main; + vlib_node_main_t *nm = &vm->node_main; u64 cpu_time_now = clib_cpu_time_now (); while (1) @@ -1288,27 +1325,28 @@ vlib_worker_thread_internal (vlib_main_t *vm) vlib_frame_queue_dequeue_internal (vm); - vlib_node_runtime_t * n; + vlib_node_runtime_t *n; vec_foreach (n, nm->nodes_by_type[VLIB_NODE_TYPE_INPUT]) - { - cpu_time_now = dispatch_node (vm, n, VLIB_NODE_TYPE_INPUT, - VLIB_NODE_STATE_POLLING, /* frame */ 0, - cpu_time_now); - } + { + cpu_time_now = dispatch_node (vm, n, VLIB_NODE_TYPE_INPUT, + VLIB_NODE_STATE_POLLING, /* frame */ 0, + cpu_time_now); + } if (_vec_len (nm->pending_frames)) - { - int i; - cpu_time_now = clib_cpu_time_now (); - for (i = 0; i < _vec_len (nm->pending_frames); i++) { - vlib_pending_frame_t *p; - - p = nm->pending_frames + i; - - cpu_time_now = dispatch_pending_node (vm, p, cpu_time_now); - } - _vec_len (nm->pending_frames) = 0; - } + { + int i; + cpu_time_now = clib_cpu_time_now (); + for (i = 0; i < _vec_len (nm->pending_frames); i++) + { + vlib_pending_frame_t *p; + + p = nm->pending_frames + i; + + cpu_time_now = dispatch_pending_node (vm, p, cpu_time_now); + } + _vec_len (nm->pending_frames) = 0; + } vlib_increment_main_loop_counter (vm); /* Record time stamp in case there are no enabled nodes and above @@ -1317,13 +1355,14 @@ vlib_worker_thread_internal (vlib_main_t *vm) } } -void vlib_worker_thread_fn (void * arg) +void +vlib_worker_thread_fn (void *arg) { - vlib_worker_thread_t * w = (vlib_worker_thread_t *) arg; - vlib_thread_main_t * tm = vlib_get_thread_main(); - vlib_main_t * vm = vlib_get_main(); + vlib_worker_thread_t *w = (vlib_worker_thread_t *) arg; + vlib_thread_main_t *tm = vlib_get_thread_main (); + vlib_main_t *vm = vlib_get_main (); - ASSERT(vm->cpu_index == os_get_cpu_number()); + ASSERT (vm->cpu_index == os_get_cpu_number ()); vlib_worker_thread_init (w); clib_time_init (&vm->clib_time); @@ -1333,18 +1372,21 @@ void vlib_worker_thread_fn (void * arg) while (tm->worker_thread_release == 0) vlib_worker_thread_barrier_check (); - vlib_worker_thread_internal(vm); + vlib_worker_thread_internal (vm); } +/* *INDENT-OFF* */ VLIB_REGISTER_THREAD (worker_thread_reg, static) = { .name = "workers", .short_name = "wk", .function = vlib_worker_thread_fn, }; +/* *INDENT-ON* */ -clib_error_t *threads_init (vlib_main_t *vm) +clib_error_t * +threads_init (vlib_main_t * vm) { - vlib_thread_main_t * tm = vlib_get_thread_main(); + vlib_thread_main_t *tm = vlib_get_thread_main (); tm->handoff_dispatch_node_index = ~0; @@ -1352,3 +1394,11 @@ clib_error_t *threads_init (vlib_main_t *vm) } VLIB_INIT_FUNCTION (threads_init); + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/threads.h b/vlib/vlib/threads.h index e3b902ae518..4283b70a61d 100644 --- a/vlib/vlib/threads.h +++ b/vlib/vlib/threads.h @@ -19,20 +19,20 @@ vlib_main_t **vlib_mains; -void -vlib_set_thread_name (char *name); +void vlib_set_thread_name (char *name); /* arg is actually a vlib__thread_t * */ -typedef void (vlib_thread_function_t) (void * arg); +typedef void (vlib_thread_function_t) (void *arg); -typedef struct vlib_thread_registration_ { +typedef struct vlib_thread_registration_ +{ /* constructor generated list of thread registrations */ - struct vlib_thread_registration_ * next; + struct vlib_thread_registration_ *next; /* config parameters */ - char * name; - char * short_name; - vlib_thread_function_t * function; + char *name; + char *short_name; + vlib_thread_function_t *function; uword mheap_size; int fixed_count; u32 count; @@ -42,7 +42,7 @@ typedef struct vlib_thread_registration_ { /* All threads of this type run on pthreads */ int use_pthreads; u32 first_index; - uword * coremask; + uword *coremask; } vlib_thread_registration_t; /* @@ -58,19 +58,21 @@ typedef struct vlib_thread_registration_ { #error Please increase number of per-cpu mheaps #endif -#define VLIB_CPU_MASK (VLIB_MAX_CPUS - 1) /* 0x3f, max */ +#define VLIB_CPU_MASK (VLIB_MAX_CPUS - 1) /* 0x3f, max */ #define VLIB_OFFSET_MASK (~VLIB_CPU_MASK) #define VLIB_LOG2_THREAD_STACK_SIZE (20) #define VLIB_THREAD_STACK_SIZE (1<<VLIB_LOG2_THREAD_STACK_SIZE) -typedef enum { - VLIB_FRAME_QUEUE_ELT_DISPATCH_FRAME, +typedef enum +{ + VLIB_FRAME_QUEUE_ELT_DISPATCH_FRAME, } vlib_frame_queue_msg_type_t; -typedef struct { +typedef struct +{ volatile u32 valid; - u32 msg_type; + u32 msg_type; u32 n_vectors; u32 last_n_vectors; @@ -78,10 +80,12 @@ typedef struct { u32 buffer_index[VLIB_FRAME_SIZE]; /* Pad to a cache line boundary */ - u8 pad[CLIB_CACHE_LINE_BYTES - 4 * sizeof(u32)]; -} vlib_frame_queue_elt_t; + u8 pad[CLIB_CACHE_LINE_BYTES - 4 * sizeof (u32)]; +} +vlib_frame_queue_elt_t; -typedef struct { +typedef struct +{ /* First cache line */ volatile u32 *wait_at_barrier; volatile u32 *workers_at_barrier; @@ -89,11 +93,11 @@ typedef struct { /* Second Cache Line */ void *thread_mheap; - u8 * thread_stack; - void (*thread_function)(void *); - void * thread_function_arg; - i64 recursion_level; - elog_track_t elog_track; + u8 *thread_stack; + void (*thread_function) (void *); + void *thread_function_arg; + i64 recursion_level; + elog_track_t elog_track; u32 instance_id; vlib_thread_registration_t *registration; u8 *name; @@ -105,7 +109,8 @@ typedef struct { vlib_worker_thread_t *vlib_worker_threads; -typedef struct { +typedef struct +{ /* enqueue side */ volatile u64 tail; u64 enqueues; @@ -113,9 +118,7 @@ typedef struct { u64 enqueue_vectors; u32 enqueue_full_events; u32 enqueue_efd_discards; - u8 pad2[CLIB_CACHE_LINE_BYTES - - (2 * sizeof(u32)) - - (4 * sizeof(u64))]; + u8 pad2[CLIB_CACHE_LINE_BYTES - (2 * sizeof (u32)) - (4 * sizeof (u64))]; /* dequeue side */ volatile u64 head; @@ -124,48 +127,45 @@ typedef struct { u64 dequeue_vectors; u64 trace; u64 vector_threshold; - u8 pad4[CLIB_CACHE_LINE_BYTES - - (6 * sizeof(u64))]; + u8 pad4[CLIB_CACHE_LINE_BYTES - (6 * sizeof (u64))]; /* dequeue hint to enqueue side */ volatile u64 head_hint; - u8 pad5 [CLIB_CACHE_LINE_BYTES - sizeof(u64)]; + u8 pad5[CLIB_CACHE_LINE_BYTES - sizeof (u64)]; /* read-only, constant, shared */ vlib_frame_queue_elt_t *elts; u32 nelts; -} vlib_frame_queue_t; +} +vlib_frame_queue_t; vlib_frame_queue_t **vlib_frame_queues; /* Called early, in thread 0's context */ -clib_error_t * vlib_thread_init (vlib_main_t * vm); +clib_error_t *vlib_thread_init (vlib_main_t * vm); -vlib_worker_thread_t * vlib_alloc_thread (vlib_main_t * vm); +vlib_worker_thread_t *vlib_alloc_thread (vlib_main_t * vm); -int vlib_frame_queue_enqueue (vlib_main_t *vm, u32 node_runtime_index, - u32 frame_queue_index, vlib_frame_t *frame, - vlib_frame_queue_msg_type_t type); +int vlib_frame_queue_enqueue (vlib_main_t * vm, u32 node_runtime_index, + u32 frame_queue_index, vlib_frame_t * frame, + vlib_frame_queue_msg_type_t type); -int vlib_frame_queue_dequeue (int thread_id, - vlib_main_t *vm, - vlib_node_main_t *nm); +int vlib_frame_queue_dequeue (int thread_id, + vlib_main_t * vm, vlib_node_main_t * nm); u64 dispatch_node (vlib_main_t * vm, - vlib_node_runtime_t * node, - vlib_node_type_t type, - vlib_node_state_t dispatch_state, - vlib_frame_t * frame, - u64 last_time_stamp); + vlib_node_runtime_t * node, + vlib_node_type_t type, + vlib_node_state_t dispatch_state, + vlib_frame_t * frame, u64 last_time_stamp); u64 dispatch_pending_node (vlib_main_t * vm, - vlib_pending_frame_t * p, - u64 last_time_stamp); + vlib_pending_frame_t * p, u64 last_time_stamp); -void vlib_worker_thread_node_runtime_update(void); +void vlib_worker_thread_node_runtime_update (void); -void vlib_create_worker_threads (vlib_main_t *vm, int n, - void (*thread_function)(void *)); +void vlib_create_worker_threads (vlib_main_t * vm, int n, + void (*thread_function) (void *)); void vlib_worker_thread_init (vlib_worker_thread_t * w); @@ -179,33 +179,36 @@ void vlib_worker_thread_init (vlib_worker_thread_t * w); #define BARRIER_SYNC_TIMEOUT (1.0) #endif -void vlib_worker_thread_barrier_sync(vlib_main_t *vm); -void vlib_worker_thread_barrier_release(vlib_main_t *vm); +void vlib_worker_thread_barrier_sync (vlib_main_t * vm); +void vlib_worker_thread_barrier_release (vlib_main_t * vm); -always_inline void vlib_smp_unsafe_warning (void) +always_inline void +vlib_smp_unsafe_warning (void) { if (CLIB_DEBUG > 0) { - if (os_get_cpu_number()) - fformat(stderr, "%s: SMP unsafe warning...\n", __FUNCTION__); + if (os_get_cpu_number ()) + fformat (stderr, "%s: SMP unsafe warning...\n", __FUNCTION__); } } -typedef enum { - VLIB_WORKER_THREAD_FORK_FIXUP_ILLEGAL = 0, - VLIB_WORKER_THREAD_FORK_FIXUP_NEW_SW_IF_INDEX, +typedef enum +{ + VLIB_WORKER_THREAD_FORK_FIXUP_ILLEGAL = 0, + VLIB_WORKER_THREAD_FORK_FIXUP_NEW_SW_IF_INDEX, } vlib_fork_fixup_t; void vlib_worker_thread_fork_fixup (vlib_fork_fixup_t which); -static inline void vlib_worker_thread_barrier_check (void) +static inline void +vlib_worker_thread_barrier_check (void) { - if (PREDICT_FALSE(*vlib_worker_threads->wait_at_barrier)) + if (PREDICT_FALSE (*vlib_worker_threads->wait_at_barrier)) { - clib_smp_atomic_add (vlib_worker_threads->workers_at_barrier, 1); - while (*vlib_worker_threads->wait_at_barrier) - ; - clib_smp_atomic_add (vlib_worker_threads->workers_at_barrier, -1); + clib_smp_atomic_add (vlib_worker_threads->workers_at_barrier, 1); + while (*vlib_worker_threads->wait_at_barrier) + ; + clib_smp_atomic_add (vlib_worker_threads->workers_at_barrier, -1); } } @@ -244,29 +247,31 @@ do { \ #define VLIB_EFD_DEF_WORKER_HI_THRESH_PCT 90 /* EFD worker thread settings */ -typedef struct vlib_efd_t { +typedef struct vlib_efd_t +{ u16 enabled; u16 queue_hi_thresh; - u8 ip_prec_bitmap; - u8 mpls_exp_bitmap; - u8 vlan_cos_bitmap; - u8 pad; + u8 ip_prec_bitmap; + u8 mpls_exp_bitmap; + u8 vlan_cos_bitmap; + u8 pad; } vlib_efd_t; -typedef struct { +typedef struct +{ /* Link list of registrations, built by constructors */ - vlib_thread_registration_t * next; - + vlib_thread_registration_t *next; + /* Vector of registrations, w/ non-data-structure clones at the top */ - vlib_thread_registration_t ** registrations; + vlib_thread_registration_t **registrations; - uword * thread_registrations_by_name; + uword *thread_registrations_by_name; - vlib_worker_thread_t * worker_threads; + vlib_worker_thread_t *worker_threads; - /* - * Launch all threads as pthreads, - * not eal_rte_launch (strict affinity) threads + /* + * Launch all threads as pthreads, + * not eal_rte_launch (strict affinity) threads */ int use_pthreads; @@ -292,10 +297,10 @@ typedef struct { u8 main_lcore; /* Bitmap of available CPU cores */ - uword * cpu_core_bitmap; + uword *cpu_core_bitmap; /* Bitmap of available CPU sockets (NUMA nodes) */ - uword * cpu_socket_bitmap; + uword *cpu_socket_bitmap; vlib_efd_t efd; @@ -303,7 +308,7 @@ typedef struct { u32 handoff_dispatch_node_index; /* for frame queue tracing */ - frame_queue_trace_t *frame_queue_traces; + frame_queue_trace_t *frame_queue_traces; frame_queue_nelt_counter_t *frame_queue_histogram; /* worker thread initialization barrier */ @@ -323,6 +328,14 @@ static void __vlib_add_thread_registration_##x (void) \ x.next = tm->next; \ tm->next = &x; \ } \ -__VA_ARGS__ vlib_thread_registration_t x +__VA_ARGS__ vlib_thread_registration_t x #endif /* included_vlib_threads_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/threads_cli.c b/vlib/vlib/threads_cli.c index 26cb2213d95..919baac5640 100644 --- a/vlib/vlib/threads_cli.c +++ b/vlib/vlib/threads_cli.c @@ -20,55 +20,53 @@ static clib_error_t * show_threads_fn (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { - vlib_worker_thread_t * w; + vlib_worker_thread_t *w; int i; vlib_cli_output (vm, "%-7s%-20s%-12s%-8s%-7s%-7s%-7s%-10s", - "ID", "Name", "Type", "LWP", - "lcore", "Core", "Socket", "State"); + "ID", "Name", "Type", "LWP", + "lcore", "Core", "Socket", "State"); #if !defined(__powerpc64__) - for (i = 0; i < vec_len(vlib_worker_threads); i++) + for (i = 0; i < vec_len (vlib_worker_threads); i++) { w = vlib_worker_threads + i; - u8 * line = NULL; + u8 *line = NULL; - line = format(line, "%-7d%-20s%-12s%-8d", - i, - w->name ? w->name : (u8 *) "", - w->registration ? w->registration->name : "", - w->lwp); + line = format (line, "%-7d%-20s%-12s%-8d", + i, + w->name ? w->name : (u8 *) "", + w->registration ? w->registration->name : "", w->lwp); #if DPDK==1 int lcore = w->dpdk_lcore_id; if (lcore > -1) - { - line = format(line, "%-7u%-7u%-7u", - lcore, - lcore_config[lcore].core_id, - lcore_config[lcore].socket_id); - - switch(lcore_config[lcore].state) - { - case WAIT: - line = format(line, "wait"); - break; - case RUNNING: - line = format(line, "running"); - break; - case FINISHED: - line = format(line, "finished"); - break; - default: - line = format(line, "unknown"); - } - } + { + line = format (line, "%-7u%-7u%-7u", + lcore, + lcore_config[lcore].core_id, + lcore_config[lcore].socket_id); + + switch (lcore_config[lcore].state) + { + case WAIT: + line = format (line, "wait"); + break; + case RUNNING: + line = format (line, "running"); + break; + case FINISHED: + line = format (line, "finished"); + break; + default: + line = format (line, "unknown"); + } + } #endif - vlib_cli_output(vm, "%v", line); - vec_free(line); + vlib_cli_output (vm, "%v", line); + vec_free (line); } #endif @@ -76,64 +74,76 @@ show_threads_fn (vlib_main_t * vm, } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (show_threads_command, static) = { .path = "show threads", .short_help = "Show threads", .function = show_threads_fn, }; +/* *INDENT-ON* */ /* * Trigger threads to grab frame queue trace data */ static clib_error_t * -trace_frame_queue (vlib_main_t *vm, unformat_input_t *input, - vlib_cli_command_t *cmd) +trace_frame_queue (vlib_main_t * vm, unformat_input_t * input, + vlib_cli_command_t * cmd) { - clib_error_t * error = NULL; + clib_error_t *error = NULL; frame_queue_trace_t *fqt; frame_queue_nelt_counter_t *fqh; - vlib_thread_main_t *tm = vlib_get_thread_main(); + vlib_thread_main_t *tm = vlib_get_thread_main (); u32 num_fq; u32 fqix; u32 enable = 0; - if (unformat(input, "on")) { - enable = 1; - } else if (unformat(input, "off")) { - enable = 0; - } else { - return clib_error_return(0, "expecting on or off"); - } + if (unformat (input, "on")) + { + enable = 1; + } + else if (unformat (input, "off")) + { + enable = 0; + } + else + { + return clib_error_return (0, "expecting on or off"); + } - num_fq = vec_len(vlib_frame_queues); + num_fq = vec_len (vlib_frame_queues); if (num_fq == 0) { - vlib_cli_output(vm, "No frame queues exist\n"); + vlib_cli_output (vm, "No frame queues exist\n"); return error; } // Allocate storage for trace if necessary - vec_validate_aligned(tm->frame_queue_traces, num_fq-1, CLIB_CACHE_LINE_BYTES); - vec_validate_aligned(tm->frame_queue_histogram, num_fq-1, CLIB_CACHE_LINE_BYTES); - - for (fqix=0; fqix<num_fq; fqix++) { - fqt = &tm->frame_queue_traces[fqix]; - fqh = &tm->frame_queue_histogram[fqix]; - - memset(fqt->n_vectors, 0xff, sizeof(fqt->n_vectors)); - fqt->written = 0; - memset(fqh, 0, sizeof(*fqh)); - vlib_frame_queues[fqix]->trace = enable; - } + vec_validate_aligned (tm->frame_queue_traces, num_fq - 1, + CLIB_CACHE_LINE_BYTES); + vec_validate_aligned (tm->frame_queue_histogram, num_fq - 1, + CLIB_CACHE_LINE_BYTES); + + for (fqix = 0; fqix < num_fq; fqix++) + { + fqt = &tm->frame_queue_traces[fqix]; + fqh = &tm->frame_queue_histogram[fqix]; + + memset (fqt->n_vectors, 0xff, sizeof (fqt->n_vectors)); + fqt->written = 0; + memset (fqh, 0, sizeof (*fqh)); + vlib_frame_queues[fqix]->trace = enable; + } return error; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (cmd_trace_frame_queue,static) = { .path = "trace frame-queue", .short_help = "trace frame-queue (on|off)", .function = trace_frame_queue, .is_mp_safe = 1, }; +/* *INDENT-ON* */ /* @@ -141,222 +151,258 @@ VLIB_CLI_COMMAND (cmd_trace_frame_queue,static) = { * Round up, e.g. 0.000001 => 1% */ static u32 -compute_percent (u64 *two_counters, u64 total) +compute_percent (u64 * two_counters, u64 total) { - if (total == 0) - { - return 0; - } - else - { - return (((two_counters[0] + two_counters[1]) * 100) + (total-1)) / total; - } + if (total == 0) + { + return 0; + } + else + { + return (((two_counters[0] + two_counters[1]) * 100) + + (total - 1)) / total; + } } /* * Display frame queue trace data gathered by threads. */ static clib_error_t * -show_frame_queue_internal (vlib_main_t *vm, - u32 histogram) +show_frame_queue_internal (vlib_main_t * vm, u32 histogram) { - vlib_thread_main_t *tm = vlib_get_thread_main(); - clib_error_t * error = NULL; + vlib_thread_main_t *tm = vlib_get_thread_main (); + clib_error_t *error = NULL; frame_queue_trace_t *fqt; frame_queue_nelt_counter_t *fqh; u32 num_fq; u32 fqix; - num_fq = vec_len(tm->frame_queue_traces); + num_fq = vec_len (tm->frame_queue_traces); if (num_fq == 0) { - vlib_cli_output(vm, "No trace data for frame queues\n"); + vlib_cli_output (vm, "No trace data for frame queues\n"); return error; } if (histogram) { - vlib_cli_output(vm, "0-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\n"); + vlib_cli_output (vm, "0-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\n"); } - for (fqix=0; fqix<num_fq; fqix++) { - fqt = &(tm->frame_queue_traces[fqix]); - - vlib_cli_output(vm, "Thread %d %v\n", fqix, vlib_worker_threads[fqix].name); - - if (fqt->written == 0) - { - vlib_cli_output(vm, " no trace data\n"); - continue; - } - - if (histogram) - { - fqh = &(tm->frame_queue_histogram[fqix]); - u32 nelt; - u64 total = 0; - - for (nelt=0; nelt<FRAME_QUEUE_MAX_NELTS; nelt++) { - total += fqh->count[nelt]; - } - - /* - * Print in pairs to condense the output. - * Allow entries with 0 counts to be clearly identified, by rounding up. - * Any non-zero value will be displayed as at least one percent. This - * also means the sum of percentages can be > 100, but that is fine. The - * histogram is counted from the last time "trace frame on" was issued. - */ - vlib_cli_output(vm, - "%3d%% %3d%% %3d%% %3d%% %3d%% %3d%% %3d%% %3d%% " - "%3d%% %3d%% %3d%% %3d%% %3d%% %3d%% %3d%% %3d%%\n", - compute_percent(&fqh->count[ 0], total), - compute_percent(&fqh->count[ 2], total), - compute_percent(&fqh->count[ 4], total), - compute_percent(&fqh->count[ 6], total), - compute_percent(&fqh->count[ 8], total), - compute_percent(&fqh->count[10], total), - compute_percent(&fqh->count[12], total), - compute_percent(&fqh->count[14], total), - compute_percent(&fqh->count[16], total), - compute_percent(&fqh->count[18], total), - compute_percent(&fqh->count[20], total), - compute_percent(&fqh->count[22], total), - compute_percent(&fqh->count[24], total), - compute_percent(&fqh->count[26], total), - compute_percent(&fqh->count[28], total), - compute_percent(&fqh->count[30], total)); - } - else - { - vlib_cli_output(vm, " vector-threshold %d ring size %d in use %d\n", - fqt->threshold, fqt->nelts, fqt->n_in_use); - vlib_cli_output(vm, " head %12d head_hint %12d tail %12d\n", - fqt->head, fqt->head_hint, fqt->tail); - vlib_cli_output(vm, " %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d\n", - fqt->n_vectors[0], fqt->n_vectors[1], fqt->n_vectors[2], fqt->n_vectors[3], - fqt->n_vectors[4], fqt->n_vectors[5], fqt->n_vectors[6], fqt->n_vectors[7], - fqt->n_vectors[8], fqt->n_vectors[9], fqt->n_vectors[10], fqt->n_vectors[11], - fqt->n_vectors[12], fqt->n_vectors[13], fqt->n_vectors[14], fqt->n_vectors[15]); - - if (fqt->nelts > 16) - { - vlib_cli_output(vm, " %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d\n", - fqt->n_vectors[16], fqt->n_vectors[17], fqt->n_vectors[18], fqt->n_vectors[19], - fqt->n_vectors[20], fqt->n_vectors[21], fqt->n_vectors[22], fqt->n_vectors[23], - fqt->n_vectors[24], fqt->n_vectors[25], fqt->n_vectors[26], fqt->n_vectors[27], - fqt->n_vectors[28], fqt->n_vectors[29], fqt->n_vectors[30], fqt->n_vectors[31]); - } - } - - } + for (fqix = 0; fqix < num_fq; fqix++) + { + fqt = &(tm->frame_queue_traces[fqix]); + + vlib_cli_output (vm, "Thread %d %v\n", fqix, + vlib_worker_threads[fqix].name); + + if (fqt->written == 0) + { + vlib_cli_output (vm, " no trace data\n"); + continue; + } + + if (histogram) + { + fqh = &(tm->frame_queue_histogram[fqix]); + u32 nelt; + u64 total = 0; + + for (nelt = 0; nelt < FRAME_QUEUE_MAX_NELTS; nelt++) + { + total += fqh->count[nelt]; + } + + /* + * Print in pairs to condense the output. + * Allow entries with 0 counts to be clearly identified, by rounding up. + * Any non-zero value will be displayed as at least one percent. This + * also means the sum of percentages can be > 100, but that is fine. The + * histogram is counted from the last time "trace frame on" was issued. + */ + vlib_cli_output (vm, + "%3d%% %3d%% %3d%% %3d%% %3d%% %3d%% %3d%% %3d%% " + "%3d%% %3d%% %3d%% %3d%% %3d%% %3d%% %3d%% %3d%%\n", + compute_percent (&fqh->count[0], total), + compute_percent (&fqh->count[2], total), + compute_percent (&fqh->count[4], total), + compute_percent (&fqh->count[6], total), + compute_percent (&fqh->count[8], total), + compute_percent (&fqh->count[10], total), + compute_percent (&fqh->count[12], total), + compute_percent (&fqh->count[14], total), + compute_percent (&fqh->count[16], total), + compute_percent (&fqh->count[18], total), + compute_percent (&fqh->count[20], total), + compute_percent (&fqh->count[22], total), + compute_percent (&fqh->count[24], total), + compute_percent (&fqh->count[26], total), + compute_percent (&fqh->count[28], total), + compute_percent (&fqh->count[30], total)); + } + else + { + vlib_cli_output (vm, + " vector-threshold %d ring size %d in use %d\n", + fqt->threshold, fqt->nelts, fqt->n_in_use); + vlib_cli_output (vm, " head %12d head_hint %12d tail %12d\n", + fqt->head, fqt->head_hint, fqt->tail); + vlib_cli_output (vm, + " %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d\n", + fqt->n_vectors[0], fqt->n_vectors[1], + fqt->n_vectors[2], fqt->n_vectors[3], + fqt->n_vectors[4], fqt->n_vectors[5], + fqt->n_vectors[6], fqt->n_vectors[7], + fqt->n_vectors[8], fqt->n_vectors[9], + fqt->n_vectors[10], fqt->n_vectors[11], + fqt->n_vectors[12], fqt->n_vectors[13], + fqt->n_vectors[14], fqt->n_vectors[15]); + + if (fqt->nelts > 16) + { + vlib_cli_output (vm, + " %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d\n", + fqt->n_vectors[16], fqt->n_vectors[17], + fqt->n_vectors[18], fqt->n_vectors[19], + fqt->n_vectors[20], fqt->n_vectors[21], + fqt->n_vectors[22], fqt->n_vectors[23], + fqt->n_vectors[24], fqt->n_vectors[25], + fqt->n_vectors[26], fqt->n_vectors[27], + fqt->n_vectors[28], fqt->n_vectors[29], + fqt->n_vectors[30], fqt->n_vectors[31]); + } + } + + } return error; } static clib_error_t * -show_frame_queue_trace (vlib_main_t *vm, unformat_input_t *input, - vlib_cli_command_t *cmd) +show_frame_queue_trace (vlib_main_t * vm, unformat_input_t * input, + vlib_cli_command_t * cmd) { return show_frame_queue_internal (vm, 0); } static clib_error_t * -show_frame_queue_histogram (vlib_main_t *vm, unformat_input_t *input, - vlib_cli_command_t *cmd) +show_frame_queue_histogram (vlib_main_t * vm, unformat_input_t * input, + vlib_cli_command_t * cmd) { return show_frame_queue_internal (vm, 1); } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (cmd_show_frame_queue_trace,static) = { .path = "show frame-queue", .short_help = "show frame-queue trace", .function = show_frame_queue_trace, }; +/* *INDENT-ON* */ +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (cmd_show_frame_queue_histogram,static) = { .path = "show frame-queue histogram", .short_help = "show frame-queue histogram", .function = show_frame_queue_histogram, }; +/* *INDENT-ON* */ /* * Modify the number of elements on the frame_queues */ static clib_error_t * -test_frame_queue_nelts (vlib_main_t *vm, unformat_input_t *input, - vlib_cli_command_t *cmd) +test_frame_queue_nelts (vlib_main_t * vm, unformat_input_t * input, + vlib_cli_command_t * cmd) { - clib_error_t * error = NULL; + clib_error_t *error = NULL; u32 num_fq; u32 fqix; u32 nelts = 0; - unformat(input, "%d", &nelts); - if ((nelts != 4) && (nelts != 8) && (nelts != 16) && (nelts != 32)) { - return clib_error_return(0, "expecting 4,8,16,32"); - } + unformat (input, "%d", &nelts); + if ((nelts != 4) && (nelts != 8) && (nelts != 16) && (nelts != 32)) + { + return clib_error_return (0, "expecting 4,8,16,32"); + } - num_fq = vec_len(vlib_frame_queues); + num_fq = vec_len (vlib_frame_queues); if (num_fq == 0) { - vlib_cli_output(vm, "No frame queues exist\n"); + vlib_cli_output (vm, "No frame queues exist\n"); return error; } - for (fqix=0; fqix<num_fq; fqix++) { - vlib_frame_queues[fqix]->nelts = nelts; - } + for (fqix = 0; fqix < num_fq; fqix++) + { + vlib_frame_queues[fqix]->nelts = nelts; + } return error; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (cmd_test_frame_queue_nelts,static) = { .path = "test frame-queue nelts", .short_help = "test frame-queue nelts (4,8,16,32)", .function = test_frame_queue_nelts, }; +/* *INDENT-ON* */ /* * Modify the max number of packets pulled off the frame queues */ static clib_error_t * -test_frame_queue_threshold (vlib_main_t *vm, unformat_input_t *input, - vlib_cli_command_t *cmd) +test_frame_queue_threshold (vlib_main_t * vm, unformat_input_t * input, + vlib_cli_command_t * cmd) { - clib_error_t * error = NULL; + clib_error_t *error = NULL; u32 num_fq; u32 fqix; u32 threshold = 0; - if (unformat(input, "%d", &threshold)) { - } else { - vlib_cli_output(vm, "expecting threshold value\n"); + if (unformat (input, "%d", &threshold)) + { + } + else + { + vlib_cli_output (vm, "expecting threshold value\n"); return error; - } + } if (threshold == 0) threshold = ~0; - num_fq = vec_len(vlib_frame_queues); + num_fq = vec_len (vlib_frame_queues); if (num_fq == 0) { - vlib_cli_output(vm, "No frame queues exist\n"); + vlib_cli_output (vm, "No frame queues exist\n"); return error; } - for (fqix=0; fqix<num_fq; fqix++) { - vlib_frame_queues[fqix]->vector_threshold = threshold; - } + for (fqix = 0; fqix < num_fq; fqix++) + { + vlib_frame_queues[fqix]->vector_threshold = threshold; + } return error; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (cmd_test_frame_queue_threshold,static) = { .path = "test frame-queue threshold", .short_help = "test frame-queue threshold N (0=no limit)", .function = test_frame_queue_threshold, }; +/* *INDENT-ON* */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/trace.c b/vlib/vlib/trace.c index 86a04aa64d1..5b64c55a01d 100644 --- a/vlib/vlib/trace.c +++ b/vlib/vlib/trace.c @@ -49,16 +49,16 @@ vlib_trace_frame_buffers_only (vlib_main_t * vm, uword next_buffer_stride, uword n_buffer_data_bytes_in_trace) { - u32 n_left, * from; + u32 n_left, *from; n_left = n_buffers; from = buffers; - + while (n_left >= 4) { u32 bi0, bi1; - vlib_buffer_t * b0, * b1; - u8 * t0, * t1; + vlib_buffer_t *b0, *b1; + u8 *t0, *t1; /* Prefetch next iteration. */ vlib_prefetch_buffer_with_index (vm, from[2], LOAD); @@ -74,13 +74,13 @@ vlib_trace_frame_buffers_only (vlib_main_t * vm, { t0 = vlib_add_trace (vm, node, b0, n_buffer_data_bytes_in_trace); clib_memcpy (t0, b0->data + b0->current_data, - n_buffer_data_bytes_in_trace); + n_buffer_data_bytes_in_trace); } if (b1->flags & VLIB_BUFFER_IS_TRACED) { t1 = vlib_add_trace (vm, node, b1, n_buffer_data_bytes_in_trace); clib_memcpy (t1, b1->data + b1->current_data, - n_buffer_data_bytes_in_trace); + n_buffer_data_bytes_in_trace); } from += 2; n_left -= 2; @@ -89,8 +89,8 @@ vlib_trace_frame_buffers_only (vlib_main_t * vm, while (n_left >= 1) { u32 bi0; - vlib_buffer_t * b0; - u8 * t0; + vlib_buffer_t *b0; + u8 *t0; bi0 = from[0]; @@ -100,7 +100,7 @@ vlib_trace_frame_buffers_only (vlib_main_t * vm, { t0 = vlib_add_trace (vm, node, b0, n_buffer_data_bytes_in_trace); clib_memcpy (t0, b0->data + b0->current_data, - n_buffer_data_bytes_in_trace); + n_buffer_data_bytes_in_trace); } from += 1; n_left -= 1; @@ -112,8 +112,9 @@ always_inline void clear_trace_buffer (void) { int i; - vlib_trace_main_t * tm; + vlib_trace_main_t *tm; + /* *INDENT-OFF* */ foreach_vlib_main ( ({ void *mainheap; @@ -129,17 +130,19 @@ clear_trace_buffer (void) pool_free (tm->trace_buffer_pool); clib_mem_set_heap (mainheap); })); + /* *INDENT-ON* */ } -static u8 * format_vlib_trace (u8 * s, va_list * va) +static u8 * +format_vlib_trace (u8 * s, va_list * va) { - vlib_main_t * vm = va_arg (*va, vlib_main_t *); - vlib_trace_header_t * h = va_arg (*va, vlib_trace_header_t *); - vlib_trace_header_t * e = vec_end (h); - vlib_node_t * node, * prev_node; - clib_time_t * ct = &vm->clib_time; + vlib_main_t *vm = va_arg (*va, vlib_main_t *); + vlib_trace_header_t *h = va_arg (*va, vlib_trace_header_t *); + vlib_trace_header_t *e = vec_end (h); + vlib_node_t *node, *prev_node; + clib_time_t *ct = &vm->clib_time; f64 t; - + prev_node = 0; while (h < e) { @@ -147,19 +150,18 @@ static u8 * format_vlib_trace (u8 * s, va_list * va) if (node != prev_node) { - t = (h->time - vm->cpu_time_main_loop_start) * ct->seconds_per_clock; - s = format (s, "\n%U: %v", - format_time_interval, "h:m:s:u", t, - node->name); + t = + (h->time - vm->cpu_time_main_loop_start) * ct->seconds_per_clock; + s = + format (s, "\n%U: %v", format_time_interval, "h:m:s:u", t, + node->name); } prev_node = node; if (node->format_trace) - s = format (s, "\n %U", - node->format_trace, vm, node, h->data); + s = format (s, "\n %U", node->format_trace, vm, node, h->data); else - s = format (s, "\n %U", - node->format_buffer, h->data); + s = format (s, "\n %U", node->format_buffer, h->data); h = vlib_trace_header_next (h); } @@ -168,16 +170,18 @@ static u8 * format_vlib_trace (u8 * s, va_list * va) } /* Root of all trace cli commands. */ +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (trace_cli_command,static) = { .path = "trace", .short_help = "Packet tracer commands", }; +/* *INDENT-ON* */ static int -trace_cmp (void * a1, void * a2) +trace_cmp (void *a1, void *a2) { - vlib_trace_header_t ** t1 = a1; - vlib_trace_header_t ** t2 = a2; + vlib_trace_header_t **t1 = a1; + vlib_trace_header_t **t2 = a2; i64 dt = t1[0]->time - t2[0]->time; return dt < 0 ? -1 : (dt > 0 ? +1 : 0); } @@ -185,32 +189,34 @@ trace_cmp (void * a1, void * a2) /* * Return 1 if this packet passes the trace filter, or 0 otherwise */ -u32 filter_accept (vlib_trace_main_t * tm, vlib_trace_header_t * h) +u32 +filter_accept (vlib_trace_main_t * tm, vlib_trace_header_t * h) { - vlib_trace_header_t * e = vec_end (h); + vlib_trace_header_t *e = vec_end (h); - if (tm->filter_flag == 0) return 1; + if (tm->filter_flag == 0) + return 1; if (tm->filter_flag == FILTER_FLAG_INCLUDE) { while (h < e) - { - if (h->node_index == tm->filter_node_index) - return 1; - h = vlib_trace_header_next (h); - } + { + if (h->node_index == tm->filter_node_index) + return 1; + h = vlib_trace_header_next (h); + } return 0; - } - else /* FILTER_FLAG_EXCLUDE */ + } + else /* FILTER_FLAG_EXCLUDE */ { while (h < e) - { - if (h->node_index == tm->filter_node_index) - return 0; - h = vlib_trace_header_next (h); - } + { + if (h->node_index == tm->filter_node_index) + return 0; + h = vlib_trace_header_next (h); + } return 1; - } + } return 0; } @@ -218,11 +224,12 @@ u32 filter_accept (vlib_trace_main_t * tm, vlib_trace_header_t * h) /* * Remove traces from the trace buffer pool that don't pass the filter */ -void trace_apply_filter (vlib_main_t * vm) +void +trace_apply_filter (vlib_main_t * vm) { - vlib_trace_main_t * tm = &vm->trace_main; - vlib_trace_header_t ** h; - vlib_trace_header_t *** traces_to_remove = 0; + vlib_trace_main_t *tm = &vm->trace_main; + vlib_trace_header_t **h; + vlib_trace_header_t ***traces_to_remove = 0; u32 index; u32 trace_index; u32 n_accepted; @@ -237,6 +244,7 @@ void trace_apply_filter (vlib_main_t * vm) * of any N traces. */ n_accepted = 0; + /* *INDENT-OFF* */ pool_foreach (h, tm->trace_buffer_pool, ({ accept = filter_accept(tm, h[0]); @@ -246,9 +254,10 @@ void trace_apply_filter (vlib_main_t * vm) else n_accepted++; })); + /* *INDENT-ON* */ /* remove all traces that we don't want to keep */ - for (index=0; index<vec_len(traces_to_remove); index++) + for (index = 0; index < vec_len (traces_to_remove); index++) { trace_index = traces_to_remove[index] - tm->trace_buffer_pool; _vec_len (tm->trace_buffer_pool[trace_index]) = 0; @@ -260,14 +269,13 @@ void trace_apply_filter (vlib_main_t * vm) static clib_error_t * cli_show_trace_buffer (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { - vlib_trace_main_t * tm; - vlib_trace_header_t ** h, ** traces; + vlib_trace_main_t *tm; + vlib_trace_header_t **h, **traces; u32 i, index = 0; - char * fmt; - u8 * s = 0; + char *fmt; + u8 *s = 0; u32 max; /* @@ -275,18 +283,19 @@ cli_show_trace_buffer (vlib_main_t * vm, * specify a max. This prevents unexpectedly huge outputs. */ max = 50; - while (unformat_check_input(input) != (uword)UNFORMAT_END_OF_INPUT) + while (unformat_check_input (input) != (uword) UNFORMAT_END_OF_INPUT) { if (unformat (input, "max %d", &max)) - ; + ; else - return clib_error_create ("expected 'max COUNT', got `%U'", - format_unformat_error, input); + return clib_error_create ("expected 'max COUNT', got `%U'", + format_unformat_error, input); } /* Get active traces from pool. */ + /* *INDENT-OFF* */ foreach_vlib_main ( ({ void *mainheap; @@ -301,21 +310,21 @@ cli_show_trace_buffer (vlib_main_t * vm, trace_apply_filter(this_vlib_main); traces = 0; - pool_foreach (h, tm->trace_buffer_pool, + pool_foreach (h, tm->trace_buffer_pool, ({ vec_add1 (traces, h[0]); })); - + if (vec_len (traces) == 0) { clib_mem_set_heap (mainheap); s = format (s, "No packets in trace buffer\n"); goto done; } - + /* Sort them by increasing time. */ vec_sort_with_function (traces, trace_cmp); - + for (i = 0; i < vec_len (traces); i++) { if (i == max) @@ -326,44 +335,47 @@ cli_show_trace_buffer (vlib_main_t * vm, } clib_mem_set_heap (mainheap); - + s = format (s, "Packet %d\n%U\n\n", i + 1, format_vlib_trace, vm, traces[i]); mainheap = clib_mem_set_heap (this_vlib_main->heap_base); } - + done: vec_free (traces); clib_mem_set_heap (mainheap); index++; })); + /* *INDENT-ON* */ vlib_cli_output (vm, (char *) s); vec_free (s); return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (show_trace_cli,static) = { .path = "show trace", .short_help = "Show trace buffer [max COUNT]", .function = cli_show_trace_buffer, }; +/* *INDENT-ON* */ static clib_error_t * cli_add_trace_buffer (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { - vlib_trace_main_t * tm; - vlib_trace_node_t * tn; + vlib_trace_main_t *tm; + vlib_trace_node_t *tn; u32 node_index, add; u8 verbose = 0; - while (unformat_check_input(input) != (uword)UNFORMAT_END_OF_INPUT) + while (unformat_check_input (input) != (uword) UNFORMAT_END_OF_INPUT) { - if (unformat (input, "%U %d", unformat_vlib_node, vm, &node_index, &add)) + if (unformat + (input, "%U %d", unformat_vlib_node, vm, &node_index, &add)) ; else if (unformat (input, "verbose")) verbose = 1; @@ -372,30 +384,29 @@ cli_add_trace_buffer (vlib_main_t * vm, format_unformat_error, input); } - foreach_vlib_main ( - ({ - void *oldheap; - tm = &this_vlib_main->trace_main; - - tm->trace_active_hint = 1; - tm->verbose = verbose; - - oldheap = clib_mem_set_heap (this_vlib_main->heap_base); - - vec_validate (tm->nodes, node_index); - tn = tm->nodes + node_index; - tn->limit += add; - clib_mem_set_heap (oldheap); - })); + foreach_vlib_main (( + { + void *oldheap; + tm = &this_vlib_main->trace_main; + tm->trace_active_hint = 1; + tm->verbose = verbose; + oldheap = + clib_mem_set_heap (this_vlib_main->heap_base); + vec_validate (tm->nodes, node_index); + tn = tm->nodes + node_index; + tn->limit += add; clib_mem_set_heap (oldheap); + })); return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (add_trace_cli,static) = { .path = "trace add", .short_help = "Trace given number of packets", .function = cli_add_trace_buffer, }; +/* *INDENT-ON* */ /* @@ -437,22 +448,22 @@ VLIB_CLI_COMMAND (add_trace_cli,static) = { */ static clib_error_t * cli_filter_trace (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { - vlib_trace_main_t * tm = &vm->trace_main; + vlib_trace_main_t *tm = &vm->trace_main; u32 filter_node_index; u32 filter_flag; u32 filter_count; void *mainheap; if (unformat (input, "include %U %d", - unformat_vlib_node, vm, &filter_node_index, &filter_count)) + unformat_vlib_node, vm, &filter_node_index, &filter_count)) { filter_flag = FILTER_FLAG_INCLUDE; } else if (unformat (input, "exclude %U %d", - unformat_vlib_node, vm, &filter_node_index, &filter_count)) + unformat_vlib_node, vm, &filter_node_index, + &filter_count)) { filter_flag = FILTER_FLAG_EXCLUDE; } @@ -463,11 +474,14 @@ cli_filter_trace (vlib_main_t * vm, filter_count = 0; } else - return clib_error_create ("expected 'include NODE COUNT' or 'exclude NODE COUNT' or 'none', got `%U'", - format_unformat_error, input); + return + clib_error_create + ("expected 'include NODE COUNT' or 'exclude NODE COUNT' or 'none', got `%U'", + format_unformat_error, input); + /* *INDENT-OFF* */ foreach_vlib_main ( - ({ + ({ tm = &this_vlib_main->trace_main; tm->filter_node_index = filter_node_index; tm->filter_flag = filter_flag; @@ -481,30 +495,45 @@ cli_filter_trace (vlib_main_t * vm, vec_free (tm->nodes); clib_mem_set_heap (mainheap); })); + /* *INDENT-ON* */ return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (filter_trace_cli,static) = { .path = "trace filter", .short_help = "filter trace output - include NODE COUNT | exclude NODE COUNT | none", .function = cli_filter_trace, }; +/* *INDENT-ON* */ static clib_error_t * cli_clear_trace_buffer (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { clear_trace_buffer (); return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (clear_trace_cli,static) = { .path = "clear trace", .short_help = "Clear trace buffer and free memory", .function = cli_clear_trace_buffer, }; +/* *INDENT-ON* */ /* Dummy function to get us linked in. */ -void vlib_trace_cli_reference (void) {} +void +vlib_trace_cli_reference (void) +{ +} + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/trace.h b/vlib/vlib/trace.h index 6e9ed495734..fc0fc5c8ed4 100644 --- a/vlib/vlib/trace.h +++ b/vlib/vlib/trace.h @@ -42,7 +42,8 @@ #include <vppinfra/pool.h> -typedef struct { +typedef struct +{ /* CPU time stamp trace was made. */ u64 time; @@ -56,7 +57,8 @@ typedef struct { u8 data[0]; } vlib_trace_header_t; -typedef struct { +typedef struct +{ /* Current number of traces in buffer. */ u32 count; @@ -64,9 +66,10 @@ typedef struct { u32 limit; } vlib_trace_node_t; -typedef struct { +typedef struct +{ /* Pool of trace buffers. */ - vlib_trace_header_t ** trace_buffer_pool; + vlib_trace_header_t **trace_buffer_pool; u32 last_main_loop_count; u32 filter_node_index; @@ -80,10 +83,18 @@ typedef struct { u32 trace_active_hint; /* Per node trace counts. */ - vlib_trace_node_t * nodes; + vlib_trace_node_t *nodes; /* verbosity */ int verbose; } vlib_trace_main_t; #endif /* included_vlib_trace_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/trace_funcs.h b/vlib/vlib/trace_funcs.h index 1da46b41964..5280eae9904 100644 --- a/vlib/vlib/trace_funcs.h +++ b/vlib/vlib/trace_funcs.h @@ -43,22 +43,20 @@ always_inline void vlib_validate_trace (vlib_trace_main_t * tm, vlib_buffer_t * b) { - /* - * this assert seems right, but goes off constantly. + /* + * this assert seems right, but goes off constantly. * disabling it appears to make the pain go away */ ASSERT (1 || b->flags & VLIB_BUFFER_IS_TRACED); - ASSERT (! pool_is_free_index (tm->trace_buffer_pool, b->trace_index)); + ASSERT (!pool_is_free_index (tm->trace_buffer_pool, b->trace_index)); } always_inline void * vlib_add_trace (vlib_main_t * vm, - vlib_node_runtime_t * r, - vlib_buffer_t * b, - u32 n_data_bytes) + vlib_node_runtime_t * r, vlib_buffer_t * b, u32 n_data_bytes) { - vlib_trace_main_t * tm = &vm->trace_main; - vlib_trace_header_t * h; + vlib_trace_main_t *tm = &vm->trace_main; + vlib_trace_header_t *h; u32 n_data_words; vlib_validate_trace (tm, b); @@ -66,8 +64,7 @@ vlib_add_trace (vlib_main_t * vm, n_data_bytes = round_pow2 (n_data_bytes, sizeof (h[0])); n_data_words = n_data_bytes / sizeof (h[0]); vec_add2_aligned (tm->trace_buffer_pool[b->trace_index], h, - 1 + n_data_words, - sizeof (h[0])); + 1 + n_data_words, sizeof (h[0])); h->time = vm->cpu_time_last_node_dispatch; h->n_data = n_data_words; @@ -75,15 +72,17 @@ vlib_add_trace (vlib_main_t * vm, return h->data; } - + always_inline vlib_trace_header_t * vlib_trace_header_next (vlib_trace_header_t * h) -{ return h + 1 + h->n_data; } +{ + return h + 1 + h->n_data; +} always_inline void vlib_free_trace (vlib_main_t * vm, vlib_buffer_t * b) { - vlib_trace_main_t * tm = &vm->trace_main; + vlib_trace_main_t *tm = &vm->trace_main; vlib_validate_trace (tm, b); _vec_len (tm->trace_buffer_pool[b->trace_index]) = 0; pool_put_index (tm->trace_buffer_pool, b->trace_index); @@ -91,10 +90,9 @@ vlib_free_trace (vlib_main_t * vm, vlib_buffer_t * b) always_inline void vlib_trace_next_frame (vlib_main_t * vm, - vlib_node_runtime_t * r, - u32 next_index) + vlib_node_runtime_t * r, u32 next_index) { - vlib_next_frame_t * nf; + vlib_next_frame_t *nf; nf = vlib_node_runtime_get_next_frame (vm, r, next_index); nf->flags |= VLIB_FRAME_TRACE; } @@ -105,12 +103,10 @@ void trace_apply_filter (vlib_main_t * vm); always_inline void vlib_trace_buffer (vlib_main_t * vm, vlib_node_runtime_t * r, - u32 next_index, - vlib_buffer_t * b, - int follow_chain) + u32 next_index, vlib_buffer_t * b, int follow_chain) { - vlib_trace_main_t * tm = &vm->trace_main; - vlib_trace_header_t ** h; + vlib_trace_main_t *tm = &vm->trace_main; + vlib_trace_header_t **h; /* * Apply filter to existing traces to keep number of allocated traces low. @@ -126,16 +122,19 @@ vlib_trace_buffer (vlib_main_t * vm, pool_get (tm->trace_buffer_pool, h); - do { - b->flags |= VLIB_BUFFER_IS_TRACED; - b->trace_index = h - tm->trace_buffer_pool; - } while (follow_chain && (b = vlib_get_next_buffer (vm, b))); + do + { + b->flags |= VLIB_BUFFER_IS_TRACED; + b->trace_index = h - tm->trace_buffer_pool; + } + while (follow_chain && (b = vlib_get_next_buffer (vm, b))); } always_inline void -vlib_buffer_copy_trace_flag (vlib_main_t * vm, vlib_buffer_t * b, u32 bi_target) +vlib_buffer_copy_trace_flag (vlib_main_t * vm, vlib_buffer_t * b, + u32 bi_target) { - vlib_buffer_t * b_target = vlib_get_buffer (vm, bi_target); + vlib_buffer_t *b_target = vlib_get_buffer (vm, bi_target); b_target->flags |= b->flags & VLIB_BUFFER_IS_TRACED; b_target->trace_index = b->trace_index; } @@ -143,8 +142,8 @@ vlib_buffer_copy_trace_flag (vlib_main_t * vm, vlib_buffer_t * b, u32 bi_target) always_inline u32 vlib_get_trace_count (vlib_main_t * vm, vlib_node_runtime_t * rt) { - vlib_trace_main_t * tm = &vm->trace_main; - vlib_trace_node_t * tn; + vlib_trace_main_t *tm = &vm->trace_main; + vlib_trace_node_t *tn; int n; if (rt->node_index >= vec_len (tm->nodes)) @@ -157,11 +156,10 @@ vlib_get_trace_count (vlib_main_t * vm, vlib_node_runtime_t * rt) } always_inline void -vlib_set_trace_count (vlib_main_t * vm, vlib_node_runtime_t * rt, - u32 count) +vlib_set_trace_count (vlib_main_t * vm, vlib_node_runtime_t * rt, u32 count) { - vlib_trace_main_t * tm = &vm->trace_main; - vlib_trace_node_t * tn = vec_elt_at_index (tm->nodes, rt->node_index); + vlib_trace_main_t *tm = &vm->trace_main; + vlib_trace_node_t *tn = vec_elt_at_index (tm->nodes, rt->node_index); ASSERT (count <= tn->limit); tn->count = tn->limit - count; @@ -177,3 +175,11 @@ vlib_trace_frame_buffers_only (vlib_main_t * vm, uword n_buffer_data_bytes_in_trace); #endif /* included_vlib_trace_funcs_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/unix/cj.c b/vlib/vlib/unix/cj.c index 782ddce3099..553b450ffaa 100644 --- a/vlib/vlib/unix/cj.c +++ b/vlib/vlib/unix/cj.c @@ -1,4 +1,4 @@ -/* +/* *------------------------------------------------------------------ * cj.c * @@ -25,65 +25,68 @@ cj_main_t cj_main; void -cj_log (u32 type, void * data0, void * data1) +cj_log (u32 type, void *data0, void *data1) { u64 new_tail; - cj_main_t * cjm = &cj_main; - cj_record_t * r; + cj_main_t *cjm = &cj_main; + cj_record_t *r; if (cjm->enable == 0) return; new_tail = __sync_add_and_fetch (&cjm->tail, 1); - r = (cj_record_t *) &(cjm->records[new_tail & (cjm->num_records - 1)]); + r = (cj_record_t *) & (cjm->records[new_tail & (cjm->num_records - 1)]); r->time = vlib_time_now (cjm->vlib_main); - r->cpu = os_get_cpu_number(); + r->cpu = os_get_cpu_number (); r->type = type; - r->data[0] = pointer_to_uword(data0); - r->data[1] = pointer_to_uword(data1); + r->data[0] = pointer_to_uword (data0); + r->data[1] = pointer_to_uword (data1); } -void cj_stop(void) +void +cj_stop (void) { - cj_main_t * cjm = &cj_main; + cj_main_t *cjm = &cj_main; cjm->enable = 0; } -clib_error_t * cj_init (vlib_main_t * vm) +clib_error_t * +cj_init (vlib_main_t * vm) { - cj_main_t * cjm = &cj_main; + cj_main_t *cjm = &cj_main; cjm->vlib_main = vm; return 0; } + VLIB_INIT_FUNCTION (cj_init); static clib_error_t * cj_config (vlib_main_t * vm, unformat_input_t * input) { - cj_main_t * cjm = &cj_main; + cj_main_t *cjm = &cj_main; int matched = 0; int enable = 0; - while (unformat_check_input(input) != UNFORMAT_END_OF_INPUT) + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { if (unformat (input, "records %d", &cjm->num_records)) - matched = 1; + matched = 1; else if (unformat (input, "on")) - enable = 1; + enable = 1; else - return clib_error_return (0, "cj_config: unknown input '%U'", - format_unformat_error, input); + return clib_error_return (0, "cj_config: unknown input '%U'", + format_unformat_error, input); } if (matched == 0) return 0; cjm->num_records = max_pow2 (cjm->num_records); - vec_validate (cjm->records, cjm->num_records-1); + vec_validate (cjm->records, cjm->num_records - 1); memset (cjm->records, 0xff, cjm->num_records * sizeof (cj_record_t)); cjm->tail = ~0; cjm->enable = enable; @@ -93,112 +96,119 @@ cj_config (vlib_main_t * vm, unformat_input_t * input) VLIB_CONFIG_FUNCTION (cj_config, "cj"); -void cj_enable_disable (int is_enable) +void +cj_enable_disable (int is_enable) { - cj_main_t * cjm = &cj_main; - + cj_main_t *cjm = &cj_main; + if (cjm->num_records) cjm->enable = is_enable; else vlib_cli_output (cjm->vlib_main, "CJ not configured..."); } -static inline void cj_dump_one_record (cj_record_t * r) +static inline void +cj_dump_one_record (cj_record_t * r) { fprintf (stderr, "[%d]: %10.6f T%02d %llx %llx\n", - r->cpu, r->time, r->type, (long long unsigned int) r->data[0], - (long long unsigned int) r->data[1]); + r->cpu, r->time, r->type, (long long unsigned int) r->data[0], + (long long unsigned int) r->data[1]); } -static void cj_dump_internal (u8 filter0_enable, u64 filter0, - u8 filter1_enable, u64 filter1) +static void +cj_dump_internal (u8 filter0_enable, u64 filter0, + u8 filter1_enable, u64 filter1) { - cj_main_t * cjm = &cj_main; - cj_record_t * r; + cj_main_t *cjm = &cj_main; + cj_record_t *r; u32 i, index; - + if (cjm->num_records == 0) { fprintf (stderr, "CJ not configured...\n"); return; } - if (cjm->tail == (u64)~0) + if (cjm->tail == (u64) ~ 0) { fprintf (stderr, "No data collected...\n"); return; } /* Has the trace wrapped? */ - index = (cjm->tail+1) & (cjm->num_records - 1); + index = (cjm->tail + 1) & (cjm->num_records - 1); r = &(cjm->records[index]); - if (r->cpu != (u32)~0) + if (r->cpu != (u32) ~ 0) { - /* Yes, dump from tail + 1 to the end */ + /* Yes, dump from tail + 1 to the end */ for (i = index; i < cjm->num_records; i++) - { - if (filter0_enable && (r->data[0] != filter0)) - goto skip; - if (filter1_enable && (r->data[1] != filter1)) - goto skip; - cj_dump_one_record (r); - skip: - r++; - } + { + if (filter0_enable && (r->data[0] != filter0)) + goto skip; + if (filter1_enable && (r->data[1] != filter1)) + goto skip; + cj_dump_one_record (r); + skip: + r++; + } } /* dump from the beginning through the final tail */ r = cjm->records; for (i = 0; i <= cjm->tail; i++) { if (filter0_enable && (r->data[0] != filter0)) - goto skip2; + goto skip2; if (filter1_enable && (r->data[1] != filter1)) - goto skip2; + goto skip2; cj_dump_one_record (r); skip2: r++; } } -void cj_dump (void) +void +cj_dump (void) { cj_dump_internal (0, 0, 0, 0); } -void cj_dump_filter_data0 (u64 filter0) +void +cj_dump_filter_data0 (u64 filter0) { - cj_dump_internal (1/* enable f0 */, filter0, 0, 0); + cj_dump_internal (1 /* enable f0 */ , filter0, 0, 0); } -void cj_dump_filter_data1 (u64 filter1) +void +cj_dump_filter_data1 (u64 filter1) { - cj_dump_internal (0, 0, 1 /* enable f1 */, filter1); + cj_dump_internal (0, 0, 1 /* enable f1 */ , filter1); } -void cj_dump_filter_data12 (u64 filter0, u64 filter1) +void +cj_dump_filter_data12 (u64 filter0, u64 filter1) { cj_dump_internal (1, filter0, 1, filter1); } static clib_error_t * cj_command_fn (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { int is_enable = -1; int is_dump = -1; - while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { - if (unformat (input, "enable") || unformat (input, "on")) - is_enable = 1; - else if (unformat (input, "disable") || unformat (input, "off")) - is_enable = 0; - else if (unformat (input, "dump")) - is_dump = 1; - else - return clib_error_return (0, "unknown input `%U'", - format_unformat_error, input); + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (input, "enable") || unformat (input, "on")) + is_enable = 1; + else if (unformat (input, "disable") || unformat (input, "off")) + is_enable = 0; + else if (unformat (input, "dump")) + is_dump = 1; + else + return clib_error_return (0, "unknown input `%U'", + format_unformat_error, input); } if (is_enable >= 0) @@ -210,9 +220,19 @@ cj_command_fn (vlib_main_t * vm, return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (cj_command,static) = { .path = "cj", .short_help = "cj", .function = cj_command_fn, }; +/* *INDENT-ON* */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/unix/cj.h b/vlib/vlib/unix/cj.h index 3c37f2bf22f..67626afee2b 100644 --- a/vlib/vlib/unix/cj.h +++ b/vlib/vlib/unix/cj.h @@ -1,4 +1,4 @@ -/* +/* *------------------------------------------------------------------ * cj.h * @@ -20,25 +20,27 @@ #ifndef __included_cj_h__ #define __included_cj_h__ -typedef struct { +typedef struct +{ f64 time; u32 cpu; u32 type; u64 data[2]; } cj_record_t; -typedef struct { +typedef struct +{ volatile u64 tail; - cj_record_t * records; + cj_record_t *records; u32 num_records; volatile u32 enable; - - vlib_main_t * vlib_main; + + vlib_main_t *vlib_main; } cj_main_t; -void cj_log (u32 type, void * data0, void * data1); +void cj_log (u32 type, void *data0, void *data1); -/* +/* * Supply in application main, so we can log from any library... * Declare a weak reference in the library, off you go. */ @@ -60,9 +62,18 @@ cj_global_log (unsigned type, void * data0, void * data1) \ } #define CJ_GLOBAL_LOG_PROTOTYPE -void cj_global_log (unsigned type, void * data0, void * data1) \ - __attribute__ ((weak)); \ +void +cj_global_log (unsigned type, void *data0, void *data1) +__attribute__ ((weak)); -void cj_stop(void); +void cj_stop (void); #endif /* __included_cj_h__ */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/unix/cli.c b/vlib/vlib/unix/cli.c index 5136da516fc..58aa6dfc6bf 100644 --- a/vlib/vlib/unix/cli.c +++ b/vlib/vlib/unix/cli.c @@ -92,32 +92,36 @@ /** A CLI banner line. */ -typedef struct { - u8 * line; /**< The line to print. */ - u32 length; /**< The length of the line without terminating NUL. */ +typedef struct +{ + u8 *line; /**< The line to print. */ + u32 length; /**< The length of the line without terminating NUL. */ } unix_cli_banner_t; #define _(a) { .line = (u8 *)(a), .length = sizeof(a) - 1 } /** Plain welcome banner. */ static unix_cli_banner_t unix_cli_banner[] = { -_(" _______ _ _ _____ ___ \n"), -_(" __/ __/ _ \\ (_)__ | | / / _ \\/ _ \\\n"), -_(" _/ _// // / / / _ \\ | |/ / ___/ ___/\n"), -_(" /_/ /____(_)_/\\___/ |___/_/ /_/ \n"), -_("\n") + _(" _______ _ _ _____ ___ \n"), + _(" __/ __/ _ \\ (_)__ | | / / _ \\/ _ \\\n"), + _(" _/ _// // / / / _ \\ | |/ / ___/ ___/\n"), + _(" /_/ /____(_)_/\\___/ |___/_/ /_/ \n"), + _("\n") }; + /** ANSI color welcome banner. */ static unix_cli_banner_t unix_cli_banner_color[] = { -_(ANSI_BRED " _______ _ " ANSI_RESET " _ _____ ___ \n"), -_(ANSI_BRED " __/ __/ _ \\ (_)__ " ANSI_RESET " | | / / _ \\/ _ \\\n"), -_(ANSI_BRED " _/ _// // / / / _ \\" ANSI_RESET " | |/ / ___/ ___/\n"), -_(ANSI_BRED " /_/ /____(_)_/\\___/" ANSI_RESET " |___/_/ /_/ \n"), -_("\n") + _(ANSI_BRED " _______ _ " ANSI_RESET " _ _____ ___ \n"), + _(ANSI_BRED " __/ __/ _ \\ (_)__ " ANSI_RESET " | | / / _ \\/ _ \\\n"), + _(ANSI_BRED " _/ _// // / / / _ \\" ANSI_RESET " | |/ / ___/ ___/\n"), + _(ANSI_BRED " /_/ /____(_)_/\\___/" ANSI_RESET " |___/_/ /_/ \n"), + _("\n") }; + #undef _ /** Pager line index */ -typedef struct { +typedef struct +{ /** Index into pager_vector */ u32 line; @@ -130,20 +134,21 @@ typedef struct { /** Unix CLI session. */ -typedef struct { +typedef struct +{ /** The file index held by unix.c */ u32 unix_file_index; /** Vector of output pending write to file descriptor. */ - u8 * output_vector; + u8 *output_vector; /** Vector of input saved by Unix input node to be processed by CLI process. */ - u8 * input_vector; + u8 *input_vector; u8 has_history; - u8 ** command_history; - u8 * current_command; + u8 **command_history; + u8 *current_command; i32 excursion; /** Maximum number of history entries this session will store. */ @@ -152,7 +157,7 @@ typedef struct { /** Current command line counter */ u32 command_number; - u8 * search_key; + u8 *search_key; int search_mode; /** Position of the insert cursor on the current input line */ @@ -174,10 +179,10 @@ typedef struct { u8 no_pager; /** Pager buffer */ - u8 ** pager_vector; + u8 **pager_vector; /** Index of line fragments in the pager buffer */ - unix_cli_pager_index_t * pager_index; + unix_cli_pager_index_t *pager_index; /** Line number of top of page */ u32 pager_start; @@ -196,9 +201,9 @@ typedef struct { * @param f The CLI session whose pager needs to be reset. */ always_inline void -unix_cli_pager_reset (unix_cli_file_t *f) +unix_cli_pager_reset (unix_cli_file_t * f) { - u8 ** p; + u8 **p; f->pager_start = 0; @@ -206,9 +211,9 @@ unix_cli_pager_reset (unix_cli_file_t *f) f->pager_index = 0; vec_foreach (p, f->pager_vector) - { - vec_free (*p); - } + { + vec_free (*p); + } vec_free (f->pager_vector); f->pager_vector = 0; } @@ -225,14 +230,15 @@ unix_cli_file_free (unix_cli_file_t * f) } /** CLI actions */ -typedef enum { +typedef enum +{ UNIX_CLI_PARSE_ACTION_NOACTION = 0, /**< No action */ - UNIX_CLI_PARSE_ACTION_CRLF, /**< Carriage return, newline or enter */ - UNIX_CLI_PARSE_ACTION_TAB, /**< Tab key */ - UNIX_CLI_PARSE_ACTION_ERASE, /**< Erase cursor left */ + UNIX_CLI_PARSE_ACTION_CRLF, /**< Carriage return, newline or enter */ + UNIX_CLI_PARSE_ACTION_TAB, /**< Tab key */ + UNIX_CLI_PARSE_ACTION_ERASE, /**< Erase cursor left */ UNIX_CLI_PARSE_ACTION_ERASERIGHT, /**< Erase cursor right */ - UNIX_CLI_PARSE_ACTION_UP, /**< Up arrow */ - UNIX_CLI_PARSE_ACTION_DOWN, /**< Down arrow */ + UNIX_CLI_PARSE_ACTION_UP, /**< Up arrow */ + UNIX_CLI_PARSE_ACTION_DOWN, /**< Down arrow */ UNIX_CLI_PARSE_ACTION_LEFT, UNIX_CLI_PARSE_ACTION_RIGHT, UNIX_CLI_PARSE_ACTION_HOME, @@ -267,9 +273,10 @@ typedef enum { * @note This won't work as a hash since we need to be able to do * partial matches on the string. */ -typedef struct { - u8 *input; /**< Input string to match. */ - u32 len; /**< Length of input without final NUL. */ +typedef struct +{ + u8 *input; /**< Input string to match. */ + u32 len; /**< Length of input without final NUL. */ unix_cli_parse_action_t action; /**< Action to take when matched. */ } unix_cli_parse_actions_t; @@ -290,61 +297,61 @@ typedef struct { * @showinitializer */ static unix_cli_parse_actions_t unix_cli_parse_strings[] = { - /* Line handling */ - _( "\r\n", UNIX_CLI_PARSE_ACTION_CRLF ), /* Must be before '\r' */ - _( "\n", UNIX_CLI_PARSE_ACTION_CRLF ), - _( "\r\0", UNIX_CLI_PARSE_ACTION_CRLF ), /* Telnet does this */ - _( "\r", UNIX_CLI_PARSE_ACTION_CRLF ), - - /* Unix shell control codes */ - _( CTL('B'), UNIX_CLI_PARSE_ACTION_LEFT ), - _( CTL('F'), UNIX_CLI_PARSE_ACTION_RIGHT ), - _( CTL('P'), UNIX_CLI_PARSE_ACTION_UP ), - _( CTL('N'), UNIX_CLI_PARSE_ACTION_DOWN ), - _( CTL('A'), UNIX_CLI_PARSE_ACTION_HOME ), - _( CTL('E'), UNIX_CLI_PARSE_ACTION_END ), - _( CTL('D'), UNIX_CLI_PARSE_ACTION_ERASERIGHT ), - _( CTL('U'), UNIX_CLI_PARSE_ACTION_ERASELINELEFT ), - _( CTL('K'), UNIX_CLI_PARSE_ACTION_ERASELINERIGHT ), - _( CTL('Y'), UNIX_CLI_PARSE_ACTION_YANK ), - _( CTL('L'), UNIX_CLI_PARSE_ACTION_CLEAR ), - _( ESC "b", UNIX_CLI_PARSE_ACTION_WORDLEFT ), /* Alt-B */ - _( ESC "f", UNIX_CLI_PARSE_ACTION_WORDRIGHT ), /* Alt-F */ - _( "\b", UNIX_CLI_PARSE_ACTION_ERASE ), /* ^H */ - _( "\x7f", UNIX_CLI_PARSE_ACTION_ERASE ), /* Backspace */ - _( "\t", UNIX_CLI_PARSE_ACTION_TAB ), /* ^I */ - - /* VT100 Normal mode - Broadest support */ - _( CSI "A", UNIX_CLI_PARSE_ACTION_UP ), - _( CSI "B", UNIX_CLI_PARSE_ACTION_DOWN ), - _( CSI "C", UNIX_CLI_PARSE_ACTION_RIGHT ), - _( CSI "D", UNIX_CLI_PARSE_ACTION_LEFT ), - _( CSI "H", UNIX_CLI_PARSE_ACTION_HOME ), - _( CSI "F", UNIX_CLI_PARSE_ACTION_END ), - _( CSI "3~", UNIX_CLI_PARSE_ACTION_ERASERIGHT ), /* Delete */ - _( CSI "1;5D", UNIX_CLI_PARSE_ACTION_WORDLEFT ), /* C-Left */ - _( CSI "1;5C", UNIX_CLI_PARSE_ACTION_WORDRIGHT ),/* C-Right */ + /* Line handling */ + _("\r\n", UNIX_CLI_PARSE_ACTION_CRLF), /* Must be before '\r' */ + _("\n", UNIX_CLI_PARSE_ACTION_CRLF), + _("\r\0", UNIX_CLI_PARSE_ACTION_CRLF), /* Telnet does this */ + _("\r", UNIX_CLI_PARSE_ACTION_CRLF), + + /* Unix shell control codes */ + _(CTL ('B'), UNIX_CLI_PARSE_ACTION_LEFT), + _(CTL ('F'), UNIX_CLI_PARSE_ACTION_RIGHT), + _(CTL ('P'), UNIX_CLI_PARSE_ACTION_UP), + _(CTL ('N'), UNIX_CLI_PARSE_ACTION_DOWN), + _(CTL ('A'), UNIX_CLI_PARSE_ACTION_HOME), + _(CTL ('E'), UNIX_CLI_PARSE_ACTION_END), + _(CTL ('D'), UNIX_CLI_PARSE_ACTION_ERASERIGHT), + _(CTL ('U'), UNIX_CLI_PARSE_ACTION_ERASELINELEFT), + _(CTL ('K'), UNIX_CLI_PARSE_ACTION_ERASELINERIGHT), + _(CTL ('Y'), UNIX_CLI_PARSE_ACTION_YANK), + _(CTL ('L'), UNIX_CLI_PARSE_ACTION_CLEAR), + _(ESC "b", UNIX_CLI_PARSE_ACTION_WORDLEFT), /* Alt-B */ + _(ESC "f", UNIX_CLI_PARSE_ACTION_WORDRIGHT), /* Alt-F */ + _("\b", UNIX_CLI_PARSE_ACTION_ERASE), /* ^H */ + _("\x7f", UNIX_CLI_PARSE_ACTION_ERASE), /* Backspace */ + _("\t", UNIX_CLI_PARSE_ACTION_TAB), /* ^I */ + + /* VT100 Normal mode - Broadest support */ + _(CSI "A", UNIX_CLI_PARSE_ACTION_UP), + _(CSI "B", UNIX_CLI_PARSE_ACTION_DOWN), + _(CSI "C", UNIX_CLI_PARSE_ACTION_RIGHT), + _(CSI "D", UNIX_CLI_PARSE_ACTION_LEFT), + _(CSI "H", UNIX_CLI_PARSE_ACTION_HOME), + _(CSI "F", UNIX_CLI_PARSE_ACTION_END), + _(CSI "3~", UNIX_CLI_PARSE_ACTION_ERASERIGHT), /* Delete */ + _(CSI "1;5D", UNIX_CLI_PARSE_ACTION_WORDLEFT), /* C-Left */ + _(CSI "1;5C", UNIX_CLI_PARSE_ACTION_WORDRIGHT), /* C-Right */ /* VT100 Application mode - Some Gnome Terminal functions use these */ - _( ESC "OA", UNIX_CLI_PARSE_ACTION_UP ), - _( ESC "OB", UNIX_CLI_PARSE_ACTION_DOWN ), - _( ESC "OC", UNIX_CLI_PARSE_ACTION_RIGHT ), - _( ESC "OD", UNIX_CLI_PARSE_ACTION_LEFT ), - _( ESC "OH", UNIX_CLI_PARSE_ACTION_HOME ), - _( ESC "OF", UNIX_CLI_PARSE_ACTION_END ), - - /* ANSI X3.41-1974 - sent by Microsoft Telnet and PuTTY */ - _( CSI "1~", UNIX_CLI_PARSE_ACTION_HOME ), - _( CSI "4~", UNIX_CLI_PARSE_ACTION_END ), - - /* Emacs-ish history search */ - _( CTL('S'), UNIX_CLI_PARSE_ACTION_FWDSEARCH ), - _( CTL('R'), UNIX_CLI_PARSE_ACTION_REVSEARCH ), - - /* Other protocol things */ - _( "\xff", UNIX_CLI_PARSE_ACTION_TELNETIAC ), /* IAC */ - _( "\0", UNIX_CLI_PARSE_ACTION_NOACTION ), /* NUL */ - _( NULL, UNIX_CLI_PARSE_ACTION_NOMATCH ) + _(ESC "OA", UNIX_CLI_PARSE_ACTION_UP), + _(ESC "OB", UNIX_CLI_PARSE_ACTION_DOWN), + _(ESC "OC", UNIX_CLI_PARSE_ACTION_RIGHT), + _(ESC "OD", UNIX_CLI_PARSE_ACTION_LEFT), + _(ESC "OH", UNIX_CLI_PARSE_ACTION_HOME), + _(ESC "OF", UNIX_CLI_PARSE_ACTION_END), + + /* ANSI X3.41-1974 - sent by Microsoft Telnet and PuTTY */ + _(CSI "1~", UNIX_CLI_PARSE_ACTION_HOME), + _(CSI "4~", UNIX_CLI_PARSE_ACTION_END), + + /* Emacs-ish history search */ + _(CTL ('S'), UNIX_CLI_PARSE_ACTION_FWDSEARCH), + _(CTL ('R'), UNIX_CLI_PARSE_ACTION_REVSEARCH), + + /* Other protocol things */ + _("\xff", UNIX_CLI_PARSE_ACTION_TELNETIAC), /* IAC */ + _("\0", UNIX_CLI_PARSE_ACTION_NOACTION), /* NUL */ + _(NULL, UNIX_CLI_PARSE_ACTION_NOMATCH) }; /** @@ -352,60 +359,63 @@ static unix_cli_parse_actions_t unix_cli_parse_strings[] = { * @showinitializer */ static unix_cli_parse_actions_t unix_cli_parse_pager[] = { - /* Line handling */ - _( "\r\n", UNIX_CLI_PARSE_ACTION_PAGER_CRLF ), /* Must be before '\r' */ - _( "\n", UNIX_CLI_PARSE_ACTION_PAGER_CRLF ), - _( "\r\0", UNIX_CLI_PARSE_ACTION_PAGER_CRLF ), /* Telnet does this */ - _( "\r", UNIX_CLI_PARSE_ACTION_PAGER_CRLF ), - - /* Pager commands */ - _( " ", UNIX_CLI_PARSE_ACTION_PAGER_NEXT ), - _( "q", UNIX_CLI_PARSE_ACTION_PAGER_QUIT ), - _( CTL('L'), UNIX_CLI_PARSE_ACTION_PAGER_REDRAW ), - _( CTL('R'), UNIX_CLI_PARSE_ACTION_PAGER_REDRAW ), - _( "/", UNIX_CLI_PARSE_ACTION_PAGER_SEARCH ), - - /* VT100 */ - _( CSI "A", UNIX_CLI_PARSE_ACTION_PAGER_UP ), - _( CSI "B", UNIX_CLI_PARSE_ACTION_PAGER_DN ), - _( CSI "H", UNIX_CLI_PARSE_ACTION_PAGER_TOP ), - _( CSI "F", UNIX_CLI_PARSE_ACTION_PAGER_BOTTOM ), - - /* VT100 Application mode */ - _( ESC "OA", UNIX_CLI_PARSE_ACTION_PAGER_UP ), - _( ESC "OB", UNIX_CLI_PARSE_ACTION_PAGER_DN ), - _( ESC "OH", UNIX_CLI_PARSE_ACTION_PAGER_TOP ), - _( ESC "OF", UNIX_CLI_PARSE_ACTION_PAGER_BOTTOM ), - - /* ANSI X3.41-1974 */ - _( CSI "1~", UNIX_CLI_PARSE_ACTION_PAGER_TOP ), - _( CSI "4~", UNIX_CLI_PARSE_ACTION_PAGER_BOTTOM ), - _( CSI "5~", UNIX_CLI_PARSE_ACTION_PAGER_PGUP ), - _( CSI "6~", UNIX_CLI_PARSE_ACTION_PAGER_PGDN ), - - /* Other protocol things */ - _( "\xff", UNIX_CLI_PARSE_ACTION_TELNETIAC ), /* IAC */ - _( "\0", UNIX_CLI_PARSE_ACTION_NOACTION ), /* NUL */ - _( NULL, UNIX_CLI_PARSE_ACTION_NOMATCH ) + /* Line handling */ + _("\r\n", UNIX_CLI_PARSE_ACTION_PAGER_CRLF), /* Must be before '\r' */ + _("\n", UNIX_CLI_PARSE_ACTION_PAGER_CRLF), + _("\r\0", UNIX_CLI_PARSE_ACTION_PAGER_CRLF), /* Telnet does this */ + _("\r", UNIX_CLI_PARSE_ACTION_PAGER_CRLF), + + /* Pager commands */ + _(" ", UNIX_CLI_PARSE_ACTION_PAGER_NEXT), + _("q", UNIX_CLI_PARSE_ACTION_PAGER_QUIT), + _(CTL ('L'), UNIX_CLI_PARSE_ACTION_PAGER_REDRAW), + _(CTL ('R'), UNIX_CLI_PARSE_ACTION_PAGER_REDRAW), + _("/", UNIX_CLI_PARSE_ACTION_PAGER_SEARCH), + + /* VT100 */ + _(CSI "A", UNIX_CLI_PARSE_ACTION_PAGER_UP), + _(CSI "B", UNIX_CLI_PARSE_ACTION_PAGER_DN), + _(CSI "H", UNIX_CLI_PARSE_ACTION_PAGER_TOP), + _(CSI "F", UNIX_CLI_PARSE_ACTION_PAGER_BOTTOM), + + /* VT100 Application mode */ + _(ESC "OA", UNIX_CLI_PARSE_ACTION_PAGER_UP), + _(ESC "OB", UNIX_CLI_PARSE_ACTION_PAGER_DN), + _(ESC "OH", UNIX_CLI_PARSE_ACTION_PAGER_TOP), + _(ESC "OF", UNIX_CLI_PARSE_ACTION_PAGER_BOTTOM), + + /* ANSI X3.41-1974 */ + _(CSI "1~", UNIX_CLI_PARSE_ACTION_PAGER_TOP), + _(CSI "4~", UNIX_CLI_PARSE_ACTION_PAGER_BOTTOM), + _(CSI "5~", UNIX_CLI_PARSE_ACTION_PAGER_PGUP), + _(CSI "6~", UNIX_CLI_PARSE_ACTION_PAGER_PGDN), + + /* Other protocol things */ + _("\xff", UNIX_CLI_PARSE_ACTION_TELNETIAC), /* IAC */ + _("\0", UNIX_CLI_PARSE_ACTION_NOACTION), /* NUL */ + _(NULL, UNIX_CLI_PARSE_ACTION_NOMATCH) }; + #undef _ /** CLI session events. */ -typedef enum { +typedef enum +{ UNIX_CLI_PROCESS_EVENT_READ_READY, /**< A file descriptor has data to be read. */ - UNIX_CLI_PROCESS_EVENT_QUIT, /**< A CLI session wants to close. */ + UNIX_CLI_PROCESS_EVENT_QUIT, /**< A CLI session wants to close. */ } unix_cli_process_event_type_t; /** CLI global state. */ -typedef struct { +typedef struct +{ /** Prompt string for CLI. */ - u8 * cli_prompt; + u8 *cli_prompt; /** Vec pool of CLI sessions. */ - unix_cli_file_t * cli_file_pool; + unix_cli_file_t *cli_file_pool; /** Vec pool of unused session indices. */ - u32 * unused_cli_process_node_indices; + u32 *unused_cli_process_node_indices; /** The session index of the stdin cli */ u32 stdin_cli_file_index; @@ -441,72 +451,69 @@ static unix_cli_main_t unix_cli_main; * match at all. */ static unix_cli_parse_action_t -unix_cli_match_action(unix_cli_parse_actions_t *a, - u8 *input, u32 ilen, i32 *matched) +unix_cli_match_action (unix_cli_parse_actions_t * a, + u8 * input, u32 ilen, i32 * matched) { u8 partial = 0; while (a->input) { - if (ilen >= a->len) - { - /* see if the start of the input buffer exactly matches the current - * action string. */ - if (memcmp(input, a->input, a->len) == 0) - { - *matched = a->len; - return a->action; - } - } - else - { - /* if the first ilen characters match, flag this as a partial - - * meaning keep collecting bytes in case of a future match */ - if (memcmp(input, a->input, ilen) == 0) - partial = 1; - } - - /* check next action */ - a ++; + if (ilen >= a->len) + { + /* see if the start of the input buffer exactly matches the current + * action string. */ + if (memcmp (input, a->input, a->len) == 0) + { + *matched = a->len; + return a->action; + } + } + else + { + /* if the first ilen characters match, flag this as a partial - + * meaning keep collecting bytes in case of a future match */ + if (memcmp (input, a->input, ilen) == 0) + partial = 1; + } + + /* check next action */ + a++; } return partial ? - UNIX_CLI_PARSE_ACTION_PARTIALMATCH : - UNIX_CLI_PARSE_ACTION_NOMATCH; + UNIX_CLI_PARSE_ACTION_PARTIALMATCH : UNIX_CLI_PARSE_ACTION_NOMATCH; } static void unix_cli_add_pending_output (unix_file_t * uf, unix_cli_file_t * cf, - u8 * buffer, - uword buffer_bytes) + u8 * buffer, uword buffer_bytes) { - unix_main_t * um = &unix_main; + unix_main_t *um = &unix_main; vec_add (cf->output_vector, buffer, buffer_bytes); if (vec_len (cf->output_vector) > 0) { int skip_update = 0 != (uf->flags & UNIX_FILE_DATA_AVAILABLE_TO_WRITE); uf->flags |= UNIX_FILE_DATA_AVAILABLE_TO_WRITE; - if (! skip_update) + if (!skip_update) um->file_update (uf, UNIX_FILE_UPDATE_MODIFY); } } static void unix_cli_del_pending_output (unix_file_t * uf, - unix_cli_file_t * cf, - uword n_bytes) + unix_cli_file_t * cf, uword n_bytes) { - unix_main_t * um = &unix_main; + unix_main_t *um = &unix_main; vec_delete (cf->output_vector, n_bytes, 0); if (vec_len (cf->output_vector) <= 0) { int skip_update = 0 == (uf->flags & UNIX_FILE_DATA_AVAILABLE_TO_WRITE); uf->flags &= ~UNIX_FILE_DATA_AVAILABLE_TO_WRITE; - if (! skip_update) + if (!skip_update) um->file_update (uf, UNIX_FILE_UPDATE_MODIFY); } } @@ -525,15 +532,16 @@ unix_cli_del_pending_output (unix_file_t * uf, * @return The index of the first occurence of \c chr. If \c chr is not * found then \c len instead. */ -always_inline word unix_vlib_findchr(u8 chr, u8 *str, word len) +always_inline word +unix_vlib_findchr (u8 chr, u8 * str, word len) { - word i = 0; - for (i = 0; i < len; i++, str++) - { - if (*str == chr) - return i; - } - return len; + word i = 0; + for (i = 0; i < len; i++, str++) + { + if (*str == chr) + return i; + } + return len; } /** \brief Send a buffer to the CLI stream if possible, enqueue it otherwise. @@ -551,15 +559,14 @@ always_inline word unix_vlib_findchr(u8 chr, u8 *str, word len) * @param buffer Pointer to the buffer that needs to be written. * @param buffer_bytes The number of bytes from \c buffer to write. */ -static void unix_vlib_cli_output_raw(unix_cli_file_t * cf, - unix_file_t * uf, - u8 * buffer, - uword buffer_bytes) +static void +unix_vlib_cli_output_raw (unix_cli_file_t * cf, + unix_file_t * uf, u8 * buffer, uword buffer_bytes) { int n = 0; if (vec_len (cf->output_vector) == 0) - n = write (uf->file_descriptor, buffer, buffer_bytes); + n = write (uf->file_descriptor, buffer, buffer_bytes); if (n < 0 && errno != EAGAIN) { @@ -569,7 +576,8 @@ static void unix_vlib_cli_output_raw(unix_cli_file_t * cf, { /* We got EAGAIN or we already have stuff in the buffer; * queue up whatever didn't get sent for later. */ - if (n < 0) n = 0; + if (n < 0) + n = 0; unix_cli_add_pending_output (uf, cf, buffer + n, buffer_bytes - n); } } @@ -581,130 +589,134 @@ static void unix_vlib_cli_output_raw(unix_cli_file_t * cf, * @param buffer Pointer to the buffer that needs to be written. * @param buffer_bytes The number of bytes from \c buffer to write. */ -static void unix_vlib_cli_output_cooked(unix_cli_file_t * cf, - unix_file_t * uf, - u8 * buffer, - uword buffer_bytes) +static void +unix_vlib_cli_output_cooked (unix_cli_file_t * cf, + unix_file_t * uf, + u8 * buffer, uword buffer_bytes) { word end = 0, start = 0; while (end < buffer_bytes) { if (cf->crlf_mode) - { - /* iterate the line on \n's so we can insert a \r before it */ - end = unix_vlib_findchr('\n', - buffer + start, - buffer_bytes - start) + start; - } + { + /* iterate the line on \n's so we can insert a \r before it */ + end = unix_vlib_findchr ('\n', + buffer + start, + buffer_bytes - start) + start; + } else - { - /* otherwise just send the whole buffer */ - end = buffer_bytes; - } + { + /* otherwise just send the whole buffer */ + end = buffer_bytes; + } - unix_vlib_cli_output_raw(cf, uf, buffer + start, end - start); + unix_vlib_cli_output_raw (cf, uf, buffer + start, end - start); if (cf->crlf_mode) - { - if (end < buffer_bytes) - { - unix_vlib_cli_output_raw(cf, uf, (u8 *)"\r\n", 2); - end ++; /* skip the \n that we already sent */ - } - start = end; - } + { + if (end < buffer_bytes) + { + unix_vlib_cli_output_raw (cf, uf, (u8 *) "\r\n", 2); + end++; /* skip the \n that we already sent */ + } + start = end; + } } } /** \brief Output the CLI prompt */ -static void unix_cli_cli_prompt(unix_cli_file_t * cf, unix_file_t * uf) +static void +unix_cli_cli_prompt (unix_cli_file_t * cf, unix_file_t * uf) { - unix_cli_main_t * cm = &unix_cli_main; + unix_cli_main_t *cm = &unix_cli_main; unix_vlib_cli_output_raw (cf, uf, cm->cli_prompt, vec_len (cm->cli_prompt)); } /** \brief Output a pager prompt and show number of buffered lines */ -static void unix_cli_pager_prompt(unix_cli_file_t * cf, unix_file_t * uf) +static void +unix_cli_pager_prompt (unix_cli_file_t * cf, unix_file_t * uf) { - u8 * prompt; + u8 *prompt; u32 h; h = cf->pager_start + (cf->height - 1); if (h > vec_len (cf->pager_index)) h = vec_len (cf->pager_index); - prompt = format(0, "\r%s-- more -- (%d-%d/%d)%s", - cf->ansi_capable ? ANSI_BOLD : "", - cf->pager_start + 1, - h, - vec_len (cf->pager_index), - cf->ansi_capable ? ANSI_RESET: ""); + prompt = format (0, "\r%s-- more -- (%d-%d/%d)%s", + cf->ansi_capable ? ANSI_BOLD : "", + cf->pager_start + 1, + h, + vec_len (cf->pager_index), + cf->ansi_capable ? ANSI_RESET : ""); - unix_vlib_cli_output_cooked(cf, uf, prompt, vec_len(prompt)); + unix_vlib_cli_output_cooked (cf, uf, prompt, vec_len (prompt)); - vec_free(prompt); + vec_free (prompt); } /** \brief Output a pager "skipping" message */ -static void unix_cli_pager_message(unix_cli_file_t * cf, unix_file_t * uf, - char *message, char *postfix) +static void +unix_cli_pager_message (unix_cli_file_t * cf, unix_file_t * uf, + char *message, char *postfix) { - u8 * prompt; + u8 *prompt; - prompt = format(0, "\r%s-- %s --%s%s", - cf->ansi_capable ? ANSI_BOLD : "", - message, - cf->ansi_capable ? ANSI_RESET: "", - postfix); + prompt = format (0, "\r%s-- %s --%s%s", + cf->ansi_capable ? ANSI_BOLD : "", + message, cf->ansi_capable ? ANSI_RESET : "", postfix); - unix_vlib_cli_output_cooked(cf, uf, prompt, vec_len(prompt)); + unix_vlib_cli_output_cooked (cf, uf, prompt, vec_len (prompt)); - vec_free(prompt); + vec_free (prompt); } /** \brief Erase the printed pager prompt */ -static void unix_cli_pager_prompt_erase(unix_cli_file_t * cf, unix_file_t * uf) +static void +unix_cli_pager_prompt_erase (unix_cli_file_t * cf, unix_file_t * uf) { if (cf->ansi_capable) { - unix_vlib_cli_output_cooked(cf, uf, (u8 *)"\r", 1); - unix_vlib_cli_output_cooked(cf, uf, - (u8 *)ANSI_CLEARLINE, sizeof(ANSI_CLEARLINE) - 1); + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\r", 1); + unix_vlib_cli_output_cooked (cf, uf, + (u8 *) ANSI_CLEARLINE, + sizeof (ANSI_CLEARLINE) - 1); } else { int i; - unix_vlib_cli_output_cooked(cf, uf, (u8 *)"\r", 1); - for (i = 0; i < cf->width - 1; i ++) - unix_vlib_cli_output_cooked(cf, uf, (u8 *)" ", 1); - unix_vlib_cli_output_cooked(cf, uf, (u8 *)"\r", 1); + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\r", 1); + for (i = 0; i < cf->width - 1; i++) + unix_vlib_cli_output_cooked (cf, uf, (u8 *) " ", 1); + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\r", 1); } } /** \brief Uses an ANSI escape sequence to move the cursor */ -static void unix_cli_ansi_cursor(unix_cli_file_t * cf, unix_file_t * uf, - u16 x, u16 y) +static void +unix_cli_ansi_cursor (unix_cli_file_t * cf, unix_file_t * uf, u16 x, u16 y) { - u8 * str; + u8 *str; - str = format(0, "%s%d;%dH", CSI, y, x); + str = format (0, "%s%d;%dH", CSI, y, x); - unix_vlib_cli_output_cooked(cf, uf, str, vec_len(str)); + unix_vlib_cli_output_cooked (cf, uf, str, vec_len (str)); - vec_free(str); + vec_free (str); } /** Redraw the currently displayed page of text. * @param cf CLI session to redraw the pager buffer of. * @param uf Unix file of the CLI session. */ -static void unix_cli_pager_redraw(unix_cli_file_t * cf, unix_file_t * uf) +static void +unix_cli_pager_redraw (unix_cli_file_t * cf, unix_file_t * uf) { - unix_cli_pager_index_t * pi = NULL; - u8 * line = NULL; + unix_cli_pager_index_t *pi = NULL; + u8 *line = NULL; word i; /* No active pager? Do nothing. */ @@ -715,7 +727,8 @@ static void unix_cli_pager_redraw(unix_cli_file_t * cf, unix_file_t * uf) { /* If we have ANSI, send the clear screen sequence */ unix_vlib_cli_output_cooked (cf, uf, - (u8 *)ANSI_CLEAR, sizeof(ANSI_CLEAR) - 1); + (u8 *) ANSI_CLEAR, + sizeof (ANSI_CLEAR) - 1); } else { @@ -725,8 +738,7 @@ static void unix_cli_pager_redraw(unix_cli_file_t * cf, unix_file_t * uf) /* (Re-)send the current page of content */ for (i = 0; i < cf->height - 1 && - i + cf->pager_start < vec_len (cf->pager_index); - i ++) + i + cf->pager_start < vec_len (cf->pager_index); i++) { pi = &cf->pager_index[cf->pager_start + i]; line = cf->pager_vector[pi->line] + pi->offset; @@ -735,7 +747,7 @@ static void unix_cli_pager_redraw(unix_cli_file_t * cf, unix_file_t * uf) } /* if the last line didn't end in newline, add a newline */ if (pi && line[pi->length - 1] != '\n') - unix_vlib_cli_output_cooked (cf, uf, (u8 *)"\n", 1); + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\n", 1); unix_cli_pager_prompt (cf, uf); } @@ -761,15 +773,14 @@ static void unix_cli_pager_redraw(unix_cli_file_t * cf, unix_file_t * uf) * value provides the index in the pager buffer of an * existing string to be indexed. */ -static void unix_cli_pager_add_line (unix_cli_file_t * cf, - u8 * line, - word len_or_index) +static void +unix_cli_pager_add_line (unix_cli_file_t * cf, u8 * line, word len_or_index) { - u8 * p; + u8 *p; word i, j, k; word line_index, len; u32 width = cf->width; - unix_cli_pager_index_t * pi; + unix_cli_pager_index_t *pi; if (line == NULL) { @@ -795,10 +806,10 @@ static void unix_cli_pager_add_line (unix_cli_file_t * cf, { /* Find the next line, or run to terminal width, or run to EOL */ int l = len - i; - j = unix_vlib_findchr((u8)'\n', p, l < width ? l : width); + j = unix_vlib_findchr ((u8) '\n', p, l < width ? l : width); - if (j < l && p[j] == '\n') /* incl \n */ - j ++; + if (j < l && p[j] == '\n') /* incl \n */ + j++; /* Add the line to the index */ k = vec_len (cf->pager_index); @@ -823,10 +834,11 @@ static void unix_cli_pager_add_line (unix_cli_file_t * cf, * * @param cf The CLI session whose pager buffer should be reindexed. */ -static void unix_cli_pager_reindex (unix_cli_file_t * cf) +static void +unix_cli_pager_reindex (unix_cli_file_t * cf) { word i, old_line, old_offset; - unix_cli_pager_index_t * pi; + unix_cli_pager_index_t *pi; /* If there is nothing in the pager buffer then make sure the index * is empty and move on. @@ -846,25 +858,24 @@ static void unix_cli_pager_reindex (unix_cli_file_t * cf) /* Re-add the buffered lines to the index */ vec_reset_length (cf->pager_index); - vec_foreach_index(i, cf->pager_vector) - { - unix_cli_pager_add_line(cf, NULL, i); - } + vec_foreach_index (i, cf->pager_vector) + { + unix_cli_pager_add_line (cf, NULL, i); + } /* Attempt to re-locate the previously stored page start line */ - vec_foreach_index(i, cf->pager_index) - { - pi = &cf->pager_index[i]; - - if (pi->line == old_line && - (pi->offset <= old_offset || - pi->offset + pi->length > old_offset)) - { - /* Found it! */ - cf->pager_start = i; - break; - } - } + vec_foreach_index (i, cf->pager_index) + { + pi = &cf->pager_index[i]; + + if (pi->line == old_line && + (pi->offset <= old_offset || pi->offset + pi->length > old_offset)) + { + /* Found it! */ + cf->pager_start = i; + break; + } + } /* In case the start line was not found (rare), ensure the pager start * index is within bounds @@ -872,9 +883,9 @@ static void unix_cli_pager_reindex (unix_cli_file_t * cf) if (cf->pager_start >= vec_len (cf->pager_index)) { if (!cf->height || vec_len (cf->pager_index) < (cf->height - 1)) - cf->pager_start = 0; + cf->pager_start = 0; else - cf->pager_start = vec_len (cf->pager_index) - (cf->height - 1); + cf->pager_start = vec_len (cf->pager_index) - (cf->height - 1); } } @@ -896,14 +907,13 @@ static void unix_cli_pager_reindex (unix_cli_file_t * cf) * @param buffer String of printabe bytes to be output. * @param buffer_bytes The number of bytes in @c buffer to be output. */ -static void unix_vlib_cli_output (uword cli_file_index, - u8 * buffer, - uword buffer_bytes) +static void +unix_vlib_cli_output (uword cli_file_index, u8 * buffer, uword buffer_bytes) { - unix_main_t * um = &unix_main; - unix_cli_main_t * cm = &unix_cli_main; - unix_cli_file_t * cf; - unix_file_t * uf; + unix_main_t *um = &unix_main; + unix_cli_main_t *cm = &unix_cli_main; + unix_cli_file_t *cf; + unix_file_t *uf; cf = pool_elt_at_index (cm->cli_file_pool, cli_file_index); uf = pool_elt_at_index (um->file_pool, cf->unix_file_index); @@ -915,8 +925,8 @@ static void unix_vlib_cli_output (uword cli_file_index, else { word row = vec_len (cf->pager_index); - u8 * line; - unix_cli_pager_index_t * pi; + u8 *line; + unix_cli_pager_index_t *pi; /* Index and add the output lines to the pager buffer. */ unix_cli_pager_add_line (cf, buffer, buffer_bytes); @@ -925,49 +935,49 @@ static void unix_vlib_cli_output (uword cli_file_index, * If we reach the bottom of the page, display a prompt. */ while (row < vec_len (cf->pager_index)) - { - if (row < cf->height - 1) - { - /* output this line */ - pi = &cf->pager_index[row]; - line = cf->pager_vector[pi->line] + pi->offset; - unix_vlib_cli_output_cooked (cf, uf, line, pi->length); - - /* if the last line didn't end in newline, and we're at the - * bottom of the page, add a newline */ - if (line[pi->length - 1] != '\n' && row == cf->height - 2) - unix_vlib_cli_output_cooked (cf, uf, (u8 *)"\n", 1); - } - else - { - /* Display the pager prompt every 10 lines */ - if (!(row % 10)) - unix_cli_pager_prompt(cf, uf); - } - row ++; - } + { + if (row < cf->height - 1) + { + /* output this line */ + pi = &cf->pager_index[row]; + line = cf->pager_vector[pi->line] + pi->offset; + unix_vlib_cli_output_cooked (cf, uf, line, pi->length); + + /* if the last line didn't end in newline, and we're at the + * bottom of the page, add a newline */ + if (line[pi->length - 1] != '\n' && row == cf->height - 2) + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\n", 1); + } + else + { + /* Display the pager prompt every 10 lines */ + if (!(row % 10)) + unix_cli_pager_prompt (cf, uf); + } + row++; + } /* Check if we went over the pager buffer limit */ if (vec_len (cf->pager_index) > um->cli_pager_buffer_limit) - { - /* Stop using the pager for the remainder of this CLI command */ - cf->no_pager = 2; - - /* If we likely printed the prompt, erase it */ - if (vec_len (cf->pager_index) > cf->height - 1) - unix_cli_pager_prompt_erase (cf, uf); - - /* Dump out the contents of the buffer */ - for (row = cf->pager_start + (cf->height - 1); - row < vec_len (cf->pager_index); row ++) - { - pi = &cf->pager_index[row]; - line = cf->pager_vector[pi->line] + pi->offset; - unix_vlib_cli_output_cooked (cf, uf, line, pi->length); - } - - unix_cli_pager_reset (cf); - } + { + /* Stop using the pager for the remainder of this CLI command */ + cf->no_pager = 2; + + /* If we likely printed the prompt, erase it */ + if (vec_len (cf->pager_index) > cf->height - 1) + unix_cli_pager_prompt_erase (cf, uf); + + /* Dump out the contents of the buffer */ + for (row = cf->pager_start + (cf->height - 1); + row < vec_len (cf->pager_index); row++) + { + pi = &cf->pager_index[row]; + line = cf->pager_vector[pi->line] + pi->offset; + unix_vlib_cli_output_cooked (cf, uf, line, pi->length); + } + + unix_cli_pager_reset (cf); + } } } @@ -984,7 +994,8 @@ static void unix_vlib_cli_output (uword cli_file_index, * @return @c 1 if the terminal type is recognized as supporting ANSI * terminal sequences; @c 0 otherwise. */ -static u8 unix_cli_terminal_type(u8 * term, uword len) +static u8 +unix_cli_terminal_type (u8 * term, uword len) { /* This may later be better done as a hash of some sort. */ #define _(a) do { \ @@ -993,19 +1004,20 @@ static u8 unix_cli_terminal_type(u8 * term, uword len) _("xterm"); _("xterm-color"); - _("xterm-256color"); /* iTerm on Mac */ + _("xterm-256color"); /* iTerm on Mac */ _("screen"); - _("ansi"); /* Microsoft Telnet */ + _("ansi"); /* Microsoft Telnet */ #undef _ return 0; } /** \brief Emit initial welcome banner and prompt on a connection. */ -static void unix_cli_file_welcome(unix_cli_main_t * cm, unix_cli_file_t * cf) +static void +unix_cli_file_welcome (unix_cli_main_t * cm, unix_cli_file_t * cf) { - unix_main_t * um = &unix_main; - unix_file_t * uf = pool_elt_at_index (um->file_pool, cf->unix_file_index); + unix_main_t *um = &unix_main; + unix_file_t *uf = pool_elt_at_index (um->file_pool, cf->unix_file_index); unix_cli_banner_t *banner; int i, len; @@ -1014,28 +1026,27 @@ static void unix_cli_file_welcome(unix_cli_main_t * cm, unix_cli_file_t * cf) * queued until everything is ready. (oterwise initial prompt can appear * mid way through VPP initialization) */ - unix_cli_add_pending_output (uf, cf, (u8 *)"\r", 1); + unix_cli_add_pending_output (uf, cf, (u8 *) "\r", 1); if (!um->cli_no_banner) { if (cf->ansi_capable) - { - banner = unix_cli_banner_color; - len = ARRAY_LEN(unix_cli_banner_color); - } + { + banner = unix_cli_banner_color; + len = ARRAY_LEN (unix_cli_banner_color); + } else - { - banner = unix_cli_banner; - len = ARRAY_LEN(unix_cli_banner); - } + { + banner = unix_cli_banner; + len = ARRAY_LEN (unix_cli_banner); + } for (i = 0; i < len; i++) - { - unix_vlib_cli_output_cooked(cf, uf, - banner[i].line, - banner[i].length); - } - } + { + unix_vlib_cli_output_cooked (cf, uf, + banner[i].line, banner[i].length); + } + } /* Prompt. */ unix_cli_cli_prompt (cf, uf); @@ -1045,20 +1056,21 @@ static void unix_cli_file_welcome(unix_cli_main_t * cm, unix_cli_file_t * cf) /** \brief A failsafe triggered on a timer to ensure we send the prompt * to telnet sessions that fail to negotiate the terminal type. */ -static void unix_cli_file_welcome_timer(any arg, f64 delay) +static void +unix_cli_file_welcome_timer (any arg, f64 delay) { - unix_cli_main_t * cm = &unix_cli_main; - unix_cli_file_t * cf; - (void)delay; + unix_cli_main_t *cm = &unix_cli_main; + unix_cli_file_t *cf; + (void) delay; /* Check the connection didn't close already */ - if (pool_is_free_index (cm->cli_file_pool, (uword)arg)) + if (pool_is_free_index (cm->cli_file_pool, (uword) arg)) return; - cf = pool_elt_at_index (cm->cli_file_pool, (uword)arg); + cf = pool_elt_at_index (cm->cli_file_pool, (uword) arg); if (!cf->started) - unix_cli_file_welcome(cm, cf); + unix_cli_file_welcome (cm, cf); } /** \brief A mostly no-op Telnet state machine. @@ -1069,11 +1081,10 @@ static void unix_cli_file_welcome_timer(any arg, f64 delay) * bytes to consume from the input_vector, not including the initial * IAC byte. */ -static i32 unix_cli_process_telnet(unix_main_t * um, - unix_cli_file_t * cf, - unix_file_t * uf, - u8 * input_vector, - uword len) +static i32 +unix_cli_process_telnet (unix_main_t * um, + unix_cli_file_t * cf, + unix_file_t * uf, u8 * input_vector, uword len) { /* Input_vector starts at IAC byte. * See if we have a complete message; if not, return -1 so we wait for more. @@ -1082,124 +1093,126 @@ static i32 unix_cli_process_telnet(unix_main_t * um, i32 consume = 0; if (len == 1) - return -1; /* want more bytes */ + return -1; /* want more bytes */ switch (input_vector[1]) { - case IAC: - /* two IAC's in a row means to pass through 0xff. - * since that makes no sense here, just consume it. - */ - consume = 1; - break; - - case WILL: - case WONT: - case DO: - case DONT: - /* Expect 3 bytes */ - if (vec_len(input_vector) < 3) - return -1; /* want more bytes */ - - consume = 2; - break; - - case SB: - { - /* Sub option - search ahead for IAC SE to end it */ - i32 i; - for (i = 3; i < len && i < UNIX_CLI_MAX_DEPTH_TELNET; i++) - { - if (input_vector[i - 1] == IAC && input_vector[i] == SE) - { - /* We have a complete message; see if we care about it */ - switch (input_vector[2]) - { - case TELOPT_TTYPE: - if (input_vector[3] != 0) - break; - /* See if the terminal type is ANSI capable */ - cf->ansi_capable = - unix_cli_terminal_type(input_vector + 4, i - 5); - /* If session not started, we can release the pause */ - if (!cf->started) - /* Send the welcome banner and initial prompt */ - unix_cli_file_welcome(&unix_cli_main, cf); - break; - - case TELOPT_NAWS: - /* Window size */ - if (i != 8) /* check message is correct size */ - break; - cf->width = clib_net_to_host_u16(*((u16 *)(input_vector + 3))); - cf->height = clib_net_to_host_u16(*((u16 *)(input_vector + 5))); - /* reindex pager buffer */ - unix_cli_pager_reindex (cf); - /* redraw page */ - unix_cli_pager_redraw (cf, uf); - break; - - default: - break; - } - /* Consume it all */ - consume = i; - break; - } - } - - if (i == UNIX_CLI_MAX_DEPTH_TELNET) - consume = 1; /* hit max search depth, advance one byte */ - - if (consume == 0) - return -1; /* want more bytes */ - - break; - } - - case GA: - case EL: - case EC: - case AO: - case IP: - case BREAK: - case DM: - case NOP: - case SE: - case EOR: - case ABORT: - case SUSP: - case xEOF: - /* Simple one-byte messages */ - consume = 1; - break; - - case AYT: - /* Are You There - trigger a visible response */ - consume = 1; - unix_vlib_cli_output_cooked (cf, uf, (u8 *) "fd.io VPP\n", 10); - break; - - default: - /* Unknown command! Eat the IAC byte */ - break; + case IAC: + /* two IAC's in a row means to pass through 0xff. + * since that makes no sense here, just consume it. + */ + consume = 1; + break; + + case WILL: + case WONT: + case DO: + case DONT: + /* Expect 3 bytes */ + if (vec_len (input_vector) < 3) + return -1; /* want more bytes */ + + consume = 2; + break; + + case SB: + { + /* Sub option - search ahead for IAC SE to end it */ + i32 i; + for (i = 3; i < len && i < UNIX_CLI_MAX_DEPTH_TELNET; i++) + { + if (input_vector[i - 1] == IAC && input_vector[i] == SE) + { + /* We have a complete message; see if we care about it */ + switch (input_vector[2]) + { + case TELOPT_TTYPE: + if (input_vector[3] != 0) + break; + /* See if the terminal type is ANSI capable */ + cf->ansi_capable = + unix_cli_terminal_type (input_vector + 4, i - 5); + /* If session not started, we can release the pause */ + if (!cf->started) + /* Send the welcome banner and initial prompt */ + unix_cli_file_welcome (&unix_cli_main, cf); + break; + + case TELOPT_NAWS: + /* Window size */ + if (i != 8) /* check message is correct size */ + break; + cf->width = + clib_net_to_host_u16 (*((u16 *) (input_vector + 3))); + cf->height = + clib_net_to_host_u16 (*((u16 *) (input_vector + 5))); + /* reindex pager buffer */ + unix_cli_pager_reindex (cf); + /* redraw page */ + unix_cli_pager_redraw (cf, uf); + break; + + default: + break; + } + /* Consume it all */ + consume = i; + break; + } + } + + if (i == UNIX_CLI_MAX_DEPTH_TELNET) + consume = 1; /* hit max search depth, advance one byte */ + + if (consume == 0) + return -1; /* want more bytes */ + + break; + } + + case GA: + case EL: + case EC: + case AO: + case IP: + case BREAK: + case DM: + case NOP: + case SE: + case EOR: + case ABORT: + case SUSP: + case xEOF: + /* Simple one-byte messages */ + consume = 1; + break; + + case AYT: + /* Are You There - trigger a visible response */ + consume = 1; + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "fd.io VPP\n", 10); + break; + + default: + /* Unknown command! Eat the IAC byte */ + break; } - return consume; + return consume; } /** \brief Process actionable input. * Based on the \c action process the input; this typically involves * searching the command history or editing the current command line. */ -static int unix_cli_line_process_one(unix_cli_main_t * cm, - unix_main_t * um, - unix_cli_file_t * cf, - unix_file_t * uf, - u8 input, - unix_cli_parse_action_t action) +static int +unix_cli_line_process_one (unix_cli_main_t * cm, + unix_main_t * um, + unix_cli_file_t * cf, + unix_file_t * uf, + u8 input, unix_cli_parse_action_t action) { - u8 * prev; + u8 *prev; int j, delta; switch (action) @@ -1210,31 +1223,31 @@ static int unix_cli_line_process_one(unix_cli_main_t * cm, case UNIX_CLI_PARSE_ACTION_REVSEARCH: case UNIX_CLI_PARSE_ACTION_FWDSEARCH: if (!cf->has_history || !cf->history_limit) - break; + break; if (cf->search_mode == 0) - { - /* Erase the current command (if any) */ - for (j = 0; j < (vec_len (cf->current_command)); j++) - unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b \b", 3); - - vec_reset_length (cf->search_key); - vec_reset_length (cf->current_command); - if (action == UNIX_CLI_PARSE_ACTION_REVSEARCH) - cf->search_mode = -1; - else - cf->search_mode = 1; - cf->cursor = 0; - } + { + /* Erase the current command (if any) */ + for (j = 0; j < (vec_len (cf->current_command)); j++) + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b \b", 3); + + vec_reset_length (cf->search_key); + vec_reset_length (cf->current_command); + if (action == UNIX_CLI_PARSE_ACTION_REVSEARCH) + cf->search_mode = -1; + else + cf->search_mode = 1; + cf->cursor = 0; + } else - { - if (action == UNIX_CLI_PARSE_ACTION_REVSEARCH) - cf->search_mode = -1; - else - cf->search_mode = 1; - - cf->excursion += cf->search_mode; - goto search_again; - } + { + if (action == UNIX_CLI_PARSE_ACTION_REVSEARCH) + cf->search_mode = -1; + else + cf->search_mode = 1; + + cf->excursion += cf->search_mode; + goto search_again; + } break; case UNIX_CLI_PARSE_ACTION_ERASELINELEFT: @@ -1243,25 +1256,23 @@ static int unix_cli_line_process_one(unix_cli_main_t * cm, /* Shimmy forwards to the new end of line position */ delta = vec_len (cf->current_command) - cf->cursor; for (j = cf->cursor; j > delta; j--) - unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); /* Zap from here to the end of what is currently displayed */ for (; j < (vec_len (cf->current_command)); j++) - unix_vlib_cli_output_cooked (cf, uf, (u8 *) " ", 1); + unix_vlib_cli_output_cooked (cf, uf, (u8 *) " ", 1); /* Get back to the start of the line */ for (j = 0; j < (vec_len (cf->current_command)); j++) - unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); - j = vec_len(cf->current_command) - cf->cursor; - memmove(cf->current_command, - cf->current_command + cf->cursor, - j); - _vec_len(cf->current_command) = j; + j = vec_len (cf->current_command) - cf->cursor; + memmove (cf->current_command, cf->current_command + cf->cursor, j); + _vec_len (cf->current_command) = j; /* Print the new contents */ unix_vlib_cli_output_cooked (cf, uf, cf->current_command, j); /* Shimmy back to the start */ for (j = 0; j < (vec_len (cf->current_command)); j++) - unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); cf->cursor = 0; cf->search_mode = 0; @@ -1272,34 +1283,35 @@ static int unix_cli_line_process_one(unix_cli_main_t * cm, /* Zap from cursor to end of what is currently displayed */ for (j = cf->cursor; j < (vec_len (cf->current_command)); j++) - unix_vlib_cli_output_cooked (cf, uf, (u8 *) " ", 1); + unix_vlib_cli_output_cooked (cf, uf, (u8 *) " ", 1); /* Get back to where we were */ for (j = cf->cursor; j < (vec_len (cf->current_command)); j++) - unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); /* Truncate the line at the cursor */ - _vec_len(cf->current_command) = cf->cursor; + _vec_len (cf->current_command) = cf->cursor; cf->search_mode = 0; break; case UNIX_CLI_PARSE_ACTION_LEFT: if (cf->cursor > 0) - { - unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); - cf->cursor --; - } + { + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); + cf->cursor--; + } cf->search_mode = 0; break; case UNIX_CLI_PARSE_ACTION_RIGHT: - if (cf->cursor < vec_len(cf->current_command)) - { - /* have to emit the character under the cursor */ - unix_vlib_cli_output_cooked (cf, uf, cf->current_command + cf->cursor, 1); - cf->cursor ++; - } + if (cf->cursor < vec_len (cf->current_command)) + { + /* have to emit the character under the cursor */ + unix_vlib_cli_output_cooked (cf, uf, + cf->current_command + cf->cursor, 1); + cf->cursor++; + } cf->search_mode = 0; break; @@ -1307,123 +1319,124 @@ static int unix_cli_line_process_one(unix_cli_main_t * cm, case UNIX_CLI_PARSE_ACTION_UP: case UNIX_CLI_PARSE_ACTION_DOWN: if (!cf->has_history || !cf->history_limit) - break; + break; cf->search_mode = 0; /* Erase the command */ for (j = cf->cursor; j < (vec_len (cf->current_command)); j++) - unix_vlib_cli_output_cooked (cf, uf, (u8 *) " ", 1); + unix_vlib_cli_output_cooked (cf, uf, (u8 *) " ", 1); for (j = 0; j < (vec_len (cf->current_command)); j++) - unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b \b", 3); + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b \b", 3); vec_reset_length (cf->current_command); if (vec_len (cf->command_history)) - { - if (action == UNIX_CLI_PARSE_ACTION_UP) - delta = -1; - else - delta = 1; - - cf->excursion += delta; - - if (cf->excursion == vec_len (cf->command_history)) - { - /* down-arrowed to last entry - want a blank line */ - _vec_len (cf->current_command) = 0; - } - else if (cf->excursion < 0) - { - /* up-arrowed over the start to the end, want a blank line */ - cf->excursion = vec_len (cf->command_history); - _vec_len (cf->current_command) = 0; - } - else - { - if (cf->excursion > (i32) vec_len (cf->command_history) -1) - /* down-arrowed past end - wrap to start */ - cf->excursion = 0; - - /* Print the command at the current position */ - prev = cf->command_history [cf->excursion]; - vec_validate (cf->current_command, vec_len(prev)-1); - - clib_memcpy (cf->current_command, prev, vec_len(prev)); - _vec_len (cf->current_command) = vec_len(prev); - unix_vlib_cli_output_cooked (cf, uf, cf->current_command, - vec_len (cf->current_command)); - } - cf->cursor = vec_len(cf->current_command); - - break; - } + { + if (action == UNIX_CLI_PARSE_ACTION_UP) + delta = -1; + else + delta = 1; + + cf->excursion += delta; + + if (cf->excursion == vec_len (cf->command_history)) + { + /* down-arrowed to last entry - want a blank line */ + _vec_len (cf->current_command) = 0; + } + else if (cf->excursion < 0) + { + /* up-arrowed over the start to the end, want a blank line */ + cf->excursion = vec_len (cf->command_history); + _vec_len (cf->current_command) = 0; + } + else + { + if (cf->excursion > (i32) vec_len (cf->command_history) - 1) + /* down-arrowed past end - wrap to start */ + cf->excursion = 0; + + /* Print the command at the current position */ + prev = cf->command_history[cf->excursion]; + vec_validate (cf->current_command, vec_len (prev) - 1); + + clib_memcpy (cf->current_command, prev, vec_len (prev)); + _vec_len (cf->current_command) = vec_len (prev); + unix_vlib_cli_output_cooked (cf, uf, cf->current_command, + vec_len (cf->current_command)); + } + cf->cursor = vec_len (cf->current_command); + + break; + } break; case UNIX_CLI_PARSE_ACTION_HOME: if (vec_len (cf->current_command) && cf->cursor > 0) - { - while (cf->cursor) - { - unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); - cf->cursor --; - } - } + { + while (cf->cursor) + { + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); + cf->cursor--; + } + } cf->search_mode = 0; break; case UNIX_CLI_PARSE_ACTION_END: if (vec_len (cf->current_command) && - cf->cursor < vec_len(cf->current_command)) - { - unix_vlib_cli_output_cooked (cf, uf, - cf->current_command + cf->cursor, - vec_len(cf->current_command) - cf->cursor); - cf->cursor = vec_len(cf->current_command); - } + cf->cursor < vec_len (cf->current_command)) + { + unix_vlib_cli_output_cooked (cf, uf, + cf->current_command + cf->cursor, + vec_len (cf->current_command) - + cf->cursor); + cf->cursor = vec_len (cf->current_command); + } cf->search_mode = 0; break; case UNIX_CLI_PARSE_ACTION_WORDLEFT: if (vec_len (cf->current_command) && cf->cursor > 0) - { - j = cf->cursor; - - unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); - j --; - - while (j && isspace(cf->current_command[j])) - { - unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); - j --; - } - while (j && !isspace(cf->current_command[j])) - { - if (isspace(cf->current_command[j - 1])) - break; - unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); - j --; - } - - cf->cursor = j; - } + { + j = cf->cursor; + + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); + j--; + + while (j && isspace (cf->current_command[j])) + { + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); + j--; + } + while (j && !isspace (cf->current_command[j])) + { + if (isspace (cf->current_command[j - 1])) + break; + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); + j--; + } + + cf->cursor = j; + } cf->search_mode = 0; break; case UNIX_CLI_PARSE_ACTION_WORDRIGHT: if (vec_len (cf->current_command) && - cf->cursor < vec_len(cf->current_command)) - { - int e = vec_len(cf->current_command); - j = cf->cursor; - while (j < e && !isspace(cf->current_command[j])) - j ++; - while (j < e && isspace(cf->current_command[j])) - j ++; - unix_vlib_cli_output_cooked (cf, uf, - cf->current_command + cf->cursor, - j - cf->cursor); - cf->cursor = j; - } + cf->cursor < vec_len (cf->current_command)) + { + int e = vec_len (cf->current_command); + j = cf->cursor; + while (j < e && !isspace (cf->current_command[j])) + j++; + while (j < e && isspace (cf->current_command[j])) + j++; + unix_vlib_cli_output_cooked (cf, uf, + cf->current_command + cf->cursor, + j - cf->cursor); + cf->cursor = j; + } cf->search_mode = 0; break; @@ -1431,32 +1444,32 @@ static int unix_cli_line_process_one(unix_cli_main_t * cm, case UNIX_CLI_PARSE_ACTION_ERASE: if (vec_len (cf->current_command)) - { - if (cf->cursor == vec_len(cf->current_command)) - { - unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b \b", 3); - _vec_len (cf->current_command)--; - cf->cursor --; - } - else if (cf->cursor > 0) - { - /* shift everything at & to the right of the cursor left by 1 */ - j = vec_len (cf->current_command) - cf->cursor; - memmove (cf->current_command + cf->cursor - 1, - cf->current_command + cf->cursor, - j); - _vec_len (cf->current_command)--; - cf->cursor --; - /* redraw the rest of the line */ - unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); - unix_vlib_cli_output_cooked (cf, uf, - cf->current_command + cf->cursor, j); - unix_vlib_cli_output_cooked (cf, uf, (u8 *) " \b\b", 3); - /* and shift the terminal cursor back where it should be */ - while (-- j) - unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); - } - } + { + if (cf->cursor == vec_len (cf->current_command)) + { + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b \b", 3); + _vec_len (cf->current_command)--; + cf->cursor--; + } + else if (cf->cursor > 0) + { + /* shift everything at & to the right of the cursor left by 1 */ + j = vec_len (cf->current_command) - cf->cursor; + memmove (cf->current_command + cf->cursor - 1, + cf->current_command + cf->cursor, j); + _vec_len (cf->current_command)--; + cf->cursor--; + /* redraw the rest of the line */ + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); + unix_vlib_cli_output_cooked (cf, uf, + cf->current_command + cf->cursor, + j); + unix_vlib_cli_output_cooked (cf, uf, (u8 *) " \b\b", 3); + /* and shift the terminal cursor back where it should be */ + while (--j) + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); + } + } cf->search_mode = 0; cf->excursion = 0; vec_reset_length (cf->search_key); @@ -1464,37 +1477,37 @@ static int unix_cli_line_process_one(unix_cli_main_t * cm, case UNIX_CLI_PARSE_ACTION_ERASERIGHT: if (vec_len (cf->current_command)) - { - if (cf->cursor < vec_len(cf->current_command)) - { - /* shift everything to the right of the cursor left by 1 */ - j = vec_len (cf->current_command) - cf->cursor - 1; - memmove (cf->current_command + cf->cursor, - cf->current_command + cf->cursor + 1, - j); - _vec_len (cf->current_command)--; - /* redraw the rest of the line */ - unix_vlib_cli_output_cooked (cf, uf, - cf->current_command + cf->cursor, j); - unix_vlib_cli_output_cooked (cf, uf, (u8 *) " \b", 2); - /* and shift the terminal cursor back where it should be */ - if (j) - { - unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); - while (-- j) - unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); - } - } - } + { + if (cf->cursor < vec_len (cf->current_command)) + { + /* shift everything to the right of the cursor left by 1 */ + j = vec_len (cf->current_command) - cf->cursor - 1; + memmove (cf->current_command + cf->cursor, + cf->current_command + cf->cursor + 1, j); + _vec_len (cf->current_command)--; + /* redraw the rest of the line */ + unix_vlib_cli_output_cooked (cf, uf, + cf->current_command + cf->cursor, + j); + unix_vlib_cli_output_cooked (cf, uf, (u8 *) " \b", 2); + /* and shift the terminal cursor back where it should be */ + if (j) + { + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); + while (--j) + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); + } + } + } else if (input == 'D' - '@') - { - /* ^D with no command entered = quit */ - unix_vlib_cli_output_cooked (cf, uf, (u8 *) "quit\n", 5); - vlib_process_signal_event (um->vlib_main, - vlib_current_process (um->vlib_main), - UNIX_CLI_PROCESS_EVENT_QUIT, - cf - cm->cli_file_pool); - } + { + /* ^D with no command entered = quit */ + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "quit\n", 5); + vlib_process_signal_event (um->vlib_main, + vlib_current_process (um->vlib_main), + UNIX_CLI_PROCESS_EVENT_QUIT, + cf - cm->cli_file_pool); + } cf->search_mode = 0; cf->excursion = 0; vec_reset_length (cf->search_key); @@ -1506,20 +1519,19 @@ static int unix_cli_line_process_one(unix_cli_main_t * cm, * the cursor back where it was in that line. */ if (cf->ansi_capable) - unix_vlib_cli_output_cooked (cf, uf, - (u8 *) ANSI_CLEAR, - sizeof(ANSI_CLEAR)-1); + unix_vlib_cli_output_cooked (cf, uf, + (u8 *) ANSI_CLEAR, + sizeof (ANSI_CLEAR) - 1); else - unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\n", 1); + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\n", 1); unix_vlib_cli_output_raw (cf, uf, - cm->cli_prompt, - vec_len (cm->cli_prompt)); + cm->cli_prompt, vec_len (cm->cli_prompt)); unix_vlib_cli_output_raw (cf, uf, - cf->current_command, - vec_len (cf->current_command)); - for (j = cf->cursor; j < vec_len(cf->current_command); j++) - unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); + cf->current_command, + vec_len (cf->current_command)); + for (j = cf->cursor; j < vec_len (cf->current_command); j++) + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b", 1); break; @@ -1540,171 +1552,178 @@ static int unix_cli_line_process_one(unix_cli_main_t * cm, case UNIX_CLI_PARSE_ACTION_PAGER_PGDN: /* show next page of the buffer */ if (cf->height + cf->pager_start < vec_len (cf->pager_index)) - { - u8 * line = NULL; - unix_cli_pager_index_t * pi = NULL; - - int m = cf->pager_start + (cf->height - 1); - unix_cli_pager_prompt_erase (cf, uf); - for (j = m; - j < vec_len (cf->pager_index) && cf->pager_start < m; - j ++, cf->pager_start ++) - { - pi = &cf->pager_index[j]; - line = cf->pager_vector[pi->line] + pi->offset; - unix_vlib_cli_output_cooked (cf, uf, line, pi->length); - } - /* if the last line didn't end in newline, add a newline */ - if (pi && line[pi->length - 1] != '\n') - unix_vlib_cli_output_cooked (cf, uf, (u8 *)"\n", 1); - unix_cli_pager_prompt (cf, uf); - } + { + u8 *line = NULL; + unix_cli_pager_index_t *pi = NULL; + + int m = cf->pager_start + (cf->height - 1); + unix_cli_pager_prompt_erase (cf, uf); + for (j = m; + j < vec_len (cf->pager_index) && cf->pager_start < m; + j++, cf->pager_start++) + { + pi = &cf->pager_index[j]; + line = cf->pager_vector[pi->line] + pi->offset; + unix_vlib_cli_output_cooked (cf, uf, line, pi->length); + } + /* if the last line didn't end in newline, add a newline */ + if (pi && line[pi->length - 1] != '\n') + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\n", 1); + unix_cli_pager_prompt (cf, uf); + } else - { - if (action == UNIX_CLI_PARSE_ACTION_PAGER_NEXT) - /* no more in buffer, exit, but only if it was <space> */ - goto pager_quit; - } + { + if (action == UNIX_CLI_PARSE_ACTION_PAGER_NEXT) + /* no more in buffer, exit, but only if it was <space> */ + goto pager_quit; + } break; case UNIX_CLI_PARSE_ACTION_PAGER_DN: case UNIX_CLI_PARSE_ACTION_PAGER_CRLF: /* display the next line of the buffer */ if (cf->pager_start < vec_len (cf->pager_index) - (cf->height - 1)) - { - u8 * line; - unix_cli_pager_index_t * pi; - - unix_cli_pager_prompt_erase (cf, uf); - pi = &cf->pager_index[cf->pager_start + (cf->height - 1)]; - line = cf->pager_vector[pi->line] + pi->offset; - unix_vlib_cli_output_cooked (cf, uf, line, pi->length); - cf->pager_start ++; - /* if the last line didn't end in newline, add a newline */ - if (line[pi->length - 1] != '\n') - unix_vlib_cli_output_cooked (cf, uf, (u8 *)"\n", 1); - unix_cli_pager_prompt (cf, uf); - } + { + u8 *line; + unix_cli_pager_index_t *pi; + + unix_cli_pager_prompt_erase (cf, uf); + pi = &cf->pager_index[cf->pager_start + (cf->height - 1)]; + line = cf->pager_vector[pi->line] + pi->offset; + unix_vlib_cli_output_cooked (cf, uf, line, pi->length); + cf->pager_start++; + /* if the last line didn't end in newline, add a newline */ + if (line[pi->length - 1] != '\n') + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\n", 1); + unix_cli_pager_prompt (cf, uf); + } else - { - if (action == UNIX_CLI_PARSE_ACTION_PAGER_CRLF) - /* no more in buffer, exit, but only if it was <enter> */ - goto pager_quit; - } + { + if (action == UNIX_CLI_PARSE_ACTION_PAGER_CRLF) + /* no more in buffer, exit, but only if it was <enter> */ + goto pager_quit; + } break; case UNIX_CLI_PARSE_ACTION_PAGER_UP: /* scroll the page back one line */ if (cf->pager_start > 0) - { - u8 * line = NULL; - unix_cli_pager_index_t * pi = NULL; - - cf->pager_start --; - if (cf->ansi_capable) - { - pi = &cf->pager_index[cf->pager_start]; - line = cf->pager_vector[pi->line] + pi->offset; - unix_cli_pager_prompt_erase (cf, uf); - unix_vlib_cli_output_cooked (cf, uf, (u8 *)ANSI_SCROLLDN, sizeof(ANSI_SCROLLDN) - 1); - unix_vlib_cli_output_cooked (cf, uf, (u8 *)ANSI_SAVECURSOR, sizeof(ANSI_SAVECURSOR) - 1); - unix_cli_ansi_cursor(cf, uf, 1, 1); - unix_vlib_cli_output_cooked (cf, uf, (u8 *)ANSI_CLEARLINE, sizeof(ANSI_CLEARLINE) - 1); - unix_vlib_cli_output_cooked (cf, uf, line, pi->length); - unix_vlib_cli_output_cooked (cf, uf, (u8 *)ANSI_RESTCURSOR, sizeof(ANSI_RESTCURSOR) - 1); - unix_cli_pager_prompt_erase (cf, uf); - unix_cli_pager_prompt (cf, uf); - } - else - { - int m = cf->pager_start + (cf->height - 1); - unix_cli_pager_prompt_erase (cf, uf); - for (j = cf->pager_start; j < vec_len (cf->pager_index) && j < m; j ++) - { - pi = &cf->pager_index[j]; - line = cf->pager_vector[pi->line] + pi->offset; - unix_vlib_cli_output_cooked (cf, uf, line, pi->length); - } - /* if the last line didn't end in newline, add a newline */ - if (pi && line[pi->length - 1] != '\n') - unix_vlib_cli_output_cooked (cf, uf, (u8 *)"\n", 1); - unix_cli_pager_prompt (cf, uf); - } - } + { + u8 *line = NULL; + unix_cli_pager_index_t *pi = NULL; + + cf->pager_start--; + if (cf->ansi_capable) + { + pi = &cf->pager_index[cf->pager_start]; + line = cf->pager_vector[pi->line] + pi->offset; + unix_cli_pager_prompt_erase (cf, uf); + unix_vlib_cli_output_cooked (cf, uf, (u8 *) ANSI_SCROLLDN, + sizeof (ANSI_SCROLLDN) - 1); + unix_vlib_cli_output_cooked (cf, uf, (u8 *) ANSI_SAVECURSOR, + sizeof (ANSI_SAVECURSOR) - 1); + unix_cli_ansi_cursor (cf, uf, 1, 1); + unix_vlib_cli_output_cooked (cf, uf, (u8 *) ANSI_CLEARLINE, + sizeof (ANSI_CLEARLINE) - 1); + unix_vlib_cli_output_cooked (cf, uf, line, pi->length); + unix_vlib_cli_output_cooked (cf, uf, (u8 *) ANSI_RESTCURSOR, + sizeof (ANSI_RESTCURSOR) - 1); + unix_cli_pager_prompt_erase (cf, uf); + unix_cli_pager_prompt (cf, uf); + } + else + { + int m = cf->pager_start + (cf->height - 1); + unix_cli_pager_prompt_erase (cf, uf); + for (j = cf->pager_start; + j < vec_len (cf->pager_index) && j < m; j++) + { + pi = &cf->pager_index[j]; + line = cf->pager_vector[pi->line] + pi->offset; + unix_vlib_cli_output_cooked (cf, uf, line, pi->length); + } + /* if the last line didn't end in newline, add a newline */ + if (pi && line[pi->length - 1] != '\n') + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\n", 1); + unix_cli_pager_prompt (cf, uf); + } + } break; case UNIX_CLI_PARSE_ACTION_PAGER_TOP: /* back to the first page of the buffer */ if (cf->pager_start > 0) - { - u8 * line = NULL; - unix_cli_pager_index_t * pi = NULL; - - cf->pager_start = 0; - int m = cf->pager_start + (cf->height - 1); - unix_cli_pager_prompt_erase (cf, uf); - for (j = cf->pager_start; j < vec_len (cf->pager_index) && j < m; j ++) - { - pi = &cf->pager_index[j]; - line = cf->pager_vector[pi->line] + pi->offset; - unix_vlib_cli_output_cooked (cf, uf, line, pi->length); - } - /* if the last line didn't end in newline, add a newline */ - if (pi && line[pi->length - 1] != '\n') - unix_vlib_cli_output_cooked (cf, uf, (u8 *)"\n", 1); - unix_cli_pager_prompt (cf, uf); - } + { + u8 *line = NULL; + unix_cli_pager_index_t *pi = NULL; + + cf->pager_start = 0; + int m = cf->pager_start + (cf->height - 1); + unix_cli_pager_prompt_erase (cf, uf); + for (j = cf->pager_start; j < vec_len (cf->pager_index) && j < m; + j++) + { + pi = &cf->pager_index[j]; + line = cf->pager_vector[pi->line] + pi->offset; + unix_vlib_cli_output_cooked (cf, uf, line, pi->length); + } + /* if the last line didn't end in newline, add a newline */ + if (pi && line[pi->length - 1] != '\n') + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\n", 1); + unix_cli_pager_prompt (cf, uf); + } break; case UNIX_CLI_PARSE_ACTION_PAGER_BOTTOM: /* skip to the last page of the buffer */ if (cf->pager_start < vec_len (cf->pager_index) - (cf->height - 1)) - { - u8 * line = NULL; - unix_cli_pager_index_t * pi = NULL; - - cf->pager_start = vec_len (cf->pager_index) - (cf->height - 1); - unix_cli_pager_prompt_erase (cf, uf); - unix_cli_pager_message (cf, uf, "skipping", "\n"); - for (j = cf->pager_start; j < vec_len (cf->pager_index); j ++) - { - pi = &cf->pager_index[j]; - line = cf->pager_vector[pi->line] + pi->offset; - unix_vlib_cli_output_cooked (cf, uf, line, pi->length); - } - /* if the last line didn't end in newline, add a newline */ - if (pi && line[pi->length - 1] != '\n') - unix_vlib_cli_output_cooked (cf, uf, (u8 *)"\n", 1); - unix_cli_pager_prompt (cf, uf); - } + { + u8 *line = NULL; + unix_cli_pager_index_t *pi = NULL; + + cf->pager_start = vec_len (cf->pager_index) - (cf->height - 1); + unix_cli_pager_prompt_erase (cf, uf); + unix_cli_pager_message (cf, uf, "skipping", "\n"); + for (j = cf->pager_start; j < vec_len (cf->pager_index); j++) + { + pi = &cf->pager_index[j]; + line = cf->pager_vector[pi->line] + pi->offset; + unix_vlib_cli_output_cooked (cf, uf, line, pi->length); + } + /* if the last line didn't end in newline, add a newline */ + if (pi && line[pi->length - 1] != '\n') + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\n", 1); + unix_cli_pager_prompt (cf, uf); + } break; case UNIX_CLI_PARSE_ACTION_PAGER_PGUP: /* wander back one page in the buffer */ if (cf->pager_start > 0) - { - u8 * line = NULL; - unix_cli_pager_index_t * pi = NULL; - int m; - - if (cf->pager_start >= cf->height) - cf->pager_start -= cf->height - 1; - else - cf->pager_start = 0; - m = cf->pager_start + cf->height - 1; - unix_cli_pager_prompt_erase (cf, uf); - for (j = cf->pager_start; j < vec_len (cf->pager_index) && j < m; j ++) - { - pi = &cf->pager_index[j]; - line = cf->pager_vector[pi->line] + pi->offset; - unix_vlib_cli_output_cooked (cf, uf, line, pi->length); - } - /* if the last line didn't end in newline, add a newline */ - if (pi && line[pi->length - 1] != '\n') - unix_vlib_cli_output_cooked (cf, uf, (u8 *)"\n", 1); - unix_cli_pager_prompt (cf, uf); - } + { + u8 *line = NULL; + unix_cli_pager_index_t *pi = NULL; + int m; + + if (cf->pager_start >= cf->height) + cf->pager_start -= cf->height - 1; + else + cf->pager_start = 0; + m = cf->pager_start + cf->height - 1; + unix_cli_pager_prompt_erase (cf, uf); + for (j = cf->pager_start; j < vec_len (cf->pager_index) && j < m; + j++) + { + pi = &cf->pager_index[j]; + line = cf->pager_vector[pi->line] + pi->offset; + unix_vlib_cli_output_cooked (cf, uf, line, pi->length); + } + /* if the last line didn't end in newline, add a newline */ + if (pi && line[pi->length - 1] != '\n') + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\n", 1); + unix_cli_pager_prompt (cf, uf); + } break; case UNIX_CLI_PARSE_ACTION_PAGER_REDRAW: @@ -1722,31 +1741,33 @@ static int unix_cli_line_process_one(unix_cli_main_t * cm, unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\n", 1); if (cf->has_history && cf->history_limit) - { - if (cf->command_history && vec_len(cf->command_history) >= cf->history_limit) - { - vec_free (cf->command_history[0]); - vec_delete (cf->command_history, 1, 0); - } - /* Don't add blank lines to the cmd history */ - if (vec_len (cf->current_command)) - { - /* Don't duplicate the previous command */ - j = vec_len(cf->command_history); - if (j == 0 || - (vec_len (cf->current_command) != vec_len (cf->command_history[j - 1]) || - memcmp(cf->current_command, cf->command_history[j - 1], - vec_len (cf->current_command)) != 0)) - { - /* copy the command to the history */ - u8 * c = 0; - vec_append(c, cf->current_command); - vec_add1 (cf->command_history, c); - cf->command_number ++; - } - } - cf->excursion = vec_len (cf->command_history); - } + { + if (cf->command_history + && vec_len (cf->command_history) >= cf->history_limit) + { + vec_free (cf->command_history[0]); + vec_delete (cf->command_history, 1, 0); + } + /* Don't add blank lines to the cmd history */ + if (vec_len (cf->current_command)) + { + /* Don't duplicate the previous command */ + j = vec_len (cf->command_history); + if (j == 0 || + (vec_len (cf->current_command) != + vec_len (cf->command_history[j - 1]) + || memcmp (cf->current_command, cf->command_history[j - 1], + vec_len (cf->current_command)) != 0)) + { + /* copy the command to the history */ + u8 *c = 0; + vec_append (c, cf->current_command); + vec_add1 (cf->command_history, c); + cf->command_number++; + } + } + cf->excursion = vec_len (cf->command_history); + } cf->search_mode = 0; vec_reset_length (cf->search_key); @@ -1757,101 +1778,100 @@ static int unix_cli_line_process_one(unix_cli_main_t * cm, case UNIX_CLI_PARSE_ACTION_PARTIALMATCH: case UNIX_CLI_PARSE_ACTION_NOMATCH: if (vec_len (cf->pager_index)) - { - /* no-op for now */ - } - else if (cf->has_history && cf->search_mode && isprint(input)) - { - int k, limit, offset; - u8 * item; - - vec_add1 (cf->search_key, input); - - search_again: - for (j = 0; j < vec_len(cf->command_history); j++) - { - if (cf->excursion > (i32) vec_len (cf->command_history) -1) - cf->excursion = 0; - else if (cf->excursion < 0) - cf->excursion = vec_len (cf->command_history) -1; - - item = cf->command_history[cf->excursion]; - - limit = (vec_len(cf->search_key) > vec_len (item)) ? - vec_len(item) : vec_len (cf->search_key); - - for (offset = 0; offset <= vec_len(item) - limit; offset++) - { - for (k = 0; k < limit; k++) - { - if (item[k+offset] != cf->search_key[k]) - goto next_offset; - } - goto found_at_offset; - - next_offset: - ; - } - goto next; - - found_at_offset: - for (j = 0; j < vec_len (cf->current_command); j++) - unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b \b", 3); - - vec_validate (cf->current_command, vec_len(item)-1); - clib_memcpy (cf->current_command, item, vec_len(item)); - _vec_len (cf->current_command) = vec_len(item); - - unix_vlib_cli_output_cooked (cf, uf, cf->current_command, - vec_len (cf->current_command)); - cf->cursor = vec_len (cf->current_command); - goto found; - - next: - cf->excursion += cf->search_mode; - } - - unix_vlib_cli_output_cooked (cf, uf, (u8 *)"\nNo match...", 12); - vec_reset_length (cf->search_key); - vec_reset_length (cf->current_command); - cf->search_mode = 0; - cf->cursor = 0; - goto crlf; - } - else if (isprint(input)) /* skip any errant control codes */ - { - if (cf->cursor == vec_len(cf->current_command)) - { - /* Append to end */ - vec_add1 (cf->current_command, input); - cf->cursor ++; - - /* Echo the character back to the client */ - unix_vlib_cli_output_raw (cf, uf, &input, 1); - } - else - { - /* Insert at cursor: resize +1 byte, move everything over */ - j = vec_len (cf->current_command) - cf->cursor; - vec_add1 (cf->current_command, (u8)'A'); - memmove (cf->current_command + cf->cursor + 1, - cf->current_command + cf->cursor, - j); - cf->current_command[cf->cursor] = input; - /* Redraw the line */ - j ++; - unix_vlib_cli_output_raw (cf, uf, - cf->current_command + cf->cursor, j); - /* Put terminal cursor back */ - while (-- j) - unix_vlib_cli_output_raw (cf, uf, (u8 *)"\b", 1); - cf->cursor ++; - } - } + { + /* no-op for now */ + } + else if (cf->has_history && cf->search_mode && isprint (input)) + { + int k, limit, offset; + u8 *item; + + vec_add1 (cf->search_key, input); + + search_again: + for (j = 0; j < vec_len (cf->command_history); j++) + { + if (cf->excursion > (i32) vec_len (cf->command_history) - 1) + cf->excursion = 0; + else if (cf->excursion < 0) + cf->excursion = vec_len (cf->command_history) - 1; + + item = cf->command_history[cf->excursion]; + + limit = (vec_len (cf->search_key) > vec_len (item)) ? + vec_len (item) : vec_len (cf->search_key); + + for (offset = 0; offset <= vec_len (item) - limit; offset++) + { + for (k = 0; k < limit; k++) + { + if (item[k + offset] != cf->search_key[k]) + goto next_offset; + } + goto found_at_offset; + + next_offset: + ; + } + goto next; + + found_at_offset: + for (j = 0; j < vec_len (cf->current_command); j++) + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\b \b", 3); + + vec_validate (cf->current_command, vec_len (item) - 1); + clib_memcpy (cf->current_command, item, vec_len (item)); + _vec_len (cf->current_command) = vec_len (item); + + unix_vlib_cli_output_cooked (cf, uf, cf->current_command, + vec_len (cf->current_command)); + cf->cursor = vec_len (cf->current_command); + goto found; + + next: + cf->excursion += cf->search_mode; + } + + unix_vlib_cli_output_cooked (cf, uf, (u8 *) "\nNo match...", 12); + vec_reset_length (cf->search_key); + vec_reset_length (cf->current_command); + cf->search_mode = 0; + cf->cursor = 0; + goto crlf; + } + else if (isprint (input)) /* skip any errant control codes */ + { + if (cf->cursor == vec_len (cf->current_command)) + { + /* Append to end */ + vec_add1 (cf->current_command, input); + cf->cursor++; + + /* Echo the character back to the client */ + unix_vlib_cli_output_raw (cf, uf, &input, 1); + } + else + { + /* Insert at cursor: resize +1 byte, move everything over */ + j = vec_len (cf->current_command) - cf->cursor; + vec_add1 (cf->current_command, (u8) 'A'); + memmove (cf->current_command + cf->cursor + 1, + cf->current_command + cf->cursor, j); + cf->current_command[cf->cursor] = input; + /* Redraw the line */ + j++; + unix_vlib_cli_output_raw (cf, uf, + cf->current_command + cf->cursor, j); + /* Put terminal cursor back */ + while (--j) + unix_vlib_cli_output_raw (cf, uf, (u8 *) "\b", 1); + cf->cursor++; + } + } else - { - /* no-op - not printable or otherwise not actionable */ - } + { + /* no-op - not printable or otherwise not actionable */ + } found: @@ -1860,16 +1880,16 @@ static int unix_cli_line_process_one(unix_cli_main_t * cm, case UNIX_CLI_PARSE_ACTION_TELNETIAC: break; } - return 1; + return 1; } /** \brief Process input bytes on a stream to provide line editing and * command history in the CLI. */ -static int unix_cli_line_edit (unix_cli_main_t * cm, - unix_main_t * um, - unix_cli_file_t * cf) +static int +unix_cli_line_edit (unix_cli_main_t * cm, + unix_main_t * um, unix_cli_file_t * cf) { - unix_file_t * uf = pool_elt_at_index (um->file_pool, cf->unix_file_index); + unix_file_t *uf = pool_elt_at_index (um->file_pool, cf->unix_file_index); int i; for (i = 0; i < vec_len (cf->input_vector); i++) @@ -1879,78 +1899,82 @@ static int unix_cli_line_edit (unix_cli_main_t * cm, unix_cli_parse_actions_t *a; /* If we're in the pager mode, search the pager actions */ - a = vec_len (cf->pager_index) ? unix_cli_parse_pager : unix_cli_parse_strings; + a = + vec_len (cf->pager_index) ? unix_cli_parse_pager : + unix_cli_parse_strings; /* See if the input buffer is some sort of control code */ - action = unix_cli_match_action(a, &cf->input_vector[i], - vec_len (cf->input_vector) - i, &matched); + action = unix_cli_match_action (a, &cf->input_vector[i], + vec_len (cf->input_vector) - i, + &matched); switch (action) - { - case UNIX_CLI_PARSE_ACTION_PARTIALMATCH: - if (i) - { - /* There was a partial match which means we need more bytes - * than the input buffer currently has. - * Since the bytes before here have been processed, shift - * the remaining contents to the start of the input buffer. - */ - vec_delete (cf->input_vector, i, 0); - } - return 1; /* wait for more */ - - case UNIX_CLI_PARSE_ACTION_TELNETIAC: - /* process telnet options */ - matched = unix_cli_process_telnet(um, cf, uf, - cf->input_vector + i, vec_len(cf->input_vector) - i); - if (matched < 0) - { - if (i) - { - /* There was a partial match which means we need more bytes - * than the input buffer currently has. - * Since the bytes before here have been processed, shift - * the remaining contents to the start of the input buffer. - */ - vec_delete (cf->input_vector, i, 0); - } - return 1; /* wait for more */ - } - break; - - default: - /* process the action */ - if (!unix_cli_line_process_one(cm, um, cf, uf, - cf->input_vector[i], action)) - { - /* CRLF found. Consume the bytes from the input_vector */ - vec_delete (cf->input_vector, i + matched, 0); - /* And tell our caller to execute cf->input_command */ - return 0; - } - } + { + case UNIX_CLI_PARSE_ACTION_PARTIALMATCH: + if (i) + { + /* There was a partial match which means we need more bytes + * than the input buffer currently has. + * Since the bytes before here have been processed, shift + * the remaining contents to the start of the input buffer. + */ + vec_delete (cf->input_vector, i, 0); + } + return 1; /* wait for more */ + + case UNIX_CLI_PARSE_ACTION_TELNETIAC: + /* process telnet options */ + matched = unix_cli_process_telnet (um, cf, uf, + cf->input_vector + i, + vec_len (cf->input_vector) - i); + if (matched < 0) + { + if (i) + { + /* There was a partial match which means we need more bytes + * than the input buffer currently has. + * Since the bytes before here have been processed, shift + * the remaining contents to the start of the input buffer. + */ + vec_delete (cf->input_vector, i, 0); + } + return 1; /* wait for more */ + } + break; + + default: + /* process the action */ + if (!unix_cli_line_process_one (cm, um, cf, uf, + cf->input_vector[i], action)) + { + /* CRLF found. Consume the bytes from the input_vector */ + vec_delete (cf->input_vector, i + matched, 0); + /* And tell our caller to execute cf->input_command */ + return 0; + } + } i += matched; } - vec_reset_length(cf->input_vector); + vec_reset_length (cf->input_vector); return 1; } /** \brief Process input to a CLI session. */ -static void unix_cli_process_input (unix_cli_main_t * cm, - uword cli_file_index) +static void +unix_cli_process_input (unix_cli_main_t * cm, uword cli_file_index) { - unix_main_t * um = &unix_main; - unix_file_t * uf; - unix_cli_file_t * cf = pool_elt_at_index (cm->cli_file_pool, cli_file_index); + unix_main_t *um = &unix_main; + unix_file_t *uf; + unix_cli_file_t *cf = pool_elt_at_index (cm->cli_file_pool, cli_file_index); unformat_input_t input; int vlib_parse_eval (u8 *); more: /* Try vlibplex first. Someday... */ if (0 && vlib_parse_eval (cf->input_vector) == 0) - goto done; + goto done; if (cf->line_mode) { @@ -1961,23 +1985,21 @@ more: { /* Line edit, echo, etc. */ if (unix_cli_line_edit (cm, um, cf)) - /* want more input */ - return; + /* want more input */ + return; } if (um->log_fd) { - static u8 * lv; + static u8 *lv; vec_reset_length (lv); - lv = format (lv, "%U[%d]: %v", - format_timeval, - 0 /* current bat-time */, - 0 /* current bat-format */, - cli_file_index, - cf->input_vector); + lv = format (lv, "%U[%d]: %v", + format_timeval, 0 /* current bat-time */ , + 0 /* current bat-format */ , + cli_file_index, cf->input_vector); { - int rv __attribute__((unused)) = - write (um->log_fd, lv, vec_len(lv)); + int rv __attribute__ ((unused)) = + write (um->log_fd, lv, vec_len (lv)); } } @@ -1988,10 +2010,11 @@ more: (void) unformat (&input, ""); cm->current_input_file_index = cli_file_index; - cf->pager_start = 0; /* start a new pager session */ + cf->pager_start = 0; /* start a new pager session */ if (unformat_check_input (&input) != UNFORMAT_END_OF_INPUT) - vlib_cli_input (um->vlib_main, &input, unix_vlib_cli_output, cli_file_index); + vlib_cli_input (um->vlib_main, &input, unix_vlib_cli_output, + cli_file_index); /* Zero buffer since otherwise unformat_free will call vec_free on it. */ input.buffer = 0; @@ -2016,7 +2039,8 @@ done: cf->no_pager = um->cli_no_pager; } - if (vec_len (cf->pager_index) == 0 || vec_len (cf->pager_index) < cf->height) + if (vec_len (cf->pager_index) == 0 + || vec_len (cf->pager_index) < cf->height) { /* There was no need for the pager */ unix_cli_pager_reset (cf); @@ -2027,19 +2051,20 @@ done: else { /* Display the pager prompt */ - unix_cli_pager_prompt(cf, uf); + unix_cli_pager_prompt (cf, uf); } - /* Any residual data in the input vector? */ - if (vec_len (cf->input_vector)) - goto more; + /* Any residual data in the input vector? */ + if (vec_len (cf->input_vector)) + goto more; } -static void unix_cli_kill (unix_cli_main_t * cm, uword cli_file_index) +static void +unix_cli_kill (unix_cli_main_t * cm, uword cli_file_index) { - unix_main_t * um = &unix_main; - unix_cli_file_t * cf; - unix_file_t * uf; + unix_main_t *um = &unix_main; + unix_cli_file_t *cf; + unix_file_t *uf; int i; cf = pool_elt_at_index (cm->cli_file_pool, cli_file_index); @@ -2053,7 +2078,7 @@ static void unix_cli_kill (unix_cli_main_t * cm, uword cli_file_index) vec_free (cf->search_key); for (i = 0; i < vec_len (cf->command_history); i++) - vec_free (cf->command_history[i]); + vec_free (cf->command_history[i]); vec_free (cf->command_history); @@ -2065,11 +2090,10 @@ static void unix_cli_kill (unix_cli_main_t * cm, uword cli_file_index) static uword unix_cli_process (vlib_main_t * vm, - vlib_node_runtime_t * rt, - vlib_frame_t * f) + vlib_node_runtime_t * rt, vlib_frame_t * f) { - unix_cli_main_t * cm = &unix_cli_main; - uword i, * data = 0; + unix_cli_main_t *cm = &unix_cli_main; + uword i, *data = 0; while (1) { @@ -2095,7 +2119,7 @@ unix_cli_process (vlib_main_t * vm, _vec_len (data) = 0; } - done: +done: vec_free (data); vlib_node_set_state (vm, rt->node_index, VLIB_NODE_STATE_DISABLED); @@ -2106,10 +2130,11 @@ unix_cli_process (vlib_main_t * vm, return 0; } -static clib_error_t * unix_cli_write_ready (unix_file_t * uf) +static clib_error_t * +unix_cli_write_ready (unix_file_t * uf) { - unix_cli_main_t * cm = &unix_cli_main; - unix_cli_file_t * cf; + unix_cli_main_t *cm = &unix_cli_main; + unix_cli_file_t *cf; int n; cf = pool_elt_at_index (cm->cli_file_pool, uf->private_data); @@ -2127,18 +2152,20 @@ static clib_error_t * unix_cli_write_ready (unix_file_t * uf) return /* no error */ 0; } -static clib_error_t * unix_cli_read_ready (unix_file_t * uf) +static clib_error_t * +unix_cli_read_ready (unix_file_t * uf) { - unix_main_t * um = &unix_main; - unix_cli_main_t * cm = &unix_cli_main; - unix_cli_file_t * cf; + unix_main_t *um = &unix_main; + unix_cli_main_t *cm = &unix_cli_main; + unix_cli_file_t *cf; uword l; int n, n_read, n_try; cf = pool_elt_at_index (cm->cli_file_pool, uf->private_data); n = n_try = 4096; - while (n == n_try) { + while (n == n_try) + { l = vec_len (cf->input_vector); vec_resize (cf->input_vector, l + n_try); @@ -2146,13 +2173,13 @@ static clib_error_t * unix_cli_read_ready (unix_file_t * uf) /* Error? */ if (n < 0 && errno != EAGAIN) - return clib_error_return_unix (0, "read"); - + return clib_error_return_unix (0, "read"); + n_read = n < 0 ? 0 : n; _vec_len (cf->input_vector) = l + n_read; - } + } - if (! (n < 0)) + if (!(n < 0)) vlib_process_signal_event (um->vlib_main, cf->process_node_index, (n_read == 0 @@ -2168,13 +2195,14 @@ static clib_error_t * unix_cli_read_ready (unix_file_t * uf) * @param fd The file descriptor for the session I/O. * @return The session ID. */ -static u32 unix_cli_file_add (unix_cli_main_t * cm, char * name, int fd) +static u32 +unix_cli_file_add (unix_cli_main_t * cm, char *name, int fd) { - unix_main_t * um = &unix_main; - unix_cli_file_t * cf; - unix_file_t template = {0}; - vlib_main_t * vm = um->vlib_main; - vlib_node_t * n; + unix_main_t *um = &unix_main; + unix_cli_file_t *cf; + unix_file_t template = { 0 }; + vlib_main_t *vm = um->vlib_main; + vlib_node_t *n; name = (char *) format (0, "unix-cli-%s", name); @@ -2221,7 +2249,7 @@ static u32 unix_cli_file_add (unix_cli_main_t * cm, char * name, int fd) vlib_start_process (vm, n->runtime_index); - vlib_process_t * p = vlib_get_process_from_node(vm, n); + vlib_process_t *p = vlib_get_process_from_node (vm, n); p->output_function = unix_vlib_cli_output; p->output_function_arg = cf - cm->cli_file_pool; @@ -2229,15 +2257,16 @@ static u32 unix_cli_file_add (unix_cli_main_t * cm, char * name, int fd) } /** Telnet listening socket has a new connection. */ -static clib_error_t * unix_cli_listen_read_ready (unix_file_t * uf) +static clib_error_t * +unix_cli_listen_read_ready (unix_file_t * uf) { - unix_main_t * um = &unix_main; - unix_cli_main_t * cm = &unix_cli_main; - clib_socket_t * s = &um->cli_listen_socket; + unix_main_t *um = &unix_main; + unix_cli_main_t *cm = &unix_cli_main; + clib_socket_t *s = &um->cli_listen_socket; clib_socket_t client; - char * client_name; - clib_error_t * error; - unix_cli_file_t * cf; + char *client_name; + clib_error_t *error; + unix_cli_file_t *cf; u32 cf_index; error = clib_socket_accept (s, &client); @@ -2262,16 +2291,16 @@ static clib_error_t * unix_cli_listen_read_ready (unix_file_t * uf) * Technically these should be negotiated, but this works. */ u8 charmode_option[] = { - IAC, WONT, TELOPT_LINEMODE, /* server will do char-by-char */ - IAC, DONT, TELOPT_LINEMODE, /* client should do char-by-char */ - IAC, WILL, TELOPT_SGA, /* server willl supress GA */ - IAC, DO, TELOPT_SGA, /* client should supress Go Ahead */ - IAC, WILL, TELOPT_ECHO, /* server will do echo */ - IAC, DONT, TELOPT_ECHO, /* client should not echo */ - IAC, DO, TELOPT_TTYPE, /* client should tell us its term type */ - IAC, SB, TELOPT_TTYPE, 1, IAC, SE, /* now tell me ttype */ - IAC, DO, TELOPT_NAWS, /* client should tell us its window sz */ - IAC, SB, TELOPT_NAWS, 1, IAC, SE, /* now tell me window size */ + IAC, WONT, TELOPT_LINEMODE, /* server will do char-by-char */ + IAC, DONT, TELOPT_LINEMODE, /* client should do char-by-char */ + IAC, WILL, TELOPT_SGA, /* server willl supress GA */ + IAC, DO, TELOPT_SGA, /* client should supress Go Ahead */ + IAC, WILL, TELOPT_ECHO, /* server will do echo */ + IAC, DONT, TELOPT_ECHO, /* client should not echo */ + IAC, DO, TELOPT_TTYPE, /* client should tell us its term type */ + IAC, SB, TELOPT_TTYPE, 1, IAC, SE, /* now tell me ttype */ + IAC, DO, TELOPT_NAWS, /* client should tell us its window sz */ + IAC, SB, TELOPT_NAWS, 1, IAC, SE, /* now tell me window size */ }; /* Enable history on this CLI */ @@ -2291,7 +2320,7 @@ static clib_error_t * unix_cli_listen_read_ready (unix_file_t * uf) /* Send the telnet options */ unix_vlib_cli_output_raw (cf, uf, charmode_option, - ARRAY_LEN(charmode_option)); + ARRAY_LEN (charmode_option)); /* In case the client doesn't negotiate terminal type, use * a timer to kick off the initial prompt. */ @@ -2307,16 +2336,16 @@ static clib_error_t * unix_cli_listen_read_ready (unix_file_t * uf) static void unix_cli_resize_interrupt (int signum) { - unix_main_t * um = &unix_main; - unix_cli_main_t * cm = &unix_cli_main; - unix_cli_file_t * cf = pool_elt_at_index (cm->cli_file_pool, - cm->stdin_cli_file_index); - unix_file_t * uf = pool_elt_at_index (um->file_pool, cf->unix_file_index); + unix_main_t *um = &unix_main; + unix_cli_main_t *cm = &unix_cli_main; + unix_cli_file_t *cf = pool_elt_at_index (cm->cli_file_pool, + cm->stdin_cli_file_index); + unix_file_t *uf = pool_elt_at_index (um->file_pool, cf->unix_file_index); struct winsize ws; - (void)signum; + (void) signum; /* Terminal resized, fetch the new size */ - ioctl(UNIX_CLI_STDIN_FD, TIOCGWINSZ, &ws); + ioctl (UNIX_CLI_STDIN_FD, TIOCGWINSZ, &ws); cf->width = ws.ws_col; cf->height = ws.ws_row; @@ -2331,16 +2360,16 @@ unix_cli_resize_interrupt (int signum) static clib_error_t * unix_cli_config (vlib_main_t * vm, unformat_input_t * input) { - unix_main_t * um = &unix_main; - unix_cli_main_t * cm = &unix_cli_main; + unix_main_t *um = &unix_main; + unix_cli_main_t *cm = &unix_cli_main; int flags; - clib_error_t * error = 0; - unix_cli_file_t * cf; + clib_error_t *error = 0; + unix_cli_file_t *cf; u32 cf_index; struct termios tio; struct sigaction sa; struct winsize ws; - u8 * term; + u8 *term; /* We depend on unix flags being set. */ if ((error = vlib_call_config_function (vm, unix_config))) @@ -2350,7 +2379,7 @@ unix_cli_config (vlib_main_t * vm, unformat_input_t * input) { /* Set stdin to be non-blocking. */ if ((flags = fcntl (UNIX_CLI_STDIN_FD, F_GETFL, 0)) < 0) - flags = 0; + flags = 0; fcntl (UNIX_CLI_STDIN_FD, F_SETFL, flags | O_NONBLOCK); cf_index = unix_cli_file_add (cm, "stdin", UNIX_CLI_STDIN_FD); @@ -2359,85 +2388,87 @@ unix_cli_config (vlib_main_t * vm, unformat_input_t * input) /* If stdin is a tty and we are using chacracter mode, enable * history on the CLI and set the tty line discipline accordingly. */ - if (isatty(UNIX_CLI_STDIN_FD) && um->cli_line_mode == 0) - { - /* Capture terminal resize events */ - sa.sa_handler = unix_cli_resize_interrupt; - sa.sa_flags = 0; - if (sigaction (SIGWINCH, &sa, 0) < 0) - clib_panic ("sigaction"); - - /* Retrieve the current terminal size */ - ioctl(UNIX_CLI_STDIN_FD, TIOCGWINSZ, &ws); - cf->width = ws.ws_col; - cf->height = ws.ws_row; - - if (cf->width == 0 || cf->height == 0) - /* We have a tty, but no size. Stick to line mode. */ - goto notty; - - /* Setup the history */ - cf->history_limit = um->cli_history_limit; - cf->has_history = cf->history_limit != 0; - - /* Setup the pager */ - cf->no_pager = um->cli_no_pager; - - /* We're going to be in char by char mode */ - cf->line_mode = 0; - - /* Save the original tty state so we can restore it later */ - tcgetattr(UNIX_CLI_STDIN_FD, &um->tio_stdin); - um->tio_isset = 1; - - /* Tweak the tty settings */ - tio = um->tio_stdin; - /* echo off, canonical mode off, ext'd input processing off */ - tio.c_lflag &= ~(ECHO | ICANON | IEXTEN); - tio.c_cc[VMIN] = 1; /* 1 byte at a time */ - tio.c_cc[VTIME] = 0; /* no timer */ - tcsetattr(UNIX_CLI_STDIN_FD, TCSAFLUSH, &tio); - - /* See if we can do ANSI/VT100 output */ - term = (u8 *)getenv("TERM"); - if (term != NULL) - cf->ansi_capable = unix_cli_terminal_type(term, - strlen((char *)term)); - } + if (isatty (UNIX_CLI_STDIN_FD) && um->cli_line_mode == 0) + { + /* Capture terminal resize events */ + sa.sa_handler = unix_cli_resize_interrupt; + sa.sa_flags = 0; + if (sigaction (SIGWINCH, &sa, 0) < 0) + clib_panic ("sigaction"); + + /* Retrieve the current terminal size */ + ioctl (UNIX_CLI_STDIN_FD, TIOCGWINSZ, &ws); + cf->width = ws.ws_col; + cf->height = ws.ws_row; + + if (cf->width == 0 || cf->height == 0) + /* We have a tty, but no size. Stick to line mode. */ + goto notty; + + /* Setup the history */ + cf->history_limit = um->cli_history_limit; + cf->has_history = cf->history_limit != 0; + + /* Setup the pager */ + cf->no_pager = um->cli_no_pager; + + /* We're going to be in char by char mode */ + cf->line_mode = 0; + + /* Save the original tty state so we can restore it later */ + tcgetattr (UNIX_CLI_STDIN_FD, &um->tio_stdin); + um->tio_isset = 1; + + /* Tweak the tty settings */ + tio = um->tio_stdin; + /* echo off, canonical mode off, ext'd input processing off */ + tio.c_lflag &= ~(ECHO | ICANON | IEXTEN); + tio.c_cc[VMIN] = 1; /* 1 byte at a time */ + tio.c_cc[VTIME] = 0; /* no timer */ + tcsetattr (UNIX_CLI_STDIN_FD, TCSAFLUSH, &tio); + + /* See if we can do ANSI/VT100 output */ + term = (u8 *) getenv ("TERM"); + if (term != NULL) + cf->ansi_capable = unix_cli_terminal_type (term, + strlen ((char *) + term)); + } else - { - notty: - /* No tty, so make sure these things are off */ - cf->no_pager = 1; - cf->history_limit = 0; - cf->has_history = 0; - cf->line_mode = 1; - } + { + notty: + /* No tty, so make sure these things are off */ + cf->no_pager = 1; + cf->history_limit = 0; + cf->has_history = 0; + cf->line_mode = 1; + } /* Send banner and initial prompt */ - unix_cli_file_welcome(cm, cf); + unix_cli_file_welcome (cm, cf); } /* If we have socket config, LISTEN, otherwise, don't */ - clib_socket_t * s = &um->cli_listen_socket; - if(s->config && s->config[0] != 0) { - /* CLI listen. */ - unix_file_t template = {0}; + clib_socket_t *s = &um->cli_listen_socket; + if (s->config && s->config[0] != 0) + { + /* CLI listen. */ + unix_file_t template = { 0 }; - s->flags = SOCKET_IS_SERVER; /* listen, don't connect */ - error = clib_socket_init (s); + s->flags = SOCKET_IS_SERVER; /* listen, don't connect */ + error = clib_socket_init (s); - if (error) - return error; + if (error) + return error; - template.read_function = unix_cli_listen_read_ready; - template.file_descriptor = s->fd; + template.read_function = unix_cli_listen_read_ready; + template.file_descriptor = s->fd; - unix_file_add (um, &template); - } + unix_file_add (um, &template); + } /* Set CLI prompt. */ - if (! cm->cli_prompt) + if (!cm->cli_prompt) cm->cli_prompt = format (0, "VLIB: "); return 0; @@ -2451,11 +2482,11 @@ VLIB_CONFIG_FUNCTION (unix_cli_config, "unix-cli"); static clib_error_t * unix_cli_exit (vlib_main_t * vm) { - unix_main_t * um = &unix_main; + unix_main_t *um = &unix_main; /* If stdin is a tty and we saved the tty state, reset the tty state */ - if (isatty(UNIX_CLI_STDIN_FD) && um->tio_isset) - tcsetattr(UNIX_CLI_STDIN_FD, TCSAFLUSH, &um->tio_stdin); + if (isatty (UNIX_CLI_STDIN_FD) && um->tio_isset) + tcsetattr (UNIX_CLI_STDIN_FD, TCSAFLUSH, &um->tio_stdin); return 0; } @@ -2467,10 +2498,11 @@ VLIB_MAIN_LOOP_EXIT_FUNCTION (unix_cli_exit); * @note This setting is global; it impacts all current * and future CLI sessions. */ -void vlib_unix_cli_set_prompt (char * prompt) +void +vlib_unix_cli_set_prompt (char *prompt) { - char * fmt = (prompt[strlen(prompt)-1] == ' ') ? "%s" : "%s "; - unix_cli_main_t * cm = &unix_cli_main; + char *fmt = (prompt[strlen (prompt) - 1] == ' ') ? "%s" : "%s "; + unix_cli_main_t *cm = &unix_cli_main; if (cm->cli_prompt) vec_free (cm->cli_prompt); cm->cli_prompt = format (0, fmt, prompt); @@ -2482,10 +2514,9 @@ void vlib_unix_cli_set_prompt (char * prompt) */ static clib_error_t * unix_cli_quit (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { - unix_cli_main_t * cm = &unix_cli_main; + unix_cli_main_t *cm = &unix_cli_main; vlib_process_signal_event (vm, vlib_current_process (vm), @@ -2494,28 +2525,29 @@ unix_cli_quit (vlib_main_t * vm, return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (unix_cli_quit_command, static) = { .path = "quit", .short_help = "Exit CLI", .function = unix_cli_quit, }; +/* *INDENT-ON* */ /** CLI command to execute a VPP command script. */ static clib_error_t * unix_cli_exec (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { - char * file_name; + char *file_name; int fd; unformat_input_t sub_input; - clib_error_t * error; + clib_error_t *error; file_name = 0; fd = -1; error = 0; - if (! unformat (input, "%s", &file_name)) + if (!unformat (input, "%s", &file_name)) { error = clib_error_return (0, "expecting file name, got `%U'", format_unformat_error, input); @@ -2538,8 +2570,8 @@ unix_cli_exec (vlib_main_t * vm, error = clib_error_return_unix (0, "failed to stat `%s'", file_name); goto done; } - - if (! (S_ISREG (s.st_mode) || S_ISLNK (s.st_mode))) + + if (!(S_ISREG (s.st_mode) || S_ISLNK (s.st_mode))) { error = clib_error_return (0, "not a regular file `%s'", file_name); goto done; @@ -2551,7 +2583,7 @@ unix_cli_exec (vlib_main_t * vm, vlib_cli_input (vm, &sub_input, 0, 0); unformat_free (&sub_input); - done: +done: if (fd > 0) close (fd); vec_free (file_name); @@ -2559,45 +2591,51 @@ unix_cli_exec (vlib_main_t * vm, return error; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (cli_exec, static) = { .path = "exec", .short_help = "Execute commands from file", .function = unix_cli_exec, .is_mp_safe = 1, }; +/* *INDENT-ON* */ /** CLI command to show various unix error statistics. */ static clib_error_t * unix_show_errors (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { - unix_main_t * um = &unix_main; - clib_error_t * error = 0; + unix_main_t *um = &unix_main; + clib_error_t *error = 0; int i, n_errors_to_show; - unix_error_history_t * unix_errors = 0; + unix_error_history_t *unix_errors = 0; n_errors_to_show = 1 << 30; if (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { - if (! unformat (input, "%d", &n_errors_to_show)) + if (!unformat (input, "%d", &n_errors_to_show)) { - error = clib_error_return (0, "expecting integer number of errors to show, got `%U'", - format_unformat_error, input); + error = + clib_error_return (0, + "expecting integer number of errors to show, got `%U'", + format_unformat_error, input); goto done; } } - n_errors_to_show = clib_min (ARRAY_LEN (um->error_history), n_errors_to_show); + n_errors_to_show = + clib_min (ARRAY_LEN (um->error_history), n_errors_to_show); - i = um->error_history_index > 0 ? um->error_history_index - 1 : ARRAY_LEN (um->error_history) - 1; + i = + um->error_history_index > + 0 ? um->error_history_index - 1 : ARRAY_LEN (um->error_history) - 1; while (n_errors_to_show > 0) { - unix_error_history_t * eh = um->error_history + i; + unix_error_history_t *eh = um->error_history + i; - if (! eh->error) + if (!eh->error) break; vec_add1 (unix_errors, eh[0]); @@ -2615,7 +2653,7 @@ unix_show_errors (vlib_main_t * vm, vlib_cli_output (vm, "%Ld total errors seen", um->n_total_errors); for (i = vec_len (unix_errors) - 1; i >= 0; i--) { - unix_error_history_t * eh = vec_elt_at_index (unix_errors, i); + unix_error_history_t *eh = vec_elt_at_index (unix_errors, i); vlib_cli_output (vm, "%U: %U", format_time_interval, "h:m:s:u", eh->time, format_clib_error, eh->error); @@ -2624,34 +2662,35 @@ unix_show_errors (vlib_main_t * vm, format_time_interval, "h:m:s:u", vlib_time_now (vm)); } - done: +done: vec_free (unix_errors); return error; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (cli_unix_show_errors, static) = { .path = "show unix-errors", .short_help = "Show Unix system call error history", .function = unix_show_errors, }; +/* *INDENT-ON* */ /** CLI command to show session command history. */ static clib_error_t * unix_cli_show_history (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { - unix_cli_main_t * cm = &unix_cli_main; - unix_cli_file_t * cf; + unix_cli_main_t *cm = &unix_cli_main; + unix_cli_file_t *cf; int i, j; cf = pool_elt_at_index (cm->cli_file_pool, cm->current_input_file_index); if (cf->has_history && cf->history_limit) { - i = 1 + cf->command_number - vec_len(cf->command_history); + i = 1 + cf->command_number - vec_len (cf->command_history); for (j = 0; j < vec_len (cf->command_history); j++) - vlib_cli_output (vm, "%d %v\n", i + j, cf->command_history[j]); + vlib_cli_output (vm, "%d %v\n", i + j, cf->command_history[j]); } else { @@ -2661,153 +2700,166 @@ unix_cli_show_history (vlib_main_t * vm, return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (cli_unix_cli_show_history, static) = { .path = "history", .short_help = "Show current session command history", .function = unix_cli_show_history, }; +/* *INDENT-ON* */ /** CLI command to show terminal status. */ static clib_error_t * unix_cli_show_terminal (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { - unix_main_t * um = &unix_main; - unix_cli_main_t * cm = &unix_cli_main; - unix_cli_file_t * cf; - vlib_node_t * n; + unix_main_t *um = &unix_main; + unix_cli_main_t *cm = &unix_cli_main; + unix_cli_file_t *cf; + vlib_node_t *n; cf = pool_elt_at_index (cm->cli_file_pool, cm->current_input_file_index); n = vlib_get_node (vm, cf->process_node_index); vlib_cli_output (vm, "Terminal name: %v\n", n->name); - vlib_cli_output (vm, "Terminal mode: %s\n", cf->line_mode ? - "line-by-line" : - "char-by-char"); + vlib_cli_output (vm, "Terminal mode: %s\n", cf->line_mode ? + "line-by-line" : "char-by-char"); vlib_cli_output (vm, "Terminal width: %d\n", cf->width); vlib_cli_output (vm, "Terminal height: %d\n", cf->height); - vlib_cli_output (vm, "ANSI capable: %s\n", cf->ansi_capable ? "yes" : "no"); + vlib_cli_output (vm, "ANSI capable: %s\n", + cf->ansi_capable ? "yes" : "no"); vlib_cli_output (vm, "History enabled: %s%s\n", - cf->has_history ? "yes" : "no", - !cf->has_history || cf->history_limit ? "" : " (disabled by history limit)"); + cf->has_history ? "yes" : "no", !cf->has_history + || cf->history_limit ? "" : + " (disabled by history limit)"); if (cf->has_history) vlib_cli_output (vm, "History limit: %d\n", cf->history_limit); vlib_cli_output (vm, "Pager enabled: %s%s%s\n", - cf->no_pager ? "no" : "yes", - cf->no_pager || cf->height ? "" : " (disabled by terminal height)", - cf->no_pager || um->cli_pager_buffer_limit ? "" : " (disabled by buffer limit)"); + cf->no_pager ? "no" : "yes", + cf->no_pager + || cf->height ? "" : " (disabled by terminal height)", + cf->no_pager + || um->cli_pager_buffer_limit ? "" : + " (disabled by buffer limit)"); if (!cf->no_pager) vlib_cli_output (vm, "Pager limit: %d\n", um->cli_pager_buffer_limit); - vlib_cli_output (vm, "CRLF mode: %s\n", cf->crlf_mode ? "CR+LF" : "LF"); + vlib_cli_output (vm, "CRLF mode: %s\n", + cf->crlf_mode ? "CR+LF" : "LF"); return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (cli_unix_cli_show_terminal, static) = { .path = "show terminal", .short_help = "Show current session terminal settings", .function = unix_cli_show_terminal, }; +/* *INDENT-ON* */ /** CLI command to set terminal pager settings. */ static clib_error_t * unix_cli_set_terminal_pager (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, + vlib_cli_command_t * cmd) { - unix_main_t * um = &unix_main; - unix_cli_main_t * cm = &unix_cli_main; - unix_cli_file_t * cf; - unformat_input_t _line_input, * line_input = &_line_input; + unix_main_t *um = &unix_main; + unix_cli_main_t *cm = &unix_cli_main; + unix_cli_file_t *cf; + unformat_input_t _line_input, *line_input = &_line_input; - if (! unformat_user (input, unformat_line_input, line_input)) + if (!unformat_user (input, unformat_line_input, line_input)) return 0; cf = pool_elt_at_index (cm->cli_file_pool, cm->current_input_file_index); while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) { - if (unformat (line_input, "on")) - cf->no_pager = 0; - else if (unformat (line_input, "off")) - cf->no_pager = 1; - else if (unformat (line_input, "limit %u", &um->cli_pager_buffer_limit)) - vlib_cli_output (vm, "Pager limit set to %u lines; note, this is global.\n", - um->cli_pager_buffer_limit); - else - return clib_error_return (0, "unknown parameter: `%U`", - format_unformat_error, line_input); - } + if (unformat (line_input, "on")) + cf->no_pager = 0; + else if (unformat (line_input, "off")) + cf->no_pager = 1; + else if (unformat (line_input, "limit %u", &um->cli_pager_buffer_limit)) + vlib_cli_output (vm, + "Pager limit set to %u lines; note, this is global.\n", + um->cli_pager_buffer_limit); + else + return clib_error_return (0, "unknown parameter: `%U`", + format_unformat_error, line_input); + } - unformat_free(line_input); + unformat_free (line_input); return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (cli_unix_cli_set_terminal_pager, static) = { .path = "set terminal pager", .short_help = "set terminal pager [on|off] [limit <lines>]", .function = unix_cli_set_terminal_pager, }; +/* *INDENT-ON* */ /** CLI command to set terminal history settings. */ static clib_error_t * unix_cli_set_terminal_history (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, + vlib_cli_command_t * cmd) { - unix_cli_main_t * cm = &unix_cli_main; - unix_cli_file_t * cf; - unformat_input_t _line_input, * line_input = &_line_input; + unix_cli_main_t *cm = &unix_cli_main; + unix_cli_file_t *cf; + unformat_input_t _line_input, *line_input = &_line_input; u32 limit; - if (! unformat_user (input, unformat_line_input, line_input)) + if (!unformat_user (input, unformat_line_input, line_input)) return 0; cf = pool_elt_at_index (cm->cli_file_pool, cm->current_input_file_index); while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) { - if (unformat (line_input, "on")) - cf->has_history = 1; - else if (unformat (line_input, "off")) - cf->has_history = 0; - else if (unformat (line_input, "limit %u", &cf->history_limit)) - ; - else - return clib_error_return (0, "unknown parameter: `%U`", - format_unformat_error, line_input); - - /* If we reduced history size, or turned it off, purge the history */ - limit = cf->has_history ? cf->history_limit : 0; - - while (cf->command_history && vec_len(cf->command_history) >= limit) - { - vec_free (cf->command_history[0]); - vec_delete (cf->command_history, 1, 0); - } - } + if (unformat (line_input, "on")) + cf->has_history = 1; + else if (unformat (line_input, "off")) + cf->has_history = 0; + else if (unformat (line_input, "limit %u", &cf->history_limit)) + ; + else + return clib_error_return (0, "unknown parameter: `%U`", + format_unformat_error, line_input); + + /* If we reduced history size, or turned it off, purge the history */ + limit = cf->has_history ? cf->history_limit : 0; - unformat_free(line_input); + while (cf->command_history && vec_len (cf->command_history) >= limit) + { + vec_free (cf->command_history[0]); + vec_delete (cf->command_history, 1, 0); + } + } + + unformat_free (line_input); return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (cli_unix_cli_set_terminal_history, static) = { .path = "set terminal history", .short_help = "set terminal history [on|off] [limit <lines>]", .function = unix_cli_set_terminal_history, }; +/* *INDENT-ON* */ /** CLI command to set terminal ANSI settings. */ static clib_error_t * unix_cli_set_terminal_ansi (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, + vlib_cli_command_t * cmd) { - unix_cli_main_t * cm = &unix_cli_main; - unix_cli_file_t * cf; + unix_cli_main_t *cm = &unix_cli_main; + unix_cli_file_t *cf; cf = pool_elt_at_index (cm->cli_file_pool, cm->current_input_file_index); @@ -2817,16 +2869,18 @@ unix_cli_set_terminal_ansi (vlib_main_t * vm, cf->ansi_capable = 0; else return clib_error_return (0, "unknown parameter: `%U`", - format_unformat_error, input); + format_unformat_error, input); return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (cli_unix_cli_set_terminal_ansi, static) = { .path = "set terminal ansi", .short_help = "set terminal ansi [on|off]", .function = unix_cli_set_terminal_ansi, }; +/* *INDENT-ON* */ static clib_error_t * unix_cli_init (vlib_main_t * vm) @@ -2835,3 +2889,11 @@ unix_cli_init (vlib_main_t * vm) } VLIB_INIT_FUNCTION (unix_cli_init); + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/unix/input.c b/vlib/vlib/unix/input.c index 543e2c000a7..b4f2ba537a4 100644 --- a/vlib/vlib/unix/input.c +++ b/vlib/vlib/unix/input.c @@ -48,9 +48,10 @@ #include <sys/epoll.h> -typedef struct { +typedef struct +{ int epoll_fd; - struct epoll_event * epoll_events; + struct epoll_event *epoll_events; /* Statistics. */ u64 epoll_files_ready; @@ -60,11 +61,10 @@ typedef struct { static linux_epoll_main_t linux_epoll_main; static void -linux_epoll_file_update (unix_file_t * f, - unix_file_update_type_t update_type) +linux_epoll_file_update (unix_file_t * f, unix_file_update_type_t update_type) { - unix_main_t * um = &unix_main; - linux_epoll_main_t * em = &linux_epoll_main; + unix_main_t *um = &unix_main; + linux_epoll_main_t *em = &linux_epoll_main; struct epoll_event e; memset (&e, 0, sizeof (e)); @@ -72,8 +72,8 @@ linux_epoll_file_update (unix_file_t * f, e.events = EPOLLIN; if (f->flags & UNIX_FILE_DATA_AVAILABLE_TO_WRITE) e.events |= EPOLLOUT; - if (f->flags & UNIX_FILE_EVENT_EDGE_TRIGGERED) - e.events |= EPOLLET; + if (f->flags & UNIX_FILE_EVENT_EDGE_TRIGGERED) + e.events |= EPOLLET; e.data.u32 = f - um->file_pool; if (epoll_ctl (em->epoll_fd, @@ -81,24 +81,21 @@ linux_epoll_file_update (unix_file_t * f, ? EPOLL_CTL_ADD : (update_type == UNIX_FILE_UPDATE_MODIFY ? EPOLL_CTL_MOD - : EPOLL_CTL_DEL)), - f->file_descriptor, - &e) < 0) + : EPOLL_CTL_DEL)), f->file_descriptor, &e) < 0) clib_warning ("epoll_ctl"); } static uword linux_epoll_input (vlib_main_t * vm, - vlib_node_runtime_t * node, - vlib_frame_t * frame) + vlib_node_runtime_t * node, vlib_frame_t * frame) { - unix_main_t * um = &unix_main; - linux_epoll_main_t * em = &linux_epoll_main; - struct epoll_event * e; + unix_main_t *um = &unix_main; + linux_epoll_main_t *em = &linux_epoll_main; + struct epoll_event *e; int n_fds_ready; { - vlib_node_main_t * nm = &vm->node_main; + vlib_node_main_t *nm = &vm->node_main; u64 t = nm->cpu_time_next_process_ready; f64 timeout; int timeout_ms, max_timeout_ms = 10; @@ -114,9 +111,9 @@ linux_epoll_input (vlib_main_t * vm, timeout = (((i64) t - (i64) clib_cpu_time_now ()) * vm->clib_time.seconds_per_clock) - /* subtract off some slop time */ - 50e-6; + /* subtract off some slop time */ - 50e-6; timeout_ms = timeout * 1e3; - + /* Must be between 1 and 10 ms. */ timeout_ms = clib_max (1, timeout_ms); timeout_ms = clib_min (max_timeout_ms, timeout_ms); @@ -127,9 +124,9 @@ linux_epoll_input (vlib_main_t * vm, if (nm->input_node_counts_by_state[VLIB_NODE_STATE_POLLING] > 0) timeout_ms = 0; - /* - * When busy: don't wait & only epoll for input - * every 1024 times through main loop. + /* + * When busy: don't wait & only epoll for input + * every 1024 times through main loop. */ if (vector_rate > 1 || vm->api_queue_nonempty) { @@ -144,26 +141,24 @@ linux_epoll_input (vlib_main_t * vm, { static sigset_t unblock_all_signals; n_fds_ready = epoll_pwait (em->epoll_fd, - em->epoll_events, - vec_len (em->epoll_events), - timeout_ms, - &unblock_all_signals); - + em->epoll_events, + vec_len (em->epoll_events), + timeout_ms, &unblock_all_signals); + /* This kludge is necessary to run over absurdly old kernels */ if (n_fds_ready < 0 && errno == ENOSYS) - { - n_fds_ready = epoll_wait (em->epoll_fd, - em->epoll_events, - vec_len (em->epoll_events), - timeout_ms); - } + { + n_fds_ready = epoll_wait (em->epoll_fd, + em->epoll_events, + vec_len (em->epoll_events), timeout_ms); + } } } if (n_fds_ready < 0) { if (unix_error_is_fatal (errno)) - vlib_panic_with_error (vm, clib_error_return_unix (0, "epoll_wait")); + vlib_panic_with_error (vm, clib_error_return_unix (0, "epoll_wait")); /* non fatal error (e.g. EINTR). */ return 0; @@ -175,11 +170,11 @@ linux_epoll_input (vlib_main_t * vm, for (e = em->epoll_events; e < em->epoll_events + n_fds_ready; e++) { u32 i = e->data.u32; - unix_file_t * f = pool_elt_at_index (um->file_pool, i); - clib_error_t * errors[4]; + unix_file_t *f = pool_elt_at_index (um->file_pool, i); + clib_error_t *errors[4]; int n_errors = 0; - if (PREDICT_TRUE (! (e->events & EPOLLERR))) + if (PREDICT_TRUE (!(e->events & EPOLLERR))) { if (e->events & EPOLLIN) { @@ -194,13 +189,13 @@ linux_epoll_input (vlib_main_t * vm, } else { - if (f->error_function) - { - errors[n_errors] = f->error_function (f); - n_errors += errors[n_errors] != 0; - } + if (f->error_function) + { + errors[n_errors] = f->error_function (f); + n_errors += errors[n_errors] != 0; + } else - close(f->file_descriptor); + close (f->file_descriptor); } ASSERT (n_errors < ARRAY_LEN (errors)); @@ -213,18 +208,20 @@ linux_epoll_input (vlib_main_t * vm, return 0; } +/* *INDENT-OFF* */ VLIB_REGISTER_NODE (linux_epoll_input_node,static) = { .function = linux_epoll_input, .type = VLIB_NODE_TYPE_PRE_INPUT, .name = "unix-epoll-input", }; +/* *INDENT-ON* */ clib_error_t * linux_epoll_input_init (vlib_main_t * vm) { - linux_epoll_main_t * em = &linux_epoll_main; - unix_main_t * um = &unix_main; - + linux_epoll_main_t *em = &linux_epoll_main; + unix_main_t *um = &unix_main; + /* Allocate some events. */ vec_resize (em->epoll_events, VLIB_FRAME_SIZE); @@ -248,3 +245,11 @@ unix_input_init (vlib_main_t * vm) } VLIB_INIT_FUNCTION (unix_input_init); + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/unix/main.c b/vlib/vlib/unix/main.c index 9049644f5b3..b8753f4df93 100644 --- a/vlib/vlib/unix/main.c +++ b/vlib/vlib/unix/main.c @@ -59,21 +59,21 @@ unix_main_t unix_main; static clib_error_t * unix_main_init (vlib_main_t * vm) { - unix_main_t * um = &unix_main; + unix_main_t *um = &unix_main; um->vlib_main = vm; return vlib_call_init_function (vm, unix_input_init); } VLIB_INIT_FUNCTION (unix_main_init); -static void unix_signal_handler (int signum, siginfo_t * si, ucontext_t * uc) +static void +unix_signal_handler (int signum, siginfo_t * si, ucontext_t * uc) { uword fatal; - u8 * msg = 0; + u8 *msg = 0; msg = format (msg, "received signal %U, PC %U", - format_signal, signum, - format_ucontext_pc, uc); + format_signal, signum, format_ucontext_pc, uc); if (signum == SIGSEGV) msg = format (msg, ", faulting address %p", si->si_addr); @@ -82,13 +82,13 @@ static void unix_signal_handler (int signum, siginfo_t * si, ucontext_t * uc) { /* these (caught) signals cause the application to exit */ case SIGTERM: - if (unix_main.vlib_main->main_loop_exit_set) - { - syslog (LOG_ERR | LOG_DAEMON, "received SIGTERM, exiting..."); + if (unix_main.vlib_main->main_loop_exit_set) + { + syslog (LOG_ERR | LOG_DAEMON, "received SIGTERM, exiting..."); - clib_longjmp (&unix_main.vlib_main->main_loop_exit, - VLIB_MAIN_LOOP_EXIT_CLI); - } + clib_longjmp (&unix_main.vlib_main->main_loop_exit, + VLIB_MAIN_LOOP_EXIT_CLI); + } case SIGQUIT: case SIGINT: case SIGILL: @@ -133,21 +133,21 @@ setup_signal_handlers (unix_main_t * um) switch (i) { - /* these signals take the default action */ - case SIGABRT: + /* these signals take the default action */ + case SIGABRT: case SIGKILL: case SIGSTOP: - case SIGUSR1: - case SIGUSR2: + case SIGUSR1: + case SIGUSR2: continue; - /* ignore SIGPIPE, SIGCHLD */ + /* ignore SIGPIPE, SIGCHLD */ case SIGPIPE: case SIGCHLD: sa.sa_sigaction = (void *) SIG_IGN; break; - /* catch and handle all other signals */ + /* catch and handle all other signals */ default: break; } @@ -159,9 +159,10 @@ setup_signal_handlers (unix_main_t * um) return 0; } -static void unix_error_handler (void * arg, u8 * msg, int msg_len) +static void +unix_error_handler (void *arg, u8 * msg, int msg_len) { - unix_main_t * um = arg; + unix_main_t *um = arg; /* Echo to stderr when interactive. */ if (um->flags & UNIX_FLAG_INTERACTIVE) @@ -173,46 +174,46 @@ static void unix_error_handler (void * arg, u8 * msg, int msg_len) char save = msg[msg_len - 1]; /* Null Terminate. */ - msg[msg_len-1] = 0; + msg[msg_len - 1] = 0; syslog (LOG_ERR | LOG_DAEMON, "%s", msg); - msg[msg_len-1] = save; + msg[msg_len - 1] = save; } } -void vlib_unix_error_report (vlib_main_t * vm, clib_error_t * error) +void +vlib_unix_error_report (vlib_main_t * vm, clib_error_t * error) { - unix_main_t * um = &unix_main; + unix_main_t *um = &unix_main; - if (um->flags & UNIX_FLAG_INTERACTIVE || error == 0) - return; + if (um->flags & UNIX_FLAG_INTERACTIVE || error == 0) + return; - { - char save; - u8 * msg; - u32 msg_len; + { + char save; + u8 *msg; + u32 msg_len; - msg = error->what; - msg_len = vec_len(msg); + msg = error->what; + msg_len = vec_len (msg); - /* Null Terminate. */ - save = msg[msg_len-1]; - msg[msg_len-1] = 0; + /* Null Terminate. */ + save = msg[msg_len - 1]; + msg[msg_len - 1] = 0; - syslog (LOG_ERR | LOG_DAEMON, "%s", msg); + syslog (LOG_ERR | LOG_DAEMON, "%s", msg); - msg[msg_len-1] = save; - } + msg[msg_len - 1] = save; + } } static uword startup_config_process (vlib_main_t * vm, - vlib_node_runtime_t * rt, - vlib_frame_t * f) + vlib_node_runtime_t * rt, vlib_frame_t * f) { - unix_main_t * um = &unix_main; - u8 * buf = 0; + unix_main_t *um = &unix_main; + u8 *buf = 0; uword l, n = 1; vlib_process_suspend (vm, 2.0); @@ -220,91 +221,95 @@ startup_config_process (vlib_main_t * vm, while (um->unix_config_complete == 0) vlib_process_suspend (vm, 0.1); - if (um->startup_config_filename) { - unformat_input_t sub_input; - int fd; - struct stat s; - char *fn = (char *)um->startup_config_filename; - - fd = open (fn, O_RDONLY); - if (fd < 0) { - clib_warning ("failed to open `%s'", fn); - return 0; - } + if (um->startup_config_filename) + { + unformat_input_t sub_input; + int fd; + struct stat s; + char *fn = (char *) um->startup_config_filename; - if (fstat (fd, &s) < 0) { - clib_warning ("failed to stat `%s'", fn); - bail: - close(fd); - return 0; - } - - if (! (S_ISREG (s.st_mode) || S_ISLNK (s.st_mode))) { - clib_warning ("not a regular file: `%s'", fn); - goto bail; - } + fd = open (fn, O_RDONLY); + if (fd < 0) + { + clib_warning ("failed to open `%s'", fn); + return 0; + } - while (n > 0) - { - l = vec_len (buf); - vec_resize (buf, 4096); - n = read (fd, buf + l, 4096); - if (n > 0) - { - _vec_len (buf) = l + n; - if (n < 4096) - break; - } - else - break; - } - if (um->log_fd && vec_len (buf)) - { - u8 * lv = 0; - lv = format (lv, "%U: ***** Startup Config *****\n%v", - format_timeval, - 0 /* current bat-time */, - 0 /* current bat-format */, - buf); + if (fstat (fd, &s) < 0) { - int rv __attribute__((unused)) = - write (um->log_fd, lv, vec_len(lv)); + clib_warning ("failed to stat `%s'", fn); + bail: + close (fd); + return 0; } - vec_reset_length (lv); - lv = format (lv, "%U: ***** End Startup Config *****\n", - format_timeval, - 0 /* current bat-time */, - 0 /* current bat-format */); + + if (!(S_ISREG (s.st_mode) || S_ISLNK (s.st_mode))) { - int rv __attribute__((unused)) = - write (um->log_fd, lv, vec_len(lv)); + clib_warning ("not a regular file: `%s'", fn); + goto bail; } - vec_free (lv); - } - - if (vec_len(buf)) - { - unformat_init_vector (&sub_input, buf); - vlib_cli_input (vm, &sub_input, 0, 0); - /* frees buf for us */ - unformat_free (&sub_input); - } - close(fd); - } + + while (n > 0) + { + l = vec_len (buf); + vec_resize (buf, 4096); + n = read (fd, buf + l, 4096); + if (n > 0) + { + _vec_len (buf) = l + n; + if (n < 4096) + break; + } + else + break; + } + if (um->log_fd && vec_len (buf)) + { + u8 *lv = 0; + lv = format (lv, "%U: ***** Startup Config *****\n%v", + format_timeval, 0 /* current bat-time */ , + 0 /* current bat-format */ , + buf); + { + int rv __attribute__ ((unused)) = + write (um->log_fd, lv, vec_len (lv)); + } + vec_reset_length (lv); + lv = format (lv, "%U: ***** End Startup Config *****\n", + format_timeval, 0 /* current bat-time */ , + 0 /* current bat-format */ ); + { + int rv __attribute__ ((unused)) = + write (um->log_fd, lv, vec_len (lv)); + } + vec_free (lv); + } + + if (vec_len (buf)) + { + unformat_init_vector (&sub_input, buf); + vlib_cli_input (vm, &sub_input, 0, 0); + /* frees buf for us */ + unformat_free (&sub_input); + } + close (fd); + } return 0; } +/* *INDENT-OFF* */ VLIB_REGISTER_NODE (startup_config_node,static) = { .function = startup_config_process, .type = VLIB_NODE_TYPE_PROCESS, .name = "startup-config-process", }; +/* *INDENT-ON* */ static clib_error_t * unix_config (vlib_main_t * vm, unformat_input_t * input) { - unix_main_t * um = &unix_main; - clib_error_t * error = 0; + unix_main_t *um = &unix_main; + clib_error_t *error = 0; /* Defaults */ um->cli_pager_buffer_limit = UNIX_CLI_DEFAULT_PAGER_LIMIT; @@ -312,76 +317,76 @@ unix_config (vlib_main_t * vm, unformat_input_t * input) while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { - char * cli_prompt; + char *cli_prompt; if (unformat (input, "interactive")) um->flags |= UNIX_FLAG_INTERACTIVE; else if (unformat (input, "nodaemon")) - um->flags |= UNIX_FLAG_NODAEMON; + um->flags |= UNIX_FLAG_NODAEMON; else if (unformat (input, "cli-prompt %s", &cli_prompt)) vlib_unix_cli_set_prompt (cli_prompt); - else if (unformat (input, "cli-listen %s", &um->cli_listen_socket.config)) + else + if (unformat (input, "cli-listen %s", &um->cli_listen_socket.config)) ; else if (unformat (input, "cli-line-mode")) - um->cli_line_mode = 1; + um->cli_line_mode = 1; else if (unformat (input, "cli-no-banner")) - um->cli_no_banner = 1; + um->cli_no_banner = 1; else if (unformat (input, "cli-no-pager")) - um->cli_no_pager = 1; + um->cli_no_pager = 1; else if (unformat (input, "cli-pager-buffer-limit %d", - &um->cli_pager_buffer_limit)) - ; - else if (unformat (input, "cli-history-limit %d", &um->cli_history_limit)) - ; + &um->cli_pager_buffer_limit)) + ; + else + if (unformat (input, "cli-history-limit %d", &um->cli_history_limit)) + ; else if (unformat (input, "full-coredump")) - { - int fd; - - fd = open ("/proc/self/coredump_filter", O_WRONLY); - if (fd > 0) - { - if (write (fd, "0x6f\n", 5) != 5) - clib_unix_warning ("coredump filter write failed!"); - close(fd); - } - else - clib_unix_warning ("couldn't open /proc/self/coredump_filter"); - } - else if (unformat (input, "startup-config %s", - &um->startup_config_filename)) - ; - else if (unformat (input, "exec %s", - &um->startup_config_filename)) - ; + { + int fd; + + fd = open ("/proc/self/coredump_filter", O_WRONLY); + if (fd > 0) + { + if (write (fd, "0x6f\n", 5) != 5) + clib_unix_warning ("coredump filter write failed!"); + close (fd); + } + else + clib_unix_warning ("couldn't open /proc/self/coredump_filter"); + } + else if (unformat (input, "startup-config %s", + &um->startup_config_filename)) + ; + else if (unformat (input, "exec %s", &um->startup_config_filename)) + ; else if (unformat (input, "log %s", &um->log_filename)) - { - um->log_fd = open ((char *) um->log_filename, - O_CREAT | O_WRONLY | O_APPEND, 0644); - if (um->log_fd < 0) - { - clib_warning ("couldn't open log '%s'\n", um->log_filename); - um->log_fd = 0; - } - else - { - u8 * lv = 0; - lv = format (0, "%U: ***** Start: PID %d *****\n", - format_timeval, - 0 /* current bat-time */, - 0 /* current bat-format */, - getpid()); + { + um->log_fd = open ((char *) um->log_filename, + O_CREAT | O_WRONLY | O_APPEND, 0644); + if (um->log_fd < 0) + { + clib_warning ("couldn't open log '%s'\n", um->log_filename); + um->log_fd = 0; + } + else + { + u8 *lv = 0; + lv = format (0, "%U: ***** Start: PID %d *****\n", + format_timeval, 0 /* current bat-time */ , + 0 /* current bat-format */ , + getpid ()); { - int rv __attribute__((unused)) = - write (um->log_fd, lv, vec_len(lv)); + int rv __attribute__ ((unused)) = + write (um->log_fd, lv, vec_len (lv)); } - vec_free (lv); - } - } + vec_free (lv); + } + } else return clib_error_return (0, "unknown input `%U'", format_unformat_error, input); } - if (! (um->flags & UNIX_FLAG_INTERACTIVE)) + if (!(um->flags & UNIX_FLAG_INTERACTIVE)) { error = setup_signal_handlers (um); if (error) @@ -390,9 +395,9 @@ unix_config (vlib_main_t * vm, unformat_input_t * input) openlog (vm->name, LOG_CONS | LOG_PERROR | LOG_PID, LOG_DAEMON); clib_error_register_handler (unix_error_handler, um); - if (! (um->flags & UNIX_FLAG_NODAEMON) - && daemon (/* chdir to / */ 0, - /* stdin/stdout/stderr -> /dev/null */ 0) < 0) + if (!(um->flags & UNIX_FLAG_NODAEMON) && daemon ( /* chdir to / */ 0, + /* stdin/stdout/stderr -> /dev/null */ + 0) < 0) clib_error_return (0, "daemon () fails"); } um->unix_config_complete = 1; @@ -415,54 +420,56 @@ VLIB_MAIN_LOOP_EXIT_FUNCTION (unix_exit); u8 **vlib_thread_stacks; -static uword thread0 (uword arg) +static uword +thread0 (uword arg) { - vlib_main_t * vm = (vlib_main_t *)arg; + vlib_main_t *vm = (vlib_main_t *) arg; unformat_input_t input; int i; - - unformat_init_command_line (&input, (char **)vm->argv); + + unformat_init_command_line (&input, (char **) vm->argv); i = vlib_main (vm, &input); unformat_free (&input); - + return i; - } +} -int vlib_unix_main (int argc, char * argv[]) +int +vlib_unix_main (int argc, char *argv[]) { - vlib_main_t * vm = &vlib_global_main; /* one and only time for this! */ - - clib_smp_main_t * sm = &clib_smp_main; - vlib_thread_main_t * tm = &vlib_thread_main; + vlib_main_t *vm = &vlib_global_main; /* one and only time for this! */ + + clib_smp_main_t *sm = &clib_smp_main; + vlib_thread_main_t *tm = &vlib_thread_main; unformat_input_t input; - u8 * thread_stacks; - clib_error_t * e; + u8 *thread_stacks; + clib_error_t *e; int i; - vm->argv = (u8 **)argv; + vm->argv = (u8 **) argv; vm->name = argv[0]; vm->heap_base = clib_mem_get_heap (); - ASSERT(vm->heap_base); + ASSERT (vm->heap_base); i = vlib_plugin_early_init (vm); if (i) return i; - - unformat_init_command_line (&input, (char **)vm->argv); + + unformat_init_command_line (&input, (char **) vm->argv); if (vm->init_functions_called == 0) - vm->init_functions_called = hash_create (0, /* value bytes */ 0); - e = vlib_call_all_config_functions (vm, &input, 1 /* early */); + vm->init_functions_called = hash_create (0, /* value bytes */ 0); + e = vlib_call_all_config_functions (vm, &input, 1 /* early */ ); if (e != 0) { - clib_error_report(e); + clib_error_report (e); return 1; } unformat_free (&input); /* allocate N x 1mb stacks, aligned e.g. to a 16mb boundary */ - thread_stacks = clib_mem_alloc_aligned - (tm->n_thread_stacks * VLIB_THREAD_STACK_SIZE, - (VLIB_MAX_CPUS << VLIB_LOG2_THREAD_STACK_SIZE)); + thread_stacks = clib_mem_alloc_aligned + (tm->n_thread_stacks * VLIB_THREAD_STACK_SIZE, + (VLIB_MAX_CPUS << VLIB_LOG2_THREAD_STACK_SIZE)); sm->vm_base = thread_stacks; sm->log2_n_per_cpu_vm_bytes = VLIB_LOG2_THREAD_STACK_SIZE; @@ -472,17 +479,26 @@ int vlib_unix_main (int argc, char * argv[]) { vlib_thread_stacks[i] = thread_stacks; - /* + /* * Disallow writes to the bottom page of the stack, to * catch stack overflows. */ - if (mprotect (thread_stacks, clib_mem_get_page_size(), PROT_READ) < 0) - clib_unix_warning ("thread stack"); + if (mprotect (thread_stacks, clib_mem_get_page_size (), PROT_READ) < 0) + clib_unix_warning ("thread stack"); thread_stacks += VLIB_THREAD_STACK_SIZE; } - - i = clib_calljmp (thread0, (uword) vm, - (void *)(vlib_thread_stacks[0] + VLIB_THREAD_STACK_SIZE)); + + i = clib_calljmp (thread0, (uword) vm, + (void *) (vlib_thread_stacks[0] + + VLIB_THREAD_STACK_SIZE)); return i; } + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/unix/mc_socket.c b/vlib/vlib/unix/mc_socket.c index be68a13c1e2..2077fd7c519 100644 --- a/vlib/vlib/unix/mc_socket.c +++ b/vlib/vlib/unix/mc_socket.c @@ -19,10 +19,11 @@ #include <vlib/unix/mc_socket.h> #include <sys/ioctl.h> /* for FIONBIO */ -#include <netinet/tcp.h> /* for TCP_NODELAY */ +#include <netinet/tcp.h> /* for TCP_NODELAY */ #include <net/if.h> /* for struct ifreq */ -static u8 * format_socket_peer_id (u8 * s, va_list * args) +static u8 * +format_socket_peer_id (u8 * s, va_list * args) { u64 peer_id_as_u64 = va_arg (*args, u64); mc_peer_id_t peer_id; @@ -30,36 +31,34 @@ static u8 * format_socket_peer_id (u8 * s, va_list * args) u32 a = mc_socket_peer_id_get_address (peer_id); u32 p = mc_socket_peer_id_get_port (peer_id); - s = format (s, "%U:%04x", format_network_address, AF_INET, &a, - ntohs (p)); + s = format (s, "%U:%04x", format_network_address, AF_INET, &a, ntohs (p)); return s; } -typedef void (mc_msg_handler_t) (mc_main_t * mcm, void * msg, u32 buffer_index); +typedef void (mc_msg_handler_t) (mc_main_t * mcm, void *msg, + u32 buffer_index); -always_inline void msg_handler (mc_main_t * mcm, - u32 buffer_index, - u32 handler_frees_buffer, - void * _h) +always_inline void +msg_handler (mc_main_t * mcm, + u32 buffer_index, u32 handler_frees_buffer, void *_h) { - vlib_main_t * vm = mcm->vlib_main; - mc_msg_handler_t * h = _h; - vlib_buffer_t * b = vlib_get_buffer (vm, buffer_index); - void * the_msg = vlib_buffer_get_current (b); + vlib_main_t *vm = mcm->vlib_main; + mc_msg_handler_t *h = _h; + vlib_buffer_t *b = vlib_get_buffer (vm, buffer_index); + void *the_msg = vlib_buffer_get_current (b); h (mcm, the_msg, buffer_index); - if (! handler_frees_buffer) + if (!handler_frees_buffer) vlib_buffer_free_one (vm, buffer_index); } static uword append_buffer_index_to_iovec (vlib_main_t * vm, - u32 buffer_index, - struct iovec ** iovs_return) + u32 buffer_index, struct iovec **iovs_return) { - struct iovec * i; - vlib_buffer_t * b; + struct iovec *i; + vlib_buffer_t *b; u32 bi = buffer_index; u32 l = 0; @@ -70,7 +69,7 @@ append_buffer_index_to_iovec (vlib_main_t * vm, i->iov_base = vlib_buffer_get_current (b); i->iov_len = b->current_length; l += i->iov_len; - if (! (b->flags & VLIB_BUFFER_NEXT_PRESENT)) + if (!(b->flags & VLIB_BUFFER_NEXT_PRESENT)) break; bi = b->next_buffer; } @@ -80,11 +79,9 @@ append_buffer_index_to_iovec (vlib_main_t * vm, static clib_error_t * sendmsg_helper (mc_socket_main_t * msm, - int socket, - struct sockaddr_in * tx_addr, - u32 buffer_index) + int socket, struct sockaddr_in *tx_addr, u32 buffer_index) { - vlib_main_t * vm = msm->mc_main.vlib_main; + vlib_main_t *vm = msm->mc_main.vlib_main; struct msghdr h; word n_bytes, n_bytes_tx, n_retries; @@ -105,7 +102,7 @@ sendmsg_helper (mc_socket_main_t * msm, n_retries = 0; while ((n_bytes_tx = sendmsg (socket, &h, /* flags */ 0)) != n_bytes - && errno == EAGAIN) + && errno == EAGAIN) n_retries++; if (n_bytes_tx != n_bytes) { @@ -114,11 +111,13 @@ sendmsg_helper (mc_socket_main_t * msm, } if (n_retries) { - ELOG_TYPE_DECLARE (e) = { - .format = "sendmsg-helper: %d retries", - .format_args = "i4", - }; - struct { u32 retries; } * ed = 0; + ELOG_TYPE_DECLARE (e) = + { + .format = "sendmsg-helper: %d retries",.format_args = "i4",}; + struct + { + u32 retries; + } *ed = 0; ed = ELOG_DATA (&vm->elog_main, e); ed->retries = n_retries; @@ -127,12 +126,12 @@ sendmsg_helper (mc_socket_main_t * msm, } static clib_error_t * -tx_buffer (void * transport, mc_transport_type_t type, u32 buffer_index) +tx_buffer (void *transport, mc_transport_type_t type, u32 buffer_index) { - mc_socket_main_t *msm = (mc_socket_main_t *)transport; - vlib_main_t * vm = msm->mc_main.vlib_main; - mc_multicast_socket_t * ms = &msm->multicast_sockets[type]; - clib_error_t * error; + mc_socket_main_t *msm = (mc_socket_main_t *) transport; + vlib_main_t *vm = msm->mc_main.vlib_main; + mc_multicast_socket_t *ms = &msm->multicast_sockets[type]; + clib_error_t *error; error = sendmsg_helper (msm, ms->socket, &ms->tx_addr, buffer_index); if (type != MC_TRANSPORT_USER_REQUEST_TO_RELAY) vlib_buffer_free_one (vm, buffer_index); @@ -143,9 +142,9 @@ static clib_error_t * tx_ack (void *transport, mc_peer_id_t dest_peer_id, u32 buffer_index) { struct sockaddr_in tx_addr; - mc_socket_main_t *msm = (mc_socket_main_t *)transport; - vlib_main_t * vm = msm->mc_main.vlib_main; - clib_error_t * error; + mc_socket_main_t *msm = (mc_socket_main_t *) transport; + vlib_main_t *vm = msm->mc_main.vlib_main; + clib_error_t *error; memset (&tx_addr, 0, sizeof (tx_addr)); tx_addr.sin_family = AF_INET; @@ -160,12 +159,11 @@ tx_ack (void *transport, mc_peer_id_t dest_peer_id, u32 buffer_index) static clib_error_t * recvmsg_helper (mc_socket_main_t * msm, int socket, - struct sockaddr_in * rx_addr, - u32 * buffer_index, - u32 drop_message) + struct sockaddr_in *rx_addr, + u32 * buffer_index, u32 drop_message) { - vlib_main_t * vm = msm->mc_main.vlib_main; - vlib_buffer_t * b; + vlib_main_t *vm = msm->mc_main.vlib_main; + vlib_buffer_t *b; uword n_left, n_alloc, n_mtu, i, i_rx; const uword buffer_size = VLIB_BUFFER_DEFAULT_FREE_LIST_BYTES; word n_bytes_left; @@ -177,7 +175,8 @@ recvmsg_helper (mc_socket_main_t * msm, { uword max_alloc = 8 * n_mtu; vec_validate (msm->rx_buffers, max_alloc - 1); - n_alloc = vlib_buffer_alloc (vm, msm->rx_buffers + n_left, max_alloc - n_left); + n_alloc = + vlib_buffer_alloc (vm, msm->rx_buffers + n_left, max_alloc - n_left); _vec_len (msm->rx_buffers) = n_left + n_alloc; } @@ -225,7 +224,8 @@ recvmsg_helper (mc_socket_main_t * msm, b->flags = 0; b->current_data = 0; - b->current_length = n_bytes_left < buffer_size ? n_bytes_left : buffer_size; + b->current_length = + n_bytes_left < buffer_size ? n_bytes_left : buffer_size; n_bytes_left -= buffer_size; @@ -239,19 +239,22 @@ recvmsg_helper (mc_socket_main_t * msm, _vec_len (msm->rx_buffers) = i_rx; - return 0 /* no error */; + return 0 /* no error */ ; } -static clib_error_t * mastership_socket_read_ready (unix_file_t * uf) +static clib_error_t * +mastership_socket_read_ready (unix_file_t * uf) { - mc_socket_main_t *msm = (mc_socket_main_t *)uf->private_data; - mc_main_t * mcm = &msm->mc_main; - mc_multicast_socket_t * ms = &msm->multicast_sockets[MC_TRANSPORT_MASTERSHIP]; - clib_error_t * error; + mc_socket_main_t *msm = (mc_socket_main_t *) uf->private_data; + mc_main_t *mcm = &msm->mc_main; + mc_multicast_socket_t *ms = + &msm->multicast_sockets[MC_TRANSPORT_MASTERSHIP]; + clib_error_t *error; u32 bi; - error = recvmsg_helper (msm, ms->socket, /* rx_addr */ 0, &bi, /* drop_message */ 0); - if (! error) + error = recvmsg_helper (msm, ms->socket, /* rx_addr */ 0, &bi, /* drop_message */ + 0); + if (!error) msg_handler (mcm, bi, /* handler_frees_buffer */ 0, mc_msg_master_assert_handler); @@ -259,45 +262,53 @@ static clib_error_t * mastership_socket_read_ready (unix_file_t * uf) return error; } -static clib_error_t * to_relay_socket_read_ready (unix_file_t * uf) +static clib_error_t * +to_relay_socket_read_ready (unix_file_t * uf) { - mc_socket_main_t *msm = (mc_socket_main_t *)uf->private_data; + mc_socket_main_t *msm = (mc_socket_main_t *) uf->private_data; mc_main_t *mcm = &msm->mc_main; - vlib_main_t * vm = msm->mc_main.vlib_main; - mc_multicast_socket_t * ms_to_relay = &msm->multicast_sockets[MC_TRANSPORT_USER_REQUEST_TO_RELAY]; - mc_multicast_socket_t * ms_from_relay = &msm->multicast_sockets[MC_TRANSPORT_USER_REQUEST_FROM_RELAY]; - clib_error_t * error; + vlib_main_t *vm = msm->mc_main.vlib_main; + mc_multicast_socket_t *ms_to_relay = + &msm->multicast_sockets[MC_TRANSPORT_USER_REQUEST_TO_RELAY]; + mc_multicast_socket_t *ms_from_relay = + &msm->multicast_sockets[MC_TRANSPORT_USER_REQUEST_FROM_RELAY]; + clib_error_t *error; u32 bi; u32 is_master = mcm->relay_state == MC_RELAY_STATE_MASTER; /* Not the ordering master? Turf the msg */ error = recvmsg_helper (msm, ms_to_relay->socket, /* rx_addr */ 0, &bi, - /* drop_message */ ! is_master); + /* drop_message */ !is_master); /* If we are the master, number and rebroadcast the msg. */ - if (! error && is_master) + if (!error && is_master) { - vlib_buffer_t * b = vlib_get_buffer (vm, bi); - mc_msg_user_request_t * mp = vlib_buffer_get_current (b); + vlib_buffer_t *b = vlib_get_buffer (vm, bi); + mc_msg_user_request_t *mp = vlib_buffer_get_current (b); mp->global_sequence = clib_host_to_net_u32 (mcm->relay_global_sequence); mcm->relay_global_sequence++; - error = sendmsg_helper (msm, ms_from_relay->socket, &ms_from_relay->tx_addr, bi); + error = + sendmsg_helper (msm, ms_from_relay->socket, &ms_from_relay->tx_addr, + bi); vlib_buffer_free_one (vm, bi); } return error; } -static clib_error_t * from_relay_socket_read_ready (unix_file_t * uf) +static clib_error_t * +from_relay_socket_read_ready (unix_file_t * uf) { - mc_socket_main_t *msm = (mc_socket_main_t *)uf->private_data; - mc_main_t * mcm = &msm->mc_main; - mc_multicast_socket_t * ms = &msm->multicast_sockets[MC_TRANSPORT_USER_REQUEST_FROM_RELAY]; - clib_error_t * error; + mc_socket_main_t *msm = (mc_socket_main_t *) uf->private_data; + mc_main_t *mcm = &msm->mc_main; + mc_multicast_socket_t *ms = + &msm->multicast_sockets[MC_TRANSPORT_USER_REQUEST_FROM_RELAY]; + clib_error_t *error; u32 bi; - error = recvmsg_helper (msm, ms->socket, /* rx_addr */ 0, &bi, /* drop_message */ 0); - if (! error) + error = recvmsg_helper (msm, ms->socket, /* rx_addr */ 0, &bi, /* drop_message */ + 0); + if (!error) { msg_handler (mcm, bi, /* handler_frees_buffer */ 1, mc_msg_user_request_handler); @@ -305,20 +316,22 @@ static clib_error_t * from_relay_socket_read_ready (unix_file_t * uf) return error; } -static clib_error_t * join_socket_read_ready (unix_file_t * uf) +static clib_error_t * +join_socket_read_ready (unix_file_t * uf) { - mc_socket_main_t *msm = (mc_socket_main_t *)uf->private_data; - mc_main_t * mcm = &msm->mc_main; - vlib_main_t * vm = mcm->vlib_main; - mc_multicast_socket_t * ms = &msm->multicast_sockets[MC_TRANSPORT_JOIN]; - clib_error_t * error; + mc_socket_main_t *msm = (mc_socket_main_t *) uf->private_data; + mc_main_t *mcm = &msm->mc_main; + vlib_main_t *vm = mcm->vlib_main; + mc_multicast_socket_t *ms = &msm->multicast_sockets[MC_TRANSPORT_JOIN]; + clib_error_t *error; u32 bi; - error = recvmsg_helper (msm, ms->socket, /* rx_addr */ 0, &bi, /* drop_message */ 0); - if (! error) + error = recvmsg_helper (msm, ms->socket, /* rx_addr */ 0, &bi, /* drop_message */ + 0); + if (!error) { - vlib_buffer_t * b = vlib_get_buffer (vm, bi); - mc_msg_join_or_leave_request_t * mp = vlib_buffer_get_current (b); + vlib_buffer_t *b = vlib_get_buffer (vm, bi); + mc_msg_join_or_leave_request_t *mp = vlib_buffer_get_current (b); switch (clib_host_to_net_u32 (mp->type)) { @@ -340,23 +353,25 @@ static clib_error_t * join_socket_read_ready (unix_file_t * uf) return error; } -static clib_error_t * ack_socket_read_ready (unix_file_t * uf) +static clib_error_t * +ack_socket_read_ready (unix_file_t * uf) { - mc_socket_main_t *msm = (mc_socket_main_t *)uf->private_data; - mc_main_t * mcm = &msm->mc_main; - clib_error_t * error; + mc_socket_main_t *msm = (mc_socket_main_t *) uf->private_data; + mc_main_t *mcm = &msm->mc_main; + clib_error_t *error; u32 bi; - error = recvmsg_helper (msm, msm->ack_socket, /* rx_addr */ 0, &bi, /* drop_message */ 0); - if (! error) + error = recvmsg_helper (msm, msm->ack_socket, /* rx_addr */ 0, &bi, + /* drop_message */ 0); + if (!error) msg_handler (mcm, bi, /* handler_frees_buffer */ 0, mc_msg_user_ack_handler); return error; } -static void catchup_cleanup (mc_socket_main_t *msm, - mc_socket_catchup_t *c, - unix_main_t *um, unix_file_t *uf) +static void +catchup_cleanup (mc_socket_main_t * msm, + mc_socket_catchup_t * c, unix_main_t * um, unix_file_t * uf) { hash_unset (msm->catchup_index_by_file_descriptor, uf->file_descriptor); unix_file_del (um, uf); @@ -366,23 +381,29 @@ static void catchup_cleanup (mc_socket_main_t *msm, } static mc_socket_catchup_t * -find_catchup_from_file_descriptor (mc_socket_main_t * msm, int file_descriptor) +find_catchup_from_file_descriptor (mc_socket_main_t * msm, + int file_descriptor) { - uword * p = hash_get (msm->catchup_index_by_file_descriptor, file_descriptor); + uword *p = + hash_get (msm->catchup_index_by_file_descriptor, file_descriptor); return p ? pool_elt_at_index (msm->catchups, p[0]) : 0; } -static clib_error_t * catchup_socket_read_ready (unix_file_t * uf, int is_server) +static clib_error_t * +catchup_socket_read_ready (unix_file_t * uf, int is_server) { - unix_main_t * um = &unix_main; - mc_socket_main_t *msm = (mc_socket_main_t *)uf->private_data; + unix_main_t *um = &unix_main; + mc_socket_main_t *msm = (mc_socket_main_t *) uf->private_data; mc_main_t *mcm = &msm->mc_main; - mc_socket_catchup_t * c = find_catchup_from_file_descriptor (msm, uf->file_descriptor); + mc_socket_catchup_t *c = + find_catchup_from_file_descriptor (msm, uf->file_descriptor); word l, n, is_eof; l = vec_len (c->input_vector); vec_resize (c->input_vector, 4096); - n = read (uf->file_descriptor, c->input_vector + l, vec_len (c->input_vector) - l); + n = + read (uf->file_descriptor, c->input_vector + l, + vec_len (c->input_vector) - l); is_eof = n == 0; if (n < 0) @@ -402,43 +423,50 @@ static clib_error_t * catchup_socket_read_ready (unix_file_t * uf, int is_server { if (is_server) { - mc_msg_catchup_request_handler (mcm, (void *) c->input_vector, c - msm->catchups); + mc_msg_catchup_request_handler (mcm, (void *) c->input_vector, + c - msm->catchups); _vec_len (c->input_vector) = 0; } else { - mc_msg_catchup_reply_handler (mcm, (void *) c->input_vector, c - msm->catchups); + mc_msg_catchup_reply_handler (mcm, (void *) c->input_vector, + c - msm->catchups); c->input_vector = 0; /* reply handler is responsible for freeing vector */ catchup_cleanup (msm, c, um, uf); } } - return 0 /* no error */; + return 0 /* no error */ ; } -static clib_error_t * catchup_server_read_ready (unix_file_t * uf) -{ return catchup_socket_read_ready (uf, /* is_server */ 1); } +static clib_error_t * +catchup_server_read_ready (unix_file_t * uf) +{ + return catchup_socket_read_ready (uf, /* is_server */ 1); +} -static clib_error_t * catchup_client_read_ready (unix_file_t * uf) -{ - if (MC_EVENT_LOGGING) - { - mc_socket_main_t *msm = (mc_socket_main_t *)uf->private_data; - vlib_main_t * vm = msm->mc_main.vlib_main; - - ELOG_TYPE (e, "catchup_client_read_ready"); - ELOG (&vm->elog_main, e, 0); - } - return catchup_socket_read_ready (uf, /* is_server */ 0); +static clib_error_t * +catchup_client_read_ready (unix_file_t * uf) +{ + if (MC_EVENT_LOGGING) + { + mc_socket_main_t *msm = (mc_socket_main_t *) uf->private_data; + vlib_main_t *vm = msm->mc_main.vlib_main; + + ELOG_TYPE (e, "catchup_client_read_ready"); + ELOG (&vm->elog_main, e, 0); + } + return catchup_socket_read_ready (uf, /* is_server */ 0); } -static clib_error_t * +static clib_error_t * catchup_socket_write_ready (unix_file_t * uf, int is_server) { - unix_main_t * um = &unix_main; - mc_socket_main_t *msm = (mc_socket_main_t *)uf->private_data; - mc_socket_catchup_t *c = find_catchup_from_file_descriptor (msm, uf->file_descriptor); - clib_error_t * error = 0; + unix_main_t *um = &unix_main; + mc_socket_main_t *msm = (mc_socket_main_t *) uf->private_data; + mc_socket_catchup_t *c = + find_catchup_from_file_descriptor (msm, uf->file_descriptor); + clib_error_t *error = 0; int n; if (c->connect_in_progress) @@ -447,50 +475,54 @@ catchup_socket_write_ready (unix_file_t * uf, int is_server) c->connect_in_progress = 0; len = sizeof (value); - if (getsockopt (c->socket, SOL_SOCKET, - SO_ERROR, &value, &len) < 0) + if (getsockopt (c->socket, SOL_SOCKET, SO_ERROR, &value, &len) < 0) { error = clib_error_return_unix (0, "getsockopt SO_ERROR"); goto error_quit; } if (value != 0) { - error = clib_error_return_code (0, value, CLIB_ERROR_ERRNO_VALID, "connect fails"); + error = + clib_error_return_code (0, value, CLIB_ERROR_ERRNO_VALID, + "connect fails"); goto error_quit; } } - while (1) + while (1) { u32 n_this_write; - - n_this_write = - clib_min (vec_len (c->output_vector) - c->output_vector_n_written, - msm->rx_mtu_n_bytes - 64 /* ip + tcp + option allowance */); + + n_this_write = + clib_min (vec_len (c->output_vector) - c->output_vector_n_written, + msm->rx_mtu_n_bytes - + 64 /* ip + tcp + option allowance */ ); if (n_this_write <= 0) - break; - - do { - n = write (uf->file_descriptor, - c->output_vector + c->output_vector_n_written, - n_this_write); - } while (n < 0 && errno == EAGAIN); - + break; + + do + { + n = write (uf->file_descriptor, + c->output_vector + c->output_vector_n_written, + n_this_write); + } + while (n < 0 && errno == EAGAIN); + if (n < 0) - { - error = clib_error_return_unix (0, "write"); - goto error_quit; - } + { + error = clib_error_return_unix (0, "write"); + goto error_quit; + } c->output_vector_n_written += n; - } + } if (c->output_vector_n_written >= vec_len (c->output_vector)) { - if (! is_server) + if (!is_server) { - uf->flags &= ~UNIX_FILE_DATA_AVAILABLE_TO_WRITE; - unix_main.file_update (uf, UNIX_FILE_UPDATE_MODIFY); + uf->flags &= ~UNIX_FILE_DATA_AVAILABLE_TO_WRITE; + unix_main.file_update (uf, UNIX_FILE_UPDATE_MODIFY); /* Send EOF to other side. */ shutdown (uf->file_descriptor, SHUT_WR); return error; @@ -504,41 +536,48 @@ catchup_socket_write_ready (unix_file_t * uf, int is_server) return error; } -static clib_error_t * +static clib_error_t * catchup_server_write_ready (unix_file_t * uf) -{ return catchup_socket_write_ready (uf, /* is_server */ 1); } +{ + return catchup_socket_write_ready (uf, /* is_server */ 1); +} -static clib_error_t * +static clib_error_t * catchup_client_write_ready (unix_file_t * uf) -{ return catchup_socket_write_ready (uf, /* is_server */ 0); } +{ + return catchup_socket_write_ready (uf, /* is_server */ 0); +} -static clib_error_t *catchup_socket_error_ready (unix_file_t *uf) +static clib_error_t * +catchup_socket_error_ready (unix_file_t * uf) { unix_main_t *um = &unix_main; - mc_socket_main_t *msm = (mc_socket_main_t *)uf->private_data; - mc_socket_catchup_t *c = find_catchup_from_file_descriptor (msm, uf->file_descriptor); + mc_socket_main_t *msm = (mc_socket_main_t *) uf->private_data; + mc_socket_catchup_t *c = + find_catchup_from_file_descriptor (msm, uf->file_descriptor); catchup_cleanup (msm, c, um, uf); return clib_error_return (0, "error"); } -static clib_error_t *catchup_listen_read_ready (unix_file_t * uf) +static clib_error_t * +catchup_listen_read_ready (unix_file_t * uf) { - mc_socket_main_t *msm = (mc_socket_main_t *)uf->private_data; + mc_socket_main_t *msm = (mc_socket_main_t *) uf->private_data; struct sockaddr_in client_addr; int client_len; mc_socket_catchup_t *c; - unix_file_t template = {0}; + unix_file_t template = { 0 }; pool_get (msm->catchups, c); - memset(c, 0, sizeof (c[0])); + memset (c, 0, sizeof (c[0])); + + client_len = sizeof (client_addr); - client_len = sizeof(client_addr); - /* Acquires the non-blocking attrib from the server socket. */ - c->socket = accept (uf->file_descriptor, - (struct sockaddr *)&client_addr, - (socklen_t *)&client_len); - + c->socket = accept (uf->file_descriptor, + (struct sockaddr *) &client_addr, + (socklen_t *) & client_len); + if (c->socket < 0) { pool_put (msm->catchups, c); @@ -547,26 +586,29 @@ static clib_error_t *catchup_listen_read_ready (unix_file_t * uf) if (MC_EVENT_LOGGING) { - mc_main_t * mcm = &msm->mc_main; - vlib_main_t * vm = mcm->vlib_main; + mc_main_t *mcm = &msm->mc_main; + vlib_main_t *vm = mcm->vlib_main; - ELOG_TYPE_DECLARE (e) = { - .format = "catchup accepted from 0x%lx", - .format_args = "i4", - }; - struct { u32 addr; } * ed = 0; + ELOG_TYPE_DECLARE (e) = + { + .format = "catchup accepted from 0x%lx",.format_args = "i4",}; + struct + { + u32 addr; + } *ed = 0; ed = ELOG_DATA (&vm->elog_main, e); - ed->addr = ntohl(client_addr.sin_addr.s_addr); + ed->addr = ntohl (client_addr.sin_addr.s_addr); } /* Disable the Nagle algorithm, ship catchup pkts immediately */ { int one = 1; - if ((setsockopt(c->socket, IPPROTO_TCP, - TCP_NODELAY, (void *)&one, sizeof(one))) < 0) { - clib_unix_warning("catchup socket: set TCP_NODELAY"); - } + if ((setsockopt (c->socket, IPPROTO_TCP, + TCP_NODELAY, (void *) &one, sizeof (one))) < 0) + { + clib_unix_warning ("catchup socket: set TCP_NODELAY"); + } } template.read_function = catchup_server_read_ready; @@ -575,19 +617,21 @@ static clib_error_t *catchup_listen_read_ready (unix_file_t * uf) template.file_descriptor = c->socket; template.private_data = pointer_to_uword (msm); c->unix_file_index = unix_file_add (&unix_main, &template); - hash_set (msm->catchup_index_by_file_descriptor, c->socket, c - msm->catchups); + hash_set (msm->catchup_index_by_file_descriptor, c->socket, + c - msm->catchups); return 0; } /* Return and bind to an unused port. */ -static word find_and_bind_to_free_port (word sock, word port) +static word +find_and_bind_to_free_port (word sock, word port) { for (; port < 1 << 16; port++) { struct sockaddr_in a; - memset (&a, 0, sizeof(a)); /* Warnings be gone */ + memset (&a, 0, sizeof (a)); /* Warnings be gone */ a.sin_family = PF_INET; a.sin_addr.s_addr = INADDR_ANY; @@ -596,54 +640,57 @@ static word find_and_bind_to_free_port (word sock, word port) if (bind (sock, (struct sockaddr *) &a, sizeof (a)) >= 0) break; } - + return port < 1 << 16 ? port : -1; } static clib_error_t * setup_mutlicast_socket (mc_socket_main_t * msm, mc_multicast_socket_t * ms, - char * type, - uword udp_port) + char *type, uword udp_port) { int one = 1; struct ip_mreq mcast_req; - if (! msm->multicast_ttl) + if (!msm->multicast_ttl) msm->multicast_ttl = 1; /* mastership (multicast) TX socket */ if ((ms->socket = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) - return clib_error_return_unix(0, "%s socket", type); + return clib_error_return_unix (0, "%s socket", type); { u8 ttl = msm->multicast_ttl; - if ((setsockopt(ms->socket, IPPROTO_IP, - IP_MULTICAST_TTL, (void *)&ttl, sizeof(ttl))) < 0) - return clib_error_return_unix(0, "%s set multicast ttl", type); + if ((setsockopt (ms->socket, IPPROTO_IP, + IP_MULTICAST_TTL, (void *) &ttl, sizeof (ttl))) < 0) + return clib_error_return_unix (0, "%s set multicast ttl", type); } - if (setsockopt(ms->socket, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) < 0) + if (setsockopt (ms->socket, SOL_SOCKET, SO_REUSEADDR, &one, sizeof (one)) < + 0) return clib_error_return_unix (0, "%s setsockopt SO_REUSEADDR", type); memset (&ms->tx_addr, 0, sizeof (ms->tx_addr)); ms->tx_addr.sin_family = AF_INET; - ms->tx_addr.sin_addr.s_addr = htonl (msm->multicast_tx_ip4_address_host_byte_order); + ms->tx_addr.sin_addr.s_addr = + htonl (msm->multicast_tx_ip4_address_host_byte_order); ms->tx_addr.sin_port = htons (udp_port); - - if (bind(ms->socket, (struct sockaddr *)&ms->tx_addr, - sizeof (ms->tx_addr)) < 0) - return clib_error_return_unix(0, "%s bind", type); + + if (bind (ms->socket, (struct sockaddr *) &ms->tx_addr, + sizeof (ms->tx_addr)) < 0) + return clib_error_return_unix (0, "%s bind", type); memset (&mcast_req, 0, sizeof (mcast_req)); - mcast_req.imr_multiaddr.s_addr = htonl (msm->multicast_tx_ip4_address_host_byte_order); + mcast_req.imr_multiaddr.s_addr = + htonl (msm->multicast_tx_ip4_address_host_byte_order); mcast_req.imr_interface.s_addr = msm->if_ip4_address_net_byte_order; - if ((setsockopt(ms->socket, IPPROTO_IP, - IP_ADD_MEMBERSHIP, (void *)&mcast_req, - sizeof (mcast_req))) < 0) - return clib_error_return_unix(0, "%s IP_ADD_MEMBERSHIP setsockopt", type); + if ((setsockopt (ms->socket, IPPROTO_IP, + IP_ADD_MEMBERSHIP, (void *) &mcast_req, + sizeof (mcast_req))) < 0) + return clib_error_return_unix (0, "%s IP_ADD_MEMBERSHIP setsockopt", + type); if (ioctl (ms->socket, FIONBIO, &one) < 0) return clib_error_return_unix (0, "%s set FIONBIO", type); @@ -652,7 +699,7 @@ setup_mutlicast_socket (mc_socket_main_t * msm, { u32 len = 1 << 20; socklen_t sl = sizeof (len); - if (setsockopt(ms->socket, SOL_SOCKET, SO_SNDBUF, &len, sl) < 0) + if (setsockopt (ms->socket, SOL_SOCKET, SO_SNDBUF, &len, sl) < 0) clib_unix_error ("setsockopt"); } @@ -660,92 +707,96 @@ setup_mutlicast_socket (mc_socket_main_t * msm, } static clib_error_t * -socket_setup (mc_socket_main_t *msm) +socket_setup (mc_socket_main_t * msm) { int one = 1; - clib_error_t * error; + clib_error_t *error; u32 port; - if (! msm->base_multicast_udp_port_host_byte_order) - msm->base_multicast_udp_port_host_byte_order = - 0xffff - ((MC_N_TRANSPORT_TYPE + 2 /* ack socket, catchup socket */) - - 1); + if (!msm->base_multicast_udp_port_host_byte_order) + msm->base_multicast_udp_port_host_byte_order = + 0xffff - ((MC_N_TRANSPORT_TYPE + 2 /* ack socket, catchup socket */ ) + - 1); port = msm->base_multicast_udp_port_host_byte_order; error = setup_mutlicast_socket (msm, - &msm->multicast_sockets[MC_TRANSPORT_MASTERSHIP], - "mastership", + &msm->multicast_sockets + [MC_TRANSPORT_MASTERSHIP], "mastership", port++); if (error) return error; error = setup_mutlicast_socket (msm, &msm->multicast_sockets[MC_TRANSPORT_JOIN], - "join", - port++); + "join", port++); if (error) return error; error = setup_mutlicast_socket (msm, - &msm->multicast_sockets[MC_TRANSPORT_USER_REQUEST_TO_RELAY], - "to relay", - port++); + &msm->multicast_sockets + [MC_TRANSPORT_USER_REQUEST_TO_RELAY], + "to relay", port++); if (error) return error; error = setup_mutlicast_socket (msm, - &msm->multicast_sockets[MC_TRANSPORT_USER_REQUEST_FROM_RELAY], - "from relay", - port++); + &msm->multicast_sockets + [MC_TRANSPORT_USER_REQUEST_FROM_RELAY], + "from relay", port++); if (error) return error; /* ACK rx socket */ msm->ack_socket = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP); if (msm->ack_socket < 0) - return clib_error_return_unix(0, "ack socket"); + return clib_error_return_unix (0, "ack socket"); msm->ack_udp_port = find_and_bind_to_free_port (msm->ack_socket, port++); if (ioctl (msm->ack_socket, FIONBIO, &one) < 0) return clib_error_return_unix (0, "ack socket FIONBIO"); - msm->catchup_server_socket = socket(AF_INET, SOCK_STREAM, 0); + msm->catchup_server_socket = socket (AF_INET, SOCK_STREAM, 0); if (msm->catchup_server_socket < 0) return clib_error_return_unix (0, "catchup server socket"); - - msm->catchup_tcp_port = find_and_bind_to_free_port (msm->catchup_server_socket, port++); + + msm->catchup_tcp_port = + find_and_bind_to_free_port (msm->catchup_server_socket, port++); if (ioctl (msm->catchup_server_socket, FIONBIO, &one) < 0) return clib_error_return_unix (0, "catchup server socket FIONBIO"); - if (listen(msm->catchup_server_socket, 5) < 0) + if (listen (msm->catchup_server_socket, 5) < 0) return clib_error_return_unix (0, "catchup server socket listen"); - + /* epoll setup for multicast mastership socket */ { - unix_file_t template = {0}; + unix_file_t template = { 0 }; template.read_function = mastership_socket_read_ready; - template.file_descriptor = msm->multicast_sockets[MC_TRANSPORT_MASTERSHIP].socket; + template.file_descriptor = + msm->multicast_sockets[MC_TRANSPORT_MASTERSHIP].socket; template.private_data = (uword) msm; unix_file_add (&unix_main, &template); /* epoll setup for multicast to_relay socket */ template.read_function = to_relay_socket_read_ready; - template.file_descriptor = msm->multicast_sockets[MC_TRANSPORT_USER_REQUEST_TO_RELAY].socket; + template.file_descriptor = + msm->multicast_sockets[MC_TRANSPORT_USER_REQUEST_TO_RELAY].socket; template.private_data = (uword) msm; unix_file_add (&unix_main, &template); /* epoll setup for multicast from_relay socket */ template.read_function = from_relay_socket_read_ready; - template.file_descriptor = msm->multicast_sockets[MC_TRANSPORT_USER_REQUEST_FROM_RELAY].socket; + template.file_descriptor = + msm->multicast_sockets[MC_TRANSPORT_USER_REQUEST_FROM_RELAY].socket; template.private_data = (uword) msm; unix_file_add (&unix_main, &template); template.read_function = join_socket_read_ready; - template.file_descriptor = msm->multicast_sockets[MC_TRANSPORT_JOIN].socket; + template.file_descriptor = + msm->multicast_sockets[MC_TRANSPORT_JOIN].socket; template.private_data = (uword) msm; unix_file_add (&unix_main, &template); @@ -766,11 +817,12 @@ socket_setup (mc_socket_main_t *msm) } static void * -catchup_add_pending_output (mc_socket_catchup_t * c, uword n_bytes, u8 * set_output_vector) +catchup_add_pending_output (mc_socket_catchup_t * c, uword n_bytes, + u8 * set_output_vector) { - unix_file_t * uf = pool_elt_at_index (unix_main.file_pool, - c->unix_file_index); - u8 * result=0; + unix_file_t *uf = pool_elt_at_index (unix_main.file_pool, + c->unix_file_index); + u8 *result = 0; if (set_output_vector) c->output_vector = set_output_vector; @@ -780,19 +832,19 @@ catchup_add_pending_output (mc_socket_catchup_t * c, uword n_bytes, u8 * set_out { int skip_update = 0 != (uf->flags & UNIX_FILE_DATA_AVAILABLE_TO_WRITE); uf->flags |= UNIX_FILE_DATA_AVAILABLE_TO_WRITE; - if (! skip_update) + if (!skip_update) unix_main.file_update (uf, UNIX_FILE_UPDATE_MODIFY); } return result; } -static uword catchup_request_fun (void *transport_main, - u32 stream_index, - mc_peer_id_t catchup_peer_id) +static uword +catchup_request_fun (void *transport_main, + u32 stream_index, mc_peer_id_t catchup_peer_id) { - mc_socket_main_t *msm = (mc_socket_main_t *)transport_main; - mc_main_t * mcm = &msm->mc_main; - vlib_main_t * vm = mcm->vlib_main; + mc_socket_main_t *msm = (mc_socket_main_t *) transport_main; + mc_main_t *mcm = &msm->mc_main; + vlib_main_t *vm = mcm->vlib_main; mc_socket_catchup_t *c; struct sockaddr_in addr; unix_main_t *um = &unix_main; @@ -801,7 +853,7 @@ static uword catchup_request_fun (void *transport_main, pool_get (msm->catchups, c); memset (c, 0, sizeof (*c)); - c->socket = socket(AF_INET, SOCK_STREAM, 0); + c->socket = socket (AF_INET, SOCK_STREAM, 0); if (c->socket < 0) { clib_unix_warning ("socket"); @@ -814,35 +866,37 @@ static uword catchup_request_fun (void *transport_main, return 0; } - memset(&addr, 0, sizeof(addr)); + memset (&addr, 0, sizeof (addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = mc_socket_peer_id_get_address (catchup_peer_id); addr.sin_port = mc_socket_peer_id_get_port (catchup_peer_id); - + c->connect_in_progress = 1; if (MC_EVENT_LOGGING) { - ELOG_TYPE_DECLARE (e) = { - .format = "connecting to peer 0x%Lx", - .format_args = "i8", - }; - struct { u64 peer; } * ed; + ELOG_TYPE_DECLARE (e) = + { + .format = "connecting to peer 0x%Lx",.format_args = "i8",}; + struct + { + u64 peer; + } *ed; ed = ELOG_DATA (&vm->elog_main, e); ed->peer = catchup_peer_id.as_u64; } - - if (connect(c->socket, (const void *)&addr,sizeof(addr)) + + if (connect (c->socket, (const void *) &addr, sizeof (addr)) < 0 && errno != EINPROGRESS) { clib_unix_warning ("connect to %U fails", format_socket_peer_id, catchup_peer_id); return 0; } - + { - unix_file_t template = {0}; - + unix_file_t template = { 0 }; + template.read_function = catchup_client_read_ready; template.write_function = catchup_client_write_ready; template.error_function = catchup_socket_error_ready; @@ -850,13 +904,15 @@ static uword catchup_request_fun (void *transport_main, template.private_data = (uword) msm; c->unix_file_index = unix_file_add (um, &template); - hash_set (msm->catchup_index_by_file_descriptor, c->socket, c - msm->catchups); + hash_set (msm->catchup_index_by_file_descriptor, c->socket, + c - msm->catchups); } { - mc_msg_catchup_request_t * mp; - mp = catchup_add_pending_output (c, sizeof (mp[0]), /* set_output_vector */ 0); - mp->peer_id = msm->mc_main.transport.our_catchup_peer_id; + mc_msg_catchup_request_t *mp; + mp = catchup_add_pending_output (c, sizeof (mp[0]), /* set_output_vector */ + 0); + mp->peer_id = msm->mc_main.transport.our_catchup_peer_id; mp->stream_index = stream_index; mc_byte_swap_msg_catchup_request (mp); } @@ -864,33 +920,36 @@ static uword catchup_request_fun (void *transport_main, return c - msm->catchups; } -static void catchup_send_fun (void *transport_main, uword opaque, u8 * data) +static void +catchup_send_fun (void *transport_main, uword opaque, u8 * data) { - mc_socket_main_t *msm = (mc_socket_main_t *)transport_main; + mc_socket_main_t *msm = (mc_socket_main_t *) transport_main; mc_socket_catchup_t *c = pool_elt_at_index (msm->catchups, opaque); catchup_add_pending_output (c, 0, data); } static int -find_interface_ip4_address (char * if_name, u32 * ip4_address, u32 * mtu) +find_interface_ip4_address (char *if_name, u32 * ip4_address, u32 * mtu) { int fd; struct ifreq ifr; - struct sockaddr_in * sa; + struct sockaddr_in *sa; /* Dig up our IP address */ fd = socket (PF_INET, AF_INET, 0); - if (fd < 0) { - clib_unix_error ("socket"); - return -1; - } + if (fd < 0) + { + clib_unix_error ("socket"); + return -1; + } ifr.ifr_addr.sa_family = AF_INET; - strncpy (ifr.ifr_name, if_name, sizeof(ifr.ifr_name)-1); - if (ioctl (fd, SIOCGIFADDR, &ifr) < 0) { - clib_unix_error ("ioctl(SIOCFIGADDR)"); - return -1; - } + strncpy (ifr.ifr_name, if_name, sizeof (ifr.ifr_name) - 1); + if (ioctl (fd, SIOCGIFADDR, &ifr) < 0) + { + clib_unix_error ("ioctl(SIOCFIGADDR)"); + return -1; + } sa = (void *) &ifr.ifr_addr; clib_memcpy (ip4_address, &sa->sin_addr.s_addr, sizeof (ip4_address[0])); @@ -898,7 +957,7 @@ find_interface_ip4_address (char * if_name, u32 * ip4_address, u32 * mtu) if (ioctl (fd, SIOCGIFMTU, &ifr) < 0) return -1; if (mtu) - *mtu = ifr.ifr_mtu - (/* IP4 header */ 20 + /* UDP header */ 8); + *mtu = ifr.ifr_mtu - ( /* IP4 header */ 20 + /* UDP header */ 8); close (fd); @@ -907,16 +966,16 @@ find_interface_ip4_address (char * if_name, u32 * ip4_address, u32 * mtu) clib_error_t * mc_socket_main_init (mc_socket_main_t * msm, char **intfc_probe_list, - int n_intfcs_to_probe) + int n_intfcs_to_probe) { - clib_error_t * error; - mc_main_t * mcm; + clib_error_t *error; + mc_main_t *mcm; u32 mtu; mcm = &msm->mc_main; /* 239.255.0.7 */ - if (! msm->multicast_tx_ip4_address_host_byte_order) + if (!msm->multicast_tx_ip4_address_host_byte_order) msm->multicast_tx_ip4_address_host_byte_order = 0xefff0007; { @@ -925,12 +984,14 @@ mc_socket_main_init (mc_socket_main_t * msm, char **intfc_probe_list, win = 0; if (msm->multicast_interface_name) { - win = ! find_interface_ip4_address (msm->multicast_interface_name, &a, &mtu); + win = + !find_interface_ip4_address (msm->multicast_interface_name, &a, + &mtu); } else { for (i = 0; i < n_intfcs_to_probe; i++) - if (! find_interface_ip4_address (intfc_probe_list[i], &a, &mtu)) + if (!find_interface_ip4_address (intfc_probe_list[i], &a, &mtu)) { win = 1; msm->multicast_interface_name = intfc_probe_list[i]; @@ -938,25 +999,29 @@ mc_socket_main_init (mc_socket_main_t * msm, char **intfc_probe_list, } } - if (! win) + if (!win) return clib_error_return (0, "can't find interface ip4 address"); msm->if_ip4_address_net_byte_order = a; } msm->rx_mtu_n_bytes = mtu; - msm->rx_mtu_n_buffers = msm->rx_mtu_n_bytes / VLIB_BUFFER_DEFAULT_FREE_LIST_BYTES; - msm->rx_mtu_n_buffers += (msm->rx_mtu_n_bytes % VLIB_BUFFER_DEFAULT_FREE_LIST_BYTES) != 0; + msm->rx_mtu_n_buffers = + msm->rx_mtu_n_bytes / VLIB_BUFFER_DEFAULT_FREE_LIST_BYTES; + msm->rx_mtu_n_buffers += + (msm->rx_mtu_n_bytes % VLIB_BUFFER_DEFAULT_FREE_LIST_BYTES) != 0; error = socket_setup (msm); if (error) return error; mcm->transport.our_ack_peer_id = - mc_socket_set_peer_id (msm->if_ip4_address_net_byte_order, msm->ack_udp_port); + mc_socket_set_peer_id (msm->if_ip4_address_net_byte_order, + msm->ack_udp_port); mcm->transport.our_catchup_peer_id = - mc_socket_set_peer_id (msm->if_ip4_address_net_byte_order, msm->catchup_tcp_port); + mc_socket_set_peer_id (msm->if_ip4_address_net_byte_order, + msm->catchup_tcp_port); mcm->transport.tx_buffer = tx_buffer; mcm->transport.tx_ack = tx_ack; @@ -970,3 +1035,11 @@ mc_socket_main_init (mc_socket_main_t * msm, char **intfc_probe_list, return error; } + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/unix/mc_socket.h b/vlib/vlib/unix/mc_socket.h index 7dd6b5e27b1..273c9ad430b 100644 --- a/vlib/vlib/unix/mc_socket.h +++ b/vlib/vlib/unix/mc_socket.h @@ -21,24 +21,27 @@ #include <vlib/unix/unix.h> #include <netinet/in.h> -typedef struct { +typedef struct +{ int socket; struct sockaddr_in tx_addr; } mc_multicast_socket_t; /* TCP catchup socket */ -typedef struct { +typedef struct +{ int socket; u32 unix_file_index; - u8 * input_vector; - u8 * output_vector; + u8 *input_vector; + u8 *output_vector; u32 output_vector_n_written; u32 connect_in_progress; } mc_socket_catchup_t; -typedef struct mc_socket_main_t { +typedef struct mc_socket_main_t +{ mc_main_t mc_main; /* Multicast mastership/to-relay/from-relay sockets. */ @@ -53,7 +56,7 @@ typedef struct mc_socket_main_t { /* Pool of stream-private catchup sockets */ mc_socket_catchup_t *catchups; - uword * catchup_index_by_file_descriptor; + uword *catchup_index_by_file_descriptor; u32 rx_mtu_n_bytes; @@ -61,19 +64,19 @@ typedef struct mc_socket_main_t { u32 rx_mtu_n_buffers; /* Vector of RX VLIB buffers. */ - u32 * rx_buffers; + u32 *rx_buffers; /* Vector of scatter/gather descriptors for sending/receiving VLIB buffers via kernel. */ - struct iovec * iovecs; + struct iovec *iovecs; /* IP address of interface to use for multicast. */ u32 if_ip4_address_net_byte_order; - + u32 ack_udp_port; u32 catchup_tcp_port; /* Interface on which to listen for multicasts. */ - char * multicast_interface_name; + char *multicast_interface_name; /* Multicast address to use (e.g. 0xefff0000). Host byte order. */ @@ -92,15 +95,15 @@ always_inline u32 mc_socket_peer_id_get_address (mc_peer_id_t i) { u32 a = ((i.as_u8[0] << 24) - | (i.as_u8[1] << 16) - | (i.as_u8[2] << 8) - | (i.as_u8[3] << 0)); + | (i.as_u8[1] << 16) | (i.as_u8[2] << 8) | (i.as_u8[3] << 0)); return clib_host_to_net_u32 (a); } always_inline u32 mc_socket_peer_id_get_port (mc_peer_id_t i) -{ return clib_host_to_net_u16 ((i.as_u8[4] << 8) | i.as_u8[5]); } +{ + return clib_host_to_net_u16 ((i.as_u8[4] << 8) | i.as_u8[5]); +} static_always_inline mc_peer_id_t mc_socket_set_peer_id (u32 address_net_byte_order, u32 port_host_byte_order) @@ -110,17 +113,25 @@ mc_socket_set_peer_id (u32 address_net_byte_order, u32 port_host_byte_order) u32 p = port_host_byte_order; i.as_u8[0] = (a >> 24) & 0xff; i.as_u8[1] = (a >> 16) & 0xff; - i.as_u8[2] = (a >> 8) & 0xff; - i.as_u8[3] = (a >> 0) & 0xff; - i.as_u8[4] = (p >> 8) & 0xff; - i.as_u8[5] = (p >> 0) & 0xff; + i.as_u8[2] = (a >> 8) & 0xff; + i.as_u8[3] = (a >> 0) & 0xff; + i.as_u8[4] = (p >> 8) & 0xff; + i.as_u8[5] = (p >> 0) & 0xff; i.as_u8[6] = 0; i.as_u8[7] = 0; return i; } -clib_error_t * -mc_socket_main_init (mc_socket_main_t * msm, char **intfc_probe_list, - int n_intfcs_to_probe); +clib_error_t *mc_socket_main_init (mc_socket_main_t * msm, + char **intfc_probe_list, + int n_intfcs_to_probe); #endif /* __included_mc_socket_h__ */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/unix/physmem.c b/vlib/vlib/unix/physmem.c index d3155e0c7c9..80ab7b9d6f8 100644 --- a/vlib/vlib/unix/physmem.c +++ b/vlib/vlib/unix/physmem.c @@ -42,11 +42,12 @@ static physmem_main_t physmem_main; static void * -unix_physmem_alloc_aligned (vlib_physmem_main_t * vpm, uword n_bytes, uword alignment) +unix_physmem_alloc_aligned (vlib_physmem_main_t * vpm, uword n_bytes, + uword alignment) { - physmem_main_t * pm = &physmem_main; + physmem_main_t *pm = &physmem_main; uword lo_offset, hi_offset; - uword * to_free = 0; + uword *to_free = 0; #if DPDK > 0 clib_warning ("unsafe alloc!"); @@ -74,7 +75,7 @@ unix_physmem_alloc_aligned (vlib_physmem_main_t * vpm, uword n_bytes, uword alig break; /* Allocation would span chunk boundary, queue it to be freed as soon as - we find suitable chunk. */ + we find suitable chunk. */ vec_add1 (to_free, lo_offset); } @@ -89,43 +90,46 @@ unix_physmem_alloc_aligned (vlib_physmem_main_t * vpm, uword n_bytes, uword alig return lo_offset != ~0 ? pm->heap + lo_offset : 0; } -static void unix_physmem_free (void * x) +static void +unix_physmem_free (void *x) { - physmem_main_t * pm = &physmem_main; + physmem_main_t *pm = &physmem_main; /* Return object to region's heap. */ mheap_put (pm->heap, x - pm->heap); } -static void htlb_shutdown(void) +static void +htlb_shutdown (void) { - physmem_main_t * pm = &physmem_main; - - if (! pm->shmid) + physmem_main_t *pm = &physmem_main; + + if (!pm->shmid) return; shmctl (pm->shmid, IPC_RMID, 0); pm->shmid = 0; } /* try to use huge TLB pgs if possible */ -static int htlb_init (vlib_main_t * vm) +static int +htlb_init (vlib_main_t * vm) { - vlib_physmem_main_t * vpm = &vm->physmem_main; - physmem_main_t * pm = &physmem_main; + vlib_physmem_main_t *vpm = &vm->physmem_main; + physmem_main_t *pm = &physmem_main; u64 hugepagesize, pagesize; u64 pfn, seek_loc; u64 cur, physaddr, ptbits; int fd, i; - pm->shmid = shmget (11 /* key, my amp goes to 11 */, pm->mem_size, - IPC_CREAT | SHM_HUGETLB | SHM_R | SHM_W); + pm->shmid = shmget (11 /* key, my amp goes to 11 */ , pm->mem_size, + IPC_CREAT | SHM_HUGETLB | SHM_R | SHM_W); if (pm->shmid < 0) { clib_unix_warning ("shmget"); return 0; } - pm->mem = shmat (pm->shmid, NULL, 0 /* flags */); + pm->mem = shmat (pm->shmid, NULL, 0 /* flags */ ); if (pm->mem == 0) { shmctl (pm->shmid, IPC_RMID, 0); @@ -135,8 +139,8 @@ static int htlb_init (vlib_main_t * vm) memset (pm->mem, 0, pm->mem_size); /* $$$ get page size info from /proc/meminfo */ - hugepagesize = 2<<20; - pagesize = 4<<10; + hugepagesize = 2 << 20; + pagesize = 4 << 10; vpm->log2_n_bytes_per_page = min_log2 (hugepagesize); vec_resize (vpm->page_table, pm->mem_size / hugepagesize); @@ -145,71 +149,72 @@ static int htlb_init (vlib_main_t * vm) vpm->virtual.size = pm->mem_size; vpm->virtual.end = vpm->virtual.start + vpm->virtual.size; - fd = open("/proc/self/pagemap", O_RDONLY); + fd = open ("/proc/self/pagemap", O_RDONLY); - if (fd < 0) + if (fd < 0) { (void) shmdt (pm->mem); return 0; } - - pm->heap = mheap_alloc_with_flags - (pm->mem, pm->mem_size, - /* Don't want mheap mmap/munmap with IO memory. */ - MHEAP_FLAG_DISABLE_VM); - - cur = pointer_to_uword(pm->mem); + + pm->heap = mheap_alloc_with_flags (pm->mem, pm->mem_size, + /* Don't want mheap mmap/munmap with IO memory. */ + MHEAP_FLAG_DISABLE_VM); + + cur = pointer_to_uword (pm->mem); i = 0; - while (cur < pointer_to_uword(pm->mem) + pm->mem_size) + while (cur < pointer_to_uword (pm->mem) + pm->mem_size) { pfn = (u64) cur / pagesize; seek_loc = pfn * sizeof (u64); if (lseek (fd, seek_loc, SEEK_SET) != seek_loc) - { - clib_unix_warning ("lseek to 0x%llx", seek_loc); - shmctl (pm->shmid, IPC_RMID, 0); - close(fd); - return 0; - } - if (read (fd, &ptbits, sizeof (ptbits)) != (sizeof(ptbits))) - { - clib_unix_warning ("read ptbits"); - shmctl (pm->shmid, IPC_RMID, 0); - close(fd); - return 0; - } - + { + clib_unix_warning ("lseek to 0x%llx", seek_loc); + shmctl (pm->shmid, IPC_RMID, 0); + close (fd); + return 0; + } + if (read (fd, &ptbits, sizeof (ptbits)) != (sizeof (ptbits))) + { + clib_unix_warning ("read ptbits"); + shmctl (pm->shmid, IPC_RMID, 0); + close (fd); + return 0; + } + /* bits 0-54 are the physical page number */ physaddr = (ptbits & 0x7fffffffffffffULL) * pagesize; if (CLIB_DEBUG > 1) - fformat(stderr, "pm: virtual 0x%llx physical 0x%llx\n", - cur, physaddr); + fformat (stderr, "pm: virtual 0x%llx physical 0x%llx\n", + cur, physaddr); vpm->page_table[i++] = physaddr; cur += hugepagesize; } - close(fd); + close (fd); atexit (htlb_shutdown); return 1; } -int vlib_app_physmem_init (vlib_main_t * vm, - physmem_main_t * pm, int) __attribute__ ((weak)); -int vlib_app_physmem_init (vlib_main_t * vm, physmem_main_t * pm, int x) +int vlib_app_physmem_init (vlib_main_t * vm, + physmem_main_t * pm, int) __attribute__ ((weak)); +int +vlib_app_physmem_init (vlib_main_t * vm, physmem_main_t * pm, int x) { return 0; } -clib_error_t * unix_physmem_init (vlib_main_t * vm, int physical_memory_required) +clib_error_t * +unix_physmem_init (vlib_main_t * vm, int physical_memory_required) { - vlib_physmem_main_t * vpm = &vm->physmem_main; - physmem_main_t * pm = &physmem_main; - clib_error_t * error = 0; + vlib_physmem_main_t *vpm = &vm->physmem_main; + physmem_main_t *pm = &physmem_main; + clib_error_t *error = 0; /* Avoid multiple calls. */ if (vm->os_physmem_alloc_aligned) - return error; + return error; vm->os_physmem_alloc_aligned = unix_physmem_alloc_aligned; vm->os_physmem_free = unix_physmem_free; @@ -220,15 +225,17 @@ clib_error_t * unix_physmem_init (vlib_main_t * vm, int physical_memory_required /* OK, Mr. App, you tell us */ if (vlib_app_physmem_init (vm, pm, physical_memory_required)) - return 0; + return 0; - if (!pm->no_hugepages && htlb_init(vm)) + if (!pm->no_hugepages && htlb_init (vm)) { - fformat(stderr, "%s: use huge pages\n", __FUNCTION__); + fformat (stderr, "%s: use huge pages\n", __FUNCTION__); return 0; } - pm->mem = mmap (0, pm->mem_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + pm->mem = + mmap (0, pm->mem_size, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (pm->mem == MAP_FAILED) { error = clib_error_return_unix (0, "mmap"); @@ -247,9 +254,9 @@ clib_error_t * unix_physmem_init (vlib_main_t * vm, int physical_memory_required vpm->virtual.end = vpm->virtual.start + vpm->virtual.size; vpm->is_fake = 1; - fformat(stderr, "%s: use fake dma pages\n", __FUNCTION__); + fformat (stderr, "%s: use fake dma pages\n", __FUNCTION__); - done: +done: if (error) { if (pm->mem != MAP_FAILED) @@ -260,32 +267,32 @@ clib_error_t * unix_physmem_init (vlib_main_t * vm, int physical_memory_required static clib_error_t * show_physmem (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { #if DPDK > 0 - vlib_cli_output (vm, "Not supported with DPDK drivers."); + vlib_cli_output (vm, "Not supported with DPDK drivers."); #else - physmem_main_t * pm = &physmem_main; + physmem_main_t *pm = &physmem_main; if (pm->heap) - vlib_cli_output (vm, "%U", format_mheap, pm->heap, /* verbose */ 1); + vlib_cli_output (vm, "%U", format_mheap, pm->heap, /* verbose */ 1); else - vlib_cli_output (vm, "No physmem allocated."); + vlib_cli_output (vm, "No physmem allocated."); #endif return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (show_physmem_command, static) = { .path = "show physmem", .short_help = "Show physical memory allocation", .function = show_physmem, }; +/* *INDENT-ON* */ static clib_error_t * show_affinity (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { cpu_set_t set; cpu_set_t *setp = &set; @@ -295,66 +302,67 @@ show_affinity (vlib_main_t * vm, int last_set_bit_in_run = -1; int output_done = 0; - rv = sched_getaffinity (0 /* pid, 0 = this proc */, - sizeof (*setp), setp); + rv = sched_getaffinity (0 /* pid, 0 = this proc */ , + sizeof (*setp), setp); if (rv < 0) { vlib_cli_output (vm, "Couldn't get affinity mask: %s\n", - strerror(errno)); + strerror (errno)); return 0; } - + for (i = 0; i < 64; i++) { - if (CPU_ISSET(i, setp)) - { - if (first_set_bit_in_run == -1) - { - first_set_bit_in_run = i; - last_set_bit_in_run = i; - if (output_done) - s = format (s, ","); - s = format (s, "%d-", i); - output_done = 1; - } - else - { - if (i == (last_set_bit_in_run+1)) - last_set_bit_in_run = i; - } - } + if (CPU_ISSET (i, setp)) + { + if (first_set_bit_in_run == -1) + { + first_set_bit_in_run = i; + last_set_bit_in_run = i; + if (output_done) + s = format (s, ","); + s = format (s, "%d-", i); + output_done = 1; + } + else + { + if (i == (last_set_bit_in_run + 1)) + last_set_bit_in_run = i; + } + } else - { - if (first_set_bit_in_run != -1) - { - if (first_set_bit_in_run == (i-1)) - { - _vec_len (s) -= 2 + ((first_set_bit_in_run/10)); - } - s = format (s, "%d", last_set_bit_in_run); - first_set_bit_in_run = -1; - last_set_bit_in_run = -1; - } - } + { + if (first_set_bit_in_run != -1) + { + if (first_set_bit_in_run == (i - 1)) + { + _vec_len (s) -= 2 + ((first_set_bit_in_run / 10)); + } + s = format (s, "%d", last_set_bit_in_run); + first_set_bit_in_run = -1; + last_set_bit_in_run = -1; + } + } } - - if (first_set_bit_in_run != -1) + + if (first_set_bit_in_run != -1) s = format (s, "%d", first_set_bit_in_run); vlib_cli_output (vm, "Process runs on: %v", s); return 0; } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (show_affinity_command, static) = { .path = "show affinity", .short_help = "Show process cpu affinity", .function = show_affinity, }; +/* *INDENT-ON* */ static clib_error_t * set_affinity (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd) + unformat_input_t * input, vlib_cli_command_t * cmd) { cpu_set_t set; cpu_set_t *setp = &set; @@ -364,81 +372,85 @@ set_affinity (vlib_main_t * vm, memset (setp, 0, sizeof (*setp)); - do { - another_round = 0; - if (unformat (input, "%d-%d,", &first, &last)) - { - if (first > 64 || last > 64) - { - barf1: - vlib_cli_output (vm, "range %d-%d invalid", first, last); - return 0; - } - - for (i = first; i <= last; i++) - CPU_SET(i, setp); - another_round = 1; - } - else if (unformat (input, "%d-%d", &first, &last)) - { - if (first > 64 || last > 64) - goto barf1; - - for (i = first; i <= last; i++) - CPU_SET(i, setp); - } - else if (unformat (input, "%d,", &first)) - { - if (first > 64) - { - barf2: - vlib_cli_output (vm, "cpu %d invalid", first); - return 0; - } - CPU_SET(first, setp); - another_round = 1; - } - else if (unformat (input, "%d", &first)) - { - if (first > 64) - goto barf2; - - CPU_SET(first, setp); - } - } while (another_round); - - rv = sched_setaffinity (0 /* pid, 0 = this proc */, - sizeof (*setp), setp); + do + { + another_round = 0; + if (unformat (input, "%d-%d,", &first, &last)) + { + if (first > 64 || last > 64) + { + barf1: + vlib_cli_output (vm, "range %d-%d invalid", first, last); + return 0; + } + + for (i = first; i <= last; i++) + CPU_SET (i, setp); + another_round = 1; + } + else if (unformat (input, "%d-%d", &first, &last)) + { + if (first > 64 || last > 64) + goto barf1; + + for (i = first; i <= last; i++) + CPU_SET (i, setp); + } + else if (unformat (input, "%d,", &first)) + { + if (first > 64) + { + barf2: + vlib_cli_output (vm, "cpu %d invalid", first); + return 0; + } + CPU_SET (first, setp); + another_round = 1; + } + else if (unformat (input, "%d", &first)) + { + if (first > 64) + goto barf2; + + CPU_SET (first, setp); + } + } + while (another_round); + + rv = sched_setaffinity (0 /* pid, 0 = this proc */ , + sizeof (*setp), setp); if (rv < 0) { vlib_cli_output (vm, "Couldn't get affinity mask: %s\n", - strerror(errno)); + strerror (errno)); return 0; } return show_affinity (vm, input, cmd); } +/* *INDENT-OFF* */ VLIB_CLI_COMMAND (set_affinity_command, static) = { .path = "set affinity", .short_help = "Set process cpu affinity", .function = set_affinity, }; +/* *INDENT-ON* */ static clib_error_t * vlib_physmem_configure (vlib_main_t * vm, unformat_input_t * input) { - physmem_main_t * pm = &physmem_main; + physmem_main_t *pm = &physmem_main; u32 size_in_mb; while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { if (unformat (input, "no-huge") || unformat (input, "no-huge-pages")) - pm->no_hugepages = 1; + pm->no_hugepages = 1; - else if (unformat(input, "size-in-mb %d", &size_in_mb) || - unformat(input, "size %d", &size_in_mb)) - pm->mem_size = size_in_mb << 20; + else if (unformat (input, "size-in-mb %d", &size_in_mb) || + unformat (input, "size %d", &size_in_mb)) + pm->mem_size = size_in_mb << 20; else return unformat_parse_error (input); } @@ -448,3 +460,11 @@ vlib_physmem_configure (vlib_main_t * vm, unformat_input_t * input) } VLIB_EARLY_CONFIG_FUNCTION (vlib_physmem_configure, "physmem"); + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/unix/physmem.h b/vlib/vlib/unix/physmem.h index adbd3478edb..5519a7d6f3e 100644 --- a/vlib/vlib/unix/physmem.h +++ b/vlib/vlib/unix/physmem.h @@ -16,7 +16,7 @@ #define __included_physmem_h__ /* Manage I/O physical memory. */ -#define _GNU_SOURCE +#define _GNU_SOURCE #include <sched.h> #include <vppinfra/cache.h> #include <vppinfra/error.h> @@ -35,15 +35,16 @@ #include <sys/ipc.h> #include <sys/shm.h> -typedef struct { +typedef struct +{ /* Virtual memory via mmaped. */ - void * mem; + void *mem; /* Size in bytes. */ uword mem_size; /* Heap allocated out of virtual memory. */ - void * heap; + void *heap; /* huge TLB segment id */ int shmid; @@ -54,3 +55,11 @@ typedef struct { } physmem_main_t; #endif /* __included_physmem_h__ */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/unix/plugin.c b/vlib/vlib/unix/plugin.c index 93bfbb71b7c..1869953d723 100644 --- a/vlib/vlib/unix/plugin.c +++ b/vlib/vlib/unix/plugin.c @@ -21,44 +21,46 @@ plugin_main_t vlib_plugin_main; -void vlib_set_get_handoff_structure_cb (void *cb) +void +vlib_set_get_handoff_structure_cb (void *cb) { - plugin_main_t * pm = &vlib_plugin_main; + plugin_main_t *pm = &vlib_plugin_main; pm->handoff_structure_get_cb = cb; } -static void * vnet_get_handoff_structure (void) +static void * +vnet_get_handoff_structure (void) { - void * (*fp)(void); + void *(*fp) (void); fp = vlib_plugin_main.handoff_structure_get_cb; if (fp == 0) return 0; else - return (*fp)(); + return (*fp) (); } -static int -load_one_plugin (plugin_main_t *pm, plugin_info_t *pi, int from_early_init) +static int +load_one_plugin (plugin_main_t * pm, plugin_info_t * pi, int from_early_init) { void *handle, *register_handle; - clib_error_t * (*fp)(vlib_main_t *, void *, int); - clib_error_t * error; + clib_error_t *(*fp) (vlib_main_t *, void *, int); + clib_error_t *error; void *handoff_structure; - - handle = dlopen ((char *)pi->name, RTLD_LAZY); - /* + handle = dlopen ((char *) pi->name, RTLD_LAZY); + + /* * Note: this can happen if the plugin has an undefined symbol reference, * so print a warning. Otherwise, the poor slob won't know what happened. * Ask me how I know that... */ if (handle == 0) { - clib_warning ("%s", dlerror()); + clib_warning ("%s", dlerror ()); return -1; } - + pi->handle = handle; @@ -66,18 +68,19 @@ load_one_plugin (plugin_main_t *pm, plugin_info_t *pi, int from_early_init) if (register_handle == 0) { dlclose (handle); - clib_warning("Plugin missing vlib_plugin_register: %s\n", (char *)pi->name); + clib_warning ("Plugin missing vlib_plugin_register: %s\n", + (char *) pi->name); return 1; } fp = register_handle; - handoff_structure = vnet_get_handoff_structure(); + handoff_structure = vnet_get_handoff_structure (); if (handoff_structure == 0) error = clib_error_return (0, "handoff structure callback returned 0"); else - error = (*fp)(pm->vlib_main, handoff_structure, from_early_init); + error = (*fp) (pm->vlib_main, handoff_structure, from_early_init); if (error) { @@ -91,7 +94,8 @@ load_one_plugin (plugin_main_t *pm, plugin_info_t *pi, int from_early_init) return 0; } -static u8 **split_plugin_path (plugin_main_t *pm) +static u8 ** +split_plugin_path (plugin_main_t * pm) { int i; u8 **rv = 0; @@ -101,11 +105,11 @@ static u8 **split_plugin_path (plugin_main_t *pm) for (i = 0; i < vec_len (pm->plugin_path); i++) { if (path[i] != ':') - { - vec_add1(this, path[i]); - continue; - } - vec_add1(this, 0); + { + vec_add1 (this, path[i]); + continue; + } + vec_add1 (this, 0); vec_add1 (rv, this); this = 0; } @@ -117,7 +121,8 @@ static u8 **split_plugin_path (plugin_main_t *pm) return rv; } -int vlib_load_new_plugins (plugin_main_t *pm, int from_early_init) +int +vlib_load_new_plugins (plugin_main_t * pm, int from_early_init) { DIR *dp; struct dirent *entry; @@ -128,76 +133,78 @@ int vlib_load_new_plugins (plugin_main_t *pm, int from_early_init) int i; plugin_path = split_plugin_path (pm); - + for (i = 0; i < vec_len (plugin_path); i++) { - dp = opendir ((char *)plugin_path[i]); - + dp = opendir ((char *) plugin_path[i]); + if (dp == 0) - continue; - + continue; + while ((entry = readdir (dp))) - { - u8 *plugin_name; - - if (pm->plugin_name_filter) - { - int j; - for (j = 0; j < vec_len (pm->plugin_name_filter); j++) - if (entry->d_name[j] != pm->plugin_name_filter[j]) - goto next; - } - - plugin_name = format (0, "%s/%s%c", plugin_path[i], - entry->d_name, 0); + { + u8 *plugin_name; + + if (pm->plugin_name_filter) + { + int j; + for (j = 0; j < vec_len (pm->plugin_name_filter); j++) + if (entry->d_name[j] != pm->plugin_name_filter[j]) + goto next; + } + + plugin_name = format (0, "%s/%s%c", plugin_path[i], + entry->d_name, 0); /* Only accept .so */ - char * ext = strrchr((const char *)plugin_name, '.'); - /* unreadable */ - if(!ext || (strcmp(ext, ".so") != 0) || - stat ((char *)plugin_name, &statb) < 0) - { - ignore: - vec_free (plugin_name); - continue; - } - - /* a dir or other things which aren't plugins */ - if (!S_ISREG(statb.st_mode)) - goto ignore; - - p = hash_get_mem (pm->plugin_by_name_hash, plugin_name); - if (p == 0) - { - vec_add2 (pm->plugin_info, pi, 1); - pi->name = plugin_name; - pi->file_info = statb; - - if (load_one_plugin (pm, pi, from_early_init)) - { - vec_free (plugin_name); - _vec_len (pm->plugin_info) = vec_len (pm->plugin_info) - 1; - continue; - } - memset (pi, 0, sizeof (*pi)); - hash_set_mem (pm->plugin_by_name_hash, plugin_name, - pi - pm->plugin_info); - } - next: - ; - } + char *ext = strrchr ((const char *) plugin_name, '.'); + /* unreadable */ + if (!ext || (strcmp (ext, ".so") != 0) || + stat ((char *) plugin_name, &statb) < 0) + { + ignore: + vec_free (plugin_name); + continue; + } + + /* a dir or other things which aren't plugins */ + if (!S_ISREG (statb.st_mode)) + goto ignore; + + p = hash_get_mem (pm->plugin_by_name_hash, plugin_name); + if (p == 0) + { + vec_add2 (pm->plugin_info, pi, 1); + pi->name = plugin_name; + pi->file_info = statb; + + if (load_one_plugin (pm, pi, from_early_init)) + { + vec_free (plugin_name); + _vec_len (pm->plugin_info) = vec_len (pm->plugin_info) - 1; + continue; + } + memset (pi, 0, sizeof (*pi)); + hash_set_mem (pm->plugin_by_name_hash, plugin_name, + pi - pm->plugin_info); + } + next: + ; + } closedir (dp); vec_free (plugin_path[i]); } vec_free (plugin_path); return 0; } -char *vlib_plugin_path __attribute__((weak)); + +char *vlib_plugin_path __attribute__ ((weak)); char *vlib_plugin_path = ""; -char *vlib_plugin_name_filter __attribute__((weak)); +char *vlib_plugin_name_filter __attribute__ ((weak)); char *vlib_plugin_name_filter = 0; -int vlib_plugin_early_init (vlib_main_t *vm) +int +vlib_plugin_early_init (vlib_main_t * vm) { plugin_main_t *pm = &vlib_plugin_main; @@ -210,6 +217,14 @@ int vlib_plugin_early_init (vlib_main_t *vm) pm->plugin_by_name_hash = hash_create_string (0, sizeof (uword)); pm->vlib_main = vm; - - return vlib_load_new_plugins (pm, 1 /* from_early_init */); + + return vlib_load_new_plugins (pm, 1 /* from_early_init */ ); } + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/unix/plugin.h b/vlib/vlib/unix/plugin.h index e7d75099ed9..e905263f232 100644 --- a/vlib/vlib/unix/plugin.h +++ b/vlib/vlib/unix/plugin.h @@ -28,12 +28,12 @@ * vlib plugin scheme * * Almost anything which can be made to work in a vlib unix - * application will also work in a vlib plugin. - * - * The elf-section magic which registers static objects + * application will also work in a vlib plugin. + * + * The elf-section magic which registers static objects * works so long as plugins are preset when the vlib unix process - * starts. But wait: there's more... - * + * starts. But wait: there's more... + * * If an application calls vlib_load_new_plugins() -- possibly after * changing vlib_plugin_main.plugin_path / vlib_plugin_main.plugin_name_filter, * -- new plugins will be loaded. That, in turn, allows considerable @@ -55,16 +55,18 @@ * An application can change these parameters at any time and call * vlib_load_new_plugins(). */ - -typedef struct { + +typedef struct +{ u8 *name; struct stat file_info; void *handle; } plugin_info_t; -typedef struct { +typedef struct +{ /* loaded plugin info */ plugin_info_t *plugin_info; uword *plugin_by_name_hash; @@ -82,7 +84,15 @@ typedef struct { plugin_main_t vlib_plugin_main; -int vlib_plugin_early_init (vlib_main_t *vm); -int vlib_load_new_plugins (plugin_main_t *pm, int from_early_init); +int vlib_plugin_early_init (vlib_main_t * vm); +int vlib_load_new_plugins (plugin_main_t * pm, int from_early_init); #endif /* __included_plugin_h__ */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/unix/unix.h b/vlib/vlib/unix/unix.h index 6c1f985aaba..510e3f196c5 100644 --- a/vlib/vlib/unix/unix.h +++ b/vlib/vlib/unix/unix.h @@ -44,9 +44,10 @@ #include <termios.h> struct unix_file; -typedef clib_error_t * (unix_file_function_t) (struct unix_file * f); +typedef clib_error_t *(unix_file_function_t) (struct unix_file * f); -typedef struct unix_file { +typedef struct unix_file +{ /* Unix file descriptor from open/socket. */ u32 file_descriptor; @@ -58,23 +59,26 @@ typedef struct unix_file { uword private_data; /* Functions to be called when read/write data becomes ready. */ - unix_file_function_t * read_function, * write_function, * error_function; + unix_file_function_t *read_function, *write_function, *error_function; } unix_file_t; -typedef struct { +typedef struct +{ f64 time; - clib_error_t * error; + clib_error_t *error; } unix_error_history_t; -typedef enum { +typedef enum +{ UNIX_FILE_UPDATE_ADD, UNIX_FILE_UPDATE_MODIFY, UNIX_FILE_UPDATE_DELETE, } unix_file_update_type_t; -typedef struct { +typedef struct +{ /* Back pointer to main structure. */ - vlib_main_t * vlib_main; + vlib_main_t *vlib_main; u32 flags; /* Run interactively or as daemon (background process). */ @@ -82,12 +86,13 @@ typedef struct { #define UNIX_FLAG_NODAEMON (1 << 1) /* Pool of files to poll for input/output. */ - unix_file_t * file_pool; + unix_file_t *file_pool; /* CLI listen socket. */ clib_socket_t cli_listen_socket; - void (* file_update) (unix_file_t * file, unix_file_update_type_t update_type); + void (*file_update) (unix_file_t * file, + unix_file_update_type_t update_type); /* Circular buffer of last unix errors. */ unix_error_history_t error_history[128]; @@ -130,7 +135,7 @@ extern unix_main_t unix_main; always_inline uword unix_file_add (unix_main_t * um, unix_file_t * template) { - unix_file_t * f; + unix_file_t *f; pool_get (um->file_pool, f); f[0] = template[0]; um->file_update (f, UNIX_FILE_UPDATE_ADD); @@ -147,9 +152,10 @@ unix_file_del (unix_main_t * um, unix_file_t * f) } always_inline uword -unix_file_set_data_available_to_write (u32 unix_file_index, uword is_available) +unix_file_set_data_available_to_write (u32 unix_file_index, + uword is_available) { - unix_file_t * uf = pool_elt_at_index (unix_main.file_pool, unix_file_index); + unix_file_t *uf = pool_elt_at_index (unix_main.file_pool, unix_file_index); uword was_available = (uf->flags & UNIX_FILE_DATA_AVAILABLE_TO_WRITE); if ((was_available != 0) != (is_available != 0)) { @@ -162,7 +168,7 @@ unix_file_set_data_available_to_write (u32 unix_file_index, uword is_available) always_inline void unix_save_error (unix_main_t * um, clib_error_t * error) { - unix_error_history_t * eh = um->error_history + um->error_history_index; + unix_error_history_t *eh = um->error_history + um->error_history_index; clib_error_free_vector (eh->error); eh->error = error; eh->time = vlib_time_now (um->vlib_main); @@ -172,25 +178,26 @@ unix_save_error (unix_main_t * um, clib_error_t * error) } /* Main function for Unix VLIB. */ -int vlib_unix_main (int argc, char * argv[]); +int vlib_unix_main (int argc, char *argv[]); /* Call to allocate/initialize physical DMA memory subsystem. This is not an init function so that users can explicitly enable/disable physmem when its not needed. */ -clib_error_t * unix_physmem_init (vlib_main_t * vm, - int fail_if_physical_memory_not_present); +clib_error_t *unix_physmem_init (vlib_main_t * vm, + int fail_if_physical_memory_not_present); static inline int unix_physmem_is_fake (vlib_main_t * vm) { - vlib_physmem_main_t * vpm = &vm->physmem_main; + vlib_physmem_main_t *vpm = &vm->physmem_main; return vpm->is_fake; } /* Set prompt for CLI. */ -void vlib_unix_cli_set_prompt (char * prompt); +void vlib_unix_cli_set_prompt (char *prompt); -static inline unix_main_t * vlib_unix_get_main (void) +static inline unix_main_t * +vlib_unix_get_main (void) { return &unix_main; } @@ -200,19 +207,24 @@ u8 **vlib_thread_stacks; /* utils */ -clib_error_t * -vlib_sysfs_write (char * file_name, char * fmt, ...); +clib_error_t *vlib_sysfs_write (char *file_name, char *fmt, ...); -clib_error_t * -vlib_sysfs_read (char * file_name, char * fmt, ...); +clib_error_t *vlib_sysfs_read (char *file_name, char *fmt, ...); -u8 * -vlib_sysfs_link_to_name(char * link); +u8 *vlib_sysfs_link_to_name (char *link); -clib_error_t * -foreach_directory_file (char * dir_name, - clib_error_t * (* f) (void * arg, u8 * path_name, - u8 * file_name), - void * arg, int scan_dirs); +clib_error_t *foreach_directory_file (char *dir_name, + clib_error_t * (*f) (void *arg, + u8 * path_name, + u8 * file_name), + void *arg, int scan_dirs); #endif /* included_unix_unix_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/unix/util.c b/vlib/vlib/unix/util.c index 7a3a2bf9c47..f4a2c810dfc 100644 --- a/vlib/vlib/unix/util.c +++ b/vlib/vlib/unix/util.c @@ -46,21 +46,21 @@ #include <dirent.h> clib_error_t * -foreach_directory_file (char * dir_name, - clib_error_t * (* f) (void * arg, u8 * path_name, u8 * file_name), - void * arg, +foreach_directory_file (char *dir_name, + clib_error_t * (*f) (void *arg, u8 * path_name, + u8 * file_name), void *arg, int scan_dirs) { - DIR * d; - struct dirent * e; - clib_error_t * error = 0; - u8 * s, * t; + DIR *d; + struct dirent *e; + clib_error_t *error = 0; + u8 *s, *t; d = opendir (dir_name); - if (! d) + if (!d) { if (errno == ENOENT) - return 0; + return 0; return clib_error_return_unix (0, "open `%s'", dir_name); } @@ -68,13 +68,12 @@ foreach_directory_file (char * dir_name, while (1) { e = readdir (d); - if (! e) + if (!e) break; if (scan_dirs) { if (e->d_type == DT_DIR - && (! strcmp (e->d_name, ".") - || ! strcmp (e->d_name, ".."))) + && (!strcmp (e->d_name, ".") || !strcmp (e->d_name, ".."))) continue; } else @@ -100,9 +99,9 @@ foreach_directory_file (char * dir_name, } clib_error_t * -vlib_sysfs_write (char * file_name, char * fmt, ...) +vlib_sysfs_write (char *file_name, char *fmt, ...) { - u8 * s; + u8 *s; int fd; fd = open (file_name, O_WRONLY); @@ -123,10 +122,10 @@ vlib_sysfs_write (char * file_name, char * fmt, ...) } clib_error_t * -vlib_sysfs_read (char * file_name, char * fmt, ...) +vlib_sysfs_read (char *file_name, char *fmt, ...) { unformat_input_t input; - u8 * s = 0; + u8 *s = 0; int fd; ssize_t sz; uword result; @@ -135,18 +134,18 @@ vlib_sysfs_read (char * file_name, char * fmt, ...) if (fd < 0) return clib_error_return_unix (0, "open `%s'", file_name); - vec_validate(s, 4095); + vec_validate (s, 4095); - sz = read(fd, s, vec_len (s)); + sz = read (fd, s, vec_len (s)); if (sz < 0) { - close(fd); - vec_free(s); + close (fd); + vec_free (s); return clib_error_return_unix (0, "read `%s'", file_name); } - _vec_len(s) = sz; - unformat_init_vector(&input, s); + _vec_len (s) = sz; + unformat_init_vector (&input, s); va_list va; va_start (va, fmt); @@ -163,27 +162,35 @@ vlib_sysfs_read (char * file_name, char * fmt, ...) } u8 * -vlib_sysfs_link_to_name(char * link) +vlib_sysfs_link_to_name (char *link) { char *p, buffer[64]; unformat_input_t in; u8 *s = 0; int r; - r = readlink(link, buffer, sizeof(buffer) - 1); + r = readlink (link, buffer, sizeof (buffer) - 1); if (r < 0) return 0; buffer[r] = 0; - p = strrchr(buffer, '/'); + p = strrchr (buffer, '/'); if (!p) return 0; - unformat_init_string (&in, p+1, strlen (p+1)); - unformat(&in, "%s", &s); + unformat_init_string (&in, p + 1, strlen (p + 1)); + unformat (&in, "%s", &s); unformat_free (&in); return s; } + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/vlib/vlib/vlib.h b/vlib/vlib/vlib.h index 74101f8d297..b146a49b7f2 100644 --- a/vlib/vlib/vlib.h +++ b/vlib/vlib/vlib.h @@ -76,3 +76,11 @@ struct vlib_main_t; #include <vlib/buffer_node.h> #endif /* included_vlib_h */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ |