Declare and Implement generic ICMPv6 handler management
This commit is contained in:
parent
d387f27a65
commit
b6978b30e8
|
@ -74,7 +74,50 @@
|
|||
static uip_ipaddr_t tmp_ipaddr;
|
||||
|
||||
LIST(echo_reply_callback_list);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* List of input handlers */
|
||||
LIST(input_handler_list);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static uip_icmp6_input_handler_t *
|
||||
input_handler_lookup(uint8_t type, uint8_t icode)
|
||||
{
|
||||
uip_icmp6_input_handler_t *handler = NULL;
|
||||
|
||||
for(handler = list_head(input_handler_list);
|
||||
handler != NULL;
|
||||
handler = list_item_next(handler)) {
|
||||
if(handler->type == type &&
|
||||
(handler->icode == icode ||
|
||||
handler->icode == UIP_ICMP6_HANDLER_CODE_ANY)) {
|
||||
return handler;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
uint8_t
|
||||
uip_icmp6_input(uint8_t type, uint8_t icode)
|
||||
{
|
||||
uip_icmp6_input_handler_t *handler = input_handler_lookup(type, icode);
|
||||
|
||||
if(handler == NULL) {
|
||||
return UIP_ICMP6_INPUT_ERROR;
|
||||
}
|
||||
|
||||
if(handler->handler == NULL) {
|
||||
return UIP_ICMP6_INPUT_ERROR;
|
||||
}
|
||||
|
||||
handler->handler();
|
||||
return UIP_ICMP6_INPUT_SUCCESS;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void
|
||||
uip_icmp6_register_input_handler(uip_icmp6_input_handler_t *handler)
|
||||
{
|
||||
list_add(input_handler_list, handler);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void
|
||||
uip_icmp6_echo_request_input(void)
|
||||
|
|
|
@ -192,8 +192,60 @@ uip_icmp6_echo_reply_callback_add(struct uip_icmp6_echo_reply_notification *n,
|
|||
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)(void);
|
||||
} 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(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);
|
||||
|
||||
/** @} */
|
||||
|
||||
|
|
Loading…
Reference in a new issue