On Tue, Apr 21, 2015 at 03:20:33PM -0700, Justin Pettit wrote:
> > On Apr 20, 2015, at 3:29 PM, Ben Pfaff <b...@nicira.com> wrote:
> > --- a/ovn/northd/automake.mk
> > +++ b/ovn/northd/automake.mk
> > @@ -1,4 +1,8 @@
> > # ovn-northd
> > bin_PROGRAMS += ovn/northd/ovn-northd
> > ovn_northd_ovn_northd_SOURCES = ovn/northd/ovn-northd.c
> > -ovn_northd_ovn_northd_LDADD = ovn/libovn.la ovsdb/libovsdb.la 
> > lib/libopenvswitch.la
> > +ovn_northd_ovn_northd_LDADD = \
> > +   ovn/libovn.la \
> > +   ovn/lib/libovn.la \
> 
> Should we combine these two "libovn.la"s?

Fixed.

> It might be time to write up a DESIGN document like we have for OVS.
> The structure of the pipeline would be nice to have so that people
> don't have to go to the code.

I think that's worthwhile, but not yet.  Right now it's both very simple
and of interest to very few people.

> I suspect this is going to become quite a bit larger.  Do you think
> it's worth breaking into a separate pipeline.c right now?

I don't think it's worthwhile yet.

