From: Joe Stringer Date: Wed, 11 Jul 2012 12:01:11 +0000 (+1200) Subject: tests: Improve test coverage of OXM metadata field X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7525e578b697c4c3d274736c98f1efd0be43dc09;p=openvswitch tests: Improve test coverage of OXM metadata field Signed-off-by: Joe Stringer Signed-off-by: Ben Pfaff --- diff --git a/tests/ovs-ofctl.at b/tests/ovs-ofctl.at index e77d3fcb..97ea703f 100644 --- a/tests/ovs-ofctl.at +++ b/tests/ovs-ofctl.at @@ -42,6 +42,7 @@ actions=set_tunnel:0x1234,set_tunnel64:0x9876,set_tunnel:0x123456789 actions=multipath(eth_src, 50, hrw, 12, 0, NXM_NX_REG0[0..3]),multipath(symmetric_l4, 1024, iter_hash, 5000, 5050, NXM_NX_REG0[0..12]) table=1,actions=drop tun_id=0x1234000056780000/0xffff0000ffff0000,actions=drop +metadata=0x1234ffff5678ffff/0xffff0000ffff0000,actions=drop actions=bundle(eth_src,50,active_backup,ofport,slaves:1) actions=bundle(symmetric_l4,60,hrw,ofport,slaves:2,3) actions=bundle(symmetric_l4,60,hrw,ofport,slaves:) @@ -75,6 +76,7 @@ NXT_FLOW_MOD: ADD table:255 actions=set_tunnel:0x1234,set_tunnel64:0x9876,set_tu NXT_FLOW_MOD: ADD table:255 actions=multipath(eth_src,50,hrw,12,0,NXM_NX_REG0[0..3]),multipath(symmetric_l4,1024,iter_hash,5000,5050,NXM_NX_REG0[0..12]) NXT_FLOW_MOD: ADD table:1 actions=drop NXT_FLOW_MOD: ADD table:255 tun_id=0x1234000056780000/0xffff0000ffff0000 actions=drop +NXT_FLOW_MOD: ADD table:255 metadata=0x1234000056780000/0xffff0000ffff0000 actions=drop NXT_FLOW_MOD: ADD table:255 actions=bundle(eth_src,50,active_backup,ofport,slaves:1) NXT_FLOW_MOD: ADD table:255 actions=bundle(symmetric_l4,60,hrw,ofport,slaves:2,3) NXT_FLOW_MOD: ADD table:255 actions=bundle(symmetric_l4,60,hrw,ofport,slaves:) @@ -1296,12 +1298,15 @@ OXM_OF_IN_PORT(00000001), OXM_OF_ETH_TYPE(0800) ]) AT_CLEANUP -dnl Check that "-F openflow10" rejects a flow_mod with a tun_id, since -dnl OpenFlow 1.0 doesn't support tunnels. -AT_SETUP([ovs-ofctl -F option and tun_id]) +dnl Check that "-F openflow10" rejects a flow_mod with unsupported features, +dnl such as tunnels and metadata. +AT_SETUP([ovs-ofctl -F option and NXM features]) AT_CHECK([ovs-ofctl -F openflow10 add-flow dummy tun_id=123,actions=drop], [1], [], [ovs-ofctl: none of the usable flow formats (NXM) is among the allowed flow formats (OpenFlow10) ]) +AT_CHECK([ovs-ofctl -F openflow10 add-flow dummy metadata=123,actions=drop], + [1], [], [ovs-ofctl: none of the usable flow formats (NXM) is among the allowed flow formats (OpenFlow10) +]) AT_CLEANUP dnl Check that "-F nxm" really forces add-flow to use the NXM flow format. diff --git a/tests/test-classifier.c b/tests/test-classifier.c index 25f6edb4..e7cf734a 100644 --- a/tests/test-classifier.c +++ b/tests/test-classifier.c @@ -45,6 +45,7 @@ /* FWW_* bit(s) member name name */ \ /* -------------------------- ----------- -------- */ \ CLS_FIELD(0, tun_id, TUN_ID) \ + CLS_FIELD(0, metadata, METADATA) \ CLS_FIELD(0, nw_src, NW_SRC) \ CLS_FIELD(0, nw_dst, NW_DST) \ CLS_FIELD(FWW_IN_PORT, in_port, IN_PORT) \ @@ -213,6 +214,9 @@ match(const struct cls_rule *wild, const struct flow *fixed) & wild->wc.vlan_tci_mask); } else if (f_idx == CLS_F_IDX_TUN_ID) { eq = !((fixed->tun_id ^ wild->flow.tun_id) & wild->wc.tun_id_mask); + } else if (f_idx == CLS_F_IDX_METADATA) { + eq = !((fixed->metadata ^ wild->flow.metadata) + & wild->wc.metadata_mask); } else if (f_idx == CLS_F_IDX_NW_DSCP) { eq = !((fixed->nw_tos ^ wild->flow.nw_tos) & IP_DSCP_MASK); } else { @@ -263,6 +267,9 @@ static ovs_be32 nw_dst_values[] = { CONSTANT_HTONL(0xc0a80002), static ovs_be64 tun_id_values[] = { 0, CONSTANT_HTONLL(UINT64_C(0xfedcba9876543210)) }; +static ovs_be64 metadata_values[] = { + 0, + CONSTANT_HTONLL(UINT64_C(0xfedcba9876543210)) }; static uint16_t in_port_values[] = { 1, OFPP_LOCAL }; static ovs_be16 vlan_tci_values[] = { CONSTANT_HTONS(101), CONSTANT_HTONS(0) }; static ovs_be16 dl_type_values[] @@ -285,6 +292,9 @@ init_values(void) values[CLS_F_IDX_TUN_ID][0] = &tun_id_values[0]; values[CLS_F_IDX_TUN_ID][1] = &tun_id_values[1]; + values[CLS_F_IDX_METADATA][0] = &metadata_values[0]; + values[CLS_F_IDX_METADATA][1] = &metadata_values[1]; + values[CLS_F_IDX_IN_PORT][0] = &in_port_values[0]; values[CLS_F_IDX_IN_PORT][1] = &in_port_values[1]; @@ -322,6 +332,7 @@ init_values(void) #define N_NW_SRC_VALUES ARRAY_SIZE(nw_src_values) #define N_NW_DST_VALUES ARRAY_SIZE(nw_dst_values) #define N_TUN_ID_VALUES ARRAY_SIZE(tun_id_values) +#define N_METADATA_VALUES ARRAY_SIZE(metadata_values) #define N_IN_PORT_VALUES ARRAY_SIZE(in_port_values) #define N_VLAN_TCI_VALUES ARRAY_SIZE(vlan_tci_values) #define N_DL_TYPE_VALUES ARRAY_SIZE(dl_type_values) @@ -369,6 +380,7 @@ compare_classifiers(struct classifier *cls, struct tcls *tcls) flow.nw_src = nw_src_values[get_value(&x, N_NW_SRC_VALUES)]; flow.nw_dst = nw_dst_values[get_value(&x, N_NW_DST_VALUES)]; flow.tun_id = tun_id_values[get_value(&x, N_TUN_ID_VALUES)]; + flow.metadata = metadata_values[get_value(&x, N_METADATA_VALUES)]; flow.in_port = in_port_values[get_value(&x, N_IN_PORT_VALUES)]; flow.vlan_tci = vlan_tci_values[get_value(&x, N_VLAN_TCI_VALUES)]; flow.dl_type = dl_type_values[get_value(&x, N_DL_TYPE_VALUES)]; @@ -485,6 +497,8 @@ make_rule(int wc_fields, unsigned int priority, int value_pat) rule->cls_rule.wc.vlan_tci_mask = htons(UINT16_MAX); } else if (f_idx == CLS_F_IDX_TUN_ID) { rule->cls_rule.wc.tun_id_mask = htonll(UINT64_MAX); + } else if (f_idx == CLS_F_IDX_METADATA) { + rule->cls_rule.wc.metadata_mask = htonll(UINT64_MAX); } else { NOT_REACHED(); }