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