> On 5 Jun 2026, at 7:53 PM, Dumitru Ceara <[email protected]> wrote:
> 
> !-------------------------------------------------------------------|
>  CAUTION: External Email
> 
> |-------------------------------------------------------------------!
> 
> On 5/25/26 6:18 AM, Naveen Yerramneni wrote:
>> DHCP client extends its lease by unicasting a DHCPREQUEST to its
>> original DHCP server when the T1 timer fires (typically at 50% of
>> the lease).  If that DHCPREQUEST gets no response, the T2 timer
>> fires (typically at 87.5% of the lease) and the client enters the
>> REBINDING state, where it broadcasts a DHCPREQUEST using its
>> currently leased IP as the source address (rather than 0.0.0.0).
>> 
>> Today OVN's DHCP relay only matches DHCPREQUEST packets whose source
>> IP is 0.0.0.0, so the broadcast DHCPREQUEST sent by a client in the
>> REBINDING state is not matched by any relay flow and is dropped.
>> The lease cannot be renewed through the relay and the client
>> eventually falls back to a fresh DISCOVER.
>> 
>> Extend the relay to also forward DHCPREQUEST packets whose source IP
>> lies in the relay LRP's subnet by widening the source-IP match of
>> the DHCP relay request flows to the set
>> ip4.src == {0.0.0.0, <lrp_cidr>}, where <lrp_cidr> is the CIDR of
>> the relay Logical_Router_Port.  The set is applied to:
>> 
>> - The priority-100 logical switch flow in ls_in_l2_lkup that
>> forwards client DHCP broadcasts to the relay LRP-attachment
>> port.
>> - The logical router lr_in_ip_input priority-110
>> dhcp_relay_req_chk flow.
>> - The lr_in_dhcp_relay_req priority-100 forward and priority-1
>> drop flows.
>> 
>> Fixes: dce4abfc68eb ("northd, tests: DHCP Relay Agent support for overlay 
>> IPv4 subnets.")
>> Signed-off-by: Naveen Yerramneni <[email protected]>
>> Acked-by: Aditya Mehakare <[email protected]>
>> Acked-by: Huzaifa Calcuttawala <[email protected]>
>> ---
>> V2:
>>  - consider dhcp_relay_handle_rebind as optional to avoid unwanted
>>    northd recompute.
>> V3:
>>  - Addresed review comments from Dumitru.
>> ---
> 
> Hi Naveen,
> 
> Thanks for v3, sorry for the delay in reviewing it.
> 
>> Documentation/ref/ovn-logical-flows.7.rst | 28 ++++++++++++----------
>> northd/northd.c                           | 29 +++++++++++++++--------
>> tests/ovn-northd.at                       | 14 +++++------
>> tests/ovn.at                              |  9 +++++--
>> 4 files changed, 49 insertions(+), 31 deletions(-)
>> 
>> diff --git a/Documentation/ref/ovn-logical-flows.7.rst 
>> b/Documentation/ref/ovn-logical-flows.7.rst
>> index b60f8609c..7f83e5fe9 100644
>> --- a/Documentation/ref/ovn-logical-flows.7.rst
>> +++ b/Documentation/ref/ovn-logical-flows.7.rst
>> @@ -1382,7 +1382,8 @@ This table implements switching behavior.  It contains 
>> these logical flows:
>> 
>> - A priority-100 flow that forwards all DHCP broadcast packets coming from 
>> VIFs
>>   to the logical router port's MAC when DHCP relay is enabled on the logical
>> -  switch.
>> +  switch.  The ``ip4.src`` match is the set ``{0.0.0.0, lrp_cidr}``, where
>> +  ``lrp_cidr`` is the CIDR of the relay logical router port.
> 
> Shouldn't we handle all router port networks?
> 
>> 
>> - A priority-100 flow that matches ``reg8[23] == 1`` and does ``output`` 
>> action.
>>   This ensures that packets that got injected back into this table from 
>> egress
>> @@ -2194,9 +2195,10 @@ contains the following flows to implement very basic 
>> IP host functionality.
>> - For each logical router port configured with DHCP relay the following
>>   priority-110 flows are added to manage the DHCP relay traffic:
>> 
>> -  - if ``inport`` is lrp and ``ip4.src == 0.0.0.0`` and ``ip4.dst ==
>> -    255.255.255.255`` and ``ip4.frag == 0`` and ``udp.src == 68`` and 
>> ``udp.dst
>> -    == 67``, the ``dhcp_relay_req_chk`` action is executed. ::
>> +  - if ``inport`` is lrp and ``ip4.src == {0.0.0.0, lrp_cidr}`` and 
>> ``ip4.dst
>> +    == 255.255.255.255`` and ``ip4.frag == 0`` and ``udp.src == 68`` and
>> +    ``udp.dst == 67``, the ``dhcp_relay_req_chk`` action is executed.
>> +    ``lrp_cidr`` is the CIDR of the relay logical router port. ::
>> 
>>         reg9[7] = dhcp_relay_req_chk(lrp_ip, dhcp_server_ip);next
>> 
>> @@ -2494,10 +2496,11 @@ This stage process the DHCP request packets on which 
>> ``dhcp_relay_req_chk``
>> action is applied in the IP input stage.
>> 
>> - A priority-100 logical flow is added for each logical router port 
>> configured
>> -  with DHCP relay that matches ``inport`` is lrp and ``ip4.src == 0.0.0.0`` 
>> and
>> -  ``ip4.dst == 255.255.255.255`` and ``udp.src == 68`` and ``udp.dst == 
>> 67`` and
>> -  ``reg9[7] == 1`` and applies following actions. If ``reg9[7]`` is set to 1
>> -  then, ``dhcp_relay_req_chk`` action was successful. ::
>> +  with DHCP relay that matches ``inport`` is lrp and ``ip4.src == {0.0.0.0,
>> +  lrp_cidr}`` and ``ip4.dst == 255.255.255.255`` and ``udp.src == 68`` and
>> +  ``udp.dst == 67`` and ``reg9[7] == 1`` and applies following actions. If
>> +  ``reg9[7]`` is set to 1 then, ``dhcp_relay_req_chk`` action was 
>> successful.
>> +  ``lrp_cidr`` is the CIDR of the relay logical router port. ::
>> 
>>       ip4.src=lrp ip;
>>       ip4.dst=dhcp server ip;
>> @@ -2505,10 +2508,11 @@ action is applied in the IP input stage.
>>       next;
>> 
>> - A priority-1 logical flow is added for each logical router port configured
>> -  with DHCP relay that matches ``inport`` is lrp and ``ip4.src == 0.0.0.0`` 
>> and
>> -  ``ip4.dst == 255.255.255.255`` and ``udp.src == 68`` and ``udp.dst == 
>> 67`` and
>> -  ``reg9[7] == 0`` and drops the packet. If ``reg9[7]`` is set to 0 then,
>> -  ``dhcp_relay_req_chk`` action was unsuccessful.
>> +  with DHCP relay that matches ``inport`` is lrp and ``ip4.src == {0.0.0.0,
>> +  lrp_cidr}`` and ``ip4.dst == 255.255.255.255`` and ``udp.src == 68`` and
>> +  ``udp.dst == 67`` and ``reg9[7] == 0`` and drops the packet. If 
>> ``reg9[7]``
>> +  is set to 0 then, ``dhcp_relay_req_chk`` action was unsuccessful.
>> +  ``lrp_cidr`` is the CIDR of the relay logical router port.
>> 
>> - A priority-0 flow that matches all packets to advance to the next table.
>> 
>> diff --git a/northd/northd.c b/northd/northd.c
>> index 0ea7c1b95..74ec487b3 100644
>> --- a/northd/northd.c
>> +++ b/northd/northd.c
>> @@ -10058,7 +10058,8 @@ build_lswitch_dhcp_relay_flows(struct ovn_port *op,
>>     }
>> 
>>     struct ovn_port *rp = sp->peer;
>> -    if (!rp || !rp->nbrp || !rp->nbrp->dhcp_relay || rp->peer != sp) {
>> +    if (!rp || !rp->nbrp || !rp->nbrp->dhcp_relay || rp->peer != sp ||
>> +        !rp->lrp_networks.n_ipv4_addrs) {
>>         return;
>>     }
>> 
>> @@ -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 ?



> 
>>     ds_put_format(actions,
>>                   "eth.dst = %s; outport = %s; next; /* DHCP_RELAY_REQ */",
>> -                  rp->lrp_networks.ea_s,sp->json_key);
>> +                  rp->lrp_networks.ea_s, sp->json_key);
>>     ovn_lflow_add(lflows, op->od,
>>                   S_SWITCH_IN_L2_LKUP, 100,
>>                   ds_cstr(match),
>> @@ -16701,9 +16704,11 @@ build_dhcp_relay_flows_for_lrouter_port(struct 
>> ovn_port *op,
>> 
>>     ds_put_format(
>>         match, "inport == %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 && "
>>         "ip.frag == 0 && udp.src == 68 && udp.dst == 67",
>> -        op->json_key);
>> +        op->json_key,
>> +        op->lrp_networks.ipv4_addrs[0].network_s,
>> +        op->lrp_networks.ipv4_addrs[0].plen);
>>     ds_put_format(actions,
>>                   REGBIT_DHCP_RELAY_REQ_CHK
>>                   " = dhcp_relay_req_chk(%s, %s);"
>> @@ -16722,10 +16727,12 @@ build_dhcp_relay_flows_for_lrouter_port(struct 
>> ovn_port *op,
>> 
>>     ds_put_format(
>>         match, "inport == %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 && "
>>         REGBIT_DHCP_RELAY_REQ_CHK,
>> -        op->json_key);
>> +        op->json_key,
>> +        op->lrp_networks.ipv4_addrs[0].network_s,
>> +        op->lrp_networks.ipv4_addrs[0].plen);
>>     ds_put_format(actions,
>>                   "ip4.src = %s; ip4.dst = %s; udp.src = 67; next; "
>>                   "/* DHCP_RELAY_REQ */",
>> @@ -16740,10 +16747,12 @@ build_dhcp_relay_flows_for_lrouter_port(struct 
>> ovn_port *op,
>> 
>>     ds_put_format(
>>         match, "inport == %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 && "
>>         REGBIT_DHCP_RELAY_REQ_CHK" == 0",
>> -        op->json_key);
>> +        op->json_key,
>> +        op->lrp_networks.ipv4_addrs[0].network_s,
>> +        op->lrp_networks.ipv4_addrs[0].plen);
>>     ds_put_format(actions, "drop; /* DHCP_RELAY_REQ */");
>> 
>>     ovn_lflow_add(lflows, op->od, S_ROUTER_IN_DHCP_RELAY_REQ, 1,
>> diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
>> index 26a19bd96..9d03de4fe 100644
>> --- a/tests/ovn-northd.at
>> +++ b/tests/ovn-northd.at
>> @@ -13434,14 +13434,14 @@ ovn-sbctl lflow-list > lflows
>> AT_CAPTURE_FILE([lflows])
>> 
>> AT_CHECK([grep -e "DHCP_RELAY_" lflows | sed 's/table=../table=??/'], [0], 
>> [dnl
>> -  table=??(lr_in_ip_input     ), priority=110  , match=(inport == "lrp1" && 
>> ip4.src == 0.0.0.0 && ip4.dst == 255.255.255.255 && ip.frag == 0 && udp.src 
>> == 68 && udp.dst == 67), action=(reg9[[7]] = dhcp_relay_req_chk(192.168.1.1, 
>> 172.16.1.1);next; /* DHCP_RELAY_REQ */)
>> +  table=??(lr_in_ip_input     ), priority=110  , match=(inport == "lrp1" && 
>> ip4.src == {0.0.0.0, 192.168.1.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.1.1, 172.16.1.1);next; /* DHCP_RELAY_REQ */)
>>   table=??(lr_in_ip_input     ), priority=110  , match=(ip4.src == 
>> 172.16.1.1 && ip4.dst == 192.168.1.1 && ip.frag == 0 && udp.src == 67 && 
>> udp.dst == 67), action=(next; /* DHCP_RELAY_RESP */)
>> -  table=??(lr_in_dhcp_relay_req), priority=100  , match=(inport == "lrp1" 
>> && ip4.src == 0.0.0.0 && ip4.dst == 255.255.255.255 && udp.src == 68 && 
>> udp.dst == 67 && reg9[[7]]), action=(ip4.src = 192.168.1.1; ip4.dst = 
>> 172.16.1.1; udp.src = 67; next; /* DHCP_RELAY_REQ */)
>> -  table=??(lr_in_dhcp_relay_req), priority=1    , match=(inport == "lrp1" 
>> && ip4.src == 0.0.0.0 && ip4.dst == 255.255.255.255 && udp.src == 68 && 
>> udp.dst == 67 && reg9[[7]] == 0), action=(drop; /* DHCP_RELAY_REQ */)
>> +  table=??(lr_in_dhcp_relay_req), priority=100  , match=(inport == "lrp1" 
>> && ip4.src == {0.0.0.0, 192.168.1.0/24} && ip4.dst == 255.255.255.255 && 
>> udp.src == 68 && udp.dst == 67 && reg9[[7]]), action=(ip4.src = 192.168.1.1; 
>> ip4.dst = 172.16.1.1; udp.src = 67; next; /* DHCP_RELAY_REQ */)
>> +  table=??(lr_in_dhcp_relay_req), priority=1    , match=(inport == "lrp1" 
>> && ip4.src == {0.0.0.0, 192.168.1.0/24} && ip4.dst == 255.255.255.255 && 
>> udp.src == 68 && udp.dst == 67 && reg9[[7]] == 0), action=(drop; /* 
>> DHCP_RELAY_REQ */)
>>   table=??(lr_in_dhcp_relay_resp_chk), priority=100  , match=(ip4.src == 
>> 172.16.1.1 && ip4.dst == 192.168.1.1 && udp.src == 67 && udp.dst == 67), 
>> action=(reg2 = ip4.dst; reg9[[8]] = dhcp_relay_resp_chk(192.168.1.1, 
>> 172.16.1.1); next; /* DHCP_RELAY_RESP */)
>>   table=??(lr_in_dhcp_relay_resp), priority=100  , match=(ip4.src == 
>> 172.16.1.1 && reg2 == 192.168.1.1 && udp.src == 67 && udp.dst == 67 && 
>> reg9[[8]]), action=(ip4.src = 192.168.1.1; udp.dst = 68; outport = "lrp1"; 
>> output; /* DHCP_RELAY_RESP */)
>>   table=??(lr_in_dhcp_relay_resp), priority=1    , match=(ip4.src == 
>> 172.16.1.1 && reg2 == 192.168.1.1 && udp.src == 67 && udp.dst == 67 && 
>> reg9[[8]] == 0), action=(drop; /* DHCP_RELAY_RESP */)
>> -  table=??(ls_in_l2_lkup      ), priority=100  , match=(inport == 
>> "ls0-port1" && eth.src == 02:00:00:00:00:10 && ip4.src == 0.0.0.0 && ip4.dst 
>> == 255.255.255.255 && udp.src == 68 && udp.dst == 67), action=(eth.dst = 
>> 02:00:00:00:00:01; outport = "lrp1-attachment"; next; /* DHCP_RELAY_REQ */)
>> +  table=??(ls_in_l2_lkup      ), priority=100  , match=(inport == 
>> "ls0-port1" && eth.src == 02:00:00:00:00:10 && ip4.src == {0.0.0.0, 
>> 192.168.1.0/24} && ip4.dst == 255.255.255.255 && udp.src == 68 && udp.dst == 
>> 67), action=(eth.dst = 02:00:00:00:00:01; outport = "lrp1-attachment"; next; 
>> /* DHCP_RELAY_REQ */)
>> ])
>> 
>> # Set invalid dhcp_relay_port in ls0
>> @@ -13451,10 +13451,10 @@ ovn-sbctl lflow-list > lflows
>> AT_CAPTURE_FILE([lflows])
>> 
>> AT_CHECK([grep -e "DHCP_RELAY_" lflows | sed 's/table=../table=??/'], [0], 
>> [dnl
>> -  table=??(lr_in_ip_input     ), priority=110  , match=(inport == "lrp1" && 
>> ip4.src == 0.0.0.0 && ip4.dst == 255.255.255.255 && ip.frag == 0 && udp.src 
>> == 68 && udp.dst == 67), action=(reg9[[7]] = dhcp_relay_req_chk(192.168.1.1, 
>> 172.16.1.1);next; /* DHCP_RELAY_REQ */)
>> +  table=??(lr_in_ip_input     ), priority=110  , match=(inport == "lrp1" && 
>> ip4.src == {0.0.0.0, 192.168.1.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.1.1, 172.16.1.1);next; /* DHCP_RELAY_REQ */)
>>   table=??(lr_in_ip_input     ), priority=110  , match=(ip4.src == 
>> 172.16.1.1 && ip4.dst == 192.168.1.1 && ip.frag == 0 && udp.src == 67 && 
>> udp.dst == 67), action=(next; /* DHCP_RELAY_RESP */)
>> -  table=??(lr_in_dhcp_relay_req), priority=100  , match=(inport == "lrp1" 
>> && ip4.src == 0.0.0.0 && ip4.dst == 255.255.255.255 && udp.src == 68 && 
>> udp.dst == 67 && reg9[[7]]), action=(ip4.src = 192.168.1.1; ip4.dst = 
>> 172.16.1.1; udp.src = 67; next; /* DHCP_RELAY_REQ */)
>> -  table=??(lr_in_dhcp_relay_req), priority=1    , match=(inport == "lrp1" 
>> && ip4.src == 0.0.0.0 && ip4.dst == 255.255.255.255 && udp.src == 68 && 
>> udp.dst == 67 && reg9[[7]] == 0), action=(drop; /* DHCP_RELAY_REQ */)
>> +  table=??(lr_in_dhcp_relay_req), priority=100  , match=(inport == "lrp1" 
>> && ip4.src == {0.0.0.0, 192.168.1.0/24} && ip4.dst == 255.255.255.255 && 
>> udp.src == 68 && udp.dst == 67 && reg9[[7]]), action=(ip4.src = 192.168.1.1; 
>> ip4.dst = 172.16.1.1; udp.src = 67; next; /* DHCP_RELAY_REQ */)
>> +  table=??(lr_in_dhcp_relay_req), priority=1    , match=(inport == "lrp1" 
>> && ip4.src == {0.0.0.0, 192.168.1.0/24} && ip4.dst == 255.255.255.255 && 
>> udp.src == 68 && udp.dst == 67 && reg9[[7]] == 0), action=(drop; /* 
>> DHCP_RELAY_REQ */)
>>   table=??(lr_in_dhcp_relay_resp_chk), priority=100  , match=(ip4.src == 
>> 172.16.1.1 && ip4.dst == 192.168.1.1 && udp.src == 67 && udp.dst == 67), 
>> action=(reg2 = ip4.dst; reg9[[8]] = dhcp_relay_resp_chk(192.168.1.1, 
>> 172.16.1.1); next; /* DHCP_RELAY_RESP */)
>>   table=??(lr_in_dhcp_relay_resp), priority=100  , match=(ip4.src == 
>> 172.16.1.1 && reg2 == 192.168.1.1 && udp.src == 67 && udp.dst == 67 && 
>> reg9[[8]]), action=(ip4.src = 192.168.1.1; udp.dst = 68; outport = "lrp1"; 
>> output; /* DHCP_RELAY_RESP */)
>>   table=??(lr_in_dhcp_relay_resp), priority=1    , match=(ip4.src == 
>> 172.16.1.1 && reg2 == 192.168.1.1 && udp.src == 67 && udp.dst == 67 && 
>> reg9[[8]] == 0), action=(drop; /* DHCP_RELAY_RESP */)
>> diff --git a/tests/ovn.at b/tests/ovn.at
>> index 0c3d4199b..ca8f197ec 100644
>> --- a/tests/ovn.at
>> +++ b/tests/ovn.at
>> @@ -41164,8 +41164,12 @@ sid=$src_ip
>> # send packet
>> send_dhcp_packet $src_mac $src_ip $dst_mac $dst_ip 01 01 $yiaddr $giaddr 
>> $sid vif0
>> 
>> +# The default set match ip4.src == {0.0.0.0, lrp_cidr} compiles to
>> +# two OF flows; only the 0.0.0.0 one sees the DISCOVER packet.
>> +# Sort for stable ordering.
>> OVS_WAIT_FOR_OUTPUT([ovs-ofctl dump-flows br-int table=$dhcp_relay_req_table 
>> | grep -v NXST | grep 255.255.255.255 | grep resubmit |
>> -cut -d ' ' -f5-5 | sed "s/,//"], [0], [dnl
>> +cut -d ' ' -f5-5 | sed "s/,//" | sort], [0], [dnl
>> +n_packets=0
>> n_packets=1
>> ])
>> 
>> @@ -41176,7 +41180,8 @@ giaddr=`ip_to_hex 192.168.1.1`
>> send_dhcp_packet $src_mac $src_ip $dst_mac $dst_ip 01 01 $yiaddr $giaddr 
>> $sid vif0
>> 
>> OVS_WAIT_FOR_OUTPUT([ovs-ofctl dump-flows br-int table=$dhcp_relay_req_table 
>> | grep -v NXST | grep 255.255.255.255 | grep drop |
>> -cut -d ' ' -f5-5 | sed "s/,//"], [0], [dnl
>> +cut -d ' ' -f5-5 | sed "s/,//" | sort], [0], [dnl
>> +n_packets=0
>> n_packets=1
>> ])
> 
> The src_ip is 0.0.0.0 in both tests above, it would be good
> to update the test and also send dhcp packets with a
> "lease IP" (an IP in the router subnets).
> 
> I went ahead and changed the test myself as it was relatively
> straightforward and applied the patch to main with the
> following minor incremental change:

Thanks Dumitru!

> 
> diff --git a/tests/ovn.at b/tests/ovn.at
> index 73332c74af..37e57c72e9 100644
> --- a/tests/ovn.at
> +++ b/tests/ovn.at
> @@ -41210,26 +41210,25 @@ wait_for_ports_up
> AT_CHECK([ovn-nbctl --wait=hv sync])
> 
> send_dhcp_packet() {
> -    src_mac=${1}
> -    src_ip=${2}
> -    dst_mac=${3}
> -    dst_ip=${4}
> -    op_code=${5}
> -    msg_type=${6}
> -    yiaddr=$7
> -    giaddr=${8}
> -    sid=${9}
> -    iface=${10}
> -    #echo "ARGS: ${1} ${2} ${3} ${4} ${5} ${6} ${7} ${8} ${9} ${10}"
> +    local src_mac=${1}
> +    local src_ip=${2}
> +    local dst_mac=${3}
> +    local dst_ip=${4}
> +    local op_code=${5}
> +    local msg_type=${6}
> +    local yiaddr=$7
> +    local giaddr=${8}
> +    local sid=${9}
> +    local iface=${10}
>     echo "ARGS: $@"
>     if [[ $op_code == "01" ]]; then
> -        ip_len=0111
> -        udp_len=00fd
> -        src_port=0044
> +        local ip_len=0111
> +        local udp_len=00fd
> +        local src_port=0044
>     else
> -        ip_len=011d
> -        udp_len=0109
> -        src_port=0043
> +        local ip_len=011d
> +        local udp_len=0109
> +        local src_port=0043
>     fi
>     flags=0000
> 
> @@ -41277,20 +41276,23 @@ dhcp_relay_resp_table=$(ovn-debug 
> lflow-stage-to-oftable lr_in_dhcp_relay_resp)
> # Send DHCP valid discovery
> src_mac="505400000010"
> src_ip=`ip_to_hex 0.0.0.0`
> +src_ip2=`ip_to_hex 192.168.1.2`
> dst_mac="ffffffffffff"
> dst_ip=`ip_to_hex 255.255.255.255`
> yiaddr=`ip_to_hex 0.0.0.0`
> giaddr=`ip_to_hex 0.0.0.0`
> sid=$src_ip
> +
> # send packet
> send_dhcp_packet $src_mac $src_ip $dst_mac $dst_ip 01 01 $yiaddr $giaddr $sid 
> vif0
> +send_dhcp_packet $src_mac $src_ip2 $dst_mac $dst_ip 01 01 $yiaddr $giaddr 
> $sid vif0
> 
> # The default set match ip4.src == {0.0.0.0, lrp_cidr} compiles to
> # two OF flows; only the 0.0.0.0 one sees the DISCOVER packet.
> # Sort for stable ordering.
> OVS_WAIT_FOR_OUTPUT([ovs-ofctl dump-flows br-int table=$dhcp_relay_req_table 
> | grep -v NXST | grep 255.255.255.255 | grep resubmit |
> -cut -d ' ' -f5-5 | sed "s/,//" | sort], [0], [dnl
> -n_packets=0
> +cut -d ' ' -f5-5 | sed "s/,//"], [0], [dnl
> +n_packets=1
> n_packets=1
> ])
> 
> @@ -41299,10 +41301,11 @@ n_packets=1
> giaddr=`ip_to_hex 192.168.1.1`
> # send packet
> send_dhcp_packet $src_mac $src_ip $dst_mac $dst_ip 01 01 $yiaddr $giaddr $sid 
> vif0
> +send_dhcp_packet $src_mac $src_ip2 $dst_mac $dst_ip 01 01 $yiaddr $giaddr 
> $sid vif0
> 
> OVS_WAIT_FOR_OUTPUT([ovs-ofctl dump-flows br-int table=$dhcp_relay_req_table 
> | grep -v NXST | grep 255.255.255.255 | grep drop |
> -cut -d ' ' -f5-5 | sed "s/,//" | sort], [0], [dnl
> -n_packets=0
> +cut -d ' ' -f5-5 | sed "s/,//"], [0], [dnl
> +n_packets=1
> n_packets=1
> ])
> 
> ---
> 
> Regards,
> Dumitru


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

Reply via email to