It doesn't look like you added anything to ofpacts_execute_action_set().
On Thu, Nov 24, 2016 at 11:36:31AM +0000, Ali Volkan Atli wrote:
> Hi all
>
> I'm trying to add a new action to set or reduce TCP window size and I wrote
> the patch below but I could not see my new action in action set, please could
> someone help me figuring the problem out.
>
> Thanks in advance..
>
> - Volkan
>
> argela@avatli:~/workspace/ovs$ ovs-ofctl add-flow s1 -O OpenFlow13
> in_port=2,tcp,nw_src=10.1.1.20,nw_dst=10.1.1.10,tcp_flags=ack,action=set_rwnd:50,output:1
> argela@avatli:~/workspace/ovs$ ovs-ofctl dump-flows s1 -O OpenFlow13
> OFPST_FLOW reply (OF1.3) (xid=0x2):
> cookie=0x0, duration=3.030s, table=0, n_packets=0, n_bytes=0,
> tcp,in_port=2,nw_src=10.1.1.20,nw_dst=10.1.1.10,tcp_flags=ack
> actions=set_rwnd:50,output:1
>
>
> $$$ git status
> On branch master
> Your branch is up-to-date with 'origin/master'.
> Changes not staged for commit:
> (use "git add <file>..." to update what will be committed)
> (use "git checkout -- <file>..." to discard changes in working directory)
>
> modified: datapath/actions.c
> modified: datapath/linux/compat/include/linux/openvswitch.h
> modified: include/openvswitch/flow.h
> modified: include/openvswitch/ofp-actions.h
> modified: lib/dpif-netdev.c
> modified: lib/dpif.c
> modified: lib/odp-execute.c
> modified: lib/odp-util.c
> modified: lib/ofp-actions.c
> modified: ofproto/ofproto-dpif-xlate.c
>
> Untracked files:
> (use "git add <file>..." to include in what will be committed)
>
> .cproject
> .project
>
> no changes added to commit (use "git add" and/or "git commit -a")
>
>
> $$$ git diff
> diff --git a/datapath/actions.c b/datapath/actions.c
> index 82833d0..675c53a 100644
> --- a/datapath/actions.c
> +++ b/datapath/actions.c
> @@ -1164,6 +1164,11 @@ static int do_execute_actions(struct datapath *dp,
> struct sk_buff *skb,
> err = sample(dp, skb, key, a, attr, len);
> break;
>
> + case OVS_ACTION_ATTR_REDUCE_RWND:
> + case OVS_ACTION_ATTR_SET_RWND:
> + printf("OVS_ACTION_ATTR_SET_RWND\n");
> + break;
> +
> case OVS_ACTION_ATTR_CT:
> if (!is_flow_key_valid(key)) {
> err = ovs_flow_key_update(skb, key);
> diff --git a/datapath/linux/compat/include/linux/openvswitch.h
> b/datapath/linux/compat/include/linux/openvswitch.h
> index 12260d8..803e455 100644
> --- a/datapath/linux/compat/include/linux/openvswitch.h
> +++ b/datapath/linux/compat/include/linux/openvswitch.h
> @@ -815,6 +815,9 @@ enum ovs_action_attr {
> OVS_ACTION_ATTR_CT, /* Nested OVS_CT_ATTR_* . */
> OVS_ACTION_ATTR_TRUNC, /* u32 struct ovs_action_trunc. */
>
> + OVS_ACTION_ATTR_REDUCE_RWND,
> + OVS_ACTION_ATTR_SET_RWND,
> +
> #ifndef __KERNEL__
> OVS_ACTION_ATTR_TUNNEL_PUSH, /* struct ovs_action_push_tnl*/
> OVS_ACTION_ATTR_TUNNEL_POP, /* u32 port number. */
> diff --git a/include/openvswitch/flow.h b/include/openvswitch/flow.h
> index df80dfe..64da205 100644
> --- a/include/openvswitch/flow.h
> +++ b/include/openvswitch/flow.h
> @@ -120,7 +120,9 @@ struct flow {
> struct eth_addr arp_sha; /* ARP/ND source hardware address. */
> struct eth_addr arp_tha; /* ARP/ND target hardware address. */
> ovs_be16 tcp_flags; /* TCP flags. With L3 to avoid matching L4.
> */
> - ovs_be16 pad3; /* Pad to 64 bits. */
> + ovs_be16 rwnd;
> + uint8_t rate;
> + uint8_t pad3[7]; /* Pad to 64 bits. */
>
> /* L4 (64-bit aligned) */
> ovs_be16 tp_src; /* TCP/UDP/SCTP source port/ICMP type. */
> @@ -135,7 +137,7 @@ BUILD_ASSERT_DECL(sizeof(struct flow_tnl) %
> sizeof(uint64_t) == 0);
>
> /* Remember to update FLOW_WC_SEQ when changing 'struct flow'. */
> BUILD_ASSERT_DECL(offsetof(struct flow, igmp_group_ip4) + sizeof(uint32_t)
> - == sizeof(struct flow_tnl) + 248
> + == sizeof(struct flow_tnl) + 256
> && FLOW_WC_SEQ == 36);
>
> /* Incremental points at which flow classification may be performed in
> diff --git a/include/openvswitch/ofp-actions.h
> b/include/openvswitch/ofp-actions.h
> index 74e9dcc..a7512e5 100644
> --- a/include/openvswitch/ofp-actions.h
> +++ b/include/openvswitch/ofp-actions.h
> @@ -86,6 +86,8 @@
> OFPACT(DEC_MPLS_TTL, ofpact_null, ofpact, "dec_mpls_ttl") \
> OFPACT(PUSH_MPLS, ofpact_push_mpls, ofpact, "push_mpls") \
> OFPACT(POP_MPLS, ofpact_pop_mpls, ofpact, "pop_mpls") \
> + OFPACT(REDUCE_RWND, ofpact_reduce_rwnd, ofpact, "reduce_rwnd") \
> + OFPACT(SET_RWND, ofpact_set_rwnd, ofpact, "set_rwnd") \
> \
> /* Metadata. */ \
> OFPACT(SET_TUNNEL, ofpact_tunnel, ofpact, "set_tunnel") \
> @@ -426,6 +428,16 @@ struct ofpact_ip_ttl {
> uint8_t ttl;
> };
>
> +struct ofpact_reduce_rwnd {
> + struct ofpact ofpact;
> + uint8_t rate;
> +};
> +
> +struct ofpact_set_rwnd {
> + struct ofpact ofpact;
> + uint16_t rwnd;
> +};
> +
> /* OFPACT_SET_L4_SRC_PORT, OFPACT_SET_L4_DST_PORT.
> *
> * Used for OFPAT10_SET_TP_SRC, OFPAT10_SET_TP_DST. */
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index 1400511..fd7dd64 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -4603,6 +4603,8 @@ dp_execute_cb(void *aux_, struct dp_packet_batch
> *packets_,
> case OVS_ACTION_ATTR_POP_MPLS:
> case OVS_ACTION_ATTR_SET:
> case OVS_ACTION_ATTR_SET_MASKED:
> + case OVS_ACTION_ATTR_REDUCE_RWND:
> + case OVS_ACTION_ATTR_SET_RWND:
> case OVS_ACTION_ATTR_SAMPLE:
> case OVS_ACTION_ATTR_HASH:
> case OVS_ACTION_ATTR_UNSPEC:
> diff --git a/lib/dpif.c b/lib/dpif.c
> index 53958c5..6cb033b 100644
> --- a/lib/dpif.c
> +++ b/lib/dpif.c
> @@ -1186,6 +1186,8 @@ dpif_execute_helper_cb(void *aux_, struct
> dp_packet_batch *packets_,
> case OVS_ACTION_ATTR_SET_MASKED:
> case OVS_ACTION_ATTR_SAMPLE:
> case OVS_ACTION_ATTR_TRUNC:
> + case OVS_ACTION_ATTR_REDUCE_RWND:
> + case OVS_ACTION_ATTR_SET_RWND:
> case OVS_ACTION_ATTR_UNSPEC:
> case __OVS_ACTION_ATTR_MAX:
> OVS_NOT_REACHED();
> diff --git a/lib/odp-execute.c b/lib/odp-execute.c
> index 65a6fcd..a120aab 100644
> --- a/lib/odp-execute.c
> +++ b/lib/odp-execute.c
> @@ -504,6 +504,8 @@ requires_datapath_assistance(const struct nlattr *a)
> case OVS_ACTION_ATTR_PUSH_MPLS:
> case OVS_ACTION_ATTR_POP_MPLS:
> case OVS_ACTION_ATTR_TRUNC:
> + case OVS_ACTION_ATTR_REDUCE_RWND:
> + case OVS_ACTION_ATTR_SET_RWND:
> return false;
>
> case OVS_ACTION_ATTR_UNSPEC:
> @@ -613,6 +615,11 @@ odp_execute_actions(void *dp, struct dp_packet_batch
> *batch, bool steal,
> }
> break;
>
> + case OVS_ACTION_ATTR_REDUCE_RWND:
> + case OVS_ACTION_ATTR_SET_RWND:
> + printf("OVS_ACTION_ATTR_SET_RWND odp_execute\n");
> + break;
> +
> case OVS_ACTION_ATTR_SAMPLE:
> for (i = 0; i < cnt; i++) {
> odp_execute_sample(dp, packets[i], steal && last_action, a,
> diff --git a/lib/odp-util.c b/lib/odp-util.c
> index 626a82c..8d5b8c2 100644
> --- a/lib/odp-util.c
> +++ b/lib/odp-util.c
> @@ -121,6 +121,8 @@ odp_action_len(uint16_t type)
> case OVS_ACTION_ATTR_SET_MASKED: return ATTR_LEN_VARIABLE;
> case OVS_ACTION_ATTR_SAMPLE: return ATTR_LEN_VARIABLE;
> case OVS_ACTION_ATTR_CT: return ATTR_LEN_VARIABLE;
> + case OVS_ACTION_ATTR_REDUCE_RWND: return sizeof(ovs_be16);
> + case OVS_ACTION_ATTR_SET_RWND: return sizeof(ovs_be16);
>
> case OVS_ACTION_ATTR_UNSPEC:
> case __OVS_ACTION_ATTR_MAX:
> @@ -859,6 +861,10 @@ format_odp_action(struct ds *ds, const struct nlattr *a)
> case OVS_ACTION_ATTR_CT:
> format_odp_conntrack_action(ds, a);
> break;
> + case OVS_ACTION_ATTR_REDUCE_RWND:
> + case OVS_ACTION_ATTR_SET_RWND:
> + printf("format-odp-ac\n");
> + break;
> case OVS_ACTION_ATTR_UNSPEC:
> case __OVS_ACTION_ATTR_MAX:
> default:
> diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c
> index 16f0f7c..a7da17e 100644
> --- a/lib/ofp-actions.c
> +++ b/lib/ofp-actions.c
> @@ -229,6 +229,11 @@ enum ofp_raw_action_type {
> /* NX1.0-1.4(6): struct nx_action_reg_move, ... */
> NXAST_RAW_REG_MOVE,
>
> + /* OF1.3+(41): uint8_t. */
> + OFPAT_RAW_REDUCE_RWND,
> + /* OF1.3+(42): uint16_t. */
> + OFPAT_RAW_SET_RWND,
> +
> /* ## ------------------------- ## */
> /* ## Nicira extension actions. ## */
> /* ## ------------------------- ## */
> @@ -431,6 +436,8 @@ ofpact_next_flattened(const struct ofpact *ofpact)
> case OFPACT_WRITE_METADATA:
> case OFPACT_GOTO_TABLE:
> case OFPACT_NAT:
> + case OFPACT_REDUCE_RWND:
> + case OFPACT_SET_RWND:
> return ofpact_next(ofpact);
>
> case OFPACT_CT:
> @@ -1995,6 +2002,18 @@ format_SET_IP_TTL(const struct ofpact_ip_ttl *a,
> struct ds *s)
> {
> ds_put_format(s, "%smod_nw_ttl:%s%d", colors.param, colors.end, a->ttl);
> }
> +
> +static void
> +format_REDUCE_RWND(const struct ofpact_reduce_rwnd *a, struct ds *s)
> +{
> + ds_put_format(s, "%sreduce_rwnd:%s%d", colors.param, colors.end,
> a->rate);
> +}
> +
> +static void
> +format_SET_RWND(const struct ofpact_set_rwnd *a, struct ds *s)
> +{
> + ds_put_format(s, "%sset_rwnd:%s%d", colors.param, colors.end, a->rwnd);
> +}
> ^L
> /* Set TCP/UDP/SCTP port actions. */
>
> @@ -2016,6 +2035,24 @@ decode_OFPAT_RAW_SET_TP_DST(ovs_be16 port,
> return 0;
> }
>
> +static enum ofperr
> +decode_OFPAT_RAW_REDUCE_RWND(uint8_t rate,
> + enum ofp_version ofp_version OVS_UNUSED,
> + struct ofpbuf *out)
> +{
> + ofpact_put_REDUCE_RWND(out)->rate = rate;
> + return 0;
> +}
> +
> +static enum ofperr
> +decode_OFPAT_RAW_SET_RWND(uint16_t rwnd,
> + enum ofp_version ofp_version OVS_UNUSED,
> + struct ofpbuf *out)
> +{
> + ofpact_put_SET_RWND(out)->rwnd = ntohs(rwnd);
> + return 0;
> +}
> +
> static void
> encode_SET_L4_port(const struct ofpact_l4_port *l4_port,
> enum ofp_version ofp_version, enum ofp_raw_action_type
> raw,
> @@ -2057,6 +2094,20 @@ encode_SET_L4_DST_PORT(const struct ofpact_l4_port
> *l4_port,
> encode_SET_L4_port(l4_port, ofp_version, OFPAT_RAW_SET_TP_DST, field,
> out);
> }
>
> +static void
> +encode_REDUCE_RWND(const struct ofpact_reduce_rwnd *reduce_rwnd,
> + enum ofp_version ofp_version OVS_UNUSED, struct ofpbuf
> *out)
> +{
> + put_OFPAT_REDUCE_RWND(out, reduce_rwnd->rate);
> +}
> +
> +static void
> +encode_SET_RWND(const struct ofpact_set_rwnd *set_rwnd,
> + enum ofp_version ofp_version OVS_UNUSED, struct ofpbuf
> *out)
> +{
> + put_OFPAT_SET_RWND(out, set_rwnd->rwnd);
> +}
> +
> static char * OVS_WARN_UNUSED_RESULT
> parse_SET_L4_SRC_PORT(char *arg, struct ofpbuf *ofpacts,
> enum ofputil_protocol *usable_protocols OVS_UNUSED)
> @@ -2084,6 +2135,39 @@ format_SET_L4_DST_PORT(const struct ofpact_l4_port *a,
> struct ds *s)
> {
> ds_put_format(s, "%smod_tp_dst:%s%d", colors.param, colors.end, a->port);
> }
> +
> +static char * OVS_WARN_UNUSED_RESULT
> +parse_SET_RWND(char *arg, struct ofpbuf *ofpacts,
> + enum ofputil_protocol *usable_protocols OVS_UNUSED)
> +{
> + uint16_t rwnd;
> + char *error;
> +
> + error = str_to_u16(arg, "rwnd", &rwnd);
> + if (error) {
> + return error;
> + }
> +
> + ofpact_put_SET_RWND(ofpacts)->rwnd = rwnd;
> + return NULL;
> +}
> +
> +static char * OVS_WARN_UNUSED_RESULT
> +parse_REDUCE_RWND(char *arg, struct ofpbuf *ofpacts,
> + enum ofputil_protocol *usable_protocols OVS_UNUSED)
> +{
> + uint8_t rate;
> + char *error;
> +
> + error = str_to_u8(arg, "rate", &rate);
> + if (error) {
> + return error;
> + }
> +
> + ofpact_put_REDUCE_RWND(ofpacts)->rate = rate;
> + return NULL;
> +}
> +
> ^L
> /* Action structure for OFPAT_COPY_FIELD. */
> struct ofp15_action_copy_field {
> @@ -6156,6 +6240,8 @@ ofpact_is_set_or_move_action(const struct ofpact *a)
> case OFPACT_SET_TUNNEL:
> case OFPACT_SET_VLAN_PCP:
> case OFPACT_SET_VLAN_VID:
> + case OFPACT_SET_RWND:
> + case OFPACT_REDUCE_RWND:
> return true;
> case OFPACT_BUNDLE:
> case OFPACT_CLEAR_ACTIONS:
> @@ -6229,6 +6315,8 @@ ofpact_is_allowed_in_actions_set(const struct ofpact *a)
> case OFPACT_SET_VLAN_PCP:
> case OFPACT_SET_VLAN_VID:
> case OFPACT_STRIP_VLAN:
> + case OFPACT_REDUCE_RWND:
> + case OFPACT_SET_RWND:
> return true;
>
> /* In general these actions are excluded because they are not part of
> @@ -6472,6 +6560,8 @@ ovs_instruction_type_from_ofpact_type(enum ofpact_type
> type)
> case OFPACT_DEBUG_RECIRC:
> case OFPACT_CT:
> case OFPACT_NAT:
> + case OFPACT_REDUCE_RWND:
> + case OFPACT_SET_RWND:
> default:
> return OVSINST_OFPIT11_APPLY_ACTIONS;
> }
> @@ -6920,7 +7010,13 @@ ofpact_check__(enum ofputil_protocol
> *usable_protocols, struct ofpact *a,
> inconsistent_match(usable_protocols);
> }
> return 0;
> + case OFPACT_REDUCE_RWND:
> + case OFPACT_SET_RWND:
> + if (!is_ip_any(flow) || (flow->nw_proto != IPPROTO_TCP)) {
> + inconsistent_match(usable_protocols);
> + }
>
> + return 0;
> case OFPACT_SET_IP_DSCP:
> case OFPACT_SET_IP_ECN:
> case OFPACT_SET_IP_TTL:
> @@ -7457,6 +7553,9 @@ get_ofpact_map(enum ofp_version version)
> { OFPACT_SET_IP_TTL, 23 },
> { OFPACT_DEC_TTL, 24 },
> { OFPACT_SET_FIELD, 25 },
> +
> + { OFPACT_REDUCE_RWND, 41 },
> + { OFPACT_SET_RWND, 42 },
> /* OF1.3+ OFPAT_PUSH_PBB (26) not supported. */
> /* OF1.3+ OFPAT_POP_PBB (27) not supported. */
> { 0, -1 },
> @@ -7590,6 +7689,8 @@ ofpact_outputs_to_port(const struct ofpact *ofpact,
> ofp_port_t port)
> case OFPACT_DEBUG_RECIRC:
> case OFPACT_CT:
> case OFPACT_NAT:
> + case OFPACT_REDUCE_RWND:
> + case OFPACT_SET_RWND:
> default:
> return false;
> }
> @@ -7824,7 +7925,12 @@ ofpacts_parse__(char *str, struct ofpbuf *ofpacts,
> return xstrdup("apply_actions is the default instruction");
> } else if (ofputil_port_from_string(key, &port)) {
> ofpact_put_OUTPUT(ofpacts)->port = port;
> - } else {
> +
> + } /*else if (!strcasecmp(key, "reduce_rwnd")) {
> + error = parse_REDUCE_RWND(value, ofpacts, usable_protocols);
> + } else if (!strcasecmp(key, "set_rwnd")) {
> + error = parse_SET_RWND(value, ofpacts, usable_protocols);
> + } */ else {
> return xasprintf("unknown action %s", key);
> }
> if (error) {
> diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
> index 4d10a54..1375af7 100644
> --- a/ofproto/ofproto-dpif-xlate.c
> +++ b/ofproto/ofproto-dpif-xlate.c
> @@ -4428,6 +4428,8 @@ freeze_unroll_actions(const struct ofpact *a, const
> struct ofpact *end,
> case OFPACT_DEBUG_RECIRC:
> case OFPACT_CT:
> case OFPACT_NAT:
> + case OFPACT_REDUCE_RWND:
> + case OFPACT_SET_RWND:
> /* These may not generate PACKET INs. */
> break;
>
> @@ -4682,6 +4684,8 @@ recirc_for_mpls(const struct ofpact *a, struct
> xlate_ctx *ctx)
> case OFPACT_WRITE_ACTIONS:
> case OFPACT_WRITE_METADATA:
> case OFPACT_GOTO_TABLE:
> + case OFPACT_REDUCE_RWND:
> + case OFPACT_SET_RWND:
> default:
> break;
> }
> @@ -4857,6 +4861,19 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t
> ofpacts_len,
> }
> break;
>
> + case OFPACT_REDUCE_RWND:
> + if (is_ip_any(flow)) {
> + wc->masks.rate = 0xff;
> + flow->rate = htons(ofpact_get_REDUCE_RWND(a)->rate);
> + }
> + break;
> + case OFPACT_SET_RWND:
> + if (is_ip_any(flow)) {
> + wc->masks.rwnd = 0xffff;
> + flow->rwnd = htons(ofpact_get_SET_RWND(a)->rwnd);
> + }
> + break;
> +
> case OFPACT_RESUBMIT:
> /* Freezing complicates resubmit. Some action in the flow
> * entry found by resubmit might trigger freezing. If that
> _______________________________________________
> discuss mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-discuss
_______________________________________________
discuss mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-discuss