2004-11-16 Casper S. Hornstrup <chorns@users.sourceforge.net>
[reactos.git] / reactos / drivers / net / tcpip / datalink / loopback.c
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
13 VOID LoopTransmit(
14 PVOID Context,
15 PNDIS_PACKET NdisPacket,
16 UINT Offset,
17 PVOID LinkAddress,
18 USHORT Type)
19 /*
20 * FUNCTION: Transmits a packet
21 * ARGUMENTS:
22 * Context = Pointer to context information (NULL)
23 * NdisPacket = Pointer to NDIS packet to send
24 * Offset = Offset in packet where packet data starts
25 * LinkAddress = Pointer to link address
26 * Type = LAN protocol type (unused)
27 */
28 {
29 IP_PACKET IPPacket;
30
31 TI_DbgPrint(MAX_TRACE, ("Called (NdisPacket = %x)\n", NdisPacket));
32
33 IPPacket.NdisPacket = NdisPacket;
34
35 IPReceive(Context, &IPPacket);
36 TI_DbgPrint(MAX_TRACE, ("Finished receive\n"));
37 ASSERT_KM_POINTER(Packet);
38 ASSERT_KM_POINTER(PC(Packet));
39 ASSERT_KM_POINTER(PC(Packet)->DLComplete);
40 PC(NdisPacket)->DLComplete(Context, NdisPacket, NDIS_STATUS_SUCCESS);
41 TI_DbgPrint(MAX_TRACE, ("Done\n"));
42 }
43
44 NDIS_STATUS LoopRegisterAdapter(
45 PNDIS_STRING AdapterName,
46 PLAN_ADAPTER *Adapter)
47 /*
48 * FUNCTION: Registers loopback adapter with the network layer
49 * ARGUMENTS:
50 * AdapterName = Unused
51 * Adapter = Unused
52 * RETURNS:
53 * Status of operation
54 */
55 {
56 PIP_ADDRESS Address;
57 NDIS_STATUS Status;
58
59 Status = NDIS_STATUS_SUCCESS;
60
61 TI_DbgPrint(MID_TRACE, ("Called.\n"));
62
63 Address = AddrBuildIPv4(LOOPBACK_ADDRESS_IPv4);
64 if (Address != NULL)
65 {
66 LLIP_BIND_INFO BindInfo;
67
68 /* Bind the adapter to network (IP) layer */
69 BindInfo.Context = NULL;
70 BindInfo.HeaderSize = 0;
71 BindInfo.MinFrameSize = 0;
72 BindInfo.MTU = 16384;
73 BindInfo.Address = NULL;
74 BindInfo.AddressLength = 0;
75 BindInfo.Transmit = LoopTransmit;
76
77 Loopback = IPCreateInterface(&BindInfo);
78
79 if ((Loopback != NULL) && (IPCreateNTE(Loopback, Address, 8)))
80 {
81 /* Reference the interface for the NTE. The reference for
82 the address is just passed on to the NTE */
83 ReferenceObject(Loopback);
84
85 IPRegisterInterface(Loopback);
86 }
87 else
88 {
89 Status = NDIS_STATUS_RESOURCES;
90 }
91 }
92 else
93 {
94 Status = NDIS_STATUS_RESOURCES;
95 }
96
97 if (!NT_SUCCESS(Status))
98 {
99 LoopUnregisterAdapter(NULL);
100 }
101
102 TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
103
104 return Status;
105 }
106
107
108 NDIS_STATUS LoopUnregisterAdapter(
109 PLAN_ADAPTER Adapter)
110 /*
111 * FUNCTION: Unregisters loopback adapter with the network layer
112 * ARGUMENTS:
113 * Adapter = Unused
114 * RETURNS:
115 * Status of operation
116 * NOTES:
117 * Does not care wether we have registered loopback adapter
118 */
119 {
120 TI_DbgPrint(MID_TRACE, ("Called.\n"));
121
122 if (Loopback != NULL)
123 {
124 IPUnregisterInterface(Loopback);
125 IPDestroyInterface(Loopback);
126 Loopback = NULL;
127 }
128
129 TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
130
131 return NDIS_STATUS_SUCCESS;
132 }