ReactOS 0.4.15-dev-8058-ga7cbb60
loopback.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS TCP/IP protocol driver
4 * FILE: datalink/loopback.c
5 * PURPOSE: Loopback adapter
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
7 * REVISIONS:
8 * CSH 01/08-2000 Created
9 */
10
11#include "precomp.h"
12
14
17{
18 PIP_PACKET IPPacket = Context;
19
20 /* IPReceive() takes care of the NDIS packet */
21 IPReceive(Loopback, IPPacket);
22
23 ExFreePool(IPPacket);
24}
25
28 PNDIS_PACKET NdisPacket,
30 PVOID LinkAddress,
32/*
33 * FUNCTION: Transmits a packet
34 * ARGUMENTS:
35 * Context = Pointer to context information (NULL)
36 * NdisPacket = Pointer to NDIS packet to send
37 * Offset = Offset in packet where packet data starts
38 * LinkAddress = Pointer to link address
39 * Type = LAN protocol type
40 */
41{
42 PCHAR PacketBuffer;
43 UINT PacketLength;
44 PNDIS_PACKET XmitPacket;
45 NDIS_STATUS NdisStatus;
46 PIP_PACKET IPPacket;
47
48 ASSERT_KM_POINTER(NdisPacket);
49 ASSERT_KM_POINTER(PC(NdisPacket));
50 ASSERT_KM_POINTER(PC(NdisPacket)->DLComplete);
51
52 if (Type != LAN_PROTO_IPv4)
53 {
54 TI_DbgPrint(MAX_TRACE, ("Received unsupported protocol %u\n", Type));
55 PC(NdisPacket)->DLComplete(PC(NdisPacket)->Context, NdisPacket, NDIS_STATUS_NOT_SUPPORTED);
56 return;
57 }
58
59 TI_DbgPrint(MAX_TRACE, ("Called (NdisPacket = %x)\n", NdisPacket));
60
61 GetDataPtr( NdisPacket, 0, &PacketBuffer, &PacketLength );
62
63 NdisStatus = AllocatePacketWithBuffer
64 ( &XmitPacket, PacketBuffer, PacketLength );
65
66 if( NT_SUCCESS(NdisStatus) ) {
67 IPPacket = ExAllocatePool(NonPagedPool, sizeof(IP_PACKET));
68 if (IPPacket)
69 {
70 IPInitializePacket(IPPacket, 0);
71
72 IPPacket->NdisPacket = XmitPacket;
73
74 GetDataPtr(IPPacket->NdisPacket,
75 0,
76 (PCHAR*)&IPPacket->Header,
77 &IPPacket->TotalSize);
78
79 IPPacket->MappedHeader = TRUE;
80
81 if (!ChewCreate(LoopPassiveWorker, IPPacket))
82 {
83 IPPacket->Free(IPPacket);
84 ExFreePool(IPPacket);
85 NdisStatus = NDIS_STATUS_RESOURCES;
86 }
87 }
88 else
89 NdisStatus = NDIS_STATUS_RESOURCES;
90 }
91
92 (PC(NdisPacket)->DLComplete)
93 ( PC(NdisPacket)->Context, NdisPacket, NdisStatus );
94}
95
98 PLAN_ADAPTER *Adapter)
99/*
100 * FUNCTION: Registers loopback adapter with the network layer
101 * ARGUMENTS:
102 * AdapterName = Unused
103 * Adapter = Unused
104 * RETURNS:
105 * Status of operation
106 */
107{
108 LLIP_BIND_INFO BindInfo;
109
110 TI_DbgPrint(MID_TRACE, ("Called.\n"));
111
112 /* Bind the adapter to network (IP) layer */
113 BindInfo.Context = NULL;
114 BindInfo.HeaderSize = 0;
115 BindInfo.MinFrameSize = 0;
116 BindInfo.Address = NULL;
117 BindInfo.AddressLength = 0;
118 BindInfo.Transmit = LoopTransmit;
119
120 Loopback = IPCreateInterface(&BindInfo);
121 if (!Loopback) return NDIS_STATUS_RESOURCES;
122
123 Loopback->MTU = 16384;
124
125 Loopback->Name.Buffer = L"Loopback";
127 (USHORT)wcslen(Loopback->Name.Buffer) * sizeof(WCHAR);
128
132
134
136
137 TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
138
139 return NDIS_STATUS_SUCCESS;
140}
141
142
144 PLAN_ADAPTER Adapter)
145/*
146 * FUNCTION: Unregisters loopback adapter with the network layer
147 * ARGUMENTS:
148 * Adapter = Unused
149 * RETURNS:
150 * Status of operation
151 * NOTES:
152 * Does not care wether we have registered loopback adapter
153 */
154{
155 TI_DbgPrint(MID_TRACE, ("Called.\n"));
156
157 if (Loopback != NULL)
158 {
161 Loopback = NULL;
162 }
163
164 TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
165
166 return NDIS_STATUS_SUCCESS;
167}
Type
Definition: Type.h:7
#define AddrInitIPv4(IPAddress, RawAddress)
Definition: address.h:16
#define MID_TRACE
Definition: debug.h:15
#define MAX_TRACE
Definition: debug.h:16
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
#define ASSERT_KM_POINTER(_x)
Definition: debug.h:74
#define LOOPBACK_ADDRMASK_IPv4
Definition: ip.h:188
VOID IPAddInterfaceRoute(PIP_INTERFACE IF)
Definition: ip.c:262
#define LOOPBACK_ADDRESS_IPv4
Definition: ip.h:186
#define PC(Packet)
Definition: ip.h:106
VOID IPDestroyInterface(PIP_INTERFACE IF)
Definition: ip.c:244
VOID IPUnregisterInterface(PIP_INTERFACE IF)
Definition: ip.c:349
BOOLEAN IPRegisterInterface(PIP_INTERFACE IF)
Definition: ip.c:289
PIP_INTERFACE IPCreateInterface(PLLIP_BIND_INFO BindInfo)
Definition: ip.c:182
PIP_PACKET IPInitializePacket(PIP_PACKET IPPacket, ULONG Type)
Definition: ip.c:92
#define LOOPBACK_BCASTADDR_IPv4
Definition: ip.h:187
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
#define NonPagedPool
Definition: env_spec_w32.h:307
#define ExAllocatePool(type, size)
Definition: fbtusb.h:44
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
void GetDataPtr(PNDIS_PACKET Packet, UINT Offset, PCHAR *DataOut, PUINT Size)
Definition: routines.c:65
#define LAN_PROTO_IPv4
Definition: lan.h:126
PIP_INTERFACE Loopback
Definition: loopback.c:13
NDIS_STATUS LoopRegisterAdapter(PNDIS_STRING AdapterName, PLAN_ADAPTER *Adapter)
Definition: loopback.c:96
VOID LoopPassiveWorker(PVOID Context)
Definition: loopback.c:15
VOID LoopTransmit(PVOID Context, PNDIS_PACKET NdisPacket, UINT Offset, PVOID LinkAddress, USHORT Type)
Definition: loopback.c:26
NDIS_STATUS LoopUnregisterAdapter(PLAN_ADAPTER Adapter)
Definition: loopback.c:143
#define AllocatePacketWithBuffer(x, y, z)
Definition: memtrack.h:7
unsigned int UINT
Definition: ndis.h:50
#define NDIS_STATUS_NOT_SUPPORTED
Definition: ndis.h:479
#define NDIS_STATUS_SUCCESS
Definition: ndis.h:346
_Must_inspect_result_ _Out_ PNDIS_STATUS _Out_ PNDIS_STATUS _Out_ PNDIS_HANDLE _Out_ PUINT _In_ UINT _In_ NDIS_HANDLE _In_ NDIS_HANDLE _In_ PNDIS_STRING AdapterName
Definition: ndis.h:6016
#define NDIS_STATUS_RESOURCES
Definition: ndis.h:466
int NDIS_STATUS
Definition: ntddndis.h:475
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
#define L(x)
Definition: ntvdm.h:50
unsigned short USHORT
Definition: pedump.c:61
VOID IPReceive(PIP_INTERFACE IF, PIP_PACKET IPPacket)
Definition: receive.c:638
IP_ADDRESS Broadcast
Definition: ip.h:162
UNICODE_STRING Name
Definition: ip.h:163
IP_ADDRESS Unicast
Definition: ip.h:159
IP_ADDRESS Netmask
Definition: ip.h:161
UINT MTU
Definition: ip.h:157
Definition: ip.h:77
OBJECT_FREE_ROUTINE Free
Definition: ip.h:78
BOOLEAN MappedHeader
Definition: ip.h:81
PNDIS_PACKET NdisPacket
Definition: ip.h:88
PVOID Header
Definition: ip.h:83
UINT TotalSize
Definition: ip.h:86
PUCHAR Address
Definition: ip.h:130
UINT MinFrameSize
Definition: ip.h:129
PVOID Context
Definition: ip.h:127
UINT HeaderSize
Definition: ip.h:128
UINT AddressLength
Definition: ip.h:131
LL_TRANSMIT_ROUTINE Transmit
Definition: ip.h:132
USHORT MaximumLength
Definition: env_spec_w32.h:370
char * PCHAR
Definition: typedefs.h:51
BOOLEAN ChewCreate(VOID(*Worker)(PVOID), PVOID WorkerContext)
Definition: workqueue.c:61
__wchar_t WCHAR
Definition: xmlstorage.h:180