summaryrefslogtreecommitdiffstats
path: root/src/vnet/buffer.c
blob: cf61780cb743d70dfc06392b30f01b1b95f00807 (plain)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/*
 * Copyright (c) 2017 Cisco and/or its affiliates.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <vlib/vlib.h>
#include <vnet/buffer.h>


u8 *
format_vnet_buffer (u8 * s, va_list * args)
{
  vlib_buffer_t *b = va_arg (*args, vlib_buffer_t *);
  u32 indent = format_get_indent (s);
  u8 *a = 0;

#define _(bit,name,ss,v)                      \
  if (v && (b->flags & VNET_BUFFER_F_##name)) \
    a = format (a, "%s ", ss);
  foreach_vnet_buffer_flag
#undef _
    if (b->flags & VNET_BUFFER_F_L2_HDR_OFFSET_VALID)
    a = format (a, "l2-hdr-offset %d ", vnet_buffer (b)->l2_hdr_offset);

  if (b->flags & VNET_BUFFER_F_L3_HDR_OFFSET_VALID)
    a = format (a, "l3-hdr-offset %d ", vnet_buffer (b)->l3_hdr_offset);

  if (b->flags & VNET_BUFFER_F_L4_HDR_OFFSET_VALID)
    a = format (a, "l4-hdr-offset %d ", vnet_buffer (b)->l4_hdr_offset);

  if (b->flags & VNET_BUFFER_F_QOS_DATA_VALID)
    a = format (a, "qos %d.%d ",
		vnet_buffer2 (b)->qos.bits, vnet_buffer2 (b)->qos.source);

  if (b->flags & VNET_BUFFER_F_LOOP_COUNTER_VALID)
    a = format (a, "loop-counter %d ", vnet_buffer2 (b)->loop_counter);

  s = format (s, "%U", format_vlib_buffer, b);
  if (a)
    s = format (s, "\n%U%v", format_white_space, indent, a);
  vec_free (a);

  return s;
}


/*
 * fd.io coding-style-patch-verification: ON
 *
 * Local Variables:
 * eval: (c-set-style "gnu")
 * End:
 */
lass="p">} perfmon_event_t; typedef struct { u32 type; int cpu; pid_t pid; char *name; } perfmon_instance_t; typedef struct { char *name; perfmon_instance_t *instances; } perfmon_instance_type_t; struct perfmon_source; vlib_node_function_t perfmon_dispatch_wrapper_mmap; vlib_node_function_t perfmon_dispatch_wrapper_metrics; #define foreach_permon_offset_type \ _ (PERFMON_OFFSET_TYPE_MMAP, perfmon_dispatch_wrapper_mmap) \ _ (PERFMON_OFFSET_TYPE_METRICS, perfmon_dispatch_wrapper_metrics) typedef clib_error_t *(perfmon_source_init_fn_t) (vlib_main_t *vm, struct perfmon_source *); typedef struct perfmon_source { char *name; char *description; struct perfmon_source *next; perfmon_event_t *events; u32 n_events; perfmon_instance_type_t *instances_by_type; format_function_t *format_config; perfmon_source_init_fn_t *init_fn; } perfmon_source_t; struct perfmon_bundle; typedef clib_error_t *(perfmon_bundle_init_fn_t) (vlib_main_t *vm, struct perfmon_bundle *); typedef struct perfmon_bundle { char *name; char *description; char *source; char *footer; perfmon_bundle_type_t type; perfmon_offset_type_t offset_type; u32 events[PERF_MAX_EVENTS]; u32 metrics[PERF_MAX_EVENTS]; u32 n_events; perfmon_bundle_init_fn_t *init_fn; char **column_headers; format_function_t *format_fn; clib_cpu_supports_func_t cpu_supports; /* do not set manually */ perfmon_source_t *src; struct perfmon_bundle *next; } perfmon_bundle_t; typedef struct { u64 nr; u64 time_enabled; u64 time_running; u64 value[PERF_MAX_EVENTS]; } perfmon_reading_t; typedef struct { CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); u64 n_calls; u64 n_packets; union { struct { u64 value[PERF_MAX_EVENTS]; } t[2]; u64 value[PERF_MAX_EVENTS * 2]; }; } perfmon_node_stats_t; typedef struct { u8 n_events; u16 n_nodes; perfmon_node_stats_t *node_stats; perfmon_bundle_t *bundle; struct perf_event_mmap_page *mmap_pages[PERF_MAX_EVENTS]; } perfmon_thread_runtime_t; typedef struct { perfmon_thread_runtime_t *thread_runtimes; perfmon_bundle_t *bundles; uword *bundle_by_name; perfmon_source_t *sources; uword *source_by_name; perfmon_bundle_t *active_bundle; int is_running; f64 sample_time; int *group_fds; int *fds_to_close; perfmon_instance_type_t *default_instance_type; perfmon_instance_type_t *active_instance_type; } perfmon_main_t; extern perfmon_main_t perfmon_main; #define PERFMON_REGISTER_SOURCE(x) \ perfmon_source_t __perfmon_source_##x; \ static void __clib_constructor __perfmon_source_registration_##x (void) \ { \ perfmon_main_t *pm = &perfmon_main; \ __perfmon_source_##x.next = pm->sources; \ pm->sources = &__perfmon_source_##x; \ } \ perfmon_source_t __perfmon_source_##x #define PERFMON_REGISTER_BUNDLE(x) \ perfmon_bundle_t __perfmon_bundle_##x; \ static void __clib_constructor __perfmon_bundle_registration_##x (void) \ { \ perfmon_main_t *pm = &perfmon_main; \ __perfmon_bundle_##x.next = pm->bundles; \ pm->bundles = &__perfmon_bundle_##x; \ } \ perfmon_bundle_t __perfmon_bundle_##x void perfmon_reset (vlib_main_t *vm); clib_error_t *perfmon_start (vlib_main_t *vm, perfmon_bundle_t *); clib_error_t *perfmon_stop (vlib_main_t *vm); #define PERFMON_STRINGS(...) \ (char *[]) { __VA_ARGS__, 0 } #endif