This source file includes following definitions.
- min
- dev_add_pack
- dev_remove_pack
- get_dev
- dev_queue_xmit
- dev_rint
- dev_tint
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 #include <asm/segment.h>
24 #include <asm/system.h>
25 #include <linux/types.h>
26 #include <linux/kernel.h>
27 #include <linux/sched.h>
28 #include <linux/string.h>
29 #include <linux/mm.h>
30 #include <linux/socket.h>
31 #include <netinet/in.h>
32 #include <asm/memory.h>
33 #include "dev.h"
34 #include "eth.h"
35 #include "timer.h"
36 #include "ip.h"
37 #include "tcp.h"
38 #include "sock.h"
39 #include <linux/errno.h>
40 #include "arp.h"
41
42 #undef DEV_DEBUG
43 #ifdef DEV_DEBUG
44 #define PRINTK printk
45 #else
46 #define PRINTK dummy_routine
47 #endif
48
49
50 static unsigned long
51 min(unsigned long a, unsigned long b)
52 {
53 if (a < b) return (a);
54 return (b);
55 }
56
57 void
58 dev_add_pack (struct packet_type *pt)
59 {
60 struct packet_type *p1;
61 pt->next = ptype_base;
62
63
64 for (p1 = ptype_base; p1 != NULL; p1 = p1->next)
65 {
66 if (p1->type == pt->type)
67 {
68 pt->copy = 1;
69 break;
70 }
71 }
72
73 ptype_base = pt;
74
75 }
76
77 void
78 dev_remove_pack (struct packet_type *pt)
79 {
80 struct packet_type *lpt, *pt1;
81 if (pt == ptype_base)
82 {
83 ptype_base = pt->next;
84 return;
85 }
86
87 lpt = NULL;
88
89 for (pt1 = ptype_base; pt1->next != NULL; pt1=pt1->next)
90 {
91 if (pt1->next == pt )
92 {
93 cli();
94 if (!pt->copy && lpt)
95 lpt->copy = 0;
96 pt1->next = pt->next;
97 sti();
98 return;
99 }
100
101 if (pt1->next -> type == pt ->type)
102 {
103 lpt = pt1->next;
104 }
105 }
106 }
107
108 struct device *
109 get_dev (char *name)
110 {
111 struct device *dev;
112 for (dev = dev_base; dev != NULL; dev=dev->next)
113 {
114 if (strcmp (dev->name, name) == 0) return (dev);
115 }
116 return (NULL);
117 }
118
119 void
120 dev_queue_xmit (struct sk_buff *skb, struct device *dev, int pri)
121 {
122 struct sk_buff *skb2;
123 PRINTK ("eth_queue_xmit (skb=%X, dev=%X, pri = %d)\n", skb, dev, pri);
124 skb->dev = dev;
125 if (pri < 0 || pri >= DEV_NUMBUFFS)
126 {
127 printk ("bad priority in dev_queue_xmit.\n");
128 pri = 1;
129 }
130
131 if (dev->hard_start_xmit(skb, dev) == 0)
132 {
133 return;
134 }
135
136 if (skb->next != NULL)
137 {
138 printk ("retransmitted packet still on queue. \n");
139 return;
140 }
141
142
143 skb->next = NULL;
144
145
146
147 PRINTK ("eth_queue dev->buffs[%d]=%X\n",pri, dev->buffs[pri]);
148
149 cli();
150 if (dev->buffs[pri] == NULL)
151 {
152 dev->buffs[pri]=skb;
153 skb->next = skb;
154 skb->prev = skb;
155 }
156 else
157 {
158 skb2=dev->buffs[pri];
159 skb->next = skb2;
160 skb->prev = skb2->prev;
161 skb->next->prev = skb;
162 skb->prev->next = skb;
163 }
164 sti();
165
166 }
167
168
169
170
171
172
173
174
175
176 int
177 dev_rint(unsigned char *buff, unsigned long len, int flags,
178 struct device * dev)
179 {
180 struct sk_buff *skb=NULL;
181 struct packet_type *ptype;
182 unsigned short type;
183 unsigned char flag =0;
184 unsigned char *to;
185 int amount;
186
187
188 if (len > 0 && buff != NULL)
189 {
190 skb = malloc (sizeof (*skb) + len);
191 skb->mem_len = sizeof (*skb) + len;
192 skb->mem_addr = skb;
193 }
194
195
196 if (buff != NULL && skb != NULL)
197 {
198 if ( !(flags & IN_SKBUFF))
199 {
200 to = (unsigned char *)(skb+1);
201 while (len > 0)
202 {
203 amount = min (len, (unsigned long) dev->rmem_end -
204 (unsigned long) buff);
205 memcpy (to, buff, amount);
206 len -= amount;
207 buff += amount;
208 to += amount;
209 if ((unsigned long)buff == dev->rmem_end)
210 buff = (unsigned char *)dev->rmem_start;
211 }
212 }
213 else
214 {
215 free_s (skb->mem_addr, skb->mem_len);
216 skb = (struct sk_buff *)buff;
217 }
218
219 skb->len = len;
220 skb->dev = dev;
221 skb->sk = NULL;
222
223
224 cli();
225 if (dev-> backlog == NULL)
226 {
227 skb->prev = skb;
228 skb->next = skb;
229 dev->backlog = skb;
230 }
231 else
232 {
233 skb ->prev = dev->backlog->prev;
234 skb->next = dev->backlog;
235 skb->next->prev = skb;
236 skb->prev->next = skb;
237 }
238 sti();
239 return (0);
240 }
241
242 if (skb != NULL)
243 free_s (skb->mem_addr, skb->mem_len);
244
245
246
247 if (dev->backlog == NULL)
248 {
249 if (buff == NULL)
250 {
251 sti();
252 return (1);
253 }
254
255 if (skb != NULL)
256 {
257 sti();
258 return (-1);
259 }
260
261 sti();
262 printk ("dev_rint:Dropping packets due to lack of memory\n");
263 return (1);
264 }
265
266 skb= dev->backlog;
267 if (skb->next == skb)
268 {
269 dev->backlog = NULL;
270 }
271 else
272 {
273 dev->backlog = skb->next;
274 skb->next->prev = skb->prev;
275 skb->prev->next = skb->next;
276 }
277 sti();
278
279
280 skb->h.raw = (unsigned char *)(skb+1) + dev->hard_header_len;
281 skb->len -= dev->hard_header_len;
282
283
284 type = dev->type_trans (skb, dev);
285
286
287
288 for (ptype = ptype_base; ptype != NULL; ptype=ptype->next)
289 {
290 if (ptype->type == type)
291 {
292 struct sk_buff *skb2;
293
294 if (ptype->copy)
295 {
296 skb2 = malloc (skb->mem_len);
297 if (skb2 == NULL) continue;
298 memcpy (skb2, skb, skb->mem_len);
299 skb2->mem_addr = skb2;
300 }
301 else
302 {
303 skb2 = skb;
304 flag = 1;
305 }
306
307 ptype->func (skb2, dev, ptype);
308 }
309 }
310
311 if (!flag)
312 {
313 PRINTK ("discarding packet type = %X\n", type);
314 free_skb (skb, FREE_READ);
315 }
316
317 if (buff == NULL)
318 return (0);
319 else
320 return (-1);
321 }
322
323
324
325
326
327
328
329 unsigned long
330 dev_tint(unsigned char *buff, struct device *dev)
331 {
332 int i;
333 int tmp;
334 struct sk_buff *skb;
335 for (i=0; i < DEV_NUMBUFFS; i++)
336 {
337 while (dev->buffs[i]!=NULL)
338 {
339 cli();
340 skb=dev->buffs[i];
341 if (skb->next == skb)
342 {
343 dev->buffs[i] = NULL;
344 }
345 else
346 {
347 dev->buffs[i]=skb->next;
348 skb->prev->next = skb->next;
349 skb->next->prev = skb->prev;
350 }
351 skb->next = NULL;
352 skb->prev = NULL;
353 sti();
354 tmp = skb->len;
355 if (!skb->arp)
356 {
357 if (dev->rebuild_header (skb+1, dev))
358 {
359 skb->dev = dev;
360 arp_queue (skb);
361 continue;
362 }
363 }
364
365 if (tmp <= dev->mtu)
366 {
367 if (dev->send_packet != NULL)
368 {
369 dev->send_packet(skb, dev);
370 }
371 if (buff != NULL)
372 memcpy (buff, skb + 1, tmp);
373
374 PRINTK (">>\n");
375 print_eth ((struct enet_header *)(skb+1));
376 }
377 else
378 {
379 printk ("**** bug len bigger than mtu. \n");
380 }
381
382 if (skb->free)
383 {
384 free_skb(skb, FREE_WRITE);
385 }
386
387 if (tmp != 0)
388 return (tmp);
389 }
390 }
391 PRINTK ("dev_tint returning 0 \n");
392 return (0);
393 }
394