[ovs-dev] [PATCH v4] ovn-northd: Add logical flows to support native DHCPv4
Numan Siddique
nusiddiq at redhat.com
Wed Jul 6 09:14:19 UTC 2016
On Tue, Jul 5, 2016 at 12:04 PM, Zong Kai LI <zealokii at gmail.com> wrote:
> + /* Logical switch ingress table 10 and 11: 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")) {
>> + /* Don't add the DHCP flows if the port is not enabled or if
>> the
>> + * port is a router port. */
>> + continue;
>> + }
>> +
>> + if (!op->nbs->dhcpv4_options) {
>> + /* CMS has disabled native DHCPv4 for this lport. */
>> + 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)) {
>> + struct ds match = DS_EMPTY_INITIALIZER;
>> + ds_put_format(
>> + &match, "inport == %s && eth.src == "ETH_ADDR_FMT
>> + " && ip4.src == 0.0.0.0 && "
>> + "ip4.dst == 255.255.255.255 && udp.src == 68 && "
>> + "udp.dst == 67", op->json_key,
>> + ETH_ADDR_ARGS(laddrs.ea));
>> +
>> + ovn_lflow_add(lflows, op->od,
>> S_SWITCH_IN_DHCP_OPTIONS,
>> + 100, ds_cstr(&match),
>> + ds_cstr(&options_action));
>> + /* If REGBIT_DHCP_OPTS_RESULT is set, it means the
>> + * put_dhcp_opts action is successful */
>> + ds_put_cstr(&match, " && "REGBIT_DHCP_OPTS_RESULT);
>> + ovn_lflow_add(lflows, op->od,
>> S_SWITCH_IN_DHCP_RESPONSE,
>> + 100, ds_cstr(&match),
>> + ds_cstr(&response_action));
>> + ds_destroy(&match);
>> + ds_destroy(&options_action);
>> + ds_destroy(&response_action);
>> + break;
>> + }
>> + }
>> + free(laddrs.ipv4_addrs);
>> + }
>> + }
>> +
>> + /* Ingress table 10 and 11: DHCP options and response, by default
>> goto next.
>> + * (priority 0). */
>> +
>> + HMAP_FOR_EACH (od, key_node, datapaths) {
>> + if (!od->nbs) {
>> + continue;
>> + }
>> +
>> + ovn_lflow_add(lflows, od, S_SWITCH_IN_DHCP_OPTIONS, 0, "1",
>> "next;");
>> + ovn_lflow_add(lflows, od, S_SWITCH_IN_DHCP_RESPONSE, 0, "1",
>> "next;");
>> + }
>>
>
> Great work, but only one thing makes me feel uncomfortable.
> DHCP Options flows are generated per each port, but not per each switch
> datapath.
> Since the resumed packet copies L2-L4 fields from original packet, and
> DHCP options fields are the same for each port in the same switch. It
> doesn't make sense to build DHCP Options flows for each ports.
> The inport and eth.src in DHCP Options flows, I think we need logical
> switch metadata field indeed.
>
>
Since DHCP options are associated with logical ports, I don't see any other
way. Also the IP address to be offered in the DHCP response comes from the
Logical_Switch_Port.addresses right ?
> Thanks and have a nice day.
> Zong Kai, LI
>
More information about the dev
mailing list