Skip to content

Commit

Permalink
[drop counters] Improve support for combined L2/L3 drop counters (#1649)
Browse files Browse the repository at this point in the history
- Get the correct interface for combined L2/L3 counters
- Add Arista and Dell SKUs to the combined counter list

Signed-off-by: Danny Allen <daall@microsoft.com>
  • Loading branch information
daall authored May 12, 2020
1 parent ebd43dd commit cbaef7e
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 42 deletions.
6 changes: 5 additions & 1 deletion tests/drop_counters/combined_drop_counters.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@
# - "x86_64-mlnx"
# - "x86_64-dell.*"
l2_l3:
- "x86_64-dell.*"
- "x86_64-arista.*"

acl_l2:
- "x86_64-mlnx"
- "x86_64-mlnx"
- "x86_64-dell.*"
- "x86_64-arista.*"
85 changes: 44 additions & 41 deletions tests/drop_counters/test_drop_counters.py
Original file line number Diff line number Diff line change
Expand Up @@ -423,28 +423,35 @@ def verify_drop_counters(duthost, dut_iface, get_cnt_cli_cmd, column_key):
pytest.fail(fail_msg)


def base_verification(discard_group, pkt, ptfadapter, duthost, ptf_tx_port_id, dut_iface, l2_col_key=RX_DRP, l3_col_key=RX_ERR):
def base_verification(discard_group, pkt, ptfadapter, duthost, ports_info, tx_dut_ports=None,
l2_col_key=RX_DRP, l3_col_key=RX_ERR):
"""
Base test function for verification of L2 or L3 packet drops. Verification type depends on 'discard_group' value.
Supported 'discard_group' values: 'L2', 'L3', 'ACL'
"""
send_packets(pkt, duthost, ptfadapter, ptf_tx_port_id)
send_packets(pkt, duthost, ptfadapter, ports_info["ptf_tx_port_id"])
if discard_group == "L2":
verify_drop_counters(duthost, dut_iface, GET_L2_COUNTERS, l2_col_key)
verify_drop_counters(duthost, ports_info["dut_iface"], GET_L2_COUNTERS, l2_col_key)
ensure_no_l3_drops(duthost)
elif discard_group == "L3":
if COMBINED_L2L3_DROP_COUNTER:
verify_drop_counters(duthost, dut_iface, GET_L2_COUNTERS, l2_col_key)
verify_drop_counters(duthost, ports_info["dut_iface"], GET_L2_COUNTERS, l2_col_key)
ensure_no_l3_drops(duthost)
else:
verify_drop_counters(duthost, dut_iface, GET_L3_COUNTERS, l3_col_key)
if not tx_dut_ports:
pytest.fail("No L3 interface specified")

verify_drop_counters(duthost, tx_dut_ports[ports_info["dut_iface"]], GET_L3_COUNTERS, l3_col_key)
ensure_no_l2_drops(duthost)
elif discard_group == "ACL":
if not tx_dut_ports:
pytest.fail("No L3 interface specified")

time.sleep(ACL_COUNTERS_UPDATE_INTERVAL)
acl_drops = duthost.acl_facts()["ansible_facts"]["ansible_acl_facts"]["DATAACL"]["rules"]["RULE_1"]["packets_count"]
if acl_drops != PKT_NUMBER:
fail_msg = "ACL drop counter was not incremented on iface {}. DUT ACL counter == {}; Sent pkts == {}".format(
dut_iface, acl_drops, PKT_NUMBER
tx_dut_ports[ports_info["dut_iface"]], acl_drops, PKT_NUMBER
)
pytest.fail(fail_msg)
if not COMBINED_ACL_DROP_COUNTER:
Expand All @@ -454,18 +461,18 @@ def base_verification(discard_group, pkt, ptfadapter, duthost, ptf_tx_port_id, d
pytest.fail("Incorrect 'discard_group' specified. Supported values: 'L2' or 'L3'")


def do_test(discard_group, pkt, ptfadapter, duthost, ptf_tx_port_id, dut_iface, sniff_ports, l2_col_key=RX_DRP, l3_col_key=RX_ERR):
def do_test(discard_group, pkt, ptfadapter, duthost, ports_info, sniff_ports, tx_dut_ports=None,
l2_col_key=RX_DRP, l3_col_key=RX_ERR):
"""
Execute test - send packet, check that expected discard counters were incremented and packet was dropped
@param discard_group: Supported 'discard_group' values: 'L2', 'L3', 'ACL'
@param pkt: PTF composed packet, sent by test case
@param ptfadapter: fixture
@param duthost: fixture
@param ptf_tx_port_id: TX PTF port ID
@param dut_iface: DUT interface name expected to receive packets from PTF
@param sniff_ports: DUT ports to check that packets were not egressed from
"""
base_verification(discard_group, pkt, ptfadapter, duthost, ptf_tx_port_id, dut_iface, l2_col_key, l3_col_key)
base_verification(discard_group, pkt, ptfadapter, duthost, ports_info, tx_dut_ports, l2_col_key, l3_col_key)

# Verify packets were not egresed the DUT
exp_pkt = expected_packet_mask(pkt)
Expand Down Expand Up @@ -493,7 +500,7 @@ def test_equal_smac_dmac_drop(ptfadapter, duthost, setup, fanouthost, pkt_fields
tcp_sport=pkt_fields["tcp_sport"],
tcp_dport=pkt_fields["tcp_dport"])

do_test("L2", pkt, ptfadapter, duthost, ports_info["ptf_tx_port_id"], ports_info["dut_iface"], setup["neighbor_sniff_ports"])
do_test("L2", pkt, ptfadapter, duthost, ports_info, setup["neighbor_sniff_ports"])


def test_multicast_smac_drop(ptfadapter, duthost, setup, fanouthost, pkt_fields, ports_info):
Expand All @@ -519,7 +526,7 @@ def test_multicast_smac_drop(ptfadapter, duthost, setup, fanouthost, pkt_fields,
tcp_sport=pkt_fields["tcp_sport"],
tcp_dport=pkt_fields["tcp_dport"])

do_test("L2", pkt, ptfadapter, duthost, ports_info["ptf_tx_port_id"], ports_info["dut_iface"], setup["neighbor_sniff_ports"])
do_test("L2", pkt, ptfadapter, duthost, ports_info, setup["neighbor_sniff_ports"])


def test_reserved_dmac_drop(ptfadapter, duthost, setup, fanouthost, pkt_fields, ports_info):
Expand Down Expand Up @@ -548,7 +555,7 @@ def test_reserved_dmac_drop(ptfadapter, duthost, setup, fanouthost, pkt_fields,
tcp_sport=pkt_fields["tcp_sport"],
tcp_dport=pkt_fields["tcp_dport"])

do_test("L2", pkt, ptfadapter, duthost, ports_info["ptf_tx_port_id"], ports_info["dut_iface"], setup["neighbor_sniff_ports"])
do_test("L2", pkt, ptfadapter, duthost, ports_info, setup["neighbor_sniff_ports"])


def test_not_expected_vlan_tag_drop(ptfadapter, duthost, setup, pkt_fields, ports_info):
Expand Down Expand Up @@ -579,7 +586,7 @@ def test_not_expected_vlan_tag_drop(ptfadapter, duthost, setup, pkt_fields, port
vlan_vid=vlan_id,
)

do_test("L2", pkt, ptfadapter, duthost, ports_info["ptf_tx_port_id"], ports_info["dut_iface"], setup["neighbor_sniff_ports"])
do_test("L2", pkt, ptfadapter, duthost, ports_info, setup["neighbor_sniff_ports"])


def test_dst_ip_is_loopback_addr(ptfadapter, duthost, setup, pkt_fields, tx_dut_ports, ports_info):
Expand All @@ -598,7 +605,7 @@ def test_dst_ip_is_loopback_addr(ptfadapter, duthost, setup, pkt_fields, tx_dut_
tcp_sport=pkt_fields["tcp_sport"],
tcp_dport=pkt_fields["tcp_dport"])

do_test("L3", pkt, ptfadapter, duthost, ports_info["ptf_tx_port_id"], tx_dut_ports[ports_info["dut_iface"]], setup["neighbor_sniff_ports"])
do_test("L3", pkt, ptfadapter, duthost, ports_info, setup["neighbor_sniff_ports"], tx_dut_ports)


def test_src_ip_is_loopback_addr(ptfadapter, duthost, setup, tx_dut_ports, pkt_fields, ports_info):
Expand All @@ -617,7 +624,7 @@ def test_src_ip_is_loopback_addr(ptfadapter, duthost, setup, tx_dut_ports, pkt_f
tcp_sport=pkt_fields["tcp_sport"],
tcp_dport=pkt_fields["tcp_dport"])

do_test("L3", pkt, ptfadapter, duthost, ports_info["ptf_tx_port_id"], tx_dut_ports[ports_info["dut_iface"]], setup["neighbor_sniff_ports"])
do_test("L3", pkt, ptfadapter, duthost, ports_info, setup["neighbor_sniff_ports"], tx_dut_ports)


def test_dst_ip_absent(ptfadapter, duthost, setup, tx_dut_ports, pkt_fields, ports_info):
Expand All @@ -633,7 +640,8 @@ def test_dst_ip_absent(ptfadapter, duthost, setup, tx_dut_ports, pkt_fields, por
ip_dst="", # VM source
tcp_sport=pkt_fields["tcp_sport"],
tcp_dport=pkt_fields["tcp_dport"])
do_test("L3", pkt, ptfadapter, duthost, ports_info["ptf_tx_port_id"], tx_dut_ports[ports_info["dut_iface"]], setup["neighbor_sniff_ports"])

do_test("L3", pkt, ptfadapter, duthost, ports_info, setup["neighbor_sniff_ports"], tx_dut_ports)


@pytest.mark.parametrize("ip_addr", ["ipv4", "ipv6"])
Expand Down Expand Up @@ -667,8 +675,8 @@ def test_src_ip_is_multicast_addr(ptfadapter, duthost, setup, tx_dut_ports, pkt_
pytest.fail("Incorrect value specified for 'ip_addr' test parameter. Supported parameters: 'ipv4' and 'ipv6'")

log_pkt_params(ports_info["dut_iface"], ports_info["dst_mac"], ports_info["src_mac"], pkt_fields["ipv4_dst"], ip_src)
do_test("L3", pkt, ptfadapter, duthost, ports_info["ptf_tx_port_id"], tx_dut_ports[ports_info["dut_iface"]],
setup["neighbor_sniff_ports"])

do_test("L3", pkt, ptfadapter, duthost, ports_info, setup["neighbor_sniff_ports"], tx_dut_ports)


def test_src_ip_is_class_e(ptfadapter, duthost, setup, tx_dut_ports, pkt_fields, ports_info):
Expand All @@ -688,8 +696,8 @@ def test_src_ip_is_class_e(ptfadapter, duthost, setup, tx_dut_ports, pkt_fields,
ip_dst=pkt_fields["ipv4_dst"], # VM source
tcp_sport=pkt_fields["tcp_sport"],
tcp_dport=pkt_fields["tcp_dport"])
do_test("L3", pkt, ptfadapter, duthost, ports_info["ptf_tx_port_id"], tx_dut_ports[ports_info["dut_iface"]],
setup["neighbor_sniff_ports"])

do_test("L3", pkt, ptfadapter, duthost, ports_info, setup["neighbor_sniff_ports"], tx_dut_ports)


@pytest.mark.parametrize("addr_type, addr_direction", [("ipv4", "src"), ("ipv6", "src"), ("ipv4", "dst"),
Expand Down Expand Up @@ -734,8 +742,8 @@ def test_ip_is_zero_addr(ptfadapter, duthost, setup, tx_dut_ports, pkt_fields, a
pytest.fail("Incorrect value specified for 'addr_type' test parameter. Supported parameters: 'ipv4' or 'ipv6'")

logger.info(pkt_params)
do_test("L3", pkt, ptfadapter, duthost, ports_info["ptf_tx_port_id"], tx_dut_ports[ports_info["dut_iface"]],
setup["dut_to_ptf_port_map"].values())

do_test("L3", pkt, ptfadapter, duthost, ports_info, setup["dut_to_ptf_port_map"].values(), tx_dut_ports)


@pytest.mark.parametrize("addr_direction", ["src", "dst"])
Expand Down Expand Up @@ -763,8 +771,7 @@ def test_ip_link_local(ptfadapter, duthost, setup, tx_dut_ports, pkt_fields, add
pkt = testutils.simple_tcp_packet(**pkt_params)

logger.info(pkt_params)
do_test("L3", pkt, ptfadapter, duthost, ports_info["ptf_tx_port_id"], tx_dut_ports[ports_info["dut_iface"]],
setup["neighbor_sniff_ports"])
do_test("L3", pkt, ptfadapter, duthost, ports_info, setup["neighbor_sniff_ports"], tx_dut_ports)


# Test case is skipped, because SONiC does not have a control to adjust loop-back filter settings.
Expand Down Expand Up @@ -798,8 +805,7 @@ def test_loopback_filter(ptfadapter, duthost, setup, tx_dut_ports, pkt_fields, p
tcp_sport=pkt_fields["tcp_sport"],
tcp_dport=pkt_fields["tcp_dport"])

do_test("L3", pkt, ptfadapter, duthost, ports_info["ptf_tx_port_id"], tx_dut_ports[ports_info["dut_iface"]],
setup["neighbor_sniff_ports"])
do_test("L3", pkt, ptfadapter, duthost, ports_info, setup["neighbor_sniff_ports"], tx_dut_ports)


def test_ip_pkt_with_exceeded_mtu(ptfadapter, duthost, setup, tx_dut_ports, pkt_fields, mtu_config, ports_info):
Expand All @@ -826,8 +832,7 @@ def test_ip_pkt_with_exceeded_mtu(ptfadapter, duthost, setup, tx_dut_ports, pkt_
tcp_dport=pkt_fields["tcp_dport"]
)

do_test("L2", pkt, ptfadapter, duthost, ports_info["ptf_tx_port_id"], ports_info["dut_iface"], setup["neighbor_sniff_ports"],
l2_col_key=RX_ERR)
do_test("L2", pkt, ptfadapter, duthost, ports_info, setup["neighbor_sniff_ports"], l2_col_key=RX_ERR)


def test_ip_pkt_with_expired_ttl(ptfadapter, duthost, setup, tx_dut_ports, pkt_fields, ports_info):
Expand All @@ -846,8 +851,7 @@ def test_ip_pkt_with_expired_ttl(ptfadapter, duthost, setup, tx_dut_ports, pkt_f
tcp_dport=pkt_fields["tcp_dport"],
ip_ttl=0)

do_test("L3", pkt, ptfadapter, duthost, ports_info["ptf_tx_port_id"], tx_dut_ports[ports_info["dut_iface"]],
setup["neighbor_sniff_ports"])
do_test("L3", pkt, ptfadapter, duthost, ports_info, setup["neighbor_sniff_ports"], tx_dut_ports)


@pytest.mark.parametrize("igmp_version,msg_type", [("v1", "membership_query"), ("v3", "membership_query"), ("v1", "membership_report"),
Expand Down Expand Up @@ -907,8 +911,8 @@ def test_non_routable_igmp_pkts(ptfadapter, duthost, setup, tx_dut_ports, pkt_fi

del pkt[testutils.scapy.scapy.all.Raw]
pkt = pkt / igmp_types[igmp_version][msg_type]
do_test("L3", pkt, ptfadapter, duthost, ports_info["ptf_tx_port_id"], tx_dut_ports[ports_info["dut_iface"]],
setup["dut_to_ptf_port_map"].values())

do_test("L3", pkt, ptfadapter, duthost, ports_info, setup["dut_to_ptf_port_map"].values(), tx_dut_ports)


def test_absent_ip_header(ptfadapter, duthost, setup, tx_dut_ports, pkt_fields, ports_info):
Expand All @@ -931,8 +935,7 @@ def test_absent_ip_header(ptfadapter, duthost, setup, tx_dut_ports, pkt_fields,
pkt.type = 0x800
pkt = pkt/tcp

do_test("L3", pkt, ptfadapter, duthost, ports_info["ptf_tx_port_id"], tx_dut_ports[ports_info["dut_iface"]],
setup["neighbor_sniff_ports"])
do_test("L3", pkt, ptfadapter, duthost, ports_info, setup["neighbor_sniff_ports"], tx_dut_ports)


@pytest.mark.parametrize("pkt_field, value", [("version", 1), ("chksum", 10), ("ihl", 1)])
Expand All @@ -951,8 +954,8 @@ def test_broken_ip_header(ptfadapter, duthost, setup, tx_dut_ports, pkt_fields,
tcp_dport=pkt_fields["tcp_dport"]
)
setattr(pkt[testutils.scapy.scapy.all.IP], pkt_field, value)
do_test("L3", pkt, ptfadapter, duthost, ports_info["ptf_tx_port_id"], tx_dut_ports[ports_info["dut_iface"]],
setup["neighbor_sniff_ports"])

do_test("L3", pkt, ptfadapter, duthost, ports_info, setup["neighbor_sniff_ports"], tx_dut_ports)


@pytest.mark.parametrize("eth_dst", ["01:00:5e:00:01:02", "ff:ff:ff:ff:ff:ff"])
Expand All @@ -973,8 +976,8 @@ def test_unicast_ip_incorrect_eth_dst(ptfadapter, duthost, setup, tx_dut_ports,
tcp_sport=pkt_fields["tcp_sport"],
tcp_dport=pkt_fields["tcp_dport"]
)
do_test("L3", pkt, ptfadapter, duthost, ports_info["ptf_tx_port_id"], tx_dut_ports[ports_info["dut_iface"]],
setup["neighbor_sniff_ports"])

do_test("L3", pkt, ptfadapter, duthost, ports_info, setup["neighbor_sniff_ports"], tx_dut_ports)


def test_acl_drop(ptfadapter, duthost, setup, tx_dut_ports, pkt_fields, acl_setup, ports_info):
Expand All @@ -996,7 +999,7 @@ def test_acl_drop(ptfadapter, duthost, setup, tx_dut_ports, pkt_fields, acl_setu
tcp_sport=pkt_fields["tcp_sport"],
tcp_dport=pkt_fields["tcp_dport"]
)
base_verification("ACL", pkt, ptfadapter, duthost, ports_info["ptf_tx_port_id"], tx_dut_ports[ports_info["dut_iface"]])
base_verification("ACL", pkt, ptfadapter, duthost, ports_info, tx_dut_ports)

# Verify packets were not egresed the DUT
exp_pkt = expected_packet_mask(pkt)
Expand All @@ -1019,5 +1022,5 @@ def test_egress_drop_on_down_link(ptfadapter, duthost, setup, tx_dut_ports, pkt_
tcp_sport=pkt_fields["tcp_sport"],
tcp_dport=pkt_fields["tcp_dport"]
)
do_test("L3", pkt, ptfadapter, duthost, ports_info["ptf_tx_port_id"], tx_dut_ports[ports_info["dut_iface"]],
setup["neighbor_sniff_ports"])

do_test("L3", pkt, ptfadapter, duthost, ports_info, setup["neighbor_sniff_ports"], tx_dut_ports)

0 comments on commit cbaef7e

Please sign in to comment.