31 #include <oc_stdlib.h> 45 #define _________________________________________DEFINITIONS_SECTION________________________________________________________________________ 47 #define LINK_STATUS_CHECKING_PERIOD ms(100) 49 #undef _________________________________________DEFINITIONS_SECTION________________________________________________________________________ 57 #define _________________________________________TYPES_SECTION______________________________________________________________________________ 67 ArpHardwareType_Unknown = 0,
68 ArpHardwareType_Ethernet = 1,
73 ArpProtocolType_Unknown = 0,
80 ArpOperation_Request = 1 ,
81 ArpOperation_Reply = 2
105 uint32_t SizeOfArpList;
110 oC_BaudRate_t BaudRate;
120 #undef _________________________________________TYPES_SECTION______________________________________________________________________________ 127 #define _________________________________________LOCAL_PROTOTYPES_SECTION__________________________________________________________________ 140 #undef _________________________________________LOCAL_PROTOTYPES_SECTION__________________________________________________________________ 148 #define _________________________________________VARIABLES_SECTION__________________________________________________________________________ 159 #undef _________________________________________VARIABLES_SECTION__________________________________________________________________________ 166 #define _________________________________________FUNCTIONS_SECTION__________________________________________________________________________ 192 const char * localAddressString = (AddressString ==
NULL) ?
"0.0.0.0" : AddressString;
193 const char * localNetMaskString = (NetMaskAddressString ==
NULL) ?
"0.0.0.0" : NetMaskAddressString;
197 bzero(&localAddress,
sizeof(localAddress));
198 bzero(&localNetMaskAddress,
sizeof(localNetMaskAddress));
201 oC_SaveIfFalse(
"Netif::New - FriendlyName ", isaddresscorrect(FriendlyName) , oC_ErrorCode_WrongAddress )
202 && oC_SaveIfFalse(
"Netif::New - FriendlyName ", strlen(FriendlyName) > 0 , oC_ErrorCode_StringIsEmpty )
203 && oC_SaveIfFalse(
"Netif::New - FriendlyName ", strlen(FriendlyName) <
sizeof(
oC_Netif_FriendlyName_t) , oC_ErrorCode_StringIsTooLong )
204 && oC_SaveIfFalse(
"Netif::New - Driver ", isaddresscorrect(Driver) , oC_ErrorCode_WrongAddress )
205 && oC_SaveIfFalse(
"Netif::New - Driver ", oC_Driver_GetDriverType(Driver) == NETWORK_DRIVER , oC_ErrorCode_DriverTypeNotCorrect )
206 && oC_SaveIfFalse(
"Netif::New - Address ", isaddresscorrect(AddressString) || AddressString ==
NULL , oC_ErrorCode_WrongAddress )
207 && oC_SaveIfFalse(
"Netif::New - NetMaskAddress ", isaddresscorrect(NetMaskAddressString) || NetMaskAddressString ==
NULL , oC_ErrorCode_WrongAddress )
210 netif = kmalloc(
sizeof(
struct Netif_t) , &Allocator , AllocationFlags_ZeroFill );
212 if(oC_SaveIfFalse(
"Netif::New cannot allocate memory" , netif !=
NULL , oC_ErrorCode_AllocationError))
216 && oC_SaveIfErrorOccur(
"Netif::New - NetMaskAddress - ",
oC_Net_AddressFromString(localNetMaskString, &localNetMaskAddress ))
217 && oC_SaveIfFalse(
"Netif::New - NetMask and Address - ", localAddress.
Type == localNetMaskAddress.
Type , oC_ErrorCode_AddressTypeNotCorrect )
220 netif->Config = kmalloc( Driver->ConfigurationSize , &Allocator, AllocationFlags_CanWait1Second);
221 netif->AddressResolutionList = oC_List_New(&Allocator,AllocationFlags_CanWait1Second);
222 netif->NewArpAvailableEvent = oC_Event_New(oC_Event_State_Inactive, &Allocator, AllocationFlags_ZeroFill);
225 oC_SaveIfFalse(
"Netif::New - Config - ", netif->Config !=
NULL , oC_ErrorCode_AllocationError)
226 && oC_SaveIfFalse(
"Netif::New - ARP List - ", netif->AddressResolutionList !=
NULL , oC_ErrorCode_AllocationError)
230 netif->Driver = Driver;
231 netif->Context =
NULL;
232 netif->Configured =
false;
234 netif->PacketsList =
NULL;
235 netif->LoopbackMode =
false;
236 netif->LoopbackSemaphore =
NULL;
241 netif->IPv4Info.NetIP = netif->IPv4Info.IP & netif->IPv4Info.Netmask;
244 netif->IPv4Info.DefaultTTL = 0xFF;
245 netif->IPv4Info.BroadcastIP = IP(255,255,255,255);
246 netif->ListenMode =
false;
247 netif->SizeOfArpList = 0;
249 strncpy(netif->FriendlyName,FriendlyName,
sizeof(netif->FriendlyName));
250 memcpy(netif->Config,Config,netif->Driver->ConfigurationSize);
254 bool deleted = netif->AddressResolutionList ==
NULL ?
true : oC_List_Delete(netif->AddressResolutionList, AllocationFlags_CanWait1Second);
256 oC_SaveIfFalse(
"Netif::New - Event delete - " , netif->NewArpAvailableEvent ==
NULL || oC_Event_Delete(&netif->NewArpAvailableEvent,AllocationFlags_Default) , oC_ErrorCode_ReleaseError );
257 oC_SaveIfFalse(
"Netif::New - netif structure - ", kfree(netif,AllocationFlags_CanWait1Second) , oC_ErrorCode_ReleaseError );
258 oC_SaveIfFalse(
"Netif::New - ARP List delete - ", deleted , oC_ErrorCode_ReleaseError );
264 oC_SaveIfFalse(
"Netif::New - netif structure - ", kfree(netif,AllocationFlags_CanWait1Second),oC_ErrorCode_ReleaseError);
286 bool success =
false;
289 oC_SaveIfFalse(
"Netif::Delete - outNetif not correct - " , isram(outNetif) , oC_ErrorCode_OutputAddressNotInRAM )
290 && oC_SaveIfFalse(
"Netif::Delete - outNetif not correct - " ,
oC_Netif_IsCorrect(*outNetif) , oC_ErrorCode_ObjectNotCorrect )
293 oC_IntMan_EnterCriticalSection();
296 netif->ObjectControl = 0;
298 oC_IntMan_ExitCriticalSection();
300 if(netif->Configured)
302 oC_SaveIfErrorOccur(
"Netif::Delete - cannot unconfigure driver - ", oC_Driver_Unconfigure(netif->Driver,netif->Config,&netif->Context));
304 oC_SaveIfFalse(
"Netif::Delete - cannot release config ", kfree(netif->Config, AllocationFlags_CanWait1Second) , oC_ErrorCode_ReleaseError);
306 if(netif->LoopbackSemaphore)
308 oC_SaveIfFalse(
"Netif::Delete - cannot delete semaphore - " , oC_Semaphore_Delete(&netif->LoopbackSemaphore,AllocationFlags_CanWait1Second) , oC_ErrorCode_ReleaseError);
311 if(netif->PacketsList)
313 oC_SaveIfFalse(
"Netif::Delete - cannot delete Packets list - " , List_Delete((
oC_List_t*)&netif->PacketsList,AllocationFlags_CanWait1Second) , oC_ErrorCode_ReleaseError);
316 if(netif->NewArpAvailableEvent)
318 oC_SaveIfFalse(
"Netif::Delete - cannot delete event - " , oC_Event_Delete(&netif->NewArpAvailableEvent,AllocationFlags_Default) , oC_ErrorCode_ReleaseError);
321 if(netif->AddressResolutionList)
323 foreach(netif->AddressResolutionList,entry)
325 kfree(entry,AllocationFlags_Default);
327 oC_SaveIfFalse(
"Netif::Delete - cannot delete ARP list - " , List_Delete((
oC_List_t*)&netif->AddressResolutionList,AllocationFlags_CanWait1Second) , oC_ErrorCode_ReleaseError);
330 if(oC_SaveIfFalse(
"Netif::Delete - release memory fault", kfree(netif,AllocationFlags_CanWait1Second), oC_ErrorCode_ReleaseError))
385 const char * name =
"Netif object not correct";
387 if(oC_SaveIfFalse(
"Netif::GetFriendlyName: " ,
oC_Netif_IsCorrect(Netif) , oC_ErrorCode_ObjectNotCorrect))
389 name = Netif->FriendlyName;
409 oC_Driver_t driver =
NULL;
411 if(oC_SaveIfFalse(
"Netif::GetDriver: " ,
oC_Netif_IsCorrect(Netif) , oC_ErrorCode_ObjectNotCorrect))
413 driver = Netif->Driver;
440 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
444 && ErrorCondition( Netif->Configured ==
false , oC_ErrorCode_AlreadyConfigured )
447 if(ErrorCode(oC_Driver_Configure(Netif->Driver,Netif->Config,&Netif->Context)))
449 Netif->Configured =
true;
450 errorCode = oC_ErrorCode_None;
479 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
483 && ErrorCondition( Netif->Configured , oC_ErrorCode_NotConfiguredYet )
486 errorCode = oC_Driver_Unconfigure( Netif->Driver , Netif->Config , &Netif->Context );
488 Netif->Context =
NULL;
489 Netif->Configured =
false;
521 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
525 && ErrorCondition( Netif->Configured , oC_ErrorCode_NotConfiguredYet )
526 && ErrorCondition( isram(outInfo) , oC_ErrorCode_OutputAddressNotInRAM )
530 ErrorCode(oC_Driver_ReadNetInfo( Netif->Driver , Netif->Context , outInfo ))
540 Netif->BaudRate = outInfo->
BaudRate;
543 errorCode = oC_ErrorCode_None;
574 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
578 && ErrorCondition( Netif->Configured , oC_ErrorCode_NotConfiguredYet )
579 && ErrorCondition( isaddresscorrect(Packet) , oC_ErrorCode_WrongAddress )
586 ErrorCondition( packet !=
NULL , oC_ErrorCode_AllocationError )
587 && ErrorCondition( oC_Semaphore_GiveCounting(Netif->LoopbackSemaphore,1) , oC_ErrorCode_CannotGiveSemaphore )
593 if(ErrorCondition( List_PushBack((
oC_List_t)Netif->PacketsList,&packet,
sizeof(packet),&Allocator) , oC_ErrorCode_CannotAddObjectToList ))
595 errorCode = oC_ErrorCode_None;
604 bzero( &frame,
sizeof(frame) );
613 Packet->
IPv4.
Header.
ID = (uint16_t)oC_KTime_GetCurrentTick();
646 if( Netif->LoopbackMode )
651 ErrorCode( oC_Driver_SendFrame( Netif->Driver , Netif->Context , &frame , Timeout ))
654 errorCode = oC_ErrorCode_None;
659 && ErrorCode( oC_Driver_SendFrame ( Netif->Driver , Netif->Context , &frame , Timeout ))
662 errorCode = oC_ErrorCode_None;
699 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
700 oC_Timestamp_t endTimestamp = oC_KTime_GetTimestamp() + Timeout;
704 && ErrorCondition( Netif->Configured , oC_ErrorCode_NotConfiguredYet )
705 && ErrorCondition( isram(Packet) , oC_ErrorCode_OutputAddressNotInRAM )
714 ErrorCondition( oC_Semaphore_TakeCounting( Netif->LoopbackSemaphore, 1, Timeout ) , oC_ErrorCode_Timeout )
715 && ErrorCondition( List_TakeFirst( (
oC_List_t)Netif->PacketsList, &packet,
sizeof(packet) ) , oC_ErrorCode_CannotRemoveObjectFromList )
716 && ErrorCondition(
oC_Net_GetPacketSize(packet,
true) <= PacketSize , oC_ErrorCode_SizeNotCorrect )
720 kfree(packet,AllocationFlags_CanWait1Second);
722 errorCode = oC_ErrorCode_None;
729 bzero(&frame,
sizeof(frame));
732 frame.
Size = PacketSize;
735 ErrorCode ( oC_Driver_ReceiveFrame( Netif->Driver , Netif->Context , &frame , oC_KTime_CalculateTimeout(endTimestamp) ) )
737 && ErrorCondition ( isram(frame.
Packet) , oC_ErrorCode_InternalDataAreDamaged )
746 frame.
Size = PacketSize;
762 errorCode = oC_ErrorCode_None;
798 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
802 && ErrorCondition( Netif->Configured , oC_ErrorCode_NotConfiguredYet )
803 && ErrorCondition( oC_Event_IsCorrect(WolEvent) , oC_ErrorCode_ObjectNotCorrect )
807 ErrorCode(oC_Driver_SetWakeOnLanEvent( Netif->Driver , Netif->Context , WolEvent ))
810 errorCode = oC_ErrorCode_None;
838 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
842 && ErrorCondition( Netif->Configured , oC_ErrorCode_NotConfiguredYet )
846 ErrorCode(oC_Driver_Flush( Netif->Driver , Netif->Context ))
849 errorCode = oC_ErrorCode_None;
881 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
885 && ErrorCondition( Netif->Configured , oC_ErrorCode_NotConfiguredYet )
890 Netif->LoopbackMode = Enabled;
891 Netif->LoopbackLayer = Layer;
895 Netif->LoopbackSemaphore = oC_Semaphore_New(10, 0, &Allocator, AllocationFlags_CanWait1Second);
896 Netif->PacketsList = oC_List_New(&Allocator,AllocationFlags_CanWait1Second);
899 ErrorCondition( Netif->LoopbackSemaphore !=
NULL , oC_ErrorCode_AllocationError )
900 && ErrorCondition( Netif->PacketsList !=
NULL , oC_ErrorCode_AllocationError )
904 errorCode = oC_ErrorCode_None;
908 oC_Semaphore_Delete( &Netif->LoopbackSemaphore , AllocationFlags_CanWait1Second);
909 oC_List_Delete(Netif->PacketsList,AllocationFlags_CanWait1Second);
911 Netif->LoopbackMode =
false;
916 if(Netif->LoopbackSemaphore ==
NULL)
918 errorCode = oC_ErrorCode_None;
922 bool deleted = oC_List_Delete(Netif->PacketsList,AllocationFlags_CanWait1Second);
925 ErrorCondition( oC_Semaphore_Delete(&Netif->LoopbackSemaphore,AllocationFlags_CanWait1Second) , oC_ErrorCode_ReleaseError )
926 && ErrorCondition( deleted , oC_ErrorCode_ReleaseError )
929 errorCode = oC_ErrorCode_None;
935 ErrorCode(oC_Driver_SetLoopback( Netif->Driver , Netif->Context , Layer , Enabled ))
938 Netif->LoopbackMode =
true;
939 Netif->LoopbackLayer = Layer;
940 errorCode = oC_ErrorCode_None;
988 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
992 && ErrorCondition( Netif->Configured , oC_ErrorCode_NotConfiguredYet )
993 && ErrorCondition( isram(NumberOfDiags) , oC_ErrorCode_OutputAddressNotInRAM )
997 ErrorCode(oC_Driver_PerformDiagnostics( Netif->Driver , Netif->Context , outDiags , NumberOfDiags ))
1000 errorCode = oC_ErrorCode_None;
1032 linkStatus = Netif->LinkStatus;
1051 oC_BaudRate_t baudRate = 0;
1055 baudRate = Netif->BaudRate;
1078 type = Netif->HardwareType;
1107 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1111 && ErrorCondition( Netif->Configured ==
true , oC_ErrorCode_NotConfiguredYet )
1112 && ErrorCondition( isram(outHardwareAddress) , oC_ErrorCode_OutputAddressNotInRAM )
1116 errorCode = oC_ErrorCode_None;
1149 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1153 && ErrorCondition( Netif->Configured ==
true , oC_ErrorCode_NotConfiguredYet )
1154 && ErrorCondition( isram(outHardwareAddress) , oC_ErrorCode_OutputAddressNotInRAM )
1155 && ErrorCondition( isaddresscorrect(Address) , oC_ErrorCode_WrongAddress )
1163 foreach(Netif->AddressResolutionList,entry)
1165 if(entry->IpAddress.IPv4 == Address->
IPv4)
1174 if(Address->
IPv4 == Netif->IPv4Info.BroadcastIP)
1178 errorCode = oC_ErrorCode_None;
1184 if(ErrorCondition( entry !=
NULL , oC_ErrorCode_AllocationError ))
1189 oC_List_PushBack(Netif->AddressResolutionList,entry,&Allocator);
1192 errorCode = oC_ErrorCode_None;
1198 errorCode = oC_ErrorCode_None;
1203 if(Netif->HardwareAddress.Filled)
1207 errorCode = oC_ErrorCode_None;
1214 address.
IPv4 = Netif->IPv4Info.NetIP;
1220 errorCode = oC_ErrorCode_None;
1254 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1258 && ErrorCondition( isaddresscorrect(Info) , oC_ErrorCode_WrongAddress )
1263 errorCode = oC_ErrorCode_None;
1290 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1294 && ErrorCondition( isram(outInfo) , oC_ErrorCode_OutputAddressNotInRAM )
1299 errorCode = oC_ErrorCode_None;
1330 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1334 && ErrorCondition( isaddresscorrect(Info) , oC_ErrorCode_WrongAddress )
1339 errorCode = oC_ErrorCode_None;
1366 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1370 && ErrorCondition( isram(outInfo) , oC_ErrorCode_OutputAddressNotInRAM )
1375 errorCode = oC_ErrorCode_None;
1395 bool belongs =
false;
1398 oC_SaveIfFalse(
"Netif::IsAddressInSubnet - Netif - " ,
oC_Netif_IsCorrect(Netif) , oC_ErrorCode_ObjectNotCorrect )
1399 && oC_SaveIfFalse(
"Netif::IsAddressInSubnet - Address - " , isaddresscorrect(Address) , oC_ErrorCode_WrongAddress )
1400 && oC_SaveIfFalse(
"Netif::IsAddressInSubnet - Address - " ,
oC_Net_IsAddressCorrect(Address) , oC_ErrorCode_IpAddressNotCorrect )
1401 && oC_SaveIfFalse(
"Netif::IsAddressInSubnet - link status - ", Netif->LinkStatus ==
oC_Net_LinkStatus_Up , oC_ErrorCode_LinkNotDetected )
1410 oC_SaveError(
"Netif::IsAddressInSubnet - not implemented for IPv6", oC_ErrorCode_NotImplemented);
1414 oC_SaveError(
"Netif::IsAddressInSubnet - address type is not correct or not recognized - ", oC_ErrorCode_IpAddressNotCorrect);
1433 ip = Netif->IPv4Info.IP;
1447 bool success =
false;
1451 memcpy(outAddress,&Netif->IPv6Info.IPv6,
sizeof(
oC_Net_Ipv6_t));
1481 memset(&info,0,
sizeof(info));
1493 bool assigned =
false;
1497 assigned = Netif->IPv4Info.IP > 0
1498 && Netif->IPv4Info.IP < IP(255,255,255,255)
1499 && Netif->IPv4Info.IpExpiredTimestamp > oC_KTime_GetTimestamp();
1526 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1530 && ErrorCondition( Netif->Configured , oC_ErrorCode_NotConfiguredYet )
1533 oC_Timestamp_t startTimestamp = oC_KTime_GetTimestamp();
1534 oC_Timestamp_t endTimestamp = startTimestamp + Timeout;
1535 oC_Timestamp_t currentTimestamp = oC_KTime_GetTimestamp();
1537 errorCode = oC_ErrorCode_Timeout;
1547 sleep(LINK_STATUS_CHECKING_PERIOD);
1548 currentTimestamp = oC_KTime_GetTimestamp();
1585 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1589 && ErrorCondition( Netif->Configured , oC_ErrorCode_NotConfiguredYet )
1591 && ErrorCondition( Netif->LinkStatus , oC_ErrorCode_LinkNotDetected )
1592 && ErrorCondition( Timeout > 0 , oC_ErrorCode_TimeNotCorrect )
1595 oC_Timestamp_t endTimestamp = oC_KTime_GetTimestamp() + Timeout;
1598 ErrorCode(
oC_Dhcp_RequestIp ( Netif , oC_KTime_CalculateTimeout(endTimestamp) ))
1602 errorCode = oC_ErrorCode_None;
1606 Netif->IPv4Info.IP = 0;
1636 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1640 && ErrorCondition( Netif->Configured , oC_ErrorCode_NotConfiguredYet )
1641 && ErrorCondition( oC_Thread_IsCorrect(Thread), oC_ErrorCode_ThreadNotCorrect )
1644 Netif->ReceiveThread = Thread;
1645 errorCode = oC_ErrorCode_None;
1676 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1680 && ErrorCondition( Netif->Configured , oC_ErrorCode_NotConfiguredYet )
1681 && ErrorCondition( iscurroot() , oC_ErrorCode_PermissionDenied )
1684 Netif->ListenMode = Enabled;
1685 errorCode = oC_ErrorCode_None;
1725 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1729 && ErrorCondition( Netif->Configured , oC_ErrorCode_NotConfiguredYet )
1730 && ErrorCondition( isram(outThread) , oC_ErrorCode_OutputAddressNotInRAM )
1731 && ErrorCondition( oC_Thread_IsCorrect(Netif->ReceiveThread) , oC_ErrorCode_ThreadNotSet )
1734 *outThread = Netif->ReceiveThread;
1735 errorCode = oC_ErrorCode_None;
1763 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1767 && ErrorCondition( Netif->Configured , oC_ErrorCode_NotConfiguredYet )
1768 && ErrorCondition( Timeout > 0 , oC_ErrorCode_TimeNotCorrect )
1773 .IPv4 = Netif->IPv4Info.IP
1775 errorCode =
SendArpPacket(Netif,ArpOperation_Request, &Netif->HardwareBroadcastAddress, &destination, Timeout);
1782 #undef _________________________________________FUNCTIONS_SECTION__________________________________________________________________________ 1789 #define _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________ 1798 ArpHardwareType_t arpType = ArpHardwareType_Unknown;
1803 default: arpType = ArpHardwareType_Unknown;
break;
1836 ArpProtocolType_t arpType = 0;
1843 default: arpType = ArpProtocolType_Unknown;
break;
1858 foreach(Netif->AddressResolutionList,entry)
1865 memcpy(outHardwareAddress,&entry->HardwareAddress,
sizeof(*outHardwareAddress));
1880 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1885 && ErrorCondition( arpType != ArpHardwareType_Unknown , oC_ErrorCode_UnknownHardwareType )
1886 && ErrorCondition( Netif->HardwareAddress.Filled , oC_ErrorCode_UnknownHardwareAddress )
1892 + ( hardwareAddressSize * 2 )
1893 + ( addressSize * 2 )
1896 uint8_t* arrayPointer =
NULL;
1897 oC_Timestamp_t endTimestamp = oC_KTime_GetTimestamp() + Timeout;
1898 uint16_t arpPacketSize =
sizeof(
ArpPacket_t) + 2 * hardwareAddressSize + 2 * addressSize;
1899 ArpPacket_t* arpPacket = ksmartalloc( arpPacketSize , &Allocator, AllocationFlags_ZeroFill );
1903 ErrorCondition( frame !=
NULL && arpPacket !=
NULL , oC_ErrorCode_AllocationError )
1911 frame->
Packet = (
void*)arpPacket;
1918 arpPacket->
HTYPE = arpType;
1919 arpPacket->
PTYPE = ArpProtocolType_IPv4;
1920 arpPacket->
HLEN = (uint8_t)hardwareAddressSize;
1921 arpPacket->
PLEN = (uint8_t)addressSize;
1922 arpPacket->
OPER = ArpOperation_Request;
1927 memcpy(arrayPointer, &Netif->HardwareAddress.Address, hardwareAddressSize);
1928 arrayPointer += hardwareAddressSize;
1931 memcpy(arrayPointer, &Netif->IPv4Info.IP, addressSize);
1932 arrayPointer += addressSize;
1935 arrayPointer += hardwareAddressSize;
1938 memcpy(arrayPointer, &Address->
IPv4, addressSize);
1939 arrayPointer += addressSize;
1959 if( ErrorCode( oC_Driver_SendFrame( Netif->Driver, Netif->Context, frame, Timeout )) )
1961 errorCode = oC_ErrorCode_HostNotAvailable;
1963 while(
oC_Event_WaitForState(Netif->NewArpAvailableEvent,Netif->SizeOfArpList,oC_Event_StateMask_DifferentThan,oC_KTime_CalculateTimeout(endTimestamp)))
1967 errorCode = oC_ErrorCode_None;
1973 if(arpPacket !=
NULL)
1975 ksmartfree(arpPacket,
sizeof(
oC_Net_Frame_t), AllocationFlags_Default);
1980 ksmartfree(frame,
sizeof(
oC_Net_Frame_t), AllocationFlags_Default);
2000 foreach(Netif->AddressResolutionList,entry)
2004 || (memcmp(HardwareAddress,&entry->HardwareAddress,
sizeof(entry->HardwareAddress)) == 0)
2011 if(foundEntry !=
NULL)
2013 memcpy(&foundEntry->HardwareAddress, HardwareAddress,
sizeof(foundEntry->HardwareAddress));
2021 if(oC_SaveIfFalse(
"SaveHWAddress - cannot save address - ", entry !=
NULL , oC_ErrorCode_AllocationError ))
2026 oC_List_PushBack(Netif->AddressResolutionList,entry,&Allocator);
2028 oC_Event_SetState(Netif->NewArpAvailableEvent,++Netif->SizeOfArpList);
2045 if( realArpHwType != ArpHardwareType_Unknown && Packet->
HTYPE == realArpHwType && hardwareAddressSize > 0 && ((uint8_t)hardwareAddressSize) == Packet->
HLEN && packetType != 0)
2052 uint16_t addressSize = Packet->
PLEN;
2054 + ( hardwareAddressSize * 2 )
2055 + ( addressSize * 2 )
2057 bzero( &senderHardwareAddress,
sizeof( senderHardwareAddress ) );
2058 bzero( &targetHardwareAddress,
sizeof( targetHardwareAddress ) );
2059 bzero( &senderAddress ,
sizeof( senderAddress ) );
2060 bzero( &targetAddress ,
sizeof( targetAddress ) );
2066 memcpy( &senderHardwareAddress.
Address, arrayPointer, hardwareAddressSize );
2067 arrayPointer += hardwareAddressSize;
2070 memcpy( &senderAddress.
IPv4, arrayPointer, addressSize );
2071 arrayPointer += addressSize;
2074 memcpy( &targetHardwareAddress.
Address, arrayPointer, hardwareAddressSize );
2075 arrayPointer += hardwareAddressSize;
2078 memcpy( &targetAddress.
IPv4, arrayPointer, addressSize);
2079 arrayPointer += addressSize;
2088 senderHardwareAddress.
Filled =
true;
2089 targetHardwareAddress.
Filled =
true;
2093 if(Packet->
OPER == ArpOperation_Reply)
2097 else if(Packet->
OPER == ArpOperation_Request)
2104 bzero(&frame,
sizeof(frame));
2106 Packet->
OPER = ArpOperation_Reply;
2107 frame.
Packet = (
void*)Packet;
2112 memcpy(arrayPointer, &Netif->HardwareAddress.Address, hardwareAddressSize );
2113 arrayPointer += hardwareAddressSize;
2116 memcpy(arrayPointer, &Netif->IPv4Info.IP , addressSize );
2117 arrayPointer += addressSize;
2120 memcpy(arrayPointer, &senderHardwareAddress , hardwareAddressSize );
2121 arrayPointer += hardwareAddressSize;
2124 memcpy(arrayPointer, &senderAddress.
IPv4 , addressSize );
2125 arrayPointer += addressSize;
2141 oC_SaveIfErrorOccur(
"SaveHardwareAddressFromArp: Cannot respond for ARP - ", oC_Driver_SendFrame(Netif->Driver,Netif->Context,&frame,Timeout));
2154 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
2158 uint16_t packetSize =
sizeof(
ArpPacket_t) -
sizeof(uint32_t)
2159 + hardwareAddressSize * 2
2163 ErrorCondition( hardwareAddressSize > 0 , oC_ErrorCode_TypeNotCorrect )
2164 && ErrorCondition( addressSize > 0 , oC_ErrorCode_AddressTypeNotCorrect )
2167 ArpPacket_t * arpPacket = kmalloc( packetSize , &Allocator, AllocationFlags_ZeroFill);
2169 if(ErrorCondition( arpPacket !=
NULL , oC_ErrorCode_AllocationError ))
2171 arpPacket->
HLEN = hardwareAddressSize;
2172 arpPacket->
PLEN = addressSize;
2177 void * senderHardwareAddress = &arpPacket->
AddressArray[ 0 ];
2178 void * senderProtocolAddress = &arpPacket->
AddressArray[ hardwareAddressSize ];
2179 void * targetHardwareAddress = &arpPacket->
AddressArray[ hardwareAddressSize + addressSize ];
2180 void * targetProtocolAddress = &arpPacket->
AddressArray[ hardwareAddressSize + addressSize + hardwareAddressSize ];
2182 memcpy( senderHardwareAddress, &Netif->HardwareAddress.Address , hardwareAddressSize );
2184 (
void*)&Netif->IPv4Info.IP : (
void*)&Netif->IPv6Info.IPv6 , addressSize );
2185 memcpy( targetHardwareAddress, &TargetHwAddress->
Address , hardwareAddressSize );
2187 (
void*)&IpAddress->
IPv4 : (
void*)&IpAddress->
IPv6 , addressSize );
2195 frame.
Size = packetSize;
2200 errorCode = oC_Driver_SendFrame(Netif->Driver, Netif->Context, &frame, Timeout);
2202 oC_SaveIfFalse(
"SendArpPacket: cannot release ARP packet", kfree(arpPacket,0) , oC_ErrorCode_ReleaseError);
2220 uint8_t plen = Packet->
PLEN;
2221 uint8_t hlen = Packet->
HLEN;
2224 if(Packet->
PTYPE == ArpProtocolType_IPv4)
2228 arrayPointer += hlen;
2231 ip = (arrayPointer[0] << 0)
2232 | (arrayPointer[1] << 8)
2233 | (arrayPointer[2] << 16)
2234 | (arrayPointer[3] << 24);
2238 arrayPointer[0] = (ip >> 0) & 0xFF ;
2239 arrayPointer[1] = (ip >> 8) & 0xFF ;
2240 arrayPointer[2] = (ip >> 16) & 0xFF ;
2241 arrayPointer[3] = (ip >> 24) & 0xFF ;
2243 arrayPointer += plen;
2245 arrayPointer += hlen;
2248 ip = (arrayPointer[0] << 0)
2249 | (arrayPointer[1] << 8)
2250 | (arrayPointer[2] << 16)
2251 | (arrayPointer[3] << 24);
2255 arrayPointer[0] = (ip >> 0) & 0xFF ;
2256 arrayPointer[1] = (ip >> 8) & 0xFF ;
2257 arrayPointer[2] = (ip >> 16) & 0xFF ;
2258 arrayPointer[3] = (ip >> 24) & 0xFF ;
2269 ArpProtocolType_t protocolType = Packet->
PTYPE;
2275 uint8_t plen = Packet->
PLEN;
2276 uint8_t hlen = Packet->
HLEN;
2278 if(protocolType == ArpProtocolType_IPv4)
2282 arrayPointer += hlen;
2285 ip = (arrayPointer[0] << 0)
2286 | (arrayPointer[1] << 8)
2287 | (arrayPointer[2] << 16)
2288 | (arrayPointer[3] << 24);
2292 arrayPointer[0] = (ip >> 0) & 0xFF ;
2293 arrayPointer[1] = (ip >> 8) & 0xFF ;
2294 arrayPointer[2] = (ip >> 16) & 0xFF ;
2295 arrayPointer[3] = (ip >> 24) & 0xFF ;
2297 arrayPointer += plen;
2299 arrayPointer += hlen;
2302 ip = (arrayPointer[0] << 0)
2303 | (arrayPointer[1] << 8)
2304 | (arrayPointer[2] << 16)
2305 | (arrayPointer[3] << 24);
2309 arrayPointer[0] = (ip >> 0) & 0xFF ;
2310 arrayPointer[1] = (ip >> 8) & 0xFF ;
2311 arrayPointer[2] = (ip >> 16) & 0xFF ;
2312 arrayPointer[3] = (ip >> 24) & 0xFF ;
2317 #undef _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________ oC_Net_Ipv4_t SourceIp
Source IP address.
static oC_MemorySize_t oC_Net_GetAddressSize(const oC_Net_Address_t *Address)
returns size of IP address
oC_ErrorCode_t oC_Dhcp_RequestIp(oC_Netif_t Netif, oC_Time_t Timeout)
performs DHCP IP request procedure
bool oC_Event_WaitForState(oC_Event_t Event, oC_Event_State_t State, oC_Event_StateMask_t StateMask, oC_Time_t Timeout)
uint64_t HighPart
High 8 bytes of the IPv6 address.
Contains definitions of DHCP.
oC_ErrorCode_t oC_Netif_ReadHardwareAddress(oC_Netif_t Netif, oC_Net_HardwareAddress_t *outHardwareAddress)
reads hardware address of the interface
bool oC_Netif_GetListenMode(oC_Netif_t Netif)
returns true if listen mode is enabled
oC_Driver_t oC_Netif_GetDriver(oC_Netif_t Netif)
returns driver related with the Netif
const char * oC_Netif_GetFriendlyName(oC_Netif_t Netif)
returns friendly name of the network interface
static uint16_t oC_Net_ConvertUint16FromNetworkEndianess(uint16_t v)
converts uint16_t from network byte order
oC_Net_Ipv4PacketHeader_t Header
Header of the IPv4 packet.
identifier for allocations
oC_ErrorCode_t oC_Netif_SendAddressProbe(oC_Netif_t Netif, oC_Time_t Timeout)
sends frame that probes the address
oC_ErrorCode_t oC_Netif_ReadReceiveThread(oC_Netif_t Netif, oC_Thread_t *outThread)
sets thread for receiving packets
stores network interface informations
oC_ErrorCode_t oC_Netif_PerformDiagnostics(oC_Netif_t Netif, oC_Diag_t *outDiags, uint32_t *NumberOfDiags)
performs diagnostics of the network interface
static oC_Allocator_t Allocator
uint16_t OPER
Operation (1 is request, 2 is reply)
The file contains definitions for the compiler, that helps to manage errors, etc. ...
const oC_Net_Packet_t * ConstPacket
Pointer to the packet to send (for sending)
oC_ErrorCode_t oC_Netif_Unconfigure(oC_Netif_t Netif)
unconfigures network driver related with the Netif
Contains interface for netif object.
oC_Net_LinkStatus_t LinkStatus
Network interface link status (UP/DOWN)
oC_Net_AddressType_t
stores type of the network address
static bool oC_Net_ConvertHeaderToNetworkEndianess(oC_Net_Packet_t *Packet)
converts header to network endianess
static bool oC_Net_Ipv4_IsAddressInSubnet(oC_Net_Ipv4_t IP, oC_Net_Ipv4_t Subnet, oC_Net_Ipv4_t Mask)
checks if the IPv4 address belongs to the given subnetwork
static void ConvertArpFromNetworkEndianess(ArpPacket_t *Packet)
converts ARP packet from network endianess
bool Filled
True if the address is filled.
static ArpProtocolType_t PacketTypeToArpProtocol(oC_Net_PacketType_t Type)
translates ARP protocol type from packet type
oC_ErrorCode_t oC_Netif_Flush(oC_Netif_t Netif)
flushes Network interface
oC_Net_PacketType_t
stores type of the packet
oC_ErrorCode_t oC_Netif_ReadHardwareAddressOf(oC_Netif_t Netif, oC_Net_HardwareAddress_t *outHardwareAddress, const oC_Net_Address_t *Address, oC_Time_t Timeout)
reads hardware address of the given IP address in LAN
uint32_t oC_Net_Ipv4_t
stores IPv4 address
bool oC_Netif_IsCorrect(oC_Netif_t Netif)
checks if the Netif object is correct
static oC_ErrorCode_t RequestHardwareAddressViaArp(oC_Netif_t Netif, const oC_Net_Address_t *Address, oC_Net_HardwareAddress_t *outHardwareAddress, oC_Time_t Timeout)
requests hardware address via ARP protocol
oC_Net_HardwareAddress_t Destination
Hardware Destination Address.
uint32_t Operation
Specifies type of the message.
oC_Net_HardwareType_t
stores hardware type of the network interface
oC_BaudRate_t oC_Netif_GetBaudRate(oC_Netif_t Netif)
returns baud rate of the network interface
static uint16_t oC_Net_ConvertUint16ToNetworkEndianess(uint16_t v)
converts uint16_t to network byte order
The file with helper macros for managing objects.
oC_Net_HardwareAddress_t HardwareAddress
Hardware address.
The file with interface for driver creating.
oC_ErrorCode_t oC_Netif_UpdateLinkStatus(oC_Netif_t Netif)
updates link status in the network interface object
oC_ErrorCode_t oC_Netif_SetLoopback(oC_Netif_t Netif, oC_Net_Layer_t Layer, bool Enabled)
enables or disables loopback
oC_Netif_t oC_Netif_New(oC_Netif_FriendlyName_t FriendlyName, const char *AddressString, const char *NetMaskAddressString, oC_Driver_t Driver, const void *Config)
Creates Netif object.
oC_ErrorCode_t oC_Netif_SetIpv6Info(oC_Netif_t Netif, const oC_Net_Ipv6Info_t *Info)
sets informations about IPv6
uint8_t Address
Universal HW Address pointer.
oC_BaudRate_t BaudRate
Baud rate of the interface.
uint32_t oC_ObjectControl_t
stores object control value
oC_ErrorCode_t oC_Netif_ReadIpv6Info(oC_Netif_t Netif, oC_Net_Ipv6Info_t *outInfo)
reads IPv6 informations
struct oC_Net_Info_t::@26 NetworkLayer
Struct with data from the network layer.
oC_Net_Ipv4_t oC_Netif_GetIpv4Address(oC_Netif_t Netif)
returns address of the network interface
uint16_t HTYPE
Hardware type.
oC_ErrorCode_t oC_Netif_Configure(oC_Netif_t Netif)
configures network driver to work with netif
oC_Net_Ipv4Info_t IPv4
IPv4 informations.
oC_ErrorCode_t oC_Netif_SetReceiveThread(oC_Netif_t Netif, oC_Thread_t Thread)
sets thread for receiving packets
static oC_Net_PacketType_t ArpProtocolToPacketType(ArpProtocolType_t Type)
translates ARP protocol type to packet type
oC_Net_Ipv4_t IPv4
Address in IPv4 version.
uint32_t ID
ID value for reconstruction the packet from segments.
Network interface layer - sublayer of the Network layer.
static void SaveHardwareAddress(oC_Netif_t Netif, oC_Net_HardwareAddress_t *HardwareAddress, oC_Net_Address_t *IpAddress)
saves HW address in ARP list
uint16_t Size
Size Data in frame.
The file with interface for interrupt manager.
oC_Net_HardwareType_t HardwareType
Type of the hardware device.
stores informations about the frame to send
oC_ErrorCode_t oC_Netif_SetWakeOnLanEvent(oC_Netif_t Netif, oC_Event_t WolEvent)
sets wake on LAN event
static bool oC_Net_ConvertHeaderFromNetworkEndianess(oC_Net_Packet_t *Packet)
converts header from network endianess
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_Netif_SetIpv4Info(oC_Netif_t Netif, const oC_Net_Ipv4Info_t *Info)
sets informations about IPv4
bool oC_Netif_Delete(oC_Netif_t *outNetif)
deletes netif object
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
Frame stores IPv6 packet.
static bool oC_Net_IsAddressCorrect(const oC_Net_Address_t *Address)
returns true if the given address is correct
oC_Net_Ipv6Info_t IPv6
IPv6 informations.
uint64_t LowPart
Low 8 bytes of the IPv6 address.
uint8_t AddressArray[4]
Array with addresses.
oC_Net_HardwareAddress_t Source
Hardware Source 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
uint32_t TTL
Time to live - number of hops the packet is allowed to pass before it dies.
oC_ErrorCode_t oC_Netif_ReadNetInfo(oC_Netif_t Netif, oC_Net_Info_t *outInfo)
reads informations about network interface
oC_ErrorCode_t oC_Netif_SetListenMode(oC_Netif_t Netif, bool Enabled)
enables listen mode
oC_Net_Ipv6_t Source
Source IP address.
oC_Net_Ipv4Packet_t IPv4
Packet in format IPv4.
oC_Net_Packet_t * Packet
Pointer to the packet to send.
oC_ErrorCode_t oC_Netif_WaitOnLink(oC_Netif_t Netif, oC_Time_t Timeout)
waits for the link and updates IP
static void ReceiveThread(oC_Tcp_Connection_t Connection)
thread for receiving data
oC_Net_FrameType_t FrameType
Type of the frame.
uint32_t Checksum
Header checksum - number used for errors detection.
bool oC_Netif_IsAddressInSubnet(oC_Netif_t Netif, const oC_Net_Address_t *Address)
checks if the given address belongs to the given subnet
bool oC_Netif_IsIpAssigned(oC_Netif_t Netif)
returns true if IP is assigned
static void ConvertArpToNetworkEndianess(ArpPacket_t *Packet)
converts ARP packet to network endianess
bool oC_Netif_IsConfigured(oC_Netif_t Netif)
checks if the driver is configured
static oC_MemorySize_t oC_Net_GetHardwareAddressSize(oC_Net_HardwareType_t Type)
returns size of the hardware address (in bytes)
Frame stores IPv4 packet.
Network interface is DOWN (cable is not connected)
static ArpHardwareType_t HardwareTypeToArpHardwareType(oC_Net_HardwareType_t Type)
translates hardware type to ARP hardware type
uint32_t Version
4 bits, that contain the version, that specified if it's an IPv4 or IPv6 packet
The file with interface for string library.
uint16_t PTYPE
Protocol type.
oC_ErrorCode_t oC_Netif_ReceivePacket(oC_Netif_t Netif, oC_Net_Packet_t *Packet, oC_MemorySize_t PacketSize, oC_Time_t Timeout)
receives packet by using the interface
uint32_t HardwareType
Hardware Type - specifies type of the hardware used in the local network.
oC_Net_FriendlyInterfaceName_t oC_Netif_FriendlyName_t
type for storing friendly name string
uint8_t PLEN
Protocol address length.
static oC_ErrorCode_t SendArpPacket(oC_Netif_t Netif, ArpOperation_t Operation, oC_Net_HardwareAddress_t *TargetHwAddress, oC_Net_Address_t *IpAddress, oC_Time_t Timeout)
sends ARP packet
oC_Net_HardwareType_t oC_Netif_GetHardwareType(oC_Netif_t Netif)
returns hardware type of the network interface
oC_ErrorCode_t oC_Netif_SendPacket(oC_Netif_t Netif, oC_Net_Packet_t *Packet, oC_Time_t Timeout)
sends packet by using the network interface
The file with interface for semaphores.
oC_Net_Ipv4_t DestinationIp
Destination IP address.
oC_ErrorCode_t oC_Netif_ReadIpv4Info(oC_Netif_t Netif, oC_Net_Ipv4Info_t *outInfo)
reads IPv4 informations
static uint16_t oC_Net_Packet_CalculateChecksum(oC_Net_Packet_t *Packet)
calculates checksum for a packet (it only calculates it and does not fill it!)
static void SaveHardwareAddressFromArp(oC_Netif_t Netif, ArpPacket_t *Packet, oC_Time_t Timeout)
saves hardware address from ARP message
static oC_ErrorCode_t oC_Net_AddressFromString(const char *Address, oC_Net_Address_t *outAddress)
reads IP address from the string
oC_Net_LinkStatus_t oC_Netif_GetLinkStatus(oC_Netif_t Netif)
returns last known link status of the network interface
Network interface is UP (cable is connected)
bool oC_Netif_ReadIpv6Address(oC_Netif_t Netif, oC_Net_Ipv6_t *outAddress)
reads IPv6 address of the network interface
stores network interface IPv4 informations
oC_Net_HardwareAddress_t HardwareBroadcastAddress
Hardware address that should be used for broadcast.
stores network interface IPv6 informations
static bool ReadHardwareAddressOf(oC_Netif_t Netif, const oC_Net_Address_t *Address, oC_Net_HardwareAddress_t *outHardwareAddress)
reads hw address from the ARP list in the netif
oC_Net_LinkStatus_t
stores network interface link status
oC_ErrorCode_t oC_Netif_UpdateIp(oC_Netif_t Netif, oC_Time_t Timeout)
updates IP in the given network interface
uint8_t HLEN
Hardware address length.
oC_Net_AddressType_t Type
Type of the address stored inside.
oC_Net_Ipv6Packet_t IPv6
Packet in format IPv6.
Address resolution packet.
oC_Net_Ipv6_t Destination
Destination IP address.
The file with interface of kernel time module.
#define NULL
pointer to a zero
oC_Net_Layer_t
stores layer of the OSI model