ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

loopback.c
Go to the documentation of this file.
00001 /*
00002  * COPYRIGHT:   See COPYING in the top level directory
00003  * PROJECT:     ReactOS TCP/IP protocol driver
00004  * FILE:        datalink/loopback.c
00005  * PURPOSE:     Loopback adapter
00006  * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
00007  * REVISIONS:
00008  *   CSH 01/08-2000 Created
00009  */
00010 
00011 #include "precomp.h"
00012 
00013 PIP_INTERFACE Loopback = NULL;
00014 
00015 VOID LoopPassiveWorker(
00016   PVOID Context)
00017 {
00018   PIP_PACKET IPPacket = Context;
00019 
00020   /* IPReceive() takes care of the NDIS packet */
00021   IPReceive(Loopback, IPPacket);
00022 
00023   ExFreePool(IPPacket);
00024 }
00025 
00026 VOID LoopTransmit(
00027   PVOID Context,
00028   PNDIS_PACKET NdisPacket,
00029   UINT Offset,
00030   PVOID LinkAddress,
00031   USHORT Type)
00032 /*
00033  * FUNCTION: Transmits a packet
00034  * ARGUMENTS:
00035  *   Context     = Pointer to context information (NULL)
00036  *   NdisPacket  = Pointer to NDIS packet to send
00037  *   Offset      = Offset in packet where packet data starts
00038  *   LinkAddress = Pointer to link address
00039  *   Type        = LAN protocol type (unused)
00040  */
00041 {
00042     PCHAR PacketBuffer;
00043     UINT PacketLength;
00044     PNDIS_PACKET XmitPacket;
00045     NDIS_STATUS NdisStatus;
00046     PIP_PACKET IPPacket;
00047 
00048     ASSERT_KM_POINTER(NdisPacket);
00049     ASSERT_KM_POINTER(PC(NdisPacket));
00050     ASSERT_KM_POINTER(PC(NdisPacket)->DLComplete);
00051 
00052     TI_DbgPrint(MAX_TRACE, ("Called (NdisPacket = %x)\n", NdisPacket));
00053 
00054     GetDataPtr( NdisPacket, 0, &PacketBuffer, &PacketLength );
00055 
00056     NdisStatus = AllocatePacketWithBuffer
00057         ( &XmitPacket, PacketBuffer, PacketLength );
00058 
00059     if( NT_SUCCESS(NdisStatus) ) {
00060         IPPacket = ExAllocatePool(NonPagedPool, sizeof(IP_PACKET));
00061         if (IPPacket)
00062         {
00063             IPInitializePacket(IPPacket, 0);
00064 
00065             IPPacket->NdisPacket = XmitPacket;
00066 
00067             GetDataPtr(IPPacket->NdisPacket,
00068                        0,
00069                        (PCHAR*)&IPPacket->Header,
00070                        &IPPacket->TotalSize);
00071 
00072             IPPacket->MappedHeader = TRUE;
00073 
00074             if (!ChewCreate(LoopPassiveWorker, IPPacket))
00075             {
00076                 IPPacket->Free(IPPacket);
00077                 ExFreePool(IPPacket);
00078                 NdisStatus = NDIS_STATUS_RESOURCES;
00079             }
00080         }
00081         else
00082             NdisStatus = NDIS_STATUS_RESOURCES;
00083     }
00084 
00085     (PC(NdisPacket)->DLComplete)
00086         ( PC(NdisPacket)->Context, NdisPacket, NdisStatus );
00087 }
00088 
00089 NDIS_STATUS LoopRegisterAdapter(
00090   PNDIS_STRING AdapterName,
00091   PLAN_ADAPTER *Adapter)
00092 /*
00093  * FUNCTION: Registers loopback adapter with the network layer
00094  * ARGUMENTS:
00095  *   AdapterName = Unused
00096  *   Adapter     = Unused
00097  * RETURNS:
00098  *   Status of operation
00099  */
00100 {
00101   LLIP_BIND_INFO BindInfo;
00102 
00103   TI_DbgPrint(MID_TRACE, ("Called.\n"));
00104 
00105   /* Bind the adapter to network (IP) layer */
00106   BindInfo.Context = NULL;
00107   BindInfo.HeaderSize = 0;
00108   BindInfo.MinFrameSize = 0;
00109   BindInfo.Address = NULL;
00110   BindInfo.AddressLength = 0;
00111   BindInfo.Transmit = LoopTransmit;
00112 
00113   Loopback = IPCreateInterface(&BindInfo);
00114   if (!Loopback) return NDIS_STATUS_RESOURCES;
00115     
00116   Loopback->MTU = 16384;
00117 
00118   Loopback->Name.Buffer = L"Loopback";
00119   Loopback->Name.MaximumLength = Loopback->Name.Length =
00120       wcslen(Loopback->Name.Buffer) * sizeof(WCHAR);
00121 
00122   AddrInitIPv4(&Loopback->Unicast, LOOPBACK_ADDRESS_IPv4);
00123   AddrInitIPv4(&Loopback->Netmask, LOOPBACK_ADDRMASK_IPv4);
00124   AddrInitIPv4(&Loopback->Broadcast, LOOPBACK_BCASTADDR_IPv4);
00125 
00126   IPRegisterInterface(Loopback);
00127     
00128   IPAddInterfaceRoute(Loopback);
00129 
00130   TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
00131 
00132   return NDIS_STATUS_SUCCESS;
00133 }
00134 
00135 
00136 NDIS_STATUS LoopUnregisterAdapter(
00137   PLAN_ADAPTER Adapter)
00138 /*
00139  * FUNCTION: Unregisters loopback adapter with the network layer
00140  * ARGUMENTS:
00141  *   Adapter = Unused
00142  * RETURNS:
00143  *   Status of operation
00144  * NOTES:
00145  *   Does not care wether we have registered loopback adapter
00146  */
00147 {
00148   TI_DbgPrint(MID_TRACE, ("Called.\n"));
00149 
00150   if (Loopback != NULL)
00151     {
00152       IPUnregisterInterface(Loopback);
00153       IPDestroyInterface(Loopback);
00154       Loopback = NULL;
00155     }
00156 
00157   TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
00158 
00159   return NDIS_STATUS_SUCCESS;
00160 }

Generated on Sat May 26 2012 04:34:53 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.