Home | History | Annotate | Download | only in RawIp4Tx
      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