]> git.proxmox.com Git - mirror_edk2.git/blame - AppPkg/Applications/Sockets/RawIp4Rx/RawIp4Rx.c
AppPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / AppPkg / Applications / Sockets / RawIp4Rx / RawIp4Rx.c
CommitLineData
59bc0593 1/** @file\r
2 Raw IP4 receive application\r
3\r
bcb96695
MK
4 Copyright (c) 2011-2012, Intel Corporation. All rights reserved.\r
5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
59bc0593 6\r
7**/\r
8\r
9#include "RawIp4Rx.h"\r
10\r
11UINT8 mBuffer[65536];\r
12\r
13\r
14/**\r
15 Run the raw IP4 receive application\r
16\r
17 @param [in] ArgC Argument count\r
18 @param [in] ArgV Argument value array\r
19\r
20 @retval 0 Successfully operation\r
21 **/\r
22int\r
23RawIp4Rx (\r
24 IN int ArgC,\r
25 IN char **ArgV\r
26 )\r
27{\r
28 ssize_t BytesReceived;\r
29 struct sockaddr_in LocalPort;\r
30 socklen_t LocalPortLength;\r
31 struct sockaddr_in RemotePort;\r
32 socklen_t RemotePortLength;\r
33 int RetVal;\r
34 SOCKET s;\r
35 UINT64 TotalBytesReceived;\r
36\r
37 //\r
38 // Create the socket\r
39 //\r
40 s = socket ( AF_INET, SOCK_RAW, RAW_PROTOCOL );\r
41 if ( -1 == s ) {\r
42 RetVal = GET_ERRNO;\r
43 printf ( "ERROR - socket error, errno: %d\r\n", RetVal );\r
44 }\r
45 else {\r
46 //\r
47 // Use for/break; instead of goto\r
48 //\r
49 for ( ; ; ) {\r
50 //\r
51 // Bind the socket to a known port\r
52 //\r
53 memset ( &LocalPort, 0, sizeof ( LocalPort ));\r
54 SIN_LEN ( LocalPort ) = sizeof ( LocalPort );\r
55 SIN_FAMILY ( LocalPort ) = AF_INET;\r
56 SIN_ADDR ( LocalPort ) = 0;\r
57 SIN_PORT ( LocalPort ) = 0;\r
58 RetVal = bind ( s,\r
59 (struct sockaddr *)&LocalPort,\r
60 sizeof ( LocalPort ));\r
61 if ( -1 == RetVal ) {\r
62 RetVal = GET_ERRNO;\r
63 printf ( "ERROR - bind error, errno: %d\r\n", RetVal );\r
64 break;\r
65 }\r
66\r
67 //\r
68 // Display the local address and protocol\r
69 //\r
70 LocalPortLength = sizeof ( LocalPort );\r
71 RetVal = getsockname ( s, (struct sockaddr *)&LocalPort, &LocalPortLength );\r
72 if ( 0 != RetVal ) {\r
73 RetVal = GET_ERRNO;\r
74 printf ( "ERROR - getsockname error, errno: %d\r\n", RetVal );\r
75 break;\r
76 }\r
77 printf ( "Local Address: %d.%d.%d.%d, Protocol: %d\r\n",\r
78 (UINT8)SIN_ADDR ( LocalPort ),\r
79 (UINT8)( SIN_ADDR ( LocalPort ) >> 8 ),\r
80 (UINT8)( SIN_ADDR ( LocalPort ) >> 16 ),\r
81 (UINT8)( SIN_ADDR ( LocalPort ) >> 24 ),\r
82 RAW_PROTOCOL );\r
83\r
84 //\r
85 // Use for/break instead of goto\r
86 //\r
87 TotalBytesReceived = 0;\r
88 for ( ; ; ) {\r
89 //\r
90 // Receive data from the remote system\r
91 //\r
92 do {\r
93 //\r
94 // Attempt to receive a packet\r
95 //\r
96 RemotePortLength = sizeof ( RemotePort );\r
97 BytesReceived = recvfrom ( s,\r
98 &mBuffer[0],\r
99 sizeof ( mBuffer ),\r
100 0,\r
101 (struct sockaddr *)&RemotePort,\r
102 &RemotePortLength );\r
103 RetVal = (UINT32)BytesReceived;\r
104 if ( 0 < BytesReceived ) {\r
105 //\r
106 // Display the received data\r
107 //\r
108 printf ( "%4d bytes received from %d.%d.%d.%d:%d\r\n"\r
109 "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\r\n"\r
110 "%02x %02x %02x %02x\r\n",\r
111 (UINT32)BytesReceived,\r
112 (UINT8)SIN_ADDR ( RemotePort ),\r
113 (UINT8)( SIN_ADDR ( RemotePort ) >> 8 ),\r
114 (UINT8)( SIN_ADDR ( RemotePort ) >> 16 ),\r
115 (UINT8)( SIN_ADDR ( RemotePort ) >> 24 ),\r
116 SIN_PORT ( RemotePort ),\r
117 mBuffer[0],\r
118 mBuffer[1],\r
119 mBuffer[2],\r
120 mBuffer[3],\r
121 mBuffer[4],\r
122 mBuffer[5],\r
123 mBuffer[6],\r
124 mBuffer[7],\r
125 mBuffer[8],\r
126 mBuffer[9],\r
127 mBuffer[10],\r
128 mBuffer[11],\r
129 mBuffer[12],\r
130 mBuffer[13],\r
131 mBuffer[14],\r
132 mBuffer[15],\r
133 mBuffer[16],\r
134 mBuffer[17],\r
135 mBuffer[18],\r
136 mBuffer[19]);\r
137 TotalBytesReceived += BytesReceived;\r
138\r
139 //\r
140 // All done when the correct packet is received\r
141 //\r
142 if ( mBuffer[9] == RAW_PROTOCOL ) {\r
143 break;\r
144 }\r
145 }\r
146 else if ( -1 == BytesReceived ) {\r
147 //\r
148 // Check for a timeout\r
149 //\r
150 RetVal = GET_ERRNO;\r
151 printf ( "ERROR - recv error, errno: %d\r\n", RetVal );\r
152 break;\r
153 }\r
154 } while ( 0 != RetVal );\r
155\r
156 //\r
157 // Display the bytes received\r
158 //\r
159 if ( 0 == RetVal ) {\r
160 printf ( "Total Bytes Received: %Ld\r\n", TotalBytesReceived );\r
161 }\r
162\r
163 //\r
164 // Test complete\r
165 //\r
166 break;\r
167 }\r
168 break;\r
169 }\r
170\r
171 //\r
172 // Close the socket\r
173 //\r
174 CLOSE_SOCKET ( s );\r
175 printf ( "Socket closed\r\n" );\r
176 }\r
177\r
178 //\r
179 // Return the operation status\r
180 //\r
181 return RetVal;\r
182}\r