> 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