1 // SoftEther VPN Source Code - Developer Edition Master Branch
2 // Cedar Communication Module
3 
4 
5 // NullLan.c
6 // Virtual LAN card device driver for testing
7 
8 #include "NullLan.h"
9 
10 #include "Connection.h"
11 #include "Session.h"
12 
13 #include "Mayaqua/Kernel.h"
14 #include "Mayaqua/Memory.h"
15 #include "Mayaqua/Microsoft.h"
16 #include "Mayaqua/Object.h"
17 #include "Mayaqua/Str.h"
18 #include "Mayaqua/Tick64.h"
19 
20 static UCHAR null_lan_broadcast_address[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
21 
22 // Get the packet adapter
NullGetPacketAdapter()23 PACKET_ADAPTER *NullGetPacketAdapter()
24 {
25 	PACKET_ADAPTER *pa = NewPacketAdapter(NullPaInit, NullPaGetCancel, NullPaGetNextPacket,
26 		NullPaPutPacket, NullPaFree);
27 
28 	return pa;
29 }
30 
31 // Generate MAC address
NullGenerateMacAddress(UCHAR * mac,UINT id,UINT seq)32 void NullGenerateMacAddress(UCHAR *mac, UINT id, UINT seq)
33 {
34 	UCHAR hash[SHA1_SIZE];
35 	char name[MAX_SIZE];
36 	BUF *b;
37 	// Validate arguments
38 	if (mac == NULL)
39 	{
40 		return;
41 	}
42 
43 	b = NewBuf();
44 	WriteBufInt(b, id);
45 	WriteBufInt(b, seq);
46 	GetMachineHostName(name, sizeof(name));
47 #ifdef	OS_WIN32
48 	WriteBufInt(b, MsGetCurrentProcessId());
49 #endif	// OS_WIN32
50 	WriteBufStr(b, name);
51 
52 	Sha1(hash, b->Buf, b->Size);
53 
54 	FreeBuf(b);
55 
56 	Copy(mac, hash, 6);
57 	mac[0] = 0x7E;
58 }
59 
60 // Packet generation thread
NullPacketGenerateThread(THREAD * t,void * param)61 void NullPacketGenerateThread(THREAD *t, void *param)
62 {
63 	NULL_LAN *n = (NULL_LAN *)param;
64 	UINT64 end_tick = Tick64() + (UINT64)(60 * 1000);
65 	UINT seq = 0;
66 	// Validate arguments
67 	if (t == NULL || param == NULL)
68 	{
69 		return;
70 	}
71 
72 	while (true)
73 	{
74 		/*if (Tick64() >= end_tick)
75 		{
76 			break;
77 		}*/
78 
79 		Wait(n->Event, Rand32() % 1500);
80 		if (n->Halt)
81 		{
82 			break;
83 		}
84 
85 		LockQueue(n->PacketQueue);
86 		{
87 			UCHAR *data;
88 			BLOCK *b;
89 			UINT size = Rand32() % 1500 + 14;
90 			UCHAR dst_mac[6];
91 
92 			NullGenerateMacAddress(n->MacAddr, n->Id, seq);
93 
94 			//NullGenerateMacAddress(dst_mac, n->Id + 1, 0);
95 			//StrToMac(dst_mac, "00-1B-21-A9-47-E6");
96 			StrToMac(dst_mac, "00-AC-7A-EF-83-FD");
97 
98 			data = Malloc(size);
99 			Copy(data, null_lan_broadcast_address, 6);
100 			//Copy(data, dst_mac, 6);
101 			Copy(data + 6, n->MacAddr, 6);
102 			b = NewBlock(data, size, 0);
103 			InsertQueue(n->PacketQueue, b);
104 		}
105 		UnlockQueue(n->PacketQueue);
106 		Cancel(n->Cancel);
107 
108 		//seq++;
109 	}
110 }
111 
112 // Initialize the packet adapter
NullPaInit(SESSION * s)113 bool NullPaInit(SESSION *s)
114 {
115 	NULL_LAN *n;
116 	static UINT id_seed = 0;
117 	// Validate arguments
118 	if (s == NULL)
119 	{
120 		return false;
121 	}
122 
123 	id_seed++;
124 
125 	n = ZeroMalloc(sizeof(NULL_LAN));
126 	n->Id = id_seed;
127 	s->PacketAdapter->Param = (void *)n;
128 
129 	n->Cancel = NewCancel();
130 	n->PacketQueue = NewQueue();
131 	n->Event = NewEvent();
132 
133 	NullGenerateMacAddress(n->MacAddr, n->Id, 0);
134 
135 	n->PacketGeneratorThread = NewThread(NullPacketGenerateThread, n);
136 
137 	return true;
138 }
139 
140 // Get the cancel object
NullPaGetCancel(SESSION * s)141 CANCEL *NullPaGetCancel(SESSION *s)
142 {
143 	// Validate arguments
144 	NULL_LAN *n;
145 	if (s == NULL || (n = s->PacketAdapter->Param) == NULL)
146 	{
147 		return NULL;
148 	}
149 
150 	AddRef(n->Cancel->ref);
151 
152 	return n->Cancel;
153 }
154 
155 // Get the next packet
NullPaGetNextPacket(SESSION * s,void ** data)156 UINT NullPaGetNextPacket(SESSION *s, void **data)
157 {
158 	UINT size = 0;
159 	// Validate arguments
160 	NULL_LAN *n;
161 	if (s == NULL || (n = s->PacketAdapter->Param) == NULL)
162 	{
163 		return INFINITE;
164 	}
165 
166 	LockQueue(n->PacketQueue);
167 	{
168 		BLOCK *b = GetNext(n->PacketQueue);
169 
170 		if (b != NULL)
171 		{
172 			*data = b->Buf;
173 			size = b->Size;
174 			Free(b);
175 		}
176 	}
177 	UnlockQueue(n->PacketQueue);
178 
179 	return size;
180 }
181 
182 // Write the packet
NullPaPutPacket(SESSION * s,void * data,UINT size)183 bool NullPaPutPacket(SESSION *s, void *data, UINT size)
184 {
185 	// Validate arguments
186 	if (s == NULL)
187 	{
188 		return false;
189 	}
190 	if (data == NULL)
191 	{
192 		return true;
193 	}
194 
195 	// Packet ignored
196 	Free(data);
197 
198 	return true;
199 }
200 
201 // Release
NullPaFree(SESSION * s)202 void NullPaFree(SESSION *s)
203 {
204 	// Validate arguments
205 	NULL_LAN *n;
206 	BLOCK *b;
207 	if (s == NULL || (n = s->PacketAdapter->Param) == NULL)
208 	{
209 		return;
210 	}
211 
212 	n->Halt = true;
213 	Set(n->Event);
214 
215 	WaitThread(n->PacketGeneratorThread, INFINITE);
216 	ReleaseThread(n->PacketGeneratorThread);
217 
218 	LockQueue(n->PacketQueue);
219 	{
220 		while (b = GetNext(n->PacketQueue))
221 		{
222 			FreeBlock(b);
223 		}
224 	}
225 	UnlockQueue(n->PacketQueue);
226 
227 	ReleaseQueue(n->PacketQueue);
228 
229 	ReleaseCancel(n->Cancel);
230 
231 	ReleaseEvent(n->Event);
232 
233 	s->PacketAdapter->Param = NULL;
234 	Free(n);
235 }
236 
237 
238