/**@brief free() function definition. */ static void free_fn_hook(void * p_ptr) { nrf_free((uint8_t * ) p_ptr); }
void portdb_deinit(void) { nrf_free(m_portdb); m_portdb = NULL; m_portdb_len = 0; }
/**@brief Function for receiving 6LoWPAN module events. * * @param[in] p_6lo_interface Pointer to 6LoWPAN interface. * @param[in] p_6lo_event Pointer to 6LoWPAN related event. * * @return None. */ static void ble_6lowpan_evt_handler(iot_interface_t * p_interface, ble_6lowpan_event_t * p_6lo_event) { bool rx_failure = false; uint32_t err_code; uint32_t interface_id; iot_pbuffer_t * p_pbuffer; iot_pbuffer_alloc_param_t pbuff_param; IPV6_MUTEX_LOCK(); IPV6_ENTRY(); IPV6_TRC("In 6LoWPAN Handler:"); interface_id = interface_get_by_6lo(p_interface); switch (p_6lo_event->event_id) { case BLE_6LO_EVT_ERROR: { IPV6_ERR("Got error, with result %08lx", p_6lo_event->event_result); break; } case BLE_6LO_EVT_INTERFACE_ADD: { IPV6_TRC("New interface established!"); // Add interface to internal table. err_code = interface_add(p_interface, &interface_id); if (NRF_SUCCESS == err_code) { IPV6_TRC("Added new network interface to internal table."); err_code = iot_context_manager_table_alloc(p_interface); if (err_code == NRF_SUCCESS) { IPV6_TRC("Successfully allocated context table!"); } else { IPV6_ERR("Failed to allocate context table!"); } // Increase number of up interfaces. m_interfaces_count++; // Notify application. app_notify_interface_add(p_interface); } else { IPV6_ERR("Cannot add new interface. Table is full."); } break; } case BLE_6LO_EVT_INTERFACE_DELETE: { IPV6_TRC("Interface disconnected!"); if (interface_id < IPV6_MAX_INTERFACE) { IPV6_TRC("Removed network interface."); // Notify application. app_notify_interface_delete(p_interface); err_code = iot_context_manager_table_free(p_interface); if (err_code == NRF_SUCCESS) { IPV6_TRC("Successfully freed context table!"); } // Decrease number of up interfaces. m_interfaces_count--; // Remove interface from internal table. interface_delete(interface_id); } break; } case BLE_6LO_EVT_INTERFACE_DATA_RX: { IPV6_TRC("Got data with size = %d!", p_6lo_event->event_param.rx_event_param.packet_len); IPV6_TRC("Data: "); IPV6_DUMP(p_6lo_event->event_param.rx_event_param.p_packet, p_6lo_event->event_param.rx_event_param.packet_len); if (interface_id < IPV6_MAX_INTERFACE) { if (p_6lo_event->event_result == NRF_ERROR_NOT_FOUND) { IPV6_ERR("Cannot restore IPv6 addresses!"); IPV6_ERR("Source CID = 0x%x, Destination CID = 0x%x", p_6lo_event->event_param.rx_event_param.rx_contexts.src_cntxt_id, p_6lo_event->event_param.rx_event_param.rx_contexts.dest_cntxt_id); // Indicates failure. rx_failure = true; break; } // Check if packet is for us. ipv6_addr_t * p_addr = (ipv6_addr_t *)&p_6lo_event->event_param.rx_event_param.p_packet[DEST_ADDR_OFFSET]; err_code = addr_check(interface_id, p_addr, true); // If no address found - drop message. if (err_code != NRF_SUCCESS) { IPV6_ERR("Packet received on unknown address!"); rx_failure = true; break; } // Try to allocate pbuffer, with no memory. pbuff_param.flags = PBUFFER_FLAG_NO_MEM_ALLOCATION; pbuff_param.type = RAW_PACKET_TYPE; pbuff_param.length = p_6lo_event->event_param.rx_event_param.packet_len; // Try to allocate pbuffer for receiving data. err_code = iot_pbuffer_allocate(&pbuff_param, &p_pbuffer); if (err_code == NRF_SUCCESS) { p_pbuffer->p_memory = p_6lo_event->event_param.rx_event_param.p_packet; p_pbuffer->p_payload = p_pbuffer->p_memory + IPV6_IP_HEADER_SIZE; p_pbuffer->length -= IPV6_IP_HEADER_SIZE; // Execute multiplexer. err_code = ipv6_input(p_interface, p_pbuffer); if (err_code != NRF_SUCCESS) { IPV6_ERR("Failed while processing packet, error = 0x%08lX!", err_code); } } else { IPV6_ERR("Failed to allocate packet buffer!"); rx_failure = true; } } else { IPV6_ERR("[6LOWPAN]: Got data to unknown interface!"); rx_failure = true; } break; } default: break; } if (rx_failure == true) { UNUSED_VARIABLE(nrf_free(p_6lo_event->event_param.rx_event_param.p_packet)); } IPV6_EXIT(); IPV6_MUTEX_UNLOCK(); }