void receive_task(void* pvParameters) { struct NLS_HandleTypedef* hNLS = (struct NLS_HandleTypedef*)pvParameters; datagram_info* d_info; for( ; ; ) { xQueueReceive(hNLS->event_queue, &d_info, portMAX_DELAY); #ifndef ROOT if (d_info->retry != 0) { UTSwapMainLink(hNLS->uTable); if(UTGetMainLink(hNLS->uTable) == UPSTREAM_TABLE_IS_EMPTY) { free_datagram_info(d_info); } else { receive_datagram(hNLS, d_info->source_if, d_info->packet, d_info->packet_length); } } else { receive_datagram(hNLS, d_info->source_if, d_info->packet, d_info->packet_length); } #else if (d_info->retry != 0) { downStreamTablePenaliziesBestPath(hNLS->dTable , d_info->address); } receive_datagram(hNLS,d_info->source_if,d_info->packet,d_info->packet_length); #endif } }
/** * Funzione eseguita ciclicamente. Disaccoda un pacchetto, ne verifica il tipo * ed chiama la primitiva di invio appropriata. */ void dispatch (struct NLS_HandleTypedef* hNLS) //XXX PER PAOLO: MODIFICA FATTA!! { //scoda la prep queue se vuota if (!simpleQueueEmpty(hNLS->PREP_queue)) { //TODO Log //EventLogger_LogEvent(&LOG_HANDLE, NETWORK, NOTICE, MY_ADDRESS, "dispatch()", // LOG_STRING, "scoda la coda PREP", "OK", // LOG_END); on_PREP(hNLS , simpleQueueDequeue(hNLS->PREP_queue)); } //scoda la coda di ingresso datagram_info* d_info = (datagram_info*)priorityQueueDequeue(hNLS->routing_queue); if (d_info == NULL) { //TODO Log //EventLogger_LogEvent(&LOG_HANDLE, NETWORK, NOTICE, MY_ADDRESS, "dispatch()", // LOG_STRING, "scoda la coda d'ingresso", "OK", // LOG_STRING, "coda d'ingresso", "nessun datagram", // LOG_END); return; } //TODO Log //EventLogger_LogEvent(&LOG_HANDLE, NETWORK, NOTICE, MY_ADDRESS, "dispatch()", // LOG_STRING, "scoda la coda d'ingresso", "OK", // LOG_STRING, "coda d'ingresso", "datagram scodato", // LOG_INT, "if source", d_info->source_if, // LOG_INT, "datagram type", d_info->type, // LOG_INT, "packet length", d_info->packet_length, // LOG_INT, "address", d_info->address, // LOG_END); //i messaggi di upstream e downstream diretti al root vanno direttamente al livello superiore #ifdef ROOT if (d_info->type == DATA_UP) //XXX CONTROLLARE DATA_DOWN { //TODO Log //EventLogger_LogEvent(&LOG_HANDLE, NETWORK, NOTICE, MY_ADDRESS, "dispatch()", // LOG_STRING, "nodo ROOT: datagram type", "DATA UP", // LOG_STRING, "nodo ROOT: trasferisci al livello superiore", "OK", // LOG_END); on_datagram_received(d_info); return; } #else if ((get_datagram_address(d_info->packet) == MY_ADDRESS) && (d_info->type == DATA_DOWN)) { //è un datagramma dati, manda ai livelli superiori //TODO Log //EventLogger_LogEvent(&LOG_HANDLE, NETWORK, NOTICE, MY_ADDRESS, "dispatch()", // LOG_STRING, "datagram dati", "trasferisci aL livellO superiorE", // LOG_END); on_datagram_received(d_info); //BSP_LED_On(LED5); return; } //se non ho un path if(UTGetSize(hNLS->uTable) == 0) { //se non ho un path ma ho pacchetti da inviare if(d_info != NULL) { //fai path discovery //TODO Log //EventLogger_LogEvent(&LOG_HANDLE, NETWORK, NOTICE, MY_ADDRESS, "dispatch", // LOG_STRING, "nessun path e datagram da inviare", "esegui path discovery", // LOG_END); on_path_discovery(hNLS , d_info); } } #endif //qui sono associato switch(d_info->type) { case DATA_UP: { #ifndef ROOT //XXX PER PAOLO: Attenzione a questo #ifndef; potrebbe anche non essere necessario if(d_info->source_if == UTGetMainLink(hNLS->uTable)) { //TODO Log //EventLogger_LogEvent(&LOG_HANDLE, NETWORK, NOTICE, MY_ADDRESS, "dispatch()", // LOG_STRING, "datagram type", "DATA UP", // LOG_STRING, "swap main link in Upstream Table", "OK", // LOG_END); UTSwapMainLink(hNLS->uTable); } send_upstream(hNLS , d_info); #endif break; } case DATA_DOWN: { //TODO Log //EventLogger_LogEvent(&LOG_HANDLE, NETWORK, NOTICE, MY_ADDRESS, "dispatch()", // LOG_STRING, "datagram type", "DATA DOWN", // LOG_STRING, "trasmissione DOWNSTREAM", "OK", // LOG_END); send_downstream(hNLS , d_info); break; } case BSRP_PREQ: { #ifndef ROOT if(hNLS->enabled_ifs_num!=1) //XXX ZUPPA PAOLO: TENTATIVO DI AGGIUSTARE IL PROTOCOLLO #endif //TODO Log //EventLogger_LogEvent(&LOG_HANDLE, NETWORK, NOTICE, MY_ADDRESS, "dispatch()", // LOG_STRING, "datagram type", "PREQ", // LOG_STRING, "on PREQ", "OK", // LOG_END); on_PREQ(hNLS , d_info); break; } case BSRP_PFWD: { //TODO Log //EventLogger_LogEvent(&LOG_HANDLE, NETWORK, NOTICE, MY_ADDRESS, "dispatch()", // LOG_STRING, "datagram type", "PFWD", // LOG_STRING, "on PFWD", "OK", // LOG_END); on_PFWD(hNLS , d_info); break; } case BSRP_PREP: { #ifndef ROOT //TODO Log //EventLogger_LogEvent(&LOG_HANDLE, NETWORK, NOTICE, MY_ADDRESS, "dispatch()", // LOG_STRING, "datagram type", "PREP", // LOG_STRING, "trasmissione DOWNSTREAM", "OK", // LOG_END); send_downstream(hNLS , d_info); #endif break; } case BSRP_PACK: { break; } } }