Signed-off-by: Andy Zhou <az...@nicira.com> --- include/linux/openvswitch.h | 26 ++++++++++++++++++++++++++ lib/dpif-netdev.c | 2 ++ lib/dpif.c | 2 ++ lib/odp-execute.c | 2 ++ lib/odp-util.c | 13 +++++++++++++ 5 files changed, 45 insertions(+)
diff --git a/include/linux/openvswitch.h b/include/linux/openvswitch.h index 5137c2f..1dea78e 100644 --- a/include/linux/openvswitch.h +++ b/include/linux/openvswitch.h @@ -530,6 +530,26 @@ struct ovs_action_push_vlan { __be16 vlan_tci; /* 802.1Q TCI (VLAN ID and priority). */ }; +/* + * struct ovs_action_recirc - %OVS_ACTION_ATTR_RECIRC action argument. + * @recirc_id: The Recirculation label, Zero is invalid. + */ +struct ovs_action_recirc { + uint32_t recirc_id; /* Recirculation label. */ + /* XXX only support output action for now */ + uint32_t out_port; /* Output port for the first packet. */ +}; + +/** + * struct ovs_action_hash - %OVS_ACTION_ATTR_HASH action argument. + * @hash_type: The hash function, value of enum ovs_hash_type_attr. + * @hash_bias: Bias used for hash computation. + */ +struct ovs_action_hash { + uint8_t hash_type; /* enum ovs_hash_type_attr. */ + uint32_t bias; /* bias for the hash function. */ +}; + /** * enum ovs_action_attr - Action types. * @@ -553,6 +573,10 @@ struct ovs_action_push_vlan { * indicate the new packet contents This could potentially still be * %ETH_P_MPLS_* if the resulting MPLS label stack is not empty. If there * is no MPLS label stack, as determined by ethertype, no action is taken. + * @OVS_ACTION_HASH: Compute packet hash and set the hash vlaue into the flow + * key. + * @OVS_ACTION_RECIRC: Recirculate within the data path. + * * * Only a single header can be set with a single %OVS_ACTION_ATTR_SET. Not all * fields within a header are modifiable, e.g. the IPv4 protocol and fragment @@ -569,6 +593,8 @@ enum ovs_action_attr { OVS_ACTION_ATTR_SAMPLE, /* Nested OVS_SAMPLE_ATTR_*. */ OVS_ACTION_ATTR_PUSH_MPLS, /* struct ovs_action_push_mpls. */ OVS_ACTION_ATTR_POP_MPLS, /* __be16 ethertype. */ + OVS_ACTION_ATTR_HASH, /* struct ovs_action_hash. */ + OVS_ACTION_ATTR_RECIRC, /* struct ovs_action_recirc. */ __OVS_ACTION_ATTR_MAX }; diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index cb64bdc..cb66c1e 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -1805,6 +1805,8 @@ dp_execute_cb(void *aux_, struct ofpbuf *packet, case OVS_ACTION_ATTR_SET: case OVS_ACTION_ATTR_SAMPLE: case OVS_ACTION_ATTR_UNSPEC: + case OVS_ACTION_ATTR_HASH: + case OVS_ACTION_ATTR_RECIRC: case __OVS_ACTION_ATTR_MAX: OVS_NOT_REACHED(); } diff --git a/lib/dpif.c b/lib/dpif.c index 2b79a6e..e934aa0 100644 --- a/lib/dpif.c +++ b/lib/dpif.c @@ -1093,6 +1093,8 @@ dpif_execute_helper_cb(void *aux_, struct ofpbuf *packet, case OVS_ACTION_ATTR_SET: case OVS_ACTION_ATTR_SAMPLE: case OVS_ACTION_ATTR_UNSPEC: + case OVS_ACTION_ATTR_HASH: + case OVS_ACTION_ATTR_RECIRC: case __OVS_ACTION_ATTR_MAX: OVS_NOT_REACHED(); } diff --git a/lib/odp-execute.c b/lib/odp-execute.c index 096c113..20c36b8 100644 --- a/lib/odp-execute.c +++ b/lib/odp-execute.c @@ -232,6 +232,8 @@ odp_execute_actions__(void *dp, struct ofpbuf *packet, struct pkt_metadata *md, more_actions || left > NLA_ALIGN(a->nla_len)); break; + case OVS_ACTION_ATTR_HASH: + case OVS_ACTION_ATTR_RECIRC: case OVS_ACTION_ATTR_UNSPEC: case __OVS_ACTION_ATTR_MAX: OVS_NOT_REACHED(); diff --git a/lib/odp-util.c b/lib/odp-util.c index 873e05a..9aa871c 100644 --- a/lib/odp-util.c +++ b/lib/odp-util.c @@ -82,6 +82,8 @@ odp_action_len(uint16_t type) case OVS_ACTION_ATTR_SET: return -2; case OVS_ACTION_ATTR_SAMPLE: return -2; + case OVS_ACTION_ATTR_HASH: return sizeof(struct ovs_action_hash); + case OVS_ACTION_ATTR_RECIRC: return sizeof(struct ovs_action_recirc); case OVS_ACTION_ATTR_UNSPEC: case __OVS_ACTION_ATTR_MAX: return -1; @@ -424,6 +426,17 @@ format_odp_action(struct ds *ds, const struct nlattr *a) case OVS_ACTION_ATTR_SAMPLE: format_odp_sample_action(ds, a); break; + case OVS_ACTION_ATTR_HASH: { + const struct ovs_action_hash *hash_act = nl_attr_get(a); + ds_put_format(ds, "hash(bias=%#"PRIx32")", hash_act->bias); + break; + } + case OVS_ACTION_ATTR_RECIRC: { + const struct ovs_action_recirc *recirc_act = nl_attr_get(a); + ds_put_format(ds, "recirc(id=%"PRIu32")", recirc_act->recirc_id); + break; + } + case OVS_ACTION_ATTR_UNSPEC: case __OVS_ACTION_ATTR_MAX: default: -- 1.7.9.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev