diff --git a/core/net/uip-icmp6.c b/core/net/uip-icmp6.c index 5c7184ccf..20a223f76 100644 --- a/core/net/uip-icmp6.c +++ b/core/net/uip-icmp6.c @@ -64,6 +64,7 @@ /** \brief temporary IP address */ static uip_ipaddr_t tmp_ipaddr; +/*---------------------------------------------------------------------------*/ void uip_icmp6_echo_request_input(void) { @@ -123,7 +124,7 @@ uip_icmp6_echo_request_input(void) UIP_STAT(++uip_stat.icmp.sent); return; } - +/*---------------------------------------------------------------------------*/ void uip_icmp6_error_output(u8_t type, u8_t code, u32_t param) { uip_ext_len = 0; @@ -194,4 +195,31 @@ uip_icmp6_error_output(u8_t type, u8_t code, u32_t param) { return; } +/*---------------------------------------------------------------------------*/ +void +uip_icmp6_send(uip_ipaddr_t *dest, int type, int code, int payload_len) +{ + + UIP_IP_BUF->vtc = 0x60; + UIP_IP_BUF->tcflow = 0; + UIP_IP_BUF->flow = 0; + UIP_IP_BUF->proto = UIP_PROTO_ICMP6; + UIP_IP_BUF->ttl = uip_ds6_if.cur_hop_limit; + UIP_IP_BUF->len[0] = 0; + UIP_IP_BUF->len[1] = UIP_ICMPH_LEN + payload_len; + + memcpy(&UIP_IP_BUF->destipaddr, dest, sizeof(*dest)); + uip_ds6_select_src(&UIP_IP_BUF->srcipaddr, &UIP_IP_BUF->destipaddr); + + UIP_ICMP_BUF->type = type; + UIP_ICMP_BUF->icode = code; + + UIP_ICMP_BUF->icmpchksum = 0; + UIP_ICMP_BUF->icmpchksum = ~uip_icmp6chksum(); + + uip_len = UIP_IPH_LEN + UIP_ICMPH_LEN + payload_len; + tcpip_ipv6_output(); +} +/*---------------------------------------------------------------------------*/ + /** @} */ diff --git a/core/net/uip-icmp6.h b/core/net/uip-icmp6.h index e40a378b3..804f7a993 100644 --- a/core/net/uip-icmp6.h +++ b/core/net/uip-icmp6.h @@ -115,19 +115,25 @@ uip_icmp6_echo_request_input(void); /** * \brief Send an icmpv6 error message - * \param type type of the Error message + * \param type type of the error message * \param code of the error message * \param type 32 bit parameter of the error message, semantic depends on error */ void uip_icmp6_error_output(u8_t type, u8_t code, u32_t param); -/** @} */ - -#if UIP_CONF_IPV6_RPL +/** + * \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_rpl_input(void); -#endif /* UIP_CONF_IPV6_RPL */ +uip_icmp6_send(uip_ipaddr_t *dest, int type, int code, int payload_len); + + +/** @} */ #endif /*__ICMP6_H__*/ /** @} */ diff --git a/core/net/uip6.c b/core/net/uip6.c index bd5fcd7b7..3fb694aa7 100644 --- a/core/net/uip6.c +++ b/core/net/uip6.c @@ -41,7 +41,7 @@ * * This file is part of the uIP TCP/IP stack. * - * $Id: uip6.c,v 1.18 2010/04/30 08:46:27 joxe Exp $ + * $Id: uip6.c,v 1.19 2010/04/30 13:22:21 joxe Exp $ * */ @@ -94,6 +94,10 @@ #define PRINT6ADDR(addr) #endif +#if UIP_CONF_IPV6_RPL +void uip_rpl_input(void); +#endif /* UIP_CONF_IPV6_RPL */ + #if UIP_LOGGING == 1 #include void uip_log(char *msg); @@ -1404,8 +1408,15 @@ uip_process(u8_t flag) } } PRINTF("udp: no matching connection found\n"); + +#if UIP_UDP_SEND_UNREACH_NOPORT + uip_icmp6_error_output(ICMP6_DST_UNREACH, ICMP6_DST_UNREACH_NOPORT, 0); + UIP_STAT(++uip_stat.ip.drop); + goto send; +#else goto drop; - +#endif + udp_found: PRINTF("In udp_found\n");