aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/pppoe
AgeCommit message (Expand)AuthorFilesLines
2024-03-12misc: remove GNU Indent directivesDamjan Marion5-28/+0
2023-01-18pppoe: fix memcpy out of bounds with gcc-11 on armTianyu Li1-1/+1
2022-08-31pppoe: fix coverity 218437, 218401Andrew Yourtchenko1-0/+3
2022-04-04vppinfra: make _vec_len() read-onlyDamjan Marion1-1/+1
2021-11-19fib: Don't use [midchain] adjacencies to change an interface's feature arcNeale Ranns1-0/+3
2021-10-14pppoe: fix coverity warningKlement Sekera1-6/+12
2021-10-04docs: plugin comment nitfixesNathan Skrzypczak1-4/+4
2021-05-13tests: move test source to vpp/testDave Wallace2-653/+0
2020-12-14misc: move to new pool_foreach macrosDamjan Marion2-6/+6
2020-12-11pppoe: fix VLIB_RX into the pppoe-input nodeStanislav Zaikin3-0/+15
2020-10-24pppoe: make pppoe plugin work with dot1q subinterfaceszstas8-39/+265
2020-10-07misc: Purge unused pg includesNeale Ranns1-1/+0
2020-07-17pppoe: fix uninitialized memory bugTimotheeChauvin3-1/+7
2020-01-06lb: add FEATURE file for lb/pppoe/gtpu/vxlan-gpe/pppoeHongjun Ni1-0/+11
2019-12-16vppinfra: bihash walk cb typedef and continue/stop controlsNeale Ranns1-1/+3
2019-12-07pppoe: use explicit types in apiOle Troan4-32/+30
2019-12-04fib: Decouple source from priority and behaviourNeale Ranns1-2/+8
2019-12-03fib: constify the adjacency in the rewrite nodesNeale Ranns1-1/+1
2019-11-05misc: Fix python scripts shebang lineRenato Botelho do Couto1-1/+1
2019-10-03pppoe: remove api boilerplateOle Troan6-197/+9
2019-08-22tests: move plugin tests to src/plugins/*/testDave Wallace2-0/+645
2019-07-09vat: unload unused vat pluginsDave Barach1-20/+2
2019-05-03plugins: clean up plugin descriptionsDave Wallace1-1/+1
2019-04-19Remove dummy_interface_tx output node from PPPoE pluginJohn Lo1-9/+0
2019-03-01pppoe: migrate old MULTIARCH macros to VLIB_NODE_FNFilip Tehlar3-12/+6
2019-02-09buffers: fix typoDamjan Marion1-1/+1
2019-02-06buffers: make buffer data size configurable from startup configDamjan Marion1-1/+1
2018-11-14Remove c-11 memcpy checks from perf-critical codeDave Barach1-1/+1
2018-10-23c11 safe string handling supportDave Barach3-6/+6
2018-10-01Rename device class from PPPPOE to PPPoEPaul Vinciguerra2-10/+10
2018-08-27cmake: Fix plugins .h includesMohsin Kazmi1-0/+4
2018-08-25cmake: handle api_test_plugins in add_vpp_plugin macroDamjan Marion1-3/+1
2018-08-25cmake: improve add_vpp_plugin macroDamjan Marion1-3/+6
2018-08-17CMake as an alternative to autotools (experimental)Damjan Marion1-0/+27
2018-08-10Use the bihash walk functionNeale Ranns1-52/+45
2018-07-20IP directed broadcastNeale Ranns1-0/+1
2018-05-04Harmonize vec/pool_get_aligned object sizes and alignment requestsDave Barach1-0/+3
2018-01-30Allow the provider of a midchain adjacency to pass context data that is retur...Neale Ranns1-5/+12
2018-01-23VPPAPIGEN: vppapigen replacement in Python PLY.Ole Troan1-1/+1
2018-01-18VPP-1119: PPPoE's destination MAC was overwrittenHongjun Ni1-1/+2
2018-01-11api: remove transport specific code from handlersFlorin Coras1-10/+8
2018-01-09api: refactor vlibmemoryFlorin Coras1-2/+2
2017-11-17Replace tap interface using general interfaceHongjun Ni4-50/+48
2017-10-09vppapigen: support per-file (major,minor,patch) version stampsDave Barach1-0/+2
2017-10-06Separate CP and DP fib table for PPPoEHongjun Ni3-56/+66
2017-10-03Repair vlib API socket serverDave Barach2-2/+2
2017-08-21PPPoE usses a midchain adjacency stack on an interface-tx DPONeale Ranns3-423/+111
2017-08-09PPPoE: use DPO protos in FIB entry path add/removeNeale Ranns1-2/+3
2017-08-09Add PPPoE PluginHongjun Ni12-0/+2858
">; typedef struct { /** CPU cycle counter. */ u64 cpu; /** OS timer in nano secs since epoch 3/30/2017, see elog_time_now() */ u64 os_nsec; } elog_time_stamp_t; typedef struct { /** Total number of events in buffer. */ u32 n_total_events; /** When count reaches limit logging is disabled. This is used for event triggers. */ u32 n_total_events_disable_limit; /** Dummy event to use when logger is disabled. */ elog_event_t dummy_event; /** Power of 2 number of elements in ring. */ uword event_ring_size; /** Vector of events (circular buffer). Power of 2 size. Used when events are being collected. */ elog_event_t *event_ring; /** Vector of event types. */ elog_event_type_t *event_types; /** Hash table mapping type format to type index. */ uword *event_type_by_format; /** Events may refer to strings in string table. */ char *string_table; /** Vector of tracks. */ elog_track_t *tracks; /** Default track. */ elog_track_t default_track; /** Place holder for CPU clock frequency. */ clib_time_t cpu_timer; /** Timestamps */ elog_time_stamp_t init_time, serialize_time; /** SMP lock, non-zero means locking required */ uword *lock; /** Use serialize_time and init_time to give estimate for cpu clock frequency. */ f64 nsec_per_cpu_clock; /** Vector of events converted to generic form after collection. */ elog_event_t *events; } elog_main_t; /** @brief Return number of events in the event-log buffer @param em elog_main_t * @return number of events in the buffer */ always_inline uword elog_n_events_in_buffer (elog_main_t * em) { return clib_min (em->n_total_events, em->event_ring_size); } /** @brief Return number of events which can fit in the event buffer @param em elog_main_t * @return number of events which can fit in the buffer */ always_inline uword elog_buffer_capacity (elog_main_t * em) { return em->event_ring_size; } /** @brief Reset the event buffer @param em elog_main_t * */ always_inline void elog_reset_buffer (elog_main_t * em) { em->n_total_events = 0; em->n_total_events_disable_limit = ~0; } /** @brief Enable or disable event logging @param em elog_main_t * */ always_inline void elog_enable_disable (elog_main_t * em, int is_enabled) { em->n_total_events = 0; em->n_total_events_disable_limit = is_enabled ? ~0 : 0; } /** @brief disable logging after specified number of ievents have been logged. This is used as a "debug trigger" when a certain event has occurred. Events will be logged both before and after the "event" but the event will not be lost as long as N < RING_SIZE. @param em elog_main_t * @param n uword number of events before disabling event logging */ always_inline void elog_disable_after_events (elog_main_t * em, uword n) { em->n_total_events_disable_limit = em->n_total_events + n; } /* @brief mid-buffer logic-analyzer trigger Currently, only midpoint triggering is supported, but it's pretty obvious how to generalize the scheme. @param em elog_main_t * */ always_inline void elog_disable_trigger (elog_main_t * em) { em->n_total_events_disable_limit = em->n_total_events + vec_len (em->event_ring) / 2; } /** @brief register an event type @param em elog_main_t * @param t elog_event_type_t * event to register @return type index @warning Typically not called directly */ word elog_event_type_register (elog_main_t * em, elog_event_type_t * t); /** @brief register an event track @param em elog_main_t * @param t elog_track_t * track to register @return track index @note this function is often called directly */ word elog_track_register (elog_main_t * em, elog_track_t * t); /** @brief event logging enabled predicate @param em elog_main_t * @return 1 if enabled, 0 if not enabled */ always_inline uword elog_is_enabled (elog_main_t * em) { return em->n_total_events < em->n_total_events_disable_limit; } /** @brief Allocate an event to be filled in by the caller Not normally called directly; this function underlies the ELOG_DATA and ELOG_TRACK_DATA macros @param em elog_main_t * @param type elog_event_type_t * type @param track elog_track_t * track @param cpu_time u64 current cpu tick value @returns event to be filled in */ always_inline void * elog_event_data_inline (elog_main_t * em, elog_event_type_t * type, elog_track_t * track, u64 cpu_time) { elog_event_t *e; uword ei; word type_index, track_index; /* Return the user dummy memory to scribble data into. */ if (PREDICT_FALSE (!elog_is_enabled (em))) return em->dummy_event.data; type_index = (word) type->type_index_plus_one - 1; track_index = (word) track->track_index_plus_one - 1; if (PREDICT_FALSE ((type_index | track_index) < 0)) { if (type_index < 0) type_index = elog_event_type_register (em, type); if (track_index < 0) track_index = elog_track_register (em, track); } ASSERT (track_index < vec_len (em->tracks)); ASSERT (is_pow2 (vec_len (em->event_ring))); if (em->lock) ei = clib_atomic_fetch_add (&em->n_total_events, 1); else ei = em->n_total_events++; ei &= em->event_ring_size - 1; e = vec_elt_at_index (em->event_ring, ei); e->time_cycles = cpu_time; e->type = type_index; e->track = track_index; /* Return user data for caller to fill in. */ return e->data; } /* External version of inline. */ void *elog_event_data (elog_main_t * em, elog_event_type_t * type, elog_track_t * track, u64 cpu_time); /** @brief Allocate an event to be filled in by the caller, non-inline Not normally called directly; this function underlies the ELOG_DATA and ELOG_TRACK_DATA macros @param em elog_main_t * @param type elog_event_type_t * type @param track elog_track_t * track @param cpu_time u64 current cpu tick value @returns event to be filled in */ always_inline void * elog_event_data_not_inline (elog_main_t * em, elog_event_type_t * type, elog_track_t * track, u64 cpu_time) { /* Return the user dummy memory to scribble data into. */ if (PREDICT_FALSE (!elog_is_enabled (em))) return em->dummy_event.data; return elog_event_data (em, type, track, cpu_time); } /** @brief Log a single-datum event @param em elog_main_t * @param type elog_event_type_t * type @param data u32 single datum to capture */ always_inline void elog (elog_main_t * em, elog_event_type_t * type, u32 data) { u32 *d = elog_event_data_not_inline (em, type, &em->default_track, clib_cpu_time_now ()); d[0] = data; } /** @brief Log a single-datum event, inline version @param em elog_main_t * @param type elog_event_type_t * type @param data u32 single datum to capture */ always_inline void elog_inline (elog_main_t * em, elog_event_type_t * type, u32 data) { u32 *d = elog_event_data_inline (em, type, &em->default_track, clib_cpu_time_now ()); d[0] = data; } /** @brief Log a single-datum event to a specific track, non-inline version @param em elog_main_t * @param type elog_event_type_t * type @param type elog_event_track_t * track @param data u32 single datum to capture */ always_inline void elog_track (elog_main_t * em, elog_event_type_t * type, elog_track_t * track, u32 data) { u32 *d = elog_event_data_not_inline (em, type, track, clib_cpu_time_now ()); d[0] = data; } /** @brief Log a single-datum event to a specific track @param em elog_main_t * @param type elog_event_type_t * type @param type elog_event_track_t * track @param data u32 single datum to capture */ always_inline void elog_track_inline (elog_main_t * em, elog_event_type_t * type, elog_track_t * track, u32 data) { u32 *d = elog_event_data_inline (em, type, track, clib_cpu_time_now ()); d[0] = data; } always_inline void * elog_data (elog_main_t * em, elog_event_type_t * type, elog_track_t * track) { return elog_event_data_not_inline (em, type, track, clib_cpu_time_now ()); } always_inline void * elog_data_inline (elog_main_t * em, elog_event_type_t * type, elog_track_t * track) { return elog_event_data_inline (em, type, track, clib_cpu_time_now ()); } /* Macro shorthands for generating/declaring events. */ #define __ELOG_TYPE_VAR(f) f #define __ELOG_TRACK_VAR(f) f #define ELOG_TYPE_DECLARE(f) static elog_event_type_t __ELOG_TYPE_VAR(f) #define ELOG_TYPE_INIT_FORMAT_AND_FUNCTION(fmt,func) \ { .format = fmt, .function = func, } #define ELOG_TYPE_INIT(fmt) \ ELOG_TYPE_INIT_FORMAT_AND_FUNCTION(fmt,(char *) __FUNCTION__) #define ELOG_TYPE_DECLARE_HELPER(f,fmt,func) \ static elog_event_type_t __ELOG_TYPE_VAR(f) = \ ELOG_TYPE_INIT_FORMAT_AND_FUNCTION (fmt, func) #define ELOG_TYPE_DECLARE_FORMAT_AND_FUNCTION(f,fmt) \ ELOG_TYPE_DECLARE_HELPER (f, fmt, (char *) __FUNCTION__) #define ELOG_TYPE_DECLARE_FORMAT(f,fmt) \ ELOG_TYPE_DECLARE_HELPER (f, fmt, 0) /* Shorthands with and without __FUNCTION__. D for decimal; X for hex. F for __FUNCTION__. */ #define ELOG_TYPE(f,fmt) ELOG_TYPE_DECLARE_FORMAT_AND_FUNCTION(f,fmt) #define ELOG_TYPE_D(f) ELOG_TYPE_DECLARE_FORMAT (f, #f " %d") #define ELOG_TYPE_X(f) ELOG_TYPE_DECLARE_FORMAT (f, #f " 0x%x") #define ELOG_TYPE_DF(f) ELOG_TYPE_DECLARE_FORMAT_AND_FUNCTION (f, #f " %d") #define ELOG_TYPE_XF(f) ELOG_TYPE_DECLARE_FORMAT_AND_FUNCTION (f, #f " 0x%x") #define ELOG_TYPE_FD(f) ELOG_TYPE_DECLARE_FORMAT_AND_FUNCTION (f, #f " %d") #define ELOG_TYPE_FX(f) ELOG_TYPE_DECLARE_FORMAT_AND_FUNCTION (f, #f " 0x%x") #define ELOG_TRACK_DECLARE(f) static elog_track_t __ELOG_TRACK_VAR(f) #define ELOG_TRACK(f) ELOG_TRACK_DECLARE(f) = { .name = #f, } /* Log 32 bits of data. */ #define ELOG(em,f,data) elog ((em), &__ELOG_TYPE_VAR(f), data) #define ELOG_INLINE(em,f,data) elog_inline ((em), &__ELOG_TYPE_VAR(f), data) /* Return data pointer to fill in. */ #define ELOG_TRACK_DATA(em,f,track) \ elog_data ((em), &__ELOG_TYPE_VAR(f), &__ELOG_TRACK_VAR(track)) #define ELOG_TRACK_DATA_INLINE(em,f,track) \ elog_data_inline ((em), &__ELOG_TYPE_VAR(f), &__ELOG_TRACK_VAR(track)) /* Shorthand with default track. */ #define ELOG_DATA(em,f) elog_data ((em), &__ELOG_TYPE_VAR (f), &(em)->default_track) #define ELOG_DATA_INLINE(em,f) elog_data_inline ((em), &__ELOG_TYPE_VAR (f), &(em)->default_track) /** @brief add a string to the event-log string table Often combined with hashing and the T4 elog format specifier to display complex strings in offline tooling @param em elog_main_t * @param format char * @param VARARGS @return u32 index to add to event log */ u32 elog_string (elog_main_t * em, char *format, ...); void elog_time_now (elog_time_stamp_t * et); /** @brief convert event ring events to events, and return them as a vector. @param em elog_main_t * @return event vector with timestamps in f64 seconds @note sets em->events to resulting vector. */ elog_event_t *elog_get_events (elog_main_t * em); /** @brief convert event ring events to events, and return them as a vector. @param em elog_main_t * @return event vector with timestamps in f64 seconds @note no side effects */ elog_event_t *elog_peek_events (elog_main_t * em); /* Merge two logs, add supplied track tags. */ void elog_merge (elog_main_t * dst, u8 * dst_tag, elog_main_t * src, u8 * src_tag, f64 align_tweak); /* 2 arguments elog_main_t and elog_event_t to format event or track name. */ u8 *format_elog_event (u8 * s, va_list * va); u8 *format_elog_track_name (u8 * s, va_list * va); u8 *format_elog_track (u8 * s, va_list * args); void serialize_elog_main (serialize_main_t * m, va_list * va); void unserialize_elog_main (serialize_main_t * m, va_list * va); void elog_init (elog_main_t * em, u32 n_events); void elog_alloc (elog_main_t * em, u32 n_events); #ifdef CLIB_UNIX always_inline clib_error_t * elog_write_file (elog_main_t * em, char *clib_file, int flush_ring) { serialize_main_t m; clib_error_t *error; error = serialize_open_clib_file (&m, clib_file); if (error) return error; error = serialize (&m, serialize_elog_main, em, flush_ring); if (!error) serialize_close (&m); return error; } always_inline clib_error_t * elog_read_file (elog_main_t * em, char *clib_file) { serialize_main_t m; clib_error_t *error; error = unserialize_open_clib_file (&m, clib_file); if (error) return error; error = unserialize (&m, unserialize_elog_main, em); if (!error) unserialize_close (&m); return error; } #endif /* CLIB_UNIX */ #endif /* included_clib_elog_h */ /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */