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_rm_by_addr(uip_ipaddr_t * ipaddr) { node_info_t *node_info = node_info_lookup(ipaddr); if(node_info != NULL) { node_info->isused = 0; } }
void node_info_node_seen(uip_ipaddr_t * ipaddr, int hop_count) { node_info_t *node = NULL; node = node_info_lookup(ipaddr); if ( node != NULL ) { node->last_seen = clock_time(); if(hop_count != -1) { node->hop_count = hop_count; } } }
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; } } }
static httpd_cgi_call_t * webserver_sensor_delete_node(struct httpd_state *s) { static uip_ipaddr_t ipaddr; static node_info_t * node_info = NULL; webserver_result_title = "Sensor"; if(s->query && strncmp(s->query, "ip=", 3) == 0 && uiplib_ipaddrconv(s->query + 3, &ipaddr) != 0) { node_info = node_info_lookup(&ipaddr); if(node_info) { node_info_rm(node_info); webserver_result_text = "Sensor deleted"; } else { webserver_result_text = "Sensor address unknown"; } } else { webserver_result_text = "Sensor address missing"; } return &webserver_result_page; }
static PT_THREAD(generate_sensor(struct httpd_state *s)) { static uip_ipaddr_t ipaddr; static node_info_t * node_info = NULL; PSOCK_BEGIN(&s->sout); if(s->query && strncmp(s->query, "ip=", 3) == 0 && uiplib_ipaddrconv(s->query + 3, &ipaddr) != 0) { node_info = node_info_lookup(&ipaddr); if(node_info) { add("<h2>Info</h2>"); #if CETIC_NODE_CONFIG_HAS_NAME if ( node_config_loaded ) { add("Name: %s<br />", node_config_get_name(node_config_find_by_ip(&ipaddr))); } #endif add("IP: "); ipaddr_add(&ipaddr); add("<br />"); add("Model: -<br />"); add("Parent: "); #if CETIC_NODE_CONFIG_HAS_NAME if (node_config_loaded) { add("%s (", node_config_get_name(node_config_find_by_ip(&node_info->ip_parent))); ipaddr_add(&node_info->ip_parent); add(")</a>"); } else #endif { ipaddr_add(&node_info->ip_parent); add("</a>"); } add("<br />"); add("Downward route: %s<br />", node_info_flags_text(node_info->flags & NODE_INFO_HAS_ROUTE) != 0 ? "Yes" : "No"); SEND_STRING(&s->sout, buf); reset_buf(); add("<br /><h2>Statistics</h2>"); add("Since : %d s<br />", (clock_time() - node_info->stats_start) / CLOCK_SECOND); add("Last seen : %d s<br />", (clock_time() - node_info->last_seen) / CLOCK_SECOND); add("Hop count: %d<br />", node_info->hop_count); add("Parent switch: %d<br />", node_info->parent_switch); add("<br /><h3>Upstream</h3>"); add("Last sequence number: %d<br />", node_info->last_up_sequence); add("Messages sent: %d<br />", node_info->messages_sent); add("Messages lost: %d<br />", node_info->up_messages_lost); if(node_info->messages_sent > 0) { add("PRR: %.1f%%<br />", 100.0 * (node_info->messages_sent - node_info->up_messages_lost)/node_info->messages_sent); } else { add("PRR: n/a<br />"); } add("<br /><h3>Downstream</h3>"); add("Last sequence number: %d<br />", node_info->last_down_sequence); add("Messages sent: %d<br />", node_info->replies_sent); add("Messages lost: %d<br />", node_info->down_messages_lost); if(node_info->replies_sent > 0) { add("PRR: %.1f%%<br />", 100.0 * (node_info->replies_sent - node_info->down_messages_lost)/node_info->replies_sent); } else { add("PRR: n/a<br />"); } SEND_STRING(&s->sout, buf); reset_buf(); add("<br /><h2>Actions</h2>"); add("<form action=\"reset-stats\" method=\"get\">"); add("<input type=\"hidden\" name=\"ip\" value=\""); ipaddr_add(&node_info->ipaddr); add("\"/>"); add("<input type=\"submit\" value=\"Reset statistics\"/></form><br />"); add("<form action=\"rm-node\" method=\"get\">"); add("<input type=\"hidden\" name=\"ip\" value=\""); ipaddr_add(&node_info->ipaddr); add("\"/>"); add("<input type=\"submit\" value=\"Delete node\"/></form><br />"); } else { add("Sensor address unknown"); } } else { add("Sensor address missing"); } SEND_STRING(&s->sout, buf); reset_buf(); PSOCK_END(&s->sout); }
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; }