error_t openudp_send(OpenQueueEntry_t* msg) { msg->owner = COMPONENT_OPENUDP; msg->l4_protocol = IANA_UDP; msg->l4_payload = msg->payload; msg->l4_length = msg->length; packetfunctions_reserveHeaderSize(msg,sizeof(udp_ht)); packetfunctions_htons(msg->l4_sourcePortORicmpv6Type,&(msg->payload[0])); packetfunctions_htons(msg->l4_destination_port,&(msg->payload[2])); packetfunctions_htons(msg->length,&(msg->payload[4])); packetfunctions_calculateChecksum(msg,(uint8_t*)&(((udp_ht*)msg->payload)->checksum)); return forwarding_send(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)); }