/* ************************************************** */ static void worldsens_update(void) { char msg[WORLDSENS_MAX_PKTLENGTH]; int len, error; struct sockaddr_in address; union _worldsens_pkt *pkt = (union _worldsens_pkt *) msg; error = wsens_srv_rcv(msg, &len, &address); if ((error == 0) && (len == 0)) { return; } else if (error == -1) { exception = EXCEPTION_FATAL; } worldsens_packet_ntoh(pkt); worldsens_packet_display(pkt); switch (pkt->c_header.type) { case WORLDSENS_C_CONNECT_REQ: worldsens_rx_connect_req((struct _worldsens_c_connect_req *) pkt, &address); break; case WORLDSENS_C_SYNC_ACK: worldsens_rx_sync_ack((struct _worldsens_c_sync_ack *) pkt); break; case WORLDSENS_C_BYTE_TX: worldsens_tx_byte((struct _worldsens_c_byte_tx *) pkt); break; case WORLDSENS_C_MEASURE_REQ: worldsens_rx_measure_req((struct _worldsens_c_measure_req *) pkt); break; case WORLDSENS_C_DISCONNECT: worldsens_rx_disconnect((struct _worldsens_c_disconnect *) pkt); break; } /* if a new event has been added before current time, set exception to backtrack */ event_t *next_event = scheduler_see_next(); if (next_event->clock < get_time()) { exception = EXCEPTION_BACKTRACK; } return; }
/* ************************************************** */ static int wsnet2_parse(char *msg) { union _worldsens_pkt *pkt = (union _worldsens_pkt *) msg; worldsens_packet_ntoh(pkt); worldsens_packet_dump(pkt); switch (pkt->s_header.type) { case WORLDSENS_S_CONNECT_RSP_OK: WSNET2_DBG("libwsnet2:wsnet2_parse: WORLDSENS_S_CONNECT_RSP_OK packet type\n"); if(wsnet2_published((char *)pkt)){ WSNET2_EXC("libwsnet2:wsnet2_parse: Error during publishing models\n"); return -1; } break; case WORLDSENS_S_CONNECT_RSP_NOK: WSNET2_DBG("libwsnet2:wsnet2_parse: WORLDSENS_S_CONNECT_RSP_NOK packet type\n"); WSNET2_EXC("libwsnet2:wsnet2_parse: Connection refused by wsnet2 server\n"); wsnet2_finalize(); return -1; case WORLDSENS_S_BACKTRACK: WSNET2_DBG("libwsnet2:wsnet2_parse: WORLDSENS_S_BACKTRACK packet type\n"); if (wsnet2_backtrack((char *)pkt)) goto error; break; case WORLDSENS_S_SYNC_RELEASE: WSNET2_DBG("libwsnet2:wsnet2_parse: WORLDSENS_S_SYNC_RELEASE packet type\n"); if (wsnet2_sync_release((char *)pkt)) goto error; break; case WORLDSENS_S_SYNC_REMINDER: WSNET2_DBG("libwsnet2:wsnet2_parse: WORLDSENS_S_SYNC_REMINDER packet type\n"); if (wsnet2_sync_reminder((char *)pkt)) goto error; break; case WORLDSENS_S_BYTE_RX: WSNET2_DBG("libwsnet2:wsnet2_parse: WORLDSENS_S_BYTE_RX packet type\n"); if (wsnet2_rx((char *)pkt)) goto error; break; case WORLDSENS_S_BYTE_SR_RX: WSNET2_DBG("libwsnet2:wsnet2_parse: WORLDSENS_S_BYTE_SR_RX packet type\n"); if (wsnet2_sr_rx((char *)pkt)) goto error; break; case WORLDSENS_S_MEASURE_RSP: WSNET2_DBG("libwsnet2:wsnet2_parse: WORLDSENS_S_MEASURE_RSP packet type\n"); if (wsnet2_measure_rsp((char *)pkt)) goto error; break; case WORLDSENS_S_MEASURE_SR_RSP: WSNET2_DBG("libwsnet2:wsnet2_parse: WORLDSENS_S_MEASURE_SR_RSP packet type\n"); if (wsnet2_measure_sr_rsp((char *)pkt)) goto error; break; case WORLDSENS_S_KILLSIM: WSNET2_DBG("libwsnet2:wsnet2_parse: WORLDSENS_S_KILLSIM packet type\n"); wsnet2_finalize(); wsens.state = WORLDSENS_CLT_STATE_KILLED; break; case WORLDSENS_S_KILL: WSNET2_DBG("libwsnet2:wsnet2_parse: WORLDSENS_S_KILL packet type\n"); wsnet2_kill_node((char *)pkt); break; default: WSNET2_EXC("libwsnet2:wsnet2_parse: Unknown packet type!\n"); goto error; } return 0; error: WSNET2_ERROR("libwsnet2:wsnet2_parse: Error during packet parse\n"); wsnet2_finalize(); return -1; }