Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenloopback.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
1.7.6.1
|