aboutsummaryrefslogtreecommitdiffstats
path: root/src
AgeCommit message (Expand)AuthorFilesLines
2018-04-30Remove historical README fileDave Barach1-43/+0
2018-04-30FIB: elide cover walk for insert of host routeNeale Ranns3-3/+25
2018-04-30plugins: dpdk: fix check which makes not sense, likely a typoSzymon Sliwa1-1/+1
2018-04-27svm/session: improve svm fifo allocationFlorin Coras1-13/+15
2018-04-27IPv6 NS/RS; do not vec_validate global structs in the DPNeale Ranns1-12/+16
2018-04-27IPv6 NS: use the mcast rewrite node to fill in the destination MACNeale Ranns2-263/+275
2018-04-27TAP memory leaks:Neale Ranns4-28/+22
2018-04-27Move VOM to extras/vomDamjan Marion177-32373/+1
2018-04-27A bit of buffer metadata reshuffling to accommodate flow_idDamjan Marion10-44/+37
2018-04-27VAT for qos_record_enable_disable APIIgor Mikhailov (imichail)2-3/+90
2018-04-26vlib: set log tap level <level> does not work for some keywordsSteven1-2/+2
2018-04-26NAT44: disable nat44-hairpinning feature for in-out interface (VPP-1255)Matus Fabian1-10/+20
2018-04-25igmp: disable debug messagesDamjan Marion1-1/+1
2018-04-25Carry recorded QOS bits in the outer VXLAN IP headerIgor Mikhailov (imichail)1-0/+35
2018-04-25span: crash in span_mirror [VPP-1254]Steven1-2/+7
2018-04-25dpdk: complete rework of the dpdk-input nodeDamjan Marion12-470/+707
2018-04-25GBPv6: NAT66 actions for GBPNeale Ranns5-134/+185
2018-04-25vxlan:remove single bucket load-balance dpo'sEyal Bari1-9/+23
2018-04-25ABF: remove the inclusion of version.h from abf_policy so it does not recompi...Neale Ranns2-8/+6
2018-04-25Fix some build warnings about "Old Style VLA"Juraj Sloboda3-7/+12
2018-04-25Adjacency walk more scalableNeale Ranns2-50/+30
2018-04-25STN: use the punt feature arcsNeale Ranns1-79/+28
2018-04-25ipsec: make crypto_worker_main_t a full cache line in sizeFlorin Coras1-0/+1
2018-04-25igmp: data structure refactoringJakub Grajciar5-350/+820
2018-04-25Fix sample-plugin build with newer clang versionsDamjan Marion1-0/+20
2018-04-24lacp: deleting the bond subinterface may cause lacp to lose the partner [VPP-...Steven5-38/+10
2018-04-24memory leakKingwel Xie1-0/+3
2018-04-24NAT44: one-armed NAT and identity mapping (VPP-1212)Matus Fabian1-3/+10
2018-04-24mem-leak in stats handling (VPP-1250)Neale Ranns1-4/+18
2018-04-24Support QOS_SOURCE_IP recording from L2 input node.Igor Mikhailov (imichail)2-5/+77
2018-04-23MPLS VPLS CLI fixNeale Ranns1-0/+1
2018-04-23lacp: partner may time us out if fast-rate is configured [VPP-1247]Steven5-8/+14
2018-04-20tcp: make newreno byte instead of acks dependentFlorin Coras4-3/+28
2018-04-20tcp: improve statsFlorin Coras3-128/+177
2018-04-19Allow an IPsec tunnel interface to be renumberedMatthew Smith6-30/+54
2018-04-19Add special Twice-NAT feature (VPP-1221)Juraj Sloboda7-30/+94
2018-04-19Minor optimzation/cleanup to ethernet-input nodeJohn Lo1-5/+5
2018-04-18dpdk: improve loggingDamjan Marion4-35/+187
2018-04-18vlib: logging improvementsDamjan Marion2-32/+74
2018-04-18typo fix: UNKOWN -> UNKNOWNAndrey "Zed" Zaikin7-14/+14
2018-04-18Mcast rewrite optimisationsNeale Ranns8-45/+59
2018-04-18session: coverity warningsFlorin Coras2-3/+3
2018-04-18NAT44: recycle old sessions for forwarding bypass (VPP-1240)Matus Fabian4-17/+98
2018-04-18vppinfra: make set_mempolicy failure non-critical unless NUMA_FORCE is setDamjan Marion1-1/+2
2018-04-18SCTP: coverity warningsMarco Varlese1-5/+2
2018-04-18udp/session: refactor to support dgram modeFlorin Coras21-447/+1105
2018-04-18dpdk: resurrect removed code [VPP-1245]Steven1-0/+4
2018-04-18Fix the ip header offset counting in vnet/ipsecSzymon Sliwa1-5/+4
2018-04-17Add logging supportDamjan Marion9-52/+875
2018-04-17IP mcast: allow unicast address as a next-hopNeale Ranns8-41/+306
pan class="o">&tm->seed); if (!tm->n_hash_keys) tm->n_hash_keys = 2 * max_pow2 (tm->n_keys); tm->n_hash_keys = clib_max (tm->n_keys, tm->n_hash_keys); qhash_resize (tm->qhash, tm->n_hash_keys); { qhash_t *h = qhash_header (tm->qhash); int i; for (i = 0; i < ARRAY_LEN (h->hash_seeds); i++) h->hash_seeds[i] = random_uword (&tm->seed); } vec_resize (tm->lookup_keys, tm->max_vector); vec_resize (tm->lookup_key_indices, tm->max_vector); vec_resize (tm->lookup_results, tm->max_vector); for (iter = 0; iter < tm->n_iter; iter++) { uword *p, j, n, is_set; n = tm->max_vector; is_set = random_u32 (&tm->seed) & 1; is_set |= hash_elts (tm->hash) < (tm->n_keys / 4); if (hash_elts (tm->hash) > (3 * tm->n_keys) / 4) is_set = 0; _vec_len (tm->lookup_keys) = n; _vec_len (tm->lookup_key_indices) = n; j = 0; while (j < n) { i = random_u32 (&tm->seed) % vec_len (tm->keys); if (clib_bitmap_get (tm->keys_in_hash_bitmap, i) != is_set) { f64 t[2]; tm->lookup_key_indices[j] = i; tm->lookup_keys[j] = tm->keys[i]; t[0] = clib_time_now (&tm->time); if (is_set) hash_set (tm->hash, tm->keys[i], i); else hash_unset (tm->hash, tm->keys[i]); t[1] = clib_time_now (&tm->time); if (is_set) tm->hash_set_time += t[1] - t[0]; else tm->hash_unset_time += t[1] - t[0]; tm->keys_in_hash_bitmap = clib_bitmap_set (tm->keys_in_hash_bitmap, i, is_set); j++; } } { f64 t[2]; if (is_set) { t[0] = clib_time_now (&tm->time); qhash_set_multiple (tm->qhash, tm->lookup_keys, vec_len (tm->lookup_keys), tm->lookup_results); t[1] = clib_time_now (&tm->time); tm->set_time += t[1] - t[0]; tm->set_count += vec_len (tm->lookup_keys); for (i = 0; i < vec_len (tm->lookup_keys); i++) { uword r = tm->lookup_results[i]; *vec_elt_at_index (tm->qhash, r) = tm->lookup_key_indices[i]; } } else { t[0] = clib_time_now (&tm->time); qhash_unset_multiple (tm->qhash, tm->lookup_keys, vec_len (tm->lookup_keys), tm->lookup_results); t[1] = clib_time_now (&tm->time); tm->unset_time += t[1] - t[0]; tm->unset_count += vec_len (tm->lookup_keys); for (i = 0; i < vec_len (tm->lookup_keys); i++) { uword r = tm->lookup_results[i]; *vec_elt_at_index (tm->qhash, r) = ~0; } } } if (qhash_elts (tm->qhash) != hash_elts (tm->hash)) os_panic (); { qhash_t *h; uword i, k, l, count; h = qhash_header (tm->qhash); for (i = k = 0; k < vec_len (h->hash_key_valid_bitmap); k++) i += count_set_bits (h->hash_key_valid_bitmap[k]); k = hash_elts (h->overflow_hash); l = qhash_elts (tm->qhash); if (i + k != l) os_panic (); count = hash_elts (h->overflow_hash); for (i = 0; i < (1 << h->log2_hash_size); i++) count += tm->qhash[i] != ~0; if (count != qhash_elts (tm->qhash)) os_panic (); { u32 *tmp = 0; /* *INDENT-OFF* */ hash_foreach (k, l, h->overflow_hash, ({ j = qhash_hash_mix (h, k) / QHASH_KEYS_PER_BUCKET; vec_validate (tmp, j); tmp[j] += 1; })); /* *INDENT-ON* */ for (k = 0; k < vec_len (tmp); k++) { if (k >= vec_len (h->overflow_counts)) os_panic (); if (h->overflow_counts[k] != tmp[k]) os_panic (); } for (; k < vec_len (h->overflow_counts); k++) if (h->overflow_counts[k] != 0) os_panic (); vec_free (tmp); } } { f64 t[2]; t[0] = clib_time_now (&tm->time); qhash_get_multiple (tm->qhash, tm->keys, vec_len (tm->keys), tm->get_multiple_results); t[1] = clib_time_now (&tm->time); tm->get_time += t[1] - t[0]; for (i = 0; i < vec_len (tm->keys); i++) { u32 r; t[0] = clib_time_now (&tm->time); p = hash_get (tm->hash, tm->keys[i]); t[1] = clib_time_now (&tm->time); tm->hash_get_time += t[1] - t[0]; r = qhash_get (tm->qhash, tm->keys[i]); if (p) { if (p[0] != i) os_panic (); if (*vec_elt_at_index (tm->qhash, r) != i) os_panic (); } else { if (r != ~0) os_panic (); } if (r != tm->get_multiple_results[i]) os_panic (); } } tm->overflow_fraction += ((f64) qhash_n_overflow (tm->qhash) / qhash_elts (tm->qhash)); tm->ave_elts += qhash_elts (tm->qhash); } fformat (stderr, "%d iter %.6e overflow, %.4f ave. elts\n", tm->n_iter, tm->overflow_fraction / tm->n_iter, tm->ave_elts / tm->n_iter); tm->get_time /= tm->n_iter * vec_len (tm->keys); tm->hash_get_time /= tm->n_iter * vec_len (tm->keys); tm->set_time /= tm->set_count; tm->unset_time /= tm->unset_count; tm->hash_set_time /= tm->set_count; tm->hash_unset_time /= tm->unset_count; fformat (stderr, "get/set/unset clocks %.2e %.2e %.2e clib %.2e %.2e %.2e ratio %.2f %.2f %.2f\n", tm->get_time * tm->time.clocks_per_second, tm->set_time * tm->time.clocks_per_second, tm->unset_time * tm->time.clocks_per_second, tm->hash_get_time * tm->time.clocks_per_second, tm->hash_set_time * tm->time.clocks_per_second, tm->hash_unset_time * tm->time.clocks_per_second, tm->hash_get_time / tm->get_time, tm->hash_set_time / tm->set_time, tm->hash_unset_time / tm->unset_time); 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_qhash_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: */