//I just received a request void heli_receive(OpenQueueEntry_t* msg) { msg->owner = COMPONENT_HELI; if (msg->length==4) { heli_setmotor(1,heli_threshold(packetfunctions_ntohs(&(msg->payload[0])))); heli_setmotor(2,heli_threshold(packetfunctions_ntohs(&(msg->payload[2])))); } openqueue_freePacketBuffer(msg); }
void tcpinject_trigger() { uint8_t number_bytes_from_input_buffer; uint8_t input_buffer[18]; //get command from OpenSerial (16B IPv6 destination address, 2B destination port) number_bytes_from_input_buffer = openserial_getInputBuffer(&(input_buffer[0]),sizeof(input_buffer)); if (number_bytes_from_input_buffer!=sizeof(input_buffer)) { openserial_printError(COMPONENT_TCPINJECT,ERR_INPUTBUFFER_LENGTH, (errorparameter_t)number_bytes_from_input_buffer, (errorparameter_t)0); return; }; tcpinject_vars.hisAddress.type = ADDR_128B; memcpy(&(tcpinject_vars.hisAddress.addr_128b[0]),&(input_buffer[0]),16); tcpinject_vars.hisPort = packetfunctions_ntohs(&(input_buffer[16])); //connect opentcp_connect(&tcpinject_vars.hisAddress,tcpinject_vars.hisPort,WKP_TCP_INJECT); }
void udpinject_trigger() { OpenQueueEntry_t* pkt; uint8_t number_bytes_from_input_buffer; uint8_t input_buffer[18]; //get command from OpenSerial (16B IPv6 destination address, 2B destination port) number_bytes_from_input_buffer = openserial_getInputBuffer(&(input_buffer[0]),sizeof(input_buffer)); if (number_bytes_from_input_buffer!=sizeof(input_buffer)) { openserial_printError(COMPONENT_UDPINJECT,ERR_INPUTBUFFER_LENGTH, (errorparameter_t)number_bytes_from_input_buffer, (errorparameter_t)0); return; }; //prepare packet pkt = openqueue_getFreePacketBuffer(COMPONENT_UDPINJECT); if (pkt==NULL) { openserial_printError(COMPONENT_UDPINJECT,ERR_NO_FREE_PACKET_BUFFER, (errorparameter_t)0, (errorparameter_t)0); return; } pkt->creator = COMPONENT_UDPINJECT; pkt->owner = COMPONENT_UDPINJECT; pkt->l4_protocol = IANA_UDP; pkt->l4_sourcePortORicmpv6Type = WKP_UDP_INJECT; pkt->l4_destination_port = packetfunctions_ntohs(&(input_buffer[16])); pkt->l3_destinationAdd.type = ADDR_128B; memcpy(&(pkt->l3_destinationAdd.addr_128b[0]),&(input_buffer[0]),16); packetfunctions_reserveHeaderSize(pkt,6); ((uint8_t*)pkt->payload)[0] = 'p'; ((uint8_t*)pkt->payload)[1] = 'o'; ((uint8_t*)pkt->payload)[2] = 'i'; ((uint8_t*)pkt->payload)[3] = 'p'; ((uint8_t*)pkt->payload)[4] = 'o'; ((uint8_t*)pkt->payload)[5] = 'i'; //send packet if ((openudp_send(pkt))==E_FAIL) { openqueue_freePacketBuffer(pkt); } }
void opentcp_receive(OpenQueueEntry_t* msg) { OpenQueueEntry_t* tempPkt; bool shouldIlisten; msg->owner = COMPONENT_OPENTCP; msg->l4_protocol = IANA_TCP; msg->l4_payload = msg->payload; msg->l4_length = msg->length; msg->l4_sourcePortORicmpv6Type = packetfunctions_ntohs((uint8_t*)&(((tcp_ht*)msg->payload)->source_port)); msg->l4_destination_port = packetfunctions_ntohs((uint8_t*)&(((tcp_ht*)msg->payload)->destination_port)); if ( tcp_vars.state!=TCP_STATE_CLOSED && ( msg->l4_destination_port != tcp_vars.myPort || msg->l4_sourcePortORicmpv6Type != tcp_vars.hisPort || packetfunctions_sameAddress(&(msg->l3_destinationAdd),&tcp_vars.hisIPv6Address)==FALSE ) ) { openqueue_freePacketBuffer(msg); return; } if (containsControlBits(msg,TCP_ACK_WHATEVER,TCP_RST_YES,TCP_SYN_WHATEVER,TCP_FIN_WHATEVER)) { //I receive RST[+*], I reset opentcp_reset(); openqueue_freePacketBuffer(msg); } switch (tcp_vars.state) { case TCP_STATE_CLOSED: //[receive] establishement switch(msg->l4_destination_port) { case WKP_TCP_HTTP: shouldIlisten = ohlone_shouldIlisten(); break; case WKP_TCP_ECHO: shouldIlisten = tcpecho_shouldIlisten(); break; case WKP_TCP_INJECT: shouldIlisten = tcpinject_shouldIlisten(); break; case WKP_TCP_DISCARD: shouldIlisten = tcpprint_shouldIlisten(); break; default: openserial_printError(COMPONENT_OPENTCP,ERR_UNSUPPORTED_PORT_NUMBER, (errorparameter_t)msg->l4_sourcePortORicmpv6Type, (errorparameter_t)2); shouldIlisten = FALSE; break; } if ( containsControlBits(msg,TCP_ACK_NO,TCP_RST_NO,TCP_SYN_YES,TCP_FIN_NO) && shouldIlisten==TRUE ) { tcp_vars.myPort = msg->l4_destination_port; //I receive SYN, I send SYN+ACK tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+1; tcp_vars.hisPort = msg->l4_sourcePortORicmpv6Type; memcpy(&tcp_vars.hisIPv6Address,&(msg->l3_destinationAdd),sizeof(open_addr_t)); tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); if (tempPkt==NULL) { openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, (errorparameter_t)0, (errorparameter_t)0); openqueue_freePacketBuffer(msg); return; } tempPkt->creator = COMPONENT_OPENTCP; tempPkt->owner = COMPONENT_OPENTCP; memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); prependTCPHeader(tempPkt, TCP_ACK_YES, TCP_PSH_NO, TCP_RST_NO, TCP_SYN_YES, TCP_FIN_NO); tcp_vars.mySeqNum++; tcp_change_state(TCP_STATE_ALMOST_SYN_RECEIVED); forwarding_send(tempPkt); } else { opentcp_reset(); openserial_printError(COMPONENT_OPENTCP,ERR_TCP_RESET, (errorparameter_t)tcp_vars.state, (errorparameter_t)0); } openqueue_freePacketBuffer(msg); break; case TCP_STATE_SYN_SENT: //[receive] establishement if (containsControlBits(msg,TCP_ACK_YES,TCP_RST_NO,TCP_SYN_YES,TCP_FIN_NO)) { //I receive SYN+ACK, I send ACK tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+1; tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); if (tempPkt==NULL) { openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, (errorparameter_t)0, (errorparameter_t)0); openqueue_freePacketBuffer(msg); return; } tempPkt->creator = COMPONENT_OPENTCP; tempPkt->owner = COMPONENT_OPENTCP; memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); prependTCPHeader(tempPkt, TCP_ACK_YES, TCP_PSH_NO, TCP_RST_NO, TCP_SYN_NO, TCP_FIN_NO); tcp_change_state(TCP_STATE_ALMOST_ESTABLISHED); forwarding_send(tempPkt); } else if (containsControlBits(msg,TCP_ACK_NO,TCP_RST_NO,TCP_SYN_YES,TCP_FIN_NO)) { //I receive SYN, I send SYN+ACK tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+1; tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); if (tempPkt==NULL) { openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, (errorparameter_t)0, (errorparameter_t)0); openqueue_freePacketBuffer(msg); return; } tempPkt->creator = COMPONENT_OPENTCP; tempPkt->owner = COMPONENT_OPENTCP; memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); prependTCPHeader(tempPkt, TCP_ACK_YES, TCP_PSH_NO, TCP_RST_NO, TCP_SYN_YES, TCP_FIN_NO); tcp_vars.mySeqNum++; tcp_change_state(TCP_STATE_ALMOST_SYN_RECEIVED); forwarding_send(tempPkt); } else { opentcp_reset(); openserial_printError(COMPONENT_OPENTCP,ERR_TCP_RESET, (errorparameter_t)tcp_vars.state, (errorparameter_t)1); } openqueue_freePacketBuffer(msg); break; case TCP_STATE_SYN_RECEIVED: //[receive] establishement if (containsControlBits(msg,TCP_ACK_YES,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_NO)) { //I receive ACK, the virtual circuit is established tcp_change_state(TCP_STATE_ESTABLISHED); } else { opentcp_reset(); openserial_printError(COMPONENT_OPENTCP,ERR_TCP_RESET, (errorparameter_t)tcp_vars.state, (errorparameter_t)2); } openqueue_freePacketBuffer(msg); break; case TCP_STATE_ESTABLISHED: //[receive] data/teardown if (containsControlBits(msg,TCP_ACK_WHATEVER,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_YES)) { //I receive FIN[+ACK], I send ACK tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+msg->length-sizeof(tcp_ht)+1; tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); if (tempPkt==NULL) { openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, (errorparameter_t)0, (errorparameter_t)0); openqueue_freePacketBuffer(msg); return; } tempPkt->creator = COMPONENT_OPENTCP; tempPkt->owner = COMPONENT_OPENTCP; memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); prependTCPHeader(tempPkt, TCP_ACK_YES, TCP_PSH_NO, TCP_RST_NO, TCP_SYN_NO, TCP_FIN_NO); forwarding_send(tempPkt); tcp_change_state(TCP_STATE_ALMOST_CLOSE_WAIT); } else if (containsControlBits(msg,TCP_ACK_WHATEVER,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_NO)) { //I receive data, I send ACK tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+msg->length-sizeof(tcp_ht); tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); if (tempPkt==NULL) { openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, (errorparameter_t)0, (errorparameter_t)0); openqueue_freePacketBuffer(msg); return; } tempPkt->creator = COMPONENT_OPENTCP; tempPkt->owner = COMPONENT_OPENTCP; memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); prependTCPHeader(tempPkt, TCP_ACK_YES, TCP_PSH_NO, TCP_RST_NO, TCP_SYN_NO, TCP_FIN_NO); forwarding_send(tempPkt); packetfunctions_tossHeader(msg,sizeof(tcp_ht)); tcp_vars.dataReceived = msg; tcp_change_state(TCP_STATE_ALMOST_DATA_RECEIVED); } else { opentcp_reset(); openserial_printError(COMPONENT_OPENTCP,ERR_TCP_RESET, (errorparameter_t)tcp_vars.state, (errorparameter_t)3); openqueue_freePacketBuffer(msg); } break; case TCP_STATE_DATA_SENT: //[receive] data if (containsControlBits(msg,TCP_ACK_YES,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_NO)) { //I receive ACK, data message sent switch(tcp_vars.myPort) { case WKP_TCP_HTTP: ohlone_sendDone(tcp_vars.dataToSend,E_SUCCESS); break; case WKP_TCP_ECHO: tcpecho_sendDone(tcp_vars.dataToSend,E_SUCCESS); break; case WKP_TCP_INJECT: tcpinject_sendDone(tcp_vars.dataToSend,E_SUCCESS); break; case WKP_TCP_DISCARD: tcpprint_sendDone(tcp_vars.dataToSend,E_SUCCESS); break; default: openserial_printError(COMPONENT_OPENTCP,ERR_UNSUPPORTED_PORT_NUMBER, (errorparameter_t)tcp_vars.myPort, (errorparameter_t)3); break; } tcp_vars.dataToSend = NULL; tcp_change_state(TCP_STATE_ESTABLISHED); } else if (containsControlBits(msg,TCP_ACK_WHATEVER,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_YES)) { //I receive FIN[+ACK], I send ACK switch(tcp_vars.myPort) { case WKP_TCP_HTTP: ohlone_sendDone(tcp_vars.dataToSend,E_SUCCESS); break; case WKP_TCP_ECHO: tcpecho_sendDone(tcp_vars.dataToSend,E_SUCCESS); break; case WKP_TCP_INJECT: tcpinject_sendDone(tcp_vars.dataToSend,E_SUCCESS); break; case WKP_TCP_DISCARD: tcpprint_sendDone(tcp_vars.dataToSend,E_SUCCESS); break; default: openserial_printError(COMPONENT_OPENTCP,ERR_UNSUPPORTED_PORT_NUMBER, (errorparameter_t)tcp_vars.myPort, (errorparameter_t)4); break; } tcp_vars.dataToSend = NULL; tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+msg->length-sizeof(tcp_ht)+1; tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); if (tempPkt==NULL) { openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, (errorparameter_t)0, (errorparameter_t)0); openqueue_freePacketBuffer(msg); return; } tempPkt->creator = COMPONENT_OPENTCP; tempPkt->owner = COMPONENT_OPENTCP; memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); prependTCPHeader(tempPkt, TCP_ACK_YES, TCP_PSH_NO, TCP_RST_NO, TCP_SYN_NO, TCP_FIN_NO); forwarding_send(tempPkt); tcp_change_state(TCP_STATE_ALMOST_CLOSE_WAIT); } else { opentcp_reset(); openserial_printError(COMPONENT_OPENTCP,ERR_TCP_RESET, (errorparameter_t)tcp_vars.state, (errorparameter_t)4); } openqueue_freePacketBuffer(msg); break; case TCP_STATE_FIN_WAIT_1: //[receive] teardown if (containsControlBits(msg,TCP_ACK_NO,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_YES)) { //I receive FIN, I send ACK tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+1; tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); if (tempPkt==NULL) { openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, (errorparameter_t)0, (errorparameter_t)0); openqueue_freePacketBuffer(msg); return; } tempPkt->creator = COMPONENT_OPENTCP; tempPkt->owner = COMPONENT_OPENTCP; memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); prependTCPHeader(tempPkt, TCP_ACK_YES, TCP_PSH_NO, TCP_RST_NO, TCP_SYN_NO, TCP_FIN_NO); forwarding_send(tempPkt); tcp_change_state(TCP_STATE_ALMOST_CLOSING); } else if (containsControlBits(msg,TCP_ACK_YES,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_YES)) { //I receive FIN+ACK, I send ACK tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+1; tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); if (tempPkt==NULL) { openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, (errorparameter_t)0, (errorparameter_t)0); openqueue_freePacketBuffer(msg); return; } tempPkt->creator = COMPONENT_OPENTCP; tempPkt->owner = COMPONENT_OPENTCP; memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); prependTCPHeader(tempPkt, TCP_ACK_YES, TCP_PSH_NO, TCP_RST_NO, TCP_SYN_NO, TCP_FIN_NO); forwarding_send(tempPkt); tcp_change_state(TCP_STATE_ALMOST_TIME_WAIT); } else if (containsControlBits(msg,TCP_ACK_YES,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_NO)) { //I receive ACK, I will receive FIN later tcp_change_state(TCP_STATE_FIN_WAIT_2); } else { opentcp_reset(); openserial_printError(COMPONENT_OPENTCP,ERR_TCP_RESET, (errorparameter_t)tcp_vars.state, (errorparameter_t)5); } openqueue_freePacketBuffer(msg); break; case TCP_STATE_FIN_WAIT_2: //[receive] teardown if (containsControlBits(msg,TCP_ACK_WHATEVER,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_YES)) { //I receive FIN[+ACK], I send ACK tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+1; tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); if (tempPkt==NULL) { openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, (errorparameter_t)0, (errorparameter_t)0); openqueue_freePacketBuffer(msg); return; } tempPkt->creator = COMPONENT_OPENTCP; tempPkt->owner = COMPONENT_OPENTCP; memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); prependTCPHeader(tempPkt, TCP_ACK_YES, TCP_PSH_NO, TCP_RST_NO, TCP_SYN_NO, TCP_FIN_NO); forwarding_send(tempPkt); tcp_change_state(TCP_STATE_ALMOST_TIME_WAIT); } openqueue_freePacketBuffer(msg); break; case TCP_STATE_CLOSING: //[receive] teardown if (containsControlBits(msg,TCP_ACK_YES,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_NO)) { //I receive ACK, I do nothing tcp_change_state(TCP_STATE_TIME_WAIT); //TODO implement waiting timer opentcp_reset(); } openqueue_freePacketBuffer(msg); break; case TCP_STATE_LAST_ACK: //[receive] teardown if (containsControlBits(msg,TCP_ACK_YES,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_NO)) { //I receive ACK, I reset opentcp_reset(); } openqueue_freePacketBuffer(msg); break; default: openserial_printError(COMPONENT_OPENTCP,ERR_WRONG_TCP_STATE, (errorparameter_t)tcp_vars.state, (errorparameter_t)4); break; } }