Home | History | Annotate | Download | only in Tcp4Dxe
      1 /** @file
      2   I/O interfaces between TCP and IpIo.
      3 
      4 Copyright (c) 2005 - 2009, Intel Corporation. All rights reserved.<BR>
      5 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<BR>
      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 "Tcp4Main.h"
     16 
     17 
     18 /**
     19   Packet receive callback function provided to IP_IO, used to call
     20   the proper function to handle the packet received by IP.
     21 
     22   @param  Status      Status of the received packet.
     23   @param  IcmpErr     ICMP error number.
     24   @param  NetSession  Pointer to the net session of this packet.
     25   @param  Pkt         Pointer to the recieved packet.
     26   @param  Context     Pointer to the context configured in IpIoOpen(), not used
     27                       now.
     28 
     29 **/
     30 VOID
     31 EFIAPI
     32 Tcp4RxCallback (
     33   IN EFI_STATUS                       Status,
     34   IN UINT8                            IcmpErr,
     35   IN EFI_NET_SESSION_DATA             *NetSession,
     36   IN NET_BUF                          *Pkt,
     37   IN VOID                             *Context    OPTIONAL
     38   )
     39 {
     40   if (EFI_SUCCESS == Status) {
     41     TcpInput (Pkt, NetSession->Source.Addr[0], NetSession->Dest.Addr[0]);
     42   } else {
     43     TcpIcmpInput (Pkt, IcmpErr, NetSession->Source.Addr[0], NetSession->Dest.Addr[0]);
     44   }
     45 }
     46 
     47 
     48 /**
     49   Send the segment to IP via IpIo function.
     50 
     51   @param  Tcb         Pointer to the TCP_CB of this TCP instance.
     52   @param  Nbuf        Pointer to the TCP segment to be sent.
     53   @param  Src         Source address of the TCP segment.
     54   @param  Dest        Destination address of the TCP segment.
     55 
     56   @retval 0           The segment was sent out successfully.
     57   @retval -1          The segment was failed to send.
     58 
     59 **/
     60 INTN
     61 TcpSendIpPacket (
     62   IN TCP_CB    *Tcb,
     63   IN NET_BUF   *Nbuf,
     64   IN UINT32    Src,
     65   IN UINT32    Dest
     66   )
     67 {
     68   EFI_STATUS       Status;
     69   IP_IO            *IpIo;
     70   IP_IO_OVERRIDE   Override;
     71   SOCKET           *Sock;
     72   VOID             *IpSender;
     73   TCP4_PROTO_DATA  *TcpProto;
     74   EFI_IP_ADDRESS   Source;
     75   EFI_IP_ADDRESS   Destination;
     76 
     77   Source.Addr[0]      = Src;
     78   Destination.Addr[0] = Dest;
     79 
     80   if (NULL == Tcb) {
     81 
     82     IpIo     = NULL;
     83     IpSender = IpIoFindSender (&IpIo, IP_VERSION_4, &Source);
     84 
     85     if (IpSender == NULL) {
     86       DEBUG ((EFI_D_WARN, "TcpSendIpPacket: No appropriate IpSender.\n"));
     87       return -1;
     88     }
     89   } else {
     90 
     91     Sock     = Tcb->Sk;
     92     TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved;
     93     IpIo     = TcpProto->TcpService->IpIo;
     94     IpSender = Tcb->IpInfo;
     95   }
     96 
     97   Override.Ip4OverrideData.TypeOfService            = 0;
     98   Override.Ip4OverrideData.TimeToLive               = 255;
     99   Override.Ip4OverrideData.DoNotFragment            = FALSE;
    100   Override.Ip4OverrideData.Protocol                 = EFI_IP_PROTO_TCP;
    101   ZeroMem (&Override.Ip4OverrideData.GatewayAddress, sizeof (EFI_IPv4_ADDRESS));
    102   CopyMem (&Override.Ip4OverrideData.SourceAddress, &Src, sizeof (EFI_IPv4_ADDRESS));
    103 
    104   Status = IpIoSend (IpIo, Nbuf, IpSender, NULL, NULL, &Destination, &Override);
    105 
    106   if (EFI_ERROR (Status)) {
    107     DEBUG ((EFI_D_ERROR, "TcpSendIpPacket: return %r error\n", Status));
    108     return -1;
    109   }
    110 
    111   return 0;
    112 }
    113