[ovs-dev] pmd->flow_table

Joo Kim itsolution at gmail.com
Wed Dec 21 00:49:06 UTC 2016


(changed the subj)

Could anybody help confirm about pmd->flow_table below?   -Thanks-

---------- Forwarded message ----------
From: Joo Kim <itsolution at gmail.com>
Date: Mon, Dec 19, 2016 at 4:35 PM
Subject: Re: [ovs-dev] relationship between dpcls_rule and dp_netdev_flow
To: Jarno Rajahalme <jarno at ovn.org>
Cc: ovs-dev at openvswitch.org


Jarno,

Does pmd->flow_table(where each flow is inserted like below) hold
individual flows, NOT wildcarding flow, right?
Also, is the purpose of pmd->flow_table  just for maintaining those
individual flows info and dumping them (on  show flow command)?  -Thanks-

static struct dp_netdev_flow *
dp_netdev_flow_add(struct dp_netdev_pmd_thread *pmd,
                   struct match *match, const ovs_u128 *ufid,
                   const struct nlattr *actions, size_t actions_len)
    OVS_REQUIRES(pmd->flow_mutex)
{
    . . . .
    netdev_flow_key_init_masked(&flow->cr.flow, &match->flow, &mask);

    /* Select dpcls for in_port. Relies on in_port to be exact match */
    ovs_assert(match->wc.masks.in_port.odp_port == ODP_PORT_C(UINT32_MAX));
    cls = dp_netdev_pmd_find_dpcls(pmd, in_port);
    dpcls_insert(cls, &flow->cr, &mask);

    cmap_insert(&pmd->flow_table, CONST_CAST(struct cmap_node *,
&flow->node),
                dp_netdev_flow_hash(&flow->ufid));   <<<<


On Tue, Nov 15, 2016 at 4:09 PM, Jarno Rajahalme <jarno at ovn.org> wrote:

>
> > On Nov 15, 2016, at 3:35 PM, Joo Kim <itsolution at gmail.com> wrote:
> >
> > Hello,
> >
> > In this OVS (2.6) code below,
> > It seems that a dp_netdev_flow obj contains a dpcls_rule struct, and
> given
> > a dpcls_rule, it gets the corresponding dp_netdev_flow via
> > dp_netdev_flow_cast().
> > Does it mean dpcls_rule  and dp_netdev_flow have an 1-1 mapping
> > relationship?
>
> Yes, as you saw from the code, the relationship is 1:1.
>
> > But, as I understand,  dpcls_rule could have a wildcard which can match
> > multiple flows. Then, how does dp_netdev_flow_cast() (which seems to
> assume
> > 1-1 mapping) make sense?
> >
>
> You are tripping over the overloaded term ‘flow’ here. struct
> dp_netdev_flow and the associated struct dpcls_rule always have the same
> wildcarding. A wildcarded dpcls_rule, and therefore dp_netdev_flow, can
> match multiple transport connections, or multiple “exact match flows”.
>
>   Jarno
>
> >
> > struct dp_netdev_flow {
> >    const struct flow flow;      /* Unmasked flow that created this entry.
> > */
> >    /* Hash table index by unmasked flow. */
> >    const struct cmap_node node; /* In owning dp_netdev_pmd_thread's */
> >                                 /* 'flow_table'. */
> > …
> >    /* Packet classification. */
> >    struct dpcls_rule cr;        /* In owning dp_netdev's 'cls'. */
> >    /* 'cr' must be the last member. */
> > };
> >
> >
> >
> > static struct dp_netdev_flow *
> > dp_netdev_flow_cast(const struct dpcls_rule *cr)
> > {
> >    return cr ? CONTAINER_OF(cr, struct dp_netdev_flow, cr) : NULL;
> > }
> >
> >
> > static struct dp_netdev_flow *
> > dp_netdev_pmd_lookup_flow(struct dp_netdev_pmd_thread *pmd,
> >                          const struct netdev_flow_key *key,
> >                          int *lookup_num_p)
> > {
> >    struct dpcls *cls;
> >    struct dpcls_rule *rule;
> >    odp_port_t in_port = u32_to_odp(MINIFLOW_GET_U32(&key->mf, in_port));
> >   struct dp_netdev_flow *netdev_flow = NULL;
> >
> >    cls = dp_netdev_pmd_lookup_dpcls(pmd, in_port);
> >    if (OVS_LIKELY(cls)) {
> >        dpcls_lookup(cls, key, &rule, 1, lookup_num_p);
> >        netdev_flow = dp_netdev_flow_cast(rule);  <<<<<
> >    }
> >    return netdev_flow;
> > }
> > _______________________________________________
> > dev mailing list
> > dev at openvswitch.org
> > https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
>


More information about the dev mailing list