2
0
mirror of https://github.com/openvswitch/ovs synced 2025-09-05 08:45:23 +00:00

netdev-dpdk: add debug for rte flow patterns

For debug purpose.

Co-authored-by: Finn Christensen <fc@napatech.com>
Signed-off-by: Yuanhan Liu <yliu@fridaylinux.org>
Signed-off-by: Finn Christensen <fc@napatech.com>
Co-authored-by: Shahaf Shuler <shahafs@mellanox.com>
Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
Signed-off-by: Ian Stokes <ian.stokes@intel.com>
This commit is contained in:
Yuanhan Liu
2018-06-25 16:21:07 +03:00
committed by Ian Stokes
parent e8a2b5bf92
commit daf90186e2

View File

@@ -3970,6 +3970,182 @@ struct flow_actions {
int current_max;
};
static void
dump_flow_pattern(struct rte_flow_item *item)
{
if (item->type == RTE_FLOW_ITEM_TYPE_ETH) {
const struct rte_flow_item_eth *eth_spec = item->spec;
const struct rte_flow_item_eth *eth_mask = item->mask;
VLOG_DBG("rte flow eth pattern:\n");
if (eth_spec) {
VLOG_DBG(" Spec: src="ETH_ADDR_FMT", dst="ETH_ADDR_FMT", "
"type=0x%04" PRIx16"\n",
eth_spec->src.addr_bytes[0], eth_spec->src.addr_bytes[1],
eth_spec->src.addr_bytes[2], eth_spec->src.addr_bytes[3],
eth_spec->src.addr_bytes[4], eth_spec->src.addr_bytes[5],
eth_spec->dst.addr_bytes[0], eth_spec->dst.addr_bytes[1],
eth_spec->dst.addr_bytes[2], eth_spec->dst.addr_bytes[3],
eth_spec->dst.addr_bytes[4], eth_spec->dst.addr_bytes[5],
ntohs(eth_spec->type));
} else {
VLOG_DBG(" Spec = null\n");
}
if (eth_mask) {
VLOG_DBG(" Mask: src="ETH_ADDR_FMT", dst="ETH_ADDR_FMT", "
"type=0x%04"PRIx16"\n",
eth_mask->src.addr_bytes[0], eth_mask->src.addr_bytes[1],
eth_mask->src.addr_bytes[2], eth_mask->src.addr_bytes[3],
eth_mask->src.addr_bytes[4], eth_mask->src.addr_bytes[5],
eth_mask->dst.addr_bytes[0], eth_mask->dst.addr_bytes[1],
eth_mask->dst.addr_bytes[2], eth_mask->dst.addr_bytes[3],
eth_mask->dst.addr_bytes[4], eth_mask->dst.addr_bytes[5],
eth_mask->type);
} else {
VLOG_DBG(" Mask = null\n");
}
}
if (item->type == RTE_FLOW_ITEM_TYPE_VLAN) {
const struct rte_flow_item_vlan *vlan_spec = item->spec;
const struct rte_flow_item_vlan *vlan_mask = item->mask;
VLOG_DBG("rte flow vlan pattern:\n");
if (vlan_spec) {
VLOG_DBG(" Spec: tpid=0x%"PRIx16", tci=0x%"PRIx16"\n",
ntohs(vlan_spec->tpid), ntohs(vlan_spec->tci));
} else {
VLOG_DBG(" Spec = null\n");
}
if (vlan_mask) {
VLOG_DBG(" Mask: tpid=0x%"PRIx16", tci=0x%"PRIx16"\n",
vlan_mask->tpid, vlan_mask->tci);
} else {
VLOG_DBG(" Mask = null\n");
}
}
if (item->type == RTE_FLOW_ITEM_TYPE_IPV4) {
const struct rte_flow_item_ipv4 *ipv4_spec = item->spec;
const struct rte_flow_item_ipv4 *ipv4_mask = item->mask;
VLOG_DBG("rte flow ipv4 pattern:\n");
if (ipv4_spec) {
VLOG_DBG(" Spec: tos=0x%"PRIx8", ttl=%"PRIx8", proto=0x%"PRIx8
", src="IP_FMT", dst="IP_FMT"\n",
ipv4_spec->hdr.type_of_service,
ipv4_spec->hdr.time_to_live,
ipv4_spec->hdr.next_proto_id,
IP_ARGS(ipv4_spec->hdr.src_addr),
IP_ARGS(ipv4_spec->hdr.dst_addr));
} else {
VLOG_DBG(" Spec = null\n");
}
if (ipv4_mask) {
VLOG_DBG(" Mask: tos=0x%"PRIx8", ttl=%"PRIx8", proto=0x%"PRIx8
", src="IP_FMT", dst="IP_FMT"\n",
ipv4_mask->hdr.type_of_service,
ipv4_mask->hdr.time_to_live,
ipv4_mask->hdr.next_proto_id,
IP_ARGS(ipv4_mask->hdr.src_addr),
IP_ARGS(ipv4_mask->hdr.dst_addr));
} else {
VLOG_DBG(" Mask = null\n");
}
}
if (item->type == RTE_FLOW_ITEM_TYPE_UDP) {
const struct rte_flow_item_udp *udp_spec = item->spec;
const struct rte_flow_item_udp *udp_mask = item->mask;
VLOG_DBG("rte flow udp pattern:\n");
if (udp_spec) {
VLOG_DBG(" Spec: src_port=%"PRIu16", dst_port=%"PRIu16"\n",
ntohs(udp_spec->hdr.src_port),
ntohs(udp_spec->hdr.dst_port));
} else {
VLOG_DBG(" Spec = null\n");
}
if (udp_mask) {
VLOG_DBG(" Mask: src_port=0x%"PRIx16", dst_port=0x%"PRIx16"\n",
udp_mask->hdr.src_port,
udp_mask->hdr.dst_port);
} else {
VLOG_DBG(" Mask = null\n");
}
}
if (item->type == RTE_FLOW_ITEM_TYPE_SCTP) {
const struct rte_flow_item_sctp *sctp_spec = item->spec;
const struct rte_flow_item_sctp *sctp_mask = item->mask;
VLOG_DBG("rte flow sctp pattern:\n");
if (sctp_spec) {
VLOG_DBG(" Spec: src_port=%"PRIu16", dst_port=%"PRIu16"\n",
ntohs(sctp_spec->hdr.src_port),
ntohs(sctp_spec->hdr.dst_port));
} else {
VLOG_DBG(" Spec = null\n");
}
if (sctp_mask) {
VLOG_DBG(" Mask: src_port=0x%"PRIx16", dst_port=0x%"PRIx16"\n",
sctp_mask->hdr.src_port,
sctp_mask->hdr.dst_port);
} else {
VLOG_DBG(" Mask = null\n");
}
}
if (item->type == RTE_FLOW_ITEM_TYPE_ICMP) {
const struct rte_flow_item_icmp *icmp_spec = item->spec;
const struct rte_flow_item_icmp *icmp_mask = item->mask;
VLOG_DBG("rte flow icmp pattern:\n");
if (icmp_spec) {
VLOG_DBG(" Spec: icmp_type=%"PRIu8", icmp_code=%"PRIu8"\n",
ntohs(icmp_spec->hdr.icmp_type),
ntohs(icmp_spec->hdr.icmp_code));
} else {
VLOG_DBG(" Spec = null\n");
}
if (icmp_mask) {
VLOG_DBG(" Mask: icmp_type=0x%"PRIx8", icmp_code=0x%"PRIx8"\n",
icmp_spec->hdr.icmp_type,
icmp_spec->hdr.icmp_code);
} else {
VLOG_DBG(" Mask = null\n");
}
}
if (item->type == RTE_FLOW_ITEM_TYPE_TCP) {
const struct rte_flow_item_tcp *tcp_spec = item->spec;
const struct rte_flow_item_tcp *tcp_mask = item->mask;
VLOG_DBG("rte flow tcp pattern:\n");
if (tcp_spec) {
VLOG_DBG(" Spec: src_port=%"PRIu16", dst_port=%"PRIu16
", data_off=0x%"PRIx8", tcp_flags=0x%"PRIx8"\n",
ntohs(tcp_spec->hdr.src_port),
ntohs(tcp_spec->hdr.dst_port),
tcp_spec->hdr.data_off,
tcp_spec->hdr.tcp_flags);
} else {
VLOG_DBG(" Spec = null\n");
}
if (tcp_mask) {
VLOG_DBG(" Mask: src_port=%"PRIx16", dst_port=%"PRIx16
", data_off=0x%"PRIx8", tcp_flags=0x%"PRIx8"\n",
tcp_mask->hdr.src_port,
tcp_mask->hdr.dst_port,
tcp_mask->hdr.data_off,
tcp_mask->hdr.tcp_flags);
} else {
VLOG_DBG(" Mask = null\n");
}
}
}
static void
add_flow_pattern(struct flow_patterns *patterns, enum rte_flow_item_type type,
const void *spec, const void *mask) {
@@ -3989,6 +4165,7 @@ add_flow_pattern(struct flow_patterns *patterns, enum rte_flow_item_type type,
patterns->items[cnt].spec = spec;
patterns->items[cnt].mask = mask;
patterns->items[cnt].last = NULL;
dump_flow_pattern(&patterns->items[cnt]);
patterns->cnt++;
}