/**@brief ICMP6 module event handler. * * @details Callback registered with the ICMP6 module to receive asynchronous events from * the module, if the ICMP6_ENABLE_ALL_MESSAGES_TO_APPLICATION constant is not zero * or the ICMP6_ENABLE_ND6_MESSAGES_TO_APPLICATION constant is not zero. */ uint32_t icmp6_handler(iot_interface_t * p_interface, ipv6_header_t * p_ip_header, icmp6_header_t * p_icmp_header, uint32_t process_result, iot_pbuffer_t * p_rx_packet) { APPL_LOG("[APPL]: Got ICMP6 Application Handler Event on interface 0x%p\r\n", p_interface); APPL_LOG("[APPL]: Source IPv6 Address: "); APPL_ADDR(p_ip_header->srcaddr); APPL_LOG("[APPL]: Destination IPv6 Address: "); APPL_ADDR(p_ip_header->destaddr); APPL_LOG("[APPL]: Process result = 0x%08lx\r\n", process_result); switch (p_icmp_header->type) { case ICMP6_TYPE_ECHO_REPLY: APPL_LOG("[APPL]: ICMP6 Message Type = Echo Reply\r\n"); if (m_app_state != APP_STATE_IDLE) { // Invert LED_FOUR. LEDS_INVERT(LED_FOUR); } // Reset echo request retransmission number. m_echo_req_retry_count = 0; break; default: break; } return NRF_SUCCESS; }
/**@brief ICMP6 module event handler. * * @details Callback registered with the ICMP6 module to receive asynchronous events from * the module, if the ICMP6_ENABLE_ALL_MESSAGES_TO_APPLICATION constant is not zero * or the ICMP6_ENABLE_ND6_MESSAGES_TO_APPLICATION constant is not zero. */ uint32_t icmp6_handler(iot_interface_t * p_interface, ipv6_header_t * p_ip_header, icmp6_header_t * p_icmp_header, uint32_t process_result, iot_pbuffer_t * p_rx_packet) { uint32_t err_code; APPL_LOG("[APPL]: Got ICMP6 Application Handler Event on interface 0x%p\r\n", p_interface); APPL_LOG("[APPL]: Source IPv6 Address: "); APPL_ADDR(p_ip_header->srcaddr); APPL_LOG("[APPL]: Destination IPv6 Address: "); APPL_ADDR(p_ip_header->destaddr); APPL_LOG("[APPL]: Process result = 0x%08lx\r\n", process_result); switch(p_icmp_header->type) { case ICMP6_TYPE_DESTINATION_UNREACHABLE: APPL_LOG("[APPL]: ICMP6 Message Type = Destination Unreachable Error\r\n"); break; case ICMP6_TYPE_PACKET_TOO_LONG: APPL_LOG("[APPL]: ICMP6 Message Type = Packet Too Long Error\r\n"); break; case ICMP6_TYPE_TIME_EXCEED: APPL_LOG("[APPL]: ICMP6 Message Type = Time Exceed Error\r\n"); break; case ICMP6_TYPE_PARAMETER_PROBLEM: APPL_LOG("[APPL]: ICMP6 Message Type = Parameter Problem Error\r\n"); break; case ICMP6_TYPE_ECHO_REQUEST: APPL_LOG("[APPL]: ICMP6 Message Type = Echo Request\r\n"); m_display_state = LEDS_TX_ECHO_RESPONSE; LEDS_OFF(LED_TWO); err_code = app_timer_start(m_echo_ind_timer, (LED_BLINK_INTERVAL / 3), NULL); APP_ERROR_CHECK(err_code); break; case ICMP6_TYPE_ECHO_REPLY: APPL_LOG("[APPL]: ICMP6 Message Type = Echo Reply\r\n"); break; case ICMP6_TYPE_ROUTER_SOLICITATION: APPL_LOG("[APPL]: ICMP6 Message Type = Router Solicitation\r\n"); break; case ICMP6_TYPE_ROUTER_ADVERTISEMENT: APPL_LOG("[APPL]: ICMP6 Message Type = Router Advertisement\r\n"); break; case ICMP6_TYPE_NEIGHBOR_SOLICITATION: APPL_LOG("[APPL]: ICMP6 Message Type = Neighbor Solicitation\r\n"); break; case ICMP6_TYPE_NEIGHBOR_ADVERTISEMENT: APPL_LOG("[APPL]: ICMP6 Message Type = Neighbor Advertisement\r\n"); break; default: break; } return NRF_SUCCESS; }
/**@brief DNS6 module event handler. * * @details Callback registered with the DNS6 module to receive asynchronous events from * the module for registering query. */ static void app_dns_handler(uint32_t process_result, const char * p_hostname, ipv6_addr_t * p_addr, uint16_t addr_count) { uint32_t index; if (m_app_state != APP_STATE_RESOLVING) { // Exit if it's not in resolving state. return; } APPL_LOG("[APPL]: DNS Response for hostname: %s, with %d IPv6 addresses and status 0x%08lX\r\n", p_hostname, addr_count, process_result); if(process_result == NRF_SUCCESS) { for (index = 0; index < addr_count; index++) { APPL_LOG("[APPL]: [%ld] IPv6 Address: ", index); APPL_ADDR(p_addr[index]); // Store only first given address, but print all of them. if(index == 0) { memcpy(m_hostname_address.u8, p_addr[0].u8, IPV6_ADDR_SIZE); // Change application state. m_app_state = APP_STATE_PINGING; // Turn on LED_THREE LEDS_ON(LED_THREE); } } } else { // Start application state machine from beginning. m_app_state = APP_STATE_QUERYING; } }
/**@brief ICMP6 module event handler. * * @details Callback registered with the ICMP6 module to receive asynchronous events from * the module, if the ICMP6_ENABLE_ALL_MESSAGES_TO_APPLICATION constant is not zero * or the ICMP6_ENABLE_ND6_MESSAGES_TO_APPLICATION constant is not zero. */ uint32_t icmp6_handler(iot_interface_t * p_interface, ipv6_header_t * p_ip_header, icmp6_header_t * p_icmp_header, uint32_t process_result, iot_pbuffer_t * p_rx_packet) { uint32_t err_code; APPL_LOG("[APPL]: Got ICMP6 Application Handler Event on interface 0x%p\r\n", p_interface); APPL_LOG("[APPL]: Source IPv6 Address: "); APPL_ADDR(p_ip_header->srcaddr); APPL_LOG("[APPL]: Destination IPv6 Address: "); APPL_ADDR(p_ip_header->destaddr); APPL_LOG("[APPL]: Process result = 0x%08lx\r\n", process_result); switch(p_icmp_header->type) { case ICMP6_TYPE_DESTINATION_UNREACHABLE: APPL_LOG("[APPL]: ICMP6 Message Type = Destination Unreachable Error\r\n"); break; case ICMP6_TYPE_PACKET_TOO_LONG: APPL_LOG("[APPL]: ICMP6 Message Type = Packet Too Long Error\r\n"); break; case ICMP6_TYPE_TIME_EXCEED: APPL_LOG("[APPL]: ICMP6 Message Type = Time Exceed Error\r\n"); break; case ICMP6_TYPE_PARAMETER_PROBLEM: APPL_LOG("[APPL]: ICMP6 Message Type = Parameter Problem Error\r\n"); break; case ICMP6_TYPE_ECHO_REQUEST: APPL_LOG("[APPL]: ICMP6 Message Type = Echo Request\r\n"); break; case ICMP6_TYPE_ECHO_REPLY: APPL_LOG("[APPL]: ICMP6 Message Type = Echo Reply\r\n"); ipv6_addr_t server_ipv6_addr; memset(&server_ipv6_addr, 0, sizeof(ipv6_addr_t)); memcpy(&server_ipv6_addr.u8[0], (uint8_t []){SERVER_IPV6_ADDRESS}, IPV6_ADDR_SIZE); if (0 == memcmp(&p_ip_header->srcaddr.u8[0], &server_ipv6_addr.u8[0], IPV6_ADDR_SIZE)) { // Echo Response received from peer, start sending UDP6 packets. m_node_state = APP_STATE_PEER_REACHABLE; m_display_state = LEDS_TX_UDP_PACKET; err_code = app_timer_start(m_tx_node_timer, TX_INTERVAL, NULL); APP_ERROR_CHECK(err_code); } break; case ICMP6_TYPE_ROUTER_SOLICITATION: APPL_LOG("[APPL]: ICMP6 Message Type = Router Solicitation\r\n"); break; case ICMP6_TYPE_ROUTER_ADVERTISEMENT: APPL_LOG("[APPL]: ICMP6 Message Type = Router Advertisement\r\n"); break; case ICMP6_TYPE_NEIGHBOR_SOLICITATION: APPL_LOG("[APPL]: ICMP6 Message Type = Neighbor Solicitation\r\n"); break; case ICMP6_TYPE_NEIGHBOR_ADVERTISEMENT: APPL_LOG("[APPL]: ICMP6 Message Type = Neighbor Advertisement\r\n"); break; default: break; } return NRF_SUCCESS; }