text: //*****************************************************************************
  //
  //! \file dhcp.h
  //! \brief DHCP APIs Header file.
  //! \details Processig DHCP protocol as DISCOVER, OFFER, REQUEST, ACK, NACK and
  //! DECLINE. \version 1.1.1 \date 2019/10/08 \par  Revision history
  //!       <2019/10/08> compare DHCP server ip address
  //!       <2013/11/18> 1st Release
  //!       <2012/12/20> V1.1.0
  //!         1. Move unreferenced DEFINE to dhcp.c
  //!       <2012/12/26> V1.1.1
  //! \author Eric Jung & MidnightCow
  //! \copyright
  //!
  //! Copyright (c)  2013, WIZnet Co., LTD.
  //! All rights reserved.
  //!
  //! Redistribution and use in source and binary forms, with or without
  //! modification, are permitted provided that the following conditions
  //! are met:
  //!
  //!     * Redistributions of source code must retain the above copyright
  //! notice, this list of conditions and the following disclaimer.
  //!     * Redistributions in binary form must reproduce the above copyright
  //! notice, this list of conditions and the following disclaimer in the
  //! documentation and/or other materials provided with the distribution.
  //!     * Neither the name of the <ORGANIZATION> nor the names of its
  //! contributors may be used to endorse or promote products derived
  //! from this software without specific prior written permission.
  //!
  //! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  //! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  //! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  //! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  //! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  //! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  //! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  //! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  //! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  //! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
  //! THE POSSIBILITY OF SUCH DAMAGE.
  //
  //*****************************************************************************
  #ifndef _DHCP_H_
  #define _DHCP_H_
  
  #ifdef __cplusplus
  extern "C" {
  #endif
  
  /*
   * @brief
   * @details If you want to display debug & processing message, Define
   * _DHCP_DEBUG_
   * @note    If defined, it depends on <stdio.h>
   */
  // #define _DHCP_DEBUG_
  
  /* Retry to processing DHCP */
  #define MAX_DHCP_RETRY 2   ///< Maximum retry count
  #define DHCP_WAIT_TIME 10  ///< Wait Time 10s
  
  #define OPT_SIZE 312                   /// Max OPT size of @ref RIP_MSG
  #define RIP_MSG_SIZE (236 + OPT_SIZE)  /// Max size of @ref RIP_MSG
  /*
   * @brief DHCP message format
   */
  typedef struct {
    uint8_t op;      ///< @ref DHCP_BOOTREQUEST or @ref DHCP_BOOTREPLY
    uint8_t htype;   ///< @ref DHCP_HTYPE10MB or @ref DHCP_HTYPE100MB
    uint8_t hlen;    ///< @ref DHCP_HLENETHERNET
    uint8_t hops;    ///< @ref DHCP_HOPS
    uint32_t xid;    ///< @ref DHCP_XID  This increase one every DHCP transaction.
    uint16_t secs;   ///< @ref DHCP_SECS
    uint16_t flags;  ///< @ref DHCP_FLAGSBROADCAST or @ref DHCP_FLAGSUNICAST
    uint8_t ciaddr[4];  ///< @ref Request IP to DHCP sever
    uint8_t yiaddr[4];  ///< @ref Offered IP from DHCP server
    uint8_t siaddr[4];  ///< No use
    uint8_t giaddr[4];  ///< No use
    uint8_t
        chaddr[16];  ///< DHCP client 6bytes MAC address. Others is filled to zero
    uint8_t sname[64];      ///< No use
    uint8_t file[128];      ///< No use
    uint8_t OPT[OPT_SIZE];  ///< Option
  } RIP_MSG;
  
  /* UDP port numbers for DHCP */
  #define DHCP_SERVER_PORT 67  ///< DHCP server port number
  #define DHCP_CLIENT_PORT 68  ///< DHCP client port number
  
  #define MAGIC_COOKIE 0x63825363  ///< You should not modify it number.
  
  #define DCHP_HOST_NAME "WIZnet\0"
  
  /*
   * @brief return value of @ref DHCP_run()
   */
  enum {
    DHCP_FAILED = 0,  ///< Processing Fail
    DHCP_RUNNING,     ///< Processing DHCP protocol
    DHCP_IP_ASSIGN,   ///< First Occupy IP from DHPC server      (if cbfunc ==
                      ///< null, act as default default_ip_assign)
    DHCP_IP_CHANGED,  ///< Change IP address by new ip from DHCP (if cbfunc ==
                      ///< null, act as default default_ip_update)
    DHCP_IP_LEASED,   ///< Stand by
    DHCP_STOPPED      ///< Stop processing DHCP protocol
  };
  
  /*
   * @brief DHCP client initialization (outside of the main loop)
   * @param s   - socket number
   * @param buf - buffer for processing DHCP message
   */
  void DHCP_init(uint8_t s, uint8_t* buf);
  
  /*
   * @brief DHCP 1s Tick Timer handler
   * @note SHOULD BE register to your system 1s Tick timer handler
   */
  void DHCP_time_handler(void);
  
  /*
   * @brief Register call back function
   * @param ip_assign   - callback func when IP is assigned from DHCP server first
   * @param ip_update   - callback func when IP is changed
   * @param ip_conflict - callback func when the assigned IP is conflict with
   * others.
   */
  void reg_dhcp_cbfunc(void (*ip_assign)(void), void (*ip_update)(void),
                       void (*ip_conflict)(void));
  
  /*
   * @brief DHCP client in the main loop
   * @return    The value is as the follow \n
   *            @ref DHCP_FAILED     \n
   *            @ref DHCP_RUNNING    \n
   *            @ref DHCP_IP_ASSIGN  \n
   *            @ref DHCP_IP_CHANGED \n
   * 			  @ref DHCP_IP_LEASED  \n
   *            @ref DHCP_STOPPED    \n
   *
   * @note This function is always called by you main task.
   */
  uint8_t DHCP_run(void);
  
  /*
   * @brief Stop DHCP processing
   * @note If you want to restart. call DHCP_init() and DHCP_run()
   */
  void DHCP_stop(void);
  
  /* Get Network information assigned from DHCP server */
  /*
   * @brief Get IP address
   * @param ip  - IP address to be returned
   */
  void getIPfromDHCP(uint8_t* ip);
  /*
   * @brief Get Gateway address
   * @param ip  - Gateway address to be returned
   */
  void getGWfromDHCP(uint8_t* ip);
  /*
   * @brief Get Subnet mask value
   * @param ip  - Subnet mask to be returned
   */
  void getSNfromDHCP(uint8_t* ip);
  /*
   * @brief Get DNS address
   * @param ip  - DNS address to be returned
   */
  void getDNSfromDHCP(uint8_t* ip);
  
  /*
   * @brief Get the leased time by DHCP sever
   * @return unit 1s
   */
  uint32_t getDHCPLeasetime(void);
  
  #ifdef __cplusplus
  }
  #endif
  
  #endif /* _DHCP_H_ */
  