[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