On 6/9/26 12:09 PM, Naveen Yerramneni wrote:
>>> @@ -10082,12 +10083,14 @@ build_lswitch_dhcp_relay_flows(struct ovn_port 
>>> *op,
>>>
>>>     ds_put_format(
>>>         match, "inport == %s && eth.src == %s && "
>>> -        "ip4.src == 0.0.0.0 && ip4.dst == 255.255.255.255 && "
>>> +        "ip4.src == {0.0.0.0, %s/%u} && ip4.dst == 255.255.255.255 && "
>>>         "udp.src == 68 && udp.dst == 67",
>>> -        op->json_key, op->lsp_addrs[0].ea_s);
>>> +        op->json_key, op->lsp_addrs[0].ea_s,
>>> +        rp->lrp_networks.ipv4_addrs[0].network_s,
>>> +        rp->lrp_networks.ipv4_addrs[0].plen);
>> Essentially here, we always just use the first network, why not add all
>> of them to the IP set?  Adding the first one seems potentially incorrect
>> anyway, it might not be the one matching the DHCP_Relay configured "servers",
>> right?
>>
>> On a closer read, I see that the router port already only handles the
>> first configured network.  That seems like an unfortunate decision in
>> the original implementation.  Would you have time to prepare a separate
>> follow patch up for that?
> Hi Dumitru,
> 
> Could you please me understand what is the exact change that you are 
> proposing here ?

Hi Naveen,

Here's an example (I just modified the system test a bit) that I ran in an
OVN sandbox:

ovn-nbctl lr-add R1

ovn-nbctl ls-add sw0
ovn-nbctl ls-add sw1
ovn-nbctl ls-add sw-ext

# Add router ports with multiple subnets on each of them.  <<<< relevant change!
ovn-nbctl lrp-add R1 rp-sw0 00:00:01:01:02:03 10.10.10.1/24 192.168.1.1/24
ovn-nbctl lrp-add R1 rp-sw1 00:00:03:01:02:03 20.20.20.2/24 192.168.2.1/24
ovn-nbctl lrp-add R1 rp-ext 00:00:02:01:02:03 172.16.1.254/24

dhcp_relay=$(ovn-nbctl create DHCP_Relay servers=172.16.1.1)
ovn-nbctl set Logical_Router_port rp-sw0 dhcp_relay=$dhcp_relay
ovn-nbctl set Logical_Router_port rp-sw1 dhcp_relay=$dhcp_relay
ovn-nbctl lrp-set-gateway-chassis rp-ext hv1

ovn-nbctl lsp-add sw0 sw0-rp -- set Logical_Switch_Port sw0-rp \
    type=router options:router-port=rp-sw0 \
    -- lsp-set-addresses sw0-rp router
ovn-nbctl lsp-add sw1 sw1-rp -- set Logical_Switch_Port sw1-rp \
    type=router options:router-port=rp-sw1 \
    -- lsp-set-addresses sw1-rp router

ovn-nbctl set Logical_Switch sw0 other_config:dhcp_relay_port=sw0-rp
ovn-nbctl set Logical_Switch sw1 other_config:dhcp_relay_port=sw1-rp

ovn-nbctl lsp-add sw-ext ext-rp -- set Logical_Switch_Port ext-rp \
    type=router options:router-port=rp-ext \
    -- lsp-set-addresses ext-rp router
ovn-nbctl lsp-add-localnet-port sw-ext lnet phynet

ovn-nbctl lsp-add sw0 sw01 \
    -- lsp-set-addresses sw01 "f0:00:00:01:02:03"

ovn-nbctl lsp-add sw1 sw11 \
    -- lsp-set-addresses sw11 "f0:00:00:02:02:03"

Then logical flows look weird (and non-deterministic):

  table=3 (lr_in_ip_input     ), priority=110  , match=(inport == "rp-sw0" && 
ip4.src == {0.0.0.0, 10.10.10.0/24} && ip4.dst == 255.255.255.255 && ip.frag == 
0 && udp.src == 68 && udp.dst == 67), action=(reg9[7] = 
dhcp_relay_req_chk(10.10.10.1, 172.16.1.1);next; /* DHCP_RELAY_REQ */)
  table=3 (lr_in_ip_input     ), priority=110  , match=(inport == "rp-sw1" && 
ip4.src == {0.0.0.0, 192.168.2.0/24} && ip4.dst == 255.255.255.255 && ip.frag 
== 0 && udp.src == 68 && udp.dst == 67), action=(reg9[7] = 
dhcp_relay_req_chk(192.168.2.1, 172.16.1.1);next; /* DHCP_RELAY_REQ */)

That's because in northd we do:

build_dhcp_relay_flows_for_lrouter_port()
{
...
    ds_put_format(
        match, "ip4.src == %s && ip4.dst == %s && "
        "udp.src == 67 && udp.dst == 67",
        server_ip_str, op->lrp_networks.ipv4_addrs[0].addr_s);
    ds_put_format(actions,
          REG_DHCP_RELAY_DIP_IPV4" = ip4.dst; "
          REGBIT_DHCP_RELAY_RESP_CHK
          " = dhcp_relay_resp_chk(%s, %s); next; /* DHCP_RELAY_RESP */",
          op->lrp_networks.ipv4_addrs[0].addr_s, server_ip_str);

    ovn_lflow_add(lflows, op->od, S_ROUTER_IN_DHCP_RELAY_RESP_CHK, 100,
                  ds_cstr(match), ds_cstr(actions), lflow_ref,
                  WITH_CTRL_METER(copp_meter_get(COPP_DHCPV4_RELAY,
                                                 op->od->nbr->copp,
                                                 meter_groups)),
                  WITH_HINT(&op->nbrp->header_));
...
}

That's what I meant in my previous email.

Regards,
Dumitru

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to