0bf62fd509d48a17fb2aaacfad8b4f65d20f0a74
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 (unused)
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 TI_DbgPrint(MAX_TRACE
, ("Called (NdisPacket = %x)\n", NdisPacket
));
54 GetDataPtr( NdisPacket
, 0, &PacketBuffer
, &PacketLength
);
56 NdisStatus
= AllocatePacketWithBuffer
57 ( &XmitPacket
, PacketBuffer
, PacketLength
);
59 if( NT_SUCCESS(NdisStatus
) ) {
60 IPPacket
= ExAllocatePool(NonPagedPool
, sizeof(IP_PACKET
));
63 IPInitializePacket(IPPacket
, 0);
65 IPPacket
->NdisPacket
= XmitPacket
;
67 GetDataPtr(IPPacket
->NdisPacket
,
69 (PCHAR
*)&IPPacket
->Header
,
70 &IPPacket
->TotalSize
);
72 IPPacket
->MappedHeader
= TRUE
;
74 if (!ChewCreate(LoopPassiveWorker
, IPPacket
))
76 IPPacket
->Free(IPPacket
);
78 NdisStatus
= NDIS_STATUS_RESOURCES
;
82 NdisStatus
= NDIS_STATUS_RESOURCES
;
85 (PC(NdisPacket
)->DLComplete
)
86 ( PC(NdisPacket
)->Context
, NdisPacket
, NdisStatus
);
89 NDIS_STATUS
LoopRegisterAdapter(
90 PNDIS_STRING AdapterName
,
91 PLAN_ADAPTER
*Adapter
)
93 * FUNCTION: Registers loopback adapter with the network layer
95 * AdapterName = Unused
101 LLIP_BIND_INFO BindInfo
;
103 TI_DbgPrint(MID_TRACE
, ("Called.\n"));
105 /* Bind the adapter to network (IP) layer */
106 BindInfo
.Context
= NULL
;
107 BindInfo
.HeaderSize
= 0;
108 BindInfo
.MinFrameSize
= 0;
109 BindInfo
.MTU
= 16384;
110 BindInfo
.Address
= NULL
;
111 BindInfo
.AddressLength
= 0;
112 BindInfo
.Transmit
= LoopTransmit
;
114 Loopback
= IPCreateInterface(&BindInfo
);
115 if (!Loopback
) return NDIS_STATUS_RESOURCES
;
117 Loopback
->Name
.Buffer
= L
"Loopback";
118 Loopback
->Name
.MaximumLength
= Loopback
->Name
.Length
=
119 wcslen(Loopback
->Name
.Buffer
) * sizeof(WCHAR
);
121 AddrInitIPv4(&Loopback
->Unicast
, LOOPBACK_ADDRESS_IPv4
);
122 AddrInitIPv4(&Loopback
->Netmask
, LOOPBACK_ADDRMASK_IPv4
);
123 AddrInitIPv4(&Loopback
->Broadcast
, LOOPBACK_BCASTADDR_IPv4
);
125 IPRegisterInterface(Loopback
);
127 TI_DbgPrint(MAX_TRACE
, ("Leaving.\n"));
129 return NDIS_STATUS_SUCCESS
;
133 NDIS_STATUS
LoopUnregisterAdapter(
134 PLAN_ADAPTER Adapter
)
136 * FUNCTION: Unregisters loopback adapter with the network layer
140 * Status of operation
142 * Does not care wether we have registered loopback adapter
145 TI_DbgPrint(MID_TRACE
, ("Called.\n"));
147 if (Loopback
!= NULL
)
149 IPUnregisterInterface(Loopback
);
150 IPDestroyInterface(Loopback
);
154 TI_DbgPrint(MAX_TRACE
, ("Leaving.\n"));
156 return NDIS_STATUS_SUCCESS
;