summaryrefslogtreecommitdiffstats
path: root/docs
AgeCommit message (Expand)AuthorFilesLines
2019-10-09docs: Add macos build documentationNathan Skrzypczak2-0/+58
2019-10-07docs: grammar police raidDave Barach1-7/+9
2019-10-04docs: add packet-generator writeupDave Barach1-0/+183
2019-09-26misc: add vnet classify filter set supportDave Barach1-7/+20
2019-09-23misc: unify pcap rx / tx / drop traceDave Barach1-8/+16
2019-09-20misc: classifier-based packet trace filterDave Barach1-0/+108
2019-09-11docs: run-sphinx-docs-mergedjdenisco2-3/+3
2019-09-09docs: improve unformat documentationDave Barach1-8/+120
2019-08-26misc: 19.08 new featuresAndrew Yourtchenko2-0/+141
2019-08-08docs: Add Ray's ACL use casejdenisco5-0/+489
2019-08-08api: api socket respect unix runtime directoryOle Troan1-2/+2
2019-08-05docs: Add more quic plugin documentationNathan Skrzypczak4-0/+2
2019-08-01docs: Small fixes and orderingNathan Skrzypczak3-0/+20
2019-07-26docs: add binary api trace replay detailsDave Barach1-7/+81
2019-07-22docs: improve home gateway use-case documentationDave Barach1-18/+131
2019-07-19docs: Fix conf.py for read the docsjdenisco2-3/+2
2019-07-12docs: add compressed core file descriptionDave Barach1-0/+27
2019-07-12docs: how to enable coredump with systemdBenoƮt Ganne1-0/+4
2019-06-27docs: Update the vhost sectionjdenisco4-8/+11
2019-05-30FIB: correctly report IPv6 FIB Unicast and Multicast memory usage (VPP-1578)"Neale Ranns3-2/+286
2019-05-28docs: Add some packages for building the docsjdenisco2-2/+13
2019-05-17docs: Fix Versions and Titlesjdenisco4-7/+7
2019-05-16docs: Update sphinx, requirements, support markdown tablesjdenisco9-30/+50
2019-05-16DOC ONLY: document VLIB_INIT_FUNCTION schemeDave Barach1-4/+49
2019-05-10docs: Add 1904jdenisco6-17/+133
2019-04-30Sphinx docs: Fix security vulnerability (VPP-1655)Dave Wallace1-1/+1
2019-04-29DOC ONLY: add a buffer metadata writeupDave Barach2-1/+192
2019-04-25docs: Add VPP inside the CloudFrancesco Spinelli9-4/+805
2019-04-08fixing typosJim Thompson1-1/+1
2019-03-22DOC-ONLY: improve multi-arch documentationDave Barach2-0/+88
2019-03-21docs: break up long lines in vmxnet3.rst to avoid line wrapSteven Luong1-21/+34
2019-03-19docs: Update vmxnet3 usecaseSteven Luong1-12/+36
2019-03-15DOC ONLY: fix g2 build documentationDave Barach2-49/+44
2019-03-12DOC ONLY: add packet handoff docDave Barach1-11/+117
2019-02-27Fix centos build and build documentationjdenisco3-4/+4
2019-02-27DOC ONLY: update bug report sectionDave Barach1-31/+58
2019-02-23Add support for 19.01jdenisco3-74/+15
2019-02-20docs: use python3 for make docs.Paul Vinciguerra1-3/+3
2019-02-19VPP-1504: Remove JVPPMichal Cmarada8-61/+6
2019-01-31docs: Instructions for using vmxnet3 on macjdenisco2-2/+24
2019-01-20buffers: don't init metadata, as it is already initializedDamjan Marion1-3/+0
2019-01-17DOC ONLY: wireshark dissector upstreamedDave Barach2-58/+48
2019-01-07Update tcpdump / wireshark packet format writeupDave Barach1-6/+14
2018-12-17docs: Add vmxmet3 driverjdenisco3-2/+131
2018-12-17docs: clarify vector element alignment description.Dave Wallace1-5/+8
2018-12-13docs: Update the requirementsjdenisco2-10/+10
2018-12-06nsim: add packet loss simulation, docsDave Barach2-1/+91
2018-12-06DOC-ONLY: MFIB documentationNeale Ranns4-5/+96
2018-12-05DOC ONLY: describe dispatch pcap tracingDave Barach3-2/+263
2018-11-27docs: Add more on trexjdenisco7-22/+225
lass="o">*tm = &_tm; timing_wheel_t *w = &tm->timing_wheel; uword iter, i; memset (tm, 0, sizeof (tm[0])); tm->n_iter = 10; tm->time_per_status_update = 0; tm->n_events = 100; tm->seed = 1; tm->synthetic_time = 1; tm->max_time = 1; tm->wait_time = 1e-3; w->validate = 0; w->n_wheel_elt_time_bits = 32; while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { if (unformat (input, "iter %wd", &tm->n_iter)) ; else if (unformat (input, "events %d", &tm->n_events)) ; else if (unformat (input, "elt-time-bits %d", &w->n_wheel_elt_time_bits)) ; else if (unformat (input, "seed %d", &tm->seed)) ; else if (unformat (input, "verbose")) tm->verbose = 1; else if (unformat (input, "validate")) w->validate = 1; else if (unformat (input, "real-time")) tm->synthetic_time = 0; else if (unformat (input, "synthetic-time")) tm->synthetic_time = 1; else if (unformat (input, "max-time %f", &tm->max_time)) ; else if (unformat (input, "wait-time %f", &tm->wait_time)) ; else if (unformat (input, "iter-time %f", &tm->total_iterate_time)) ; else if (unformat (input, "print %f", &tm->time_per_status_update)) ; else { error = clib_error_create ("unknown input `%U'\n", format_unformat_error, input); goto done; } } if (!tm->seed) tm->seed = random_default_seed (); clib_time_init (&tm->time); if (tm->synthetic_time) { w->min_sched_time = tm->time.seconds_per_clock; w->max_sched_time = w->min_sched_time * 256; timing_wheel_init (w, 0, tm->time.clocks_per_second); } else { timing_wheel_init (w, clib_cpu_time_now (), tm->time.clocks_per_second); } clib_warning ("iter %wd, events %d, seed %u, %U", tm->n_iter, tm->n_events, tm->seed, format_timing_wheel, &tm->timing_wheel, /* verbose */ 0); /* Make some events. */ vec_resize (tm->events, tm->n_events); for (i = 0; i < vec_len (tm->events); i++) set_event (tm, i); { u32 *expired = 0; f64 ave_error = 0; f64 rms_error = 0; f64 max_error = 0, min_error = 1e30; u32 *error_hist = 0; uword n_expired = 0; uword *expired_bitmap[2] = { 0 }; uword n_events_in_wheel = vec_len (tm->events); vec_resize (expired, 32); vec_resize (error_hist, 1024); tm->time_iterate_start = clib_time_now (&tm->time); tm->time_next_status_update = tm->time_iterate_start + tm->time_per_status_update; if (tm->total_iterate_time != 0) tm->n_iter = ~0; for (iter = 0; iter < tm->n_iter || n_events_in_wheel > 0; iter++) { u64 cpu_time, min_next_time[2]; if (tm->synthetic_time) cpu_time = iter << w->log2_clocks_per_bin; else cpu_time = clib_cpu_time_now (); _vec_len (expired) = 0; expired = timing_wheel_advance (w, cpu_time, expired, &min_next_time[0]); timing_wheel_validate (w); /* Update bitmap of expired events. */ if (w->validate) { for (i = 0; i < vec_len (tm->events); i++) { uword is_expired; is_expired = (cpu_time >> w->log2_clocks_per_bin) >= (tm->events[i] >> w->log2_clocks_per_bin); expired_bitmap[0] = clib_bitmap_set (expired_bitmap[0], i, is_expired); /* Validate min next time. */ if (is_expired) ASSERT (min_next_time[0] > tm->events[i]); else ASSERT (min_next_time[0] <= tm->events[i]); } } n_expired += vec_len (expired); for (i = 0; i < vec_len (expired); i++) { word j, idt; i64 dt_cpu; f64 fdt_cpu; j = expired[i]; expired_bitmap[1] = clib_bitmap_ori (expired_bitmap[1], j); dt_cpu = cpu_time - tm->events[j]; /* Event must be scheduled in correct bin. */ if (tm->synthetic_time) ASSERT (dt_cpu >= 0 && dt_cpu <= (1 << w->log2_clocks_per_bin)); fdt_cpu = dt_cpu * tm->time.seconds_per_clock; ave_error += fdt_cpu; rms_error += fdt_cpu * fdt_cpu; if (fdt_cpu > max_error) max_error = fdt_cpu; if (fdt_cpu < min_error) min_error = fdt_cpu; idt = (cpu_time >> w->log2_clocks_per_bin) - (tm->events[j] >> w->log2_clocks_per_bin); idt = zvec_signed_to_unsigned (idt); vec_validate (error_hist, idt); error_hist[idt] += 1; } if (w->validate) for (i = 0; i < vec_len (tm->events); i++) { int is_expired = clib_bitmap_get (expired_bitmap[0], i); int is_expired_w = clib_bitmap_get (expired_bitmap[1], i); ASSERT (is_expired == is_expired_w); } min_next_time[1] = ~0; for (i = 0; i < vec_len (tm->events); i++) { if (!clib_bitmap_get (expired_bitmap[1], i)) min_next_time[1] = clib_min (min_next_time[1], tm->events[i]); } if (min_next_time[0] != min_next_time[1]) clib_error ("min next time wrong 0x%Lx != 0x%Lx", min_next_time[0], min_next_time[1]); if (tm->time_per_status_update != 0 && clib_time_now (&tm->time) >= tm->time_next_status_update) { f64 ave = 0, rms = 0; tm->time_next_status_update += tm->time_per_status_update; if (n_expired > 0) { ave = ave_error / n_expired; rms = SQRT (rms_error / n_expired - ave * ave); } clib_warning ("%12wd iter done %10wd expired; ave. error %.4e +- %.4e, range %.4e %.4e", iter, n_expired, ave, rms, min_error, max_error); } if (tm->total_iterate_time != 0 && (clib_time_now (&tm->time) - tm->time_iterate_start >= tm->total_iterate_time)) tm->n_iter = iter; /* Add new events to wheel to replace expired ones. */ n_events_in_wheel -= vec_len (expired); if (iter < tm->n_iter) { for (i = 0; i < vec_len (expired); i++) { uword j = expired[i]; set_event (tm, j); expired_bitmap[1] = clib_bitmap_andnoti (expired_bitmap[1], j); } n_events_in_wheel += vec_len (expired); } } ave_error /= n_expired; rms_error = SQRT (rms_error / n_expired - ave_error * ave_error); clib_warning ("%wd iter done %wd expired; ave. error %.4e +- %.4e, range %.4e %.4e", 1 + iter, n_expired, ave_error, rms_error, min_error, max_error); { test_timing_wheel_tmp_t *fs, *f; f64 total_fraction; fs = 0; for (i = 0; i < vec_len (error_hist); i++) { if (error_hist[i] == 0) continue; vec_add2 (fs, f, 1); f->dt = (((i64) zvec_unsigned_to_signed (i) << w->log2_clocks_per_bin) * tm->time.seconds_per_clock); f->fraction = (f64) error_hist[i] / (f64) n_expired; f->count = error_hist[i]; } vec_sort_with_function (fs, test_timing_wheel_tmp_cmp); total_fraction = 0; vec_foreach (f, fs) { total_fraction += f->fraction; if (f == fs) fformat (stdout, "%=12s %=16s %=16s %s\n", "Error max", "Fraction", "Total", "Count"); fformat (stdout, "%12.4e %16.4f%% %16.4f%% %Ld\n", f->dt, f->fraction * 100, total_fraction * 100, f->count); } } clib_warning ("%U", format_timing_wheel, w, /* verbose */ 1); } done: return error; } #ifdef CLIB_UNIX int main (int argc, char *argv[]) { unformat_input_t i; clib_error_t *error; unformat_init_command_line (&i, argv); error = test_timing_wheel_main (&i); unformat_free (&i); if (error) { clib_error_report (error); return 1; } else return 0; } #endif /* CLIB_UNIX */ /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */