[ovs-dev] [LimitFlows 4/4] ofproto: Limit table sizes to those advertised over OpenFlow.

Ben Pfaff blp at nicira.com
Tue Apr 20 19:08:09 UTC 2010


Thanks.

When I went to test this, I found that it failed the assertion in
rule_adjust_counter() very quickly, so I need to do debugging and then
more testing before I push it out.  Hmm.

On Tue, Apr 20, 2010 at 02:15:07PM -0400, Jesse Gross wrote:
> This set looks good to me.
> 
> On Mon, Apr 19, 2010 at 5:08 PM, Ben Pfaff <blp at nicira.com> wrote:
> 
> > Open vSwitch has always advertised maximum flow table sizes, but it has
> > never enforced them.  This commit implements enforcement.
> >
> > Bug #1899.
> > ---
> >  ofproto/ofproto.c |   14 ++++++++++++--
> >  1 files changed, 12 insertions(+), 2 deletions(-)
> >
> > diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
> > index 6498f7c..f77fc97 100644
> > --- a/ofproto/ofproto.c
> > +++ b/ofproto/ofproto.c
> > @@ -67,6 +67,10 @@ enum {
> >     TABLEID_WILD = 1            /* Wildcard table. */
> >  };
> >
> > +/* Maximum number of rules of each kind permitted. */
> > +#define MAX_EXACT_FLOWS 65536
> > +#define MAX_WILD_FLOWS 65536
> > +
> >  struct ofport {
> >     struct netdev *netdev;
> >     struct ofp_phy_port opp;    /* In host byte order. */
> > @@ -2538,7 +2542,7 @@ handle_table_stats_request(struct ofproto *p, struct
> > ofconn *ofconn,
> >     strcpy(ots->name, "exact");
> >     ots->wildcards = htonl(0);
> >     ots->active_count = htonl(ofproto_count_visible_exact(p));
> > -    ots->max_entries = htonl(dpstats.max_capacity);
> > +    ots->max_entries = htonl(MIN(MAX_EXACT_FLOWS, dpstats.max_capacity));
> >     ots->lookup_count = htonll(dpstats.n_frags + dpstats.n_hit +
> >                                dpstats.n_missed);
> >     ots->matched_count = htonll(dpstats.n_hit); /* XXX */
> > @@ -2551,7 +2555,7 @@ handle_table_stats_request(struct ofproto *p, struct
> > ofconn *ofconn,
> >     ots->wildcards = p->tun_id_from_cookie ? htonl(OVSFW_ALL)
> >                                            : htonl(OFPFW_ALL);
> >     ots->active_count = htonl(ofproto_count_visible_wild(p));
> > -    ots->max_entries = htonl(65536);
> > +    ots->max_entries = htonl(MAX_WILD_FLOWS);
> >     ots->lookup_count = htonll(0);              /* XXX */
> >     ots->matched_count = htonll(0);             /* XXX */
> >
> > @@ -2975,6 +2979,12 @@ add_flow(struct ofproto *p, struct ofconn *ofconn,
> >         }
> >     }
> >
> > +    if (ofm->match.wildcards
> > +        ? ofproto_count_visible_wild(p) >= MAX_WILD_FLOWS
> > +        : ofproto_count_visible_exact(p) >= MAX_EXACT_FLOWS) {
> > +        return ofp_mkerr(OFPET_FLOW_MOD_FAILED, OFPFMFC_ALL_TABLES_FULL);
> > +    }
> > +
> >     rule = rule_create(p, NULL, (const union ofp_action *) ofm->actions,
> >                        n_actions, ntohs(ofm->idle_timeout),
> >                        ntohs(ofm->hard_timeout),  ofm->cookie,
> > --
> > 1.6.6.1
> >
> >
> > _______________________________________________
> > dev mailing list
> > dev at openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev_openvswitch.org
> >




More information about the dev mailing list