/*
 * Copyright (c) 2006, Swedish Institute of Computer Science.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. 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.
 * 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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.
 *
 * This file is part of the Contiki operating system.
 *
 */

/**
 * \addtogroup uip6
 * @{
 */

/**
 * \file
 *    Header file for ICMPv6 message and error handing (RFC 4443)
 * \author Julien Abeille <jabeille@cisco.com> 
 * \author Mathilde Durvy <mdurvy@cisco.com>
 */

#include <net/buf.h>

#ifndef ICMP6_H_
#define ICMP6_H_

#include "contiki/ip/uip.h"


/** \name ICMPv6 message types */
/** @{ */
#define ICMP6_DST_UNREACH                 1	/**< dest unreachable */
#define ICMP6_PACKET_TOO_BIG	            2	/**< packet too big */
#define ICMP6_TIME_EXCEEDED	            3	/**< time exceeded */
#define ICMP6_PARAM_PROB	               4	/**< ip6 header bad */
#define ICMP6_ECHO_REQUEST              128  /**< Echo request */
#define ICMP6_ECHO_REPLY                129  /**< Echo reply */

#define ICMP6_RS                        133  /**< Router Solicitation */
#define ICMP6_RA                        134  /**< Router Advertisement */
#define ICMP6_NS                        135  /**< Neighbor Solicitation */
#define ICMP6_NA                        136  /**< Neighbor advertisement */
#define ICMP6_REDIRECT                  137  /**< Redirect */

#define ICMP6_RPL                       155  /**< RPL */
#define ICMP6_PRIV_EXP_100              100  /**< Private Experimentation */
#define ICMP6_PRIV_EXP_101              101  /**< Private Experimentation */
#define ICMP6_PRIV_EXP_200              200  /**< Private Experimentation */
#define ICMP6_PRIV_EXP_201              201  /**< Private Experimentation */
#define ICMP6_ROLL_TM    ICMP6_PRIV_EXP_200  /**< ROLL Trickle Multicast */
/** @} */


/** \name ICMPv6 Destination Unreachable message codes*/
/** @{ */
#define ICMP6_DST_UNREACH_NOROUTE         0 /**< no route to destination */
#define ICMP6_DST_UNREACH_ADMIN	         1 /**< administratively prohibited */
#define ICMP6_DST_UNREACH_NOTNEIGHBOR     2 /**< not a neighbor(obsolete) */
#define ICMP6_DST_UNREACH_BEYONDSCOPE     2 /**< beyond scope of source address */
#define ICMP6_DST_UNREACH_ADDR	         3 /**< address unreachable */
#define ICMP6_DST_UNREACH_NOPORT          4 /**< port unreachable */
/** @} */

/** \name ICMPv6 Time Exceeded message codes*/
/** @{ */
#define ICMP6_TIME_EXCEED_TRANSIT         0 /**< ttl==0 in transit */
#define ICMP6_TIME_EXCEED_REASSEMBLY      1 /**< ttl==0 in reass */
/** @} */

/** \name ICMPv6 Parameter Problem message codes*/
/** @{ */
#define ICMP6_PARAMPROB_HEADER            0 /**< erroneous header field */
#define ICMP6_PARAMPROB_NEXTHEADER        1 /**< unrecognized next header */
#define ICMP6_PARAMPROB_OPTION            2 /**< unrecognized option */
/** @} */

/** \brief Echo Request constant part length */
#define UIP_ICMP6_ECHO_REQUEST_LEN        4

/** \brief ICMPv6 Error message constant part length */
#define UIP_ICMP6_ERROR_LEN               4

/** \brief ICMPv6 Error message constant part */
typedef struct uip_icmp6_error{
  uint32_t param;
} PACK_ALIAS_STRUCT uip_icmp6_error;

/** \name ICMPv6 RFC4443 Message processing and sending */
/** @{ */
/**
 * \brief Send an icmpv6 error message
 * \param type type of the error message
 * \param code of the error message
 * \param param 32 bit parameter of the error message, semantic depends on error
 */
void
uip_icmp6_error_output(struct net_buf *buf, uint8_t type, uint8_t code, uint32_t param); 

/**
 * \brief Send an icmpv6 message
 * \param dest destination address of the message
 * \param type type of the message
 * \param code of the message
 * \param payload_len length of the payload
 */
void
uip_icmp6_send(struct net_buf *buf, const uip_ipaddr_t *dest, int type, int code, int payload_len);



