-u8 *format_vnet_buffer_flags (u8 * s, va_list * args) __attribute__ ((weak));
-u8 *
-format_vnet_buffer_flags (u8 * s, va_list * args)
-{
- s = format (s, "BUG STUB %s", __FUNCTION__);
- return s;
-}
-
-u8 *format_vnet_buffer_opaque (u8 * s, va_list * args) __attribute__ ((weak));
-u8 *
-format_vnet_buffer_opaque (u8 * s, va_list * args)
-{
- s = format (s, "BUG STUB %s", __FUNCTION__);
- return s;
-}
-
-u8 *format_vnet_buffer_opaque2 (u8 * s, va_list * args)
- __attribute__ ((weak));
-u8 *
-format_vnet_buffer_opaque2 (u8 * s, va_list * args)
-{
- s = format (s, "BUG STUB %s", __FUNCTION__);
- return s;
-}
-
-static u8 *
-format_buffer_metadata (u8 * s, va_list * args)
-{
- vlib_buffer_t *b = va_arg (*args, vlib_buffer_t *);
-
- s = format (s, "flags: %U\n", format_vnet_buffer_flags, b);
- s = format (s, "current_data: %d, current_length: %d\n",
- (i32) (b->current_data), (i32) (b->current_length));
- s = format (s, "current_config_index: %d, flow_id: %x, next_buffer: %x\n",
- b->current_config_index, b->flow_id, b->next_buffer);
- s = format (s, "error: %d, ref_count: %d, buffer_pool_index: %d\n",
- (u32) (b->error), (u32) (b->ref_count),
- (u32) (b->buffer_pool_index));
- s = format (s,
- "trace_index: %d, len_not_first_buf: %d\n",
- b->trace_index, b->total_length_not_including_first_buffer);
- return s;
-}
-
-#define A(x) vec_add1(vm->pcap_buffer, (x))
-
-static void
-dispatch_pcap_trace (vlib_main_t * vm,
- vlib_node_runtime_t * node, vlib_frame_t * frame)
-{
- int i;
- vlib_buffer_t *bufs[VLIB_FRAME_SIZE], **bufp, *b;
- pcap_main_t *pm = &vm->dispatch_pcap_main;
- vlib_trace_main_t *tm = &vm->trace_main;
- u32 capture_size;
- vlib_node_t *n;
- i32 n_left;
- f64 time_now = vlib_time_now (vm);
- u32 *from;
- u8 *d;
- u8 string_count;
-
- /* Input nodes don't have frames yet */
- if (frame == 0 || frame->n_vectors == 0)
- return;
-
- from = vlib_frame_vector_args (frame);
- vlib_get_buffers (vm, from, bufs, frame->n_vectors);
- bufp = bufs;
-
- n = vlib_get_node (vm, node->node_index);
-
- for (i = 0; i < frame->n_vectors; i++)
- {
- if (PREDICT_TRUE (pm->n_packets_captured < pm->n_packets_to_capture))
- {
- b = bufp[i];
-
- vec_reset_length (vm->pcap_buffer);
- string_count = 0;
-
- /* Version, flags */
- A ((u8) VLIB_PCAP_MAJOR_VERSION);
- A ((u8) VLIB_PCAP_MINOR_VERSION);
- A (0 /* string_count */ );
- A (n->protocol_hint);
-
- /* Buffer index (big endian) */
- A ((from[i] >> 24) & 0xff);
- A ((from[i] >> 16) & 0xff);
- A ((from[i] >> 8) & 0xff);
- A ((from[i] >> 0) & 0xff);
-
- /* Node name, NULL-terminated ASCII */
- vm->pcap_buffer = format (vm->pcap_buffer, "%v%c", n->name, 0);
- string_count++;
-
- vm->pcap_buffer = format (vm->pcap_buffer, "%U%c",
- format_buffer_metadata, b, 0);
- string_count++;
- vm->pcap_buffer = format (vm->pcap_buffer, "%U%c",
- format_vnet_buffer_opaque, b, 0);
- string_count++;
- vm->pcap_buffer = format (vm->pcap_buffer, "%U%c",
- format_vnet_buffer_opaque2, b, 0);
- string_count++;
-
- /* Is this packet traced? */
- if (PREDICT_FALSE (b->flags & VLIB_BUFFER_IS_TRACED))
- {
- vlib_trace_header_t **h
- = pool_elt_at_index (tm->trace_buffer_pool, b->trace_index);
-
- vm->pcap_buffer = format (vm->pcap_buffer, "%U%c",
- format_vlib_trace, vm, h[0], 0);
- string_count++;
- }
-
- /* Save the string count */
- vm->pcap_buffer[2] = string_count;
-
- /* Figure out how many bytes in the pcap trace */
- capture_size = vec_len (vm->pcap_buffer) +
- +vlib_buffer_length_in_chain (vm, b);
-
- clib_spinlock_lock_if_init (&pm->lock);
- n_left = clib_min (capture_size, 16384);
- d = pcap_add_packet (pm, time_now, n_left, capture_size);
-
- /* Copy the header */
- clib_memcpy_fast (d, vm->pcap_buffer, vec_len (vm->pcap_buffer));
- d += vec_len (vm->pcap_buffer);
-
- n_left = clib_min
- (vlib_buffer_length_in_chain (vm, b),
- (16384 - vec_len (vm->pcap_buffer)));
- /* Copy the packet data */
- while (1)
- {
- u32 copy_length = clib_min ((u32) n_left, b->current_length);
- clib_memcpy_fast (d, b->data + b->current_data, copy_length);
- n_left -= b->current_length;
- if (n_left <= 0)
- break;
- d += b->current_length;
- ASSERT (b->flags & VLIB_BUFFER_NEXT_PRESENT);
- b = vlib_get_buffer (vm, b->next_buffer);
- }
- clib_spinlock_unlock_if_init (&pm->lock);
- }
- }
-}
-