[ovs-dev] [PATCH/RFC 4/8] ofproto-dpif: Add recirc_id field to struct rule_dpif
Andy Zhou
azhou at nicira.com
Tue Mar 25 21:54:46 UTC 2014
Simon, I am not sure If I understand how recirc_id should be managed for MPLS.
Why should rule allocate and free recirc_id by itself, rather that
some other entity managing them? In the bond case, bond is one
managing recirc_ids. one recirc_id per bond. I'd imaging some entity
in the user space should keep track of the mpls labels and their
mapping to recirc_id?
On Tue, Mar 25, 2014 at 2:24 PM, Simon Horman <horms at verge.net.au> wrote:
> This is to allow a recirculation id to be associated with a rule
> in the case that its actions cause recirculation.
>
> In such a case if the recirc_id field is non-zero then that value should be
> used, otherwise a value should be obtained using
> ofproto_dpif_alloc_recirc_id and saved in recirc_id field.
>
> When destructing the rule if the recirc_id field is non-zero then
> the associated internal flow should be deleted.
>
> This is in preparation for using the same helper as part of support
> for using recirculation in conjunction series of actions including
> with MPLS actions that are currently not able to be translated.
>
> Signed-off-by: Simon Horman <horms at verge.net.au>
> ---
> ofproto/ofproto-dpif.c | 27 +++++++++++++++++++++++++++
> ofproto/ofproto-dpif.h | 1 +
> 2 files changed, 28 insertions(+)
>
> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
> index 05f7bca..f239735 100644
> --- a/ofproto/ofproto-dpif.c
> +++ b/ofproto/ofproto-dpif.c
> @@ -89,6 +89,12 @@ struct rule_dpif {
> * recently been processed by a revalidator. */
> struct ovs_mutex stats_mutex;
> struct dpif_flow_stats stats OVS_GUARDED;
> +
> + /* If non-zero then the recirculation id that has
> + * been allocated for use with this rule.
> + * The recirculation id and associated internal flow should
> + * be freed when the rule is freed */
> + uint32_t recirc_id;
> };
>
> static void rule_get_stats(struct rule *, uint64_t *packets, uint64_t *bytes,
> @@ -3154,6 +3160,19 @@ rule_dpif_get_actions(const struct rule_dpif *rule)
> return rule_get_actions(&rule->up);
> }
>
> +/* Returns 'rule''s recirculation id. */
> +uint32_t
> +rule_dpif_get_recirc_id(struct rule_dpif *rule)
> + OVS_REQUIRES(rule->up.mutex)
> +{
> + if (!rule->recirc_id) {
> + struct ofproto_dpif *ofproto = ofproto_dpif_cast(rule->up.ofproto);
> +
> + rule->recirc_id = ofproto_dpif_alloc_recirc_id(ofproto);
> + }
> + return rule->recirc_id;
> +}
> +
> static uint8_t
> rule_dpif_lookup__ (struct ofproto_dpif *ofproto, const struct flow *flow,
> struct flow_wildcards *wc, struct rule_dpif **rule)
> @@ -3376,6 +3395,8 @@ rule_construct(struct rule *rule_)
> rule->stats.n_packets = 0;
> rule->stats.n_bytes = 0;
> rule->stats.used = rule->up.modified;
> + rule->recirc_id = 0;
> +
> return 0;
> }
>
> @@ -3399,7 +3420,13 @@ static void
> rule_destruct(struct rule *rule_)
> {
> struct rule_dpif *rule = rule_dpif_cast(rule_);
> +
> ovs_mutex_destroy(&rule->stats_mutex);
> + if (rule->recirc_id) {
> + struct ofproto_dpif *ofproto = ofproto_dpif_cast(rule->up.ofproto);
> +
> + ofproto_dpif_free_recirc_id(ofproto, rule->recirc_id);
> + }
> }
>
> static void
> diff --git a/ofproto/ofproto-dpif.h b/ofproto/ofproto-dpif.h
> index 6d21bac..9a07d34 100644
> --- a/ofproto/ofproto-dpif.h
> +++ b/ofproto/ofproto-dpif.h
> @@ -101,6 +101,7 @@ bool rule_dpif_is_internal(const struct rule_dpif *);
> uint8_t rule_dpif_get_table(const struct rule_dpif *);
>
> struct rule_actions *rule_dpif_get_actions(const struct rule_dpif *);
> +uint32_t rule_dpif_get_recirc_id(struct rule_dpif *rule);
>
> ovs_be64 rule_dpif_get_flow_cookie(const struct rule_dpif *rule);
>
> --
> 1.8.4
>
More information about the dev
mailing list