34 #define _________________________________________MACROS_SECTION_____________________________________________________________________________ 36 #define IsPacketTypeCorrect( PacketType ) ( (PacketType) == oC_Net_PacketType_IPv4 || (PacketType) == oC_Net_PacketType_IPv6 ) 38 #undef _________________________________________MACROS_SECTION_____________________________________________________________________________ 46 #define _________________________________________TYPES_SECTION______________________________________________________________________________ 50 oC_Tcp_OptionKind_t Kind;
55 #undef _________________________________________TYPES_SECTION______________________________________________________________________________ 62 #define _________________________________________PROTOTYPES_SECTION_________________________________________________________________________ 70 #undef _________________________________________PROTOTYPES_SECTION_________________________________________________________________________ 78 #define _________________________________________INTERFACE_SECTION__________________________________________________________________________ 101 uint16_t packetSize = HeaderSize + Size + (
sizeof(uint32_t) - (HeaderSize %
sizeof(uint32_t)));
104 oC_SaveIfFalse(
"TCP::Packet::New ", Data ==
NULL || isaddresscorrect(Data) , oC_ErrorCode_WrongAddress )
105 && oC_SaveIfFalse(
"TCP::Packet::New ", Data ==
NULL || Size > 0 , oC_ErrorCode_SizeNotCorrect )
106 && oC_SaveIfFalse(
"TCP::Packet::New ", isaddresscorrect(Source) , oC_ErrorCode_WrongAddress )
107 && oC_SaveIfFalse(
"TCP::Packet::New ", isaddresscorrect(Destination) , oC_ErrorCode_WrongAddress )
109 && oC_SaveIfFalse(
"TCP::Packet::New ",
oC_Net_IsAddressCorrect(Destination) , oC_ErrorCode_IpAddressNotCorrect )
110 && oC_SaveIfFalse(
"TCP::Packet::New ", Source->
Type == Destination->
Type , oC_ErrorCode_TypeNotCorrect )
111 && oC_SaveIfFalse(
"TCP::Packet::New ", packetSize > Size && packetSize >= HeaderSize , oC_ErrorCode_SizeTooBig )
112 && oC_SaveIfFalse(
"TCP::Packet::New ", HeaderSize >=
sizeof(
oC_Tcp_Header_t) , oC_ErrorCode_SizeNotCorrect )
117 if(oC_SaveIfFalse(
"TCP::Packet::New ", packet !=
NULL, oC_ErrorCode_AllocationError))
122 packet->IPv4.IpHeader.
DF = 0;
124 packet->IPv4.IpHeader.
IHL = 5;
129 packet->IPv4.TcpHeader.SourcePort = Source->
Port;
130 packet->IPv4.TcpHeader.DestinationPort = Destination->
Port;
131 packet->IPv4.TcpHeader.DataOffset = HeaderSize /
sizeof(uint32_t) + ( HeaderSize %
sizeof(uint32_t) != 0 ? 1 : 0 );
135 memcpy( packet->IPv4.Data, Data , Size);
148 memcpy( packet->IPv6.Data, Data , Size);
172 bool deleted =
false;
175 oC_SaveIfFalse(
"TCP::Packet::Delete ", isram(Packet) , oC_ErrorCode_OutputAddressNotInRAM )
176 && oC_SaveIfFalse(
"TCP::Packet::Delete ", isram(*Packet) , oC_ErrorCode_AddressNotInRam )
192 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
195 ErrorCondition( isram(Packet) , oC_ErrorCode_AddressNotInRam )
196 && ErrorCondition( isaddresscorrect(Data) , oC_ErrorCode_WrongAddress )
201 if( ErrorCondition( header !=
NULL, oC_ErrorCode_PacketNotCorrect ) )
206 uint32_t * tcpPacketArray = (uint32_t*)header;
208 data = &tcpPacketArray[header->DataOffset];
210 memcpy(data, Data, Size);
212 errorCode = oC_ErrorCode_None;
226 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
229 ErrorCondition( isram(Packet) , oC_ErrorCode_AddressNotInRam )
230 && ErrorCondition( isram(outData) , oC_ErrorCode_OutputAddressNotInRAM )
235 if( ErrorCondition( header !=
NULL, oC_ErrorCode_PacketNotCorrect ) )
239 uint32_t * tcpPacketArray = (uint32_t*)header;
241 data = &tcpPacketArray[header->DataOffset];
243 if(ErrorCondition( Size >= dataSize , oC_ErrorCode_OutputBufferTooSmall ))
245 memcpy(outData, data, dataSize);
246 errorCode = oC_ErrorCode_None;
287 if(oC_SaveIfFalse(
"TCP::Packet::GetDataRef " , isram(Packet) , oC_ErrorCode_AddressNotInRam ))
293 oC_SaveIfFalse(
"TCP::Packet::GetDataRef ", header !=
NULL , oC_ErrorCode_PacketNotCorrect )
294 && oC_SaveIfFalse(
"TCP::Packet::GetDataRef ", (packetSize > (header->DataOffset *
sizeof(uint32_t))) , oC_ErrorCode_SizeNotCorrect )
297 uint32_t * tcpPacketArray = (uint32_t*)header;
299 data = &tcpPacketArray[header->DataOffset];
321 if(oC_SaveIfFalse(
"Reference to the Packet", isram(Packet) , oC_ErrorCode_AddressNotInRam))
327 oC_SaveIfFalse(
"header is NULL" , header !=
NULL , oC_ErrorCode_PacketNotCorrect )
328 && oC_SaveIfFalse(
"packet size" , (packetSize >= (header->DataOffset *
sizeof(uint32_t))) , oC_ErrorCode_SizeNotCorrect )
335 kdebuglog(oC_LogType_Error,
"TCP::Packet::GetDataSize - header = %p, packetSize = %d Bytes (data offset = %d)", header, packetSize, (header->DataOffset *
sizeof(uint32_t)));
340 kdebuglog(oC_LogType_Error,
"TCP::Packet::GetDataSize - Packet = %p", Packet);
362 bool success =
false;
365 oC_SaveIfFalse(
"TCP::Packet::AddOption ", isram(Packet) , oC_ErrorCode_AddressNotInRam )
366 && oC_SaveIfFalse(
"TCP::Packet::AddOption ", OptionKind <= oC_Tcp_OptionKind_Max , oC_ErrorCode_ValueTooBig )
367 && oC_SaveIfFalse(
"TCP::Packet::AddOption ", Size == 0 || isaddresscorrect(Data) , oC_ErrorCode_DataNotAvailable )
375 oC_SaveIfFalse(
"TCP::Packet::AddOption ", header !=
NULL , oC_ErrorCode_PacketNotCorrect )
376 && oC_SaveIfFalse(
"TCP::Packet::AddOption ", (packetSize > (header->DataOffset *
sizeof(uint32_t))) , oC_ErrorCode_SizeNotCorrect )
377 && oC_SaveIfFalse(
"TCP::Packet::AddOption ", lastOption !=
NULL , oC_ErrorCode_NoSpaceAvailable )
380 lastOption->Kind = OptionKind;
381 lastOption->Length = Size + 2;
383 memcpy(lastOption->Data, Data, Size);
417 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
420 ErrorCondition( isram(Packet) , oC_ErrorCode_AddressNotInRam )
421 && ErrorCondition( OptionKind <= oC_Tcp_OptionKind_Max , oC_ErrorCode_ValueTooBig )
422 && ErrorCondition( isram(Size) , oC_ErrorCode_AddressNotInRam )
428 ErrorCondition( option !=
NULL , oC_ErrorCode_OptionNotFound )
429 && ErrorCondition( option->Length >= 2 , oC_ErrorCode_OptionNotCorrect )
430 && ErrorCondition( option->Length == 2 || isram(outData) , oC_ErrorCode_OutputAddressNotInRAM )
433 if(ErrorCondition( *Size >= (option->Length - 2) , oC_ErrorCode_OutputArrayToSmall))
435 if(option->Length > 2)
437 memcpy(outData, option->Data, option->Length - 2);
439 errorCode = oC_ErrorCode_None;
441 *Size = option->Length;
461 bool cleared =
false;
463 if(oC_SaveIfFalse(
"TCP::Packet::ClearOptions " , isram(Packet) , oC_ErrorCode_AddressNotInRam ))
471 oC_SaveIfFalse(
"TCP::Packet::ClearOption ", header !=
NULL , oC_ErrorCode_PacketNotCorrect )
472 && oC_SaveIfFalse(
"TCP::Packet::ClearOption ", (packetSize > (header->DataOffset *
sizeof(uint32_t))) , oC_ErrorCode_SizeNotCorrect )
473 && oC_SaveIfFalse(
"TCP::Packet::ClearOption ", firstOption !=
NULL , oC_ErrorCode_OptionNotFound )
476 for(uint8_t * byte = (uint8_t*)firstOption; byte < ((uint8_t*)dataRef) ; byte++)
496 uint16_t checksum = 0;
523 bool converted =
false;
539 uint8_t * array = (uint8_t*)header;
541 array[12] = ((array[12] << 4) & 0xF0) | ((array[12] >> 4) & 0x0F);
542 array[13] = ((array[13] & 0x80) >> 7)
543 | ((array[13] & 0x40) >> 5)
544 | ((array[13] & 0x20) >> 3)
545 | ((array[13] & 0x10) >> 1)
546 | ((array[13] & 0x08) << 1)
547 | ((array[13] & 0x04) << 3)
548 | ((array[13] & 0x02) << 5)
549 | ((array[13] & 0x01) << 7);
565 bool converted =
false;
581 uint8_t * array = (uint8_t*)header;
583 array[12] = ((array[12] << 4) & 0xF0) | ((array[12] >> 4) & 0x0F);
584 array[13] = ((array[13] & 0x80) >> 7)
585 | ((array[13] & 0x40) >> 5)
586 | ((array[13] & 0x20) >> 3)
587 | ((array[13] & 0x10) >> 1)
588 | ((array[13] & 0x08) << 1)
589 | ((array[13] & 0x04) << 3)
590 | ((array[13] & 0x02) << 5)
591 | ((array[13] & 0x01) << 7);
601 #undef _________________________________________INTERFACE_SECTION__________________________________________________________________________ 608 #define _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________ 621 uint8_t * array = (uint8_t*)Option;
623 nextOption = (
Option_t*)&array[Option->Length + 2];
640 if(array !=
NULL && dataRef !=
NULL)
644 if(firstOption >= ((
Option_t*)dataRef))
663 if(dataReference !=
NULL)
667 while(lastOption !=
NULL && lastOption < dataReference && lastOption->Kind != oC_Tcp_OptionKind_End)
672 if(lastOption >= dataReference)
691 if(dataReference !=
NULL)
695 while(option !=
NULL && option < dataReference && option->Kind != oC_Tcp_OptionKind_End && option->Kind != OptionKind)
701 if(option >= dataReference || option ==
NULL || option->Kind != OptionKind)
717 uint32_t checksum = 0;
719 uint16_t savedChecksum = 0;
723 savedChecksum = Packet->IPv4.TcpHeader.Checksum;
730 checksum += (sourceAddress >> 16) & 0xFFFF;
731 checksum += (sourceAddress >> 0) & 0xFFFF;
733 checksum += (destinationAddress >> 16) & 0xFFFF;
734 checksum += (destinationAddress >> 0) & 0xFFFF;
736 checksum += protocol;
740 Packet->IPv4.TcpHeader.Checksum = 0;
744 while(checksum >> 16)
746 checksum = (checksum & 0xFFFF) + (checksum >> 16);
753 Packet->IPv4.TcpHeader.Checksum = savedChecksum;
760 #undef _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________ oC_Net_Ipv4_t SourceIp
Source IP address.
static bool oC_Net_Packet_SetSize(oC_Net_Packet_t *Packet, uint16_t Size)
sets size of the packet
bool oC_Tcp_Packet_AddOption(oC_Tcp_Packet_t *Packet, oC_Tcp_OptionKind_t OptionKind, const void *Data, uint8_t Size)
Adds TCP option to the packet.
uint64_t HighPart
High 8 bytes of the IPv6 address.
bool oC_Tcp_Packet_ConvertToNetworkEndianess(oC_Tcp_Packet_t *Packet)
converts packet to network endianess
static oC_Net_Packet_t * oC_Net_Packet_New(Allocator_t Allocator, oC_Net_PacketType_t Type, void *Data, uint16_t Size)
allocates memory for a packet
static uint16_t oC_Net_ConvertUint16FromNetworkEndianess(uint16_t v)
converts uint16_t from network byte order
static Option_t * GetFirstOption(oC_Tcp_Packet_t *Packet)
returns pointer to the first TCP option inside TCP packet
uint32_t DF
Don't Fragment - packet can be fragmented or not
bool oC_Tcp_Packet_ConvertFromNetworkEndianess(oC_Tcp_Packet_t *Packet)
converts packet from network endianess
static Option_t * GetNextOption(Option_t *Option)
returns pointer to the next TCP option
uint16_t oC_Tcp_Packet_CalculateChecksum(oC_Tcp_Packet_t *Packet)
calculates checksum for TCP packet
oC_Tcp_Packet_t * oC_Tcp_Packet_New(const oC_Net_Address_t *Source, const oC_Net_Address_t *Destination, uint16_t HeaderSize, const void *Data, uint16_t Size)
Allocates memory for a TCP packet.
oC_Net_PacketType_t
stores type of the packet
static oC_Net_PacketType_t oC_Net_Packet_GetType(const oC_Net_Packet_t *Packet)
returns type of the packet
Transmission Control Protocol.
static uint16_t oC_Net_ConvertUint16ToNetworkEndianess(uint16_t v)
converts uint16_t to network byte order
bool oC_Tcp_Packet_ClearOptions(oC_Tcp_Packet_t *Packet)
clears options in the TCP packet
static Option_t * GetLastOption(oC_Tcp_Packet_t *Packet)
returns pointer to the last TCP option in the packet
uint32_t FragmentOffset
Field to identify position of fragment within original packet.
oC_Net_Ipv4_t IPv4
Address in IPv4 version.
void oC_Tcp_Packet_SetSize(oC_Tcp_Packet_t *Packet, uint16_t Size)
sets size of the TCP packet
static uint32_t oC_Net_ConvertUint32FromNetworkEndianess(uint32_t v)
converts uint32_t from network byte order
Option_t
stores options of the telnet
uint32_t IHL
4 bits, that contain Internet Header Length, which is the length of the header in multiples of 4 (num...
oC_ErrorCode_t oC_Tcp_Packet_ReadData(oC_Tcp_Packet_t *Packet, void *outData, oC_MemorySize_t Size)
reads data of the TCP packet
oC_Net_Ipv6_t IPv6
Address in IPv6 version.
static bool oC_Net_IsAddressCorrect(const oC_Net_Address_t *Address)
returns true if the given address is correct
uint64_t LowPart
Low 8 bytes of the IPv6 address.
static uint32_t oC_Net_ConvertUint32ToNetworkEndianess(uint32_t v)
converts uint32_t to network byte order
static uint16_t oC_Net_GetPacketSize(const oC_Net_Packet_t *Packet, bool WithHeader)
returns size of the packet
oC_Net_Ipv6_t Source
Source IP address.
oC_ErrorCode_t oC_Tcp_Packet_SetData(oC_Tcp_Packet_t *Packet, const void *Data, uint16_t Size)
sets data in the TCP packet
uint32_t Checksum
Header checksum - number used for errors detection.
static uint16_t CalculateChecksum(oC_Tcp_Packet_t *Packet)
calculates checksum for a TCP packet
oC_Tcp_Header_t * oC_Tcp_Packet_GetHeaderReference(oC_Tcp_Packet_t *Packet)
returns TCP header reference
static void * oC_Net_Packet_GetDataReference(oC_Net_Packet_t *Packet)
returns reference to the payload in the packet
uint32_t Protocol
Contains selected protocol (TCP/UDP/ICMP,etc).
static uint16_t oC_Net_CalculateChecksum(const void *Buffer, uint16_t Size, uint16_t InitialValue, bool ConvertEndianess, bool PrepareChecksumToSend)
static bool oC_Net_Packet_Delete(oC_Net_Packet_t **Packet)
releases memory allocated for a packet
oC_ErrorCode_t oC_Tcp_Packet_ReadOption(oC_Tcp_Packet_t *Packet, oC_Tcp_OptionKind_t OptionKind, void *outData, uint8_t *Size)
reads option from the TCP packet
oC_Net_Ipv4_t DestinationIp
Destination IP address.
void * oC_Tcp_Packet_GetDataReference(oC_Tcp_Packet_t *Packet)
returns pointer to the data inside the packet
uint16_t oC_Tcp_Packet_GetDataSize(oC_Tcp_Packet_t *Packet)
returns size of data section inside TCP packet
static Option_t * GetOption(oC_Tcp_Packet_t *Packet, oC_Tcp_OptionKind_t OptionKind)
searches for the given option in the TCP packet
bool oC_Tcp_Packet_Delete(oC_Tcp_Packet_t **Packet)
releases memory allocated for a packet
oC_Net_AddressType_t Type
Type of the address stored inside.
oC_Net_Port_t Port
Port of the address.
oC_Net_Ipv6_t Destination
Destination IP address.
#define NULL
pointer to a zero