typedef void (* uip_icmp6_echo_reply_callback_t)(uip_ipaddr_t *source,
                                                 uint8_t ttl,
                                                 uint8_t *data,
                                                 uint16_t datalen);
struct uip_icmp6_echo_reply_notification {
  struct uip_icmp6_echo_reply_notification *next;
  uip_icmp6_echo_reply_callback_t callback;
};

/**
 * \brief      Add a callback function for ping replies
 * \param n    A struct uip_icmp6_echo_reply_notification that must have been allocated by the caller
 * \param c    A pointer to the callback function to be called
 *
 *             This function adds a callback function to the list of
 *             callback functions that are called when an ICMP echo
 *             reply (ping reply) is received. This is used when
 *             implementing a ping protocol: attach a callback
 *             function to the ping reply, then send out a ping packet
 *             with uip_icmp6_send().
 *
 *             The caller must have statically allocated a struct
 *             uip_icmp6_echo_reply_notification to hold the internal
 *             state of the callback function.
 *
 *             When a ping reply packet is received, all registered
 *             callback functions are called. The callback functions
 *             must not modify the contents of the uIP buffer.
 */
void
uip_icmp6_echo_reply_callback_add(struct uip_icmp6_echo_reply_notification *n,
                                  uip_icmp6_echo_reply_callback_t c);

/**
 * \brief      Remove a callback function for ping replies
 * \param n    A struct uip_icmp6_echo_reply_notification that must have been previously added with uip_icmp6_echo_reply_callback_add()
 *
 *             This function removes a callback function from the list of
 *             callback functions that are called when an ICMP echo
 *             reply (ping reply) is received.
 */
void
uip_icmp6_echo_reply_callback_rm(struct uip_icmp6_echo_reply_notification *n);

/* Generic ICMPv6 input handers */
typedef struct uip_icmp6_input_handler {
  struct uip_icmp6_input_handler *next;
  uint8_t type;
  uint8_t icode;
  void (*handler)(struct net_buf *buf);
} uip_icmp6_input_handler_t;

#define UIP_ICMP6_INPUT_SUCCESS     0
#define UIP_ICMP6_INPUT_ERROR       1

#define UIP_ICMP6_HANDLER_CODE_ANY 0xFF /* Handle all codes for this type */

/*
 * Initialise a variable of type uip_icmp6_input_handler, to be used later as
 * the argument to uip_icmp6_register_input_handler
 *
 * The function pointer stored in this variable will get called and will be
 * expected to handle incoming ICMPv6 datagrams of the specified type/code
 *
 * If code has a value of UIP_ICMP6_HANDLER_CODE_ANY, the same function
 * will handle all codes for this type. In other words, the ICMPv6
 * message's code is "don't care"
 */
#define UIP_ICMP6_HANDLER(name, type, code, func) \
  static uip_icmp6_input_handler_t name = { NULL, type, code, func }

/**
 * \brief Handle an incoming ICMPv6 message
 * \param type The ICMPv6 message type
 * \param icode The ICMPv6 message code
 * \return Success: UIP_ICMP6_INPUT_SUCCESS, Error: UIP_ICMP6_INPUT_ERROR
 *
 * Generic handler for unknown ICMPv6 types. It will lookup for a registered
 * function capable of handing this message type. The function must have first
 * been registered with uip_icmp6_register_input_handler. The function is in
 * charge of setting uip_len to 0, otherwise the uIPv6 core will attempt to
 * send whatever remains in the UIP_IP_BUF.
 *
 * A return value of UIP_ICMP6_INPUT_ERROR means that a handler could not be
 * invoked. This is most likely because the ICMPv6 type does not have a valid
 * handler associated with it.

 * UIP_ICMP6_INPUT_SUCCESS signifies that a handler was found for this ICMPv6
 * type and that it was invoked. It does NOT provide any indication whatsoever
 * regarding whether the handler itself succeeded.
 */
uint8_t uip_icmp6_input(struct net_buf *buf, uint8_t type, uint8_t icode);

/**
 * \brief Register a handler which can handle a specific ICMPv6 message type
 * \param handler A pointer to the handler
 */
void uip_icmp6_register_input_handler(uip_icmp6_input_handler_t *handler);


/**
 * \brief Initialise the uIP ICMPv6 core
 */
void uip_icmp6_init(void);

/** @} */

#endif /*ICMP6_H_*/
/** @} */

