diff options
Diffstat (limited to 'src/vnet/pg')
-rw-r--r-- | src/vnet/pg/input.c | 4 | ||||
-rw-r--r-- | src/vnet/pg/output.c | 8 | ||||
-rw-r--r-- | src/vnet/pg/pg.h | 9 |
3 files changed, 18 insertions, 3 deletions
diff --git a/src/vnet/pg/input.c b/src/vnet/pg/input.c index f81485de65f..321472c4d85 100644 --- a/src/vnet/pg/input.c +++ b/src/vnet/pg/input.c @@ -1578,7 +1578,7 @@ fill_buffer_offload_flags (vlib_main_t *vm, u32 *buffers, u32 n_buffers, (VNET_BUFFER_F_IS_IP4 | VNET_BUFFER_F_L2_HDR_OFFSET_VALID | VNET_BUFFER_F_L3_HDR_OFFSET_VALID | VNET_BUFFER_F_L4_HDR_OFFSET_VALID); - if (buffer_oflags & VNET_BUFFER_OFFLOAD_F_IP_CKSUM) + if (buffer_oflags & VNET_BUFFER_OFFLOAD_F_IP_CKSUM || gso_enabled) oflags |= VNET_BUFFER_OFFLOAD_F_IP_CKSUM; } else if (PREDICT_TRUE (ethertype == ETHERNET_TYPE_IP6)) @@ -1596,7 +1596,7 @@ fill_buffer_offload_flags (vlib_main_t *vm, u32 *buffers, u32 n_buffers, if (l4_proto == IP_PROTOCOL_TCP) { - if (buffer_oflags & VNET_BUFFER_OFFLOAD_F_TCP_CKSUM) + if (buffer_oflags & VNET_BUFFER_OFFLOAD_F_TCP_CKSUM || gso_enabled) oflags |= VNET_BUFFER_OFFLOAD_F_TCP_CKSUM; /* only set GSO flag for chained buffers */ diff --git a/src/vnet/pg/output.c b/src/vnet/pg/output.c index 042591a7709..fa1a14cc4af 100644 --- a/src/vnet/pg/output.c +++ b/src/vnet/pg/output.c @@ -88,7 +88,13 @@ pg_output (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) pcap_add_buffer (&pif->pcap_main, vm, bi0, ETHERNET_MAX_PACKET_BYTES); } if (pif->pcap_file_name != 0) - pcap_write (&pif->pcap_main); + { + pcap_packet_type_t pm_pt = pif->pcap_main.packet_type; + pif->pcap_main.packet_type = + pg_intf_mode_to_pcap_packet_type (pif->mode); + pcap_write (&pif->pcap_main); + pif->pcap_main.packet_type = pm_pt; + } if ((pif->pcap_main.flags & PCAP_MAIN_INIT_DONE) && pif->pcap_main.n_packets_captured >= pif->pcap_main.n_packets_to_capture) diff --git a/src/vnet/pg/pg.h b/src/vnet/pg/pg.h index 6d5b25ba25a..bede747428c 100644 --- a/src/vnet/pg/pg.h +++ b/src/vnet/pg/pg.h @@ -306,6 +306,15 @@ typedef enum pg_interface_mode_t_ PG_MODE_IP6, } pg_interface_mode_t; +always_inline pcap_packet_type_t +pg_intf_mode_to_pcap_packet_type (pg_interface_mode_t mode) +{ + if ((mode == PG_MODE_IP4) || (mode == PG_MODE_IP6)) + return PCAP_PACKET_TYPE_ip; + else + return PCAP_PACKET_TYPE_ethernet; +} + typedef struct { /* TX lock */ |