On Tue, Mar 29, 2016 at 7:26 PM, Justin Pettit <jpet...@ovn.org> wrote:
> > > On Mar 21, 2016, at 7:54 AM, Russell Bryant <russ...@ovn.org> wrote: > > > > diff --git a/ovn/northd/ovn-northd.8.xml b/ovn/northd/ovn-northd.8.xml > > index 2cc9c34..c8cca54 100644 > > --- a/ovn/northd/ovn-northd.8.xml > > +++ b/ovn/northd/ovn-northd.8.xml > > > > + <code>allow</code> ACLs translate into logical flows with > > + the <code>next;</code> action. If there are any stateful ACLs > > + on this datapath, then <code>alloc</code> ACLs translate to > > Should that be "allow" instead of "alloc"? That was just a test to see who read the docs very closely. You passed. > > > + <code>ct_commit; next;</code>. > > + </li> > > + <li> > > + <code>allow-related</code> ACLs translate into logical > > + flows with the <code>ct_commit(ct_label=0); next;</code> actions > > + for new connections and "next;" for existing connections. > > Should that "next;" be surrounded by a <code> declaration instead of > quotes? Done, thanks. > > > - A priority-65535 flow that allows any traffic that has been > > - committed to the connection tracker (i.e., established flows). > > + A priority-65535 flow that allows any traffic in the reply > > + direction for a connection that has been committed to the > > + connection tracker (i.e., established flows), as long as > > + the committed flow does not have <code>ct_label=1</code> set. > > I realize it has the same effect since we set the whole field, but I think > it actually just matches on "ct_label[0]". You're right, thanks. > > > + We only handle traffic in the reply direction here because > > + we want all packets going in the request direction to still > > + go through the flows that implement the currently defined > > + policy based on ACLs. If a connection is no longer allowed by > > + policy, <code>ct_label</code> will get set and packets in the > > + reply direction will no longer be allowed, either. > > I think it would be good to specify which bit gets set here, since we may > use other bits in the future, and we may forget to update this comment. > Done. > > > </li> > > > > <li> > > A priority-65535 flow that allows any traffic that is considered > > related to a committed flow in the connection tracker (e.g., an > > - ICMP Port Unreachable from a non-listening UDP port). > > + ICMP Port Unreachable from a non-listening UDP port), as long > > + as the committed flow does not have <code>ct_label=1</code> set. > > Same comment about "ct_label[0]". Done. > A priority-65535 flow that drops all traffic marked by the > > - connection tracker as invalid. > > + connection tracker as invalid or reply packets with > > + <code>ct_label=1</code> set meaning that the connection should > > Ditto. > Done. > > > + no longer be allowed due to a policy change. Packets in the > > + request direction are skipped here to let a newly created > > + ACL re-allow this connection. > > This sentence makes it sound like invalid packets will be allowed in the > request direction, which I don't think is desired behavior, and it doesn't > appear to be what the code does (ie, the code looks right to me). > Yeah, that sentence was pretty awkward. I split it into two sections to hopefully make it more clear. > > --- a/ovn/northd/ovn-northd.c > > +++ b/ovn/northd/ovn-northd.c > > @@ -1384,48 +1384,77 @@ build_acls(struct ovn_datapath *od, struct hmap > *lflows, struct hmap *ports) > > ... > > + * We use "ct_commit" for a connection that is not already known > > + * by the connection tracker. Once a connection is committed, > > + * subsequent packets will hit the flow at priority 0 that just > > + * uses "next;" > > + * > > + * We also check for established connections that have ct_label > set > > Once again, I would mention "ct_label[0]". > > Done. > > + * on them. That's a connection that was disallowed, but is now > > + * allowed by policy again since it hit this default-allow flow. > > + * We need to clear the mark to let the connection continue. > > "mark" is correct generically, but it might be clearer to say "label". > Also, I would mention that it's the "special" bit. > Done. That was probably left over from when I was using ct_mark and my search for "ct_mark" didn't catch it. > > > /* Ingress and Egress ACL Table (Priority 65535). > > * > > - * Always allow traffic that is established to a committed > > - * conntrack entry. This is enforced at a higher priority than > > + * Allow reply traffic that is part of an established > > + * conntrack entry that has not been marked for deletion > > + * (bit 0 of ct_label). We only match traffic in the > > + * reply direction because we want traffic in the request > > + * direction to hit the currently defined policy from ACLs. > > + * > > + * This is enforced at a higher priority than > > * ACLs can be defined. */ > > I think this may be able to to fit on one line. Done. > > @@ -1435,38 +1464,102 @@ build_acls(struct ovn_datapath *od, struct hmap > *lflows, struct hmap *ports) > > bool ingress = !strcmp(acl->direction, "from-lport") ? true > :false; > > enum ovn_stage stage = ingress ? S_SWITCH_IN_ACL : > S_SWITCH_OUT_ACL; > > > > - if (!strcmp(acl->action, "allow")) { > > - /* If there are any stateful flows, we must even commit > "allow" > > - * actions. This is because, while the initiater's > > - * direction may not have any stateful rules, the server's > > - * may and then its return traffic would not have an > > - * associated conntrack entry and would return "+invalid". > */ > > - const char *actions = has_stateful ? "ct_commit; next;" : > "next;"; > > - ovn_lflow_add(lflows, od, stage, > > - acl->priority + OVN_ACL_PRI_OFFSET, > > - acl->match, actions); > > - } else if (!strcmp(acl->action, "allow-related")) { > > - struct ds match = DS_EMPTY_INITIALIZER; > > + if (!strcmp(acl->action, "allow") > > + || !strcmp(acl->action, "allow-related")) { > > + if (!has_stateful) { > > + /* If there are any stateful flows, we must even commit > "allow" > > + * actions. This is because, while the initiater's > > + * direction may not have any stateful rules, the > server's > > + * may and then its return traffic would not have an > > + * associated conntrack entry and would return > "+invalid". */ > > + ovn_lflow_add(lflows, od, stage, > > + acl->priority + OVN_ACL_PRI_OFFSET, > > + acl->match, "next;"); > > I think that big comment should go right above the "!has_stateful" check, > since its really describing the "else" case. > Done. > > > + } else { > > + struct ds match = DS_EMPTY_INITIALIZER; > > + > > + /* Commit the connection tracking entry if its a new > connection > > Since I'm already being nit-picky, I think that should be "it's". > Done. > > > + * that matches this ACL. After this commit, the reply > traffic > > + * is allowed by a flow we create at priority 65535, > defined > > + * earlier. > > + * > > + * It's also possible that a known connection was > marked for > > + * deletion after a policy was deleted, but the policy > was > > + * re-added while that connection is still known. We > catch that > > + * case here and un-set ct_label to indicate that the > connection > > I'd mention the specific bit in "ct_label". > Done. > > > + * should be allowed to resume. > > + */ > > + ds_put_format(&match, "((ct.new && !ct.est)" > > + " || (!ct.new && ct.est && > !ct.rpl " > > + "&& ct_label[0] == 1)) " > > + "&& (%s)", acl->match); > > + ovn_lflow_add(lflows, od, stage, > > + acl->priority + OVN_ACL_PRI_OFFSET, > > + ds_cstr(&match), "ct_commit(ct_label=0); > next;"); > > If you end up allowing bit-level setting in the previous patch, I'd use > that here. > I checked with Joe and he's still working on fixes for that, so I'm holding off for now. > > > > + } else if (!strcmp(acl->action, "drop") > > + || !strcmp(acl->action, "reject")) { > > + struct ds match = DS_EMPTY_INITIALIZER; > > + /* XXX Need to support "reject", treat it as "drop;" for > now. */ > > ... > > - } else if (!strcmp(acl->action, "reject")) { > > - /* xxx Need to support "reject". */ > > - VLOG_INFO("reject is not a supported action"); > > - ovn_lflow_add(lflows, od, stage, > > - acl->priority + OVN_ACL_PRI_OFFSET, > > - acl->match, "drop;"); > > We used to log an error for "reject" actions. I think it still may be > worth doing. > Oops. I re-added the VLOG_INFO() for the "reject" case. > > > + if (has_stateful) { > > + /* The implementation of "drop" differs if stateful > ACLs are in > > + * use for this datapath. In that case, the actions > differ > > + * depending on whether the connection was previous > committed > > s/previous/previously/ > Done. Thanks for the review! -- Russell Bryant _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev