static void tcpip_handler(void) { static int seq_id; char buf[MAX_PAYLOAD_LEN]; if(uip_newdata()) { ((char *)uip_appdata)[uip_datalen()] = 0; PRINTF("Server received: '%s' from ", (char *)uip_appdata); PRINT6ADDR(&UIP_IP_BUF->srcipaddr); PRINTF("\n"); #if CETIC_NODE_INFO node_info_t *node = node_info_lookup(&UIP_IP_BUF->srcipaddr); if(node == NULL) { node = node_info_add(&UIP_IP_BUF->srcipaddr); } if(node != NULL) { node->last_lookup = clock_time(); strncpy(node->my_info, (char *)uip_appdata, sizeof(node->my_info) - 1); } #endif uip_ipaddr_copy(&server_conn->ripaddr, &UIP_IP_BUF->srcipaddr); PRINTF("Responding with message: "); sprintf(buf, "Hello from the server! (%d)", ++seq_id); PRINTF("%s\n", buf); uip_udp_packet_send(server_conn, buf, strlen(buf)); /* Restore server connection to allow data from any node */ memset(&server_conn->ripaddr, 0, sizeof(server_conn->ripaddr)); } }
void node_info_route_notification_cb(int event, uip_ipaddr_t * route, uip_ipaddr_t * nexthop, int num_routes) { node_info_t *node = NULL; if(event == UIP_DS6_NOTIFICATION_ROUTE_ADD) { node = node_info_lookup(route); if(node == NULL) { node = node_info_add(route); } if(node != NULL) { node->has_route = 1; node->last_seen = clock_time(); } } else if(event == UIP_DS6_NOTIFICATION_ROUTE_RM) { node = node_info_lookup(route); if(node != NULL) { node->has_route = 0; } } }
node_info_t * node_info_update(uip_ipaddr_t * ipaddr, char * info) { node_info_t *node = NULL; char * sep; uip_ipaddr_t ip_parent; node = node_info_lookup(ipaddr); if (node == NULL) { node = node_info_add(ipaddr); } if ( node != NULL ) { node->last_seen = clock_time(); node->last_message = clock_time(); uint16_t up_sequence = 0; uint16_t down_sequence = 0; sep = index(info, '|'); if (sep != NULL) { node->messages_received++; up_sequence = atoi(info); *sep = 0; info = sep + 1; if (*info == ' ') { info++; } sep = index(info, '|'); if (sep != NULL) { *sep = 0; } if (uiplib_ipaddrconv(info, &ip_parent) == 0) { uip_create_unspecified(&ip_parent); } if(!uip_ipaddr_cmp(&node->ip_parent, &ip_parent)) { uip_ipaddr_copy(&(node->ip_parent), &ip_parent); if (node->messages_received > 1) { node->parent_switch++; } } if (sep != NULL) { info = sep + 1; down_sequence = atoi(info); } if (node->messages_received > 1) { uint16_t up_delta = up_sequence - node->last_up_sequence; if (up_delta < 100) { node->messages_sent += up_delta; node->up_messages_lost += up_delta - 1; if(down_sequence != node->last_down_sequence + 1) { node->down_messages_lost += 1; } } else { //Reset statistics node->messages_sent = 1; node->replies_sent = 0; node->up_messages_lost = 0; node->down_messages_lost = 0; } } else { node->messages_sent = 1; node->replies_sent = 0; node->up_messages_lost = 0; node->down_messages_lost = 0; } node->last_up_sequence = up_sequence; node->last_down_sequence = down_sequence; } else { node->last_up_sequence = 0; node->last_down_sequence = 0; uip_create_unspecified(&node->ip_parent); } } return node; }