Hi Zonk Kai Li, Thanks for the review. See inline for the comments. On Mon, Jun 27, 2016 at 9:38 PM, Zong Kai LI <zealo...@gmail.com> wrote:
> + <pre> >> +eth.dst = eth.src; >> +eth.src = <var>E</var>; >> +ip4.dst = <var>O</var>; >> +ip4.src = <var>S</var>; >> +udp.src = 67; >> +udp.dst = 68; >> +outport = <var>P</var>; >> +inport = ""; /* Allow sending out inport. */ >> +output; >> + </pre> >> + >> + <p> >> + where <var>E</var> is the server MAC address and <var>S</var> >> is the >> + server IPv4 address defined in the DHCPv4 options and >> <var>O</var> is >> + the IPv4 address defined in the logical port's addresses >> column. >> + </p> >> + >> + <p> >> + (This terminates packet processing; the packet does not go on >> the >> + next ingress table.) >> + </p> >> > > Do you mean action "output;"? Yes, instead of going to the next ingress > table, packets will be sent to table OFTABLE_REMOTE_OUTPUT, but "terminates > packet processing" seems unclear or precise. > I will rephrase to "This terminates ingress packet processing". > > + </li> >> + >> + <li> >> + A priority-0 flow that matches all packets to advances to table >> 8. >> + </li> >> + </ul> >> + >> + <h3>Ingress Table 8: Destination Lookup</h3> >> >> <p> >> This table implements switching behavior. It contains these >> logical >> @@ -387,6 +470,12 @@ output; >> This is similar to ingress table 4 except for >> <code>to-lport</code> ACLs. >> </p> >> >> + <p> >> + Also a priority 34000 logical flow is added for each logical port >> which >> + has DHCPv4 options defined to allow the DHCPv4 reply packet from >> the >> + <code>Ingress Table 7: DHCP response</code>. >> + </p> >> >> > 34000, a magic number ? > > The ACL priority range is from 0 to 32767 which translates to OF priority 1000 to 33767 (see OVN_ACL_PRI_OFFSET in ovn-northd.c). Hence 34000, so that the the CMS doesn't override this. +static bool >> has_stateful_acl(struct ovn_datapath *od) >> { >> for (size_t i = 0; i < od->nbs->n_acls; i++) { >> @@ -1478,6 +1551,35 @@ build_acls(struct ovn_datapath *od, struct hmap >> *lflows, struct hmap *ports) >> acl->match, "drop;"); >> } >> } >> + >> + /* Add 34000 priority flow to allow DHCP reply from ovn-controller >> to all >> + * logical ports of the datapath if the CMS has configured DHCPv4 >> options*/ >> + if (od->nbs && od->nbs->n_ports) { >> + for (size_t i = 0; i < od->nbs->n_ports; i++) { >> + if (od->nbs->ports[i]->dhcpv4_options) { >> + const char *server_id = smap_get( >> + &od->nbs->ports[i]->dhcpv4_options->options, >> "server_id"); >> + const char *server_mac = smap_get( >> + &od->nbs->ports[i]->dhcpv4_options->options, >> "server_mac"); >> + const char *lease_time = smap_get( >> + &od->nbs->ports[i]->dhcpv4_options->options, >> "lease_time"); >> + const char *router = smap_get( >> + &od->nbs->ports[i]->dhcpv4_options->options, >> "router"); >> + if (server_id && server_mac && lease_time && router) { >> > > Well, how about extract above code and write a new function to check if > dhcpv4_options are valid ? > I thought about this, but since we need the values "server_mac" and "server_id", I think the above code should be fine. > > static void >> @@ -1635,7 +1737,71 @@ build_lswitch_flows(struct hmap *datapaths, struct >> hmap *ports, >> ovn_lflow_add(lflows, od, S_SWITCH_IN_ARP_RSP, 0, "1", "next;"); >> } >> >> - /* Ingress table 6: Destination lookup, broadcast and multicast >> handling >> + /* Logical switch ingress table 6 and 7: DHCP options and response >> + * priority 100 flows. */ >> + HMAP_FOR_EACH (op, key_node, ports) { >> + if (!op->nbs) { >> + continue; >> + } >> + >> + if (!lsp_is_enabled(op->nbs) || !strcmp(op->nbs->type, >> "router")) { >> > > Why not put op->nbs->dhcpv4_options checking here? > And update to "... if the port is a router port or if dhcp is not enabled." > Ack. I will add this. > > + /* Don't add the DHCP flows if the port is not enabled or if >> the >> + * port is a router port. */ >> + continue; >> + } >> + >> + for (size_t i = 0; i < op->nbs->n_addresses; i++) { >> + struct lport_addresses laddrs; >> + if (!extract_lsp_addresses(op->nbs->addresses[i], &laddrs, >> + false)) { >> + continue; >> + } >> + >> + for (size_t j = 0; j < laddrs.n_ipv4_addrs; j++) { >> + struct ds options_action = DS_EMPTY_INITIALIZER; >> + struct ds response_action = DS_EMPTY_INITIALIZER; >> + if (build_dhcpv4_action(op, laddrs.ipv4_addrs[j].addr, >> + &options_action, >> &response_action)) { >> > > There are some dhcp_options relevant but not lsp address relevant checking > in build_dhcpv4_action. > So think about it, it's unnecessary to do duplicated check when lsp has > multiple addresses. > > Can you please elaborate on this. I am not sure I understood correctly > @@ -43,6 +43,11 @@ >> "max": "unlimited"}}, >> "up": {"type": {"key": "boolean", "min": 0, "max": 1}}, >> "enabled": {"type": {"key": "boolean", "min": 0, "max": >> 1}}, >> + "dhcpv4_options": {"type": {"key": {"type": "uuid", >> + "refTable": "DHCP_Options", >> + "refType": "strong"}, >> > > Great for the refTable. > > That's all what I can see now. > > Thanks. > Zong Kai, LI > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev