Looks good, as far as it goes, Jarno
On Sep 30, 2014, at 5:47 PM, Ben Pfaff <b...@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 <b...@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@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev