From 8a67d61da4d5a8f08a656cbeea2d902d0ad9042a Mon Sep 17 00:00:00 2001 From: vanjeff Date: Tue, 24 Jul 2007 08:06:37 +0000 Subject: Import SnpDxe, Tcp4Dxe, Udp4Dxe and MnpDxe. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3416 6f19259b-4bc3-4df7-8a09-765794883524 --- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c | 117 ++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c (limited to 'MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c') diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c new file mode 100644 index 0000000000..2f7a49fcb8 --- /dev/null +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c @@ -0,0 +1,117 @@ +/** @file + +Copyright (c) 2005 - 2006, Intel Corporation +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +Module Name: + + Tcp4Io.c + +Abstract: + + I/O interfaces between TCP and IpIo. + + +**/ + + +#include "Tcp4Main.h" + + +/** + Packet receive callback function provided to IP_IO, used to call + the proper function to handle the packet received by IP. + + @param Status Status of the received packet. + @param IcmpErr ICMP error number. + @param NetSession Pointer to the net session of this packet. + @param Pkt Pointer to the recieved packet. + @param Context Pointer to the context configured in IpIoOpen(), not used + now. + + @return None + +**/ +VOID +Tcp4RxCallback ( + IN EFI_STATUS Status, + IN ICMP_ERROR IcmpErr, + IN EFI_NET_SESSION_DATA *NetSession, + IN NET_BUF *Pkt, + IN VOID *Context OPTIONAL + ) +{ + if (EFI_SUCCESS == Status) { + TcpInput (Pkt, NetSession->Source, NetSession->Dest); + } else { + TcpIcmpInput (Pkt, IcmpErr, NetSession->Source, NetSession->Dest); + } +} + + +/** + Send the segment to IP via IpIo function. + + @param Tcb Pointer to the TCP_CB of this TCP instance. + @param Nbuf Pointer to the TCP segment to be sent. + @param Src Source address of the TCP segment. + @param Dest Destination address of the TCP segment. + + @retval 0 The segment was sent out successfully. + @retval -1 The segment was failed to send. + +**/ +INTN +TcpSendIpPacket ( + IN TCP_CB *Tcb, + IN NET_BUF *Nbuf, + IN UINT32 Src, + IN UINT32 Dest + ) +{ + EFI_STATUS Status; + IP_IO *IpIo; + IP_IO_OVERRIDE Override; + SOCKET *Sock; + VOID *IpSender; + TCP4_PROTO_DATA *TcpProto; + + if (NULL == Tcb) { + + IpIo = NULL; + IpSender = IpIoFindSender (&IpIo, Src); + + if (IpSender == NULL) { + TCP4_DEBUG_WARN (("TcpSendIpPacket: No appropriate IpSender.\n")); + return -1; + } + } else { + + Sock = Tcb->Sk; + TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved; + IpIo = TcpProto->TcpService->IpIo; + IpSender = Tcb->IpInfo; + } + + Override.TypeOfService = 0; + Override.TimeToLive = 255; + Override.DoNotFragment = FALSE; + Override.Protocol = EFI_IP_PROTO_TCP; + EFI_IP4 (Override.GatewayAddress) = 0; + EFI_IP4 (Override.SourceAddress) = Src; + + Status = IpIoSend (IpIo, Nbuf, IpSender, NULL, NULL, Dest, &Override); + + if (EFI_ERROR (Status)) { + TCP4_DEBUG_ERROR (("TcpSendIpPacket: return %r error\n", Status)); + return -1; + } + + return 0; +} -- cgit v1.2.3