linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / net / x25 / af_x25.c
1 /*
2  *      X.25 Packet Layer release 002
3  *
4  *      This is ALPHA test software. This code may break your machine,
5  *      randomly fail to work with new releases, misbehave and/or generally
6  *      screw up. It might even work. 
7  *
8  *      This code REQUIRES 2.1.15 or higher
9  *
10  *      This module:
11  *              This module is free software; you can redistribute it and/or
12  *              modify it under the terms of the GNU General Public License
13  *              as published by the Free Software Foundation; either version
14  *              2 of the License, or (at your option) any later version.
15  *
16  *      History
17  *      X.25 001        Jonathan Naylor Started coding.
18  *      X.25 002        Jonathan Naylor Centralised disconnect handling.
19  *                                      New timer architecture.
20  *      2000-03-11      Henner Eisen    MSG_EOR handling more POSIX compliant.
21  *      2000-03-22      Daniela Squassoni Allowed disabling/enabling of 
22  *                                        facilities negotiation and increased 
23  *                                        the throughput upper limit.
24  *      2000-08-27      Arnaldo C. Melo s/suser/capable/ + micro cleanups
25  *      2000-09-04      Henner Eisen    Set sock->state in x25_accept(). 
26  *                                      Fixed x25_output() related skb leakage.
27  *      2000-10-02      Henner Eisen    Made x25_kick() single threaded per socket.
28  *      2000-10-27      Henner Eisen    MSG_DONTWAIT for fragment allocation.
29  *      2000-11-14      Henner Eisen    Closing datalink from NETDEV_GOING_DOWN
30  *      2002-10-06      Arnaldo C. Melo Get rid of cli/sti, move proc stuff to
31  *                                      x25_proc.c, using seq_file
32  *      2005-04-02      Shaun Pereira   Selective sub address matching
33  *                                      with call user data
34  *      2005-04-15      Shaun Pereira   Fast select with no restriction on
35  *                                      response
36  */
37
38 #include <linux/config.h>
39 #include <linux/module.h>
40 #include <linux/capability.h>
41 #include <linux/errno.h>
42 #include <linux/kernel.h>
43 #include <linux/sched.h>
44 #include <linux/timer.h>
45 #include <linux/string.h>
46 #include <linux/net.h>
47 #include <linux/netdevice.h>
48 #include <linux/if_arp.h>
49 #include <linux/skbuff.h>
50 #include <net/sock.h>
51 #include <net/tcp_states.h>
52 #include <asm/uaccess.h>
53 #include <linux/fcntl.h>
54 #include <linux/termios.h>      /* For TIOCINQ/OUTQ */
55 #include <linux/notifier.h>
56 #include <linux/init.h>
57 #include <net/x25.h>
58
59 int sysctl_x25_restart_request_timeout = X25_DEFAULT_T20;
60 int sysctl_x25_call_request_timeout    = X25_DEFAULT_T21;
61 int sysctl_x25_reset_request_timeout   = X25_DEFAULT_T22;
62 int sysctl_x25_clear_request_timeout   = X25_DEFAULT_T23;
63 int sysctl_x25_ack_holdback_timeout    = X25_DEFAULT_T2;
64
65 HLIST_HEAD(x25_list);
66 DEFINE_RWLOCK(x25_list_lock);
67
68 static const struct proto_ops x25_proto_ops;
69
70 static struct x25_address null_x25_address = {"               "};
71
72 int x25_addr_ntoa(unsigned char *p, struct x25_address *called_addr,
73                   struct x25_address *calling_addr)
74 {
75         int called_len, calling_len;
76         char *called, *calling;
77         int i;
78
79         called_len  = (*p >> 0) & 0x0F;
80         calling_len = (*p >> 4) & 0x0F;
81
82         called  = called_addr->x25_addr;
83         calling = calling_addr->x25_addr;
84         p++;
85
86         for (i = 0; i < (called_len + calling_len); i++) {
87                 if (i < called_len) {
88                         if (i % 2 != 0) {
89                                 *called++ = ((*p >> 0) & 0x0F) + '0';
90                                 p++;
91                         } else {
92                                 *called++ = ((*p >> 4) & 0x0F) + '0';
93                         }
94                 } else {
95                         if (i % 2 != 0) {
96                                 *calling++ = ((*p >> 0) & 0x0F) + '0';
97                                 p++;
98                         } else {
99                                 *calling++ = ((*p >> 4) & 0x0F) + '0';
100                         }
101                 }
102         }
103
104         *called = *calling = '\0';
105
106         return 1 + (called_len + calling_len + 1) / 2;
107 }
108
109 int x25_addr_aton(unsigned char *p, struct x25_address *called_addr,
110                   struct x25_address *calling_addr)
111 {
112         unsigned int called_len, calling_len;
113         char *called, *calling;
114         int i;
115
116         called  = called_addr->x25_addr;
117         calling = calling_addr->x25_addr;
118
119         called_len  = strlen(called);
120         calling_len = strlen(calling);
121
122         *p++ = (calling_len << 4) | (called_len << 0);
123
124         for (i = 0; i < (called_len + calling_len); i++) {
125                 if (i < called_len) {
126                         if (i % 2 != 0) {
127                                 *p |= (*called++ - '0') << 0;
128                                 p++;
129                         } else {
130                                 *p = 0x00;
131                                 *p |= (*called++ - '0') << 4;
132                         }
133                 } else {
134                         if (i % 2 != 0) {
135                                 *p |= (*calling++ - '0') << 0;
136                                 p++;
137                         } else {
138                                 *p = 0x00;
139                                 *p |= (*calling++ - '0') << 4;
140                         }
141                 }
142         }
143
144         return 1 + (called_len + calling_len + 1) / 2;
145 }
146
147 /*
148  *      Socket removal during an interrupt is now safe.
149  */
150 static void x25_remove_socket(struct sock *sk)
151 {
152         write_lock_bh(&x25_list_lock);
153         sk_del_node_init(sk);
154         write_unlock_bh(&x25_list_lock);
155 }
156
157 /*
158  *      Kill all bound sockets on a dropped device.
159  */
160 static void x25_kill_by_device(struct net_device *dev)
161 {
162         struct sock *s;
163         struct hlist_node *node;
164
165         write_lock_bh(&x25_list_lock);
166
167         sk_for_each(s, node, &x25_list)
168                 if (x25_sk(s)->neighbour && x25_sk(s)->neighbour->dev == dev)
169                         x25_disconnect(s, ENETUNREACH, 0, 0);
170
171         write_unlock_bh(&x25_list_lock);
172 }
173
174 /*
175  *      Handle device status changes.
176  */
177 static int x25_device_event(struct notifier_block *this, unsigned long event,
178                             void *ptr)
179 {
180         struct net_device *dev = ptr;
181         struct x25_neigh *nb;
182
183         if (dev->type == ARPHRD_X25
184 #if defined(CONFIG_LLC) || defined(CONFIG_LLC_MODULE)
185          || dev->type == ARPHRD_ETHER
186 #endif
187          ) {
188                 switch (event) {
189                         case NETDEV_UP:
190                                 x25_link_device_up(dev);
191                                 break;
192                         case NETDEV_GOING_DOWN:
193                                 nb = x25_get_neigh(dev);
194                                 if (nb) {
195                                         x25_terminate_link(nb);
196                                         x25_neigh_put(nb);
197                                 }
198                                 break;
199                         case NETDEV_DOWN:
200                                 x25_kill_by_device(dev);
201                                 x25_route_device_down(dev);
202                                 x25_link_device_down(dev);
203                                 break;
204                 }
205         }
206
207         return NOTIFY_DONE;
208 }
209
210 /*
211  *      Add a socket to the bound sockets list.
212  */
213 static void x25_insert_socket(struct sock *sk)
214 {
215         write_lock_bh(&x25_list_lock);
216         sk_add_node(sk, &x25_list);
217         write_unlock_bh(&x25_list_lock);
218 }
219
220 /*
221  *      Find a socket that wants to accept the Call Request we just
222  *      received. Check the full list for an address/cud match.
223  *      If no cuds match return the next_best thing, an address match.
224  *      Note: if a listening socket has cud set it must only get calls
225  *      with matching cud.
226  */
227 static struct sock *x25_find_listener(struct x25_address *addr,
228                                         struct sk_buff *skb)
229 {
230         struct sock *s;
231         struct sock *next_best;
232         struct hlist_node *node;
233
234         read_lock_bh(&x25_list_lock);
235         next_best = NULL;
236
237         sk_for_each(s, node, &x25_list)
238                 if ((!strcmp(addr->x25_addr,
239                         x25_sk(s)->source_addr.x25_addr) ||
240                                 !strcmp(addr->x25_addr,
241                                         null_x25_address.x25_addr)) &&
242                                         s->sk_state == TCP_LISTEN) {
243                         /*
244                          * Found a listening socket, now check the incoming
245                          * call user data vs this sockets call user data
246                          */
247                         if(skb->len > 0 && x25_sk(s)->cudmatchlength > 0) {
248                                 if((memcmp(x25_sk(s)->calluserdata.cuddata,
249                                         skb->data,
250                                         x25_sk(s)->cudmatchlength)) == 0) {
251                                         sock_hold(s);
252                                         goto found;
253                                  }
254                         } else
255                                 next_best = s;
256                 }
257         if (next_best) {
258                 s = next_best;
259                 sock_hold(s);
260                 goto found;
261         }
262         s = NULL;
263 found:
264         read_unlock_bh(&x25_list_lock);
265         return s;
266 }
267
268 /*
269  *      Find a connected X.25 socket given my LCI and neighbour.
270  */
271 static struct sock *__x25_find_socket(unsigned int lci, struct x25_neigh *nb)
272 {
273         struct sock *s;
274         struct hlist_node *node;
275
276         sk_for_each(s, node, &x25_list)
277                 if (x25_sk(s)->lci == lci && x25_sk(s)->neighbour == nb) {
278                         sock_hold(s);
279                         goto found;
280                 }
281         s = NULL;
282 found:
283         return s;
284 }
285
286 struct sock *x25_find_socket(unsigned int lci, struct x25_neigh *nb)
287 {
288         struct sock *s;
289
290         read_lock_bh(&x25_list_lock);
291         s = __x25_find_socket(lci, nb);
292         read_unlock_bh(&x25_list_lock);
293         return s;
294 }
295
296 /*
297  *      Find a unique LCI for a given device.
298  */
299 static unsigned int x25_new_lci(struct x25_neigh *nb)
300 {
301         unsigned int lci = 1;
302         struct sock *sk;
303
304         read_lock_bh(&x25_list_lock);
305
306         while ((sk = __x25_find_socket(lci, nb)) != NULL) {
307                 sock_put(sk);
308                 if (++lci == 4096) {
309                         lci = 0;
310                         break;
311                 }
312         }
313
314         read_unlock_bh(&x25_list_lock);
315         return lci;
316 }
317
318 /*
319  *      Deferred destroy.
320  */
321 void x25_destroy_socket(struct sock *);
322
323 /*
324  *      handler for deferred kills.
325  */
326 static void x25_destroy_timer(unsigned long data)
327 {
328         x25_destroy_socket((struct sock *)data);
329 }
330
331 /*
332  *      This is called from user mode and the timers. Thus it protects itself
333  *      against interrupt users but doesn't worry about being called during
334  *      work. Once it is removed from the queue no interrupt or bottom half
335  *      will touch it and we are (fairly 8-) ) safe.
336  *      Not static as it's used by the timer
337  */
338 void x25_destroy_socket(struct sock *sk)
339 {
340         struct sk_buff *skb;
341
342         sock_hold(sk);
343         lock_sock(sk);
344         x25_stop_heartbeat(sk);
345         x25_stop_timer(sk);
346
347         x25_remove_socket(sk);
348         x25_clear_queues(sk);           /* Flush the queues */
349
350         while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) {
351                 if (skb->sk != sk) {            /* A pending connection */
352                         /*
353                          * Queue the unaccepted socket for death
354                          */
355                         sock_set_flag(skb->sk, SOCK_DEAD);
356                         x25_start_heartbeat(skb->sk);
357                         x25_sk(skb->sk)->state = X25_STATE_0;
358                 }
359
360                 kfree_skb(skb);
361         }
362
363         if (atomic_read(&sk->sk_wmem_alloc) ||
364             atomic_read(&sk->sk_rmem_alloc)) {
365                 /* Defer: outstanding buffers */
366                 sk->sk_timer.expires  = jiffies + 10 * HZ;
367                 sk->sk_timer.function = x25_destroy_timer;
368                 sk->sk_timer.data = (unsigned long)sk;
369                 add_timer(&sk->sk_timer);
370         } else {
371                 /* drop last reference so sock_put will free */
372                 __sock_put(sk);
373         }
374
375         release_sock(sk);
376         sock_put(sk);
377 }
378
379 /*
380  *      Handling for system calls applied via the various interfaces to a
381  *      X.25 socket object.
382  */
383
384 static int x25_setsockopt(struct socket *sock, int level, int optname,
385                           char __user *optval, int optlen)
386 {
387         int opt;
388         struct sock *sk = sock->sk;
389         int rc = -ENOPROTOOPT;
390
391         if (level != SOL_X25 || optname != X25_QBITINCL)
392                 goto out;
393
394         rc = -EINVAL;
395         if (optlen < sizeof(int))
396                 goto out;
397
398         rc = -EFAULT;
399         if (get_user(opt, (int __user *)optval))
400                 goto out;
401
402         x25_sk(sk)->qbitincl = !!opt;
403         rc = 0;
404 out:
405         return rc;
406 }
407
408 static int x25_getsockopt(struct socket *sock, int level, int optname,
409                           char __user *optval, int __user *optlen)
410 {
411         struct sock *sk = sock->sk;
412         int val, len, rc = -ENOPROTOOPT;
413         
414         if (level != SOL_X25 || optname != X25_QBITINCL)
415                 goto out;
416
417         rc = -EFAULT;
418         if (get_user(len, optlen))
419                 goto out;
420
421         len = min_t(unsigned int, len, sizeof(int));
422
423         rc = -EINVAL;
424         if (len < 0)
425                 goto out;
426                 
427         rc = -EFAULT;
428         if (put_user(len, optlen))
429                 goto out;
430
431         val = x25_sk(sk)->qbitincl;
432         rc = copy_to_user(optval, &val, len) ? -EFAULT : 0;
433 out:
434         return rc;
435 }
436
437 static int x25_listen(struct socket *sock, int backlog)
438 {
439         struct sock *sk = sock->sk;
440         int rc = -EOPNOTSUPP;
441
442         if (sk->sk_state != TCP_LISTEN) {
443                 memset(&x25_sk(sk)->dest_addr, 0, X25_ADDR_LEN);
444                 sk->sk_max_ack_backlog = backlog;
445                 sk->sk_state           = TCP_LISTEN;
446                 rc = 0;
447         }
448
449         return rc;
450 }
451
452 static struct proto x25_proto = {
453         .name     = "X25",
454         .owner    = THIS_MODULE,
455         .obj_size = sizeof(struct x25_sock),
456 };
457
458 static struct sock *x25_alloc_socket(void)
459 {
460         struct x25_sock *x25;
461         struct sock *sk = sk_alloc(AF_X25, GFP_ATOMIC, &x25_proto, 1);
462
463         if (!sk)
464                 goto out;
465
466         sock_init_data(NULL, sk);
467
468         x25 = x25_sk(sk);
469         skb_queue_head_init(&x25->ack_queue);
470         skb_queue_head_init(&x25->fragment_queue);
471         skb_queue_head_init(&x25->interrupt_in_queue);
472         skb_queue_head_init(&x25->interrupt_out_queue);
473 out:
474         return sk;
475 }
476
477 void x25_init_timers(struct sock *sk);
478
479 static int x25_create(struct socket *sock, int protocol)
480 {
481         struct sock *sk;
482         struct x25_sock *x25;
483         int rc = -ESOCKTNOSUPPORT;
484
485         if (sock->type != SOCK_SEQPACKET || protocol)
486                 goto out;
487
488         rc = -ENOMEM;
489         if ((sk = x25_alloc_socket()) == NULL)
490                 goto out;
491
492         x25 = x25_sk(sk);
493
494         sk->sk_socket = sock;
495         sk->sk_type = sock->type;
496         sk->sk_sleep = &sock->wait;
497         sock->sk = sk;
498
499         x25_init_timers(sk);
500
501         sock->ops    = &x25_proto_ops;
502         sk->sk_protocol = protocol;
503         sk->sk_backlog_rcv = x25_backlog_rcv;
504
505         x25->t21   = sysctl_x25_call_request_timeout;
506         x25->t22   = sysctl_x25_reset_request_timeout;
507         x25->t23   = sysctl_x25_clear_request_timeout;
508         x25->t2    = sysctl_x25_ack_holdback_timeout;
509         x25->state = X25_STATE_0;
510         x25->cudmatchlength = 0;
511         x25->accptapprv = X25_DENY_ACCPT_APPRV;         /* normally no cud  */
512                                                         /* on call accept   */
513
514         x25->facilities.winsize_in  = X25_DEFAULT_WINDOW_SIZE;
515         x25->facilities.winsize_out = X25_DEFAULT_WINDOW_SIZE;
516         x25->facilities.pacsize_in  = X25_DEFAULT_PACKET_SIZE;
517         x25->facilities.pacsize_out = X25_DEFAULT_PACKET_SIZE;
518         x25->facilities.throughput  = X25_DEFAULT_THROUGHPUT;
519         x25->facilities.reverse     = X25_DEFAULT_REVERSE;
520         rc = 0;
521 out:
522         return rc;
523 }
524
525 static struct sock *x25_make_new(struct sock *osk)
526 {
527         struct sock *sk = NULL;
528         struct x25_sock *x25, *ox25;
529
530         if (osk->sk_type != SOCK_SEQPACKET)
531                 goto out;
532
533         if ((sk = x25_alloc_socket()) == NULL)
534                 goto out;
535
536         x25 = x25_sk(sk);
537
538         sk->sk_type        = osk->sk_type;
539         sk->sk_socket      = osk->sk_socket;
540         sk->sk_priority    = osk->sk_priority;
541         sk->sk_protocol    = osk->sk_protocol;
542         sk->sk_rcvbuf      = osk->sk_rcvbuf;
543         sk->sk_sndbuf      = osk->sk_sndbuf;
544         sk->sk_state       = TCP_ESTABLISHED;
545         sk->sk_sleep       = osk->sk_sleep;
546         sk->sk_backlog_rcv = osk->sk_backlog_rcv;
547         sock_copy_flags(sk, osk);
548
549         ox25 = x25_sk(osk);
550         x25->t21        = ox25->t21;
551         x25->t22        = ox25->t22;
552         x25->t23        = ox25->t23;
553         x25->t2         = ox25->t2;
554         x25->facilities = ox25->facilities;
555         x25->qbitincl   = ox25->qbitincl;
556         x25->cudmatchlength = ox25->cudmatchlength;
557         x25->accptapprv = ox25->accptapprv;
558
559         x25_init_timers(sk);
560 out:
561         return sk;
562 }
563
564 static int x25_release(struct socket *sock)
565 {
566         struct sock *sk = sock->sk;
567         struct x25_sock *x25;
568
569         if (!sk)
570                 goto out;
571
572         x25 = x25_sk(sk);
573
574         switch (x25->state) {
575
576                 case X25_STATE_0:
577                 case X25_STATE_2:
578                         x25_disconnect(sk, 0, 0, 0);
579                         x25_destroy_socket(sk);
580                         goto out;
581
582                 case X25_STATE_1:
583                 case X25_STATE_3:
584                 case X25_STATE_4:
585                         x25_clear_queues(sk);
586                         x25_write_internal(sk, X25_CLEAR_REQUEST);
587                         x25_start_t23timer(sk);
588                         x25->state = X25_STATE_2;
589                         sk->sk_state    = TCP_CLOSE;
590                         sk->sk_shutdown |= SEND_SHUTDOWN;
591                         sk->sk_state_change(sk);
592                         sock_set_flag(sk, SOCK_DEAD);
593                         sock_set_flag(sk, SOCK_DESTROY);
594                         break;
595         }
596
597         sock->sk        = NULL; 
598         sk->sk_socket   = NULL; /* Not used, but we should do this */
599 out:
600         return 0;
601 }
602
603 static int x25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
604 {
605         struct sock *sk = sock->sk;
606         struct sockaddr_x25 *addr = (struct sockaddr_x25 *)uaddr;
607
608         if (!sock_flag(sk, SOCK_ZAPPED) ||
609             addr_len != sizeof(struct sockaddr_x25) ||
610             addr->sx25_family != AF_X25)
611                 return -EINVAL;
612
613         x25_sk(sk)->source_addr = addr->sx25_addr;
614         x25_insert_socket(sk);
615         sock_reset_flag(sk, SOCK_ZAPPED);
616         SOCK_DEBUG(sk, "x25_bind: socket is bound\n");
617
618         return 0;
619 }
620
621 static int x25_wait_for_connection_establishment(struct sock *sk)
622 {
623         DECLARE_WAITQUEUE(wait, current);
624         int rc;
625
626         add_wait_queue_exclusive(sk->sk_sleep, &wait);
627         for (;;) {
628                 __set_current_state(TASK_INTERRUPTIBLE);
629                 rc = -ERESTARTSYS;
630                 if (signal_pending(current))
631                         break;
632                 rc = sock_error(sk);
633                 if (rc) {
634                         sk->sk_socket->state = SS_UNCONNECTED;
635                         break;
636                 }
637                 rc = 0;
638                 if (sk->sk_state != TCP_ESTABLISHED) {
639                         release_sock(sk);
640                         schedule();
641                         lock_sock(sk);
642                 } else
643                         break;
644         }
645         __set_current_state(TASK_RUNNING);
646         remove_wait_queue(sk->sk_sleep, &wait);
647         return rc;
648 }
649
650 static int x25_connect(struct socket *sock, struct sockaddr *uaddr,
651                        int addr_len, int flags)
652 {
653         struct sock *sk = sock->sk;
654         struct x25_sock *x25 = x25_sk(sk);
655         struct sockaddr_x25 *addr = (struct sockaddr_x25 *)uaddr;
656         struct x25_route *rt;
657         int rc = 0;
658
659         lock_sock(sk);
660         if (sk->sk_state == TCP_ESTABLISHED && sock->state == SS_CONNECTING) {
661                 sock->state = SS_CONNECTED;
662                 goto out; /* Connect completed during a ERESTARTSYS event */
663         }
664
665         rc = -ECONNREFUSED;
666         if (sk->sk_state == TCP_CLOSE && sock->state == SS_CONNECTING) {
667                 sock->state = SS_UNCONNECTED;
668                 goto out;
669         }
670
671         rc = -EISCONN;  /* No reconnect on a seqpacket socket */
672         if (sk->sk_state == TCP_ESTABLISHED)
673                 goto out;
674
675         sk->sk_state   = TCP_CLOSE;     
676         sock->state = SS_UNCONNECTED;
677
678         rc = -EINVAL;
679         if (addr_len != sizeof(struct sockaddr_x25) ||
680             addr->sx25_family != AF_X25)
681                 goto out;
682
683         rc = -ENETUNREACH;
684         rt = x25_get_route(&addr->sx25_addr);
685         if (!rt)
686                 goto out;
687
688         x25->neighbour = x25_get_neigh(rt->dev);
689         if (!x25->neighbour)
690                 goto out_put_route;
691
692         x25_limit_facilities(&x25->facilities, x25->neighbour);
693
694         x25->lci = x25_new_lci(x25->neighbour);
695         if (!x25->lci)
696                 goto out_put_neigh;
697
698         rc = -EINVAL;
699         if (sock_flag(sk, SOCK_ZAPPED)) /* Must bind first - autobinding does not work */
700                 goto out_put_neigh;
701
702         if (!strcmp(x25->source_addr.x25_addr, null_x25_address.x25_addr))
703                 memset(&x25->source_addr, '\0', X25_ADDR_LEN);
704
705         x25->dest_addr = addr->sx25_addr;
706
707         /* Move to connecting socket, start sending Connect Requests */
708         sock->state   = SS_CONNECTING;
709         sk->sk_state  = TCP_SYN_SENT;
710
711         x25->state = X25_STATE_1;
712
713         x25_write_internal(sk, X25_CALL_REQUEST);
714
715         x25_start_heartbeat(sk);
716         x25_start_t21timer(sk);
717
718         /* Now the loop */
719         rc = -EINPROGRESS;
720         if (sk->sk_state != TCP_ESTABLISHED && (flags & O_NONBLOCK))
721                 goto out_put_neigh;
722
723         rc = x25_wait_for_connection_establishment(sk);
724         if (rc)
725                 goto out_put_neigh;
726
727         sock->state = SS_CONNECTED;
728         rc = 0;
729 out_put_neigh:
730         if (rc)
731                 x25_neigh_put(x25->neighbour);
732 out_put_route:
733         x25_route_put(rt);
734 out:
735         release_sock(sk);
736         return rc;
737 }
738
739 static int x25_wait_for_data(struct sock *sk, int timeout)
740 {
741         DECLARE_WAITQUEUE(wait, current);
742         int rc = 0;
743
744         add_wait_queue_exclusive(sk->sk_sleep, &wait);
745         for (;;) {
746                 __set_current_state(TASK_INTERRUPTIBLE);
747                 if (sk->sk_shutdown & RCV_SHUTDOWN)
748                         break;
749                 rc = -ERESTARTSYS;
750                 if (signal_pending(current))
751                         break;
752                 rc = -EAGAIN;
753                 if (!timeout)
754                         break;
755                 rc = 0;
756                 if (skb_queue_empty(&sk->sk_receive_queue)) {
757                         release_sock(sk);
758                         timeout = schedule_timeout(timeout);
759                         lock_sock(sk);
760                 } else
761                         break;
762         }
763         __set_current_state(TASK_RUNNING);
764         remove_wait_queue(sk->sk_sleep, &wait);
765         return rc;
766 }
767         
768 static int x25_accept(struct socket *sock, struct socket *newsock, int flags)
769 {
770         struct sock *sk = sock->sk;
771         struct sock *newsk;
772         struct sk_buff *skb;
773         int rc = -EINVAL;
774
775         if (!sk || sk->sk_state != TCP_LISTEN)
776                 goto out;
777
778         rc = -EOPNOTSUPP;
779         if (sk->sk_type != SOCK_SEQPACKET)
780                 goto out;
781
782         lock_sock(sk);
783         rc = x25_wait_for_data(sk, sk->sk_rcvtimeo);
784         if (rc)
785                 goto out2;
786         skb = skb_dequeue(&sk->sk_receive_queue);
787         rc = -EINVAL;
788         if (!skb->sk)
789                 goto out2;
790         newsk            = skb->sk;
791         newsk->sk_socket = newsock;
792         newsk->sk_sleep  = &newsock->wait;
793
794         /* Now attach up the new socket */
795         skb->sk = NULL;
796         kfree_skb(skb);
797         sk->sk_ack_backlog--;
798         newsock->sk    = newsk;
799         newsock->state = SS_CONNECTED;
800         rc = 0;
801 out2:
802         release_sock(sk);
803 out:
804         return rc;
805 }
806
807 static int x25_getname(struct socket *sock, struct sockaddr *uaddr,
808                        int *uaddr_len, int peer)
809 {
810         struct sockaddr_x25 *sx25 = (struct sockaddr_x25 *)uaddr;
811         struct sock *sk = sock->sk;
812         struct x25_sock *x25 = x25_sk(sk);
813
814         if (peer) {
815                 if (sk->sk_state != TCP_ESTABLISHED)
816                         return -ENOTCONN;
817                 sx25->sx25_addr = x25->dest_addr;
818         } else
819                 sx25->sx25_addr = x25->source_addr;
820
821         sx25->sx25_family = AF_X25;
822         *uaddr_len = sizeof(*sx25);
823
824         return 0;
825 }
826  
827 int x25_rx_call_request(struct sk_buff *skb, struct x25_neigh *nb,
828                         unsigned int lci)
829 {
830         struct sock *sk;
831         struct sock *make;
832         struct x25_sock *makex25;
833         struct x25_address source_addr, dest_addr;
834         struct x25_facilities facilities;
835         int len, rc;
836
837         /*
838          *      Remove the LCI and frame type.
839          */
840         skb_pull(skb, X25_STD_MIN_LEN);
841
842         /*
843          *      Extract the X.25 addresses and convert them to ASCII strings,
844          *      and remove them.
845          */
846         skb_pull(skb, x25_addr_ntoa(skb->data, &source_addr, &dest_addr));
847
848         /*
849          *      Get the length of the facilities, skip past them for the moment
850          *      get the call user data because this is needed to determine
851          *      the correct listener
852          */
853         len = skb->data[0] + 1;
854         skb_pull(skb,len);
855
856         /*
857          *      Find a listener for the particular address/cud pair.
858          */
859         sk = x25_find_listener(&source_addr,skb);
860         skb_push(skb,len);
861
862         /*
863          *      We can't accept the Call Request.
864          */
865         if (sk == NULL || sk_acceptq_is_full(sk))
866                 goto out_clear_request;
867
868         /*
869          *      Try to reach a compromise on the requested facilities.
870          */
871         if ((len = x25_negotiate_facilities(skb, sk, &facilities)) == -1)
872                 goto out_sock_put;
873
874         /*
875          * current neighbour/link might impose additional limits
876          * on certain facilties
877          */
878
879         x25_limit_facilities(&facilities, nb);
880
881         /*
882          *      Try to create a new socket.
883          */
884         make = x25_make_new(sk);
885         if (!make)
886                 goto out_sock_put;
887
888         /*
889          *      Remove the facilities
890          */
891         skb_pull(skb, len);
892
893         skb->sk     = make;
894         make->sk_state = TCP_ESTABLISHED;
895
896         makex25 = x25_sk(make);
897         makex25->lci           = lci;
898         makex25->dest_addr     = dest_addr;
899         makex25->source_addr   = source_addr;
900         makex25->neighbour     = nb;
901         makex25->facilities    = facilities;
902         makex25->vc_facil_mask = x25_sk(sk)->vc_facil_mask;
903         /* ensure no reverse facil on accept */
904         makex25->vc_facil_mask &= ~X25_MASK_REVERSE;
905         makex25->cudmatchlength = x25_sk(sk)->cudmatchlength;
906
907         /* Normally all calls are accepted immediatly */
908         if(makex25->accptapprv & X25_DENY_ACCPT_APPRV) {
909                 x25_write_internal(make, X25_CALL_ACCEPTED);
910                 makex25->state = X25_STATE_3;
911         }
912
913         /*
914          *      Incoming Call User Data.
915          */
916         if (skb->len >= 0) {
917                 memcpy(makex25->calluserdata.cuddata, skb->data, skb->len);
918                 makex25->calluserdata.cudlength = skb->len;
919         }
920
921         sk->sk_ack_backlog++;
922
923         x25_insert_socket(make);
924
925         skb_queue_head(&sk->sk_receive_queue, skb);
926
927         x25_start_heartbeat(make);
928
929         if (!sock_flag(sk, SOCK_DEAD))
930                 sk->sk_data_ready(sk, skb->len);
931         rc = 1;
932         sock_put(sk);
933 out:
934         return rc;
935 out_sock_put:
936         sock_put(sk);
937 out_clear_request:
938         rc = 0;
939         x25_transmit_clear_request(nb, lci, 0x01);
940         goto out;
941 }
942
943 static int x25_sendmsg(struct kiocb *iocb, struct socket *sock,
944                        struct msghdr *msg, size_t len)
945 {
946         struct sock *sk = sock->sk;
947         struct x25_sock *x25 = x25_sk(sk);
948         struct sockaddr_x25 *usx25 = (struct sockaddr_x25 *)msg->msg_name;
949         struct sockaddr_x25 sx25;
950         struct sk_buff *skb;
951         unsigned char *asmptr;
952         int noblock = msg->msg_flags & MSG_DONTWAIT;
953         size_t size;
954         int qbit = 0, rc = -EINVAL;
955
956         if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_OOB|MSG_EOR|MSG_CMSG_COMPAT))
957                 goto out;
958
959         /* we currently don't support segmented records at the user interface */
960         if (!(msg->msg_flags & (MSG_EOR|MSG_OOB)))
961                 goto out;
962
963         rc = -EADDRNOTAVAIL;
964         if (sock_flag(sk, SOCK_ZAPPED))
965                 goto out;
966
967         rc = -EPIPE;
968         if (sk->sk_shutdown & SEND_SHUTDOWN) {
969                 send_sig(SIGPIPE, current, 0);
970                 goto out;
971         }
972
973         rc = -ENETUNREACH;
974         if (!x25->neighbour)
975                 goto out;
976
977         if (usx25) {
978                 rc = -EINVAL;
979                 if (msg->msg_namelen < sizeof(sx25))
980                         goto out;
981                 memcpy(&sx25, usx25, sizeof(sx25));
982                 rc = -EISCONN;
983                 if (strcmp(x25->dest_addr.x25_addr, sx25.sx25_addr.x25_addr))
984                         goto out;
985                 rc = -EINVAL;
986                 if (sx25.sx25_family != AF_X25)
987                         goto out;
988         } else {
989                 /*
990                  *      FIXME 1003.1g - if the socket is like this because
991                  *      it has become closed (not started closed) we ought
992                  *      to SIGPIPE, EPIPE;
993                  */
994                 rc = -ENOTCONN;
995                 if (sk->sk_state != TCP_ESTABLISHED)
996                         goto out;
997
998                 sx25.sx25_family = AF_X25;
999                 sx25.sx25_addr   = x25->dest_addr;
1000         }
1001
1002         SOCK_DEBUG(sk, "x25_sendmsg: sendto: Addresses built.\n");
1003
1004         /* Build a packet */
1005         SOCK_DEBUG(sk, "x25_sendmsg: sendto: building packet.\n");
1006
1007         if ((msg->msg_flags & MSG_OOB) && len > 32)
1008                 len = 32;
1009
1010         size = len + X25_MAX_L2_LEN + X25_EXT_MIN_LEN;
1011
1012         skb = sock_alloc_send_skb(sk, size, noblock, &rc);
1013         if (!skb)
1014                 goto out;
1015         X25_SKB_CB(skb)->flags = msg->msg_flags;
1016
1017         skb_reserve(skb, X25_MAX_L2_LEN + X25_EXT_MIN_LEN);
1018
1019         /*
1020          *      Put the data on the end
1021          */
1022         SOCK_DEBUG(sk, "x25_sendmsg: Copying user data\n");
1023
1024         asmptr = skb->h.raw = skb_put(skb, len);
1025
1026         rc = memcpy_fromiovec(asmptr, msg->msg_iov, len);
1027         if (rc)
1028                 goto out_kfree_skb;
1029
1030         /*
1031          *      If the Q BIT Include socket option is in force, the first
1032          *      byte of the user data is the logical value of the Q Bit.
1033          */
1034         if (x25->qbitincl) {
1035                 qbit = skb->data[0];
1036                 skb_pull(skb, 1);
1037         }
1038
1039         /*
1040          *      Push down the X.25 header
1041          */
1042         SOCK_DEBUG(sk, "x25_sendmsg: Building X.25 Header.\n");
1043
1044         if (msg->msg_flags & MSG_OOB) {
1045                 if (x25->neighbour->extended) {
1046                         asmptr    = skb_push(skb, X25_STD_MIN_LEN);
1047                         *asmptr++ = ((x25->lci >> 8) & 0x0F) | X25_GFI_EXTSEQ;
1048                         *asmptr++ = (x25->lci >> 0) & 0xFF;
1049                         *asmptr++ = X25_INTERRUPT;
1050                 } else {
1051                         asmptr    = skb_push(skb, X25_STD_MIN_LEN);
1052                         *asmptr++ = ((x25->lci >> 8) & 0x0F) | X25_GFI_STDSEQ;
1053                         *asmptr++ = (x25->lci >> 0) & 0xFF;
1054                         *asmptr++ = X25_INTERRUPT;
1055                 }
1056         } else {
1057                 if (x25->neighbour->extended) {
1058                         /* Build an Extended X.25 header */
1059                         asmptr    = skb_push(skb, X25_EXT_MIN_LEN);
1060                         *asmptr++ = ((x25->lci >> 8) & 0x0F) | X25_GFI_EXTSEQ;
1061                         *asmptr++ = (x25->lci >> 0) & 0xFF;
1062                         *asmptr++ = X25_DATA;
1063                         *asmptr++ = X25_DATA;
1064                 } else {
1065                         /* Build an Standard X.25 header */
1066                         asmptr    = skb_push(skb, X25_STD_MIN_LEN);
1067                         *asmptr++ = ((x25->lci >> 8) & 0x0F) | X25_GFI_STDSEQ;
1068                         *asmptr++ = (x25->lci >> 0) & 0xFF;
1069                         *asmptr++ = X25_DATA;
1070                 }
1071
1072                 if (qbit)
1073                         skb->data[0] |= X25_Q_BIT;
1074         }
1075
1076         SOCK_DEBUG(sk, "x25_sendmsg: Built header.\n");
1077         SOCK_DEBUG(sk, "x25_sendmsg: Transmitting buffer\n");
1078
1079         rc = -ENOTCONN;
1080         if (sk->sk_state != TCP_ESTABLISHED)
1081                 goto out_kfree_skb;
1082
1083         if (msg->msg_flags & MSG_OOB)
1084                 skb_queue_tail(&x25->interrupt_out_queue, skb);
1085         else {
1086                 len = x25_output(sk, skb);
1087                 if (len < 0)
1088                         kfree_skb(skb);
1089                 else if (x25->qbitincl)
1090                         len++;
1091         }
1092
1093         /*
1094          * lock_sock() is currently only used to serialize this x25_kick()
1095          * against input-driven x25_kick() calls. It currently only blocks
1096          * incoming packets for this socket and does not protect against
1097          * any other socket state changes and is not called from anywhere
1098          * else. As x25_kick() cannot block and as long as all socket
1099          * operations are BKL-wrapped, we don't need take to care about
1100          * purging the backlog queue in x25_release().
1101          *
1102          * Using lock_sock() to protect all socket operations entirely
1103          * (and making the whole x25 stack SMP aware) unfortunately would
1104          * require major changes to {send,recv}msg and skb allocation methods.
1105          * -> 2.5 ;)
1106          */
1107         lock_sock(sk);
1108         x25_kick(sk);
1109         release_sock(sk);
1110         rc = len;
1111 out:
1112         return rc;
1113 out_kfree_skb:
1114         kfree_skb(skb);
1115         goto out;
1116 }
1117
1118
1119 static int x25_recvmsg(struct kiocb *iocb, struct socket *sock,
1120                        struct msghdr *msg, size_t size,
1121                        int flags)
1122 {
1123         struct sock *sk = sock->sk;
1124         struct x25_sock *x25 = x25_sk(sk);
1125         struct sockaddr_x25 *sx25 = (struct sockaddr_x25 *)msg->msg_name;
1126         size_t copied;
1127         int qbit;
1128         struct sk_buff *skb;
1129         unsigned char *asmptr;
1130         int rc = -ENOTCONN;
1131
1132         /*
1133          * This works for seqpacket too. The receiver has ordered the queue for
1134          * us! We do one quick check first though
1135          */
1136         if (sk->sk_state != TCP_ESTABLISHED)
1137                 goto out;
1138
1139         if (flags & MSG_OOB) {
1140                 rc = -EINVAL;
1141                 if (sock_flag(sk, SOCK_URGINLINE) ||
1142                     !skb_peek(&x25->interrupt_in_queue))
1143                         goto out;
1144
1145                 skb = skb_dequeue(&x25->interrupt_in_queue);
1146
1147                 skb_pull(skb, X25_STD_MIN_LEN);
1148
1149                 /*
1150                  *      No Q bit information on Interrupt data.
1151                  */
1152                 if (x25->qbitincl) {
1153                         asmptr  = skb_push(skb, 1);
1154                         *asmptr = 0x00;
1155                 }
1156
1157                 msg->msg_flags |= MSG_OOB;
1158         } else {
1159                 /* Now we can treat all alike */
1160                 skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
1161                                         flags & MSG_DONTWAIT, &rc);
1162                 if (!skb)
1163                         goto out;
1164
1165                 qbit = (skb->data[0] & X25_Q_BIT) == X25_Q_BIT;
1166
1167                 skb_pull(skb, x25->neighbour->extended ?
1168                                 X25_EXT_MIN_LEN : X25_STD_MIN_LEN);
1169
1170                 if (x25->qbitincl) {
1171                         asmptr  = skb_push(skb, 1);
1172                         *asmptr = qbit;
1173                 }
1174         }
1175
1176         skb->h.raw = skb->data;
1177
1178         copied = skb->len;
1179
1180         if (copied > size) {
1181                 copied = size;
1182                 msg->msg_flags |= MSG_TRUNC;
1183         }
1184
1185         /* Currently, each datagram always contains a complete record */ 
1186         msg->msg_flags |= MSG_EOR;
1187
1188         rc = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
1189         if (rc)
1190                 goto out_free_dgram;
1191
1192         if (sx25) {
1193                 sx25->sx25_family = AF_X25;
1194                 sx25->sx25_addr   = x25->dest_addr;
1195         }
1196
1197         msg->msg_namelen = sizeof(struct sockaddr_x25);
1198
1199         lock_sock(sk);
1200         x25_check_rbuf(sk);
1201         release_sock(sk);
1202         rc = copied;
1203 out_free_dgram:
1204         skb_free_datagram(sk, skb);
1205 out:
1206         return rc;
1207 }
1208
1209
1210 static int x25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1211 {
1212         struct sock *sk = sock->sk;
1213         struct x25_sock *x25 = x25_sk(sk);
1214         void __user *argp = (void __user *)arg;
1215         int rc;
1216
1217         switch (cmd) {
1218                 case TIOCOUTQ: {
1219                         int amount = sk->sk_sndbuf -
1220                                      atomic_read(&sk->sk_wmem_alloc);
1221                         if (amount < 0)
1222                                 amount = 0;
1223                         rc = put_user(amount, (unsigned int __user *)argp);
1224                         break;
1225                 }
1226
1227                 case TIOCINQ: {
1228                         struct sk_buff *skb;
1229                         int amount = 0;
1230                         /*
1231                          * These two are safe on a single CPU system as
1232                          * only user tasks fiddle here
1233                          */
1234                         if ((skb = skb_peek(&sk->sk_receive_queue)) != NULL)
1235                                 amount = skb->len;
1236                         rc = put_user(amount, (unsigned int __user *)argp);
1237                         break;
1238                 }
1239
1240                 case SIOCGSTAMP:
1241                         rc = -EINVAL;
1242                         if (sk)
1243                                 rc = sock_get_timestamp(sk, 
1244                                                 (struct timeval __user *)argp); 
1245                         break;
1246                 case SIOCGIFADDR:
1247                 case SIOCSIFADDR:
1248                 case SIOCGIFDSTADDR:
1249                 case SIOCSIFDSTADDR:
1250                 case SIOCGIFBRDADDR:
1251                 case SIOCSIFBRDADDR:
1252                 case SIOCGIFNETMASK:
1253                 case SIOCSIFNETMASK:
1254                 case SIOCGIFMETRIC:
1255                 case SIOCSIFMETRIC:
1256                         rc = -EINVAL;
1257                         break;
1258                 case SIOCADDRT:
1259                 case SIOCDELRT:
1260                         rc = -EPERM;
1261                         if (!capable(CAP_NET_ADMIN))
1262                                 break;
1263                         rc = x25_route_ioctl(cmd, argp);
1264                         break;
1265                 case SIOCX25GSUBSCRIP:
1266                         rc = x25_subscr_ioctl(cmd, argp);
1267                         break;
1268                 case SIOCX25SSUBSCRIP:
1269                         rc = -EPERM;
1270                         if (!capable(CAP_NET_ADMIN))
1271                                 break;
1272                         rc = x25_subscr_ioctl(cmd, argp);
1273                         break;
1274                 case SIOCX25GFACILITIES: {
1275                         struct x25_facilities fac = x25->facilities;
1276                         rc = copy_to_user(argp, &fac,
1277                                           sizeof(fac)) ? -EFAULT : 0;
1278                         break;
1279                 }
1280
1281                 case SIOCX25SFACILITIES: {
1282                         struct x25_facilities facilities;
1283                         rc = -EFAULT;
1284                         if (copy_from_user(&facilities, argp,
1285                                            sizeof(facilities)))
1286                                 break;
1287                         rc = -EINVAL;
1288                         if (sk->sk_state != TCP_LISTEN &&
1289                             sk->sk_state != TCP_CLOSE)
1290                                 break;
1291                         if (facilities.pacsize_in < X25_PS16 ||
1292                             facilities.pacsize_in > X25_PS4096)
1293                                 break;
1294                         if (facilities.pacsize_out < X25_PS16 ||
1295                             facilities.pacsize_out > X25_PS4096)
1296                                 break;
1297                         if (facilities.winsize_in < 1 ||
1298                             facilities.winsize_in > 127)
1299                                 break;
1300                         if (facilities.throughput < 0x03 ||
1301                             facilities.throughput > 0xDD)
1302                                 break;
1303                         if (facilities.reverse &&
1304                                 (facilities.reverse | 0x81)!= 0x81)
1305                                 break;
1306                         x25->facilities = facilities;
1307                         rc = 0;
1308                         break;
1309                 }
1310
1311                 case SIOCX25GCALLUSERDATA: {
1312                         struct x25_calluserdata cud = x25->calluserdata;
1313                         rc = copy_to_user(argp, &cud,
1314                                           sizeof(cud)) ? -EFAULT : 0;
1315                         break;
1316                 }
1317
1318                 case SIOCX25SCALLUSERDATA: {
1319                         struct x25_calluserdata calluserdata;
1320
1321                         rc = -EFAULT;
1322                         if (copy_from_user(&calluserdata, argp,
1323                                            sizeof(calluserdata)))
1324                                 break;
1325                         rc = -EINVAL;
1326                         if (calluserdata.cudlength > X25_MAX_CUD_LEN)
1327                                 break;
1328                         x25->calluserdata = calluserdata;
1329                         rc = 0;
1330                         break;
1331                 }
1332
1333                 case SIOCX25GCAUSEDIAG: {
1334                         struct x25_causediag causediag;
1335                         causediag = x25->causediag;
1336                         rc = copy_to_user(argp, &causediag,
1337                                           sizeof(causediag)) ? -EFAULT : 0;
1338                         break;
1339                 }
1340
1341                 case SIOCX25SCUDMATCHLEN: {
1342                         struct x25_subaddr sub_addr;
1343                         rc = -EINVAL;
1344                         if(sk->sk_state != TCP_CLOSE)
1345                                 break;
1346                         rc = -EFAULT;
1347                         if (copy_from_user(&sub_addr, argp,
1348                                         sizeof(sub_addr)))
1349                                 break;
1350                         rc = -EINVAL;
1351                         if(sub_addr.cudmatchlength > X25_MAX_CUD_LEN)
1352                                 break;
1353                         x25->cudmatchlength = sub_addr.cudmatchlength;
1354                         rc = 0;
1355                         break;
1356                 }
1357
1358                 case SIOCX25CALLACCPTAPPRV: {
1359                         rc = -EINVAL;
1360                         if (sk->sk_state != TCP_CLOSE)
1361                                 break;
1362                         x25->accptapprv = X25_ALLOW_ACCPT_APPRV;
1363                         rc = 0;
1364                         break;
1365                 }
1366
1367                 case SIOCX25SENDCALLACCPT:  {
1368                         rc = -EINVAL;
1369                         if (sk->sk_state != TCP_ESTABLISHED)
1370                                 break;
1371                         if (x25->accptapprv)    /* must call accptapprv above */
1372                                 break;
1373                         x25_write_internal(sk, X25_CALL_ACCEPTED);
1374                         x25->state = X25_STATE_3;
1375                         rc = 0;
1376                         break;
1377                 }
1378
1379                 default:
1380                         rc = -ENOIOCTLCMD;
1381                         break;
1382         }
1383
1384         return rc;
1385 }
1386
1387 static struct net_proto_family x25_family_ops = {
1388         .family =       AF_X25,
1389         .create =       x25_create,
1390         .owner  =       THIS_MODULE,
1391 };
1392
1393 static const struct proto_ops SOCKOPS_WRAPPED(x25_proto_ops) = {
1394         .family =       AF_X25,
1395         .owner =        THIS_MODULE,
1396         .release =      x25_release,
1397         .bind =         x25_bind,
1398         .connect =      x25_connect,
1399         .socketpair =   sock_no_socketpair,
1400         .accept =       x25_accept,
1401         .getname =      x25_getname,
1402         .poll =         datagram_poll,
1403         .ioctl =        x25_ioctl,
1404         .listen =       x25_listen,
1405         .shutdown =     sock_no_shutdown,
1406         .setsockopt =   x25_setsockopt,
1407         .getsockopt =   x25_getsockopt,
1408         .sendmsg =      x25_sendmsg,
1409         .recvmsg =      x25_recvmsg,
1410         .mmap =         sock_no_mmap,
1411         .sendpage =     sock_no_sendpage,
1412 };
1413
1414 #include <linux/smp_lock.h>
1415 SOCKOPS_WRAP(x25_proto, AF_X25);
1416
1417 static struct packet_type x25_packet_type = {
1418         .type = __constant_htons(ETH_P_X25),
1419         .func = x25_lapb_receive_frame,
1420 };
1421
1422 static struct notifier_block x25_dev_notifier = {
1423         .notifier_call = x25_device_event,
1424 };
1425
1426 void x25_kill_by_neigh(struct x25_neigh *nb)
1427 {
1428         struct sock *s;
1429         struct hlist_node *node;
1430
1431         write_lock_bh(&x25_list_lock);
1432
1433         sk_for_each(s, node, &x25_list)
1434                 if (x25_sk(s)->neighbour == nb)
1435                         x25_disconnect(s, ENETUNREACH, 0, 0);
1436
1437         write_unlock_bh(&x25_list_lock);
1438 }
1439
1440 static int __init x25_init(void)
1441 {
1442         int rc = proto_register(&x25_proto, 0);
1443
1444         if (rc != 0)
1445                 goto out;
1446
1447         sock_register(&x25_family_ops);
1448
1449         dev_add_pack(&x25_packet_type);
1450
1451         register_netdevice_notifier(&x25_dev_notifier);
1452
1453         printk(KERN_INFO "X.25 for Linux. Version 0.2 for Linux 2.1.15\n");
1454
1455 #ifdef CONFIG_SYSCTL
1456         x25_register_sysctl();
1457 #endif
1458         x25_proc_init();
1459 out:
1460         return rc;
1461 }
1462 module_init(x25_init);
1463
1464 static void __exit x25_exit(void)
1465 {
1466         x25_proc_exit();
1467         x25_link_free();
1468         x25_route_free();
1469
1470 #ifdef CONFIG_SYSCTL
1471         x25_unregister_sysctl();
1472 #endif
1473
1474         unregister_netdevice_notifier(&x25_dev_notifier);
1475
1476         dev_remove_pack(&x25_packet_type);
1477
1478         sock_unregister(AF_X25);
1479         proto_unregister(&x25_proto);
1480 }
1481 module_exit(x25_exit);
1482
1483 MODULE_AUTHOR("Jonathan Naylor <g4klx@g4klx.demon.co.uk>");
1484 MODULE_DESCRIPTION("The X.25 Packet Layer network layer protocol");
1485 MODULE_LICENSE("GPL");
1486 MODULE_ALIAS_NETPROTO(PF_X25);