Removed remaining kernel imports from ip lib.
[reactos.git] / reactos / drivers / lib / ip / network / 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 PIP_INTERFACE Loopback = NULL;
14
15 VOID LoopTransmit(
16 PVOID Context,
17 PNDIS_PACKET NdisPacket,
18 UINT Offset,
19 PVOID LinkAddress,
20 USHORT Type)
21 /*
22 * FUNCTION: Transmits a packet
23 * ARGUMENTS:
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)
29 */
30 {
31 IP_PACKET IPPacket;
32
33 TI_DbgPrint(MAX_TRACE, ("Called (NdisPacket = %x)\n", NdisPacket));
34
35 IPPacket.NdisPacket = NdisPacket;
36 IPPacket.HeaderSize = 0;
37 GetDataPtr( NdisPacket, 0, (PCHAR *)&IPPacket.Header, &IPPacket.TotalSize );
38
39 TI_DbgPrint(MAX_TRACE,
40 ("Doing receive (complete: %x, context %x, packet %x)\n",
41 PC(NdisPacket)->DLComplete, Context, NdisPacket));
42 IPReceive(Context, &IPPacket);
43 TI_DbgPrint(MAX_TRACE,
44 ("Finished receive (complete: %x, context %x, packet %x)\n",
45 PC(NdisPacket)->DLComplete, Context, NdisPacket));
46 PC(NdisPacket)->DLComplete(Context, NdisPacket, NDIS_STATUS_SUCCESS);
47 TI_DbgPrint(MAX_TRACE, ("Done\n"));
48 }
49
50 NDIS_STATUS LoopRegisterAdapter(
51 PNDIS_STRING AdapterName,
52 PLAN_ADAPTER *Adapter)
53 /*
54 * FUNCTION: Registers loopback adapter with the network layer
55 * ARGUMENTS:
56 * AdapterName = Unused
57 * Adapter = Unused
58 * RETURNS:
59 * Status of operation
60 */
61 {
62 PIP_ADDRESS Address;
63 NDIS_STATUS Status;
64
65 Status = NDIS_STATUS_SUCCESS;
66
67 TI_DbgPrint(MID_TRACE, ("Called.\n"));
68
69 Address = AddrBuildIPv4(LOOPBACK_ADDRESS_IPv4);
70 if (Address != NULL)
71 {
72 LLIP_BIND_INFO BindInfo;
73
74 /* Bind the adapter to network (IP) layer */
75 BindInfo.Context = NULL;
76 BindInfo.HeaderSize = 0;
77 BindInfo.MinFrameSize = 0;
78 BindInfo.MTU = 16384;
79 BindInfo.Address = NULL;
80 BindInfo.AddressLength = 0;
81 BindInfo.Transmit = LoopTransmit;
82
83 Loopback = IPCreateInterface(&BindInfo);
84
85 if ((Loopback != NULL) && (IPCreateNTE(Loopback, Address, 8)))
86 {
87 IPRegisterInterface(Loopback);
88 }
89 else
90 {
91 Status = NDIS_STATUS_RESOURCES;
92 }
93 }
94 else
95 {
96 Status = NDIS_STATUS_RESOURCES;
97 }
98
99 if (!NT_SUCCESS(Status))
100 {
101 LoopUnregisterAdapter(NULL);
102 }
103
104 TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
105
106 return Status;
107 }
108
109
110 NDIS_STATUS LoopUnregisterAdapter(
111 PLAN_ADAPTER Adapter)
112 /*
113 * FUNCTION: Unregisters loopback adapter with the network layer
114 * ARGUMENTS:
115 * Adapter = Unused
116 * RETURNS:
117 * Status of operation
118 * NOTES:
119 * Does not care wether we have registered loopback adapter
120 */
121 {
122 TI_DbgPrint(MID_TRACE, ("Called.\n"));
123
124 if (Loopback != NULL)
125 {
126 IPUnregisterInterface(Loopback);
127 IPDestroyInterface(Loopback);
128 Loopback = NULL;
129 }
130
131 TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
132
133 return NDIS_STATUS_SUCCESS;
134 }