vserver 1.9.3
[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_zapped        = 0;
642         newsk->sk_state         = TCP_ESTABLISHED;
643         newsock->state          = SS_CONNECTED;
644         llc                     = llc_sk(sk);
645         newllc                  = llc_sk(newsk);
646         memcpy(&newllc->addr, &llc->addr, sizeof(newllc->addr));
647         newllc->link = llc_ui_next_link_no(newllc->laddr.lsap);
648
649         /* put original socket back into a clean listen state. */
650         sk->sk_state = TCP_LISTEN;
651         sk->sk_ack_backlog--;
652         skb->sk = NULL;
653         dprintk("%s: ok success on %02X, client on %02X\n", __FUNCTION__,
654                 llc_sk(sk)->addr.sllc_sap, newllc->daddr.lsap);
655 frees:
656         kfree_skb(skb);
657 out:
658         release_sock(sk);
659         return rc;
660 }
661
662 /**
663  *      llc_ui_recvmsg - copy received data to the socket user.
664  *      @sock: Socket to copy data from.
665  *      @msg: Various user space related information.
666  *      @size: Size of user buffer.
667  *      @flags: User specified flags.
668  *
669  *      Copy received data to the socket user.
670  *      Returns non-negative upon success, negative otherwise.
671  */
672 static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock,
673                           struct msghdr *msg, size_t size, int flags)
674 {
675         struct sock *sk = sock->sk;
676         struct sockaddr_llc *uaddr = (struct sockaddr_llc *)msg->msg_name;
677         struct sk_buff *skb;
678         size_t copied = 0;
679         int rc = -ENOMEM, timeout;
680         int noblock = flags & MSG_DONTWAIT;
681
682         dprintk("%s: receiving in %02X from %02X\n", __FUNCTION__,
683                 llc_sk(sk)->laddr.lsap, llc_sk(sk)->daddr.lsap);
684         lock_sock(sk);
685         timeout = sock_rcvtimeo(sk, noblock);
686         rc = llc_ui_wait_for_data(sk, timeout);
687         if (rc) {
688                 dprintk("%s: llc_ui_wait_for_data failed recv "
689                         "in %02X from %02X\n", __FUNCTION__,
690                         llc_sk(sk)->laddr.lsap, llc_sk(sk)->daddr.lsap);
691                 goto out;
692         }
693         skb = skb_dequeue(&sk->sk_receive_queue);
694         if (!skb) /* shutdown */
695                 goto out;
696         copied = skb->len;
697         if (copied > size)
698                 copied = size;
699         rc = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
700         if (rc)
701                 goto dgram_free;
702         if (skb->len > copied) {
703                 skb_pull(skb, copied);
704                 skb_queue_head(&sk->sk_receive_queue, skb);
705         }
706         if (uaddr)
707                 memcpy(uaddr, llc_ui_skb_cb(skb), sizeof(*uaddr));
708         msg->msg_namelen = sizeof(*uaddr);
709         if (!skb->list) {
710 dgram_free:
711                 kfree_skb(skb);
712         }
713 out:
714         release_sock(sk);
715         return rc ? : copied;
716 }
717
718 /**
719  *      llc_ui_sendmsg - Transmit data provided by the socket user.
720  *      @sock: Socket to transmit data from.
721  *      @msg: Various user related information.
722  *      @len: Length of data to transmit.
723  *
724  *      Transmit data provided by the socket user.
725  *      Returns non-negative upon success, negative otherwise.
726  */
727 static int llc_ui_sendmsg(struct kiocb *iocb, struct socket *sock,
728                           struct msghdr *msg, size_t len)
729 {
730         struct sock *sk = sock->sk;
731         struct llc_opt *llc = llc_sk(sk);
732         struct sockaddr_llc *addr = (struct sockaddr_llc *)msg->msg_name;
733         int flags = msg->msg_flags;
734         int noblock = flags & MSG_DONTWAIT;
735         struct net_device *dev;
736         struct sk_buff *skb;
737         size_t size = 0;
738         int rc = -EINVAL, copied = 0, hdrlen;
739
740         dprintk("%s: sending from %02X to %02X\n", __FUNCTION__,
741                 llc->laddr.lsap, llc->daddr.lsap);
742         lock_sock(sk);
743         if (addr) {
744                 if (msg->msg_namelen < sizeof(*addr))
745                         goto release;
746         } else {
747                 if (llc_ui_addr_null(&llc->addr))
748                         goto release;
749                 addr = &llc->addr;
750         }
751         /* must bind connection to sap if user hasn't done it. */
752         if (sk->sk_zapped) {
753                 /* bind to sap with null dev, exclusive. */
754                 rc = llc_ui_autobind(sock, addr);
755                 if (rc)
756                         goto release;
757         }
758         dev = llc->dev;
759         hdrlen = dev->hard_header_len + llc_ui_header_len(sk, addr);
760         size = hdrlen + len;
761         if (size > dev->mtu)
762                 size = dev->mtu;
763         copied = size - hdrlen;
764         release_sock(sk);
765         skb = sock_alloc_send_skb(sk, size, noblock, &rc);
766         lock_sock(sk);
767         if (!skb)
768                 goto release;
769         skb->sk       = sk;
770         skb->dev      = dev;
771         skb->protocol = llc_proto_type(addr->sllc_arphrd);
772         skb_reserve(skb, hdrlen); 
773         rc = memcpy_fromiovec(skb_put(skb, copied), msg->msg_iov, copied);
774         if (rc)
775                 goto out;
776         if (sk->sk_type == SOCK_DGRAM || addr->sllc_ua) {
777                 llc_build_and_send_ui_pkt(llc->sap, skb, addr->sllc_mac,
778                                           addr->sllc_sap);
779                 goto out;
780         }
781         if (addr->sllc_test) {
782                 llc_build_and_send_test_pkt(llc->sap, skb, addr->sllc_mac,
783                                             addr->sllc_sap);
784                 goto out;
785         }
786         if (addr->sllc_xid) {
787                 llc_build_and_send_xid_pkt(llc->sap, skb, addr->sllc_mac,
788                                            addr->sllc_sap);
789                 goto out;
790         }
791         rc = -ENOPROTOOPT;
792         if (!(sk->sk_type == SOCK_STREAM && !addr->sllc_ua))
793                 goto out;
794         rc = llc_ui_send_data(sk, skb, noblock);
795         if (rc)
796                 dprintk("%s: llc_ui_send_data failed: %d\n", __FUNCTION__, rc);
797 out:
798         if (rc)
799                 kfree_skb(skb);
800 release:
801         if (rc)
802                 dprintk("%s: failed sending from %02X to %02X: %d\n",
803                         __FUNCTION__, llc->laddr.lsap, llc->daddr.lsap, rc);
804         release_sock(sk);
805         return rc ? : copied;
806 }
807
808 /**
809  *      llc_ui_getname - return the address info of a socket
810  *      @sock: Socket to get address of.
811  *      @uaddr: Address structure to return information.
812  *      @uaddrlen: Length of address structure.
813  *      @peer: Does user want local or remote address information.
814  *
815  *      Return the address information of a socket.
816  */
817 static int llc_ui_getname(struct socket *sock, struct sockaddr *uaddr,
818                           int *uaddrlen, int peer)
819 {
820         struct sockaddr_llc sllc;
821         struct sock *sk = sock->sk;
822         struct llc_opt *llc = llc_sk(sk);
823         int rc = 0;
824
825         lock_sock(sk);
826         if (sk->sk_zapped)
827                 goto out;
828         *uaddrlen = sizeof(sllc);
829         memset(uaddr, 0, *uaddrlen);
830         if (peer) {
831                 rc = -ENOTCONN;
832                 if (sk->sk_state != TCP_ESTABLISHED)
833                         goto out;
834                 if(llc->dev)
835                         sllc.sllc_arphrd = llc->dev->type;
836                 sllc.sllc_sap = llc->daddr.lsap;
837                 memcpy(&sllc.sllc_mac, &llc->daddr.mac, IFHWADDRLEN);
838         } else {
839                 rc = -EINVAL;
840                 if (!llc->sap)
841                         goto out;
842                 sllc.sllc_sap = llc->sap->laddr.lsap;
843
844                 if (llc->dev) {
845                         sllc.sllc_arphrd = llc->dev->type;
846                         memcpy(&sllc.sllc_mac, &llc->dev->dev_addr,
847                                IFHWADDRLEN);
848                 }
849         }
850         rc = 0;
851         sllc.sllc_family = AF_LLC;
852         memcpy(uaddr, &sllc, sizeof(sllc));
853 out:
854         release_sock(sk);
855         return rc;
856 }
857
858 /**
859  *      llc_ui_ioctl - io controls for PF_LLC
860  *      @sock: Socket to get/set info
861  *      @cmd: command
862  *      @arg: optional argument for cmd
863  *
864  *      get/set info on llc sockets
865  */
866 static int llc_ui_ioctl(struct socket *sock, unsigned int cmd,
867                         unsigned long arg)
868 {
869         return dev_ioctl(cmd, (void __user *)arg);
870 }
871
872 /**
873  *      llc_ui_setsockopt - set various connection specific parameters.
874  *      @sock: Socket to set options on.
875  *      @level: Socket level user is requesting operations on.
876  *      @optname: Operation name.
877  *      @optval User provided operation data.
878  *      @optlen: Length of optval.
879  *
880  *      Set various connection specific parameters.
881  */
882 static int llc_ui_setsockopt(struct socket *sock, int level, int optname,
883                              char __user *optval, int optlen)
884 {
885         struct sock *sk = sock->sk;
886         struct llc_opt *llc = llc_sk(sk);
887         int rc = -EINVAL, opt;
888
889         lock_sock(sk);
890         if (level != SOL_LLC || optlen != sizeof(int))
891                 goto out;
892         rc = get_user(opt, (int __user *)optval);
893         if (rc)
894                 goto out;
895         rc = -EINVAL;
896         switch (optname) {
897         case LLC_OPT_RETRY:
898                 if (opt > LLC_OPT_MAX_RETRY)
899                         goto out;
900                 llc->n2 = opt;
901                 break;
902         case LLC_OPT_SIZE:
903                 if (opt > LLC_OPT_MAX_SIZE)
904                         goto out;
905                 llc->n1 = opt;
906                 break;
907         case LLC_OPT_ACK_TMR_EXP:
908                 if (opt > LLC_OPT_MAX_ACK_TMR_EXP)
909                         goto out;
910                 llc->ack_timer.expire = opt;
911                 break;
912         case LLC_OPT_P_TMR_EXP:
913                 if (opt > LLC_OPT_MAX_P_TMR_EXP)
914                         goto out;
915                 llc->pf_cycle_timer.expire = opt;
916                 break;
917         case LLC_OPT_REJ_TMR_EXP:
918                 if (opt > LLC_OPT_MAX_REJ_TMR_EXP)
919                         goto out;
920                 llc->rej_sent_timer.expire = opt;
921                 break;
922         case LLC_OPT_BUSY_TMR_EXP:
923                 if (opt > LLC_OPT_MAX_BUSY_TMR_EXP)
924                         goto out;
925                 llc->busy_state_timer.expire = opt;
926                 break;
927         case LLC_OPT_TX_WIN:
928                 if (opt > LLC_OPT_MAX_WIN)
929                         goto out;
930                 llc->k = opt;
931                 break;
932         case LLC_OPT_RX_WIN:
933                 if (opt > LLC_OPT_MAX_WIN)
934                         goto out;
935                 llc->rw = opt;
936                 break;
937         default:
938                 rc = -ENOPROTOOPT;
939                 goto out;
940         }
941         rc = 0;
942 out:
943         release_sock(sk);
944         return rc;
945 }
946
947 /**
948  *      llc_ui_getsockopt - get connection specific socket info
949  *      @sock: Socket to get information from.
950  *      @level: Socket level user is requesting operations on.
951  *      @optname: Operation name.
952  *      @optval: Variable to return operation data in.
953  *      @optlen: Length of optval.
954  *
955  *      Get connection specific socket information.
956  */
957 static int llc_ui_getsockopt(struct socket *sock, int level, int optname,
958                              char __user *optval, int __user *optlen)
959 {
960         struct sock *sk = sock->sk;
961         struct llc_opt *llc = llc_sk(sk);
962         int val = 0, len = 0, rc = -EINVAL;
963
964         lock_sock(sk);
965         if (level != SOL_LLC)
966                 goto out;
967         rc = get_user(len, optlen);
968         if (rc)
969                 goto out;
970         rc = -EINVAL;
971         if (len != sizeof(int))
972                 goto out;
973         switch (optname) {
974         case LLC_OPT_RETRY:
975                 val = llc->n2;                          break;
976         case LLC_OPT_SIZE:
977                 val = llc->n1;                          break;
978         case LLC_OPT_ACK_TMR_EXP:
979                 val = llc->ack_timer.expire;            break;
980         case LLC_OPT_P_TMR_EXP:
981                 val = llc->pf_cycle_timer.expire;       break;
982         case LLC_OPT_REJ_TMR_EXP:
983                 val = llc->rej_sent_timer.expire;       break;
984         case LLC_OPT_BUSY_TMR_EXP:
985                 val = llc->busy_state_timer.expire;     break;
986         case LLC_OPT_TX_WIN:
987                 val = llc->k;                           break;
988         case LLC_OPT_RX_WIN:
989                 val = llc->rw;                          break;
990         default:
991                 rc = -ENOPROTOOPT;
992                 goto out;
993         }
994         rc = 0;
995         if (put_user(len, optlen) || copy_to_user(optval, &val, len))
996                 rc = -EFAULT;
997 out:
998         release_sock(sk);
999         return rc;
1000 }
1001
1002 static struct net_proto_family llc_ui_family_ops = {
1003         .family = PF_LLC,
1004         .create = llc_ui_create,
1005         .owner  = THIS_MODULE,
1006 };
1007
1008 static struct proto_ops llc_ui_ops = {
1009         .family      = PF_LLC,
1010         .owner       = THIS_MODULE,
1011         .release     = llc_ui_release,
1012         .bind        = llc_ui_bind,
1013         .connect     = llc_ui_connect,
1014         .socketpair  = sock_no_socketpair,
1015         .accept      = llc_ui_accept,
1016         .getname     = llc_ui_getname,
1017         .poll        = datagram_poll,
1018         .ioctl       = llc_ui_ioctl,
1019         .listen      = llc_ui_listen,
1020         .shutdown    = llc_ui_shutdown,
1021         .setsockopt  = llc_ui_setsockopt,
1022         .getsockopt  = llc_ui_getsockopt,
1023         .sendmsg     = llc_ui_sendmsg,
1024         .recvmsg     = llc_ui_recvmsg,
1025         .mmap        = sock_no_mmap,
1026         .sendpage    = sock_no_sendpage,
1027 };
1028
1029 extern void llc_sap_handler(struct llc_sap *sap, struct sk_buff *skb);
1030 extern void llc_conn_handler(struct llc_sap *sap, struct sk_buff *skb);
1031
1032 static int __init llc2_init(void)
1033 {
1034         int rc;
1035
1036         llc_build_offset_table();
1037         llc_station_init();
1038         llc_ui_sap_last_autoport = LLC_SAP_DYN_START;
1039         rc = llc_proc_init();
1040         if (!rc) {
1041                 sock_register(&llc_ui_family_ops);
1042                 llc_add_pack(LLC_DEST_SAP, llc_sap_handler);
1043                 llc_add_pack(LLC_DEST_CONN, llc_conn_handler);
1044         }
1045         return rc;
1046 }
1047
1048 static void __exit llc2_exit(void)
1049 {
1050         llc_station_exit();
1051         llc_remove_pack(LLC_DEST_SAP);
1052         llc_remove_pack(LLC_DEST_CONN);
1053         sock_unregister(PF_LLC);
1054         llc_proc_exit();
1055 }
1056
1057 module_init(llc2_init);
1058 module_exit(llc2_exit);
1059
1060 MODULE_LICENSE("GPL");
1061 MODULE_AUTHOR("Procom 1997, Jay Schullist 2001, Arnaldo C. Melo 2001-2003");
1062 MODULE_DESCRIPTION("IEEE 802.2 PF_LLC support");
1063 MODULE_ALIAS_NETPROTO(PF_LLC);