[ovs-dev] [PATCH v2 12/12] [RFC] flow: Support OF1.5+ (draft) actset_output field.
Jarno Rajahalme
jrajahalme at nicira.com
Mon Oct 6 20:45:21 UTC 2014
Looks good, as far as it goes,
Jarno
On Sep 30, 2014, at 5:47 PM, Ben Pfaff <blp at nicira.com> wrote:
> This field allows a flow table to match on the output port currently in the
> action set.
>
> As-is, this patch has a number of deficiencies. I will fix them; I am
> posting for now because I feel like I have sat on this patch series for
> long enough.
>
> Known problems:
>
> * When the action set contains a group action and an output action,
> actset_output should become OFPP_UNSET.
>
> * Missing documentation.
>
> * Missing tests.
>
> * OF1.3 and OF1.4 should use ONFOXM_ET_ACTSET_OUTPUT; OF1.5+ should use
> OXM_OF_ACTSET_OUTPUT. The current patch uses the former for all
> versions.
>
> ONF-JIRA: EXT-233
> Signed-off-by: Ben Pfaff <blp at nicira.com>
> ---
> build-aux/extract-ofp-fields | 1 +
> include/openflow/openflow-1.0.h | 7 ++++---
> lib/flow.c | 10 +++++-----
> lib/flow.h | 10 ++++++----
> lib/match.c | 15 ++++++++++++++-
> lib/match.h | 1 +
> lib/meta-flow.c | 29 +++++++++++++++++++++++------
> lib/meta-flow.h | 12 ++++++++++++
> lib/nx-match.c | 6 +++++-
> lib/odp-util.h | 2 +-
> lib/ofp-util.c | 2 +-
> ofproto/ofproto-dpif-xlate.c | 16 +++++++++++++---
> tests/dpif-netdev.at | 2 +-
> tests/ofproto-dpif.at | 4 ++--
> tests/ofproto.at | 3 ++-
> 15 files changed, 91 insertions(+), 29 deletions(-)
>
> diff --git a/build-aux/extract-ofp-fields b/build-aux/extract-ofp-fields
> index 88eb6d2..b4e7ec3 100755
> --- a/build-aux/extract-ofp-fields
> +++ b/build-aux/extract-ofp-fields
> @@ -59,6 +59,7 @@ OXM_CLASSES = {"NXM_OF_": (0, 0x0000),
> "NXM_NX_": (0, 0x0001),
> "OXM_OF_": (0, 0x8000),
> "OXM_OF_PKT_REG": (0, 0x8001),
> + "ONFOXM_ET_": (0x4f4e4600, 0xffff),
>
> # This is the experimenter OXM class for Nicira, which is the
> # one that OVS would be using instead of NXM_OF_ and NXM_NX_
> diff --git a/include/openflow/openflow-1.0.h b/include/openflow/openflow-1.0.h
> index c67edd9..5e6ddb7 100644
> --- a/include/openflow/openflow-1.0.h
> +++ b/include/openflow/openflow-1.0.h
> @@ -25,16 +25,17 @@
> * --------------- --------------------------------------
> * 0x0000 not assigned a meaning by OpenFlow 1.0
> * 0x0001...0xfeff "physical" ports
> - * 0xff00...0xfff7 "reserved" but not assigned a meaning by OpenFlow 1.0
> - * 0xfff8...0xffff "reserved" OFPP_* ports with assigned meanings
> + * 0xff00...0xfff6 "reserved" but not assigned a meaning by OpenFlow 1.x
> + * 0xfff7...0xffff "reserved" OFPP_* ports with assigned meanings
> */
>
> /* Ranges. */
> #define OFPP_MAX OFP_PORT_C(0xff00) /* Max # of switch ports. */
> -#define OFPP_FIRST_RESV OFP_PORT_C(0xfff8) /* First assigned reserved port. */
> +#define OFPP_FIRST_RESV OFP_PORT_C(0xfff7) /* First assigned reserved port. */
> #define OFPP_LAST_RESV OFP_PORT_C(0xffff) /* Last assigned reserved port. */
>
> /* Reserved output "ports". */
> +#define OFPP15_UNSET OFP_PORT_C(0xfff7) /* For OXM_OF_ACTSET_OUTPUT only. */
> #define OFPP_IN_PORT OFP_PORT_C(0xfff8) /* Where the packet came in. */
> #define OFPP_TABLE OFP_PORT_C(0xfff9) /* Perform actions in flow table. */
> #define OFPP_NORMAL OFP_PORT_C(0xfffa) /* Process with normal L2/L3. */
> diff --git a/lib/flow.c b/lib/flow.c
> index 4f22597..fd94b4f 100644
> --- a/lib/flow.c
> +++ b/lib/flow.c
> @@ -72,9 +72,9 @@ BUILD_ASSERT_DECL(offsetof(struct flow, nw_frag) + 3
>
> /* TCP flags in the first half of a BE32, zeroes in the other half. */
> BUILD_ASSERT_DECL(offsetof(struct flow, tcp_flags) + 2
> - == offsetof(struct flow, pad) &&
> + == offsetof(struct flow, pad2) &&
> offsetof(struct flow, tcp_flags) / 4
> - == offsetof(struct flow, pad) / 4);
> + == offsetof(struct flow, pad2) / 4);
> #if WORDS_BIGENDIAN
> #define TCP_FLAGS_BE32(tcp_ctl) ((OVS_FORCE ovs_be32)TCP_FLAGS_BE16(tcp_ctl) \
> << 16)
> @@ -121,7 +121,7 @@ struct mf_ctx {
> * away. Some GCC versions gave warnings on ALWAYS_INLINE, so these are
> * defined as macros. */
>
> -#if (FLOW_WC_SEQ != 27)
> +#if (FLOW_WC_SEQ != 28)
> #define MINIFLOW_ASSERT(X) ovs_assert(X)
> BUILD_MESSAGE("FLOW_WC_SEQ changed: miniflow_extract() will have runtime "
> "assertions enabled. Consider updating FLOW_WC_SEQ after "
> @@ -668,7 +668,7 @@ flow_unwildcard_tp_ports(const struct flow *flow, struct flow_wildcards *wc)
> void
> flow_get_metadata(const struct flow *flow, struct flow_metadata *fmd)
> {
> - BUILD_ASSERT_DECL(FLOW_WC_SEQ == 27);
> + BUILD_ASSERT_DECL(FLOW_WC_SEQ == 28);
>
> fmd->dp_hash = flow->dp_hash;
> fmd->recirc_id = flow->recirc_id;
> @@ -1338,7 +1338,7 @@ flow_push_mpls(struct flow *flow, int n, ovs_be16 mpls_eth_type,
> flow->mpls_lse[0] = set_mpls_lse_values(ttl, tc, 1, htonl(label));
>
> /* Clear all L3 and L4 fields. */
> - BUILD_ASSERT(FLOW_WC_SEQ == 27);
> + BUILD_ASSERT(FLOW_WC_SEQ == 28);
> memset((char *) flow + FLOW_SEGMENT_2_ENDS_AT, 0,
> sizeof(struct flow) - FLOW_SEGMENT_2_ENDS_AT);
> }
> diff --git a/lib/flow.h b/lib/flow.h
> index 2764916..4c4e6bf 100644
> --- a/lib/flow.h
> +++ b/lib/flow.h
> @@ -38,7 +38,7 @@ struct pkt_metadata;
> /* This sequence number should be incremented whenever anything involving flows
> * or the wildcarding of flows changes. This will cause build assertion
> * failures in places which likely need to be updated. */
> -#define FLOW_WC_SEQ 27
> +#define FLOW_WC_SEQ 28
>
> /* Number of Open vSwitch extension 32-bit registers. */
> #define FLOW_N_REGS 8
> @@ -102,6 +102,8 @@ struct flow {
> uint32_t pkt_mark; /* Packet mark. */
> uint32_t recirc_id; /* Must be exact match. */
> union flow_in_port in_port; /* Input port.*/
> + ofp_port_t actset_output; /* Output port in action set. */
> + ovs_be16 pad1; /* Pad to 32 bits. */
>
> /* L2, Order the same as in the Ethernet header! */
> uint8_t dl_dst[6]; /* Ethernet destination address. */
> @@ -124,7 +126,7 @@ struct flow {
> uint8_t arp_tha[6]; /* ARP/ND target hardware address. */
> struct in6_addr nd_target; /* IPv6 neighbor discovery (ND) target. */
> ovs_be16 tcp_flags; /* TCP flags. With L3 to avoid matching L4. */
> - ovs_be16 pad; /* Padding. */
> + ovs_be16 pad2; /* Pad to 32 bits. */
>
> /* L4 */
> ovs_be16 tp_src; /* TCP/UDP/SCTP source port. */
> @@ -140,8 +142,8 @@ BUILD_ASSERT_DECL(sizeof(struct flow) % 4 == 0);
>
> /* Remember to update FLOW_WC_SEQ when changing 'struct flow'. */
> BUILD_ASSERT_DECL(offsetof(struct flow, dp_hash) + sizeof(uint32_t)
> - == sizeof(struct flow_tnl) + 176
> - && FLOW_WC_SEQ == 27);
> + == sizeof(struct flow_tnl) + 180
> + && FLOW_WC_SEQ == 28);
>
> /* Incremental points at which flow classification may be performed in
> * segments.
> diff --git a/lib/match.c b/lib/match.c
> index c4edbfb..b7d93d1 100644
> --- a/lib/match.c
> +++ b/lib/match.c
> @@ -216,6 +216,13 @@ match_set_xreg_masked(struct match *match, unsigned int xreg_idx,
> }
>
> void
> +match_set_actset_output(struct match *match, ofp_port_t actset_output)
> +{
> + match->wc.masks.actset_output = u16_to_ofp(UINT16_MAX);
> + match->flow.actset_output = actset_output;
> +}
> +
> +void
> match_set_metadata(struct match *match, ovs_be64 metadata)
> {
> match_set_metadata_masked(match, metadata, OVS_BE64_MAX);
> @@ -959,7 +966,7 @@ match_format(const struct match *match, struct ds *s, unsigned int priority)
>
> int i;
>
> - BUILD_ASSERT_DECL(FLOW_WC_SEQ == 27);
> + BUILD_ASSERT_DECL(FLOW_WC_SEQ == 28);
>
> if (priority != OFP_DEFAULT_PRIORITY) {
> ds_put_format(s, "priority=%u,", priority);
> @@ -981,6 +988,12 @@ match_format(const struct match *match, struct ds *s, unsigned int priority)
> ds_put_format(s, "skb_priority=%#"PRIx32",", f->skb_priority);
> }
>
> + if (wc->masks.actset_output) {
> + ds_put_cstr(s, "actset_output=");
> + ofputil_format_port(f->actset_output, s);
> + ds_put_char(s, ',');
> + }
> +
> if (wc->masks.dl_type) {
> skip_type = true;
> if (f->dl_type == htons(ETH_TYPE_IP)) {
> diff --git a/lib/match.h b/lib/match.h
> index ce9fb28..5c0ea55 100644
> --- a/lib/match.h
> +++ b/lib/match.h
> @@ -53,6 +53,7 @@ void match_set_reg_masked(struct match *, unsigned int reg_idx,
> void match_set_xreg(struct match *, unsigned int xreg_idx, uint64_t value);
> void match_set_xreg_masked(struct match *, unsigned int xreg_idx,
> uint64_t value, uint64_t mask);
> +void match_set_actset_output(struct match *, ofp_port_t actset_output);
> void match_set_metadata(struct match *, ovs_be64 metadata);
> void match_set_metadata_masked(struct match *,
> ovs_be64 metadata, ovs_be64 mask);
> diff --git a/lib/meta-flow.c b/lib/meta-flow.c
> index 163c5b1..3cbd258 100644
> --- a/lib/meta-flow.c
> +++ b/lib/meta-flow.c
> @@ -129,6 +129,8 @@ mf_is_all_wild(const struct mf_field *mf, const struct flow_wildcards *wc)
> return !wc->masks.regs[mf->id - MFF_REG0];
> CASE_MFF_XREGS:
> return !flow_get_xreg(&wc->masks, mf->id - MFF_XREG0);
> + case MFF_ACTSET_OUTPUT:
> + return !wc->masks.actset_output;
>
> case MFF_ETH_SRC:
> return eth_addr_is_zero(wc->masks.dl_src);
> @@ -397,7 +399,8 @@ mf_is_value_valid(const struct mf_field *mf, const union mf_value *value)
> case MFF_ND_TLL:
> return true;
>
> - case MFF_IN_PORT_OXM: {
> + case MFF_IN_PORT_OXM:
> + case MFF_ACTSET_OUTPUT: {
> ofp_port_t port;
> return !ofputil_port_from_ofp11(value->be32, &port);
> }
> @@ -485,6 +488,9 @@ mf_get_value(const struct mf_field *mf, const struct flow *flow,
> case MFF_IN_PORT_OXM:
> value->be32 = ofputil_port_to_ofp11(flow->in_port.ofp_port);
> break;
> + case MFF_ACTSET_OUTPUT:
> + value->be32 = ofputil_port_to_ofp11(flow->actset_output);
> + break;
>
> case MFF_SKB_PRIORITY:
> value->be32 = htonl(flow->skb_priority);
> @@ -691,6 +697,12 @@ mf_set_value(const struct mf_field *mf,
> match_set_in_port(match, port);
> break;
> }
> + case MFF_ACTSET_OUTPUT: {
> + ofp_port_t port;
> + ofputil_port_from_ofp11(value->be32, &port);
> + match_set_actset_output(match, port);
> + break;
> + }
>
> case MFF_SKB_PRIORITY:
> match_set_skb_priority(match, ntohl(value->be32));
> @@ -908,12 +920,12 @@ mf_set_flow_value(const struct mf_field *mf,
> flow->in_port.ofp_port = u16_to_ofp(ntohs(value->be16));
> break;
>
> - case MFF_IN_PORT_OXM: {
> - ofp_port_t port;
> - ofputil_port_from_ofp11(value->be32, &port);
> - flow->in_port.ofp_port = port;
> + case MFF_IN_PORT_OXM:
> + ofputil_port_from_ofp11(value->be32, &flow->in_port.ofp_port);
> + break;
> + case MFF_ACTSET_OUTPUT:
> + ofputil_port_from_ofp11(value->be32, &flow->actset_output);
> break;
> - }
>
> case MFF_SKB_PRIORITY:
> flow->skb_priority = ntohl(value->be32);
> @@ -1163,6 +1175,10 @@ mf_set_wild(const struct mf_field *mf, struct match *match)
> match->flow.in_port.ofp_port = 0;
> match->wc.masks.in_port.ofp_port = 0;
> break;
> + case MFF_ACTSET_OUTPUT:
> + match->flow.actset_output = 0;
> + match->wc.masks.actset_output = 0;
> + break;
>
> case MFF_SKB_PRIORITY:
> match->flow.skb_priority = 0;
> @@ -1354,6 +1370,7 @@ mf_set(const struct mf_field *mf,
> case MFF_RECIRC_ID:
> case MFF_IN_PORT:
> case MFF_IN_PORT_OXM:
> + case MFF_ACTSET_OUTPUT:
> case MFF_SKB_PRIORITY:
> case MFF_ETH_TYPE:
> case MFF_DL_VLAN:
> diff --git a/lib/meta-flow.h b/lib/meta-flow.h
> index dc68826..a5c3b03 100644
> --- a/lib/meta-flow.h
> +++ b/lib/meta-flow.h
> @@ -444,6 +444,18 @@ enum OVS_PACKED_ENUM mf_field_id {
> */
> MFF_IN_PORT_OXM,
>
> + /* "actset_output".
> + *
> + * Type: be32.
> + * Maskable: no.
> + * Formatting: OpenFlow 1.1+ port.
> + * Prerequisites: none.
> + * Access: read-only.
> + * NXM: none.
> + * OXM: ONFOXM_ET_ACTSET_OUTPUT(41) since OF1.3 and v2.4.
> + */
> + MFF_ACTSET_OUTPUT,
> +
> /* "skb_priority".
> *
> * Designates the queue to which output will be directed. The value in
> diff --git a/lib/nx-match.c b/lib/nx-match.c
> index 93bb866..437721c 100644
> --- a/lib/nx-match.c
> +++ b/lib/nx-match.c
> @@ -834,7 +834,7 @@ nx_put_raw(struct ofpbuf *b, enum ofp_version oxm, const struct match *match,
> int match_len;
> int i;
>
> - BUILD_ASSERT_DECL(FLOW_WC_SEQ == 27);
> + BUILD_ASSERT_DECL(FLOW_WC_SEQ == 28);
>
> /* Metadata. */
> if (match->wc.masks.dp_hash) {
> @@ -856,6 +856,10 @@ nx_put_raw(struct ofpbuf *b, enum ofp_version oxm, const struct match *match,
> htons(ofp_to_u16(in_port)));
> }
> }
> + if (match->wc.masks.actset_output) {
> + nxm_put_32(b, MFF_ACTSET_OUTPUT, oxm,
> + ofputil_port_to_ofp11(flow->actset_output));
> + }
>
> /* Ethernet. */
> nxm_put_eth_masked(b, MFF_ETH_SRC, oxm,
> diff --git a/lib/odp-util.h b/lib/odp-util.h
> index 11b54dd..ef4e82c 100644
> --- a/lib/odp-util.h
> +++ b/lib/odp-util.h
> @@ -133,7 +133,7 @@ void odp_portno_names_destroy(struct hmap *portno_names);
> * add another field and forget to adjust this value.
> */
> #define ODPUTIL_FLOW_KEY_BYTES 512
> -BUILD_ASSERT_DECL(FLOW_WC_SEQ == 27);
> +BUILD_ASSERT_DECL(FLOW_WC_SEQ == 28);
>
> /* A buffer with sufficient size and alignment to hold an nlattr-formatted flow
> * key. An array of "struct nlattr" might not, in theory, be sufficiently
> diff --git a/lib/ofp-util.c b/lib/ofp-util.c
> index d765d03..8366cfe 100644
> --- a/lib/ofp-util.c
> +++ b/lib/ofp-util.c
> @@ -185,7 +185,7 @@ ofputil_netmask_to_wcbits(ovs_be32 netmask)
> void
> ofputil_wildcard_from_ofpfw10(uint32_t ofpfw, struct flow_wildcards *wc)
> {
> - BUILD_ASSERT_DECL(FLOW_WC_SEQ == 27);
> + BUILD_ASSERT_DECL(FLOW_WC_SEQ == 28);
>
> /* Initialize most of wc. */
> flow_wildcards_init_catchall(wc);
> diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
> index 6b95698..13e54c6 100644
> --- a/ofproto/ofproto-dpif-xlate.c
> +++ b/ofproto/ofproto-dpif-xlate.c
> @@ -2484,7 +2484,7 @@ compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port,
>
> /* If 'struct flow' gets additional metadata, we'll need to zero it out
> * before traversing a patch port. */
> - BUILD_ASSERT_DECL(FLOW_WC_SEQ == 27);
> + BUILD_ASSERT_DECL(FLOW_WC_SEQ == 28);
>
> if (!xport) {
> xlate_report(ctx, "Nonexistent output port");
> @@ -2533,6 +2533,7 @@ compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port,
> flow->metadata = htonll(0);
> memset(&flow->tunnel, 0, sizeof flow->tunnel);
> memset(flow->regs, 0, sizeof flow->regs);
> + flow->actset_output = OFPP15_UNSET;
>
> special = process_special(ctx, &ctx->xin->flow, peer,
> ctx->xin->packet);
> @@ -3536,8 +3537,16 @@ may_receive(const struct xport *xport, struct xlate_ctx *ctx)
> static void
> xlate_write_actions(struct xlate_ctx *ctx, const struct ofpact *a)
> {
> - struct ofpact_nest *on = ofpact_get_WRITE_ACTIONS(a);
> - ofpbuf_put(&ctx->action_set, on->actions, ofpact_nest_get_action_len(on));
> + const struct ofpact_nest *on = ofpact_get_WRITE_ACTIONS(a);
> + size_t on_len = ofpact_nest_get_action_len(on);
> + const struct ofpact *inner;
> +
> + OFPACT_FOR_EACH (inner, on->actions, on_len) {
> + if (inner->type == OFPACT_OUTPUT) {
> + ctx->xin->flow.actset_output = ofpact_get_OUTPUT(inner)->port;
> + }
> + }
> + ofpbuf_put(&ctx->action_set, on->actions, on_len);
> ofpact_pad(&ctx->action_set);
> }
>
> @@ -3939,6 +3948,7 @@ xlate_in_init(struct xlate_in *xin, struct ofproto_dpif *ofproto,
> xin->ofproto = ofproto;
> xin->flow = *flow;
> xin->flow.in_port.ofp_port = in_port;
> + xin->flow.actset_output = OFPP15_UNSET;
> xin->packet = packet;
> xin->may_learn = packet != NULL;
> xin->rule = rule;
> diff --git a/tests/dpif-netdev.at b/tests/dpif-netdev.at
> index af7845c..c29b9c8 100644
> --- a/tests/dpif-netdev.at
> +++ b/tests/dpif-netdev.at
> @@ -81,7 +81,7 @@ AT_CHECK([cat ovs-vswitchd.log | grep -A 1 'miss upcall' | tail -n 1], [0], [dnl
> skb_priority(0),skb_mark(0),recirc_id(0),dp_hash(0),in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)
> ])
> AT_CHECK([cat ovs-vswitchd.log | FILTER_FLOW_INSTALL | STRIP_XOUT], [0], [dnl
> -pkt_mark=0,recirc_id=0,skb_priority=0,icmp,tun_id=0,tun_src=0.0.0.0,tun_dst=0.0.0.0,tun_tos=0,tun_ttl=0,,in_port=1,vlan_tci=0x0000,dl_src=50:54:00:00:00:09,dl_dst=50:54:00:00:00:0a,nw_src=10.0.0.2,nw_dst=10.0.0.1,nw_tos=0,nw_ecn=0,nw_ttl=64,mpls_label=0,mpls_tc=0,mpls_ttl=0,mpls_bos=0,mpls_lse1=0,mpls_lse2=0,icmp_type=8,icmp_code=0, actions: <del>
> +pkt_mark=0,recirc_id=0,skb_priority=0,actset_output=0,icmp,tun_id=0,tun_src=0.0.0.0,tun_dst=0.0.0.0,tun_tos=0,tun_ttl=0,,in_port=1,vlan_tci=0x0000,dl_src=50:54:00:00:00:09,dl_dst=50:54:00:00:00:0a,nw_src=10.0.0.2,nw_dst=10.0.0.1,nw_tos=0,nw_ecn=0,nw_ttl=64,mpls_label=0,mpls_tc=0,mpls_ttl=0,mpls_bos=0,mpls_lse1=0,mpls_lse2=0,icmp_type=8,icmp_code=0, actions: <del>
> recirc_id=0,ip,in_port=1,vlan_tci=0x0000/0x1fff,dl_src=50:54:00:00:00:09,dl_dst=50:54:00:00:00:0a,nw_frag=no, actions: <del>
> ])
>
> diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at
> index 181e740..4015810 100644
> --- a/tests/ofproto-dpif.at
> +++ b/tests/ofproto-dpif.at
> @@ -5318,8 +5318,8 @@ for i in 1 2 3 4; do
> done
> sleep 1
> AT_CHECK([cat ovs-vswitchd.log | FILTER_FLOW_INSTALL | STRIP_USED], [0], [dnl
> -pkt_mark=0,recirc_id=0,skb_priority=0,icmp,tun_id=0,tun_src=0.0.0.0,tun_dst=0.0.0.0,tun_tos=0,tun_ttl=0,,in_port=1,vlan_tci=0x0000,dl_src=50:54:00:00:00:09,dl_dst=50:54:00:00:00:0a,nw_src=10.0.0.2,nw_dst=10.0.0.1,nw_tos=0,nw_ecn=0,nw_ttl=64,mpls_label=0,mpls_tc=0,mpls_ttl=0,mpls_bos=0,mpls_lse1=0,mpls_lse2=0,icmp_type=8,icmp_code=0, actions:2
> -pkt_mark=0,recirc_id=0,skb_priority=0,icmp,tun_id=0,tun_src=0.0.0.0,tun_dst=0.0.0.0,tun_tos=0,tun_ttl=0,,in_port=1,vlan_tci=0x0000,dl_src=50:54:00:00:00:0b,dl_dst=50:54:00:00:00:0c,nw_src=10.0.0.4,nw_dst=10.0.0.3,nw_tos=0,nw_ecn=0,nw_ttl=64,mpls_label=0,mpls_tc=0,mpls_ttl=0,mpls_bos=0,mpls_lse1=0,mpls_lse2=0,icmp_type=8,icmp_code=0, actions:drop
> +pkt_mark=0,recirc_id=0,skb_priority=0,actset_output=0,icmp,tun_id=0,tun_src=0.0.0.0,tun_dst=0.0.0.0,tun_tos=0,tun_ttl=0,,in_port=1,vlan_tci=0x0000,dl_src=50:54:00:00:00:09,dl_dst=50:54:00:00:00:0a,nw_src=10.0.0.2,nw_dst=10.0.0.1,nw_tos=0,nw_ecn=0,nw_ttl=64,mpls_label=0,mpls_tc=0,mpls_ttl=0,mpls_bos=0,mpls_lse1=0,mpls_lse2=0,icmp_type=8,icmp_code=0, actions:2
> +pkt_mark=0,recirc_id=0,skb_priority=0,actset_output=0,icmp,tun_id=0,tun_src=0.0.0.0,tun_dst=0.0.0.0,tun_tos=0,tun_ttl=0,,in_port=1,vlan_tci=0x0000,dl_src=50:54:00:00:00:0b,dl_dst=50:54:00:00:00:0c,nw_src=10.0.0.4,nw_dst=10.0.0.3,nw_tos=0,nw_ecn=0,nw_ttl=64,mpls_label=0,mpls_tc=0,mpls_ttl=0,mpls_bos=0,mpls_lse1=0,mpls_lse2=0,icmp_type=8,icmp_code=0, actions:drop
> ])
> AT_CHECK([cat ovs-vswitchd.log | FILTER_FLOW_DUMP | grep 'packets:3'], [0], [dnl
> skb_priority(0),skb_mark(0),recirc_id(0),dp_hash(0),in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0), packets:3, bytes:180, used:0.0s, actions:2
> diff --git a/tests/ofproto.at b/tests/ofproto.at
> index 3f31cd6..ce4a8f1 100644
> --- a/tests/ofproto.at
> +++ b/tests/ofproto.at
> @@ -1177,6 +1177,7 @@ OVS_VSWITCHD_START
> metadata: arbitrary mask
> in_port: exact match or wildcard
> in_port_oxm: exact match or wildcard
> + actset_output: exact match or wildcard
> pkt_mark: arbitrary mask
> reg0: arbitrary mask
> reg1: arbitrary mask
> @@ -1247,7 +1248,7 @@ AT_CHECK(
> # Check that the configuration was updated.
> mv expout orig-expout
> sed 's/classifier/main/
> -73s/1000000/1024/' < orig-expout > expout
> +74s/1000000/1024/' < orig-expout > expout
> AT_CHECK([ovs-ofctl -O OpenFlow13 dump-table-features br0 | sed '/^$/d
> /^OFPST_TABLE_FEATURES/d'], [0], [expout])
> OVS_VSWITCHD_STOP
> --
> 1.7.10.4
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
More information about the dev
mailing list