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
;
17 PNDIS_PACKET NdisPacket
,
22 * FUNCTION: Transmits a packet
24 * Context = Pointer to context information (NULL)
25 * NdisPacket = Pointer to NDIS packet to send
26 * Offset = Offset in packet where packet data starts
27 * LinkAddress = Pointer to link address
28 * Type = LAN protocol type (unused)
33 PNDIS_PACKET XmitPacket
;
34 NDIS_STATUS NdisStatus
;
36 PNDIS_BUFFER NdisBuffer
;
38 ASSERT_KM_POINTER(NdisPacket
);
39 ASSERT_KM_POINTER(PC(NdisPacket
));
40 ASSERT_KM_POINTER(PC(NdisPacket
)->DLComplete
);
42 TI_DbgPrint(MAX_TRACE
, ("Called (NdisPacket = %x)\n", NdisPacket
));
44 GetDataPtr( NdisPacket
, 0, &PacketBuffer
, &PacketLength
);
46 NdisStatus
= AllocatePacketWithBuffer
47 ( &XmitPacket
, PacketBuffer
, PacketLength
);
49 (PC(NdisPacket
)->DLComplete
)
50 ( PC(NdisPacket
)->Context
, NdisPacket
, NdisStatus
);
52 if( NT_SUCCESS(NdisStatus
) ) {
53 IPInitializePacket(&IPPacket
, 0);
55 IPPacket
.NdisPacket
= XmitPacket
;
57 NdisGetFirstBufferFromPacket(XmitPacket
,
63 IPReceive(Loopback
, &IPPacket
);
65 FreeNdisPacket(XmitPacket
);
68 TI_DbgPrint(MAX_TRACE
, ("Done\n"));
71 NDIS_STATUS
LoopRegisterAdapter(
72 PNDIS_STRING AdapterName
,
73 PLAN_ADAPTER
*Adapter
)
75 * FUNCTION: Registers loopback adapter with the network layer
77 * AdapterName = Unused
83 LLIP_BIND_INFO BindInfo
;
85 TI_DbgPrint(MID_TRACE
, ("Called.\n"));
87 /* Bind the adapter to network (IP) layer */
88 BindInfo
.Context
= NULL
;
89 BindInfo
.HeaderSize
= 0;
90 BindInfo
.MinFrameSize
= 0;
92 BindInfo
.Address
= NULL
;
93 BindInfo
.AddressLength
= 0;
94 BindInfo
.Transmit
= LoopTransmit
;
96 Loopback
= IPCreateInterface(&BindInfo
);
97 if (!Loopback
) return NDIS_STATUS_RESOURCES
;
99 Loopback
->Name
.Buffer
= L
"Loopback";
100 Loopback
->Name
.MaximumLength
= Loopback
->Name
.Length
=
101 wcslen(Loopback
->Name
.Buffer
) * sizeof(WCHAR
);
103 AddrInitIPv4(&Loopback
->Unicast
, LOOPBACK_ADDRESS_IPv4
);
104 AddrInitIPv4(&Loopback
->Netmask
, LOOPBACK_ADDRMASK_IPv4
);
105 AddrInitIPv4(&Loopback
->Broadcast
, LOOPBACK_BCASTADDR_IPv4
);
107 IPRegisterInterface(Loopback
);
108 IPAddInterfaceRoute(Loopback
);
110 TI_DbgPrint(MAX_TRACE
, ("Leaving.\n"));
112 return NDIS_STATUS_SUCCESS
;
116 NDIS_STATUS
LoopUnregisterAdapter(
117 PLAN_ADAPTER Adapter
)
119 * FUNCTION: Unregisters loopback adapter with the network layer
123 * Status of operation
125 * Does not care wether we have registered loopback adapter
128 TI_DbgPrint(MID_TRACE
, ("Called.\n"));
130 if (Loopback
!= NULL
)
132 IPUnregisterInterface(Loopback
);
133 IPDestroyInterface(Loopback
);
137 TI_DbgPrint(MAX_TRACE
, ("Leaving.\n"));
139 return NDIS_STATUS_SUCCESS
;