[ovs-dev] [PATCH] pinctrl: Check requested IP in DHCPREQUEST messages

Numan Siddique nusiddiq at redhat.com
Mon Nov 19 13:06:48 UTC 2018


On Fri, Nov 16, 2018 at 11:03 PM Gregory Smith <gasmith at nutanix.com> wrote:

> See RFC 2131, section 4.3.2. When handling a DHCPREQUEST message, the
> server should validate that the client's requested IP matches the
> offered IP. If not, the server should reply with a DHCPNAK. The client's
> requested IP is either specified as the Requested IP Address (option
> 50), or as the ciaddr, depending on the client's state.
>
> Signed-off-by: Gregory Smith <gasmith at nutanix.com>
>

When we added the native DHCP support in OVN, we primarily had OpenStack in
mind
and wanted to get rid of neutron dhcp agent service. In the case of
OpenStack, when a port
is created, the IP address is assigned to it by the Neutron IPAM. This IP
address will most likely
will remain the same for the port. So we added a simple native DHCP
implementation.

I want to understand the use case for this requirement. Can you please give
more details.
Does a CMS update the address of a logical port at a later point of time ?

Thanks
Numan



> ---
>  lib/dhcp.h               |   3 +
>  ovn/controller/pinctrl.c |  79 +++++++++++++++++---
>  tests/ovn.at             | 188
> +++++++++++++++++++++++++++++++++++++----------
>  3 files changed, 220 insertions(+), 50 deletions(-)
>
> diff --git a/lib/dhcp.h b/lib/dhcp.h
> index 271e0a5..73f593a 100644
> --- a/lib/dhcp.h
> +++ b/lib/dhcp.h
> @@ -54,7 +54,10 @@ BUILD_ASSERT_DECL(DHCP_HEADER_LEN == sizeof(struct
> dhcp_header));
>  #define DHCP_MSG_OFFER     2
>  #define DHCP_MSG_REQUEST   3
>  #define DHCP_MSG_ACK       5
> +#define DHCP_MSG_NAK       6
>
> +#define DHCP_OPT_PAD       0
> +#define DHCP_OPT_REQ_IP    50
>  #define DHCP_OPT_MSG_TYPE  53
>  #define DHCP_OPT_END       255
>
> diff --git a/ovn/controller/pinctrl.c b/ovn/controller/pinctrl.c
> index 56539a8..2c1a380 100644
> --- a/ovn/controller/pinctrl.c
> +++ b/ovn/controller/pinctrl.c
> @@ -608,8 +608,11 @@ pinctrl_handle_put_dhcp_opts(
>       *| UDP HEADER  | DHCP HEADER  | 4 Byte DHCP Cookie | DHCP
> OPTIONS(var len)|
>       *
> ------------------------------------------------------------------------
>       */
> -    if (dp_packet_l4_size(pkt_in) < (UDP_HEADER_LEN +
> -        sizeof (struct dhcp_header) + sizeof(uint32_t) + 3)) {
> +
> +    size_t pkt_in_l4_size = dp_packet_l4_size(pkt_in);
> +    size_t req_l4_size = (UDP_HEADER_LEN +
> +                          sizeof (struct dhcp_header) + sizeof(uint32_t)
> + 3);
> +    if (pkt_in_l4_size < req_l4_size) {
>          static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
>          VLOG_WARN_RL(&rl, "Invalid or incomplete DHCP packet received");
>          goto exit;
> @@ -655,12 +658,58 @@ pinctrl_handle_put_dhcp_opts(
>      if (in_dhcp_opt[2] == DHCP_MSG_DISCOVER) {
>          msg_type = DHCP_MSG_OFFER;
>      } else {
> +        /* This is a DHCPREQUEST. If the client has requested an IP that
> +         * does not match the offered IP address, reply with a NAK. The
> +         * requested IP address may be supplied either via Requested IP
> Address
> +         * (opt 50) or via ciaddr, depending on the client's state.
> +         */
> +        ovs_be32 *request_ip = NULL;
> +        in_dhcp_opt += 3;
> +        while (!request_ip) {
> +            req_l4_size += 1;
> +            if (pkt_in_l4_size < req_l4_size ||
> +                in_dhcp_opt[0] == DHCP_OPT_END) {
> +                break;
> +            }
> +            if (in_dhcp_opt[0] == DHCP_OPT_PAD) {
> +                in_dhcp_opt += 1;
> +                continue;
> +            }
> +            req_l4_size += 1;
> +            if (pkt_in_l4_size < req_l4_size) {
> +                break;
> +            }
> +            req_l4_size += in_dhcp_opt[1];
> +            if (pkt_in_l4_size < req_l4_size) {
> +                break;
> +            }
> +            if (in_dhcp_opt[0] == DHCP_OPT_REQ_IP && in_dhcp_opt[1] == 4)
> {
> +                request_ip = (ovs_be32 *)&in_dhcp_opt[2];
> +            }
> +            in_dhcp_opt += 2 + in_dhcp_opt[1];
> +        }
>          msg_type = DHCP_MSG_ACK;
> +        if (request_ip) {
> +            if (*request_ip != *offer_ip) {
> +                static struct vlog_rate_limit rl =
> VLOG_RATE_LIMIT_INIT(1, 5);
> +                VLOG_WARN_RL(&rl, "DHCPREQUEST requested IP "IP_FMT" does
> not "
> +                             "match offer "IP_FMT, IP_ARGS(*request_ip),
> +                             IP_ARGS(*offer_ip));
> +                msg_type = DHCP_MSG_NAK;
> +            }
> +        } else if (in_dhcp_data->ciaddr != *offer_ip) {
> +            static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
> +            VLOG_WARN_RL(&rl, "DHCPREQUEST ciaddr "IP_FMT" does not match
> "
> +                         "offer "IP_FMT, IP_ARGS(in_dhcp_data->ciaddr),
> +                         IP_ARGS(*offer_ip));
> +            msg_type = DHCP_MSG_NAK;
> +        }
>      }
>
>      /* Frame the DHCP reply packet
>       * Total DHCP options length will be options stored in the userdata +
> -     * 16 bytes.
> +     * 16 bytes. Note that the DHCP options stored in userdata are not
> included
> +     * in DHCPNAK messages.
>       *
>       * --------------------------------------------------------------
>       *| 4 Bytes (dhcp cookie) | 3 Bytes (option type) | DHCP options |
> @@ -668,8 +717,10 @@ pinctrl_handle_put_dhcp_opts(
>       *| 4 Bytes padding | 1 Byte (option end 0xFF ) | 4 Bytes padding|
>       * --------------------------------------------------------------
>       */
> -    uint16_t new_l4_size = UDP_HEADER_LEN + DHCP_HEADER_LEN + \
> -                           userdata->size + 16;
> +    uint16_t new_l4_size = UDP_HEADER_LEN + DHCP_HEADER_LEN + 16;
> +    if (msg_type != DHCP_MSG_NAK) {
> +        new_l4_size += userdata->size;
> +    }
>      size_t new_packet_size = pkt_in->l4_ofs + new_l4_size;
>
>      struct dp_packet pkt_out;
> @@ -693,19 +744,26 @@ pinctrl_handle_put_dhcp_opts(
>      struct dhcp_header *dhcp_data = dp_packet_put(
>          &pkt_out, dp_packet_pull(pkt_in, DHCP_HEADER_LEN),
> DHCP_HEADER_LEN);
>      dhcp_data->op = DHCP_OP_REPLY;
> -    dhcp_data->yiaddr = *offer_ip;
> +    dhcp_data->yiaddr = (msg_type == DHCP_MSG_NAK) ? 0 : *offer_ip;
>      dp_packet_put(&pkt_out, &magic_cookie, sizeof(ovs_be32));
>
> +    uint16_t out_dhcp_opts_size = 12;
> +    if (msg_type != DHCP_MSG_NAK) {
> +      out_dhcp_opts_size += userdata->size;
> +    }
>      uint8_t *out_dhcp_opts = dp_packet_put_zeros(&pkt_out,
> -                                                 userdata->size + 12);
> +                                                 out_dhcp_opts_size);
>      /* DHCP option - type */
>      out_dhcp_opts[0] = DHCP_OPT_MSG_TYPE;
>      out_dhcp_opts[1] = 1;
>      out_dhcp_opts[2] = msg_type;
>      out_dhcp_opts += 3;
>
> -    memcpy(out_dhcp_opts, userdata->data, userdata->size);
> -    out_dhcp_opts += userdata->size;
> +    if (msg_type != DHCP_MSG_NAK) {
> +      memcpy(out_dhcp_opts, userdata->data, userdata->size);
> +      out_dhcp_opts += userdata->size;
> +    }
> +
>      /* Padding */
>      out_dhcp_opts += 4;
>      /* End */
> @@ -727,7 +785,8 @@ pinctrl_handle_put_dhcp_opts(
>      static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(20, 40);
>      const struct eth_header *l2 = dp_packet_eth(&pkt_out);
>      VLOG_INFO_RL(&rl, "DHCP%s "ETH_ADDR_FMT" "IP_FMT"",
> -                 msg_type == DHCP_MSG_OFFER ? "OFFER" : "ACK",
> +                 msg_type == DHCP_MSG_OFFER ? "OFFER" :
> +                   (msg_type == DHCP_MSG_ACK ? "ACK": "NAK"),
>                   ETH_ADDR_ARGS(l2->eth_src), IP_ARGS(*offer_ip));
>
>      success = 1;
> diff --git a/tests/ovn.at b/tests/ovn.at
> index ab32faa..d04f9bc 100644
> --- a/tests/ovn.at
> +++ b/tests/ovn.at
> @@ -4234,10 +4234,10 @@ sleep 2
>  as hv1 ovs-vsctl show
>
>  # This shell function sends a DHCP request packet
> -# test_dhcp INPORT SRC_MAC DHCP_TYPE OFFER_IP ...
> +# test_dhcp INPORT SRC_MAC DHCP_TYPE OFFER_IP REQUEST_IP ...
>  test_dhcp() {
> -    local inport=$1 src_mac=$2 dhcp_type=$3 offer_ip=$4 use_ip=$5
> -    shift; shift; shift; shift; shift;
> +    local inport=$1 src_mac=$2 dhcp_type=$3 ciaddr=$4 offer_ip=$5
> request_ip=$6 use_ip=$7
> +    shift; shift; shift; shift; shift; shift; shift;
>      if test $use_ip != 0; then
>          src_ip=$1
>          dst_ip=$2
> @@ -4246,10 +4246,17 @@ test_dhcp() {
>          src_ip=`ip_to_hex 0 0 0 0`
>          dst_ip=`ip_to_hex 255 255 255 255`
>      fi
> -    local
> request=ffffffffffff${src_mac}0800451001100000000080110000${src_ip}${dst_ip}
> +    if test $request_ip != 0; then
> +        ip_len=0120
> +        udp_len=010b
> +    else
> +        ip_len=011a
> +        udp_len=0106
> +    fi
> +    local
> request=ffffffffffff${src_mac}08004510${ip_len}0000000080110000${src_ip}${dst_ip}
>      # udp header and dhcp header
> -    request=${request}0044004300fc0000
> -
> request=${request}010106006359aa760000000000000000000000000000000000000000${src_mac}
> +    request=${request}00440043${udp_len}0000
> +
> request=${request}010106006359aa7600000000${ciaddr}000000000000000000000000${src_mac}
>      # client hardware padding
>      request=${request}00000000000000000000
>      # server hostname
> @@ -4263,13 +4270,23 @@ test_dhcp() {
>      # dhcp magic cookie
>      request=${request}63825363
>      # dhcp message type
> -    request=${request}3501${dhcp_type}ff
> +    request=${request}3501${dhcp_type}
> +    # dhcp unknown option
> +    request=${request}d70701020304050607
> +    # dhcp pad option
> +    request=${request}00
> +    if test $request_ip != 0; then
> +        # dhcp requested ip
> +        request=${request}3204${request_ip}
> +    fi
> +    # dhcp end option
> +    request=${request}ff
>
>      for port in $inport "$@"; do
>          : >> $port.expected
>      done
>      if test $offer_ip != 0; then
> -        local srv_mac=$1 srv_ip=$2 expected_dhcp_opts=$3
> +        local srv_mac=$1 srv_ip=$2 dhcp_reply_type=$3
> expected_dhcp_opts=$4
>          # total IP length will be the IP length of the request packet
>          # (which is 272 in our case) + 8 (padding bytes) +
> (expected_dhcp_opts / 2)
>          ip_len=`expr 280 + ${#expected_dhcp_opts} / 2`
> @@ -4280,9 +4297,13 @@ test_dhcp() {
>          local
> reply=${src_mac}${srv_mac}080045100${ip_len}000000008011XXXX${srv_ip}${offer_ip}
>          # udp header and dhcp header.
>          # $udp_len var will be in 3 digits. So adding a '0' before
> $udp_len
> -
> reply=${reply}004300440${udp_len}0000020106006359aa760000000000000000
> -        # your ip address
> -        reply=${reply}${offer_ip}
> +
> reply=${reply}004300440${udp_len}0000020106006359aa7600000000${ciaddr}
> +        # your ip address; 0 for NAK
> +        if test $dhcp_reply_type = 06; then
> +            reply=${reply}00000000
> +        else
> +            reply=${reply}${offer_ip}
> +        fi
>          # next server ip address, relay agent ip address, client mac
> address
>          reply=${reply}0000000000000000${src_mac}
>          # client hardware padding
> @@ -4297,11 +4318,6 @@ test_dhcp() {
>
>  reply=${reply}0000000000000000000000000000000000000000000000000000000000000000
>          # dhcp magic cookie
>          reply=${reply}63825363
> -        # dhcp message type
> -        local dhcp_reply_type=02
> -        if test $dhcp_type = 03; then
> -            dhcp_reply_type=05
> -        fi
>
>  reply=${reply}3501${dhcp_reply_type}${expected_dhcp_opts}00000000ff00000000
>          echo $reply >> $inport.expected
>      else
> @@ -4349,8 +4365,10 @@ as hv1 ovs-ofctl dump-flows br-int
>  # Send DHCPDISCOVER.
>  offer_ip=`ip_to_hex 10 0 0 4`
>  server_ip=`ip_to_hex 10 0 0 1`
> +ciaddr=`ip_to_hex 0 0 0 0`
> +request_ip=0
>  expected_dhcp_opts=330400000e100104ffffff0003040a00000136040a000001
> -test_dhcp 1 f00000000001 01 $offer_ip 0 ff1000000001 $server_ip
> $expected_dhcp_opts
> +test_dhcp 1 f00000000001 01 $ciaddr $offer_ip $request_ip 0 ff1000000001
> $server_ip 02 $expected_dhcp_opts
>
>  # NXT_RESUMEs should be 1.
>  OVS_WAIT_UNTIL([test 1 = `cat ofctl_monitor*.log | grep -c NXT_RESUME`])
> @@ -4369,11 +4387,14 @@ reset_pcap_file hv1-vif2 hv1/vif2
>  rm -f 1.expected
>  rm -f 2.expected
>
> -# Send DHCPREQUEST.
> +# Send DHCPREQUEST in the SELECTING/INIT-REBOOT state with the offered IP
> +# address in the Requested IP Address option.
>  offer_ip=`ip_to_hex 10 0 0 6`
>  server_ip=`ip_to_hex 10 0 0 1`
> +ciaddr=`ip_to_hex 0 0 0 0`
> +request_ip=$offer_ip
>  expected_dhcp_opts=330400000e100104ffffff0003040a00000136040a000001
> -test_dhcp 2 f00000000002 03 $offer_ip 0 ff1000000001 $server_ip
> $expected_dhcp_opts
> +test_dhcp 2 f00000000002 03 $ciaddr $offer_ip $request_ip 0 ff1000000001
> $server_ip 05 $expected_dhcp_opts
>
>  # NXT_RESUMEs should be 2.
>  OVS_WAIT_UNTIL([test 2 = `cat ofctl_monitor*.log | grep -c NXT_RESUME`])
> @@ -4390,15 +4411,41 @@ reset_pcap_file hv1-vif2 hv1/vif2
>  rm -f 1.expected
>  rm -f 2.expected
>
> +# Send DHCPREQUEST in the SELECTING/INIT-REBOOT state with a mismatched
> IP in
> +# the Requested IP Address option, expect a DHCPNAK.
> +offer_ip=`ip_to_hex 10 0 0 6`
> +server_ip=`ip_to_hex 10 0 0 1`
> +ciaddr=`ip_to_hex 0 0 0 0`
> +request_ip=`ip_to_hex 10 0 0 7`
> +expected_dhcp_opts=""
> +test_dhcp 2 f00000000002 03 $ciaddr $offer_ip $request_ip 0 ff1000000001
> $server_ip 06 $expected_dhcp_opts
> +
> +# NXT_RESUMEs should be 3.
> +OVS_WAIT_UNTIL([test 3 = `cat ofctl_monitor*.log | grep -c NXT_RESUME`])
> +
> +$PYTHON "$top_srcdir/utilities/ovs-pcap.in" hv1/vif2-tx.pcap > 2.packets
> +cat 2.expected | cut -c -48 > expout
> +AT_CHECK([cat 2.packets | cut -c -48], [0], [expout])
> +# Skipping the IPv4 checksum.
> +cat 2.expected | cut -c 53- > expout
> +AT_CHECK([cat 2.packets | cut -c 53-], [0], [expout])
> +
> +reset_pcap_file hv1-vif1 hv1/vif1
> +reset_pcap_file hv1-vif2 hv1/vif2
> +rm -f 1.expected
> +rm -f 2.expected
> +
>  # Send Invalid DHCPv4 packet on ls1-lp2. It should be received by
> ovn-controller
>  # but should be resumed without the reply.
>  # ls1-lp1 (vif1-tx.pcap) should receive the DHCPv4 request packet twice,
>  # one from ovn-controller and the other from "ovs-ofctl resume."
> +ciaddr=`ip_to_hex 0 0 0 0`
>  offer_ip=0
> -test_dhcp 2 f00000000002 08 $offer_ip 0 1 1
> +request_ip=0
> +test_dhcp 2 f00000000002 08 $ciaddr $offer_ip $request_ip 0 1 1
>
> -# NXT_RESUMEs should be 3.
> -OVS_WAIT_UNTIL([test 3 = `cat ofctl_monitor*.log | grep -c NXT_RESUME`])
> +# NXT_RESUMEs should be 4.
> +OVS_WAIT_UNTIL([test 4 = `cat ofctl_monitor*.log | grep -c NXT_RESUME`])
>
>  # vif1-tx.pcap should have received the DHCPv4 (invalid) request packet
>  OVN_CHECK_PACKETS([hv1/vif1-tx.pcap], [1.expected])
> @@ -4411,28 +4458,33 @@ rm -f 2.expected
>  # Send DHCPv4 packet on ls2-lp1. It doesn't have any DHCPv4 options
> defined.
>  # ls2-lp2 (vif4-tx.pcap) should receive the DHCPv4 request packet once.
>
> -test_dhcp 3 f00000000003 01 0 4 0
> +ciaddr=`ip_to_hex 0 0 0 0`
> +test_dhcp 3 f00000000003 01 $ciaddr 0 0 4 0
>
>  # Send DHCPv4 packet on ls2-lp2. "router" DHCPv4 option is not defined for
>  # this lport.
> -test_dhcp 4 f00000000004 01 0 3 0
> +ciaddr=`ip_to_hex 0 0 0 0`
> +test_dhcp 4 f00000000004 01 $ciaddr 0 0 3 0
>
> -# NXT_RESUMEs should be 3.
> -OVS_WAIT_UNTIL([test 3 = `cat ofctl_monitor*.log | grep -c NXT_RESUME`])
> +# NXT_RESUMEs should be 4.
> +OVS_WAIT_UNTIL([test 4 = `cat ofctl_monitor*.log | grep -c NXT_RESUME`])
>
> -OVN_CHECK_PACKETS([hv1/vif3-tx.pcap], [3.expected])
> -OVN_CHECK_PACKETS([hv1/vif4-tx.pcap], [4.expected])
> +#OVN_CHECK_PACKETS([hv1/vif3-tx.pcap], [3.expected])
> +#OVN_CHECK_PACKETS([hv1/vif4-tx.pcap], [4.expected])
>
> -# Send DHCPREQUEST with ip4.src set to 10.0.0.6 and ip4.dst set to
> 10.0.0.1.
> +# Send DHCPREQUEST in the RENEWING/REBINDING state with ip4.src set to
> 10.0.0.6
> +# and ip4.dst set to 10.0.0.1.
>  offer_ip=`ip_to_hex 10 0 0 6`
>  server_ip=`ip_to_hex 10 0 0 1`
> -expected_dhcp_opts=330400000e100104ffffff0003040a00000136040a000001
> +ciaddr=$offer_ip
> +request_ip=0
>  src_ip=$offer_ip
>  dst_ip=$server_ip
> -test_dhcp 2 f00000000002 03 $offer_ip 1 $src_ip $dst_ip ff1000000001
> $server_ip $expected_dhcp_opts
> +expected_dhcp_opts=330400000e100104ffffff0003040a00000136040a000001
> +test_dhcp 2 f00000000002 03 $ciaddr $offer_ip $request_ip 1 $src_ip
> $dst_ip ff1000000001 $server_ip 05 $expected_dhcp_opts
>
> -# NXT_RESUMEs should be 4.
> -OVS_WAIT_UNTIL([test 4 = `cat ofctl_monitor*.log | grep -c NXT_RESUME`])
> +# NXT_RESUMEs should be 5.
> +OVS_WAIT_UNTIL([test 5 = `cat ofctl_monitor*.log | grep -c NXT_RESUME`])
>
>  $PYTHON "$top_srcdir/utilities/ovs-pcap.in" hv1/vif2-tx.pcap > 2.packets
>  cat 2.expected | cut -c -48 > expout
> @@ -4446,16 +4498,71 @@ reset_pcap_file hv1-vif2 hv1/vif2
>  rm -f 1.expected
>  rm -f 2.expected
>
> -# Send DHCPREQUEST with ip4.src set to 10.0.0.6 and ip4.dst set to
> 255.255.255.255.
> +# Send DHCPREQUEST in the RENEWING/REBINDING state with ip4.src set to
> 10.0.0.6
> +# and ip4.dst set to 255.255.255.255.
>  offer_ip=`ip_to_hex 10 0 0 6`
>  server_ip=`ip_to_hex 10 0 0 1`
> +ciaddr=$offer_ip
> +request_ip=0
> +src_ip=$offer_ip
> +dst_ip=`ip_to_hex 255 255 255 255`
>  expected_dhcp_opts=330400000e100104ffffff0003040a00000136040a000001
> +test_dhcp 2 f00000000002 03 $ciaddr $offer_ip $request_ip 1 $src_ip
> $dst_ip ff1000000001 $server_ip 05 $expected_dhcp_opts
> +
> +# NXT_RESUMEs should be 6.
> +OVS_WAIT_UNTIL([test 6 = `cat ofctl_monitor*.log | grep -c NXT_RESUME`])
> +
> +$PYTHON "$top_srcdir/utilities/ovs-pcap.in" hv1/vif2-tx.pcap > 2.packets
> +cat 2.expected | cut -c -48 > expout
> +AT_CHECK([cat 2.packets | cut -c -48], [0], [expout])
> +# Skipping the IPv4 checksum.
> +cat 2.expected | cut -c 53- > expout
> +AT_CHECK([cat 2.packets | cut -c 53-], [0], [expout])
> +
> +reset_pcap_file hv1-vif1 hv1/vif1
> +reset_pcap_file hv1-vif2 hv1/vif2
> +rm -f 1.expected
> +rm -f 2.expected
> +
> +# Send DHCPREQUEST in the RENEWING/REBINDING state with a mismatched IP
> in the
> +# ciaddr, expect a DHCPNAK.
> +offer_ip=`ip_to_hex 10 0 0 6`
> +server_ip=`ip_to_hex 10 0 0 1`
> +ciaddr=`ip_to_hex 10 0 0 7`
> +request_ip=0
>  src_ip=$offer_ip
>  dst_ip=`ip_to_hex 255 255 255 255`
> -test_dhcp 2 f00000000002 03 $offer_ip 1 $src_ip $dst_ip ff1000000001
> $server_ip $expected_dhcp_opts
> +expected_dhcp_opts=""
> +test_dhcp 2 f00000000002 03 $ciaddr $offer_ip $request_ip 1 $src_ip
> $dst_ip ff1000000001 $server_ip 06 $expected_dhcp_opts
>
> -# NXT_RESUMEs should be 5.
> -OVS_WAIT_UNTIL([test 5 = `cat ofctl_monitor*.log | grep -c NXT_RESUME`])
> +# NXT_RESUMEs should be 7.
> +OVS_WAIT_UNTIL([test 7 = `cat ofctl_monitor*.log | grep -c NXT_RESUME`])
> +
> +$PYTHON "$top_srcdir/utilities/ovs-pcap.in" hv1/vif2-tx.pcap > 2.packets
> +cat 2.expected | cut -c -48 > expout
> +AT_CHECK([cat 2.packets | cut -c -48], [0], [expout])
> +# Skipping the IPv4 checksum.
> +cat 2.expected | cut -c 53- > expout
> +AT_CHECK([cat 2.packets | cut -c 53-], [0], [expout])
> +
> +reset_pcap_file hv1-vif1 hv1/vif1
> +reset_pcap_file hv1-vif2 hv1/vif2
> +rm -f 1.expected
> +rm -f 2.expected
> +
> +# Send DHCPREQUEST in the RENEWING/REBINDING state without a specifyied
> ciaddr,
> +# expect a DHCPNAK.
> +offer_ip=`ip_to_hex 10 0 0 6`
> +server_ip=`ip_to_hex 10 0 0 1`
> +ciaddr=`ip_to_hex 0 0 0 0`
> +request_ip=0
> +src_ip=$offer_ip
> +dst_ip=`ip_to_hex 255 255 255 255`
> +expected_dhcp_opts=""
> +test_dhcp 2 f00000000002 03 $ciaddr $offer_ip $request_ip 1 $src_ip
> $dst_ip ff1000000001 $server_ip 06 $expected_dhcp_opts
> +
> +# NXT_RESUMEs should be 8.
> +OVS_WAIT_UNTIL([test 8 = `cat ofctl_monitor*.log | grep -c NXT_RESUME`])
>
>  $PYTHON "$top_srcdir/utilities/ovs-pcap.in" hv1/vif2-tx.pcap > 2.packets
>  cat 2.expected | cut -c -48 > expout
> @@ -4471,12 +4578,13 @@ rm -f 2.expected
>
>  # Send DHCPREQUEST with ip4.src set to 10.0.0.6 and ip4.dst set to
> 10.0.0.4.
>  # The packet should not be received by ovn-controller.
> +ciaddr=`ip_to_hex 0 0 0 0`
>  src_ip=`ip_to_hex 10 0 0 6`
>  dst_ip=`ip_to_hex 10 0 0 4`
> -test_dhcp 2 f00000000002 03 0 1 $src_ip $dst_ip 1
> +test_dhcp 2 f00000000002 03 $ciaddr 0 0 1 $src_ip $dst_ip 1
>
> -# NXT_RESUMEs should be 5.
> -OVS_WAIT_UNTIL([test 5 = `cat ofctl_monitor*.log | grep -c NXT_RESUME`])
> +# NXT_RESUMEs should be 8.
> +OVS_WAIT_UNTIL([test 8 = `cat ofctl_monitor*.log | grep -c NXT_RESUME`])
>
>  # vif1-tx.pcap should have received the DHCPv4 request packet
>  OVN_CHECK_PACKETS([hv1/vif1-tx.pcap], [1.expected])
> --
> 2.7.4
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>


More information about the dev mailing list