1 /** @file 2 Raw IP4 transmit 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 "RawIp4Tx.h" 16 17 UINT8 mBuffer[1024]; 18 19 /** 20 Transmit raw IP4 packets to the remote system. 21 22 @param [in] ArgC Argument count 23 @param [in] ArgV Argument value array 24 25 @retval 0 Successfully operation 26 **/ 27 28 int 29 RawIp4Tx ( 30 IN int ArgC, 31 IN char **ArgV 32 ) 33 { 34 UINT32 BytesSent; 35 ssize_t BytesTransmitted; 36 struct sockaddr_in LocalPort; 37 UINT32 RemoteAddress[4]; 38 struct sockaddr_in RemotePort; 39 int RetVal; 40 UINT32 TotalSent; 41 SOCKET s; 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 // Validate the arguments 58 // 59 if (( 2 > ArgC ) 60 || ( 4 != sscanf ( ArgV[1], 61 "%d.%d.%d.%d", 62 &RemoteAddress[0], 63 &RemoteAddress[1], 64 &RemoteAddress[2], 65 &RemoteAddress[3])) 66 || ( 224 < RemoteAddress[0]) 67 || ( 255 < RemoteAddress[1]) 68 || ( 255 < RemoteAddress[2]) 69 || ( 255 < RemoteAddress[3]) 70 || (( 0 == RemoteAddress[0]) 71 && ( 0 == RemoteAddress[1]) 72 && ( 0 == RemoteAddress[2]) 73 && ( 0 == RemoteAddress[3]))) { 74 printf ( "%s <remote IP address>\r\n", ArgV[0]); 75 RetVal = EINVAL; 76 break; 77 } 78 79 // 80 // Bind the socket to a local port 81 // 82 memset ( &LocalPort, 0, sizeof ( LocalPort )); 83 SIN_LEN ( LocalPort ) = sizeof ( LocalPort ); 84 SIN_FAMILY ( LocalPort ) = AF_INET; 85 SIN_ADDR ( LocalPort ) = 0; 86 SIN_PORT ( LocalPort ) = 0; 87 RetVal = bind ( s, 88 (struct sockaddr *)&LocalPort, 89 sizeof ( LocalPort )); 90 if ( -1 == RetVal ) { 91 RetVal = GET_ERRNO; 92 printf ( "ERROR - bind error, errno: %d\r\n", RetVal ); 93 break; 94 } 95 96 // 97 // Specify the remote port 98 // 99 memset ( &RemotePort, 0, sizeof ( RemotePort )); 100 SIN_LEN ( RemotePort ) = sizeof ( RemotePort ); 101 SIN_FAMILY ( RemotePort ) = AF_INET; 102 SIN_ADDR ( RemotePort ) = ( RemoteAddress[3] << 24 ) 103 | ( RemoteAddress[2] << 16 ) 104 | ( RemoteAddress[1] << 8 ) 105 | RemoteAddress[0]; 106 SIN_PORT ( RemotePort ) = 0; 107 108 // 109 // Initialize the messages 110 // 111 memset ( &mBuffer[0], 0, sizeof ( mBuffer )); 112 113 // 114 // Send the data before the out-of-band message 115 // 116 TotalSent = 0; 117 BytesSent = 0; 118 do { 119 BytesTransmitted = sendto ( s, 120 &mBuffer[BytesSent], 121 sizeof ( mBuffer ) - BytesSent, 122 0, 123 (struct sockaddr *)&RemotePort, 124 sizeof ( RemotePort )); 125 if ( -1 == BytesTransmitted ) { 126 RetVal = GET_ERRNO; 127 printf ( "ERROR - send before error, errno: %d\r\n", RetVal ); 128 break; 129 } 130 BytesSent += (UINT32)BytesTransmitted; 131 RetVal = 0; 132 } while ( sizeof ( mBuffer ) > BytesSent ); 133 if ( 0 != RetVal ) { 134 break; 135 } 136 TotalSent += BytesSent; 137 138 // 139 // Test completed successfully 140 // 141 if ( 0 == RetVal ) { 142 printf ( "Bytes sent: %8d\r\n", TotalSent ); 143 } 144 break; 145 } 146 147 // 148 // Close the socket 149 // 150 CLOSE_SOCKET ( s ); 151 } 152 153 // 154 // Return the operation status 155 // 156 return RetVal; 157 } 158