void icmpv6echo_trigger() { uint8_t number_bytes_from_input_buffer; uint8_t input_buffer[16]; OpenQueueEntry_t* msg; //get command from OpenSerial (16B IPv6 destination address) 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_ICMPv6ECHO,ERR_INPUTBUFFER_LENGTH, (errorparameter_t)number_bytes_from_input_buffer, (errorparameter_t)0); return; }; icmpv6echo_vars.hisAddress.type = ADDR_128B; memcpy(&(icmpv6echo_vars.hisAddress.addr_128b[0]),&(input_buffer[0]),16); //send if (icmpv6echo_vars.busySending==TRUE) { openserial_printError(COMPONENT_ICMPv6ECHO,ERR_BUSY_SENDING, (errorparameter_t)0, (errorparameter_t)0); } else { icmpv6echo_vars.busySending = TRUE; msg = openqueue_getFreePacketBuffer(COMPONENT_ICMPv6ECHO); if (msg==NULL) { openserial_printError(COMPONENT_ICMPv6ECHO,ERR_NO_FREE_PACKET_BUFFER, (errorparameter_t)0, (errorparameter_t)0); icmpv6echo_vars.busySending = FALSE; return; } //admin msg->creator = COMPONENT_ICMPv6ECHO; msg->owner = COMPONENT_ICMPv6ECHO; //l4 msg->l4_protocol = IANA_ICMPv6; msg->l4_sourcePortORicmpv6Type = IANA_ICMPv6_ECHO_REQUEST; //l3 memcpy(&(msg->l3_destinationAdd),&icmpv6echo_vars.hisAddress,sizeof(open_addr_t)); //payload packetfunctions_reserveHeaderSize(msg,4); packetfunctions_htonl(0x789abcde,(uint8_t*)(msg->payload)); //ICMPv6 header packetfunctions_reserveHeaderSize(msg,sizeof(ICMPv6_ht)); ((ICMPv6_ht*)(msg->payload))->type = msg->l4_sourcePortORicmpv6Type; ((ICMPv6_ht*)(msg->payload))->code = 0; // Below Identifier might need to be replaced by the identifier used by icmpv6rpl // packetfunctions_htons(0x1234 ,(uint8_t*)&((ICMPv6_ht*)(msg->payload))->identifier); // Below sequence_number might need to be removed // packetfunctions_htons(icmpv6echo_vars.seq++ ,(uint8_t*)&((ICMPv6_ht*)(msg->payload))->sequence_number); packetfunctions_calculateChecksum(msg,(uint8_t*)&(((ICMPv6_ht*)(msg->payload))->checksum));//do last //send if (icmpv6_send(msg)!=E_SUCCESS) { icmpv6echo_vars.busySending = FALSE; openqueue_freePacketBuffer(msg); } } }
void prependTCPHeader(OpenQueueEntry_t* msg, bool ack, bool push, bool rst, bool syn, bool fin) { msg->l4_protocol = IANA_TCP; packetfunctions_reserveHeaderSize(msg,sizeof(tcp_ht)); packetfunctions_htons(tcp_vars.myPort ,(uint8_t*)&(((tcp_ht*)msg->payload)->source_port)); packetfunctions_htons(tcp_vars.hisPort ,(uint8_t*)&(((tcp_ht*)msg->payload)->destination_port)); packetfunctions_htonl(tcp_vars.mySeqNum ,(uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)); packetfunctions_htonl(tcp_vars.hisNextSeqNum ,(uint8_t*)&(((tcp_ht*)msg->payload)->ack_number)); ((tcp_ht*)msg->payload)->data_offset = TCP_DEFAULT_DATA_OFFSET; ((tcp_ht*)msg->payload)->control_bits = 0; if (ack==TCP_ACK_YES) { ((tcp_ht*)msg->payload)->control_bits |= 1 << TCP_ACK; } else { packetfunctions_htonl(0,(uint8_t*)&(((tcp_ht*)msg->payload)->ack_number)); } if (push==TCP_PSH_YES) { ((tcp_ht*)msg->payload)->control_bits |= 1 << TCP_PSH; } if (rst==TCP_RST_YES) { ((tcp_ht*)msg->payload)->control_bits |= 1 << TCP_RST; } if (syn==TCP_SYN_YES) { ((tcp_ht*)msg->payload)->control_bits |= 1 << TCP_SYN; } if (fin==TCP_FIN_YES) { ((tcp_ht*)msg->payload)->control_bits |= 1 << TCP_FIN; } packetfunctions_htons(TCP_DEFAULT_WINDOW_SIZE ,(uint8_t*)&(((tcp_ht*)msg->payload)->window_size)); packetfunctions_htons(TCP_DEFAULT_URGENT_POINTER ,(uint8_t*)&(((tcp_ht*)msg->payload)->urgent_pointer)); //calculate checksum last to take all header fields into account packetfunctions_calculateChecksum(msg,(uint8_t*)&(((tcp_ht*)msg->payload)->checksum)); }