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)
8 * CSH 01/08-2000 Created
13 PIP_INTERFACE Loopback
= NULL
;
15 VOID
LoopPassiveWorker(
18 PIP_PACKET IPPacket
= Context
;
20 /* IPReceive() takes care of the NDIS packet */
21 IPReceive(Loopback
, IPPacket
);
28 PNDIS_PACKET NdisPacket
,
33 * FUNCTION: Transmits a packet
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
44 PNDIS_PACKET XmitPacket
;
45 NDIS_STATUS NdisStatus
;
48 ASSERT_KM_POINTER(NdisPacket
);
49 ASSERT_KM_POINTER(PC(NdisPacket
));
50 ASSERT_KM_POINTER(PC(NdisPacket
)->DLComplete
);
52 if (Type
!= LAN_PROTO_IPv4
)
54 TI_DbgPrint(MAX_TRACE
, ("Received unsupported protocol %u\n", Type
));
55 PC(NdisPacket
)->DLComplete(PC(NdisPacket
)->Context
, NdisPacket
, NDIS_STATUS_NOT_SUPPORTED
);
59 TI_DbgPrint(MAX_TRACE
, ("Called (NdisPacket = %x)\n", NdisPacket
));
61 GetDataPtr( NdisPacket
, 0, &PacketBuffer
, &PacketLength
);
63 NdisStatus
= AllocatePacketWithBuffer
64 ( &XmitPacket
, PacketBuffer
, PacketLength
);
66 if( NT_SUCCESS(NdisStatus
) ) {
67 IPPacket
= ExAllocatePool(NonPagedPool
, sizeof(IP_PACKET
));
70 IPInitializePacket(IPPacket
, 0);
72 IPPacket
->NdisPacket
= XmitPacket
;
74 GetDataPtr(IPPacket
->NdisPacket
,
76 (PCHAR
*)&IPPacket
->Header
,
77 &IPPacket
->TotalSize
);
79 IPPacket
->MappedHeader
= TRUE
;
81 if (!ChewCreate(LoopPassiveWorker
, IPPacket
))
83 IPPacket
->Free(IPPacket
);
85 NdisStatus
= NDIS_STATUS_RESOURCES
;
89 NdisStatus
= NDIS_STATUS_RESOURCES
;
92 (PC(NdisPacket
)->DLComplete
)
93 ( PC(NdisPacket
)->Context
, NdisPacket
, NdisStatus
);
96 NDIS_STATUS
LoopRegisterAdapter(
97 PNDIS_STRING AdapterName
,
98 PLAN_ADAPTER
*Adapter
)
100 * FUNCTION: Registers loopback adapter with the network layer
102 * AdapterName = Unused
105 * Status of operation
108 LLIP_BIND_INFO BindInfo
;
110 TI_DbgPrint(MID_TRACE
, ("Called.\n"));
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
;
120 Loopback
= IPCreateInterface(&BindInfo
);
121 if (!Loopback
) return NDIS_STATUS_RESOURCES
;
123 Loopback
->MTU
= 16384;
125 Loopback
->Name
.Buffer
= L
"Loopback";
126 Loopback
->Name
.MaximumLength
= Loopback
->Name
.Length
=
127 wcslen(Loopback
->Name
.Buffer
) * sizeof(WCHAR
);
129 AddrInitIPv4(&Loopback
->Unicast
, LOOPBACK_ADDRESS_IPv4
);
130 AddrInitIPv4(&Loopback
->Netmask
, LOOPBACK_ADDRMASK_IPv4
);
131 AddrInitIPv4(&Loopback
->Broadcast
, LOOPBACK_BCASTADDR_IPv4
);
133 IPRegisterInterface(Loopback
);
135 IPAddInterfaceRoute(Loopback
);
137 TI_DbgPrint(MAX_TRACE
, ("Leaving.\n"));
139 return NDIS_STATUS_SUCCESS
;
143 NDIS_STATUS
LoopUnregisterAdapter(
144 PLAN_ADAPTER Adapter
)
146 * FUNCTION: Unregisters loopback adapter with the network layer
150 * Status of operation
152 * Does not care wether we have registered loopback adapter
155 TI_DbgPrint(MID_TRACE
, ("Called.\n"));
157 if (Loopback
!= NULL
)
159 IPUnregisterInterface(Loopback
);
160 IPDestroyInterface(Loopback
);
164 TI_DbgPrint(MAX_TRACE
, ("Leaving.\n"));
166 return NDIS_STATUS_SUCCESS
;