aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/bfd
AgeCommit message (Expand)AuthorFilesLines
2019-09-04bfd: API cleanupJakub Grajciar2-84/+66
2019-07-23api: binary api cleanupDave Barach2-5/+5
2019-06-07bfd: midchain adjacency supportMatthew G Smith1-10/+51
2019-03-28Typos. A bunch of typos I've been collecting.Paul Vinciguerra1-1/+1
2019-03-12bfd: register udp ports only when enabledKlement Sekera1-14/+49
2019-02-14Add -fno-common compile optionBenoƮt Ganne1-1/+1
2019-01-20buffers: don't init metadata, as it is already initializedDamjan Marion2-3/+0
2018-11-14Remove c-11 memcpy checks from perf-critical codeDave Barach2-21/+22
2018-10-23c11 safe string handling supportDave Barach3-20/+20
2018-10-11bfd:fix handling session creation batchEyal Bari1-27/+34
2018-10-02BFD: add get echo source API (VPP-1367)Matus Fabian2-1/+87
2018-09-14Remove scaffoldingDave Barach2-14/+1
2018-08-29Address bfd rpc scale issuesDave Barach3-24/+280
2018-08-09bfd:fix NULL session free/putEyal Bari1-1/+0
2018-05-07BFD: Fix format_ip46_address() parameter ordering.Jon Loeliger1-1/+1
2018-04-17Add logging supportDamjan Marion3-52/+124
2018-03-16stats: allow configuring poller delayKlement Sekera1-16/+0
2018-02-13BFD: make CLI consume only one line at a timeKlement Sekera1-26/+78
2018-01-23VPPAPIGEN: vppapigen replacement in Python PLY.Ole Troan1-1/+1
2018-01-15bfd: fix bfd_auth_keys_dumpFlorin Coras1-1/+1
2018-01-11api: remove transport specific code from handlersFlorin Coras1-36/+34
2018-01-09api: refactor vlibmemoryFlorin Coras1-4/+4
2017-12-16Use crc32 wrapper (VPP-1086)Gabriel Ganne1-4/+4
2017-11-10add warning control macro setGabriel Ganne1-11/+3
2017-11-07fix bfd cli with gcc >= 6Gabriel Ganne1-1/+1
2017-10-09vppapigen: support per-file (major,minor,patch) version stampsDave Barach1-0/+2
2017-10-04[aarch64] Fixes CLI crashes on dpaa2 platform.Christophe Fontaine1-1/+1
2017-07-14vnet_buffer_t flags cleanupDamjan Marion1-2/+2
2017-07-14Introduce l{2,3,4}_hdr_offset fields in the buffer metadataDamjan Marion1-2/+2
2017-05-10Add crc32c inline function, allows compilation on 32-bit systemsDamjan Marion1-1/+1
2017-05-02BFD: don't crash if interface is deletedKlement Sekera1-33/+42
2017-04-25"autoreply" flag: autogenerate standard xxx_reply_t messagesDave Barach1-121/+11
2017-04-24BFD: disable gcc6 warnings in helper macrosKlement Sekera1-0/+11
2017-04-06BFD-FIB interactionsNeale Ranns3-2/+73
2017-04-05BFD: add ARP-awareness, fix bugsKlement Sekera5-77/+282
2017-03-06BFD: documentationKlement Sekera11-91/+526
2017-03-06BFD: drop rpc call if packet doesn't match sessionKlement Sekera1-1/+1
2017-03-06BFD: remove unneeded codeKlement Sekera1-15/+0
2017-03-02BFD: command line interfaceKlement Sekera9-167/+1080
2017-03-01VPP-598: tcp stack initial commitDave Barach1-2/+2
2017-02-27BFD: disable debug printsKlement Sekera1-1/+1
2017-02-26BFD: echo functionKlement Sekera8-318/+864
2017-02-17BFD: put session admin-up/admin-downKlement Sekera1-12/+12
2017-02-15BFD: loop back echo packetsKlement Sekera3-36/+243
2017-02-14BFD: respect remote demand modeKlement Sekera1-9/+46
2017-02-14BFD: set per session UDP source port per RFCKlement Sekera4-16/+43
2017-02-08BFD: minor fixesKlement Sekera2-5/+3
2017-02-08BFD: modify session parametersKlement Sekera8-113/+412
2017-02-02BFD: SHA1 authenticationKlement Sekera8-256/+1455
2017-02-02BFD: improve finding of ipv4/ipv6 headersKlement Sekera1-48/+62
span>sched_priority); else return format (s, "%s (n/a)", t); } static clib_error_t * show_threads_fn (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { vlib_worker_thread_t *w; int i; vlib_cli_output (vm, "%-7s%-20s%-12s%-8s%-25s%-7s%-7s%-7s%-10s", "ID", "Name", "Type", "LWP", "Sched Policy (Priority)", "lcore", "Core", "Socket", "State"); #if !defined(__powerpc64__) for (i = 0; i < vec_len (vlib_worker_threads); i++) { w = vlib_worker_threads + i; 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, "%-25U", format_sched_policy_and_priority, w->lwp); int lcore = -1; cpu_set_t cpuset; CPU_ZERO (&cpuset); int ret = -1; ret = pthread_getaffinity_np (w->thread_id, sizeof (cpu_set_t), &cpuset); if (!ret) { int c; for (c = 0; c < CPU_SETSIZE; c++) if (CPU_ISSET (c, &cpuset)) { if (lcore > -1) { lcore = -2; break; } lcore = c; } } else { lcore = w->lcore_id; } if (lcore > -1) { const char *sys_cpu_path = "/sys/devices/system/cpu/cpu"; int socket_id = -1; int core_id = -1; u8 *p = 0; p = format (p, "%s%u/topology/core_id%c", sys_cpu_path, lcore, 0); vlib_sysfs_read ((char *) p, "%d", &core_id); vec_reset_length (p); p = format (p, "%s%u/topology/physical_package_id%c", sys_cpu_path, lcore, 0); vlib_sysfs_read ((char *) p, "%d", &socket_id); vec_free (p); line = format (line, "%-7u%-7u%-7u%", lcore, core_id, socket_id); } else { line = format (line, "%-7s%-7s%-7s%", (lcore == -2) ? "M" : "n/a", "n/a", "n/a"); } vlib_cli_output (vm, "%v", line); vec_free (line); } #endif return 0; } /* *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) { unformat_input_t _line_input, *line_input = &_line_input; 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_frame_queue_main_t *fqm; u32 num_fq; u32 fqix; u32 enable = 2; u32 index = ~(u32) 0; if (!unformat_user (input, unformat_line_input, line_input)) return 0; while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) { if (unformat (line_input, "on")) enable = 1; else if (unformat (line_input, "off")) enable = 0; else if (unformat (line_input, "index %u", &index)) ; else { error = clib_error_return (0, "parse error: '%U'", format_unformat_error, line_input); goto done; } } if (enable > 1) { error = clib_error_return (0, "expecting on or off"); goto done; } if (vec_len (tm->frame_queue_mains) == 0) { error = clib_error_return (0, "no worker handoffs exist"); goto done; } if (index > vec_len (tm->frame_queue_mains) - 1) { error = clib_error_return (0, "expecting valid worker handoff queue index"); goto done; } fqm = vec_elt_at_index (tm->frame_queue_mains, index); num_fq = vec_len (fqm->vlib_frame_queues); if (num_fq == 0) { vlib_cli_output (vm, "No frame queues exist\n"); goto done; } // Allocate storage for trace if necessary vec_validate_aligned (fqm->frame_queue_traces, num_fq - 1, CLIB_CACHE_LINE_BYTES); vec_validate_aligned (fqm->frame_queue_histogram, num_fq - 1, CLIB_CACHE_LINE_BYTES); for (fqix = 0; fqix < num_fq; fqix++) { fqt = &fqm->frame_queue_traces[fqix]; fqh = &fqm->frame_queue_histogram[fqix]; memset (fqt->n_vectors, 0xff, sizeof (fqt->n_vectors)); fqt->written = 0; memset (fqh, 0, sizeof (*fqh)); fqm->vlib_frame_queues[fqix]->trace = enable; } done: unformat_free (line_input); 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* */ /* * Adding two counters and compute percent of total * Round up, e.g. 0.000001 => 1% */ static u32 compute_percent (u64 * two_counters, u64 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, vlib_frame_queue_main_t * fqm, u32 histogram) { 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 (fqm->frame_queue_traces); if (num_fq == 0) { 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"); } for (fqix = 0; fqix < num_fq; fqix++) { fqt = &(fqm->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 = &(fqm->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) { vlib_thread_main_t *tm = vlib_get_thread_main (); vlib_frame_queue_main_t *fqm; clib_error_t *error; vec_foreach (fqm, tm->frame_queue_mains) { vlib_cli_output (vm, "Worker handoff queue index %u (next node '%U'):", fqm - tm->frame_queue_mains, format_vlib_node_name, vm, fqm->node_index); error = show_frame_queue_internal (vm, fqm, 0); if (error) return error; } return 0; } static clib_error_t * show_frame_queue_histogram (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { vlib_thread_main_t *tm = vlib_get_thread_main (); vlib_frame_queue_main_t *fqm; clib_error_t *error; vec_foreach (fqm, tm->frame_queue_mains) { vlib_cli_output (vm, "Worker handoff queue index %u (next node '%U'):", fqm - tm->frame_queue_mains, format_vlib_node_name, vm, fqm->node_index); error = show_frame_queue_internal (vm, fqm, 1); if (error) return error; } return 0; } /* *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) { unformat_input_t _line_input, *line_input = &_line_input; vlib_thread_main_t *tm = vlib_get_thread_main (); vlib_frame_queue_main_t *fqm; clib_error_t *error = NULL; u32 num_fq; u32 fqix; u32 nelts = 0; u32 index = ~(u32) 0; if (!unformat_user (input, unformat_line_input, line_input)) return 0; while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) { if (unformat (line_input, "nelts %u", &nelts)) ; else if (unformat (line_input, "index %u", &index)) ; else { error = clib_error_return (0, "parse error: '%U'", format_unformat_error, line_input); goto done; } } if (index > vec_len (tm->frame_queue_mains) - 1) { error = clib_error_return (0, "expecting valid worker handoff queue index"); goto done; } fqm = vec_elt_at_index (tm->frame_queue_mains, index); if ((nelts != 4) && (nelts != 8) && (nelts != 16) && (nelts != 32)) { error = clib_error_return (0, "expecting 4,8,16,32"); goto done; } num_fq = vec_len (fqm->vlib_frame_queues); if (num_fq == 0) { vlib_cli_output (vm, "No frame queues exist\n"); goto done; } for (fqix = 0; fqix < num_fq; fqix++) { fqm->vlib_frame_queues[fqix]->nelts = nelts; } done: unformat_free (line_input); 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) { unformat_input_t _line_input, *line_input = &_line_input; vlib_thread_main_t *tm = vlib_get_thread_main (); vlib_frame_queue_main_t *fqm; clib_error_t *error = NULL; u32 num_fq; u32 fqix; u32 threshold = ~(u32) 0; u32 index = ~(u32) 0; if (!unformat_user (input, unformat_line_input, line_input)) return 0; while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) { if (unformat (line_input, "threshold %u", &threshold)) ; else if (unformat (line_input, "index %u", &index)) ; else { error = clib_error_return (0, "parse error: '%U'", format_unformat_error, line_input); goto done; } } if (index > vec_len (tm->frame_queue_mains) - 1) { error = clib_error_return (0, "expecting valid worker handoff queue index"); goto done; } fqm = vec_elt_at_index (tm->frame_queue_mains, index); if (threshold == ~(u32) 0) { vlib_cli_output (vm, "expecting threshold value\n"); goto done; } if (threshold == 0) threshold = ~0; num_fq = vec_len (fqm->vlib_frame_queues); if (num_fq == 0) { vlib_cli_output (vm, "No frame queues exist\n"); goto done; } for (fqix = 0; fqix < num_fq; fqix++) { fqm->vlib_frame_queues[fqix]->vector_threshold = threshold; } done: unformat_free (line_input); 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: */