Acked-by: Justin Pettit <jpet...@nicira.com> --Justin
> On Apr 24, 2015, at 3:34 PM, Ben Pfaff <b...@nicira.com> wrote: > > The implementation of port_security was partial, and the specification was > vague. This reduces both to what was actually meant to be supported at > this point. It shouldn't be hard to fully implement port security when we > have a clear specification. > > Reported-by: Justin Pettit <jpet...@nicira.com> > Signed-off-by: Ben Pfaff <b...@nicira.com> > --- > ovn/northd/ovn-northd.c | 67 +++++------------------------------------------ > ovn/ovn-nb.xml | 10 +++---- > 2 files changed, 10 insertions(+), 67 deletions(-) > > diff --git a/ovn/northd/ovn-northd.c b/ovn/northd/ovn-northd.c > index b0c6b4e..be6430d 100644 > --- a/ovn/northd/ovn-northd.c > +++ b/ovn/northd/ovn-northd.c > @@ -202,66 +202,10 @@ pipeline_add(struct pipeline_ctx *ctx, > sbrec_pipeline_set_actions(pipeline, actions); > } > > -/* A single port security constraint. This is a parsed version of a single > - * member of the port_security column in the OVN_NB Logical_Port table. > - * > - * Each token has type LEX_T_END if that field is missing, otherwise > - * LEX_T_INTEGER or LEX_T_MASKED_INTEGER. */ > -struct ps_constraint { > - struct lex_token eth; > - struct lex_token ip4; > - struct lex_token ip6; > -}; > - > -/* 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) { > - struct lex_token *t; > - > - t = (lexer.token.format == LEX_F_IPV4 ? &c->ip4 > - : lexer.token.format == LEX_F_IPV6 ? &c->ip6 > - : 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); > - lexer_destroy(&lexer); > - > - return true; > -} > - > /* Appends port security constraints on L2 address field 'eth_addr_field' > * (e.g. "eth.src" or "eth.dst") to 'match'. 'port_security', with > * 'n_port_security' elements, is the collection of port_security constraints > - * from an OVN_NB Logical_Port row. > - * > - * (This is naive; it's not yet possible to express complete L2 and L3 port > - * security constraints as a single Boolean expression.) */ > + * from an OVN_NB Logical_Port row. */ > static void > build_port_security(const char *eth_addr_field, > char **port_security, size_t n_port_security, > @@ -272,14 +216,15 @@ build_port_security(const char *eth_addr_field, > > size_t n = 0; > for (size_t i = 0; i < n_port_security; i++) { > - struct ps_constraint c; > - if (parse_port_security(port_security[i], &c) > - && c.eth.type != LEX_T_END) { > - lex_token_format(&c.eth, match); > + uint8_t ea[ETH_ADDR_LEN]; > + > + if (eth_addr_from_string(port_security[i], ea)) { > + ds_put_format(match, ETH_ADDR_FMT, ETH_ADDR_ARGS(ea)); > ds_put_char(match, ' '); > n++; > } > } > + ds_chomp(match, ' '); > ds_put_cstr(match, "}"); > > if (!n) { > diff --git a/ovn/ovn-nb.xml b/ovn/ovn-nb.xml > index 2e792a7..2335349 100644 > --- a/ovn/ovn-nb.xml > +++ b/ovn/ovn-nb.xml > @@ -137,7 +137,7 @@ > > <column name="port_security"> > <p> > - A set of L2 (Ethernet) or L3 (IPv4 or IPv6) addresses or L2+L3 pairs > + A set of L2 (Ethernet) addresses > from which the logical port is allowed to send packets and to which it > is allowed to receive packets. If this column is empty, all addresses > are permitted. Logical ports are always allowed to receive packets > @@ -145,14 +145,12 @@ > </p> > > <p> > - 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. > + Each member of the set is an Ethernet address in the form > + > <var>xx</var>:<var>xx</var>:<var>xx</var>:<var>xx</var>:<var>xx</var>:<var>xx</var>. > </p> > > <p> > - TBD: exact semantics. For now only Ethernet port security is > - implemented. > + This specification will be extended to support L3 port security. > </p> > </column> > > -- > 1.7.10.4 > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev