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