patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / net / llc / af_llc.c
1 /*
2  * af_llc.c - LLC User Interface SAPs
3  * Description:
4  *   Functions in this module are implementation of socket based llc
5  *   communications for the Linux operating system. Support of llc class
6  *   one and class two is provided via SOCK_DGRAM and SOCK_STREAM
7  *   respectively.
8  *
9  *   An llc2 connection is (mac + sap), only one llc2 sap connection
10  *   is allowed per mac. Though one sap may have multiple mac + sap
11  *   connections.
12  *
13  * Copyright (c) 2001 by Jay Schulist <jschlst@samba.org>
14  *               2002-2003 by Arnaldo Carvalho de Melo <acme@conectiva.com.br>
15  *
16  * This program can be redistributed or modified under the terms of the
17  * GNU General Public License as published by the Free Software Foundation.
18  * This program is distributed without any warranty or implied warranty
19  * of merchantability or fitness for a particular purpose.
20  *
21  * See the GNU General Public License for more details.
22  */
23 #include <linux/config.h>
24 #include <linux/kernel.h>
25 #include <linux/module.h>
26 #include <linux/tcp.h>
27 #include <linux/rtnetlink.h>
28 #include <linux/init.h>
29 #include <net/llc.h>
30 #include <net/llc_sap.h>
31 #include <net/llc_pdu.h>
32 #include <net/llc_conn.h>
33
34 /* remember: uninitialized global data is zeroed because its in .bss */
35 static u16 llc_ui_sap_last_autoport = LLC_SAP_DYN_START;
36 static u16 llc_ui_sap_link_no_max[256];
37 static struct sockaddr_llc llc_ui_addrnull;
38 static struct proto_ops llc_ui_ops;
39
40 static int llc_ui_wait_for_conn(struct sock *sk, int timeout);
41 static int llc_ui_wait_for_disc(struct sock *sk, int timeout);
42 static int llc_ui_wait_for_data(struct sock *sk, int timeout);
43 static int llc_ui_wait_for_busy_core(struct sock *sk, int timeout);
44
45 #if 0
46 #define dprintk(args...) printk(KERN_DEBUG args)
47 #else
48 #define dprintk(args...)
49 #endif
50
51 /**
52  *      llc_ui_next_link_no - return the next unused link number for a sap
53  *      @sap: Address of sap to get link number from.
54  *
55  *      Return the next unused link number for a given sap.
56  */
57 static __inline__ u16 llc_ui_next_link_no(int sap)
58 {
59         return llc_ui_sap_link_no_max[sap]++;
60 }
61
62 /**
63  *      llc_proto_type - return eth protocol for ARP header type
64  *      @arphrd: ARP header type.
65  *
66  *      Given an ARP header type return the corresponding ethernet protocol.
67  */
68 static __inline__ u16 llc_proto_type(u16 arphrd)
69 {
70         return arphrd == ARPHRD_IEEE802_TR ?
71                          htons(ETH_P_TR_802_2) : htons(ETH_P_802_2);
72 }
73
74 /**
75  *      llc_ui_addr_null - determines if a address structure is null
76  *      @addr: Address to test if null.
77  */
78 static __inline__ u8 llc_ui_addr_null(struct sockaddr_llc *addr)
79 {
80         return !memcmp(addr, &llc_ui_addrnull, sizeof(*addr));
81 }
82
83 /**
84  *      llc_ui_header_len - return length of llc header based on operation
85  *      @sk: Socket which contains a valid llc socket type.
86  *      @addr: Complete sockaddr_llc structure received from the user.
87  *
88  *      Provide the length of the llc header depending on what kind of
89  *      operation the user would like to perform and the type of socket.
90  *      Returns the correct llc header length.
91  */
92 static __inline__ u8 llc_ui_header_len(struct sock *sk,
93                                        struct sockaddr_llc *addr)
94 {
95         u8 rc = LLC_PDU_LEN_U;
96
97         if (addr->sllc_test || addr->sllc_xid)
98                 rc = LLC_PDU_LEN_U;
99         else if (sk->sk_type == SOCK_STREAM)
100                 rc = LLC_PDU_LEN_I;
101         return rc;
102 }
103
104 /**
105  *      llc_ui_send_data - send data via reliable llc2 connection
106  *      @sk: Connection the socket is using.
107  *      @skb: Data the user wishes to send.
108  *      @addr: Source and destination fields provided by the user.
109  *      @noblock: can we block waiting for data?
110  *
111  *      Send data via reliable llc2 connection.
112  *      Returns 0 upon success, non-zero if action did not succeed.
113  */
114 static int llc_ui_send_data(struct sock* sk, struct sk_buff *skb, int noblock)
115 {
116         struct llc_opt* llc = llc_sk(sk);
117         int rc = 0;
118
119         if (llc_data_accept_state(llc->state) || llc->p_flag) {
120                 int timeout = sock_sndtimeo(sk, noblock);
121
122                 rc = llc_ui_wait_for_busy_core(sk, timeout);
123         }
124         if (!rc)
125                 rc = llc_build_and_send_pkt(sk, skb);
126         return rc;
127 }
128
129 static void llc_ui_sk_init(struct socket *sock, struct sock *sk)
130 {
131         sk->sk_type     = sock->type;
132         sk->sk_sleep    = &sock->wait;
133         sk->sk_socket   = sock;
134         sock->sk        = sk;
135         sock->ops       = &llc_ui_ops;
136 }
137
138 /**
139  *      llc_ui_create - alloc and init a new llc_ui socket
140  *      @sock: Socket to initialize and attach allocated sk to.
141  *      @protocol: Unused.
142  *
143  *      Allocate and initialize a new llc_ui socket, validate the user wants a
144  *      socket type we have available.
145  *      Returns 0 upon success, negative upon failure.
146  */
147 static int llc_ui_create(struct socket *sock, int protocol)
148 {
149         struct sock *sk;
150         int rc = -ESOCKTNOSUPPORT;
151
152         if (sock->type == SOCK_DGRAM || sock->type == SOCK_STREAM) {
153                 rc = -ENOMEM;
154                 sk = llc_sk_alloc(PF_LLC, GFP_KERNEL);
155                 if (sk) {
156                         rc = 0;
157                         llc_ui_sk_init(sock, sk);
158                 }
159         }
160         return rc;
161 }
162
163 /**
164  *      llc_ui_release - shutdown socket
165  *      @sock: Socket to release.
166  *
167  *      Shutdown and deallocate an existing socket.
168  */
169 static int llc_ui_release(struct socket *sock)
170 {
171         struct sock *sk = sock->sk;
172         struct llc_opt *llc;
173
174         if (!sk)
175                 goto out;
176         sock_hold(sk);
177         lock_sock(sk);
178         llc = llc_sk(sk);
179         dprintk("%s: closing local(%02X) remote(%02X)\n", __FUNCTION__,
180                 llc->laddr.lsap, llc->daddr.lsap);
181         if (!llc_send_disc(sk))
182                 llc_ui_wait_for_disc(sk, sk->sk_rcvtimeo);
183         if (!sk->sk_zapped)
184                 llc_sap_remove_socket(llc->sap, sk);
185         release_sock(sk);
186         if (llc->sap && hlist_empty(&llc->sap->sk_list.list)) {
187                 llc_release_sockets(llc->sap);
188                 llc_sap_close(llc->sap);
189         }
190         if (llc->dev)
191                 dev_put(llc->dev);
192         sock_put(sk);
193         llc_sk_free(sk);
194 out:
195         return 0;
196 }
197
198 /**
199  *      llc_ui_autoport - provide dynamically allocate SAP number
200  *
201  *      Provide the caller with a dynamically allocated SAP number according
202  *      to the rules that are set in this function. Returns: 0, upon failure,
203  *      SAP number otherwise.
204  */
205 static int llc_ui_autoport(void)
206 {
207         struct llc_sap *sap;
208         int i, tries = 0;
209
210         while (tries < LLC_SAP_DYN_TRIES) {
211                 for (i = llc_ui_sap_last_autoport;
212                      i < LLC_SAP_DYN_STOP; i += 2) {
213                         sap = llc_sap_find(i);
214                         if (!sap) {
215                                 llc_ui_sap_last_autoport = i + 2;
216                                 goto out;
217                         }
218                 }
219                 llc_ui_sap_last_autoport = LLC_SAP_DYN_START;
220                 tries++;
221         }
222         i = 0;
223 out:
224         return i;
225 }
226
227 /**
228  *      llc_ui_autobind - Bind a socket to a specific address.
229  *      @sk: Socket to bind an address to.
230  *      @addr: Address the user wants the socket bound to.
231  *
232  *      Bind a socket to a specific address. For llc a user is able to bind to
233  *      a specific sap only or mac + sap. If the user only specifies a sap and
234  *      a null dmac (all zeros) the user is attempting to bind to an entire
235  *      sap. This will stop anyone else on the local system from using that
236  *      sap.  If someone else has a mac + sap open the bind to null + sap will
237  *      fail.
238  *      If the user desires to bind to a specific mac + sap, it is possible to
239  *      have multiple sap connections via multiple macs.
240  *      Bind and autobind for that matter must enforce the correct sap usage
241  *      otherwise all hell will break loose.
242  *      Returns: 0 upon success, negative otherwise.
243  */
244 static int llc_ui_autobind(struct socket *sock, struct sockaddr_llc *addr)
245 {
246         struct sock *sk = sock->sk;
247         struct llc_opt *llc = llc_sk(sk);
248         struct llc_sap *sap;
249         int rc = -EINVAL;
250
251         if (!sk->sk_zapped)
252                 goto out;
253         rc = -ENODEV;
254         llc->dev = dev_getfirstbyhwtype(addr->sllc_arphrd);
255         if (!llc->dev)
256                 goto out;
257         rc = -EUSERS;
258         llc->laddr.lsap = llc_ui_autoport();
259         if (!llc->laddr.lsap)
260                 goto out;
261         rc = -EBUSY; /* some other network layer is using the sap */
262         sap = llc_sap_open(llc->laddr.lsap, NULL);
263         if (!sap)
264                 goto out;
265         memcpy(llc->laddr.mac, llc->dev->dev_addr, IFHWADDRLEN);
266         memcpy(&llc->addr, addr, sizeof(llc->addr));
267         /* assign new connection to its SAP */
268         llc_sap_add_socket(sap, sk);
269         rc = sk->sk_zapped = 0;
270 out:
271         return rc;
272 }
273
274 /**
275  *      llc_ui_bind - bind a socket to a specific address.
276  *      @sock: Socket to bind an address to.
277  *      @uaddr: Address the user wants the socket bound to.
278  *      @addrlen: Length of the uaddr structure.
279  *
280  *      Bind a socket to a specific address. For llc a user is able to bind to
281  *      a specific sap only or mac + sap. If the user only specifies a sap and
282  *      a null dmac (all zeros) the user is attempting to bind to an entire
283  *      sap. This will stop anyone else on the local system from using that
284  *      sap. If someone else has a mac + sap open the bind to null + sap will
285  *      fail.
286  *      If the user desires to bind to a specific mac + sap, it is possible to
287  *      have multiple sap connections via multiple macs.
288  *      Bind and autobind for that matter must enforce the correct sap usage
289  *      otherwise all hell will break loose.
290  *      Returns: 0 upon success, negative otherwise.
291  */
292 static int llc_ui_bind(struct socket *sock, struct sockaddr *uaddr, int addrlen)
293 {
294         struct sockaddr_llc *addr = (struct sockaddr_llc *)uaddr;
295         struct sock *sk = sock->sk;
296         struct llc_opt *llc = llc_sk(sk);
297         struct llc_sap *sap;
298         int rc = -EINVAL;
299
300         dprintk("%s: binding %02X\n", __FUNCTION__, addr->sllc_sap);
301         if (!sk->sk_zapped || addrlen != sizeof(*addr))
302                 goto out;
303         rc = -EAFNOSUPPORT;
304         if (addr->sllc_family != AF_LLC)
305                 goto out;
306         if (!addr->sllc_sap) {
307                 rc = -EUSERS;
308                 addr->sllc_sap = llc_ui_autoport();
309                 if (!addr->sllc_sap)
310                         goto out;
311         }
312         sap = llc_sap_find(addr->sllc_sap);
313         if (!sap) {
314                 sap = llc_sap_open(addr->sllc_sap, NULL);
315                 rc = -EBUSY; /* some other network layer is using the sap */
316                 if (!sap)
317                         goto out;
318         } else {
319                 struct llc_addr laddr, daddr;
320                 struct sock *ask;
321
322                 memset(&laddr, 0, sizeof(laddr));
323                 memset(&daddr, 0, sizeof(daddr));
324                 /*
325                  * FIXME: check if the the address is multicast,
326                  *        only SOCK_DGRAM can do this.
327                  */
328                 memcpy(laddr.mac, addr->sllc_mac, IFHWADDRLEN);
329                 laddr.lsap = addr->sllc_sap;
330                 rc = -EADDRINUSE; /* mac + sap clash. */
331                 ask = llc_lookup_established(sap, &daddr, &laddr);
332                 if (ask) {
333                         sock_put(ask);
334                         goto out;
335                 }
336         }
337         llc->laddr.lsap = addr->sllc_sap;
338         memcpy(llc->laddr.mac, addr->sllc_mac, IFHWADDRLEN);
339         memcpy(&llc->addr, addr, sizeof(llc->addr));
340         /* assign new connection to its SAP */
341         llc_sap_add_socket(sap, sk);
342         rc = sk->sk_zapped = 0;
343 out:
344         return rc;
345 }
346
347 /**
348  *      llc_ui_shutdown - shutdown a connect llc2 socket.
349  *      @sock: Socket to shutdown.
350  *      @how: What part of the socket to shutdown.
351  *
352  *      Shutdown a connected llc2 socket. Currently this function only supports
353  *      shutting down both sends and receives (2), we could probably make this
354  *      function such that a user can shutdown only half the connection but not
355  *      right now.
356  *      Returns: 0 upon success, negative otherwise.
357  */
358 static int llc_ui_shutdown(struct socket *sock, int how)
359 {
360         struct sock *sk = sock->sk;
361         int rc = -ENOTCONN;
362
363         lock_sock(sk);
364         if (sk->sk_state != TCP_ESTABLISHED)
365                 goto out;
366         rc = -EINVAL;
367         if (how != 2)
368                 goto out;
369         rc = llc_send_disc(sk);
370         if (!rc)
371                 rc = llc_ui_wait_for_disc(sk, sk->sk_rcvtimeo);
372         /* Wake up anyone sleeping in poll */
373         sk->sk_state_change(sk);
374 out:
375         release_sock(sk);
376         return rc;
377 }
378
379 /**
380  *      llc_ui_connect - Connect to a remote llc2 mac + sap.
381  *      @sock: Socket which will be connected to the remote destination.
382  *      @uaddr: Remote and possibly the local address of the new connection.
383  *      @addrlen: Size of uaddr structure.
384  *      @flags: Operational flags specified by the user.
385  *
386  *      Connect to a remote llc2 mac + sap. The caller must specify the
387  *      destination mac and address to connect to. If the user hasn't previously
388  *      called bind(2) with a smac the address of the first interface of the
389  *      specified arp type will be used.
390  *      This function will autobind if user did not previously call bind.
391  *      Returns: 0 upon success, negative otherwise.
392  */
393 static int llc_ui_connect(struct socket *sock, struct sockaddr *uaddr,
394                           int addrlen, int flags)
395 {
396         struct sock *sk = sock->sk;
397         struct llc_opt *llc = llc_sk(sk);
398         struct sockaddr_llc *addr = (struct sockaddr_llc *)uaddr;
399         struct net_device *dev;
400         int rc = -EINVAL;
401
402         lock_sock(sk);
403         if (addrlen != sizeof(*addr))
404                 goto out;
405         rc = -EAFNOSUPPORT;
406         if (addr->sllc_family != AF_LLC)
407                 goto out;
408         /* bind connection to sap if user hasn't done it. */
409         if (sk->sk_zapped) {
410                 /* bind to sap with null dev, exclusive */
411                 rc = llc_ui_autobind(sock, addr);
412                 if (rc)
413                         goto out;
414                 llc->daddr.lsap = addr->sllc_sap;
415                 memcpy(llc->daddr.mac, addr->sllc_mac, IFHWADDRLEN);
416         }
417         dev = llc->dev;
418         if (sk->sk_type != SOCK_STREAM)
419                 goto out;
420         rc = -EALREADY;
421         if (sock->state == SS_CONNECTING)
422                 goto out;
423         sock->state = SS_CONNECTING;
424         sk->sk_state   = TCP_SYN_SENT;
425         llc->link   = llc_ui_next_link_no(llc->sap->laddr.lsap);
426         rc = llc_establish_connection(sk, dev->dev_addr,
427                                       addr->sllc_mac, addr->sllc_sap);
428         if (rc) {
429                 dprintk("%s: llc_ui_send_conn failed :-(\n", __FUNCTION__);
430                 sock->state  = SS_UNCONNECTED;
431                 sk->sk_state = TCP_CLOSE;
432                 goto out;
433         }
434         rc = llc_ui_wait_for_conn(sk, sk->sk_rcvtimeo);
435         if (rc)
436                 dprintk("%s: llc_ui_wait_for_conn failed=%d\n", __FUNCTION__, rc);
437 out:
438         release_sock(sk);
439         return rc;
440 }
441
442 /**
443  *      llc_ui_listen - allow a normal socket to accept incoming connections
444  *      @sock: Socket to allow incoming connections on.
445  *      @backlog: Number of connections to queue.
446  *
447  *      Allow a normal socket to accept incoming connections.
448  *      Returns 0 upon success, negative otherwise.
449  */
450 static int llc_ui_listen(struct socket *sock, int backlog)
451 {
452         struct sock *sk = sock->sk;
453         int rc = -EINVAL;
454
455         lock_sock(sk);
456         if (sock->state != SS_UNCONNECTED)
457                 goto out;
458         rc = -EOPNOTSUPP;
459         if (sk->sk_type != SOCK_STREAM)
460                 goto out;
461         rc = -EAGAIN;
462         if (sk->sk_zapped)
463                 goto out;
464         rc = 0;
465         if (!(unsigned)backlog) /* BSDism */
466                 backlog = 1;
467         sk->sk_max_ack_backlog = backlog;
468         if (sk->sk_state != TCP_LISTEN) {
469                 sk->sk_ack_backlog = 0;
470                 sk->sk_state       = TCP_LISTEN;
471         }
472         sk->sk_socket->flags |= __SO_ACCEPTCON;
473 out:
474         release_sock(sk);
475         return rc;
476 }
477
478 static int llc_ui_wait_for_disc(struct sock *sk, int timeout)
479 {
480         DECLARE_WAITQUEUE(wait, current);
481         int rc;
482
483         add_wait_queue_exclusive(sk->sk_sleep, &wait);
484         for (;;) {
485                 __set_current_state(TASK_INTERRUPTIBLE);
486                 rc = 0;
487                 if (sk->sk_state != TCP_CLOSE) {
488                         release_sock(sk);
489                         timeout = schedule_timeout(timeout);
490                         lock_sock(sk);
491                 } else
492                         break;
493                 rc = -ERESTARTSYS;
494                 if (signal_pending(current))
495                         break;
496                 rc = -EAGAIN;
497                 if (!timeout)
498                         break;
499         }
500         __set_current_state(TASK_RUNNING);
501         remove_wait_queue(sk->sk_sleep, &wait);
502         return rc;
503 }
504
505 static int llc_ui_wait_for_conn(struct sock *sk, int timeout)
506 {
507         DECLARE_WAITQUEUE(wait, current);
508         int rc;
509
510         add_wait_queue_exclusive(sk->sk_sleep, &wait);
511         for (;;) {
512                 __set_current_state(TASK_INTERRUPTIBLE);
513                 rc = -EAGAIN;
514                 if (sk->sk_state == TCP_CLOSE)
515                         break;
516                 rc = 0;
517                 if (sk->sk_state != TCP_ESTABLISHED) {
518                         release_sock(sk);
519                         timeout = schedule_timeout(timeout);
520                         lock_sock(sk);
521                 } else
522                         break;
523                 rc = -ERESTARTSYS;
524                 if (signal_pending(current))
525                         break;
526                 rc = -EAGAIN;
527                 if (!timeout)
528                         break;
529         }
530         __set_current_state(TASK_RUNNING);
531         remove_wait_queue(sk->sk_sleep, &wait);
532         return rc;
533 }
534
535 static int llc_ui_wait_for_data(struct sock *sk, int timeout)
536 {
537         DECLARE_WAITQUEUE(wait, current);
538         int rc = 0;
539
540         add_wait_queue_exclusive(sk->sk_sleep, &wait);
541         for (;;) {
542                 __set_current_state(TASK_INTERRUPTIBLE);
543                 if (sk->sk_shutdown & RCV_SHUTDOWN)
544                         break;
545                 /*
546                  * Well, if we have backlog, try to process it now.
547                  */
548                 if (sk->sk_backlog.tail) {
549                         release_sock(sk);
550                         lock_sock(sk);
551                 }
552                 rc = 0;
553                 if (skb_queue_empty(&sk->sk_receive_queue)) {
554                         release_sock(sk);
555                         timeout = schedule_timeout(timeout);
556                         lock_sock(sk);
557                 } else
558                         break;
559                 rc = -ERESTARTSYS;
560                 if (signal_pending(current))
561                         break;
562                 rc = -EAGAIN;
563                 if (!timeout)
564                         break;
565         }
566         __set_current_state(TASK_RUNNING);
567         remove_wait_queue(sk->sk_sleep, &wait);
568         return rc;
569 }
570
571 static int llc_ui_wait_for_busy_core(struct sock *sk, int timeout)
572 {
573         DECLARE_WAITQUEUE(wait, current);
574         struct llc_opt *llc = llc_sk(sk);
575         int rc;
576
577         add_wait_queue_exclusive(sk->sk_sleep, &wait);
578         for (;;) {
579                 dprintk("%s: looping...\n", __FUNCTION__);
580                 __set_current_state(TASK_INTERRUPTIBLE);
581                 rc = -ENOTCONN;
582                 if (sk->sk_shutdown & RCV_SHUTDOWN)
583                         break;
584                 rc = 0;
585                 if (llc_data_accept_state(llc->state) || llc->p_flag) {
586                         release_sock(sk);
587                         timeout = schedule_timeout(timeout);
588                         lock_sock(sk);
589                 } else
590                         break;
591                 rc = -ERESTARTSYS;
592                 if (signal_pending(current))
593                         break;
594                 rc = -EAGAIN;
595                 if (!timeout)
596                         break;
597         }
598         __set_current_state(TASK_RUNNING);
599         remove_wait_queue(sk->sk_sleep, &wait);
600         return rc;
601 }
602
603 /**
604  *      llc_ui_accept - accept a new incoming connection.
605  *      @sock: Socket which connections arrive on.
606  *      @newsock: Socket to move incoming connection to.
607  *      @flags: User specified operational flags.
608  *
609  *      Accept a new incoming connection.
610  *      Returns 0 upon success, negative otherwise.
611  */
612 static int llc_ui_accept(struct socket *sock, struct socket *newsock, int flags)
613 {
614         struct sock *sk = sock->sk, *newsk;
615         struct llc_opt *llc, *newllc;
616         struct sk_buff *skb;
617         int rc = -EOPNOTSUPP;
618
619         dprintk("%s: accepting on %02X\n", __FUNCTION__,
620                 llc_sk(sk)->laddr.lsap);
621         lock_sock(sk);
622         if (sk->sk_type != SOCK_STREAM)
623                 goto out;
624         rc = -EINVAL;
625         if (sock->state != SS_UNCONNECTED || sk->sk_state != TCP_LISTEN)
626                 goto out;
627         /* wait for a connection to arrive. */
628         rc = llc_ui_wait_for_data(sk, sk->sk_rcvtimeo);
629         if (rc)
630                 goto out;
631         dprintk("%s: got a new connection on %02X\n", __FUNCTION__,
632                 llc_sk(sk)->laddr.lsap);
633         skb = skb_dequeue(&sk->sk_receive_queue);
634         rc = -EINVAL;
635         if (!skb->sk)
636                 goto frees;
637         rc = 0;
638         newsk = skb->sk;
639         /* attach connection to a new socket. */
640         llc_ui_sk_init(newsock, newsk);
641         newsk->sk_pair          = NULL;
642         newsk->sk_zapped        = 0;
643         newsk->sk_state         = TCP_ESTABLISHED;
644         newsock->state          = SS_CONNECTED;
645         llc                     = llc_sk(sk);
646         newllc                  = llc_sk(newsk);
647         memcpy(&newllc->addr, &llc->addr, sizeof(newllc->addr));
648         newllc->link = llc_ui_next_link_no(newllc->laddr.lsap);
649
650         /* put original socket back into a clean listen state. */
651         sk->sk_state = TCP_LISTEN;
652         sk->sk_ack_backlog--;
653         skb->sk = NULL;
654         dprintk("%s: ok success on %02X, client on %02X\n", __FUNCTION__,
655                 llc_sk(sk)->addr.sllc_sap, newllc->daddr.lsap);
656 frees:
657         kfree_skb(skb);
658 out:
659         release_sock(sk);
660         return rc;
661 }
662
663 /**
664  *      llc_ui_recvmsg - copy received data to the socket user.
665  *      @sock: Socket to copy data from.
666  *      @msg: Various user space related information.
667  *      @size: Size of user buffer.
668  *      @flags: User specified flags.
669  *
670  *      Copy received data to the socket user.
671  *      Returns non-negative upon success, negative otherwise.
672  */
673 static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock,
674                           struct msghdr *msg, size_t size, int flags)
675 {
676         struct sock *sk = sock->sk;
677         struct sockaddr_llc *uaddr = (struct sockaddr_llc *)msg->msg_name;
678         struct sk_buff *skb;
679         size_t copied = 0;
680         int rc = -ENOMEM, timeout;
681         int noblock = flags & MSG_DONTWAIT;
682
683         dprintk("%s: receiving in %02X from %02X\n", __FUNCTION__,
684                 llc_sk(sk)->laddr.lsap, llc_sk(sk)->daddr.lsap);
685         lock_sock(sk);
686         timeout = sock_rcvtimeo(sk, noblock);
687         rc = llc_ui_wait_for_data(sk, timeout);
688         if (rc) {
689                 dprintk("%s: llc_ui_wait_for_data failed recv "
690                         "in %02X from %02X\n", __FUNCTION__,
691                         llc_sk(sk)->laddr.lsap, llc_sk(sk)->daddr.lsap);
692                 goto out;
693         }
694         skb = skb_dequeue(&sk->sk_receive_queue);
695         if (!skb) /* shutdown */
696                 goto out;
697         copied = skb->len;
698         if (copied > size)
699                 copied = size;
700         rc = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
701         if (rc)
702                 goto dgram_free;
703         if (skb->len > copied) {
704                 skb_pull(skb, copied);
705                 skb_queue_head(&sk->sk_receive_queue, skb);
706         }
707         if (uaddr)
708                 memcpy(uaddr, llc_ui_skb_cb(skb), sizeof(*uaddr));
709         msg->msg_namelen = sizeof(*uaddr);
710         if (!skb->list) {
711 dgram_free:
712                 kfree_skb(skb);
713         }
714 out:
715         release_sock(sk);
716         return rc ? : copied;
717 }
718
719 /**
720  *      llc_ui_sendmsg - Transmit data provided by the socket user.
721  *      @sock: Socket to transmit data from.
722  *      @msg: Various user related information.
723  *      @len: Length of data to transmit.
724  *
725  *      Transmit data provided by the socket user.
726  *      Returns non-negative upon success, negative otherwise.
727  */
728 static int llc_ui_sendmsg(struct kiocb *iocb, struct socket *sock,
729                           struct msghdr *msg, size_t len)
730 {
731         struct sock *sk = sock->sk;
732         struct llc_opt *llc = llc_sk(sk);
733         struct sockaddr_llc *addr = (struct sockaddr_llc *)msg->msg_name;
734         int flags = msg->msg_flags;
735         int noblock = flags & MSG_DONTWAIT;
736         struct net_device *dev;
737         struct sk_buff *skb;
738         size_t size = 0;
739         int rc = -EINVAL, copied = 0, hdrlen;
740
741         dprintk("%s: sending from %02X to %02X\n", __FUNCTION__,
742                 llc->laddr.lsap, llc->daddr.lsap);
743         lock_sock(sk);
744         if (addr) {
745                 if (msg->msg_namelen < sizeof(*addr))
746                         goto release;
747         } else {
748                 if (llc_ui_addr_null(&llc->addr))
749                         goto release;
750                 addr = &llc->addr;
751         }
752         /* must bind connection to sap if user hasn't done it. */
753         if (sk->sk_zapped) {
754                 /* bind to sap with null dev, exclusive. */
755                 rc = llc_ui_autobind(sock, addr);
756                 if (rc)
757                         goto release;
758         }
759         dev = llc->dev;
760         hdrlen = dev->hard_header_len + llc_ui_header_len(sk, addr);
761         size = hdrlen + len;
762         if (size > dev->mtu)
763                 size = dev->mtu;
764         copied = size - hdrlen;
765         release_sock(sk);
766         skb = sock_alloc_send_skb(sk, size, noblock, &rc);
767         lock_sock(sk);
768         if (!skb)
769                 goto release;
770         skb->sk       = sk;
771         skb->dev      = dev;
772         skb->protocol = llc_proto_type(addr->sllc_arphrd);
773         skb_reserve(skb, hdrlen); 
774         rc = memcpy_fromiovec(skb_put(skb, copied), msg->msg_iov, copied);
775         if (rc)
776                 goto out;
777         if (sk->sk_type == SOCK_DGRAM || addr->sllc_ua) {
778                 llc_build_and_send_ui_pkt(llc->sap, skb, addr->sllc_mac,
779                                           addr->sllc_sap);
780                 goto out;
781         }
782         if (addr->sllc_test) {
783                 llc_build_and_send_test_pkt(llc->sap, skb, addr->sllc_mac,
784                                             addr->sllc_sap);
785                 goto out;
786         }
787         if (addr->sllc_xid) {
788                 llc_build_and_send_xid_pkt(llc->sap, skb, addr->sllc_mac,
789                                            addr->sllc_sap);
790                 goto out;
791         }
792         rc = -ENOPROTOOPT;
793         if (!(sk->sk_type == SOCK_STREAM && !addr->sllc_ua))
794                 goto out;
795         rc = llc_ui_send_data(sk, skb, noblock);
796         if (rc)
797                 dprintk("%s: llc_ui_send_data failed: %d\n", __FUNCTION__, rc);
798 out:
799         if (rc)
800                 kfree_skb(skb);
801 release:
802         if (rc)
803                 dprintk("%s: failed sending from %02X to %02X: %d\n",
804                         __FUNCTION__, llc->laddr.lsap, llc->daddr.lsap, rc);
805         release_sock(sk);
806         return rc ? : copied;
807 }
808
809 /**
810  *      llc_ui_getname - return the address info of a socket
811  *      @sock: Socket to get address of.
812  *      @uaddr: Address structure to return information.
813  *      @uaddrlen: Length of address structure.
814  *      @peer: Does user want local or remote address information.
815  *
816  *      Return the address information of a socket.
817  */
818 static int llc_ui_getname(struct socket *sock, struct sockaddr *uaddr,
819                           int *uaddrlen, int peer)
820 {
821         struct sockaddr_llc sllc;
822         struct sock *sk = sock->sk;
823         struct llc_opt *llc = llc_sk(sk);
824         int rc = 0;
825
826         lock_sock(sk);
827         if (sk->sk_zapped)
828                 goto out;
829         *uaddrlen = sizeof(sllc);
830         memset(uaddr, 0, *uaddrlen);
831         if (peer) {
832                 rc = -ENOTCONN;
833                 if (sk->sk_state != TCP_ESTABLISHED)
834                         goto out;
835                 if(llc->dev)
836                         sllc.sllc_arphrd = llc->dev->type;
837                 sllc.sllc_sap = llc->daddr.lsap;
838                 memcpy(&sllc.sllc_mac, &llc->daddr.mac, IFHWADDRLEN);
839         } else {
840                 rc = -EINVAL;
841                 if (!llc->sap)
842                         goto out;
843                 sllc.sllc_sap = llc->sap->laddr.lsap;
844
845                 if (llc->dev) {
846                         sllc.sllc_arphrd = llc->dev->type;
847                         memcpy(&sllc.sllc_mac, &llc->dev->dev_addr,
848                                IFHWADDRLEN);
849                 }
850         }
851         rc = 0;
852         sllc.sllc_family = AF_LLC;
853         memcpy(uaddr, &sllc, sizeof(sllc));
854 out:
855         release_sock(sk);
856         return rc;
857 }
858
859 /**
860  *      llc_ui_ioctl - io controls for PF_LLC
861  *      @sock: Socket to get/set info
862  *      @cmd: command
863  *      @arg: optional argument for cmd
864  *
865  *      get/set info on llc sockets
866  */
867 static int llc_ui_ioctl(struct socket *sock, unsigned int cmd,
868                         unsigned long arg)
869 {
870         return dev_ioctl(cmd, (void __user *)arg);
871 }
872
873 /**
874  *      llc_ui_setsockopt - set various connection specific parameters.
875  *      @sock: Socket to set options on.
876  *      @level: Socket level user is requesting operations on.
877  *      @optname: Operation name.
878  *      @optval User provided operation data.
879  *      @optlen: Length of optval.
880  *
881  *      Set various connection specific parameters.
882  */
883 static int llc_ui_setsockopt(struct socket *sock, int level, int optname,
884                              char __user *optval, int optlen)
885 {
886         struct sock *sk = sock->sk;
887         struct llc_opt *llc = llc_sk(sk);
888         int rc = -EINVAL, opt;
889
890         lock_sock(sk);
891         if (level != SOL_LLC || optlen != sizeof(int))
892                 goto out;
893         rc = get_user(opt, (int __user *)optval);
894         if (rc)
895                 goto out;
896         rc = -EINVAL;
897         switch (optname) {
898         case LLC_OPT_RETRY:
899                 if (opt > LLC_OPT_MAX_RETRY)
900                         goto out;
901                 llc->n2 = opt;
902                 break;
903         case LLC_OPT_SIZE:
904                 if (opt > LLC_OPT_MAX_SIZE)
905                         goto out;
906                 llc->n1 = opt;
907                 break;
908         case LLC_OPT_ACK_TMR_EXP:
909                 if (opt > LLC_OPT_MAX_ACK_TMR_EXP)
910                         goto out;
911                 llc->ack_timer.expire = opt;
912                 break;
913         case LLC_OPT_P_TMR_EXP:
914                 if (opt > LLC_OPT_MAX_P_TMR_EXP)
915                         goto out;
916                 llc->pf_cycle_timer.expire = opt;
917                 break;
918         case LLC_OPT_REJ_TMR_EXP:
919                 if (opt > LLC_OPT_MAX_REJ_TMR_EXP)
920                         goto out;
921                 llc->rej_sent_timer.expire = opt;
922                 break;
923         case LLC_OPT_BUSY_TMR_EXP:
924                 if (opt > LLC_OPT_MAX_BUSY_TMR_EXP)
925                         goto out;
926                 llc->busy_state_timer.expire = opt;
927                 break;
928         case LLC_OPT_TX_WIN:
929                 if (opt > LLC_OPT_MAX_WIN)
930                         goto out;
931                 llc->k = opt;
932                 break;
933         case LLC_OPT_RX_WIN:
934                 if (opt > LLC_OPT_MAX_WIN)
935                         goto out;
936                 llc->rw = opt;
937                 break;
938         default:
939                 rc = -ENOPROTOOPT;
940                 goto out;
941         }
942         rc = 0;
943 out:
944         release_sock(sk);
945         return rc;
946 }
947
948 /**
949  *      llc_ui_getsockopt - get connection specific socket info
950  *      @sock: Socket to get information from.
951  *      @level: Socket level user is requesting operations on.
952  *      @optname: Operation name.
953  *      @optval: Variable to return operation data in.
954  *      @optlen: Length of optval.
955  *
956  *      Get connection specific socket information.
957  */
958 static int llc_ui_getsockopt(struct socket *sock, int level, int optname,
959                              char __user *optval, int __user *optlen)
960 {
961         struct sock *sk = sock->sk;
962         struct llc_opt *llc = llc_sk(sk);
963         int val = 0, len = 0, rc = -EINVAL;
964
965         lock_sock(sk);
966         if (level != SOL_LLC)
967                 goto out;
968         rc = get_user(len, optlen);
969         if (rc)
970                 goto out;
971         rc = -EINVAL;
972         if (len != sizeof(int))
973                 goto out;
974         switch (optname) {
975         case LLC_OPT_RETRY:
976                 val = llc->n2;                          break;
977         case LLC_OPT_SIZE:
978                 val = llc->n1;                          break;
979         case LLC_OPT_ACK_TMR_EXP:
980                 val = llc->ack_timer.expire;            break;
981         case LLC_OPT_P_TMR_EXP:
982                 val = llc->pf_cycle_timer.expire;       break;
983         case LLC_OPT_REJ_TMR_EXP:
984                 val = llc->rej_sent_timer.expire;       break;
985         case LLC_OPT_BUSY_TMR_EXP:
986                 val = llc->busy_state_timer.expire;     break;
987         case LLC_OPT_TX_WIN:
988                 val = llc->k;                           break;
989         case LLC_OPT_RX_WIN:
990                 val = llc->rw;                          break;
991         default:
992                 rc = -ENOPROTOOPT;
993                 goto out;
994         }
995         rc = 0;
996         if (put_user(len, optlen) || copy_to_user(optval, &val, len))
997                 rc = -EFAULT;
998 out:
999         release_sock(sk);
1000         return rc;
1001 }
1002
1003 static struct net_proto_family llc_ui_family_ops = {
1004         .family = PF_LLC,
1005         .create = llc_ui_create,
1006         .owner  = THIS_MODULE,
1007 };
1008
1009 static struct proto_ops llc_ui_ops = {
1010         .family      = PF_LLC,
1011         .owner       = THIS_MODULE,
1012         .release     = llc_ui_release,
1013         .bind        = llc_ui_bind,
1014         .connect     = llc_ui_connect,
1015         .socketpair  = sock_no_socketpair,
1016         .accept      = llc_ui_accept,
1017         .getname     = llc_ui_getname,
1018         .poll        = datagram_poll,
1019         .ioctl       = llc_ui_ioctl,
1020         .listen      = llc_ui_listen,
1021         .shutdown    = llc_ui_shutdown,
1022         .setsockopt  = llc_ui_setsockopt,
1023         .getsockopt  = llc_ui_getsockopt,
1024         .sendmsg     = llc_ui_sendmsg,
1025         .recvmsg     = llc_ui_recvmsg,
1026         .mmap        = sock_no_mmap,
1027         .sendpage    = sock_no_sendpage,
1028 };
1029
1030 extern void llc_sap_handler(struct llc_sap *sap, struct sk_buff *skb);
1031 extern void llc_conn_handler(struct llc_sap *sap, struct sk_buff *skb);
1032
1033 static int __init llc2_init(void)
1034 {
1035         int rc;
1036
1037         llc_build_offset_table();
1038         llc_station_init();
1039         llc_ui_sap_last_autoport = LLC_SAP_DYN_START;
1040         rc = llc_proc_init();
1041         if (!rc) {
1042                 sock_register(&llc_ui_family_ops);
1043                 llc_add_pack(LLC_DEST_SAP, llc_sap_handler);
1044                 llc_add_pack(LLC_DEST_CONN, llc_conn_handler);
1045         }
1046         return rc;
1047 }
1048
1049 static void __exit llc2_exit(void)
1050 {
1051         llc_station_exit();
1052         llc_remove_pack(LLC_DEST_SAP);
1053         llc_remove_pack(LLC_DEST_CONN);
1054         sock_unregister(PF_LLC);
1055         llc_proc_exit();
1056 }
1057
1058 module_init(llc2_init);
1059 module_exit(llc2_exit);
1060
1061 MODULE_LICENSE("GPL");
1062 MODULE_AUTHOR("Procom 1997, Jay Schullist 2001, Arnaldo C. Melo 2001-2003");
1063 MODULE_DESCRIPTION("IEEE 802.2 PF_LLC support");
1064 MODULE_ALIAS_NETPROTO(PF_LLC);