~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/net/x25/af_x25.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0-or-later
  2 /*
  3  *      X.25 Packet Layer release 002
  4  *
  5  *      This is ALPHA test software. This code may break your machine,
  6  *      randomly fail to work with new releases, misbehave and/or generally
  7  *      screw up. It might even work.
  8  *
  9  *      This code REQUIRES 2.1.15 or higher
 10  *
 11  *      History
 12  *      X.25 001        Jonathan Naylor Started coding.
 13  *      X.25 002        Jonathan Naylor Centralised disconnect handling.
 14  *                                      New timer architecture.
 15  *      2000-03-11      Henner Eisen    MSG_EOR handling more POSIX compliant.
 16  *      2000-03-22      Daniela Squassoni Allowed disabling/enabling of
 17  *                                        facilities negotiation and increased
 18  *                                        the throughput upper limit.
 19  *      2000-08-27      Arnaldo C. Melo s/suser/capable/ + micro cleanups
 20  *      2000-09-04      Henner Eisen    Set sock->state in x25_accept().
 21  *                                      Fixed x25_output() related skb leakage.
 22  *      2000-10-02      Henner Eisen    Made x25_kick() single threaded per socket.
 23  *      2000-10-27      Henner Eisen    MSG_DONTWAIT for fragment allocation.
 24  *      2000-11-14      Henner Eisen    Closing datalink from NETDEV_GOING_DOWN
 25  *      2002-10-06      Arnaldo C. Melo Get rid of cli/sti, move proc stuff to
 26  *                                      x25_proc.c, using seq_file
 27  *      2005-04-02      Shaun Pereira   Selective sub address matching
 28  *                                      with call user data
 29  *      2005-04-15      Shaun Pereira   Fast select with no restriction on
 30  *                                      response
 31  */
 32 
 33 #define pr_fmt(fmt) "X25: " fmt
 34 
 35 #include <linux/module.h>
 36 #include <linux/capability.h>
 37 #include <linux/errno.h>
 38 #include <linux/kernel.h>
 39 #include <linux/sched/signal.h>
 40 #include <linux/timer.h>
 41 #include <linux/string.h>
 42 #include <linux/net.h>
 43 #include <linux/netdevice.h>
 44 #include <linux/if_arp.h>
 45 #include <linux/skbuff.h>
 46 #include <linux/slab.h>
 47 #include <net/sock.h>
 48 #include <net/tcp_states.h>
 49 #include <linux/uaccess.h>
 50 #include <linux/fcntl.h>
 51 #include <linux/termios.h>      /* For TIOCINQ/OUTQ */
 52 #include <linux/notifier.h>
 53 #include <linux/init.h>
 54 #include <linux/compat.h>
 55 #include <linux/ctype.h>
 56 
 57 #include <net/x25.h>
 58 #include <net/compat.h>
 59 
 60 int sysctl_x25_restart_request_timeout = X25_DEFAULT_T20;
 61 int sysctl_x25_call_request_timeout    = X25_DEFAULT_T21;
 62 int sysctl_x25_reset_request_timeout   = X25_DEFAULT_T22;
 63 int sysctl_x25_clear_request_timeout   = X25_DEFAULT_T23;
 64 int sysctl_x25_ack_holdback_timeout    = X25_DEFAULT_T2;
 65 int sysctl_x25_forward                 = 0;
 66 
 67 HLIST_HEAD(x25_list);
 68 DEFINE_RWLOCK(x25_list_lock);
 69 
 70 static const struct proto_ops x25_proto_ops;
 71 
 72 static const struct x25_address null_x25_address = {"               "};
 73 
 74 #ifdef CONFIG_COMPAT
 75 struct compat_x25_subscrip_struct {
 76         char device[200-sizeof(compat_ulong_t)];
 77         compat_ulong_t global_facil_mask;
 78         compat_uint_t extended;
 79 };
 80 #endif
 81 
 82 
 83 int x25_parse_address_block(struct sk_buff *skb,
 84                 struct x25_address *called_addr,
 85                 struct x25_address *calling_addr)
 86 {
 87         unsigned char len;
 88         int needed;
 89         int rc;
 90 
 91         if (!pskb_may_pull(skb, 1)) {
 92                 /* packet has no address block */
 93                 rc = 0;
 94                 goto empty;
 95         }
 96 
 97         len = *skb->data;
 98         needed = 1 + ((len >> 4) + (len & 0x0f) + 1) / 2;
 99 
100         if (!pskb_may_pull(skb, needed)) {
101                 /* packet is too short to hold the addresses it claims
102                    to hold */
103                 rc = -1;
104                 goto empty;
105         }
106 
107         return x25_addr_ntoa(skb->data, called_addr, calling_addr);
108 
109 empty:
110         *called_addr->x25_addr = 0;
111         *calling_addr->x25_addr = 0;
112 
113         return rc;
114 }
115 
116 
117 int x25_addr_ntoa(unsigned char *p, struct x25_address *called_addr,
118                   struct x25_address *calling_addr)
119 {
120         unsigned int called_len, calling_len;
121         char *called, *calling;
122         unsigned int i;
123 
124         called_len  = (*p >> 0) & 0x0F;
125         calling_len = (*p >> 4) & 0x0F;
126 
127         called  = called_addr->x25_addr;
128         calling = calling_addr->x25_addr;
129         p++;
130 
131         for (i = 0; i < (called_len + calling_len); i++) {
132                 if (i < called_len) {
133                         if (i % 2 != 0) {
134                                 *called++ = ((*p >> 0) & 0x0F) + '';
135                                 p++;
136                         } else {
137                                 *called++ = ((*p >> 4) & 0x0F) + '';
138                         }
139                 } else {
140                         if (i % 2 != 0) {
141                                 *calling++ = ((*p >> 0) & 0x0F) + '';
142                                 p++;
143                         } else {
144                                 *calling++ = ((*p >> 4) & 0x0F) + '';
145                         }
146                 }
147         }
148 
149         *called = *calling = '\0';
150 
151         return 1 + (called_len + calling_len + 1) / 2;
152 }
153 
154 int x25_addr_aton(unsigned char *p, struct x25_address *called_addr,
155                   struct x25_address *calling_addr)
156 {
157         unsigned int called_len, calling_len;
158         char *called, *calling;
159         int i;
160 
161         called  = called_addr->x25_addr;
162         calling = calling_addr->x25_addr;
163 
164         called_len  = strlen(called);
165         calling_len = strlen(calling);
166 
167         *p++ = (calling_len << 4) | (called_len << 0);
168 
169         for (i = 0; i < (called_len + calling_len); i++) {
170                 if (i < called_len) {
171                         if (i % 2 != 0) {
172                                 *p |= (*called++ - '') << 0;
173                                 p++;
174                         } else {
175                                 *p = 0x00;
176                                 *p |= (*called++ - '') << 4;
177                         }
178                 } else {
179                         if (i % 2 != 0) {
180                                 *p |= (*calling++ - '') << 0;
181                                 p++;
182                         } else {
183                                 *p = 0x00;
184                                 *p |= (*calling++ - '') << 4;
185                         }
186                 }
187         }
188 
189         return 1 + (called_len + calling_len + 1) / 2;
190 }
191 
192 /*
193  *      Socket removal during an interrupt is now safe.
194  */
195 static void x25_remove_socket(struct sock *sk)
196 {
197         write_lock_bh(&x25_list_lock);
198         sk_del_node_init(sk);
199         write_unlock_bh(&x25_list_lock);
200 }
201 
202 /*
203  *      Handle device status changes.
204  */
205 static int x25_device_event(struct notifier_block *this, unsigned long event,
206                             void *ptr)
207 {
208         struct net_device *dev = netdev_notifier_info_to_dev(ptr);
209         struct x25_neigh *nb;
210 
211         if (!net_eq(dev_net(dev), &init_net))
212                 return NOTIFY_DONE;
213 
214         if (dev->type == ARPHRD_X25) {
215                 switch (event) {
216                 case NETDEV_REGISTER:
217                 case NETDEV_POST_TYPE_CHANGE:
218                         x25_link_device_up(dev);
219                         break;
220                 case NETDEV_DOWN:
221                         nb = x25_get_neigh(dev);
222                         if (nb) {
223                                 x25_link_terminated(nb);
224                                 x25_neigh_put(nb);
225                         }
226                         x25_route_device_down(dev);
227                         break;
228                 case NETDEV_PRE_TYPE_CHANGE:
229                 case NETDEV_UNREGISTER:
230                         x25_link_device_down(dev);
231                         break;
232                 case NETDEV_CHANGE:
233                         if (!netif_carrier_ok(dev)) {
234                                 nb = x25_get_neigh(dev);
235                                 if (nb) {
236                                         x25_link_terminated(nb);
237                                         x25_neigh_put(nb);
238                                 }
239                         }
240                         break;
241                 }
242         }
243 
244         return NOTIFY_DONE;
245 }
246 
247 /*
248  *      Add a socket to the bound sockets list.
249  */
250 static void x25_insert_socket(struct sock *sk)
251 {
252         write_lock_bh(&x25_list_lock);
253         sk_add_node(sk, &x25_list);
254         write_unlock_bh(&x25_list_lock);
255 }
256 
257 /*
258  *      Find a socket that wants to accept the Call Request we just
259  *      received. Check the full list for an address/cud match.
260  *      If no cuds match return the next_best thing, an address match.
261  *      Note: if a listening socket has cud set it must only get calls
262  *      with matching cud.
263  */
264 static struct sock *x25_find_listener(struct x25_address *addr,
265                                         struct sk_buff *skb)
266 {
267         struct sock *s;
268         struct sock *next_best;
269 
270         read_lock_bh(&x25_list_lock);
271         next_best = NULL;
272 
273         sk_for_each(s, &x25_list)
274                 if ((!strcmp(addr->x25_addr,
275                         x25_sk(s)->source_addr.x25_addr) ||
276                                 !strcmp(x25_sk(s)->source_addr.x25_addr,
277                                         null_x25_address.x25_addr)) &&
278                                         s->sk_state == TCP_LISTEN) {
279                         /*
280                          * Found a listening socket, now check the incoming
281                          * call user data vs this sockets call user data
282                          */
283                         if (x25_sk(s)->cudmatchlength > 0 &&
284                                 skb->len >= x25_sk(s)->cudmatchlength) {
285                                 if((memcmp(x25_sk(s)->calluserdata.cuddata,
286                                         skb->data,
287                                         x25_sk(s)->cudmatchlength)) == 0) {
288                                         sock_hold(s);
289                                         goto found;
290                                  }
291                         } else
292                                 next_best = s;
293                 }
294         if (next_best) {
295                 s = next_best;
296                 sock_hold(s);
297                 goto found;
298         }
299         s = NULL;
300 found:
301         read_unlock_bh(&x25_list_lock);
302         return s;
303 }
304 
305 /*
306  *      Find a connected X.25 socket given my LCI and neighbour.
307  */
308 static struct sock *__x25_find_socket(unsigned int lci, struct x25_neigh *nb)
309 {
310         struct sock *s;
311 
312         sk_for_each(s, &x25_list)
313                 if (x25_sk(s)->lci == lci && x25_sk(s)->neighbour == nb) {
314                         sock_hold(s);
315                         goto found;
316                 }
317         s = NULL;
318 found:
319         return s;
320 }
321 
322 struct sock *x25_find_socket(unsigned int lci, struct x25_neigh *nb)
323 {
324         struct sock *s;
325 
326         read_lock_bh(&x25_list_lock);
327         s = __x25_find_socket(lci, nb);
328         read_unlock_bh(&x25_list_lock);
329         return s;
330 }
331 
332 /*
333  *      Find a unique LCI for a given device.
334  */
335 static unsigned int x25_new_lci(struct x25_neigh *nb)
336 {
337         unsigned int lci = 1;
338         struct sock *sk;
339 
340         while ((sk = x25_find_socket(lci, nb)) != NULL) {
341                 sock_put(sk);
342                 if (++lci == 4096) {
343                         lci = 0;
344                         break;
345                 }
346                 cond_resched();
347         }
348 
349         return lci;
350 }
351 
352 /*
353  *      Deferred destroy.
354  */
355 static void __x25_destroy_socket(struct sock *);
356 
357 /*
358  *      handler for deferred kills.
359  */
360 static void x25_destroy_timer(struct timer_list *t)
361 {
362         struct sock *sk = from_timer(sk, t, sk_timer);
363 
364         x25_destroy_socket_from_timer(sk);
365 }
366 
367 /*
368  *      This is called from user mode and the timers. Thus it protects itself
369  *      against interrupting users but doesn't worry about being called during
370  *      work. Once it is removed from the queue no interrupt or bottom half
371  *      will touch it and we are (fairly 8-) ) safe.
372  *      Not static as it's used by the timer
373  */
374 static void __x25_destroy_socket(struct sock *sk)
375 {
376         struct sk_buff *skb;
377 
378         x25_stop_heartbeat(sk);
379         x25_stop_timer(sk);
380 
381         x25_remove_socket(sk);
382         x25_clear_queues(sk);           /* Flush the queues */
383 
384         while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) {
385                 if (skb->sk != sk) {            /* A pending connection */
386                         /*
387                          * Queue the unaccepted socket for death
388                          */
389                         skb->sk->sk_state = TCP_LISTEN;
390                         sock_set_flag(skb->sk, SOCK_DEAD);
391                         x25_start_heartbeat(skb->sk);
392                         x25_sk(skb->sk)->state = X25_STATE_0;
393                 }
394 
395                 kfree_skb(skb);
396         }
397 
398         if (sk_has_allocations(sk)) {
399                 /* Defer: outstanding buffers */
400                 sk->sk_timer.expires  = jiffies + 10 * HZ;
401                 sk->sk_timer.function = x25_destroy_timer;
402                 add_timer(&sk->sk_timer);
403         } else {
404                 /* drop last reference so sock_put will free */
405                 __sock_put(sk);
406         }
407 }
408 
409 void x25_destroy_socket_from_timer(struct sock *sk)
410 {
411         sock_hold(sk);
412         bh_lock_sock(sk);
413         __x25_destroy_socket(sk);
414         bh_unlock_sock(sk);
415         sock_put(sk);
416 }
417 
418 /*
419  *      Handling for system calls applied via the various interfaces to a
420  *      X.25 socket object.
421  */
422 
423 static int x25_setsockopt(struct socket *sock, int level, int optname,
424                           sockptr_t optval, unsigned int optlen)
425 {
426         int opt;
427         struct sock *sk = sock->sk;
428         int rc = -ENOPROTOOPT;
429 
430         if (level != SOL_X25 || optname != X25_QBITINCL)
431                 goto out;
432 
433         rc = -EINVAL;
434         if (optlen < sizeof(int))
435                 goto out;
436 
437         rc = -EFAULT;
438         if (copy_from_sockptr(&opt, optval, sizeof(int)))
439                 goto out;
440 
441         if (opt)
442                 set_bit(X25_Q_BIT_FLAG, &x25_sk(sk)->flags);
443         else
444                 clear_bit(X25_Q_BIT_FLAG, &x25_sk(sk)->flags);
445         rc = 0;
446 out:
447         return rc;
448 }
449 
450 static int x25_getsockopt(struct socket *sock, int level, int optname,
451                           char __user *optval, int __user *optlen)
452 {
453         struct sock *sk = sock->sk;
454         int val, len, rc = -ENOPROTOOPT;
455 
456         if (level != SOL_X25 || optname != X25_QBITINCL)
457                 goto out;
458 
459         rc = -EFAULT;
460         if (get_user(len, optlen))
461                 goto out;
462 
463         rc = -EINVAL;
464         if (len < 0)
465                 goto out;
466 
467         len = min_t(unsigned int, len, sizeof(int));
468 
469         rc = -EFAULT;
470         if (put_user(len, optlen))
471                 goto out;
472 
473         val = test_bit(X25_Q_BIT_FLAG, &x25_sk(sk)->flags);
474         rc = copy_to_user(optval, &val, len) ? -EFAULT : 0;
475 out:
476         return rc;
477 }
478 
479 static int x25_listen(struct socket *sock, int backlog)
480 {
481         struct sock *sk = sock->sk;
482         int rc = -EOPNOTSUPP;
483 
484         lock_sock(sk);
485         if (sock->state != SS_UNCONNECTED) {
486                 rc = -EINVAL;
487                 release_sock(sk);
488                 return rc;
489         }
490 
491         if (sk->sk_state != TCP_LISTEN) {
492                 memset(&x25_sk(sk)->dest_addr, 0, X25_ADDR_LEN);
493                 sk->sk_max_ack_backlog = backlog;
494                 sk->sk_state           = TCP_LISTEN;
495                 rc = 0;
496         }
497         release_sock(sk);
498 
499         return rc;
500 }
501 
502 static struct proto x25_proto = {
503         .name     = "X25",
504         .owner    = THIS_MODULE,
505         .obj_size = sizeof(struct x25_sock),
506 };
507 
508 static struct sock *x25_alloc_socket(struct net *net, int kern)
509 {
510         struct x25_sock *x25;
511         struct sock *sk = sk_alloc(net, AF_X25, GFP_ATOMIC, &x25_proto, kern);
512 
513         if (!sk)
514                 goto out;
515 
516         sock_init_data(NULL, sk);
517 
518         x25 = x25_sk(sk);
519         skb_queue_head_init(&x25->ack_queue);
520         skb_queue_head_init(&x25->fragment_queue);
521         skb_queue_head_init(&x25->interrupt_in_queue);
522         skb_queue_head_init(&x25->interrupt_out_queue);
523 out:
524         return sk;
525 }
526 
527 static int x25_create(struct net *net, struct socket *sock, int protocol,
528                       int kern)
529 {
530         struct sock *sk;
531         struct x25_sock *x25;
532         int rc = -EAFNOSUPPORT;
533 
534         if (!net_eq(net, &init_net))
535                 goto out;
536 
537         rc = -ESOCKTNOSUPPORT;
538         if (sock->type != SOCK_SEQPACKET)
539                 goto out;
540 
541         rc = -EINVAL;
542         if (protocol)
543                 goto out;
544 
545         rc = -ENOMEM;
546         if ((sk = x25_alloc_socket(net, kern)) == NULL)
547                 goto out;
548 
549         x25 = x25_sk(sk);
550 
551         sock_init_data(sock, sk);
552 
553         x25_init_timers(sk);
554 
555         sock->ops    = &x25_proto_ops;
556         sk->sk_protocol = protocol;
557         sk->sk_backlog_rcv = x25_backlog_rcv;
558 
559         x25->t21   = sysctl_x25_call_request_timeout;
560         x25->t22   = sysctl_x25_reset_request_timeout;
561         x25->t23   = sysctl_x25_clear_request_timeout;
562         x25->t2    = sysctl_x25_ack_holdback_timeout;
563         x25->state = X25_STATE_0;
564         x25->cudmatchlength = 0;
565         set_bit(X25_ACCPT_APPRV_FLAG, &x25->flags);     /* normally no cud  */
566                                                         /* on call accept   */
567 
568         x25->facilities.winsize_in  = X25_DEFAULT_WINDOW_SIZE;
569         x25->facilities.winsize_out = X25_DEFAULT_WINDOW_SIZE;
570         x25->facilities.pacsize_in  = X25_DEFAULT_PACKET_SIZE;
571         x25->facilities.pacsize_out = X25_DEFAULT_PACKET_SIZE;
572         x25->facilities.throughput  = 0;        /* by default don't negotiate
573                                                    throughput */
574         x25->facilities.reverse     = X25_DEFAULT_REVERSE;
575         x25->dte_facilities.calling_len = 0;
576         x25->dte_facilities.called_len = 0;
577         memset(x25->dte_facilities.called_ae, '\0',
578                         sizeof(x25->dte_facilities.called_ae));
579         memset(x25->dte_facilities.calling_ae, '\0',
580                         sizeof(x25->dte_facilities.calling_ae));
581 
582         rc = 0;
583 out:
584         return rc;
585 }
586 
587 static struct sock *x25_make_new(struct sock *osk)
588 {
589         struct sock *sk = NULL;
590         struct x25_sock *x25, *ox25;
591 
592         if (osk->sk_type != SOCK_SEQPACKET)
593                 goto out;
594 
595         if ((sk = x25_alloc_socket(sock_net(osk), 0)) == NULL)
596                 goto out;
597 
598         x25 = x25_sk(sk);
599 
600         sk->sk_type        = osk->sk_type;
601         sk->sk_priority    = READ_ONCE(osk->sk_priority);
602         sk->sk_protocol    = osk->sk_protocol;
603         sk->sk_rcvbuf      = osk->sk_rcvbuf;
604         sk->sk_sndbuf      = osk->sk_sndbuf;
605         sk->sk_state       = TCP_ESTABLISHED;
606         sk->sk_backlog_rcv = osk->sk_backlog_rcv;
607         sock_copy_flags(sk, osk);
608 
609         ox25 = x25_sk(osk);
610         x25->t21        = ox25->t21;
611         x25->t22        = ox25->t22;
612         x25->t23        = ox25->t23;
613         x25->t2         = ox25->t2;
614         x25->flags      = ox25->flags;
615         x25->facilities = ox25->facilities;
616         x25->dte_facilities = ox25->dte_facilities;
617         x25->cudmatchlength = ox25->cudmatchlength;
618 
619         clear_bit(X25_INTERRUPT_FLAG, &x25->flags);
620         x25_init_timers(sk);
621 out:
622         return sk;
623 }
624 
625 static int x25_release(struct socket *sock)
626 {
627         struct sock *sk = sock->sk;
628         struct x25_sock *x25;
629 
630         if (!sk)
631                 return 0;
632 
633         x25 = x25_sk(sk);
634 
635         sock_hold(sk);
636         lock_sock(sk);
637         switch (x25->state) {
638 
639                 case X25_STATE_0:
640                 case X25_STATE_2:
641                         x25_disconnect(sk, 0, 0, 0);
642                         __x25_destroy_socket(sk);
643                         goto out;
644 
645                 case X25_STATE_1:
646                 case X25_STATE_3:
647                 case X25_STATE_4:
648                         x25_clear_queues(sk);
649                         x25_write_internal(sk, X25_CLEAR_REQUEST);
650                         x25_start_t23timer(sk);
651                         x25->state = X25_STATE_2;
652                         sk->sk_state    = TCP_CLOSE;
653                         sk->sk_shutdown |= SEND_SHUTDOWN;
654                         sk->sk_state_change(sk);
655                         sock_set_flag(sk, SOCK_DEAD);
656                         sock_set_flag(sk, SOCK_DESTROY);
657                         break;
658 
659                 case X25_STATE_5:
660                         x25_write_internal(sk, X25_CLEAR_REQUEST);
661                         x25_disconnect(sk, 0, 0, 0);
662                         __x25_destroy_socket(sk);
663                         goto out;
664         }
665 
666         sock_orphan(sk);
667 out:
668         release_sock(sk);
669         sock_put(sk);
670         return 0;
671 }
672 
673 static int x25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
674 {
675         struct sock *sk = sock->sk;
676         struct sockaddr_x25 *addr = (struct sockaddr_x25 *)uaddr;
677         int len, i, rc = 0;
678 
679         if (addr_len != sizeof(struct sockaddr_x25) ||
680             addr->sx25_family != AF_X25 ||
681             strnlen(addr->sx25_addr.x25_addr, X25_ADDR_LEN) == X25_ADDR_LEN) {
682                 rc = -EINVAL;
683                 goto out;
684         }
685 
686         /* check for the null_x25_address */
687         if (strcmp(addr->sx25_addr.x25_addr, null_x25_address.x25_addr)) {
688 
689                 len = strlen(addr->sx25_addr.x25_addr);
690                 for (i = 0; i < len; i++) {
691                         if (!isdigit(addr->sx25_addr.x25_addr[i])) {
692                                 rc = -EINVAL;
693                                 goto out;
694                         }
695                 }
696         }
697 
698         lock_sock(sk);
699         if (sock_flag(sk, SOCK_ZAPPED)) {
700                 x25_sk(sk)->source_addr = addr->sx25_addr;
701                 x25_insert_socket(sk);
702                 sock_reset_flag(sk, SOCK_ZAPPED);
703         } else {
704                 rc = -EINVAL;
705         }
706         release_sock(sk);
707         net_dbg_ratelimited("x25_bind: socket is bound\n");
708 out:
709         return rc;
710 }
711 
712 static int x25_wait_for_connection_establishment(struct sock *sk)
713 {
714         DECLARE_WAITQUEUE(wait, current);
715         int rc;
716 
717         add_wait_queue_exclusive(sk_sleep(sk), &wait);
718         for (;;) {
719                 __set_current_state(TASK_INTERRUPTIBLE);
720                 rc = -ERESTARTSYS;
721                 if (signal_pending(current))
722                         break;
723                 rc = sock_error(sk);
724                 if (rc) {
725                         sk->sk_socket->state = SS_UNCONNECTED;
726                         break;
727                 }
728                 rc = -ENOTCONN;
729                 if (sk->sk_state == TCP_CLOSE) {
730                         sk->sk_socket->state = SS_UNCONNECTED;
731                         break;
732                 }
733                 rc = 0;
734                 if (sk->sk_state != TCP_ESTABLISHED) {
735                         release_sock(sk);
736                         schedule();
737                         lock_sock(sk);
738                 } else
739                         break;
740         }
741         __set_current_state(TASK_RUNNING);
742         remove_wait_queue(sk_sleep(sk), &wait);
743         return rc;
744 }
745 
746 static int x25_connect(struct socket *sock, struct sockaddr *uaddr,
747                        int addr_len, int flags)
748 {
749         struct sock *sk = sock->sk;
750         struct x25_sock *x25 = x25_sk(sk);
751         struct sockaddr_x25 *addr = (struct sockaddr_x25 *)uaddr;
752         struct x25_route *rt;
753         int rc = 0;
754 
755         lock_sock(sk);
756         if (sk->sk_state == TCP_ESTABLISHED && sock->state == SS_CONNECTING) {
757                 sock->state = SS_CONNECTED;
758                 goto out; /* Connect completed during a ERESTARTSYS event */
759         }
760 
761         rc = -ECONNREFUSED;
762         if (sk->sk_state == TCP_CLOSE && sock->state == SS_CONNECTING) {
763                 sock->state = SS_UNCONNECTED;
764                 goto out;
765         }
766 
767         rc = -EISCONN;  /* No reconnect on a seqpacket socket */
768         if (sk->sk_state == TCP_ESTABLISHED)
769                 goto out;
770 
771         rc = -EALREADY; /* Do nothing if call is already in progress */
772         if (sk->sk_state == TCP_SYN_SENT)
773                 goto out;
774 
775         sk->sk_state   = TCP_CLOSE;
776         sock->state = SS_UNCONNECTED;
777 
778         rc = -EINVAL;
779         if (addr_len != sizeof(struct sockaddr_x25) ||
780             addr->sx25_family != AF_X25 ||
781             strnlen(addr->sx25_addr.x25_addr, X25_ADDR_LEN) == X25_ADDR_LEN)
782                 goto out;
783 
784         rc = -ENETUNREACH;
785         rt = x25_get_route(&addr->sx25_addr);
786         if (!rt)
787                 goto out;
788 
789         x25->neighbour = x25_get_neigh(rt->dev);
790         if (!x25->neighbour)
791                 goto out_put_route;
792 
793         x25_limit_facilities(&x25->facilities, x25->neighbour);
794 
795         x25->lci = x25_new_lci(x25->neighbour);
796         if (!x25->lci)
797                 goto out_put_neigh;
798 
799         rc = -EINVAL;
800         if (sock_flag(sk, SOCK_ZAPPED)) /* Must bind first - autobinding does not work */
801                 goto out_put_neigh;
802 
803         if (!strcmp(x25->source_addr.x25_addr, null_x25_address.x25_addr))
804                 memset(&x25->source_addr, '\0', X25_ADDR_LEN);
805 
806         x25->dest_addr = addr->sx25_addr;
807 
808         /* Move to connecting socket, start sending Connect Requests */
809         sock->state   = SS_CONNECTING;
810         sk->sk_state  = TCP_SYN_SENT;
811 
812         x25->state = X25_STATE_1;
813 
814         x25_write_internal(sk, X25_CALL_REQUEST);
815 
816         x25_start_heartbeat(sk);
817         x25_start_t21timer(sk);
818 
819         /* Now the loop */
820         rc = -EINPROGRESS;
821         if (sk->sk_state != TCP_ESTABLISHED && (flags & O_NONBLOCK))
822                 goto out;
823 
824         rc = x25_wait_for_connection_establishment(sk);
825         if (rc)
826                 goto out_put_neigh;
827 
828         sock->state = SS_CONNECTED;
829         rc = 0;
830 out_put_neigh:
831         if (rc && x25->neighbour) {
832                 read_lock_bh(&x25_list_lock);
833                 x25_neigh_put(x25->neighbour);
834                 x25->neighbour = NULL;
835                 read_unlock_bh(&x25_list_lock);
836                 x25->state = X25_STATE_0;
837         }
838 out_put_route:
839         x25_route_put(rt);
840 out:
841         release_sock(sk);
842         return rc;
843 }
844 
845 static int x25_wait_for_data(struct sock *sk, long timeout)
846 {
847         DECLARE_WAITQUEUE(wait, current);
848         int rc = 0;
849 
850         add_wait_queue_exclusive(sk_sleep(sk), &wait);
851         for (;;) {
852                 __set_current_state(TASK_INTERRUPTIBLE);
853                 if (sk->sk_shutdown & RCV_SHUTDOWN)
854                         break;
855                 rc = -ERESTARTSYS;
856                 if (signal_pending(current))
857                         break;
858                 rc = -EAGAIN;
859                 if (!timeout)
860                         break;
861                 rc = 0;
862                 if (skb_queue_empty(&sk->sk_receive_queue)) {
863                         release_sock(sk);
864                         timeout = schedule_timeout(timeout);
865                         lock_sock(sk);
866                 } else
867                         break;
868         }
869         __set_current_state(TASK_RUNNING);
870         remove_wait_queue(sk_sleep(sk), &wait);
871         return rc;
872 }
873 
874 static int x25_accept(struct socket *sock, struct socket *newsock,
875                       struct proto_accept_arg *arg)
876 {
877         struct sock *sk = sock->sk;
878         struct sock *newsk;
879         struct sk_buff *skb;
880         int rc = -EINVAL;
881 
882         if (!sk)
883                 goto out;
884 
885         rc = -EOPNOTSUPP;
886         if (sk->sk_type != SOCK_SEQPACKET)
887                 goto out;
888 
889         lock_sock(sk);
890         rc = -EINVAL;
891         if (sk->sk_state != TCP_LISTEN)
892                 goto out2;
893 
894         rc = x25_wait_for_data(sk, sk->sk_rcvtimeo);
895         if (rc)
896                 goto out2;
897         skb = skb_dequeue(&sk->sk_receive_queue);
898         rc = -EINVAL;
899         if (!skb->sk)
900                 goto out2;
901         newsk            = skb->sk;
902         sock_graft(newsk, newsock);
903 
904         /* Now attach up the new socket */
905         skb->sk = NULL;
906         kfree_skb(skb);
907         sk_acceptq_removed(sk);
908         newsock->state = SS_CONNECTED;
909         rc = 0;
910 out2:
911         release_sock(sk);
912 out:
913         return rc;
914 }
915 
916 static int x25_getname(struct socket *sock, struct sockaddr *uaddr,
917                        int peer)
918 {
919         struct sockaddr_x25 *sx25 = (struct sockaddr_x25 *)uaddr;
920         struct sock *sk = sock->sk;
921         struct x25_sock *x25 = x25_sk(sk);
922         int rc = 0;
923 
924         if (peer) {
925                 if (sk->sk_state != TCP_ESTABLISHED) {
926                         rc = -ENOTCONN;
927                         goto out;
928                 }
929                 sx25->sx25_addr = x25->dest_addr;
930         } else
931                 sx25->sx25_addr = x25->source_addr;
932 
933         sx25->sx25_family = AF_X25;
934         rc = sizeof(*sx25);
935 
936 out:
937         return rc;
938 }
939 
940 int x25_rx_call_request(struct sk_buff *skb, struct x25_neigh *nb,
941                         unsigned int lci)
942 {
943         struct sock *sk;
944         struct sock *make;
945         struct x25_sock *makex25;
946         struct x25_address source_addr, dest_addr;
947         struct x25_facilities facilities;
948         struct x25_dte_facilities dte_facilities;
949         int len, addr_len, rc;
950 
951         /*
952          *      Remove the LCI and frame type.
953          */
954         skb_pull(skb, X25_STD_MIN_LEN);
955 
956         /*
957          *      Extract the X.25 addresses and convert them to ASCII strings,
958          *      and remove them.
959          *
960          *      Address block is mandatory in call request packets
961          */
962         addr_len = x25_parse_address_block(skb, &source_addr, &dest_addr);
963         if (addr_len <= 0)
964                 goto out_clear_request;
965         skb_pull(skb, addr_len);
966 
967         /*
968          *      Get the length of the facilities, skip past them for the moment
969          *      get the call user data because this is needed to determine
970          *      the correct listener
971          *
972          *      Facilities length is mandatory in call request packets
973          */
974         if (!pskb_may_pull(skb, 1))
975                 goto out_clear_request;
976         len = skb->data[0] + 1;
977         if (!pskb_may_pull(skb, len))
978                 goto out_clear_request;
979         skb_pull(skb,len);
980 
981         /*
982          *      Ensure that the amount of call user data is valid.
983          */
984         if (skb->len > X25_MAX_CUD_LEN)
985                 goto out_clear_request;
986 
987         /*
988          *      Get all the call user data so it can be used in
989          *      x25_find_listener and skb_copy_from_linear_data up ahead.
990          */
991         if (!pskb_may_pull(skb, skb->len))
992                 goto out_clear_request;
993 
994         /*
995          *      Find a listener for the particular address/cud pair.
996          */
997         sk = x25_find_listener(&source_addr,skb);
998         skb_push(skb,len);
999 
1000         if (sk != NULL && sk_acceptq_is_full(sk)) {
1001                 goto out_sock_put;
1002         }
1003 
1004         /*
1005          *      We dont have any listeners for this incoming call.
1006          *      Try forwarding it.
1007          */
1008         if (sk == NULL) {
1009                 skb_push(skb, addr_len + X25_STD_MIN_LEN);
1010                 if (sysctl_x25_forward &&
1011                                 x25_forward_call(&dest_addr, nb, skb, lci) > 0)
1012                 {
1013                         /* Call was forwarded, dont process it any more */
1014                         kfree_skb(skb);
1015                         rc = 1;
1016                         goto out;
1017                 } else {
1018                         /* No listeners, can't forward, clear the call */
1019                         goto out_clear_request;
1020                 }
1021         }
1022 
1023         /*
1024          *      Try to reach a compromise on the requested facilities.
1025          */
1026         len = x25_negotiate_facilities(skb, sk, &facilities, &dte_facilities);
1027         if (len == -1)
1028                 goto out_sock_put;
1029 
1030         /*
1031          * current neighbour/link might impose additional limits
1032          * on certain facilities
1033          */
1034 
1035         x25_limit_facilities(&facilities, nb);
1036 
1037         /*
1038          *      Try to create a new socket.
1039          */
1040         make = x25_make_new(sk);
1041         if (!make)
1042                 goto out_sock_put;
1043 
1044         /*
1045          *      Remove the facilities
1046          */
1047         skb_pull(skb, len);
1048 
1049         skb->sk     = make;
1050         make->sk_state = TCP_ESTABLISHED;
1051 
1052         makex25 = x25_sk(make);
1053         makex25->lci           = lci;
1054         makex25->dest_addr     = dest_addr;
1055         makex25->source_addr   = source_addr;
1056         x25_neigh_hold(nb);
1057         makex25->neighbour     = nb;
1058         makex25->facilities    = facilities;
1059         makex25->dte_facilities= dte_facilities;
1060         makex25->vc_facil_mask = x25_sk(sk)->vc_facil_mask;
1061         /* ensure no reverse facil on accept */
1062         makex25->vc_facil_mask &= ~X25_MASK_REVERSE;
1063         /* ensure no calling address extension on accept */
1064         makex25->vc_facil_mask &= ~X25_MASK_CALLING_AE;
1065         makex25->cudmatchlength = x25_sk(sk)->cudmatchlength;
1066 
1067         /* Normally all calls are accepted immediately */
1068         if (test_bit(X25_ACCPT_APPRV_FLAG, &makex25->flags)) {
1069                 x25_write_internal(make, X25_CALL_ACCEPTED);
1070                 makex25->state = X25_STATE_3;
1071         } else {
1072                 makex25->state = X25_STATE_5;
1073         }
1074 
1075         /*
1076          *      Incoming Call User Data.
1077          */
1078         skb_copy_from_linear_data(skb, makex25->calluserdata.cuddata, skb->len);
1079         makex25->calluserdata.cudlength = skb->len;
1080 
1081         sk_acceptq_added(sk);
1082 
1083         x25_insert_socket(make);
1084 
1085         skb_queue_head(&sk->sk_receive_queue, skb);
1086 
1087         x25_start_heartbeat(make);
1088 
1089         if (!sock_flag(sk, SOCK_DEAD))
1090                 sk->sk_data_ready(sk);
1091         rc = 1;
1092         sock_put(sk);
1093 out:
1094         return rc;
1095 out_sock_put:
1096         sock_put(sk);
1097 out_clear_request:
1098         rc = 0;
1099         x25_transmit_clear_request(nb, lci, 0x01);
1100         goto out;
1101 }
1102 
1103 static int x25_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
1104 {
1105         struct sock *sk = sock->sk;
1106         struct x25_sock *x25 = x25_sk(sk);
1107         DECLARE_SOCKADDR(struct sockaddr_x25 *, usx25, msg->msg_name);
1108         struct sockaddr_x25 sx25;
1109         struct sk_buff *skb;
1110         unsigned char *asmptr;
1111         int noblock = msg->msg_flags & MSG_DONTWAIT;
1112         size_t size;
1113         int qbit = 0, rc = -EINVAL;
1114 
1115         lock_sock(sk);
1116         if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_OOB|MSG_EOR|MSG_CMSG_COMPAT))
1117                 goto out;
1118 
1119         /* we currently don't support segmented records at the user interface */
1120         if (!(msg->msg_flags & (MSG_EOR|MSG_OOB)))
1121                 goto out;
1122 
1123         rc = -EADDRNOTAVAIL;
1124         if (sock_flag(sk, SOCK_ZAPPED))
1125                 goto out;
1126 
1127         rc = -EPIPE;
1128         if (sk->sk_shutdown & SEND_SHUTDOWN) {
1129                 send_sig(SIGPIPE, current, 0);
1130                 goto out;
1131         }
1132 
1133         rc = -ENETUNREACH;
1134         if (!x25->neighbour)
1135                 goto out;
1136 
1137         if (usx25) {
1138                 rc = -EINVAL;
1139                 if (msg->msg_namelen < sizeof(sx25))
1140                         goto out;
1141                 memcpy(&sx25, usx25, sizeof(sx25));
1142                 rc = -EISCONN;
1143                 if (strcmp(x25->dest_addr.x25_addr, sx25.sx25_addr.x25_addr))
1144                         goto out;
1145                 rc = -EINVAL;
1146                 if (sx25.sx25_family != AF_X25)
1147                         goto out;
1148         } else {
1149                 /*
1150                  *      FIXME 1003.1g - if the socket is like this because
1151                  *      it has become closed (not started closed) we ought
1152                  *      to SIGPIPE, EPIPE;
1153                  */
1154                 rc = -ENOTCONN;
1155                 if (sk->sk_state != TCP_ESTABLISHED)
1156                         goto out;
1157 
1158                 sx25.sx25_family = AF_X25;
1159                 sx25.sx25_addr   = x25->dest_addr;
1160         }
1161 
1162         /* Sanity check the packet size */
1163         if (len > 65535) {
1164                 rc = -EMSGSIZE;
1165                 goto out;
1166         }
1167 
1168         net_dbg_ratelimited("x25_sendmsg: sendto: Addresses built.\n");
1169 
1170         /* Build a packet */
1171         net_dbg_ratelimited("x25_sendmsg: sendto: building packet.\n");
1172 
1173         if ((msg->msg_flags & MSG_OOB) && len > 32)
1174                 len = 32;
1175 
1176         size = len + X25_MAX_L2_LEN + X25_EXT_MIN_LEN;
1177 
1178         release_sock(sk);
1179         skb = sock_alloc_send_skb(sk, size, noblock, &rc);
1180         lock_sock(sk);
1181         if (!skb)
1182                 goto out;
1183         X25_SKB_CB(skb)->flags = msg->msg_flags;
1184 
1185         skb_reserve(skb, X25_MAX_L2_LEN + X25_EXT_MIN_LEN);
1186 
1187         /*
1188          *      Put the data on the end
1189          */
1190         net_dbg_ratelimited("x25_sendmsg: Copying user data\n");
1191 
1192         skb_reset_transport_header(skb);
1193         skb_put(skb, len);
1194 
1195         rc = memcpy_from_msg(skb_transport_header(skb), msg, len);
1196         if (rc)
1197                 goto out_kfree_skb;
1198 
1199         /*
1200          *      If the Q BIT Include socket option is in force, the first
1201          *      byte of the user data is the logical value of the Q Bit.
1202          */
1203         if (test_bit(X25_Q_BIT_FLAG, &x25->flags)) {
1204                 if (!pskb_may_pull(skb, 1))
1205                         goto out_kfree_skb;
1206 
1207                 qbit = skb->data[0];
1208                 skb_pull(skb, 1);
1209         }
1210 
1211         /*
1212          *      Push down the X.25 header
1213          */
1214         net_dbg_ratelimited("x25_sendmsg: Building X.25 Header.\n");
1215 
1216         if (msg->msg_flags & MSG_OOB) {
1217                 if (x25->neighbour->extended) {
1218                         asmptr    = skb_push(skb, X25_STD_MIN_LEN);
1219                         *asmptr++ = ((x25->lci >> 8) & 0x0F) | X25_GFI_EXTSEQ;
1220                         *asmptr++ = (x25->lci >> 0) & 0xFF;
1221                         *asmptr++ = X25_INTERRUPT;
1222                 } else {
1223                         asmptr    = skb_push(skb, X25_STD_MIN_LEN);
1224                         *asmptr++ = ((x25->lci >> 8) & 0x0F) | X25_GFI_STDSEQ;
1225                         *asmptr++ = (x25->lci >> 0) & 0xFF;
1226                         *asmptr++ = X25_INTERRUPT;
1227                 }
1228         } else {
1229                 if (x25->neighbour->extended) {
1230                         /* Build an Extended X.25 header */
1231                         asmptr    = skb_push(skb, X25_EXT_MIN_LEN);
1232                         *asmptr++ = ((x25->lci >> 8) & 0x0F) | X25_GFI_EXTSEQ;
1233                         *asmptr++ = (x25->lci >> 0) & 0xFF;
1234                         *asmptr++ = X25_DATA;
1235                         *asmptr++ = X25_DATA;
1236                 } else {
1237                         /* Build an Standard X.25 header */
1238                         asmptr    = skb_push(skb, X25_STD_MIN_LEN);
1239                         *asmptr++ = ((x25->lci >> 8) & 0x0F) | X25_GFI_STDSEQ;
1240                         *asmptr++ = (x25->lci >> 0) & 0xFF;
1241                         *asmptr++ = X25_DATA;
1242                 }
1243 
1244                 if (qbit)
1245                         skb->data[0] |= X25_Q_BIT;
1246         }
1247 
1248         net_dbg_ratelimited("x25_sendmsg: Built header.\n");
1249         net_dbg_ratelimited("x25_sendmsg: Transmitting buffer\n");
1250 
1251         rc = -ENOTCONN;
1252         if (sk->sk_state != TCP_ESTABLISHED)
1253                 goto out_kfree_skb;
1254 
1255         if (msg->msg_flags & MSG_OOB)
1256                 skb_queue_tail(&x25->interrupt_out_queue, skb);
1257         else {
1258                 rc = x25_output(sk, skb);
1259                 len = rc;
1260                 if (rc < 0)
1261                         kfree_skb(skb);
1262                 else if (test_bit(X25_Q_BIT_FLAG, &x25->flags))
1263                         len++;
1264         }
1265 
1266         x25_kick(sk);
1267         rc = len;
1268 out:
1269         release_sock(sk);
1270         return rc;
1271 out_kfree_skb:
1272         kfree_skb(skb);
1273         goto out;
1274 }
1275 
1276 
1277 static int x25_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
1278                        int flags)
1279 {
1280         struct sock *sk = sock->sk;
1281         struct x25_sock *x25 = x25_sk(sk);
1282         DECLARE_SOCKADDR(struct sockaddr_x25 *, sx25, msg->msg_name);
1283         size_t copied;
1284         int qbit, header_len;
1285         struct sk_buff *skb;
1286         unsigned char *asmptr;
1287         int rc = -ENOTCONN;
1288 
1289         lock_sock(sk);
1290 
1291         if (x25->neighbour == NULL)
1292                 goto out;
1293 
1294         header_len = x25->neighbour->extended ?
1295                 X25_EXT_MIN_LEN : X25_STD_MIN_LEN;
1296 
1297         /*
1298          * This works for seqpacket too. The receiver has ordered the queue for
1299          * us! We do one quick check first though
1300          */
1301         if (sk->sk_state != TCP_ESTABLISHED)
1302                 goto out;
1303 
1304         if (flags & MSG_OOB) {
1305                 rc = -EINVAL;
1306                 if (sock_flag(sk, SOCK_URGINLINE) ||
1307                     !skb_peek(&x25->interrupt_in_queue))
1308                         goto out;
1309 
1310                 skb = skb_dequeue(&x25->interrupt_in_queue);
1311 
1312                 if (!pskb_may_pull(skb, X25_STD_MIN_LEN))
1313                         goto out_free_dgram;
1314 
1315                 skb_pull(skb, X25_STD_MIN_LEN);
1316 
1317                 /*
1318                  *      No Q bit information on Interrupt data.
1319                  */
1320                 if (test_bit(X25_Q_BIT_FLAG, &x25->flags)) {
1321                         asmptr  = skb_push(skb, 1);
1322                         *asmptr = 0x00;
1323                 }
1324 
1325                 msg->msg_flags |= MSG_OOB;
1326         } else {
1327                 /* Now we can treat all alike */
1328                 release_sock(sk);
1329                 skb = skb_recv_datagram(sk, flags, &rc);
1330                 lock_sock(sk);
1331                 if (!skb)
1332                         goto out;
1333 
1334                 if (!pskb_may_pull(skb, header_len))
1335                         goto out_free_dgram;
1336 
1337                 qbit = (skb->data[0] & X25_Q_BIT) == X25_Q_BIT;
1338 
1339                 skb_pull(skb, header_len);
1340 
1341                 if (test_bit(X25_Q_BIT_FLAG, &x25->flags)) {
1342                         asmptr  = skb_push(skb, 1);
1343                         *asmptr = qbit;
1344                 }
1345         }
1346 
1347         skb_reset_transport_header(skb);
1348         copied = skb->len;
1349 
1350         if (copied > size) {
1351                 copied = size;
1352                 msg->msg_flags |= MSG_TRUNC;
1353         }
1354 
1355         /* Currently, each datagram always contains a complete record */
1356         msg->msg_flags |= MSG_EOR;
1357 
1358         rc = skb_copy_datagram_msg(skb, 0, msg, copied);
1359         if (rc)
1360                 goto out_free_dgram;
1361 
1362         if (sx25) {
1363                 sx25->sx25_family = AF_X25;
1364                 sx25->sx25_addr   = x25->dest_addr;
1365                 msg->msg_namelen = sizeof(*sx25);
1366         }
1367 
1368         x25_check_rbuf(sk);
1369         rc = copied;
1370 out_free_dgram:
1371         skb_free_datagram(sk, skb);
1372 out:
1373         release_sock(sk);
1374         return rc;
1375 }
1376 
1377 
1378 static int x25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1379 {
1380         struct sock *sk = sock->sk;
1381         struct x25_sock *x25 = x25_sk(sk);
1382         void __user *argp = (void __user *)arg;
1383         int rc;
1384 
1385         switch (cmd) {
1386         case TIOCOUTQ: {
1387                 int amount;
1388 
1389                 amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
1390                 if (amount < 0)
1391                         amount = 0;
1392                 rc = put_user(amount, (unsigned int __user *)argp);
1393                 break;
1394         }
1395 
1396         case TIOCINQ: {
1397                 struct sk_buff *skb;
1398                 int amount = 0;
1399                 /*
1400                  * These two are safe on a single CPU system as
1401                  * only user tasks fiddle here
1402                  */
1403                 lock_sock(sk);
1404                 if ((skb = skb_peek(&sk->sk_receive_queue)) != NULL)
1405                         amount = skb->len;
1406                 release_sock(sk);
1407                 rc = put_user(amount, (unsigned int __user *)argp);
1408                 break;
1409         }
1410 
1411         case SIOCGIFADDR:
1412         case SIOCSIFADDR:
1413         case SIOCGIFDSTADDR:
1414         case SIOCSIFDSTADDR:
1415         case SIOCGIFBRDADDR:
1416         case SIOCSIFBRDADDR:
1417         case SIOCGIFNETMASK:
1418         case SIOCSIFNETMASK:
1419         case SIOCGIFMETRIC:
1420         case SIOCSIFMETRIC:
1421                 rc = -EINVAL;
1422                 break;
1423         case SIOCADDRT:
1424         case SIOCDELRT:
1425                 rc = -EPERM;
1426                 if (!capable(CAP_NET_ADMIN))
1427                         break;
1428                 rc = x25_route_ioctl(cmd, argp);
1429                 break;
1430         case SIOCX25GSUBSCRIP:
1431                 rc = x25_subscr_ioctl(cmd, argp);
1432                 break;
1433         case SIOCX25SSUBSCRIP:
1434                 rc = -EPERM;
1435                 if (!capable(CAP_NET_ADMIN))
1436                         break;
1437                 rc = x25_subscr_ioctl(cmd, argp);
1438                 break;
1439         case SIOCX25GFACILITIES: {
1440                 lock_sock(sk);
1441                 rc = copy_to_user(argp, &x25->facilities,
1442                                   sizeof(x25->facilities))
1443                         ? -EFAULT : 0;
1444                 release_sock(sk);
1445                 break;
1446         }
1447 
1448         case SIOCX25SFACILITIES: {
1449                 struct x25_facilities facilities;
1450                 rc = -EFAULT;
1451                 if (copy_from_user(&facilities, argp, sizeof(facilities)))
1452                         break;
1453                 rc = -EINVAL;
1454                 lock_sock(sk);
1455                 if (sk->sk_state != TCP_LISTEN &&
1456                     sk->sk_state != TCP_CLOSE)
1457                         goto out_fac_release;
1458                 if (facilities.pacsize_in < X25_PS16 ||
1459                     facilities.pacsize_in > X25_PS4096)
1460                         goto out_fac_release;
1461                 if (facilities.pacsize_out < X25_PS16 ||
1462                     facilities.pacsize_out > X25_PS4096)
1463                         goto out_fac_release;
1464                 if (facilities.winsize_in < 1 ||
1465                     facilities.winsize_in > 127)
1466                         goto out_fac_release;
1467                 if (facilities.throughput) {
1468                         int out = facilities.throughput & 0xf0;
1469                         int in  = facilities.throughput & 0x0f;
1470                         if (!out)
1471                                 facilities.throughput |=
1472                                         X25_DEFAULT_THROUGHPUT << 4;
1473                         else if (out < 0x30 || out > 0xD0)
1474                                 goto out_fac_release;
1475                         if (!in)
1476                                 facilities.throughput |=
1477                                         X25_DEFAULT_THROUGHPUT;
1478                         else if (in < 0x03 || in > 0x0D)
1479                                 goto out_fac_release;
1480                 }
1481                 if (facilities.reverse &&
1482                     (facilities.reverse & 0x81) != 0x81)
1483                         goto out_fac_release;
1484                 x25->facilities = facilities;
1485                 rc = 0;
1486 out_fac_release:
1487                 release_sock(sk);
1488                 break;
1489         }
1490 
1491         case SIOCX25GDTEFACILITIES: {
1492                 lock_sock(sk);
1493                 rc = copy_to_user(argp, &x25->dte_facilities,
1494                                   sizeof(x25->dte_facilities));
1495                 release_sock(sk);
1496                 if (rc)
1497                         rc = -EFAULT;
1498                 break;
1499         }
1500 
1501         case SIOCX25SDTEFACILITIES: {
1502                 struct x25_dte_facilities dtefacs;
1503                 rc = -EFAULT;
1504                 if (copy_from_user(&dtefacs, argp, sizeof(dtefacs)))
1505                         break;
1506                 rc = -EINVAL;
1507                 lock_sock(sk);
1508                 if (sk->sk_state != TCP_LISTEN &&
1509                     sk->sk_state != TCP_CLOSE)
1510                         goto out_dtefac_release;
1511                 if (dtefacs.calling_len > X25_MAX_AE_LEN)
1512                         goto out_dtefac_release;
1513                 if (dtefacs.called_len > X25_MAX_AE_LEN)
1514                         goto out_dtefac_release;
1515                 x25->dte_facilities = dtefacs;
1516                 rc = 0;
1517 out_dtefac_release:
1518                 release_sock(sk);
1519                 break;
1520         }
1521 
1522         case SIOCX25GCALLUSERDATA: {
1523                 lock_sock(sk);
1524                 rc = copy_to_user(argp, &x25->calluserdata,
1525                                   sizeof(x25->calluserdata))
1526                         ? -EFAULT : 0;
1527                 release_sock(sk);
1528                 break;
1529         }
1530 
1531         case SIOCX25SCALLUSERDATA: {
1532                 struct x25_calluserdata calluserdata;
1533 
1534                 rc = -EFAULT;
1535                 if (copy_from_user(&calluserdata, argp, sizeof(calluserdata)))
1536                         break;
1537                 rc = -EINVAL;
1538                 if (calluserdata.cudlength > X25_MAX_CUD_LEN)
1539                         break;
1540                 lock_sock(sk);
1541                 x25->calluserdata = calluserdata;
1542                 release_sock(sk);
1543                 rc = 0;
1544                 break;
1545         }
1546 
1547         case SIOCX25GCAUSEDIAG: {
1548                 lock_sock(sk);
1549                 rc = copy_to_user(argp, &x25->causediag, sizeof(x25->causediag))
1550                         ? -EFAULT : 0;
1551                 release_sock(sk);
1552                 break;
1553         }
1554 
1555         case SIOCX25SCAUSEDIAG: {
1556                 struct x25_causediag causediag;
1557                 rc = -EFAULT;
1558                 if (copy_from_user(&causediag, argp, sizeof(causediag)))
1559                         break;
1560                 lock_sock(sk);
1561                 x25->causediag = causediag;
1562                 release_sock(sk);
1563                 rc = 0;
1564                 break;
1565 
1566         }
1567 
1568         case SIOCX25SCUDMATCHLEN: {
1569                 struct x25_subaddr sub_addr;
1570                 rc = -EINVAL;
1571                 lock_sock(sk);
1572                 if(sk->sk_state != TCP_CLOSE)
1573                         goto out_cud_release;
1574                 rc = -EFAULT;
1575                 if (copy_from_user(&sub_addr, argp,
1576                                    sizeof(sub_addr)))
1577                         goto out_cud_release;
1578                 rc = -EINVAL;
1579                 if (sub_addr.cudmatchlength > X25_MAX_CUD_LEN)
1580                         goto out_cud_release;
1581                 x25->cudmatchlength = sub_addr.cudmatchlength;
1582                 rc = 0;
1583 out_cud_release:
1584                 release_sock(sk);
1585                 break;
1586         }
1587 
1588         case SIOCX25CALLACCPTAPPRV: {
1589                 rc = -EINVAL;
1590                 lock_sock(sk);
1591                 if (sk->sk_state == TCP_CLOSE) {
1592                         clear_bit(X25_ACCPT_APPRV_FLAG, &x25->flags);
1593                         rc = 0;
1594                 }
1595                 release_sock(sk);
1596                 break;
1597         }
1598 
1599         case SIOCX25SENDCALLACCPT:  {
1600                 rc = -EINVAL;
1601                 lock_sock(sk);
1602                 if (sk->sk_state != TCP_ESTABLISHED)
1603                         goto out_sendcallaccpt_release;
1604                 /* must call accptapprv above */
1605                 if (test_bit(X25_ACCPT_APPRV_FLAG, &x25->flags))
1606                         goto out_sendcallaccpt_release;
1607                 x25_write_internal(sk, X25_CALL_ACCEPTED);
1608                 x25->state = X25_STATE_3;
1609                 rc = 0;
1610 out_sendcallaccpt_release:
1611                 release_sock(sk);
1612                 break;
1613         }
1614 
1615         default:
1616                 rc = -ENOIOCTLCMD;
1617                 break;
1618         }
1619 
1620         return rc;
1621 }
1622 
1623 static const struct net_proto_family x25_family_ops = {
1624         .family =       AF_X25,
1625         .create =       x25_create,
1626         .owner  =       THIS_MODULE,
1627 };
1628 
1629 #ifdef CONFIG_COMPAT
1630 static int compat_x25_subscr_ioctl(unsigned int cmd,
1631                 struct compat_x25_subscrip_struct __user *x25_subscr32)
1632 {
1633         struct compat_x25_subscrip_struct x25_subscr;
1634         struct x25_neigh *nb;
1635         struct net_device *dev;
1636         int rc = -EINVAL;
1637 
1638         rc = -EFAULT;
1639         if (copy_from_user(&x25_subscr, x25_subscr32, sizeof(*x25_subscr32)))
1640                 goto out;
1641 
1642         rc = -EINVAL;
1643         dev = x25_dev_get(x25_subscr.device);
1644         if (dev == NULL)
1645                 goto out;
1646 
1647         nb = x25_get_neigh(dev);
1648         if (nb == NULL)
1649                 goto out_dev_put;
1650 
1651         dev_put(dev);
1652 
1653         if (cmd == SIOCX25GSUBSCRIP) {
1654                 read_lock_bh(&x25_neigh_list_lock);
1655                 x25_subscr.extended = nb->extended;
1656                 x25_subscr.global_facil_mask = nb->global_facil_mask;
1657                 read_unlock_bh(&x25_neigh_list_lock);
1658                 rc = copy_to_user(x25_subscr32, &x25_subscr,
1659                                 sizeof(*x25_subscr32)) ? -EFAULT : 0;
1660         } else {
1661                 rc = -EINVAL;
1662                 if (x25_subscr.extended == 0 || x25_subscr.extended == 1) {
1663                         rc = 0;
1664                         write_lock_bh(&x25_neigh_list_lock);
1665                         nb->extended = x25_subscr.extended;
1666                         nb->global_facil_mask = x25_subscr.global_facil_mask;
1667                         write_unlock_bh(&x25_neigh_list_lock);
1668                 }
1669         }
1670         x25_neigh_put(nb);
1671 out:
1672         return rc;
1673 out_dev_put:
1674         dev_put(dev);
1675         goto out;
1676 }
1677 
1678 static int compat_x25_ioctl(struct socket *sock, unsigned int cmd,
1679                                 unsigned long arg)
1680 {
1681         void __user *argp = compat_ptr(arg);
1682         int rc = -ENOIOCTLCMD;
1683 
1684         switch(cmd) {
1685         case TIOCOUTQ:
1686         case TIOCINQ:
1687                 rc = x25_ioctl(sock, cmd, (unsigned long)argp);
1688                 break;
1689         case SIOCGIFADDR:
1690         case SIOCSIFADDR:
1691         case SIOCGIFDSTADDR:
1692         case SIOCSIFDSTADDR:
1693         case SIOCGIFBRDADDR:
1694         case SIOCSIFBRDADDR:
1695         case SIOCGIFNETMASK:
1696         case SIOCSIFNETMASK:
1697         case SIOCGIFMETRIC:
1698         case SIOCSIFMETRIC:
1699                 rc = -EINVAL;
1700                 break;
1701         case SIOCADDRT:
1702         case SIOCDELRT:
1703                 rc = -EPERM;
1704                 if (!capable(CAP_NET_ADMIN))
1705                         break;
1706                 rc = x25_route_ioctl(cmd, argp);
1707                 break;
1708         case SIOCX25GSUBSCRIP:
1709                 rc = compat_x25_subscr_ioctl(cmd, argp);
1710                 break;
1711         case SIOCX25SSUBSCRIP:
1712                 rc = -EPERM;
1713                 if (!capable(CAP_NET_ADMIN))
1714                         break;
1715                 rc = compat_x25_subscr_ioctl(cmd, argp);
1716                 break;
1717         case SIOCX25GFACILITIES:
1718         case SIOCX25SFACILITIES:
1719         case SIOCX25GDTEFACILITIES:
1720         case SIOCX25SDTEFACILITIES:
1721         case SIOCX25GCALLUSERDATA:
1722         case SIOCX25SCALLUSERDATA:
1723         case SIOCX25GCAUSEDIAG:
1724         case SIOCX25SCAUSEDIAG:
1725         case SIOCX25SCUDMATCHLEN:
1726         case SIOCX25CALLACCPTAPPRV:
1727         case SIOCX25SENDCALLACCPT:
1728                 rc = x25_ioctl(sock, cmd, (unsigned long)argp);
1729                 break;
1730         default:
1731                 rc = -ENOIOCTLCMD;
1732                 break;
1733         }
1734         return rc;
1735 }
1736 #endif
1737 
1738 static const struct proto_ops x25_proto_ops = {
1739         .family =       AF_X25,
1740         .owner =        THIS_MODULE,
1741         .release =      x25_release,
1742         .bind =         x25_bind,
1743         .connect =      x25_connect,
1744         .socketpair =   sock_no_socketpair,
1745         .accept =       x25_accept,
1746         .getname =      x25_getname,
1747         .poll =         datagram_poll,
1748         .ioctl =        x25_ioctl,
1749 #ifdef CONFIG_COMPAT
1750         .compat_ioctl = compat_x25_ioctl,
1751 #endif
1752         .gettstamp =    sock_gettstamp,
1753         .listen =       x25_listen,
1754         .shutdown =     sock_no_shutdown,
1755         .setsockopt =   x25_setsockopt,
1756         .getsockopt =   x25_getsockopt,
1757         .sendmsg =      x25_sendmsg,
1758         .recvmsg =      x25_recvmsg,
1759         .mmap =         sock_no_mmap,
1760 };
1761 
1762 static struct packet_type x25_packet_type __read_mostly = {
1763         .type = cpu_to_be16(ETH_P_X25),
1764         .func = x25_lapb_receive_frame,
1765 };
1766 
1767 static struct notifier_block x25_dev_notifier = {
1768         .notifier_call = x25_device_event,
1769 };
1770 
1771 void x25_kill_by_neigh(struct x25_neigh *nb)
1772 {
1773         struct sock *s;
1774 
1775         write_lock_bh(&x25_list_lock);
1776 
1777         sk_for_each(s, &x25_list) {
1778                 if (x25_sk(s)->neighbour == nb) {
1779                         write_unlock_bh(&x25_list_lock);
1780                         lock_sock(s);
1781                         x25_disconnect(s, ENETUNREACH, 0, 0);
1782                         release_sock(s);
1783                         write_lock_bh(&x25_list_lock);
1784                 }
1785         }
1786         write_unlock_bh(&x25_list_lock);
1787 
1788         /* Remove any related forwards */
1789         x25_clear_forward_by_dev(nb->dev);
1790 }
1791 
1792 static int __init x25_init(void)
1793 {
1794         int rc;
1795 
1796         rc = proto_register(&x25_proto, 0);
1797         if (rc)
1798                 goto out;
1799 
1800         rc = sock_register(&x25_family_ops);
1801         if (rc)
1802                 goto out_proto;
1803 
1804         dev_add_pack(&x25_packet_type);
1805 
1806         rc = register_netdevice_notifier(&x25_dev_notifier);
1807         if (rc)
1808                 goto out_sock;
1809 
1810         rc = x25_register_sysctl();
1811         if (rc)
1812                 goto out_dev;
1813 
1814         rc = x25_proc_init();
1815         if (rc)
1816                 goto out_sysctl;
1817 
1818         pr_info("Linux Version 0.2\n");
1819 
1820 out:
1821         return rc;
1822 out_sysctl:
1823         x25_unregister_sysctl();
1824 out_dev:
1825         unregister_netdevice_notifier(&x25_dev_notifier);
1826 out_sock:
1827         dev_remove_pack(&x25_packet_type);
1828         sock_unregister(AF_X25);
1829 out_proto:
1830         proto_unregister(&x25_proto);
1831         goto out;
1832 }
1833 module_init(x25_init);
1834 
1835 static void __exit x25_exit(void)
1836 {
1837         x25_proc_exit();
1838         x25_link_free();
1839         x25_route_free();
1840 
1841         x25_unregister_sysctl();
1842 
1843         unregister_netdevice_notifier(&x25_dev_notifier);
1844 
1845         dev_remove_pack(&x25_packet_type);
1846 
1847         sock_unregister(AF_X25);
1848         proto_unregister(&x25_proto);
1849 }
1850 module_exit(x25_exit);
1851 
1852 MODULE_AUTHOR("Jonathan Naylor <g4klx@g4klx.demon.co.uk>");
1853 MODULE_DESCRIPTION("The X.25 Packet Layer network layer protocol");
1854 MODULE_LICENSE("GPL");
1855 MODULE_ALIAS_NETPROTO(PF_X25);
1856 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php