1 /*
2 * FreeRTOS+TCP <DEVELOPMENT BRANCH>
3 * Copyright (C) 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4 *
5 * SPDX-License-Identifier: MIT
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a copy of
8 * this software and associated documentation files (the "Software"), to deal in
9 * the Software without restriction, including without limitation the rights to
10 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
11 * the Software, and to permit persons to whom the Software is furnished to do so,
12 * subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included in all
15 * copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
19 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
20 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
21 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 *
24 * http://aws.amazon.com/freertos
25 * http://www.FreeRTOS.org
26 */
27
28
29 /* Include Unity header */
30 #include <unity.h>
31
32 /* Include standard libraries */
33 #include <stdlib.h>
34 #include <string.h>
35 #include <stdint.h>
36 #include "FreeRTOS.h"
37 #include "task.h"
38 #include "list.h"
39
40 #include "FreeRTOS_IP.h"
41 #include "FreeRTOS_IP_Private.h"
42
43 /* =========================== EXTERN VARIABLES =========================== */
44
45 NetworkInterface_t xInterfaces[ 1 ];
46
47 BaseType_t xCallEventHook;
48
49 /** @brief The expected IP version and header length coded into the IP header itself. */
50 #define ipIP_VERSION_AND_HEADER_LENGTH_BYTE ( ( uint8_t ) 0x45 )
51
52 QueueHandle_t xNetworkEventQueue;
53
54 UDPPacketHeader_t xDefaultPartUDPPacketHeader =
55 {
56 /* .ucBytes : */
57 {
58 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, /* Ethernet source MAC address. */
59 0x08, 0x00, /* Ethernet frame type. */
60 ipIP_VERSION_AND_HEADER_LENGTH_BYTE, /* ucVersionHeaderLength. */
61 0x00, /* ucDifferentiatedServicesCode. */
62 0x00, 0x00, /* usLength. */
63 0x00, 0x00, /* usIdentification. */
64 0x00, 0x00, /* usFragmentOffset. */
65 ipconfigUDP_TIME_TO_LIVE, /* ucTimeToLive */
66 ipPROTOCOL_UDP, /* ucProtocol. */
67 0x00, 0x00, /* usHeaderChecksum. */
68 0x00, 0x00, 0x00, 0x00 /* Source IP address. */
69 }
70 };
71
72 /* ============================ Stubs Functions =========================== */
73
xNetworkInterfaceInitialise_returnTrue(NetworkInterface_t * xInterface)74 BaseType_t xNetworkInterfaceInitialise_returnTrue( NetworkInterface_t * xInterface )
75 {
76 return pdTRUE;
77 }
78
xNetworkInterfaceInitialise_returnFalse(NetworkInterface_t * xInterface)79 BaseType_t xNetworkInterfaceInitialise_returnFalse( NetworkInterface_t * xInterface )
80 {
81 return pdFALSE;
82 }
83
prvChecksumICMPv6Checks_Valid(size_t uxBufferLength,struct xPacketSummary * pxSet,int NumCalls)84 BaseType_t prvChecksumICMPv6Checks_Valid( size_t uxBufferLength,
85 struct xPacketSummary * pxSet,
86 int NumCalls )
87 {
88 pxSet->uxProtocolHeaderLength = ipSIZE_OF_ICMPv6_HEADER;
89 return 0;
90 }
91
prvChecksumICMPv6Checks_BigHeaderLength(size_t uxBufferLength,struct xPacketSummary * pxSet,int NumCalls)92 BaseType_t prvChecksumICMPv6Checks_BigHeaderLength( size_t uxBufferLength,
93 struct xPacketSummary * pxSet,
94 int NumCalls )
95 {
96 pxSet->uxProtocolHeaderLength = 0xFF;
97 return 0;
98 }
99
prvChecksumIPv6Checks_Valid(uint8_t * pucEthernetBuffer,size_t uxBufferLength,struct xPacketSummary * pxSet,int NumCalls)100 BaseType_t prvChecksumIPv6Checks_Valid( uint8_t * pucEthernetBuffer,
101 size_t uxBufferLength,
102 struct xPacketSummary * pxSet,
103 int NumCalls )
104 {
105 IPPacket_IPv6_t * pxIPPacket;
106
107 pxIPPacket = ( IPPacket_IPv6_t * ) pucEthernetBuffer;
108
109 pxSet->xIsIPv6 = pdTRUE;
110
111 pxSet->uxIPHeaderLength = ipSIZE_OF_IPv6_HEADER;
112 pxSet->usPayloadLength = FreeRTOS_ntohs( pxSet->pxIPPacket_IPv6->usPayloadLength );
113 pxSet->ucProtocol = pxIPPacket->xIPHeader.ucNextHeader;
114 pxSet->pxProtocolHeaders = ( ( ProtocolHeaders_t * ) &( pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER ] ) );
115 pxSet->usProtocolBytes = pxSet->usPayloadLength;
116
117 return 0;
118 }
119
prvChecksumIPv4Checks_Valid(uint8_t * pucEthernetBuffer,size_t uxBufferLength,struct xPacketSummary * pxSet,int NumCalls)120 BaseType_t prvChecksumIPv4Checks_Valid( uint8_t * pucEthernetBuffer,
121 size_t uxBufferLength,
122 struct xPacketSummary * pxSet,
123 int NumCalls )
124 {
125 IPPacket_t * pxIPPacket;
126
127 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
128
129 pxSet->xIsIPv6 = pdFALSE;
130
131 pxSet->uxIPHeaderLength = ( pxIPPacket->xIPHeader.ucVersionHeaderLength & 0x0F ) * 4;
132 pxSet->usPayloadLength = FreeRTOS_ntohs( pxIPPacket->xIPHeader.usLength );
133 pxSet->ucProtocol = pxIPPacket->xIPHeader.ucProtocol;
134 pxSet->pxProtocolHeaders = ( ProtocolHeaders_t * ) &( pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + pxSet->uxIPHeaderLength ] );
135 pxSet->usProtocolBytes = pxSet->usPayloadLength - ipSIZE_OF_IPv4_HEADER;
136
137 return 0;
138 }
139
prvChecksumIPv4Checks_UnknownProtocol(uint8_t * pucEthernetBuffer,size_t uxBufferLength,struct xPacketSummary * pxSet,int NumCalls)140 BaseType_t prvChecksumIPv4Checks_UnknownProtocol( uint8_t * pucEthernetBuffer,
141 size_t uxBufferLength,
142 struct xPacketSummary * pxSet,
143 int NumCalls )
144 {
145 prvChecksumIPv4Checks_Valid( pucEthernetBuffer, uxBufferLength, pxSet, NumCalls );
146
147 pxSet->ucProtocol = 0xFF;
148
149 return 0;
150 }
151
prvChecksumIPv4Checks_InvalidLength(uint8_t * pucEthernetBuffer,size_t uxBufferLength,struct xPacketSummary * pxSet,int NumCalls)152 BaseType_t prvChecksumIPv4Checks_InvalidLength( uint8_t * pucEthernetBuffer,
153 size_t uxBufferLength,
154 struct xPacketSummary * pxSet,
155 int NumCalls )
156 {
157 BaseType_t xReturn = 0;
158
159 prvChecksumIPv4Checks_Valid( pucEthernetBuffer, uxBufferLength, pxSet, NumCalls );
160
161 if( uxBufferLength < sizeof( IPPacket_t ) )
162 {
163 pxSet->usChecksum = ipINVALID_LENGTH;
164 xReturn = 4;
165 }
166
167 return xReturn;
168 }
169