> > +/* Parses a member of the port_security column 'ps' into 'c'.  Returns 
> > true if
> > + * successful, false on syntax error. */
> > +static bool
> > +parse_port_security(const char *ps, struct ps_constraint *c)
> > +{
> > +    c->eth.type = LEX_T_END;
> > +    c->ip4.type = LEX_T_END;
> > +    c->ip6.type = LEX_T_END;
> > +
> > +    struct lexer lexer;
> > +    lexer_init(&lexer, ps);
> > +    do {
> > +        if (lexer.token.type == LEX_T_INTEGER ||
> > +            lexer.token.type == LEX_T_MASKED_INTEGER) {
> 
> Does a masked integer make sense?  If so, we should definitely document that 
> in the ovn-nb man page.
> 
> > +            struct lex_token *t;
> > +
> > +            t = (lexer.token.format == LEX_F_IPV4 ? &c->ip4
> > +                 : lexer.token.format == LEX_F_IPV6 ? &c->ip6
> 
> Is it worth parsing IPv4 and IPv6 now, since the syntax for it isn't even 
> fully baked yet?
> 
> > +                 : lexer.token.format == LEX_F_ETHERNET ? &c->eth
> > +                 : NULL);
> > +            if (t) {
> > +                if (t->type == LEX_T_END) {
> > +                    *t = lexer.token;
> > +                } else {
> > +                    VLOG_INFO("%s: port_security has duplicate %s address",
> > +                              ps, 
> > lex_format_to_string(lexer.token.format));
> > +                }
> > +                lexer_get(&lexer);
> > +                lexer_match(&lexer, LEX_T_COMMA);
> > +                continue;
> > +            }
> > +        }
> > +
> > +        VLOG_INFO("%s: syntax error in port_security", ps);
> > +        lexer_destroy(&lexer);
> > +        return false;
> > +    } while (lexer.token.type != LEX_T_END);
> 
> I don't see how this works, since lexer_get() is not initially called.

I'm getting the impression you're less comfortable than me with
partially implementing a vague specification.  I sent a fix:
        http://openvswitch.org/pipermail/dev/2015-April/054441.html

> > +    /* Table 0: Admission control framework. */
> > +    const struct nbrec_logical_switch *lswitch;
> > +    NBREC_LOGICAL_SWITCH_FOR_EACH (lswitch, ctx->ovnnb_idl) {
> > +        /* Logical VLANs not supported. */
> > +        pipeline_add(&pc, lswitch, 0, 100, "vlan.present", "drop");
> 
> [This is historical, since I already committed a patch to address
> this, but I think it's still worth noting.]
> 
> In the definition of actions from the ovn-sb man page, it looks like
> semicolons may be required.  It's actually inconsistent, since only
> the ones listed as not well thought out have semicolons.

I sent a fix:
        http://openvswitch.org/pipermail/dev/2015-April/054444.html

> > +    /* Table 1: Destination lookup, unicast handling (priority 50),  */
> > +    struct ds unknown_actions = DS_EMPTY_INITIALIZER;
> > +    NBREC_LOGICAL_PORT_FOR_EACH (lport, ctx->ovnnb_idl) {
> > +        for (size_t i = 0; i < lport->n_macs; i++) {
> > +            uint8_t mac[ETH_ADDR_LEN];
> > +
> > +            if (eth_addr_from_string(lport->macs[i], mac)) {
> > +                struct ds match, actions;
> > +
> > +                ds_init(&match);
> > +                ds_put_format(&match, "eth.dst == %s", lport->macs[i]);
> > +
> > +                ds_init(&actions);
> > +                ds_put_cstr(&actions, "outport = ");
> 
> This is not listed as a supported action syntax.  Speaking to you off
> line, it sounds like you'd like to replace "set()" with this syntax.
> It would be good to update the documentation.

I sent a documentation update:
        http://openvswitch.org/pipermail/dev/2015-April/054444.html

> > +
> > +    /* Table 2: ACLs. */
> > +    const struct nbrec_acl *acl;
> > +    NBREC_ACL_FOR_EACH (acl, ctx->ovnnb_idl) {
> > +        const char *action;
> > +
> > +        action = (!strcmp(acl->action, "allow") ||
> > +                  !strcmp(acl->action, "allow-related")) ? "resubmit" : 
> > "drop";
> > +        pipeline_add(&pc, acl->lswitch, 2, acl->priority, acl->match, 
> > action);
> > +    }
> 
> It may be worth noting in the ovn-nb man page that we don't really
> support "allow-related" or the "log" flag yet.

OK, I sent a documentation update:
        http://openvswitch.org/pipermail/dev/2015-April/054442.html

(You realize that we could write this practically everywhere in that
manpage? ;-)

> > +    /* Table 3: Egress port security. */
> > +    NBREC_LOGICAL_PORT_FOR_EACH (lport, ctx->ovnnb_idl) {
> > +        struct ds match, actions;
> > +
> > +        ds_init(&match);
> > +        ds_put_cstr(&match, "outport == ");
> > +        json_string_escape(lport->name, &match);
> > +        build_port_security("eth.dst",
> > +                            lport->port_security, lport->n_port_security,
> > +                            &match);
> 
> I imagine this is going to break things like ARP, since we're not
> allowing broadcast when port security is enabled.  If people do have
> to call them out specifically, it's going to add a bunch of eth_src
> rules that match on broadcasts that were explicitly dropped from the
> higher priority eth_src[40] rule, which will look weird.  Plus, it's
> going to be annoying to have to specify them all.  I assume in most
> other product, there's an implied allow for any destination with the
> multicast/broadcast bit set, but I'm not sure.

Sorry, I overlooked multicast/broadcast.  I sent a fix:
        http://openvswitch.org/pipermail/dev/2015-April/054443.html

> > --- a/ovn/ovn-nb.xml
> > +++ b/ovn/ovn-nb.xml
> > @@ -144,12 +144,14 @@
> >       </p>
> > 
> >       <p>
> > -        Exact syntax is TBD.  One could simply use comma- or
> > -        space-separated L2 and L3 addresses in each set member, or
> > -        replace this by a subset of the general-purpose expression
> > -        language used for the <ref column="match" table="Pipeline"
> > -        db="OVN_Southbound"/> column in the OVN Southbound database's
> > -        <ref table="Pipeline" db="OVN_Southbound"/> table.
> > +   Each member of the set is a comma- or space-separated list.  A single
> > +   set member may have an Ethernet address, an IPv4 address, and an IPv6
> > +   address, or any subset.  Order is not significant.
> 
> I touch on this above, and it's not directly related to this patch,
> but the description of port_security states that the supplied
> addresses will also limit the packets that are sent to it.  I assume
> that there are exceptions that don't need to be explicitly called out,
> such as broadcast addresses, so it may be nice to list what those are.
> If not, then we'd want to document that, too.

I documented it:
        http://openvswitch.org/pipermail/dev/2015-April/054443.html
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to