|
|
1.1 root 1: /* sock.c */
2: /*
3: Copyright (C) 1992 Ross Biro
4:
5: This program is free software; you can redistribute it and/or modify
6: it under the terms of the GNU General Public License as published by
7: the Free Software Foundation; either version 2, or (at your option)
8: any later version.
9:
10: This program is distributed in the hope that it will be useful,
11: but WITHOUT ANY WARRANTY; without even the implied warranty of
12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13: GNU General Public License for more details.
14:
15: You should have received a copy of the GNU General Public License
16: along with this program; if not, write to the Free Software
17: Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18:
19: The Author may be reached as [email protected] or
20: C/O Department of Mathematics; Stanford University; Stanford, CA 94305
21: */
22: #include <linux/errno.h>
23: #include <linux/types.h>
24: #include <linux/socket.h>
25: #include <netinet/in.h>
26: #include <linux/kernel.h>
27: #include <linux/sched.h>
28: #include <linux/timer.h>
29: #include <linux/sock_ioctl.h>
30: #include <asm/memory.h>
31: #include "../kern_sock.h"
32: #include "timer.h"
33: #include "ip.h"
34: #include "tcp.h"
35: #include "udp.h"
36: #include "sock.h"
37: #include <asm/segment.h>
38: #include <asm/system.h>
39: #include <linux/fcntl.h>
40:
41: #ifdef MEM_DEBUG
42: #define MPRINTK printk
43: #else
44: #define MPRINTK dummy_routine
45: #endif
46:
47: #define min(a,b) ((a)<(b)?(a):(b))
48: #define swap(a,b) {unsigned long c; c=a; a=b; b=c;}
49:
50: extern struct proto tcp_prot;
51: extern struct proto udp_prot;
52: extern struct proto raw_prot;
53: extern struct proto packet_prot;
54:
55: static int ip_proto_init(void);
56: static int ip_proto_create(struct socket *sock, int protocol);
57: static int ip_proto_dup(struct socket *newsock, struct socket *oldsock);
58: static int ip_proto_release(struct socket *sock, struct socket *peer);
59: static int ip_proto_bind(struct socket *sock, struct sockaddr *umyaddr,
60: int sockaddr_len);
61: static int ip_proto_connect(struct socket *sock, struct sockaddr *uservaddr,
62: int sockaddr_len, int flags);
63: static int ip_proto_socketpair(struct socket *sock1, struct socket *sock2);
64: static int ip_proto_accept(struct socket *sock, struct socket *newsock, int flags);
65: static int ip_proto_getname(struct socket *sock, struct sockaddr *usockaddr,
66: int *usockaddr_len, int peer);
67: static int ip_proto_read(struct socket *sock, char *ubuf, int size,
68: int nonblock);
69: static int ip_proto_write(struct socket *sock, char *ubuf, int size,
70: int nonblock);
71: static int ip_proto_select(struct socket *sock, int which, select_table *wait);
72: static int ip_proto_ioctl(struct socket *sock, unsigned int cmd,
73: unsigned long arg);
74: static int ip_proto_listen(struct socket *sock, int backlog);
75:
76: static int ip_proto_send (struct socket *sock, void *buff, int len,
77: int nonblock, unsigned flags);
78: static int ip_proto_recv (struct socket *sock, void *buff, int len,
79: int nonblock, unsigned flags);
80: static int ip_proto_sendto (struct socket *sock, void *buff, int len,
81: int nonblock, unsigned flags,
82: struct sockaddr *addr, int addr_len);
83: static int ip_proto_recvfrom (struct socket *sock, void *buff, int len,
84: int nonblock, unsigned flags,
85: struct sockaddr *addr, int *addr_len);
86:
87: static int ip_proto_shutdown (struct socket *sock, int how);
88:
89:
90: static int ip_proto_setsockopt (struct socket *sock, int level, int optname,
91: char *optval, int optlen);
92: static int ip_proto_getsockopt (struct socket *sock, int level, int optname,
93: char *optval, int *optlen);
94: static int ip_proto_fcntl (struct socket *sock, unsigned int cmd,
95: unsigned long arg);
96:
97:
98: struct proto_ops inet_proto_ops =
99: {
100: ip_proto_init,
101: ip_proto_create,
102: ip_proto_dup,
103: ip_proto_release,
104: ip_proto_bind,
105: ip_proto_connect,
106: ip_proto_socketpair,
107: ip_proto_accept,
108: ip_proto_getname,
109: ip_proto_read,
110: ip_proto_write,
111: ip_proto_select,
112: ip_proto_ioctl,
113: ip_proto_listen,
114: ip_proto_send,
115: ip_proto_recv,
116: ip_proto_sendto,
117: ip_proto_recvfrom,
118: ip_proto_shutdown,
119: ip_proto_setsockopt,
120: ip_proto_getsockopt,
121: ip_proto_fcntl
122: };
123:
124: void
125: print_sk (volatile struct sock *sk)
126: {
127: PRINTK (" wmem_alloc = %d\n", sk->wmem_alloc);
128: PRINTK (" rmem_alloc = %d\n", sk->rmem_alloc);
129: PRINTK (" send_head = %X\n", sk->send_head);
130: PRINTK (" state = %d\n",sk->state);
131: PRINTK (" wback = %X, rqueue = %X\n", sk->wback, sk->rqueue);
132: PRINTK (" wfront = %X\n", sk->wfront);
133: PRINTK (" daddr = %X, saddr = %X\n", sk->daddr,sk->saddr);
134: PRINTK (" num = %d", sk->num);
135: PRINTK (" next = %X\n", sk->next);
136: PRINTK (" send_seq = %d, acked_seq = %d, copied_seq = %d\n",
137: sk->send_seq, sk->acked_seq, sk->copied_seq);
138: PRINTK (" rcv_ack_seq = %d, window_seq = %d, fin_seq = %d\n",
139: sk->rcv_ack_seq, sk->window_seq, sk->fin_seq);
140: PRINTK (" prot = %X\n", sk->prot);
141: PRINTK (" pair = %X, back_log = %X\n", sk->pair,sk->back_log);
142: PRINTK (" inuse = %d , blog = %d\n", sk->inuse, sk->blog);
143: PRINTK (" dead = %d delay_acks=%d\n", sk->dead, sk->delay_acks);
144: PRINTK (" retransmits = %d, timeout = %d\n", sk->retransmits, sk->timeout);
145: PRINTK (" cong_window = %d, packets_out = %d\n", sk->cong_window,
146: sk->packets_out);
147: }
148:
149: void
150: print_skb(struct sk_buff *skb)
151: {
152: PRINTK (" prev = %X, next = %X\n", skb->prev, skb->next);
153: PRINTK (" sk = %X link3 = %X\n", skb->sk, skb->link3);
154: PRINTK (" mem_addr = %X, mem_len = %d\n", skb->mem_addr, skb->mem_len);
155: PRINTK (" used = %d free = %d\n", skb->used,skb->free);
156: }
157:
158: /* just used to reference some pointers to keep gcc from over optimizing
159: my code so that it doesn't work. */
160: void dummy_routine(void *dummy, ...)
161: {
162: return;
163: }
164:
165: void
166: lock_skb (struct sk_buff *skb)
167: {
168: if (skb->lock)
169: {
170: printk ("*** bug more than one lock on sk_buff. \n");
171: }
172: skb->lock = 1;
173: }
174:
175:
176: void
177: free_skb (struct sk_buff *skb, int rw)
178: {
179: if (skb->lock)
180: {
181: skb->free = 1;
182: return;
183: }
184: if (skb->sk)
185: {
186: if (rw)
187: {
188: skb->sk->prot->rfree (skb->sk, skb->mem_addr, skb->mem_len);
189: }
190: else
191: {
192: skb->sk->prot->wfree (skb->sk, skb->mem_addr, skb->mem_len);
193: }
194: }
195: else
196: {
197: free_s (skb->mem_addr, skb->mem_len);
198: }
199: }
200:
201: void
202: unlock_skb (struct sk_buff *skb, int rw)
203: {
204: if (skb->lock != 1)
205: {
206: printk ("*** bug unlocking non-locked sk_buff. \n");
207: }
208: skb->lock = 0;
209: if (skb->free)
210: free_skb (skb, rw);
211: }
212:
213: static int
214: sk_inuse( struct proto *prot, int num)
215: {
216: volatile struct sock *sk;
217: for (sk = prot->sock_array[num & (SOCK_ARRAY_SIZE -1 )];
218: sk != NULL; sk=sk->next)
219: {
220: if (sk->dummy_th.source == num) return (1);
221: }
222: return (0);
223: }
224:
225: unsigned short
226: get_new_socknum(struct proto *prot, unsigned short base)
227: {
228: static int start=0;
229: /* used to cycle through the port numbers so the chances of
230: a confused connection drop. */
231:
232: int i,j;
233: int best=0;
234: int size=32767; /* a big num. */
235: volatile struct sock *sk;
236: start++;
237: if (base == 0) base = PROT_SOCK+1+(start % 1024);
238: if (base <= PROT_SOCK)
239: {
240: base += PROT_SOCK+(start % 1024);
241: }
242:
243: /* now look through the entire array and try to find an empty
244: ptr. */
245: for (i = 0; i < SOCK_ARRAY_SIZE; i++)
246: {
247: j = 0;
248: sk = prot->sock_array[(i+base+1) & (SOCK_ARRAY_SIZE -1)];
249: while (sk != NULL)
250: {
251: sk = sk->next;
252: j++;
253: }
254: if (j == 0) return (i+base+1);
255: if (j < size)
256: {
257: best = i;
258: size = j;
259: }
260: }
261: /* now make sure the one we want is not in use. */
262: while (sk_inuse (prot, base +best+1))
263: {
264: best += SOCK_ARRAY_SIZE;
265: }
266: return (best+base+1);
267:
268: }
269:
270: void
271: put_sock(unsigned short num, volatile struct sock *sk)
272: {
273: volatile struct sock *sk1;
274: volatile struct sock *sk2;
275: int mask;
276:
277: PRINTK ("put_sock (num = %d, sk = %X\n", num, sk);
278: sk->num = num;
279: sk->next = NULL;
280: num = num & (SOCK_ARRAY_SIZE -1);
281:
282: /* we can't have an interupt renter here. */
283: cli();
284: if (sk->prot->sock_array[num] == NULL)
285: {
286: sk->prot->sock_array[num] = sk;
287: sti();
288: return;
289: }
290: sti();
291: for (mask = 0xff000000; mask != 0xffffffff; mask = (mask >> 8) | mask)
292: {
293: if (mask & sk->saddr)
294: {
295: mask = mask << 8;
296: break;
297: }
298: }
299:
300: PRINTK ("mask = %X\n", mask);
301:
302: cli();
303: sk1 = sk->prot->sock_array[num];
304: for (sk2 = sk1; sk2 != NULL; sk2=sk2->next)
305: {
306: if (!(sk2->saddr & mask))
307: {
308: if (sk2 == sk1)
309: {
310: sk->next = sk->prot->sock_array[num];
311: sk->prot->sock_array[num] = sk;
312: sti();
313: return;
314: }
315: sk->next = sk2;
316: sk1->next= sk;
317: sti();
318: return;
319: }
320: sk1 = sk2;
321: }
322: /* goes at the end. */
323: sk->next = NULL;
324: sk1->next = sk;
325: sti();
326: }
327:
328:
329: static void
330: remove_sock(volatile struct sock *sk1)
331: {
332: volatile struct sock *sk2;
333: PRINTK ("remove_sock(sk1=%X)\n",sk1);
334:
335: /* we can't have this changing out from under us. */
336: cli();
337: sk2=sk1->prot->sock_array[sk1->num & (SOCK_ARRAY_SIZE -1)];
338: if (sk2 == sk1)
339: {
340: sk1->prot->sock_array[sk1->num & (SOCK_ARRAY_SIZE -1)] = sk1->next;
341: sti();
342: return;
343: }
344: while (sk2->next != sk1)
345: {
346: if (sk2 == NULL)
347: {
348: sti();
349: PRINTK ("remove_sock: sock not found.\n");
350: return;
351: }
352: sk2=sk2->next;
353: }
354: sk2->next = sk1->next;
355: sti();
356: }
357:
358: void
359: destroy_sock(volatile struct sock *sk)
360: {
361:
362: struct sk_buff *skb;
363: PRINTK ("destroying socket %X\n",sk);
364: /* just to be safe. */
365: sk->inuse = 1;
366:
367: remove_sock (sk);
368: /* now we can no longer get new packets. */
369:
370: delete_timer((struct timer *)&sk->time_wait);
371:
372: /* cleanup up the write buffer. */
373: for (skb = sk->wfront; skb != NULL; )
374: {
375: struct sk_buff *skb2;
376: skb2=skb->next;
377: free_skb(skb, FREE_WRITE);
378: skb=skb2;
379: }
380:
381: sk->wfront = NULL;
382:
383: if (sk->rqueue != NULL)
384: {
385: skb = sk->rqueue;
386: do {
387: struct sk_buff *skb2;
388: skb2=skb->next;
389: /* this will take care of closing sockets that were
390: listening and didn't accept everything. */
391:
392: if (skb->sk != NULL && skb->sk != sk)
393: {
394: skb->sk->dead = 1;
395: skb->sk->prot->close (skb->sk, 0);
396: }
397: free_skb(skb, FREE_READ);
398: skb=skb2;
399: } while (skb != sk->rqueue);
400: }
401:
402: sk->rqueue = NULL;
403:
404: /* now we need to clean up the send head. */
405: for (skb = sk->send_head; skb != NULL; )
406: {
407: struct sk_buff *skb2;
408: /* we need to remove skb from the transmit queue. */
409: cli();
410: /* see if it's in a transmit queue. */
411: if (skb->next != NULL)
412: {
413: if (skb->next != skb)
414: {
415: skb->next->prev = skb->prev;
416: skb->prev->next = skb->next;
417: }
418: else
419: {
420: int i;
421: for (i = 0; i < DEV_NUMBUFFS; i++)
422: {
423: if (skb->dev && skb->dev->buffs[i] == skb)
424: {
425: skb->dev->buffs[i]= NULL;
426: break;
427: }
428: }
429: }
430: }
431: sti();
432: skb2=skb->link3;
433: free_skb(skb, FREE_WRITE);
434: skb=skb2;
435: }
436:
437: sk->send_head = NULL;
438:
439: /* and now the backlog. */
440:
441: if (sk->back_log != NULL)
442: {
443: /* this should never happen. */
444: printk ("cleaning back_log. \n");
445: cli();
446: skb = sk->back_log;
447: do {
448: struct sk_buff *skb2;
449: skb2=skb->next;
450: free_skb(skb, FREE_READ);
451: skb=skb2;
452: } while (skb != sk->back_log);
453: sti();
454: }
455:
456: sk->back_log = NULL;
457:
458: /* now if everything is gone we can free the socket structure,
459: otherwise we need to keep it around until everything is gone. */
460: if (sk->rmem_alloc == 0 && sk->wmem_alloc == 0)
461: {
462: free_s ((void *)sk,sizeof (*sk));
463: }
464: else
465: {
466: /* this should never happen. */
467: /* actually it can if an ack has just been sent. */
468: PRINTK ("possible memory leak in socket = %X\n", sk);
469: print_sk (sk);
470: sk->destroy = 1;
471: sk->ack_backlog = 0;
472: sk->inuse = 0;
473: sk->time_wait.len = SOCK_DESTROY_TIME;
474: sk->timeout = TIME_DESTROY;
475: reset_timer ((struct timer *)&sk->time_wait);
476: }
477:
478: }
479:
480:
481: static int
482: ip_proto_fcntl (struct socket *sock, unsigned int cmd, unsigned long arg)
483: {
484: volatile struct sock *sk;
485: sk=sock->data;
486: if (sk == NULL)
487: {
488: printk ("Warning: sock->data = NULL: %d\n" ,__LINE__);
489: return (0);
490: }
491: switch (cmd)
492: {
493: case F_SETOWN:
494: sk->proc = arg;
495: return (0);
496:
497: case F_GETOWN:
498: return (sk->proc);
499:
500: default:
501: return (-EINVAL);
502: }
503: }
504:
505: static int
506: ip_proto_setsockopt(struct socket *sock, int level, int optname,
507: char *optval, int optlen)
508: {
509: volatile struct sock *sk;
510: int val;
511: /* This should really pass things on to the other levels. */
512: if (level != SOL_SOCKET) return (-EOPNOTSUPP);
513: sk = sock->data;
514: if (sk == NULL)
515: {
516: printk ("Warning: sock->data = NULL: %d\n" ,__LINE__);
517: return (0);
518: }
519: verify_area (optval, sizeof (int));
520: val = get_fs_long ((unsigned long *)optval);
521: switch (optname)
522: {
523: case SO_TYPE:
524: case SO_ERROR:
525: default:
526: return (-ENOPROTOOPT);
527:
528: case SO_DEBUG: /* not implemented. */
529: case SO_DONTROUTE:
530: case SO_BROADCAST:
531: case SO_SNDBUF:
532: case SO_RCVBUF:
533: return (0);
534:
535: case SO_REUSEADDR:
536: if (val)
537: sk->reuse = 1;
538: else
539: sk->reuse = 1;
540: return (0);
541:
542: case SO_KEEPALIVE:
543: if (val)
544: sk->keepopen = 1;
545: else
546: sk->keepopen = 0;
547: return (0);
548:
549: case SO_OOBINLINE:
550: if (val)
551: sk->urginline = 1;
552: else
553: sk->urginline = 0;
554: return (0);
555:
556: case SO_NO_CHECK:
557: if (val)
558: sk->no_check = 1;
559: else
560: sk->no_check = 0;
561: return (0);
562:
563: case SO_PRIORITY:
564: if (val >= 0 && val < DEV_NUMBUFFS)
565: {
566: sk->priority = val;
567: }
568: else
569: {
570: return (-EINVAL);
571: }
572: return (0);
573:
574: }
575: }
576:
577: static int
578: ip_proto_getsockopt(struct socket *sock, int level, int optname,
579: char *optval, int *optlen)
580: {
581: volatile struct sock *sk;
582: int val;
583: /* This should really pass things on to the other levels. */
584: if (level != SOL_SOCKET) return (-EOPNOTSUPP);
585: sk = sock->data;
586: if (sk == NULL)
587: {
588: printk ("Warning: sock->data = NULL: %d\n" ,__LINE__);
589: return (0);
590: }
591: switch (optname)
592: {
593: default:
594: return (-ENOPROTOOPT);
595:
596: case SO_DEBUG: /* not implemented. */
597: case SO_DONTROUTE:
598: case SO_BROADCAST:
599: case SO_SNDBUF:
600: case SO_RCVBUF:
601: val = 0;
602: break;
603:
604: case SO_REUSEADDR:
605: val = sk->reuse;
606: break;
607:
608: case SO_KEEPALIVE:
609: val = sk->keepopen;
610: break;
611:
612: case SO_TYPE:
613: if (sk->prot == &tcp_prot)
614: val = SOCK_STREAM;
615: else
616: val = SOCK_DGRAM;
617: break;
618:
619: case SO_ERROR:
620: val = sk->err;
621: sk->err = 0;
622: break;
623:
624: case SO_OOBINLINE:
625: val = sk->urginline;
626: break;
627:
628: case SO_NO_CHECK:
629: val = sk->no_check;
630: break;
631:
632: case SO_PRIORITY:
633: val = sk->priority;
634: break;
635: }
636: verify_area (optlen, sizeof (int));
637: put_fs_long (sizeof(int),(unsigned long *) optlen);
638:
639: verify_area(optval, sizeof (int));
640: put_fs_long (val, (unsigned long *)optval);
641: return (0);
642: }
643:
644: static int
645: ip_proto_listen(struct socket *sock, int backlog)
646: {
647: volatile struct sock *sk;
648: sk = sock->data;
649: if (sk == NULL)
650: {
651: printk ("Warning: sock->data = NULL: %d\n" ,__LINE__);
652: return (0);
653: }
654: sk->state = TCP_LISTEN;
655: return (0);
656: }
657:
658: /* Hardware should be inited here. */
659: static int ip_proto_init(void)
660: {
661: int i;
662: struct device *dev;
663: struct ip_protocol *p;
664: seq_offset = CURRENT_TIME*250;
665: /* add all the protocols. */
666: for (i = 0; i < SOCK_ARRAY_SIZE; i++)
667: {
668: tcp_prot.sock_array[i] = NULL;
669: udp_prot.sock_array[i] = NULL;
670: raw_prot.sock_array[i] = NULL;
671: }
672:
673: for (p = ip_protocol_base; p != NULL;)
674: {
675: struct ip_protocol *tmp;
676: /* add all the protocols. */
677: tmp = p->next;
678: add_ip_protocol (p);
679: p = tmp;
680: }
681:
682: /* add the devices */
683: for (dev = dev_base; dev != NULL; dev=dev->next)
684: {
685: if (dev->init)
686: dev->init(dev);
687: }
688: timer_table[NET_TIMER].fn = net_timer;
689: return (0);
690: }
691:
692: static int
693: ip_proto_create (struct socket *sock, int protocol)
694: {
695: volatile struct sock *sk;
696: struct proto *prot;
697: int err;
698:
699: sk = malloc (sizeof (*sk));
700: if (sk == NULL)
701: return (-ENOMEM);
702: sk->num = 0;
703:
704:
705: switch (sock->type)
706: {
707: case SOCK_STREAM:
708: case SOCK_SEQPACKET:
709: if (protocol && protocol != IP_TCP)
710: {
711: free_s ((void *)sk, sizeof (*sk));
712: return (-EPROTONOSUPPORT);
713: }
714: sk->no_check = TCP_NO_CHECK;
715: prot = &tcp_prot;
716: break;
717:
718: case SOCK_DGRAM:
719: if (protocol && protocol != IP_UDP)
720: {
721: free_s ((void *)sk, sizeof (*sk));
722: return (-EPROTONOSUPPORT);
723: }
724: sk->no_check = UDP_NO_CHECK;
725: prot=&udp_prot;
726: break;
727:
728: case SOCK_RAW:
729: if (!suser())
730: {
731: free_s ((void *)sk, sizeof (*sk));
732: return (-EPERM);
733: }
734:
735: if (!protocol)
736: {
737: free_s ((void *)sk, sizeof (*sk));
738: return (-EPROTONOSUPPORT);
739: }
740: prot = &raw_prot;
741: sk->reuse = 1;
742: sk->no_check = 0; /* doesn't matter no checksum is preformed
743: anyway. */
744: sk->num = protocol;
745: break;
746:
747: case SOCK_PACKET:
748: if (!suser())
749: {
750: free_s ((void *)sk, sizeof (*sk));
751: return (-EPERM);
752: }
753:
754: if (!protocol)
755: {
756: free_s ((void *)sk, sizeof (*sk));
757: return (-EPROTONOSUPPORT);
758: }
759: prot = &packet_prot;
760: sk->reuse = 1;
761: sk->no_check = 0; /* doesn't matter no checksum is preformed
762: anyway. */
763: sk->num = protocol;
764: break;
765:
766:
767: default:
768: free_s ((void *)sk, sizeof (*sk));
769: return (-ESOCKTNOSUPPORT);
770:
771: }
772: sk->protocol = protocol;
773: sk->wmem_alloc = 0;
774: sk->rmem_alloc = 0;
775: sk->pair = NULL;
776: sk->opt = NULL;
777: sk->send_seq = 0;
778: sk->acked_seq = 0;
779: sk->copied_seq = 0;
780: sk->fin_seq = 0;
781: sk->proc = 0;
782: sk->rtt = TCP_WRITE_TIME;
783: sk->packets_out = 0;
784: sk->cong_window = 1; /* start with only sending one packet at a time. */
785: sk->exp_growth = 1; /* if set cong_window grow exponentially every time
786: we get an ack. */
787: sk->urginline = 0;
788: sk->intr = 0;
789: sk->linger = 0;
790: sk->destroy = 0;
791: sk->reuse = 0;
792: sk->priority = 1;
793: sk->shutdown = 0;
794: sk->urg = 0;
795: sk->keepopen = 0;
796: sk->done = 0;
797: sk->ack_backlog = 0;
798: sk->window = 0;
799: sk->bytes_rcv = 0;
800: sk->state = TCP_CLOSE;
801: sk->dead = 0;
802: sk->ack_timed = 0;
803:
804: /* this is how many unacked bytes we will accept for
805: this socket. */
806:
807: sk->max_unacked = 2048; /* needs to be at most 2 full packets. */
808:
809: /* how many packets we should send before forcing an ack.
810: if this is set to zero it is the same as sk->delay_acks = 0 */
811:
812: sk->max_ack_backlog = MAX_ACK_BACKLOG;
813: sk->inuse = 0;
814: sk->delay_acks = 1; /* default to waiting a while before sending
815: acks. */
816: sk->wback = NULL;
817: sk->wfront = NULL;
818: sk->rqueue = NULL;
819: sk->mtu = 576;
820: sk->prot = prot;
821: sk->sleep = sock->wait;
822: sk->daddr = 0;
823: sk->saddr = MY_IP_ADDR;
824: sk->err = 0;
825: sk->next = NULL;
826: sk->pair = NULL;
827: sk->send_tail = NULL;
828: sk->send_head = NULL;
829: sk->time_wait.len = TCP_CONNECT_TIME;
830: sk->time_wait.when = 0;
831: sk->time_wait.sk = sk;
832: sk->time_wait.next = NULL;
833: sk->timeout = 0;
834: sk->back_log = NULL;
835: sk->blog = 0;
836: sock->data =(void *) sk;
837: sk->dummy_th.doff = sizeof (sk->dummy_th)/4;
838: sk->dummy_th.res1=0;
839: sk->dummy_th.res2=0;
840: sk->dummy_th.urg_ptr = 0;
841: sk->dummy_th.fin = 0;
842: sk->dummy_th.syn = 0;
843: sk->dummy_th.rst = 0;
844: sk->dummy_th.psh = 0;
845: sk->dummy_th.ack = 0;
846: sk->dummy_th.urg = 0;
847: sk->dummy_th.dest = 0;
848: if (sk->num)
849: {
850: put_sock (sk->num, sk);
851: }
852: else
853: {
854: sk->num = get_new_socknum(sk->prot, 0);
855: }
856: /* make sure there was a free socket. */
857: if (sk->num == 0)
858: {
859: destroy_sock(sk);
860: return (-EAGAIN);
861: }
862: put_sock(sk->num, sk);
863: sk->dummy_th.source = net16(sk->num);
864: if (sk->prot->init)
865: {
866: err = sk->prot->init(sk);
867: if (err != 0)
868: {
869: destroy_sock (sk);
870: return (err);
871: }
872: }
873: return (0);
874: }
875:
876: static int
877: ip_proto_dup (struct socket *newsock, struct socket *oldsock)
878: {
879: return (ip_proto_create (newsock,
880: ((volatile struct sock *)(oldsock->data))->protocol));
881: }
882:
883: /* the peer socket should always be NULL. */
884: static int
885: ip_proto_release(struct socket *sock, struct socket *peer)
886: {
887: volatile struct sock *sk;
888: sk = sock->data;
889: if (sk == NULL) return (0);
890: wake_up (sk->sleep);
891: /* start closing the connection. This may take a while. */
892: /* if linger is set, we don't return until the close is
893: complete. Other wise we return immediately. The
894: actually closing is done the same either way. */
895: if (sk->linger == 0)
896: {
897: sk->prot->close(sk,0);
898: sk->dead = 1;
899: }
900: else
901: {
902: sk->prot->close(sk, 0);
903: cli();
904: while (sk->state != TCP_CLOSE)
905: {
906: interruptible_sleep_on (sk->sleep);
907: if (current->signal & ~current->blocked)
908: {
909: sti();
910: return (-ERESTARTSYS);
911: }
912: }
913: sti();
914: sk->dead = 1;
915: }
916:
917: sk->inuse = 1;
918: /* this will destroy it. */
919: release_sock (sk);
920: sock->data = NULL;
921: return (0);
922: }
923:
924:
925: static int
926: ip_proto_bind (struct socket *sock, struct sockaddr *uaddr,
927: int addr_len)
928: {
929: struct sockaddr_in addr;
930: volatile struct sock *sk, *sk2;
931: unsigned short snum;
932: sk = sock->data;
933: if (sk == NULL)
934: {
935: printk ("Warning: sock->data = NULL: %d\n" ,__LINE__);
936: return (0);
937: }
938: /* check this error. */
939: if (sk->state != TCP_CLOSE) return (-EIO);
940: verify_area (uaddr, addr_len);
941: memcpy_fromfs (&addr, uaddr, min (sizeof (addr), addr_len));
942: if (addr.sin_family && addr.sin_family != AF_INET)
943: return (-EIO); /* this needs to be changed. */
944: snum = net16(addr.sin_port);
945: PRINTK ("bind sk =%X to port = %d\n", sk, snum);
946: print_sk (sk);
947: sk = sock->data;
948:
949: /* we can't just leave the socket bound wherever it is, it might be bound
950: to a priveledged port. However, since there seems to be a bug here,
951: we will leave it if the port is not priveledged(sp?) */
952:
953: if (snum == 0)
954: {
955: if ( sk->num > PROT_SOCK) return (0);
956: snum = get_new_socknum (sk->prot, 0);
957: }
958:
959: if (snum <= PROT_SOCK && !suser())
960: return (-EPERM);
961:
962: if (my_ip_addr(addr.sin_addr.s_addr) || addr.sin_addr.s_addr == 0)
963: sk->saddr = addr.sin_addr.s_addr;
964: PRINTK ("sock_array[%d] = %X:\n", snum & (SOCK_ARRAY_SIZE -1),
965: sk->prot->sock_array[snum & (SOCK_ARRAY_SIZE -1)]);
966: print_sk (sk->prot->sock_array[snum & (SOCK_ARRAY_SIZE -1)]);
967:
968: /* make sure we are allowed to bind here. */
969: for (sk2 = sk->prot->sock_array[snum & (SOCK_ARRAY_SIZE -1)];
970: sk2 != NULL;
971: sk2 = sk2->next)
972: {
973: if (sk2->num != snum) continue;
974: if (sk2->saddr != sk->saddr) continue;
975: if (!sk->reuse) return (-EADDRINUSE);
976: if (!sk2->reuse) return (-EADDRINUSE);
977: }
978: remove_sock (sk);
979: put_sock(snum, sk);
980: sk->dummy_th.source = net16(sk->num);
981: sk->daddr = 0;
982: sk->dummy_th.dest = 0;
983: return (0);
984: }
985:
986: static int
987: ip_proto_connect (struct socket *sock, struct sockaddr * uaddr,
988: int addr_len, int flags)
989: {
990: volatile struct sock *sk;
991: int err;
992: sock->conn = NULL;
993: sk = sock->data;
994: if (sk == NULL)
995: {
996: printk ("Warning: sock->data = NULL: %d\n" ,__LINE__);
997: return (0);
998: }
999: if (sk->prot->connect == NULL)
1000: return (-EOPNOTSUPP);
1001:
1002: if (sk->intr == 0)
1003: {
1004: err = sk->prot->connect (sk, (struct sockaddr_in *)uaddr, addr_len);
1005: if (err < 0) return (err);
1006: }
1007:
1008: sock->state = SS_CONNECTED;
1009:
1010: if (flags & O_NONBLOCK) return (0);
1011:
1012: cli(); /* avoid the race condition */
1013:
1014: while (sk->state != TCP_ESTABLISHED && sk->state < TCP_CLOSING)
1015: {
1016: interruptible_sleep_on (sk->sleep);
1017: if (current->signal & ~current->blocked)
1018: {
1019: sti();
1020: sk->intr = 1;
1021: return (-ERESTARTSYS);
1022: }
1023: }
1024: sti();
1025: sk->intr = 0;
1026: if (sk->state != TCP_ESTABLISHED && sk->err)
1027: {
1028: return (-sk->err);
1029: }
1030: return (0);
1031: }
1032:
1033: static int
1034: ip_proto_socketpair (struct socket *sock1, struct socket *sock2)
1035: {
1036: return (-EOPNOTSUPP);
1037: }
1038:
1039: static int
1040: ip_proto_accept (struct socket *sock, struct socket *newsock, int flags)
1041: {
1042: volatile struct sock *sk1, *sk2;
1043: sk1= sock->data;
1044: if (sk1 == NULL)
1045: {
1046: printk ("Warning: sock->data = NULL: %d\n" ,__LINE__);
1047: return (0);
1048: }
1049: newsock->data = NULL;
1050: if (sk1->prot->accept == NULL) return (-EOPNOTSUPP);
1051: /* restore the state if we have been interrupted, and
1052: then returned. */
1053: if (sk1->pair != NULL )
1054: {
1055: sk2 = sk1->pair;
1056: sk1->pair = NULL;
1057: }
1058: else
1059: {
1060: sk2 = sk1->prot->accept (sk1,flags);
1061: if (sk2 == NULL)
1062: return (-sk1->err);
1063: }
1064: newsock->data = (void *)sk2;
1065: sk2->sleep = (void *)newsock->wait;
1066: newsock->conn = NULL;
1067: if (flags & O_NONBLOCK)
1068: return (0);
1069:
1070: cli(); /* avoid the race. */
1071: while (sk2->state == TCP_SYN_RECV)
1072: {
1073: interruptible_sleep_on (sk2->sleep);
1074: if (current->signal & ~current->blocked)
1075: {
1076: sti();
1077: sk1->pair = sk2;
1078: sk2->sleep = NULL;
1079: newsock->data = NULL;
1080: return (-ERESTARTSYS);
1081: }
1082: }
1083: sti();
1084:
1085: if (sk2->state != TCP_ESTABLISHED && sk2->err)
1086: {
1087: int err;
1088: err = -sk2->err;
1089: destroy_sock (sk2);
1090: newsock->data = NULL;
1091: return (err);
1092: }
1093: newsock->state = SS_CONNECTED;
1094: return (0);
1095: }
1096:
1097: static int
1098: ip_proto_getname(struct socket *sock, struct sockaddr *uaddr,
1099: int *uaddr_len, int peer)
1100: {
1101: struct sockaddr_in sin;
1102: volatile struct sock *sk;
1103: int len;
1104: verify_area(uaddr_len, sizeof (len));
1105: len = get_fs_long(uaddr_len);
1106: /* check this error. */
1107: if (len < sizeof (sin)) return (-EINVAL);
1108: verify_area (uaddr, len);
1109: sin.sin_family=AF_INET;
1110: sk = sock->data;
1111: if (sk == NULL)
1112: {
1113: printk ("Warning: sock->data = NULL: %d\n" ,__LINE__);
1114: return (0);
1115: }
1116: if (peer)
1117: {
1118: if (sk->state != TCP_ESTABLISHED)
1119: return (-ENOTCONN);
1120: sin.sin_port = sk->dummy_th.dest;
1121: sin.sin_addr.s_addr = sk->daddr;
1122: }
1123: else
1124: {
1125: sin.sin_port = sk->dummy_th.source;
1126: sin.sin_addr.s_addr = sk->saddr;
1127: }
1128: len = sizeof (sin);
1129: memcpy_tofs(uaddr, &sin, sizeof (sin));
1130: put_fs_long (len, uaddr_len);
1131: return (0);
1132: }
1133:
1134: static int
1135: ip_proto_read (struct socket *sock, char *ubuf, int size, int noblock)
1136: {
1137: volatile struct sock *sk;
1138: sk = sock->data;
1139: if (sk == NULL)
1140: {
1141: printk ("Warning: sock->data = NULL: %d\n" ,__LINE__);
1142: return (0);
1143: }
1144: if (sk->shutdown & RCV_SHUTDOWN)
1145: return (-EIO);
1146: return (sk->prot->read (sk, ubuf, size, noblock,0));
1147: }
1148:
1149: static int
1150: ip_proto_recv (struct socket *sock, void *ubuf, int size, int noblock,
1151: unsigned flags)
1152: {
1153: volatile struct sock *sk;
1154: sk = sock->data;
1155: if (sk == NULL)
1156: {
1157: printk ("Warning: sock->data = NULL: %d\n" ,__LINE__);
1158: return (0);
1159: }
1160: if (sk->shutdown & RCV_SHUTDOWN)
1161: return (-EIO);
1162: return (sk->prot->read (sk, ubuf, size, noblock, flags));
1163: }
1164:
1165: static int
1166: ip_proto_write (struct socket *sock, char *ubuf, int size, int noblock)
1167: {
1168: volatile struct sock *sk;
1169: sk = sock->data;
1170: if (sk == NULL)
1171: {
1172: printk ("Warning: sock->data = NULL: %d\n" ,__LINE__);
1173: return (0);
1174: }
1175: if (sk->shutdown & SEND_SHUTDOWN)
1176: return (-EIO);
1177: return (sk->prot->write (sk, ubuf, size, noblock, 0));
1178: }
1179:
1180:
1181: static int
1182: ip_proto_send (struct socket *sock, void *ubuf, int size, int noblock,
1183: unsigned flags)
1184: {
1185: volatile struct sock *sk;
1186: sk = sock->data;
1187: if (sk == NULL)
1188: {
1189: printk ("Warning: sock->data = NULL: %d\n" ,__LINE__);
1190: return (0);
1191: }
1192: if (sk->shutdown & SEND_SHUTDOWN)
1193: return (-EIO);
1194: return (sk->prot->write (sk, ubuf, size, noblock, flags));
1195: }
1196:
1197:
1198: static int
1199: ip_proto_sendto (struct socket *sock, void *ubuf, int size, int noblock,
1200: unsigned flags, struct sockaddr *sin, int addr_len )
1201: {
1202: volatile struct sock *sk;
1203: sk = sock->data;
1204: if (sk == NULL)
1205: {
1206: printk ("Warning: sock->data = NULL: %d\n" ,__LINE__);
1207: return (0);
1208: }
1209: if (sk->shutdown & SEND_SHUTDOWN)
1210: return (-EIO);
1211: if (sk->prot->sendto == NULL) return (-EOPNOTSUPP);
1212: return (sk->prot->sendto (sk, ubuf, size, noblock, flags,
1213: (struct sockaddr_in *)sin, addr_len));
1214: }
1215:
1216: static int
1217: ip_proto_recvfrom (struct socket *sock, void *ubuf, int size, int noblock,
1218: unsigned flags, struct sockaddr *sin, int *addr_len )
1219: {
1220: volatile struct sock *sk;
1221: sk = sock->data;
1222: if (sk == NULL)
1223: {
1224: printk ("Warning: sock->data = NULL: %d\n" ,__LINE__);
1225: return (0);
1226: }
1227: if (sk->shutdown & RCV_SHUTDOWN)
1228: return (-EIO);
1229: if (sk->prot->recvfrom == NULL) return (-EOPNOTSUPP);
1230: return (sk->prot->recvfrom (sk, ubuf, size, noblock, flags,
1231: (struct sockaddr_in*)sin, addr_len));
1232: }
1233:
1234: static int
1235: ip_proto_shutdown (struct socket *sock, int how)
1236: {
1237: volatile struct sock *sk;
1238: /* this should really check to make sure the socket is
1239: a tcp socket. */
1240: how++; /* maps 0->1 has the advantage of making bit 1 rcvs and
1241: 1->2 bit 2 snds.
1242: 2->3 */
1243: if (how & ~SHUTDOWN_MASK) return (-EINVAL);
1244: sk = sock->data;
1245: if (sk == NULL)
1246: {
1247: printk ("Warning: sock->data = NULL: %d\n" ,__LINE__);
1248: return (0);
1249: }
1250: if (sk->state != TCP_ESTABLISHED) return (-ENOTCONN);
1251: sk->shutdown |= how;
1252: return (0);
1253: }
1254:
1255: static int
1256: ip_proto_select (struct socket *sock, int sel_type, select_table *wait )
1257: {
1258: volatile struct sock *sk;
1259: sk = sock->data;
1260: if (sk == NULL)
1261: {
1262: printk ("Warning: sock->data = NULL: %d\n" ,__LINE__);
1263: return (0);
1264: }
1265:
1266: if (sk->prot->select == NULL)
1267: {
1268: PRINTK ("select on non-selectable socket. \n");
1269: return (0);
1270: }
1271: return (sk->prot->select(sk, sel_type, wait));
1272: }
1273:
1274: /* these should be distributed to the different protocol routines. */
1275: static int
1276: ip_proto_ioctl (struct socket *sock, unsigned int cmd,
1277: unsigned long arg)
1278: {
1279: volatile struct sock *sk;
1280: sk = sock->data;
1281: if (sk == NULL)
1282: {
1283: printk ("Warning: sock->data = NULL: %d\n" ,__LINE__);
1284: return (0);
1285: }
1286:
1287: PRINTK ("in ip_proto_ioctl\n");
1288: switch (cmd)
1289: {
1290:
1291: case IP_SET_DEV:
1292: if (!suser())
1293: return (-EPERM);
1294: return (ip_set_dev((struct ip_config *)arg));
1295: #if 0
1296: case IP_ADD_ROUTE:
1297: ip_add_route ((struct rtable *) arg);
1298: return (0);
1299: #endif
1300: default:
1301: if (!sk->prot->ioctl)
1302: return (-EINVAL);
1303: return (sk->prot->ioctl (sk, cmd, arg));
1304: }
1305: }
1306:
1307: #ifdef MEM_DEBUG
1308:
1309: struct mem
1310: {
1311: unsigned long check;
1312: struct mem *other;
1313: unsigned long len;
1314: unsigned short buff[10];
1315: };
1316:
1317: static void
1318: print_mem (struct mem *m)
1319: {
1320: int i;
1321: MPRINTK("mem:\n");
1322: MPRINTK(" check=%X, other = %X\n", m->check, m->other);
1323: MPRINTK(" len=%d buff:\n " , m->len);
1324: for (i = 0; i < 10; i++)
1325: {
1326: MPRINTK ("0x%02X ",m->buff[i]);
1327: }
1328: MPRINTK ("\n");
1329: }
1330:
1331: static void *
1332: smalloc (unsigned long size)
1333: {
1334: struct mem *head, *tail;
1335: static unsigned short count;
1336: int i;
1337: int sum;
1338: unsigned char *ptr;
1339:
1340: MPRINTK ("smalloc (size = %d)\n",size);
1341: head = malloc (size + 2*sizeof (*head));
1342: if (head == NULL) return (NULL);
1343: tail = (struct mem *)((unsigned char *)(head+1) + size);
1344:
1345: head->other = tail;
1346: tail->other = head;
1347:
1348: tail->len = size;
1349: head->len = size;
1350: for (i = 0; i < 10; i++)
1351: {
1352: tail->buff[i]=count++;
1353: head->buff[i]=count;
1354: }
1355:
1356: ptr = (unsigned char *)head;
1357: head->check = 0;
1358: sum = 0;
1359:
1360: for (i = 0; i < sizeof (*head); i ++)
1361: {
1362: sum+= ptr[i];
1363: }
1364:
1365: head->check = ~sum;
1366: ptr = (unsigned char *)tail;
1367: tail->check = 0;
1368: sum = 0;
1369:
1370: for (i = 0; i < sizeof (*head); i ++)
1371: {
1372: sum+= ptr[i];
1373: }
1374:
1375: tail->check = ~sum;
1376: MPRINTK ("head = %X:\n", head);
1377: print_mem(head);
1378: MPRINTK ("tail = %X:\n", tail);
1379: print_mem(tail);
1380: return (head+1);
1381: }
1382:
1383: void
1384: sfree (void *data, unsigned long len)
1385: {
1386: int i;
1387: int sum;
1388: int csum;
1389: unsigned char *ptr;
1390: int bad = 0;
1391: struct mem *head, *tail;
1392: MPRINTK ("sfree(data=%X, len = %d)\n", data, len);
1393: head = data;
1394: head--;
1395: tail = (struct mem *)((unsigned char *)(head+1) + len);
1396: print_mem (head);
1397: print_mem (tail);
1398: if (head->other != tail)
1399: {
1400: MPRINTK ("sfree: head->other != tail:\n");
1401: bad = 1;
1402: }
1403: if (tail->other != head)
1404: {
1405: MPRINTK ("sfree: tail->other != head:\n");
1406: bad =1 ;
1407: }
1408: if (head ->len != len)
1409: {
1410: MPRINTK ("sfree: head->len != len");
1411: bad = 1;
1412: }
1413: if (tail ->len != len)
1414: {
1415: MPRINTK ("sfree: tail->len != len");
1416: bad = 1;
1417: }
1418: csum = head->check;
1419: ptr = (unsigned char *)head;
1420: head->check = 0;
1421: sum = 0;
1422: for (i = 0; i < sizeof (*head); i ++)
1423: {
1424: sum+= ptr[i];
1425: }
1426: if (csum != ~sum)
1427: {
1428: MPRINTK ("sfree: head failed checksum\n");
1429: bad = 1;
1430: }
1431: csum = tail->check;
1432: ptr = (unsigned char *)tail;
1433: tail->check = 0;
1434: sum = 0;
1435: for (i = 0; i < sizeof (*head); i ++)
1436: {
1437: sum+= ptr[i];
1438: }
1439: if (csum != ~sum)
1440: {
1441: MPRINTK ("sfree: tail failed checksum\n");
1442: bad = 1;
1443: }
1444: if (!bad)
1445: free_s (head, len+2*sizeof (*head));
1446: else
1447: schedule();
1448: }
1449: #else
1450: static void *
1451: smalloc (unsigned long size)
1452: {
1453: return (malloc (size));
1454: }
1455: static void
1456: sfree(void *data, unsigned long len)
1457: {
1458: free_s(data,len);
1459: }
1460: #endif
1461:
1462: void *
1463: sock_wmalloc(volatile struct sock *sk, unsigned long size, int force)
1464: {
1465: void *tmp;
1466: if (sk)
1467: {
1468: if (sk->wmem_alloc + size >= SK_WMEM_MAX && !force)
1469: {
1470: MPRINTK ("sock_wmalloc(%X,%d,%d) returning NULL\n",
1471: sk, size, force);
1472: return (NULL);
1473: }
1474: cli();
1475: sk->wmem_alloc+= size;
1476: sti();
1477: }
1478: if (sk)
1479: tmp = smalloc (size);
1480: else
1481: tmp = malloc (size);
1482:
1483: MPRINTK ("sock_wmalloc(%X,%d,%d) returning %X\n",sk, size, force, tmp);
1484: return (tmp);
1485: }
1486:
1487: void *
1488: sock_rmalloc(volatile struct sock *sk, unsigned long size, int force)
1489: {
1490: struct mem *tmp;
1491: if (sk )
1492: {
1493: if (sk->rmem_alloc + size >= SK_RMEM_MAX && !force)
1494: {
1495: MPRINTK ("sock_rmalloc(%X,%d,%d) returning NULL\n",sk,size,force);
1496: return (NULL);
1497: }
1498: cli();
1499: sk->rmem_alloc+= size;
1500: sti();
1501: }
1502: if (sk)
1503: tmp = smalloc (size);
1504: else
1505: tmp = malloc (size);
1506:
1507: MPRINTK ("sock_rmalloc(%X,%d,%d) returning %X\n",sk, size, force, tmp);
1508: return (tmp);
1509: }
1510:
1511:
1512: unsigned long
1513: sock_rspace (volatile struct sock *sk)
1514: {
1515: int amt;
1516: if (sk != NULL)
1517: {
1518: if (sk->rmem_alloc >= SK_RMEM_MAX-2*MIN_WINDOW) return (0);
1519: amt = min ((SK_RMEM_MAX-sk->rmem_alloc)/2-MIN_WINDOW, MAX_WINDOW);
1520: if (amt < 0) return (0);
1521: return (amt);
1522: }
1523: return (0);
1524: }
1525:
1526: unsigned long
1527: sock_wspace (volatile struct sock *sk)
1528: {
1529: if (sk != NULL)
1530: {
1531: if (sk->shutdown & SEND_SHUTDOWN) return (0);
1532: if (sk->wmem_alloc >= SK_WMEM_MAX) return (0);
1533: return (SK_WMEM_MAX-sk->wmem_alloc );
1534: }
1535: return (0);
1536: }
1537:
1538:
1539: void
1540: sock_wfree (volatile struct sock *sk, void *mem, unsigned long size)
1541: {
1542: MPRINTK ("sock_wfree (sk=%X, mem=%X, size=%d)\n",sk, mem, size);
1543: if (sk)
1544: {
1545: sk->wmem_alloc -= size;
1546: sfree(mem,size);
1547: /* in case it might be waiting for more memory. */
1548: if (!sk->dead && sk->wmem_alloc > SK_WMEM_MAX/2) wake_up(sk->sleep);
1549: if (sk->destroy && sk->wmem_alloc == 0 && sk->rmem_alloc == 0)
1550: {
1551: MPRINTK ("recovered lost memory, destroying sock = %X\n",sk);
1552: delete_timer ((struct timer *)&sk->time_wait);
1553: free_s ((void *)sk, sizeof (*sk));
1554: }
1555: }
1556: else
1557: {
1558: free_s (mem, size);
1559: }
1560: }
1561:
1562: void
1563: sock_rfree (volatile struct sock *sk, void *mem, unsigned long size)
1564: {
1565: MPRINTK ("sock_rfree (sk=%X, mem=%X, size=%d)\n",sk, mem, size);
1566: if (sk)
1567: {
1568: sk->rmem_alloc -= size;
1569: sfree(mem,size);
1570: if (sk->destroy && sk->wmem_alloc == 0 && sk->rmem_alloc == 0)
1571: {
1572: delete_timer ((struct timer *)&sk->time_wait);
1573: free_s ((void *)sk, sizeof (*sk));
1574: }
1575: }
1576: else
1577: {
1578: free_s (mem, size);
1579: }
1580: }
1581:
1582:
1583: /* This routine must find a socket given a tcp header. Everyhting
1584: is assumed to be in net order. */
1585:
1586: volatile struct sock *get_sock (struct proto *prot, unsigned short num,
1587: unsigned long raddr,
1588: unsigned short rnum, unsigned long laddr)
1589: {
1590: volatile struct sock *s;
1591: PRINTK ("get_sock (prot=%X, num=%d, raddr=%X, rnum=%d, laddr=%X)\n",
1592: prot, num, raddr, rnum, laddr);
1593:
1594: /* SOCK_ARRAY_SIZE must be a power of two. This will work better
1595: than a prime unless 3 or more sockets end up using the same
1596: array entry. This should not be a problem because most
1597: well known sockets don't overlap that much, and for
1598: the other ones, we can just be careful about picking our
1599: socket number when we choose an arbitrary one. */
1600:
1601: for (s=prot->sock_array[num&(SOCK_ARRAY_SIZE-1)]; s != NULL; s=s->next)
1602: {
1603: if (s->num == num)
1604: {
1605: /* we need to see if this is the socket that we want. */
1606: if (!ip_addr_match (s->daddr, raddr))
1607: continue;
1608: if (s->dummy_th.dest != rnum && s->dummy_th.dest != 0)
1609: continue;
1610: if (!ip_addr_match (s->saddr, laddr))
1611: continue;
1612: return (s);
1613: }
1614: }
1615: return (NULL);
1616: }
1617:
1618: void release_sock (volatile struct sock *sk)
1619: {
1620: if (sk->blog) return;
1621: /* see if we have any packets built up. */
1622:
1623: cli();
1624: sk->inuse = 1;
1625: while (sk->back_log != NULL)
1626: {
1627: struct sk_buff *skb;
1628: sk->blog = 1;
1629: skb = sk->back_log;
1630: PRINTK ("release_sock: skb = %X:\n",skb);
1631: print_skb(skb);
1632: if (skb->next != skb)
1633: {
1634: sk->back_log = skb->next;
1635: skb->prev->next = skb->next;
1636: skb->next->prev = skb->prev;
1637: }
1638: else
1639: {
1640: sk->back_log = NULL;
1641: }
1642: sti();
1643: PRINTK ("sk->back_log = %X\n",sk->back_log);
1644: if (sk->prot->rcv)
1645: sk->prot->rcv(skb, skb->dev, sk->opt,
1646: skb->saddr, skb->len, skb->daddr, 1,
1647: /* only used for/by raw sockets. */
1648: (struct ip_protocol *)sk->pair);
1649: cli();
1650: }
1651: sk->blog = 0;
1652: sk->inuse = 0;
1653: sti();
1654: if (sk->dead && sk->state == TCP_CLOSE)
1655: {
1656: /* should be about 2 rtt's */
1657: sk->time_wait.len = min (sk->rtt * 2, TCP_DONE_TIME);
1658: sk->timeout = TIME_DONE;
1659: reset_timer ((struct timer *)&sk->time_wait);
1660: }
1661: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.