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