44 #define _________________________________________MACROS_SECTION_____________________________________________________________________________ 46 #define IsConnected(C) ((C)->State == State_Established) 47 #define IsCorrect(C) (isram(C) && oC_CheckObjectControl(C,oC_ObjectId_TcpConnection,(C)->ObjectControl)) 49 #undef _________________________________________MACROS_SECTION_____________________________________________________________________________ 58 #define _________________________________________TYPES_SECTION______________________________________________________________________________ 62 State_NotConnected = 0 ,
63 State_WaitForSyn = 1 ,
64 State_NeedsToAccept = 3 ,
65 State_Connecting = 4 ,
66 State_Established = 5 ,
67 State_Disconnecting = 6 ,
72 PredefinedPacket_SYN ,
73 PredefinedPacket_SYN_ACK ,
74 PredefinedPacket_SYN_RST ,
75 PredefinedPacket_ACK ,
76 PredefinedPacket_FIN_ACK ,
77 PredefinedPacket_FIN ,
78 PredefinedPacket_NumberOfElements ,
87 #if defined(LITTLE_ENDIAN) 88 uint32_t DataOffset:4;
99 #elif defined(BIG_ENDIAN) 100 # error Structure is not defined for BIG_ENDIAN 102 # error Endianess is not defined 107 #if defined(LITTLE_ENDIAN) 110 #elif defined(BIG_ENDIAN) 111 # error Structure is not defined for BIG_ENDIAN 113 # error Endianess is not defined 118 uint32_t AddToSequence;
129 const uint8_t * ConstBuffer;
131 oC_MemorySize_t Size;
132 oC_MemorySize_t ConfirmedBytes;
135 oC_MemorySize_t ReceivedBytes;
136 oC_MemorySize_t SentBytes;
140 typedef oC_Tcp_ConnectionFinishedFunction_t ConnectionFinishedHandler_t;
150 oC_DefaultString_t Name;
154 ConnectionFinishedHandler_t ConnectionFinishedFunction;
155 void * ConnectionFinishedParameter;
160 uint32_t InitialSequenceNumber;
161 uint32_t RemoteInitialSequenceNumber;
168 oC_Time_t ConfirmationTimeout;
169 oC_Time_t ExpirationTimeout;
170 oC_Time_t ReceiveTimeout;
171 oC_Time_t SendingAcknowledgeTimeout;
172 oC_Time_t ReadSegmentTimeout;
173 oC_Time_t SaveSegmentTimeout;
174 oC_Timestamp_t ExpirationTimestamp;
184 oC_MemorySize_t RemoteWindowSize;
185 uint8_t RemoteWindowScale;
186 uint32_t NextSequenceNumberToSend;
187 uint32_t LastConfirmedSequenceNumber;
192 uint8_t LocalWindowScale;
198 uint32_t NextSequenceNumberToReceive;
200 bool AcknowledgePacketShouldBeSend;
201 bool FinishConnectionPacketShouldBeSend;
202 oC_Queue_t ReceiveQueue;
207 oC_Timestamp_t LastMeasureTimestamp;
208 oC_BaudRate_t BaudRate;
209 oC_MemorySize_t SentBytesFromLastMeasure;
213 #undef _________________________________________TYPES_SECTION______________________________________________________________________________ 220 #define _________________________________________PROTOTYPES_SECTION_________________________________________________________________________ 229 #undef _________________________________________PROTOTYPES_SECTION_________________________________________________________________________ 236 #define _________________________________________GLOBALS_SECTION____________________________________________________________________________ 238 static const PacketFlags_t PredefinedPacketFlags[PredefinedPacket_NumberOfElements] = {
239 [PredefinedPacket_SYN ] = { .Name =
"SYN" , .AddToSequence = 1 , .DataOffset = 5, .SYN = 1 } ,
240 [PredefinedPacket_SYN_ACK] = { .Name =
"SYN ACK" , .AddToSequence = 1 , .DataOffset = 5, .SYN = 1 , .ACK = 1 } ,
241 [PredefinedPacket_SYN_RST] = { .Name =
"SYN RST" , .AddToSequence = 1 , .DataOffset = 5, .SYN = 1 , .RST = 1 } ,
242 [PredefinedPacket_ACK ] = { .Name =
"ACK" , .AddToSequence = 0 , .DataOffset = 5, .ACK = 1 } ,
243 [PredefinedPacket_FIN_ACK] = { .Name =
"FIN ACK" , .AddToSequence = 1 , .DataOffset = 5, .FIN = 1 , .ACK = 1 } ,
244 [PredefinedPacket_FIN ] = { .Name =
"FIN" , .AddToSequence = 1 , .DataOffset = 5, .FIN = 1 , .ACK = 1 } ,
247 #undef _________________________________________GLOBALS_SECTION____________________________________________________________________________ 256 #define _________________________________________FUNCTIONS_SECTION__________________________________________________________________________ 275 oC_SaveIfFalse(
"Config" , isaddresscorrect(Config) , oC_ErrorCode_WrongConfigAddress )
276 && oC_SaveIfFalse(
"Local " ,
oC_Net_IsAddressCorrect(&Config->LocalAddress) , oC_ErrorCode_IpAddressNotCorrect )
277 && oC_SaveIfFalse(
"Remote " ,
oC_Net_IsAddressCorrect(&Config->RemoteAddress), oC_ErrorCode_IpAddressNotCorrect )
278 && oC_SaveIfFalse(
"Local Port" , Config->LocalAddress.
Port !=
oC_Tcp_Port_Empty , oC_ErrorCode_PortNotCorrect )
279 && oC_SaveIfFalse(
"Confirmation", Config->ConfirmationTimeout >= 0 , oC_ErrorCode_TimeNotCorrect )
280 && oC_SaveIfFalse(
"Expiration" , Config->ExpirationTimeout >= 0 , oC_ErrorCode_TimeNotCorrect )
281 && oC_SaveIfFalse(
"ACK Time" , Config->SendingAcknowledgeTimeout >= 0 , oC_ErrorCode_TimeNotCorrect )
282 && oC_SaveIfFalse(
"Read Segment", Config->ReadSegmentTimeout >= 0 , oC_ErrorCode_TimeNotCorrect )
283 && oC_SaveIfFalse(
"Packet Size" , Config->PacketSize > 0 , oC_ErrorCode_SizeNotCorrect )
286 connection = malloc(
sizeof(
struct Tcp_Connection_t), AllocationFlags_ZeroFill );
288 if( oC_SaveIfFalse(
"Main Object", connection !=
NULL, oC_ErrorCode_AllocationError ) )
290 oC_MemorySize_t stackSize = oC_DynamicConfig_GetValue(Tcp,StackSize);
293 sprintf(connection->Name,
"TCP:%08x", Config->InitialSequenceNumber);
296 connection->State = State_NotConnected;
297 connection->Process = getcurprocess();
298 connection->ReceiveThread = oC_Thread_New( 0, stackSize , connection->Process, connection->Name, (oC_Thread_Function_t)ReceiveThread, connection);
299 connection->InitialSequenceNumber = Config->InitialSequenceNumber;
300 connection->RemoteInitialSequenceNumber = Config->InitialAcknowledgeNumber;
301 connection->ConnectionFinishedFunction = Config->ConnectionFinishedFunction;
302 connection->ConnectionFinishedParameter = Config->ConnectionFinishedParameter;
308 connection->LocalAddress.
Type = Config->LocalAddress.
Type;
309 connection->LocalAddress.
IPv4 = Config->LocalAddress.
IPv4;
312 connection->LocalAddress.
Port = Config->LocalAddress.
Port;
315 connection->RemoteAddress.
Type = Config->RemoteAddress.
Type;
316 connection->RemoteAddress.
IPv4 = Config->RemoteAddress.
IPv4;
319 connection->RemoteAddress.
Port = Config->RemoteAddress.
Port;
324 connection->ConfirmationTimeout = Config->ConfirmationTimeout;
325 connection->ExpirationTimeout = Config->ExpirationTimeout;
326 connection->SendingAcknowledgeTimeout = Config->SendingAcknowledgeTimeout;
327 connection->ReadSegmentTimeout = Config->ReadSegmentTimeout;
328 connection->ReceiveTimeout = Config->ReceiveTimeout;
329 connection->ExpirationTimestamp = Config->ExpirationTimeout + gettimestamp();
334 connection->ReadyForSendingMutex = oC_Mutex_New(oC_Mutex_Type_Normal,allocator,0);
335 connection->SendingSegmentMutex = oC_Mutex_New(oC_Mutex_Type_Normal,allocator,0);
336 connection->RemoteWindowSizeChangedEvent = oC_Event_New(0,allocator,0);
338 connection->PacketSize = Config->PacketSize;
339 connection->RemoteWindowSize = 0;
340 connection->RemoteWindowScale = 0;
341 connection->NextSequenceNumberToSend = Config->InitialSequenceNumber;
346 connection->LocalWindowScale = Config->LocalWindowScale;
347 connection->SegmentToReceive.Size = Config->LocalWindowSize << Config->LocalWindowScale;
348 connection->SegmentToReceive.Buffer = malloc( connection->SegmentToReceive.Size, 0 );
349 connection->SegmentToReceive.ReceivedBytes = 0;
350 connection->SegmentToReceive.ConfirmedBytes = 0;
351 connection->LastReceivedPacket = malloc(
sizeof(
oC_Tcp_Packet_t), AllocationFlags_ZeroFill );
352 connection->ReadyForReceivingMutex = oC_Mutex_New(oC_Mutex_Type_Normal, allocator, 0);
353 connection->NewPacketReceivedSemaphore = oC_Semaphore_New(oC_Semaphore_Type_Binary, 0, allocator, 0);
354 connection->AcknowledgeReceivedEvent = oC_Event_New(0,allocator,0);
355 connection->NextSequenceNumberToReceive = Config->InitialAcknowledgeNumber;
356 connection->ReceivedPacketFlags.LowByte = 0;
357 connection->ReceivedPacketFlags.HighByte = 0;
358 connection->AcknowledgePacketShouldBeSend =
false;
359 connection->FinishConnectionPacketShouldBeSend =
false;
360 connection->ReceiveQueue =
oC_Queue_New(allocator,connection->SegmentToReceive.Size);
365 connection->LastMeasureTimestamp = gettimestamp();
366 connection->BaudRate = 0;
367 connection->SentBytesFromLastMeasure = 0;
370 oC_SaveIfFalse(
"Thread" , oC_Thread_IsCorrect (connection->ReceiveThread) , oC_ErrorCode_AllocationError )
371 && oC_SaveIfFalse(
"Mutex" , oC_Mutex_IsCorrect (connection->ReadyForSendingMutex) , oC_ErrorCode_AllocationError )
372 && oC_SaveIfFalse(
"Mutex" , oC_Mutex_IsCorrect (connection->SendingSegmentMutex) , oC_ErrorCode_AllocationError )
373 && oC_SaveIfFalse(
"Event" , oC_Event_IsCorrect (connection->RemoteWindowSizeChangedEvent) , oC_ErrorCode_AllocationError )
374 && oC_SaveIfFalse(
"Packet" , connection->PacketToSend !=
NULL , oC_ErrorCode_AllocationError )
375 && oC_SaveIfFalse(
"Packet" , connection->LastReceivedPacket !=
NULL , oC_ErrorCode_AllocationError )
376 && oC_SaveIfFalse(
"Buffer" , connection->SegmentToReceive.Buffer !=
NULL , oC_ErrorCode_AllocationError )
377 && oC_SaveIfFalse(
"Mutex" , oC_Mutex_IsCorrect (connection->ReadyForReceivingMutex) , oC_ErrorCode_AllocationError )
378 && oC_SaveIfFalse(
"Semaphore" , oC_Semaphore_IsCorrect (connection->NewPacketReceivedSemaphore) , oC_ErrorCode_AllocationError )
379 && oC_SaveIfFalse(
"Event" , oC_Event_IsCorrect (connection->AcknowledgeReceivedEvent) , oC_ErrorCode_AllocationError )
380 && oC_SaveIfFalse(
"Queue" , oC_Queue_IsCorrect (connection->ReceiveQueue) , oC_ErrorCode_AllocationError )
381 && oC_SaveIfFalse(
"Run Thread" , oC_Thread_Run(connection->ReceiveThread) , oC_ErrorCode_CannotRunThread )
384 tcplog(oC_LogType_Track,
"0x%08X: New connection allocated", Config->InitialSequenceNumber);
388 connection->ObjectControl = 0;
389 oC_Thread_Delete (&connection->ReceiveThread);
390 oC_Mutex_Delete (&connection->ReadyForSendingMutex , 0);
391 oC_Mutex_Delete (&connection->SendingSegmentMutex , 0);
392 oC_Event_Delete (&connection->RemoteWindowSizeChangedEvent,0);
394 free(connection->LastReceivedPacket,0);
395 free(connection->SegmentToReceive.Buffer,0);
396 oC_Mutex_Delete (&connection->ReadyForReceivingMutex,0);
397 oC_Semaphore_Delete (&connection->NewPacketReceivedSemaphore,0);
398 oC_Event_Delete (&connection->AcknowledgeReceivedEvent,0);
399 oC_Queue_Delete (&connection->ReceiveQueue);
413 bool deleted =
false;
416 oC_SaveIfFalse(
"Connection", isram(Connection) , oC_ErrorCode_AddressNotInRam )
417 && oC_SaveIfFalse(
"Connection", IsCorrect(*Connection) , oC_ErrorCode_ObjectNotCorrect )
418 && oC_SaveIfFalse(
"Timeout" , Timeout >= 0 , oC_ErrorCode_TimeNotCorrect )
421 oC_IntMan_EnterCriticalSection();
424 connection->ObjectControl = 0;
425 bool deletedReceiveThread = oC_Thread_Delete (&connection->ReceiveThread );
426 bool deletedReadyForSendingMutex = oC_Mutex_Delete (&connection->ReadyForSendingMutex , 0);
427 bool deletedSendingSegmentMutex = oC_Mutex_Delete (&connection->SendingSegmentMutex , 0);
428 bool deletedRemoteWindowSizeChangedEvent = oC_Event_Delete (&connection->RemoteWindowSizeChangedEvent , 0);
430 bool deletedBuffer = free(connection->SegmentToReceive.Buffer , 0);
431 bool deletedReceiveBuffer = free(connection->LastReceivedPacket , 0);
432 bool deletedReadyForReceivingMutex = oC_Mutex_Delete (&connection->ReadyForReceivingMutex , 0);
433 bool deletedNewPacketReceivedSemaphore = oC_Semaphore_Delete (&connection->NewPacketReceivedSemaphore , 0);
434 bool deletedAcknowledgeReceivedEvent = oC_Event_Delete (&connection->AcknowledgeReceivedEvent , 0);
435 bool deletedReceiveQueue = oC_Queue_Delete (&connection->ReceiveQueue);
436 bool deletedObject = free(connection,0);
439 oC_SaveIfFalse(
"ReceiveThread ", deletedReceiveThread , oC_ErrorCode_ReleaseError )
440 && oC_SaveIfFalse(
"ReadyForSendingMutex ", deletedReadyForSendingMutex , oC_ErrorCode_ReleaseError )
441 && oC_SaveIfFalse(
"SendingSegmentMutex ", deletedSendingSegmentMutex , oC_ErrorCode_ReleaseError )
442 && oC_SaveIfFalse(
"RemoteWindowSizeChangedEvent ", deletedRemoteWindowSizeChangedEvent , oC_ErrorCode_ReleaseError )
443 && oC_SaveIfFalse(
"PacketToSend ", deletedPacketToSend , oC_ErrorCode_ReleaseError )
444 && oC_SaveIfFalse(
"PacketToReceive ", deletedReceiveBuffer , oC_ErrorCode_ReleaseError )
445 && oC_SaveIfFalse(
"Buffer ", deletedBuffer , oC_ErrorCode_ReleaseError )
446 && oC_SaveIfFalse(
"ReadyForReceivingMutex ", deletedReadyForReceivingMutex , oC_ErrorCode_ReleaseError )
447 && oC_SaveIfFalse(
"NewPacketReceivedSemaphore ", deletedNewPacketReceivedSemaphore , oC_ErrorCode_ReleaseError )
448 && oC_SaveIfFalse(
"AcknowledgeReceivedEvent ", deletedAcknowledgeReceivedEvent , oC_ErrorCode_ReleaseError )
449 && oC_SaveIfFalse(
"ReceiveQueue" , deletedReceiveQueue , oC_ErrorCode_ReleaseError )
450 && oC_SaveIfFalse(
"Object" , deletedObject , oC_ErrorCode_ReleaseError )
456 oC_IntMan_ExitCriticalSection();
466 bool theSame =
false;
469 oC_SaveIfFalse(
"Connection A", IsCorrect(ConnectionA) , oC_ErrorCode_ObjectNotCorrect )
470 && oC_SaveIfFalse(
"Connection B", IsCorrect(ConnectionB) , oC_ErrorCode_ObjectNotCorrect )
473 theSame = ConnectionA->InitialSequenceNumber == ConnectionB->InitialSequenceNumber
484 return isram(Connection) &&
oC_CheckObjectControl(Connection,oC_ObjectId_TcpConnection,Connection->ObjectControl);
491 return IsCorrect(Connection) && IsConnected(Connection);
500 if(oC_SaveIfFalse(
"Connection", IsCorrect(Connection), oC_ErrorCode_ObjectNotCorrect))
502 process = Connection->Process;
512 const char * name =
"incorrect connection";
514 if(oC_SaveIfFalse(
"connection", IsCorrect(Connection), oC_ErrorCode_ObjectNotCorrect))
516 name = Connection->Name;
524 oC_ErrorCode_t oC_Tcp_Connection_Connect(
oC_Tcp_Connection_t Connection , oC_Time_t Timeout )
526 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
527 oC_Timestamp_t endTimestamp = gettimestamp() + Timeout;
530 ErrorCondition( IsCorrect(Connection) , oC_ErrorCode_ObjectNotCorrect )
531 && ErrorCondition( Timeout >= 0 , oC_ErrorCode_TimeNotCorrect )
532 && ErrorCondition( !IsConnected(Connection) , oC_ErrorCode_AlreadyConnected )
535 Connection->State = State_Connecting;
537 while(ErrorCode(
SendPredefinedPacket(Connection, PredefinedPacket_SYN, gettimeout(endTimestamp)) ))
539 if( ErrorCode(
WaitForPredefinedPacket(Connection, PredefinedPacket_SYN_ACK, Connection->ConfirmationTimeout) ) )
541 if( ErrorCode(
SendPredefinedPacket(Connection, PredefinedPacket_ACK , gettimeout(endTimestamp)) ) )
543 Connection->State = State_Established;
544 errorCode = oC_ErrorCode_None;
548 else if(errorCode != oC_ErrorCode_Timeout)
560 oC_ErrorCode_t oC_Tcp_Connection_Disconnect(
oC_Tcp_Connection_t Connection , oC_Time_t Timeout )
562 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
563 oC_Timestamp_t endTimestamp = gettimestamp() + Timeout;
566 ErrorCondition( IsCorrect(Connection) , oC_ErrorCode_ObjectNotCorrect )
567 && ErrorCondition( Timeout >= 0 , oC_ErrorCode_TimeNotCorrect )
568 && ErrorCondition( IsConnected(Connection) , oC_ErrorCode_NotConnected )
571 tcplog( oC_LogType_Track,
"%s: Sending disconnect packets...", Connection->Name );
573 Connection->State = State_Disconnecting;
576 ErrorCode(
SendPredefinedPacket(Connection, PredefinedPacket_FIN_ACK, gettimeout(endTimestamp)) )
577 && ErrorCode(
SendPredefinedPacket(Connection, PredefinedPacket_ACK , gettimeout(endTimestamp)) )
580 errorCode = oC_ErrorCode_None;
589 oC_ErrorCode_t oC_Tcp_Connection_WaitForConnection (
oC_Tcp_Connection_t Connection , oC_Time_t Timeout )
591 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
594 ErrorCondition( IsCorrect(Connection) , oC_ErrorCode_ObjectNotCorrect )
595 && ErrorCondition( Timeout >= 0 , oC_ErrorCode_TimeNotCorrect )
596 && ErrorCondition( !IsConnected(Connection) , oC_ErrorCode_AlreadyConnected )
599 Connection->State = State_WaitForSyn;
605 Connection->State = State_NeedsToAccept;
606 errorCode = oC_ErrorCode_None;
615 oC_ErrorCode_t oC_Tcp_Connection_Accept(
oC_Tcp_Connection_t Connection , oC_Time_t Timeout )
617 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
618 oC_Timestamp_t endTimestamp = gettimestamp() + Timeout;
621 ErrorCondition( IsCorrect(Connection) , oC_ErrorCode_ObjectNotCorrect )
622 && ErrorCondition( Timeout >= 0 , oC_ErrorCode_TimeNotCorrect )
623 && ErrorCondition( Connection->State == State_NeedsToAccept , oC_ErrorCode_ConnectionNotRequested )
626 while(ErrorCode(
SendPredefinedPacket(Connection, PredefinedPacket_SYN_ACK, gettimeout(endTimestamp)) ))
630 tcplog( oC_LogType_Info,
"%s: Connection has been accepted", Connection->Name );
631 Connection->State = State_Established;
632 errorCode = oC_ErrorCode_None;
635 else if(errorCode != oC_ErrorCode_Timeout)
637 Connection->NextSequenceNumberToReceive = Connection->RemoteInitialSequenceNumber + 1;
638 Connection->NextSequenceNumberToSend = Connection->InitialSequenceNumber;
649 oC_ErrorCode_t oC_Tcp_Connection_Reject(
oC_Tcp_Connection_t Connection , oC_Time_t Timeout )
651 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
652 oC_Timestamp_t endTimestamp = gettimestamp() + Timeout;
655 ErrorCondition( IsCorrect(Connection) , oC_ErrorCode_ObjectNotCorrect )
656 && ErrorCondition( Timeout >= 0 , oC_ErrorCode_TimeNotCorrect )
657 && ErrorCondition( Connection->State == State_NeedsToAccept , oC_ErrorCode_ConnectionNotRequested )
660 if( ErrorCode(
SendPredefinedPacket(Connection, PredefinedPacket_SYN_RST, gettimeout(endTimestamp)) ) )
662 Connection->State = State_NotConnected;
663 errorCode = oC_ErrorCode_None;
674 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
677 ErrorCondition( IsCorrect(Connection) , oC_ErrorCode_ObjectNotCorrect )
678 && ErrorCondition( IsConnected(Connection) , oC_ErrorCode_NotConnected )
679 && ErrorCondition( isram(outAddress) , oC_ErrorCode_OutputAddressNotInRAM )
682 memcpy(outAddress, &Connection->RemoteAddress,
sizeof(*outAddress));
683 errorCode = oC_ErrorCode_None;
693 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
696 ErrorCondition( IsCorrect(Connection) , oC_ErrorCode_ObjectNotCorrect )
697 && ErrorCondition( IsConnected(Connection) , oC_ErrorCode_NotConnected )
698 && ErrorCondition( isram(outAddress) , oC_ErrorCode_OutputAddressNotInRAM )
701 memcpy(outAddress, &Connection->LocalAddress,
sizeof(*outAddress));
702 errorCode = oC_ErrorCode_None;
710 oC_ErrorCode_t oC_Tcp_Connection_Send(
oC_Tcp_Connection_t Connection ,
const void * Buffer , oC_MemorySize_t Size, oC_Time_t Timeout )
712 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
715 ErrorCondition( IsCorrect(Connection) , oC_ErrorCode_ObjectNotCorrect )
716 && ErrorCondition( isaddresscorrect(Buffer) , oC_ErrorCode_WrongAddress )
717 && ErrorCondition( Size > 0 , oC_ErrorCode_SizeNotCorrect )
718 && ErrorCondition( Timeout >= 0 , oC_ErrorCode_TimeNotCorrect )
719 && ErrorCondition( IsConnected(Connection) , oC_ErrorCode_NotConnected )
723 .ConstBuffer = Buffer ,
726 errorCode =
SendSegment(Connection,&segment,Timeout);
734 oC_ErrorCode_t oC_Tcp_Connection_Receive(
oC_Tcp_Connection_t Connection,
void * outBuffer, oC_MemorySize_t Size , oC_Time_t Timeout )
736 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
737 oC_Timestamp_t endTimestamp = gettimestamp() + Timeout;
740 ErrorCondition( IsCorrect(Connection) , oC_ErrorCode_ObjectNotCorrect )
741 && ErrorCondition( isram(outBuffer) , oC_ErrorCode_OutputAddressNotInRAM )
742 && ErrorCondition( Size > 0 , oC_ErrorCode_SizeNotCorrect )
743 && ErrorCondition( Timeout >= 0 , oC_ErrorCode_TimeNotCorrect )
744 && ErrorCondition( IsConnected(Connection) , oC_ErrorCode_NotConnected )
747 if( ErrorCondition( oC_Mutex_Take( Connection->ReadyForReceivingMutex, gettimeout(endTimestamp) ), oC_ErrorCode_Timeout ) )
749 oC_MemorySize_t segmentSize = 0;
751 if( ErrorCondition( oC_Queue_Get(Connection->ReceiveQueue,&segmentSize,
sizeof(oC_MemorySize_t), gettimeout(endTimestamp)), oC_ErrorCode_Timeout ) )
753 oC_MemorySize_t sizeToCopy = oC_MIN(Size,segmentSize);
754 oC_MemorySize_t sizeToDrop = segmentSize - sizeToCopy;
757 ErrorCondition( oC_Queue_Get(Connection->ReceiveQueue,outBuffer,sizeToCopy,gettimeout(endTimestamp)) , oC_ErrorCode_Timeout )
758 && ErrorCondition( sizeToDrop == 0 || oC_Queue_Get(Connection->ReceiveQueue,
NULL ,sizeToDrop,gettimeout(endTimestamp)) , oC_ErrorCode_Timeout )
763 tcplog(oC_LogType_Warning,
"%s: Output buffer is too small. Dropping %d bytes", Connection->Name, sizeToDrop);
766 tcplog(oC_LogType_Track,
"%s: %d bytes received", Connection->Name, sizeToCopy);
767 errorCode = oC_ErrorCode_None;
770 oC_Mutex_Give( Connection->ReadyForReceivingMutex );
777 #undef _________________________________________FUNCTIONS_SECTION__________________________________________________________________________ 784 #define _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________ 793 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
796 ErrorCondition( IsCorrect(Connection) , oC_ErrorCode_ObjectNotCorrect )
797 && ErrorCondition( isram(Packet) , oC_ErrorCode_AddressNotInRam )
804 if( ErrorCondition( header !=
NULL, oC_ErrorCode_PacketNotCorrect ) )
806 oC_MemorySize_t localWindowSize = Connection->SegmentToReceive.Size - Connection->SegmentToReceive.ReceivedBytes;
807 header->SourcePort = Connection->LocalAddress.
Port;
808 header->DestinationPort = Connection->RemoteAddress.
Port;
809 header->SequenceNumber = Connection->NextSequenceNumberToSend;
810 header->AcknowledgmentNumber = Connection->NextSequenceNumberToReceive;
811 header->DataOffset = Flags->DataOffset;
812 header->Reserved = 0;
813 header->Flags = Flags->HighByte;
814 header->NS = Flags->NS;
815 header->WindowSize = localWindowSize >> Connection->LocalWindowScale;
816 header->UrgentPointer = 0;
818 if(Data !=
NULL && Size !=
NULL && (*Size) > 0)
820 oC_IntMan_EnterCriticalSection();
821 uint16_t sizeToSend = oC_MIN(Connection->PacketSize,*Size);
822 oC_MemorySize_t leftBytesToSend = 0;
824 sizeToSend = oC_MIN(sizeToSend,Connection->RemoteWindowSize);
825 leftBytesToSend = *Size - sizeToSend;
831 if(leftBytesToSend == 0)
840 oC_IntMan_ExitCriticalSection();
848 errorCode = oC_ErrorCode_None;
862 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
864 oC_Timestamp_t endTimestamp = gettimestamp() + Timeout;
866 while( dataSize > Connection->RemoteWindowSize )
869 Connection->RemoteWindowSize,
870 oC_Event_StateMask_DifferentThan,
871 gettimeout(endTimestamp)
879 ErrorCondition( dataSize <= Connection->RemoteWindowSize , oC_ErrorCode_NoSpaceOnRemoteServer )
885 oC_IntMan_EnterCriticalSection();
887 Connection->NextSequenceNumberToSend += dataSize;
888 Connection->RemoteWindowSize -= dataSize;
890 tcplog( oC_LogType_Track,
"%s: Packet SEQ 0x%08X with %d bytes of data has been send", Connection->Name, Packet->IPv4.TcpHeader.SequenceNumber , dataSize);
892 errorCode = oC_ErrorCode_None;
894 oC_IntMan_ExitCriticalSection();
907 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
908 oC_Timestamp_t endTimestamp = gettimestamp() + Timeout;
911 ErrorCondition( Timeout >= 0 , oC_ErrorCode_TimeNotCorrect )
912 && ErrorCondition( oC_Mutex_Take(Connection->ReadyForSendingMutex,gettimeout(endTimestamp)) , oC_ErrorCode_Timeout )
917 && ErrorCode(
SendPacket( Connection, Packet, gettimeout(endTimestamp) ) )
920 Connection->NextSequenceNumberToSend += Flags->AddToSequence;
921 if(outSequenceNumber !=
NULL)
923 *outSequenceNumber = Connection->NextSequenceNumberToSend;
925 errorCode = oC_ErrorCode_None;
927 oC_Mutex_Give(Connection->ReadyForSendingMutex);
940 bool packetForUs =
false;
946 if(connection->State == State_WaitForSyn)
948 packetForUs = header->NetworkOrder.SYN == 1 && header->NetworkOrder.ACK == 0;
950 else if(header->NetworkOrder.ACK == 1 && header->NetworkOrder.SYN == 0)
954 packetForUs = sequenceNumber == connection->NextSequenceNumberToReceive;
968 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
975 errorCode = oC_ErrorCode_None;
988 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
990 oC_STATIC_ASSERT(
sizeof(PredefinedPacketFlags) <= (
sizeof(
PacketFlags_t) * 10),
991 "Size of 'PredefinedPacketFlags' array is too big! (Have you changed the PredefinedPacket_t definition? - you should not do it!)" );
994 ErrorCondition( Timeout >= 0 , oC_ErrorCode_TimeNotCorrect )
995 && ErrorCondition( PredefinedPacket < PredefinedPacket_NumberOfElements , oC_ErrorCode_InternalDataAreDamaged )
1011 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1012 oC_Timestamp_t endTimestamp = gettimestamp() + Timeout;
1015 ErrorCondition( IsCorrect(Connection) , oC_ErrorCode_ObjectNotCorrect )
1016 && ErrorCondition( PredefinedPacket < PredefinedPacket_NumberOfElements , oC_ErrorCode_InternalDataAreDamaged )
1017 && ErrorCondition( Timeout >= 0 , oC_ErrorCode_TimeNotCorrect )
1020 while( ErrorCondition(oC_Semaphore_Take(Connection->NewPacketReceivedSemaphore,gettimeout(endTimestamp)), oC_ErrorCode_Timeout) )
1022 if(
oC_Bits_AreBitsSetU8( Connection->ReceivedPacketFlags.HighByte ,PredefinedPacketFlags[PredefinedPacket].HighByte ))
1024 Connection->NextSequenceNumberToReceive += PredefinedPacketFlags[PredefinedPacket].AddToSequence;
1025 errorCode = oC_ErrorCode_None;
1041 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1042 oC_Timestamp_t endTimestamp = gettimestamp() + Timeout;
1044 ErrorCondition( IsCorrect(Connection) , oC_ErrorCode_ObjectNotCorrect )
1045 && ErrorCondition( Timeout >= 0 , oC_ErrorCode_TimeNotCorrect )
1048 if( ErrorCondition(oC_Event_WaitForValue(Connection->AcknowledgeReceivedEvent, AcknowledgeNumber,oC_Event_CompareType_GreaterOrEqual,gettimeout(endTimestamp)), oC_ErrorCode_Timeout) )
1050 errorCode = oC_ErrorCode_None;
1064 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1067 ErrorCondition( IsCorrect(Connection) , oC_ErrorCode_ObjectNotCorrect )
1068 && ErrorCondition( isram(Packet) , oC_ErrorCode_AddressNotInRam )
1071 uint8_t optionSize =
sizeof(Connection->RemoteWindowScale);
1072 oC_DefaultString_t tempString = {0};
1080 Connection->LocalAddress.
IPv4 = Packet->IPv4.IpHeader.DestinationIp;
1081 Connection->RemoteAddress.
IPv4 = Packet->IPv4.IpHeader.SourceIp;
1084 Connection->RemoteAddress.
Port = Packet->IPv4.TcpHeader.SourcePort;
1085 Connection->LocalAddress.
Port = Packet->IPv4.TcpHeader.DestinationPort;
1086 Connection->NextSequenceNumberToReceive = Packet->IPv4.TcpHeader.SequenceNumber;
1087 Connection->RemoteWindowSize = Packet->IPv4.TcpHeader.WindowSize << Connection->RemoteWindowScale;
1088 Connection->RemoteInitialSequenceNumber = Packet->IPv4.TcpHeader.SequenceNumber;
1090 Connection->ReceivedPacketFlags.DataOffset = Packet->IPv4.TcpHeader.DataOffset;
1091 Connection->ReceivedPacketFlags.NS = Packet->IPv4.TcpHeader.NS;
1092 Connection->ReceivedPacketFlags.HighByte = Packet->IPv4.TcpHeader.Flags;
1095 sprintf(Connection->Name,
"%s:%x", tempString, Connection->InitialSequenceNumber);
1097 errorCode = oC_ErrorCode_None;
1104 errorCode = oC_ErrorCode_NotImplemented;
1108 errorCode = oC_ErrorCode_PacketNotCorrect;
1122 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1123 oC_Timestamp_t endTimestamp = gettimestamp() + Timeout;
1124 uint8_t * dataToSend =
NULL;
1125 oC_MemorySize_t dataToSendSize = 0;
1126 uint32_t sequenceNumberToConfirm = 0;
1128 if( ErrorCondition( oC_Mutex_Take(Connection->SendingSegmentMutex, gettimeout(endTimestamp)), oC_ErrorCode_Timeout ) )
1130 Segment->ConfirmedBytes = 0;
1131 Segment->SentBytes = 0;
1133 tcplog( oC_LogType_Track,
"%s: The thread %s has entered to the function", Connection->Name, oC_Thread_GetName(getcurthread()) );
1135 while(gettimestamp() <= endTimestamp)
1137 dataToSend = &Segment->Buffer[Segment->SentBytes];
1138 dataToSendSize = Segment->Size - Segment->SentBytes;
1139 errorCode =
PrepareAndSendPacket(Connection,Connection->PacketToSend,&PredefinedPacketFlags[PredefinedPacket_ACK],dataToSend,&dataToSendSize,&sequenceNumberToConfirm,gettimeout(endTimestamp));
1141 if(oC_ErrorOccur(errorCode))
1143 tcplog( oC_LogType_Error,
"%s: Cannot send packet - %s", Connection->Name,
oC_GetErrorString(errorCode) );
1147 tcplog( oC_LogType_Track,
"%s: Waiting for acknowledge of SEQ 0x%08X", Connection->Name , sequenceNumberToConfirm);
1149 if( ErrorCode(
WaitForAcknowledge(Connection, sequenceNumberToConfirm, Connection->ConfirmationTimeout) ) )
1151 tcplog( oC_LogType_GoodNews,
"%s: SEQ 0x%08X has beeen confirmed", Connection->Name, sequenceNumberToConfirm );
1152 Segment->SentBytes += dataToSendSize;
1153 Connection->SentBytesFromLastMeasure += dataToSendSize;
1155 if(Segment->SentBytes >= Segment->Size)
1157 errorCode = oC_ErrorCode_None;
1163 tcplog( oC_LogType_Error,
"%s: Packet SEQ 0x%08X not confirmed, sending once again", Connection->Name, Connection->NextSequenceNumberToSend );
1164 Connection->NextSequenceNumberToSend = Connection->LastConfirmedSequenceNumber;
1165 if(errorCode != oC_ErrorCode_Timeout)
1172 tcplog( oC_LogType_Track,
"%s: The thread %s has exit from the function", Connection->Name, oC_Thread_GetName(getcurthread()) );
1174 oC_Mutex_Give(Connection->SendingSegmentMutex);
1187 oC_Timestamp_t endTimestamp = gettimestamp() + Connection->SaveSegmentTimeout;
1188 void * buffer = Connection->SegmentToReceive.Buffer;
1189 oC_MemorySize_t size = Connection->SegmentToReceive.ReceivedBytes;
1190 oC_Queue_t queue = Connection->ReceiveQueue;
1194 oC_SaveIfFalse(
"Size of segment", oC_Queue_Put(queue, &size ,
sizeof(size), gettimeout(endTimestamp)), oC_ErrorCode_Timeout )
1195 && oC_SaveIfFalse(
"Data of segment", oC_Queue_Put(queue, buffer, size , gettimeout(endTimestamp)), oC_ErrorCode_Timeout )
1198 tcplog( oC_LogType_GoodNews,
"%s: %d bytes of data have been put to the queue", Connection->Name, size );
1202 tcplog( oC_LogType_Error,
"%s: Cannot put %d bytes of data into the queue", Connection->Name, size );
1204 Connection->SegmentToReceive.ReceivedBytes = 0;
1205 Connection->SegmentToReceive.ConfirmedBytes = 0;
1215 oC_IntMan_EnterCriticalSection();
1219 if(oC_SaveIfFalse(
"Header", header !=
NULL, oC_ErrorCode_PacketNotCorrect))
1224 if(receivedDataSize > 0 && data !=
NULL)
1226 tcplog( oC_LogType_Track,
"%s: %d bytes of data has been received '%s'", Connection->Name, receivedDataSize, (
char*)data );
1227 if(oC_SaveIfFalse(
"Receive buffer is full", Connection->SegmentToReceive.ReceivedBytes < Connection->SegmentToReceive.Size, oC_ErrorCode_NoSpaceAvailable))
1229 uint8_t * buffer = &Connection->SegmentToReceive.Buffer[ Connection->SegmentToReceive.ReceivedBytes ];
1230 oC_MemorySize_t leftSize = Connection->SegmentToReceive.Size - Connection->SegmentToReceive.ReceivedBytes;
1231 oC_MemorySize_t copySize = oC_MIN(leftSize,receivedDataSize);
1233 memcpy(buffer, data, copySize);
1235 Connection->SegmentToReceive.ConfirmedBytes += copySize;
1236 Connection->SegmentToReceive.ReceivedBytes += receivedDataSize;
1237 Connection->AcknowledgePacketShouldBeSend =
true;
1240 if(header->PSH == 1)
1247 tcplog( oC_LogType_Track,
"%s: ACK has been received 0x%08X (without DATA)", Connection->Name, header->AcknowledgmentNumber );
1250 Connection->LastConfirmedSequenceNumber = header->AcknowledgmentNumber;
1251 Connection->NextSequenceNumberToReceive = header->SequenceNumber + receivedDataSize;
1252 Connection->RemoteWindowSize = header->WindowSize << Connection->RemoteWindowScale;
1253 Connection->ReceivedPacketFlags.DataOffset = header->DataOffset;
1254 Connection->ReceivedPacketFlags.NS = header->NS;
1255 Connection->ReceivedPacketFlags.HighByte = header->Flags;
1257 if(header->SYN == 1 && header->ACK == 0)
1261 if((header->FIN == 1 || header->RST == 1) && Connection->State != State_Disconnecting)
1263 Connection->FinishConnectionPacketShouldBeSend =
true;
1264 Connection->State = State_Disconnecting;
1267 oC_Event_SetState(Connection->RemoteWindowSizeChangedEvent, Connection->RemoteWindowSize);
1268 oC_Event_SetState(Connection->AcknowledgeReceivedEvent , Connection->LastConfirmedSequenceNumber);
1269 oC_Semaphore_Give(Connection->NewPacketReceivedSemaphore);
1271 oC_IntMan_ExitCriticalSection();
1281 oC_Timestamp_t currentTimestamp = gettimestamp();
1282 oC_Time_t measureTime = currentTimestamp - Connection->LastMeasureTimestamp;
1284 if(measureTime >=
s(1))
1286 Connection->BaudRate = (oC_BaudRate_t)(((oC_Time_t)Connection->SentBytesFromLastMeasure) / measureTime);
1287 Connection->LastMeasureTimestamp = currentTimestamp;
1288 Connection->SentBytesFromLastMeasure = 0;
1290 tcplog(oC_LogType_Track,
"%s: Connection baud rate = %u B", Connection->Name, Connection->BaudRate);
1302 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1304 while( oC_Tcp_Connection_IsCorrect(Connection) )
1306 if( ErrorCode(
ReceivePacket( Connection, Connection->LastReceivedPacket, Connection->ReceiveTimeout)) )
1308 Connection->ExpirationTimestamp = gettimestamp() + Connection->ExpirationTimeout;
1313 if(Connection->FinishConnectionPacketShouldBeSend)
1317 if(Connection->AcknowledgePacketShouldBeSend)
1319 oC_SaveIfErrorOccur(
"Cannot send ACK",
SendPredefinedPacket(Connection, PredefinedPacket_ACK, Connection->SendingAcknowledgeTimeout));
1320 Connection->AcknowledgePacketShouldBeSend =
false;
1323 else if(errorCode != oC_ErrorCode_Timeout)
1325 oC_SaveError(
"Cannot receive packet", errorCode);
1326 tcplog( oC_LogType_Error,
"%s: Cannot receive packet - %s", Connection->Name,
oC_GetErrorString(errorCode) );
1329 else if(Connection->State != State_WaitForSyn)
1331 if(gettimestamp() >= Connection->ExpirationTimestamp)
1333 tcplog( oC_LogType_Warning,
"Connection '%s' has expired, closing...", Connection->Name );
1336 else if(Connection->State == State_Disconnecting)
1338 tcplog( oC_LogType_Track,
"%s: Detect disconnect request - disconnecting...", Connection->Name );
1344 oC_SaveIfErrorOccur(
"Sending FIN ACK" ,
SendPredefinedPacket(Connection, PredefinedPacket_FIN_ACK, Connection->SendingAcknowledgeTimeout));
1345 oC_SaveIfErrorOccur(
"Sending ACK" ,
SendPredefinedPacket(Connection, PredefinedPacket_ACK , Connection->SendingAcknowledgeTimeout));
1347 Connection->State = State_NotConnected;
1349 if(isaddresscorrect(Connection->ConnectionFinishedFunction))
1351 Connection->ConnectionFinishedFunction( Connection, Connection->ConnectionFinishedParameter );
1355 #undef _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________
static bool oC_Net_AreAddressesTheSame(const oC_Net_Address_t *Address1, const oC_Net_Address_t *Address2)
returns true if both pointers stores the same address
static oC_ErrorCode_t WaitForAcknowledge(oC_Tcp_Connection_t Connection, uint32_t AcknowledgeNumber, oC_Time_t Timeout)
waits for the acknowledge of the given packet
bool oC_Event_WaitForState(oC_Event_t Event, oC_Event_State_t State, oC_Event_StateMask_t StateMask, oC_Time_t Timeout)
#define s(time)
Number of s.
uint64_t HighPart
High 8 bytes of the IPv6 address.
oC_Net_Protocol_t Protocol
IP Protocol.
bool oC_Tcp_Packet_ConvertToNetworkEndianess(oC_Tcp_Packet_t *Packet)
converts packet to network endianess
stores TCP connection data
The file with interface for thread managing.
static oC_ErrorCode_t ReceivePacket(oC_Tcp_Connection_t Connection, Packet_t Packet, oC_Time_t Timeout)
receives packet via TCP connection
static oC_ErrorCode_t SendPredefinedPacket(oC_Tcp_Connection_t Connection, PredefinedPacket_t PredefinedPacket, oC_Time_t Timeout)
simply sends one of standard (predefined) packets
identifier for allocations
bool oC_Tcp_Packet_ConvertFromNetworkEndianess(oC_Tcp_Packet_t *Packet)
converts packet from network endianess
oC_ErrorCode_t oC_NetifMan_ReceivePacket(const oC_Net_Address_t *Address, oC_Net_Packet_t *outPacket, oC_Time_t Timeout, oC_Netif_t *outNetif, oC_NetifMan_PacketFilterFunction_t FilterFunction, const void *Parameter)
receives packet from the network
oC_Tcp_Connection_t oC_Tcp_Connection_New(const oC_Tcp_Connection_Config_t *Config)
allocates memory for a new TCP connection object
static void oC_Net_Packet_SetAddress(oC_Net_Packet_t *Packet, const oC_Net_Address_t *Source, const oC_Net_Address_t *Destination)
sets addresses in the packet
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.
Stores interface of netif manager module.
static bool oC_Bits_AreBitsSetU8(uint8_t BitMask, uint8_t BitsToCheck)
checks if all bits in field are set
static oC_ErrorCode_t PrepareAndSendPacket(oC_Tcp_Connection_t Connection, Packet_t Packet, const PacketFlags_t *Flags, const uint8_t *Data, oC_MemorySize_t *Size, uint32_t *outSequenceNumber, oC_Time_t Timeout)
prepares and sends TCP packet
static oC_Net_PacketType_t oC_Net_Packet_GetType(const oC_Net_Packet_t *Packet)
returns type of the packet
Transmission Control Protocol.
struct Tcp_Connection_t * oC_Tcp_Connection_t
stores TCP connection data
static void CalculateBaudRate(oC_Tcp_Connection_t Connection)
calculates current Baud Rate of TCP connection
static oC_ErrorCode_t WaitForPredefinedPacket(oC_Tcp_Connection_t Connection, PredefinedPacket_t PredefinedPacket, oC_Time_t Timeout)
waits for one of predefined packets
static oC_ErrorCode_t SendPacket(oC_Tcp_Connection_t Connection, Packet_t Packet, oC_Time_t Timeout)
sends packet via TCP connection
static void SaveReceivedSegmentInQueue(oC_Tcp_Connection_t Connection)
saves data from the queue
uint32_t oC_ObjectControl_t
stores object control value
The file with interface for event module.
oC_Queue_t oC_Queue_New(Allocator_t Allocator, oC_MemorySize_t BufferSize)
allocates memory for a queue
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 oC_ErrorCode_t oC_Net_AddressToString(const oC_Net_Address_t *Address, char *outString, oC_MemorySize_t Size)
prints IP to the string
static uint32_t oC_Net_ConvertUint32FromNetworkEndianess(uint32_t v)
converts uint32_t from network byte order
The file with interface for interrupt manager.
Handles configuration of the Dynamic.
Special value for marks port as not filled.
static oC_ErrorCode_t ReadConnectionDataFromPacket(oC_Tcp_Connection_t Connection, Packet_t Packet)
reads connection data from the given packet
static oC_ObjectControl_t oC_CountObjectControl(void *ObjectPointer, oC_ObjectId_t ObjectId)
counts object control for object
oC_Net_Ipv6_t IPv6
Address in IPv6 version.
static bool oC_CheckObjectControl(void *ObjectPointer, oC_ObjectId_t ObjectId, oC_ObjectControl_t ObjectControl)
checks if object control is correct
The file with interface for Queue module.
static bool oC_Net_IsAddressCorrect(const oC_Net_Address_t *Address)
returns true if the given address is correct
The file with interface for mutex managing.
uint64_t LowPart
Low 8 bytes of the IPv6 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
oC_Tcp_Header_t * oC_Tcp_Packet_GetHeaderReference(oC_Tcp_Packet_t *Packet)
returns TCP header reference
const char * oC_GetErrorString(oC_ErrorCode_t ErrorCode)
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
The file with interface for semaphores.
oC_ErrorCode_t oC_NetifMan_SendPacket(const oC_Net_Address_t *Address, oC_Net_Packet_t *Packet, oC_Time_t Timeout, oC_Netif_t *outNetif)
sends packet via active network interface
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
bool oC_Tcp_Packet_Delete(oC_Tcp_Packet_t **outPacket)
releases memory allocated for a packet
static void AnalyzeReceivedPacket(oC_Tcp_Connection_t Connection, Packet_t Packet)
analyzes received data
static oC_ErrorCode_t PreparePacketToSend(oC_Tcp_Connection_t Connection, Packet_t Packet, const PacketFlags_t *Flags, const uint8_t *Data, oC_MemorySize_t *Size)
initializes Packet to send via TCP connection
oC_Net_AddressType_t Type
Type of the address stored inside.
static oC_ErrorCode_t SendSegment(oC_Tcp_Connection_t Connection, Segment_t *Segment, oC_Time_t Timeout)
sends data segment by using TCP connection
oC_Net_Port_t Port
Port of the address.
static bool PacketFilterFunction(oC_Net_Packet_t *ReceivedPacket, const void *Parameter, oC_Netif_t Netif)
the function for filtering packets
The file with interface of kernel time module.
#define NULL
pointer to a zero