usb: dwc3: pci: Enable extcon driver for Intel Merrifield
[linux/fpc-iii.git] / net / llc / af_llc.c
blobce841d59bc72a9bc90fb4143029b27178f4063c5
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.
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.
13 * Copyright (c) 2001 by Jay Schulist <jschlst@samba.org>
14 * 2002-2003 by Arnaldo Carvalho de Melo <acme@conectiva.com.br>
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.
21 * See the GNU General Public License for more details.
23 #include <linux/compiler.h>
24 #include <linux/kernel.h>
25 #include <linux/module.h>
26 #include <linux/rtnetlink.h>
27 #include <linux/init.h>
28 #include <linux/slab.h>
29 #include <linux/sched/signal.h>
31 #include <net/llc.h>
32 #include <net/llc_sap.h>
33 #include <net/llc_pdu.h>
34 #include <net/llc_conn.h>
35 #include <net/tcp_states.h>
37 /* remember: uninitialized global data is zeroed because its in .bss */
38 static u16 llc_ui_sap_last_autoport = LLC_SAP_DYN_START;
39 static u16 llc_ui_sap_link_no_max[256];
40 static struct sockaddr_llc llc_ui_addrnull;
41 static const struct proto_ops llc_ui_ops;
43 static bool llc_ui_wait_for_conn(struct sock *sk, long timeout);
44 static int llc_ui_wait_for_disc(struct sock *sk, long timeout);
45 static int llc_ui_wait_for_busy_core(struct sock *sk, long timeout);
47 #if 0
48 #define dprintk(args...) printk(KERN_DEBUG args)
49 #else
50 #define dprintk(args...)
51 #endif
53 /* Maybe we'll add some more in the future. */
54 #define LLC_CMSG_PKTINFO 1
57 /**
58 * llc_ui_next_link_no - return the next unused link number for a sap
59 * @sap: Address of sap to get link number from.
61 * Return the next unused link number for a given sap.
63 static inline u16 llc_ui_next_link_no(int sap)
65 return llc_ui_sap_link_no_max[sap]++;
68 /**
69 * llc_proto_type - return eth protocol for ARP header type
70 * @arphrd: ARP header type.
72 * Given an ARP header type return the corresponding ethernet protocol.
74 static inline __be16 llc_proto_type(u16 arphrd)
76 return htons(ETH_P_802_2);
79 /**
80 * llc_ui_addr_null - determines if a address structure is null
81 * @addr: Address to test if null.
83 static inline u8 llc_ui_addr_null(struct sockaddr_llc *addr)
85 return !memcmp(addr, &llc_ui_addrnull, sizeof(*addr));
88 /**
89 * llc_ui_header_len - return length of llc header based on operation
90 * @sk: Socket which contains a valid llc socket type.
91 * @addr: Complete sockaddr_llc structure received from the user.
93 * Provide the length of the llc header depending on what kind of
94 * operation the user would like to perform and the type of socket.
95 * Returns the correct llc header length.
97 static inline u8 llc_ui_header_len(struct sock *sk, struct sockaddr_llc *addr)
99 u8 rc = LLC_PDU_LEN_U;
101 if (addr->sllc_test || addr->sllc_xid)
102 rc = LLC_PDU_LEN_U;
103 else if (sk->sk_type == SOCK_STREAM)
104 rc = LLC_PDU_LEN_I;
105 return rc;
109 * llc_ui_send_data - send data via reliable llc2 connection
110 * @sk: Connection the socket is using.
111 * @skb: Data the user wishes to send.
112 * @noblock: can we block waiting for data?
114 * Send data via reliable llc2 connection.
115 * Returns 0 upon success, non-zero if action did not succeed.
117 * This function always consumes a reference to the skb.
119 static int llc_ui_send_data(struct sock* sk, struct sk_buff *skb, int noblock)
121 struct llc_sock* llc = llc_sk(sk);
123 if (unlikely(llc_data_accept_state(llc->state) ||
124 llc->remote_busy_flag ||
125 llc->p_flag)) {
126 long timeout = sock_sndtimeo(sk, noblock);
127 int rc;
129 rc = llc_ui_wait_for_busy_core(sk, timeout);
130 if (rc) {
131 kfree_skb(skb);
132 return rc;
135 return llc_build_and_send_pkt(sk, skb);
138 static void llc_ui_sk_init(struct socket *sock, struct sock *sk)
140 sock_graft(sk, sock);
141 sk->sk_type = sock->type;
142 sock->ops = &llc_ui_ops;
145 static struct proto llc_proto = {
146 .name = "LLC",
147 .owner = THIS_MODULE,
148 .obj_size = sizeof(struct llc_sock),
149 .slab_flags = SLAB_TYPESAFE_BY_RCU,
153 * llc_ui_create - alloc and init a new llc_ui socket
154 * @net: network namespace (must be default network)
155 * @sock: Socket to initialize and attach allocated sk to.
156 * @protocol: Unused.
157 * @kern: on behalf of kernel or userspace
159 * Allocate and initialize a new llc_ui socket, validate the user wants a
160 * socket type we have available.
161 * Returns 0 upon success, negative upon failure.
163 static int llc_ui_create(struct net *net, struct socket *sock, int protocol,
164 int kern)
166 struct sock *sk;
167 int rc = -ESOCKTNOSUPPORT;
169 if (!ns_capable(net->user_ns, CAP_NET_RAW))
170 return -EPERM;
172 if (!net_eq(net, &init_net))
173 return -EAFNOSUPPORT;
175 if (likely(sock->type == SOCK_DGRAM || sock->type == SOCK_STREAM)) {
176 rc = -ENOMEM;
177 sk = llc_sk_alloc(net, PF_LLC, GFP_KERNEL, &llc_proto, kern);
178 if (sk) {
179 rc = 0;
180 llc_ui_sk_init(sock, sk);
183 return rc;
187 * llc_ui_release - shutdown socket
188 * @sock: Socket to release.
190 * Shutdown and deallocate an existing socket.
192 static int llc_ui_release(struct socket *sock)
194 struct sock *sk = sock->sk;
195 struct llc_sock *llc;
197 if (unlikely(sk == NULL))
198 goto out;
199 sock_hold(sk);
200 lock_sock(sk);
201 llc = llc_sk(sk);
202 dprintk("%s: closing local(%02X) remote(%02X)\n", __func__,
203 llc->laddr.lsap, llc->daddr.lsap);
204 if (!llc_send_disc(sk))
205 llc_ui_wait_for_disc(sk, sk->sk_rcvtimeo);
206 if (!sock_flag(sk, SOCK_ZAPPED)) {
207 struct llc_sap *sap = llc->sap;
209 /* Hold this for release_sock(), so that llc_backlog_rcv()
210 * could still use it.
212 llc_sap_hold(sap);
213 llc_sap_remove_socket(llc->sap, sk);
214 release_sock(sk);
215 llc_sap_put(sap);
216 } else {
217 release_sock(sk);
219 if (llc->dev)
220 dev_put(llc->dev);
221 sock_put(sk);
222 llc_sk_free(sk);
223 out:
224 return 0;
228 * llc_ui_autoport - provide dynamically allocate SAP number
230 * Provide the caller with a dynamically allocated SAP number according
231 * to the rules that are set in this function. Returns: 0, upon failure,
232 * SAP number otherwise.
234 static int llc_ui_autoport(void)
236 struct llc_sap *sap;
237 int i, tries = 0;
239 while (tries < LLC_SAP_DYN_TRIES) {
240 for (i = llc_ui_sap_last_autoport;
241 i < LLC_SAP_DYN_STOP; i += 2) {
242 sap = llc_sap_find(i);
243 if (!sap) {
244 llc_ui_sap_last_autoport = i + 2;
245 goto out;
247 llc_sap_put(sap);
249 llc_ui_sap_last_autoport = LLC_SAP_DYN_START;
250 tries++;
252 i = 0;
253 out:
254 return i;
258 * llc_ui_autobind - automatically bind a socket to a sap
259 * @sock: socket to bind
260 * @addr: address to connect to
262 * Used by llc_ui_connect and llc_ui_sendmsg when the user hasn't
263 * specifically used llc_ui_bind to bind to an specific address/sap
265 * Returns: 0 upon success, negative otherwise.
267 static int llc_ui_autobind(struct socket *sock, struct sockaddr_llc *addr)
269 struct sock *sk = sock->sk;
270 struct llc_sock *llc = llc_sk(sk);
271 struct llc_sap *sap;
272 int rc = -EINVAL;
274 if (!sock_flag(sk, SOCK_ZAPPED))
275 goto out;
276 rc = -ENODEV;
277 if (sk->sk_bound_dev_if) {
278 llc->dev = dev_get_by_index(&init_net, sk->sk_bound_dev_if);
279 if (llc->dev && addr->sllc_arphrd != llc->dev->type) {
280 dev_put(llc->dev);
281 llc->dev = NULL;
283 } else
284 llc->dev = dev_getfirstbyhwtype(&init_net, addr->sllc_arphrd);
285 if (!llc->dev)
286 goto out;
287 rc = -EUSERS;
288 llc->laddr.lsap = llc_ui_autoport();
289 if (!llc->laddr.lsap)
290 goto out;
291 rc = -EBUSY; /* some other network layer is using the sap */
292 sap = llc_sap_open(llc->laddr.lsap, NULL);
293 if (!sap)
294 goto out;
295 memcpy(llc->laddr.mac, llc->dev->dev_addr, IFHWADDRLEN);
296 memcpy(&llc->addr, addr, sizeof(llc->addr));
297 /* assign new connection to its SAP */
298 llc_sap_add_socket(sap, sk);
299 sock_reset_flag(sk, SOCK_ZAPPED);
300 rc = 0;
301 out:
302 return rc;
306 * llc_ui_bind - bind a socket to a specific address.
307 * @sock: Socket to bind an address to.
308 * @uaddr: Address the user wants the socket bound to.
309 * @addrlen: Length of the uaddr structure.
311 * Bind a socket to a specific address. For llc a user is able to bind to
312 * a specific sap only or mac + sap.
313 * If the user desires to bind to a specific mac + sap, it is possible to
314 * have multiple sap connections via multiple macs.
315 * Bind and autobind for that matter must enforce the correct sap usage
316 * otherwise all hell will break loose.
317 * Returns: 0 upon success, negative otherwise.
319 static int llc_ui_bind(struct socket *sock, struct sockaddr *uaddr, int addrlen)
321 struct sockaddr_llc *addr = (struct sockaddr_llc *)uaddr;
322 struct sock *sk = sock->sk;
323 struct llc_sock *llc = llc_sk(sk);
324 struct llc_sap *sap;
325 int rc = -EINVAL;
327 dprintk("%s: binding %02X\n", __func__, addr->sllc_sap);
329 lock_sock(sk);
330 if (unlikely(!sock_flag(sk, SOCK_ZAPPED) || addrlen != sizeof(*addr)))
331 goto out;
332 rc = -EAFNOSUPPORT;
333 if (unlikely(addr->sllc_family != AF_LLC))
334 goto out;
335 rc = -ENODEV;
336 rcu_read_lock();
337 if (sk->sk_bound_dev_if) {
338 llc->dev = dev_get_by_index_rcu(&init_net, sk->sk_bound_dev_if);
339 if (llc->dev) {
340 if (!addr->sllc_arphrd)
341 addr->sllc_arphrd = llc->dev->type;
342 if (is_zero_ether_addr(addr->sllc_mac))
343 memcpy(addr->sllc_mac, llc->dev->dev_addr,
344 IFHWADDRLEN);
345 if (addr->sllc_arphrd != llc->dev->type ||
346 !ether_addr_equal(addr->sllc_mac,
347 llc->dev->dev_addr)) {
348 rc = -EINVAL;
349 llc->dev = NULL;
352 } else
353 llc->dev = dev_getbyhwaddr_rcu(&init_net, addr->sllc_arphrd,
354 addr->sllc_mac);
355 if (llc->dev)
356 dev_hold(llc->dev);
357 rcu_read_unlock();
358 if (!llc->dev)
359 goto out;
360 if (!addr->sllc_sap) {
361 rc = -EUSERS;
362 addr->sllc_sap = llc_ui_autoport();
363 if (!addr->sllc_sap)
364 goto out;
366 sap = llc_sap_find(addr->sllc_sap);
367 if (!sap) {
368 sap = llc_sap_open(addr->sllc_sap, NULL);
369 rc = -EBUSY; /* some other network layer is using the sap */
370 if (!sap)
371 goto out;
372 } else {
373 struct llc_addr laddr, daddr;
374 struct sock *ask;
376 memset(&laddr, 0, sizeof(laddr));
377 memset(&daddr, 0, sizeof(daddr));
379 * FIXME: check if the address is multicast,
380 * only SOCK_DGRAM can do this.
382 memcpy(laddr.mac, addr->sllc_mac, IFHWADDRLEN);
383 laddr.lsap = addr->sllc_sap;
384 rc = -EADDRINUSE; /* mac + sap clash. */
385 ask = llc_lookup_established(sap, &daddr, &laddr);
386 if (ask) {
387 sock_put(ask);
388 goto out_put;
391 llc->laddr.lsap = addr->sllc_sap;
392 memcpy(llc->laddr.mac, addr->sllc_mac, IFHWADDRLEN);
393 memcpy(&llc->addr, addr, sizeof(llc->addr));
394 /* assign new connection to its SAP */
395 llc_sap_add_socket(sap, sk);
396 sock_reset_flag(sk, SOCK_ZAPPED);
397 rc = 0;
398 out_put:
399 llc_sap_put(sap);
400 out:
401 release_sock(sk);
402 return rc;
406 * llc_ui_shutdown - shutdown a connect llc2 socket.
407 * @sock: Socket to shutdown.
408 * @how: What part of the socket to shutdown.
410 * Shutdown a connected llc2 socket. Currently this function only supports
411 * shutting down both sends and receives (2), we could probably make this
412 * function such that a user can shutdown only half the connection but not
413 * right now.
414 * Returns: 0 upon success, negative otherwise.
416 static int llc_ui_shutdown(struct socket *sock, int how)
418 struct sock *sk = sock->sk;
419 int rc = -ENOTCONN;
421 lock_sock(sk);
422 if (unlikely(sk->sk_state != TCP_ESTABLISHED))
423 goto out;
424 rc = -EINVAL;
425 if (how != 2)
426 goto out;
427 rc = llc_send_disc(sk);
428 if (!rc)
429 rc = llc_ui_wait_for_disc(sk, sk->sk_rcvtimeo);
430 /* Wake up anyone sleeping in poll */
431 sk->sk_state_change(sk);
432 out:
433 release_sock(sk);
434 return rc;
438 * llc_ui_connect - Connect to a remote llc2 mac + sap.
439 * @sock: Socket which will be connected to the remote destination.
440 * @uaddr: Remote and possibly the local address of the new connection.
441 * @addrlen: Size of uaddr structure.
442 * @flags: Operational flags specified by the user.
444 * Connect to a remote llc2 mac + sap. The caller must specify the
445 * destination mac and address to connect to. If the user hasn't previously
446 * called bind(2) with a smac the address of the first interface of the
447 * specified arp type will be used.
448 * This function will autobind if user did not previously call bind.
449 * Returns: 0 upon success, negative otherwise.
451 static int llc_ui_connect(struct socket *sock, struct sockaddr *uaddr,
452 int addrlen, int flags)
454 struct sock *sk = sock->sk;
455 struct llc_sock *llc = llc_sk(sk);
456 struct sockaddr_llc *addr = (struct sockaddr_llc *)uaddr;
457 int rc = -EINVAL;
459 lock_sock(sk);
460 if (unlikely(addrlen != sizeof(*addr)))
461 goto out;
462 rc = -EAFNOSUPPORT;
463 if (unlikely(addr->sllc_family != AF_LLC))
464 goto out;
465 if (unlikely(sk->sk_type != SOCK_STREAM))
466 goto out;
467 rc = -EALREADY;
468 if (unlikely(sock->state == SS_CONNECTING))
469 goto out;
470 /* bind connection to sap if user hasn't done it. */
471 if (sock_flag(sk, SOCK_ZAPPED)) {
472 /* bind to sap with null dev, exclusive */
473 rc = llc_ui_autobind(sock, addr);
474 if (rc)
475 goto out;
477 llc->daddr.lsap = addr->sllc_sap;
478 memcpy(llc->daddr.mac, addr->sllc_mac, IFHWADDRLEN);
479 sock->state = SS_CONNECTING;
480 sk->sk_state = TCP_SYN_SENT;
481 llc->link = llc_ui_next_link_no(llc->sap->laddr.lsap);
482 rc = llc_establish_connection(sk, llc->dev->dev_addr,
483 addr->sllc_mac, addr->sllc_sap);
484 if (rc) {
485 dprintk("%s: llc_ui_send_conn failed :-(\n", __func__);
486 sock->state = SS_UNCONNECTED;
487 sk->sk_state = TCP_CLOSE;
488 goto out;
491 if (sk->sk_state == TCP_SYN_SENT) {
492 const long timeo = sock_sndtimeo(sk, flags & O_NONBLOCK);
494 if (!timeo || !llc_ui_wait_for_conn(sk, timeo))
495 goto out;
497 rc = sock_intr_errno(timeo);
498 if (signal_pending(current))
499 goto out;
502 if (sk->sk_state == TCP_CLOSE)
503 goto sock_error;
505 sock->state = SS_CONNECTED;
506 rc = 0;
507 out:
508 release_sock(sk);
509 return rc;
510 sock_error:
511 rc = sock_error(sk) ? : -ECONNABORTED;
512 sock->state = SS_UNCONNECTED;
513 goto out;
517 * llc_ui_listen - allow a normal socket to accept incoming connections
518 * @sock: Socket to allow incoming connections on.
519 * @backlog: Number of connections to queue.
521 * Allow a normal socket to accept incoming connections.
522 * Returns 0 upon success, negative otherwise.
524 static int llc_ui_listen(struct socket *sock, int backlog)
526 struct sock *sk = sock->sk;
527 int rc = -EINVAL;
529 lock_sock(sk);
530 if (unlikely(sock->state != SS_UNCONNECTED))
531 goto out;
532 rc = -EOPNOTSUPP;
533 if (unlikely(sk->sk_type != SOCK_STREAM))
534 goto out;
535 rc = -EAGAIN;
536 if (sock_flag(sk, SOCK_ZAPPED))
537 goto out;
538 rc = 0;
539 if (!(unsigned int)backlog) /* BSDism */
540 backlog = 1;
541 sk->sk_max_ack_backlog = backlog;
542 if (sk->sk_state != TCP_LISTEN) {
543 sk->sk_ack_backlog = 0;
544 sk->sk_state = TCP_LISTEN;
546 sk->sk_socket->flags |= __SO_ACCEPTCON;
547 out:
548 release_sock(sk);
549 return rc;
552 static int llc_ui_wait_for_disc(struct sock *sk, long timeout)
554 DEFINE_WAIT_FUNC(wait, woken_wake_function);
555 int rc = 0;
557 add_wait_queue(sk_sleep(sk), &wait);
558 while (1) {
559 if (sk_wait_event(sk, &timeout, sk->sk_state == TCP_CLOSE, &wait))
560 break;
561 rc = -ERESTARTSYS;
562 if (signal_pending(current))
563 break;
564 rc = -EAGAIN;
565 if (!timeout)
566 break;
567 rc = 0;
569 remove_wait_queue(sk_sleep(sk), &wait);
570 return rc;
573 static bool llc_ui_wait_for_conn(struct sock *sk, long timeout)
575 DEFINE_WAIT_FUNC(wait, woken_wake_function);
577 add_wait_queue(sk_sleep(sk), &wait);
578 while (1) {
579 if (sk_wait_event(sk, &timeout, sk->sk_state != TCP_SYN_SENT, &wait))
580 break;
581 if (signal_pending(current) || !timeout)
582 break;
584 remove_wait_queue(sk_sleep(sk), &wait);
585 return timeout;
588 static int llc_ui_wait_for_busy_core(struct sock *sk, long timeout)
590 DEFINE_WAIT_FUNC(wait, woken_wake_function);
591 struct llc_sock *llc = llc_sk(sk);
592 int rc;
594 add_wait_queue(sk_sleep(sk), &wait);
595 while (1) {
596 rc = 0;
597 if (sk_wait_event(sk, &timeout,
598 (sk->sk_shutdown & RCV_SHUTDOWN) ||
599 (!llc_data_accept_state(llc->state) &&
600 !llc->remote_busy_flag &&
601 !llc->p_flag), &wait))
602 break;
603 rc = -ERESTARTSYS;
604 if (signal_pending(current))
605 break;
606 rc = -EAGAIN;
607 if (!timeout)
608 break;
610 remove_wait_queue(sk_sleep(sk), &wait);
611 return rc;
614 static int llc_wait_data(struct sock *sk, long timeo)
616 int rc;
618 while (1) {
620 * POSIX 1003.1g mandates this order.
622 rc = sock_error(sk);
623 if (rc)
624 break;
625 rc = 0;
626 if (sk->sk_shutdown & RCV_SHUTDOWN)
627 break;
628 rc = -EAGAIN;
629 if (!timeo)
630 break;
631 rc = sock_intr_errno(timeo);
632 if (signal_pending(current))
633 break;
634 rc = 0;
635 if (sk_wait_data(sk, &timeo, NULL))
636 break;
638 return rc;
641 static void llc_cmsg_rcv(struct msghdr *msg, struct sk_buff *skb)
643 struct llc_sock *llc = llc_sk(skb->sk);
645 if (llc->cmsg_flags & LLC_CMSG_PKTINFO) {
646 struct llc_pktinfo info;
648 memset(&info, 0, sizeof(info));
649 info.lpi_ifindex = llc_sk(skb->sk)->dev->ifindex;
650 llc_pdu_decode_dsap(skb, &info.lpi_sap);
651 llc_pdu_decode_da(skb, info.lpi_mac);
652 put_cmsg(msg, SOL_LLC, LLC_OPT_PKTINFO, sizeof(info), &info);
657 * llc_ui_accept - accept a new incoming connection.
658 * @sock: Socket which connections arrive on.
659 * @newsock: Socket to move incoming connection to.
660 * @flags: User specified operational flags.
661 * @kern: If the socket is kernel internal
663 * Accept a new incoming connection.
664 * Returns 0 upon success, negative otherwise.
666 static int llc_ui_accept(struct socket *sock, struct socket *newsock, int flags,
667 bool kern)
669 struct sock *sk = sock->sk, *newsk;
670 struct llc_sock *llc, *newllc;
671 struct sk_buff *skb;
672 int rc = -EOPNOTSUPP;
674 dprintk("%s: accepting on %02X\n", __func__,
675 llc_sk(sk)->laddr.lsap);
676 lock_sock(sk);
677 if (unlikely(sk->sk_type != SOCK_STREAM))
678 goto out;
679 rc = -EINVAL;
680 if (unlikely(sock->state != SS_UNCONNECTED ||
681 sk->sk_state != TCP_LISTEN))
682 goto out;
683 /* wait for a connection to arrive. */
684 if (skb_queue_empty(&sk->sk_receive_queue)) {
685 rc = llc_wait_data(sk, sk->sk_rcvtimeo);
686 if (rc)
687 goto out;
689 dprintk("%s: got a new connection on %02X\n", __func__,
690 llc_sk(sk)->laddr.lsap);
691 skb = skb_dequeue(&sk->sk_receive_queue);
692 rc = -EINVAL;
693 if (!skb->sk)
694 goto frees;
695 rc = 0;
696 newsk = skb->sk;
697 /* attach connection to a new socket. */
698 llc_ui_sk_init(newsock, newsk);
699 sock_reset_flag(newsk, SOCK_ZAPPED);
700 newsk->sk_state = TCP_ESTABLISHED;
701 newsock->state = SS_CONNECTED;
702 llc = llc_sk(sk);
703 newllc = llc_sk(newsk);
704 memcpy(&newllc->addr, &llc->addr, sizeof(newllc->addr));
705 newllc->link = llc_ui_next_link_no(newllc->laddr.lsap);
707 /* put original socket back into a clean listen state. */
708 sk->sk_state = TCP_LISTEN;
709 sk->sk_ack_backlog--;
710 dprintk("%s: ok success on %02X, client on %02X\n", __func__,
711 llc_sk(sk)->addr.sllc_sap, newllc->daddr.lsap);
712 frees:
713 kfree_skb(skb);
714 out:
715 release_sock(sk);
716 return rc;
720 * llc_ui_recvmsg - copy received data to the socket user.
721 * @sock: Socket to copy data from.
722 * @msg: Various user space related information.
723 * @len: Size of user buffer.
724 * @flags: User specified flags.
726 * Copy received data to the socket user.
727 * Returns non-negative upon success, negative otherwise.
729 static int llc_ui_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
730 int flags)
732 DECLARE_SOCKADDR(struct sockaddr_llc *, uaddr, msg->msg_name);
733 const int nonblock = flags & MSG_DONTWAIT;
734 struct sk_buff *skb = NULL;
735 struct sock *sk = sock->sk;
736 struct llc_sock *llc = llc_sk(sk);
737 size_t copied = 0;
738 u32 peek_seq = 0;
739 u32 *seq, skb_len;
740 unsigned long used;
741 int target; /* Read at least this many bytes */
742 long timeo;
744 lock_sock(sk);
745 copied = -ENOTCONN;
746 if (unlikely(sk->sk_type == SOCK_STREAM && sk->sk_state == TCP_LISTEN))
747 goto out;
749 timeo = sock_rcvtimeo(sk, nonblock);
751 seq = &llc->copied_seq;
752 if (flags & MSG_PEEK) {
753 peek_seq = llc->copied_seq;
754 seq = &peek_seq;
757 target = sock_rcvlowat(sk, flags & MSG_WAITALL, len);
758 copied = 0;
760 do {
761 u32 offset;
764 * We need to check signals first, to get correct SIGURG
765 * handling. FIXME: Need to check this doesn't impact 1003.1g
766 * and move it down to the bottom of the loop
768 if (signal_pending(current)) {
769 if (copied)
770 break;
771 copied = timeo ? sock_intr_errno(timeo) : -EAGAIN;
772 break;
775 /* Next get a buffer. */
777 skb = skb_peek(&sk->sk_receive_queue);
778 if (skb) {
779 offset = *seq;
780 goto found_ok_skb;
782 /* Well, if we have backlog, try to process it now yet. */
784 if (copied >= target && !sk->sk_backlog.tail)
785 break;
787 if (copied) {
788 if (sk->sk_err ||
789 sk->sk_state == TCP_CLOSE ||
790 (sk->sk_shutdown & RCV_SHUTDOWN) ||
791 !timeo ||
792 (flags & MSG_PEEK))
793 break;
794 } else {
795 if (sock_flag(sk, SOCK_DONE))
796 break;
798 if (sk->sk_err) {
799 copied = sock_error(sk);
800 break;
802 if (sk->sk_shutdown & RCV_SHUTDOWN)
803 break;
805 if (sk->sk_type == SOCK_STREAM && sk->sk_state == TCP_CLOSE) {
806 if (!sock_flag(sk, SOCK_DONE)) {
808 * This occurs when user tries to read
809 * from never connected socket.
811 copied = -ENOTCONN;
812 break;
814 break;
816 if (!timeo) {
817 copied = -EAGAIN;
818 break;
822 if (copied >= target) { /* Do not sleep, just process backlog. */
823 release_sock(sk);
824 lock_sock(sk);
825 } else
826 sk_wait_data(sk, &timeo, NULL);
828 if ((flags & MSG_PEEK) && peek_seq != llc->copied_seq) {
829 net_dbg_ratelimited("LLC(%s:%d): Application bug, race in MSG_PEEK\n",
830 current->comm,
831 task_pid_nr(current));
832 peek_seq = llc->copied_seq;
834 continue;
835 found_ok_skb:
836 skb_len = skb->len;
837 /* Ok so how much can we use? */
838 used = skb->len - offset;
839 if (len < used)
840 used = len;
842 if (!(flags & MSG_TRUNC)) {
843 int rc = skb_copy_datagram_msg(skb, offset, msg, used);
844 if (rc) {
845 /* Exception. Bailout! */
846 if (!copied)
847 copied = -EFAULT;
848 break;
852 *seq += used;
853 copied += used;
854 len -= used;
856 /* For non stream protcols we get one packet per recvmsg call */
857 if (sk->sk_type != SOCK_STREAM)
858 goto copy_uaddr;
860 if (!(flags & MSG_PEEK)) {
861 skb_unlink(skb, &sk->sk_receive_queue);
862 kfree_skb(skb);
863 *seq = 0;
866 /* Partial read */
867 if (used + offset < skb_len)
868 continue;
869 } while (len > 0);
871 out:
872 release_sock(sk);
873 return copied;
874 copy_uaddr:
875 if (uaddr != NULL && skb != NULL) {
876 memcpy(uaddr, llc_ui_skb_cb(skb), sizeof(*uaddr));
877 msg->msg_namelen = sizeof(*uaddr);
879 if (llc_sk(sk)->cmsg_flags)
880 llc_cmsg_rcv(msg, skb);
882 if (!(flags & MSG_PEEK)) {
883 skb_unlink(skb, &sk->sk_receive_queue);
884 kfree_skb(skb);
885 *seq = 0;
888 goto out;
892 * llc_ui_sendmsg - Transmit data provided by the socket user.
893 * @sock: Socket to transmit data from.
894 * @msg: Various user related information.
895 * @len: Length of data to transmit.
897 * Transmit data provided by the socket user.
898 * Returns non-negative upon success, negative otherwise.
900 static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
902 struct sock *sk = sock->sk;
903 struct llc_sock *llc = llc_sk(sk);
904 DECLARE_SOCKADDR(struct sockaddr_llc *, addr, msg->msg_name);
905 int flags = msg->msg_flags;
906 int noblock = flags & MSG_DONTWAIT;
907 struct sk_buff *skb = NULL;
908 size_t size = 0;
909 int rc = -EINVAL, copied = 0, hdrlen;
911 dprintk("%s: sending from %02X to %02X\n", __func__,
912 llc->laddr.lsap, llc->daddr.lsap);
913 lock_sock(sk);
914 if (addr) {
915 if (msg->msg_namelen < sizeof(*addr))
916 goto out;
917 } else {
918 if (llc_ui_addr_null(&llc->addr))
919 goto out;
920 addr = &llc->addr;
922 /* must bind connection to sap if user hasn't done it. */
923 if (sock_flag(sk, SOCK_ZAPPED)) {
924 /* bind to sap with null dev, exclusive. */
925 rc = llc_ui_autobind(sock, addr);
926 if (rc)
927 goto out;
929 hdrlen = llc->dev->hard_header_len + llc_ui_header_len(sk, addr);
930 size = hdrlen + len;
931 if (size > llc->dev->mtu)
932 size = llc->dev->mtu;
933 copied = size - hdrlen;
934 rc = -EINVAL;
935 if (copied < 0)
936 goto out;
937 release_sock(sk);
938 skb = sock_alloc_send_skb(sk, size, noblock, &rc);
939 lock_sock(sk);
940 if (!skb)
941 goto out;
942 skb->dev = llc->dev;
943 skb->protocol = llc_proto_type(addr->sllc_arphrd);
944 skb_reserve(skb, hdrlen);
945 rc = memcpy_from_msg(skb_put(skb, copied), msg, copied);
946 if (rc)
947 goto out;
948 if (sk->sk_type == SOCK_DGRAM || addr->sllc_ua) {
949 llc_build_and_send_ui_pkt(llc->sap, skb, addr->sllc_mac,
950 addr->sllc_sap);
951 skb = NULL;
952 goto out;
954 if (addr->sllc_test) {
955 llc_build_and_send_test_pkt(llc->sap, skb, addr->sllc_mac,
956 addr->sllc_sap);
957 skb = NULL;
958 goto out;
960 if (addr->sllc_xid) {
961 llc_build_and_send_xid_pkt(llc->sap, skb, addr->sllc_mac,
962 addr->sllc_sap);
963 skb = NULL;
964 goto out;
966 rc = -ENOPROTOOPT;
967 if (!(sk->sk_type == SOCK_STREAM && !addr->sllc_ua))
968 goto out;
969 rc = llc_ui_send_data(sk, skb, noblock);
970 skb = NULL;
971 out:
972 kfree_skb(skb);
973 if (rc)
974 dprintk("%s: failed sending from %02X to %02X: %d\n",
975 __func__, llc->laddr.lsap, llc->daddr.lsap, rc);
976 release_sock(sk);
977 return rc ? : copied;
981 * llc_ui_getname - return the address info of a socket
982 * @sock: Socket to get address of.
983 * @uaddr: Address structure to return information.
984 * @uaddrlen: Length of address structure.
985 * @peer: Does user want local or remote address information.
987 * Return the address information of a socket.
989 static int llc_ui_getname(struct socket *sock, struct sockaddr *uaddr,
990 int peer)
992 struct sockaddr_llc sllc;
993 struct sock *sk = sock->sk;
994 struct llc_sock *llc = llc_sk(sk);
995 int rc = -EBADF;
997 memset(&sllc, 0, sizeof(sllc));
998 lock_sock(sk);
999 if (sock_flag(sk, SOCK_ZAPPED))
1000 goto out;
1001 if (peer) {
1002 rc = -ENOTCONN;
1003 if (sk->sk_state != TCP_ESTABLISHED)
1004 goto out;
1005 if(llc->dev)
1006 sllc.sllc_arphrd = llc->dev->type;
1007 sllc.sllc_sap = llc->daddr.lsap;
1008 memcpy(&sllc.sllc_mac, &llc->daddr.mac, IFHWADDRLEN);
1009 } else {
1010 rc = -EINVAL;
1011 if (!llc->sap)
1012 goto out;
1013 sllc.sllc_sap = llc->sap->laddr.lsap;
1015 if (llc->dev) {
1016 sllc.sllc_arphrd = llc->dev->type;
1017 memcpy(&sllc.sllc_mac, llc->dev->dev_addr,
1018 IFHWADDRLEN);
1021 sllc.sllc_family = AF_LLC;
1022 memcpy(uaddr, &sllc, sizeof(sllc));
1023 rc = sizeof(sllc);
1024 out:
1025 release_sock(sk);
1026 return rc;
1030 * llc_ui_ioctl - io controls for PF_LLC
1031 * @sock: Socket to get/set info
1032 * @cmd: command
1033 * @arg: optional argument for cmd
1035 * get/set info on llc sockets
1037 static int llc_ui_ioctl(struct socket *sock, unsigned int cmd,
1038 unsigned long arg)
1040 return -ENOIOCTLCMD;
1044 * llc_ui_setsockopt - set various connection specific parameters.
1045 * @sock: Socket to set options on.
1046 * @level: Socket level user is requesting operations on.
1047 * @optname: Operation name.
1048 * @optval: User provided operation data.
1049 * @optlen: Length of optval.
1051 * Set various connection specific parameters.
1053 static int llc_ui_setsockopt(struct socket *sock, int level, int optname,
1054 char __user *optval, unsigned int optlen)
1056 struct sock *sk = sock->sk;
1057 struct llc_sock *llc = llc_sk(sk);
1058 unsigned int opt;
1059 int rc = -EINVAL;
1061 lock_sock(sk);
1062 if (unlikely(level != SOL_LLC || optlen != sizeof(int)))
1063 goto out;
1064 rc = get_user(opt, (int __user *)optval);
1065 if (rc)
1066 goto out;
1067 rc = -EINVAL;
1068 switch (optname) {
1069 case LLC_OPT_RETRY:
1070 if (opt > LLC_OPT_MAX_RETRY)
1071 goto out;
1072 llc->n2 = opt;
1073 break;
1074 case LLC_OPT_SIZE:
1075 if (opt > LLC_OPT_MAX_SIZE)
1076 goto out;
1077 llc->n1 = opt;
1078 break;
1079 case LLC_OPT_ACK_TMR_EXP:
1080 if (opt > LLC_OPT_MAX_ACK_TMR_EXP)
1081 goto out;
1082 llc->ack_timer.expire = opt * HZ;
1083 break;
1084 case LLC_OPT_P_TMR_EXP:
1085 if (opt > LLC_OPT_MAX_P_TMR_EXP)
1086 goto out;
1087 llc->pf_cycle_timer.expire = opt * HZ;
1088 break;
1089 case LLC_OPT_REJ_TMR_EXP:
1090 if (opt > LLC_OPT_MAX_REJ_TMR_EXP)
1091 goto out;
1092 llc->rej_sent_timer.expire = opt * HZ;
1093 break;
1094 case LLC_OPT_BUSY_TMR_EXP:
1095 if (opt > LLC_OPT_MAX_BUSY_TMR_EXP)
1096 goto out;
1097 llc->busy_state_timer.expire = opt * HZ;
1098 break;
1099 case LLC_OPT_TX_WIN:
1100 if (opt > LLC_OPT_MAX_WIN)
1101 goto out;
1102 llc->k = opt;
1103 break;
1104 case LLC_OPT_RX_WIN:
1105 if (opt > LLC_OPT_MAX_WIN)
1106 goto out;
1107 llc->rw = opt;
1108 break;
1109 case LLC_OPT_PKTINFO:
1110 if (opt)
1111 llc->cmsg_flags |= LLC_CMSG_PKTINFO;
1112 else
1113 llc->cmsg_flags &= ~LLC_CMSG_PKTINFO;
1114 break;
1115 default:
1116 rc = -ENOPROTOOPT;
1117 goto out;
1119 rc = 0;
1120 out:
1121 release_sock(sk);
1122 return rc;
1126 * llc_ui_getsockopt - get connection specific socket info
1127 * @sock: Socket to get information from.
1128 * @level: Socket level user is requesting operations on.
1129 * @optname: Operation name.
1130 * @optval: Variable to return operation data in.
1131 * @optlen: Length of optval.
1133 * Get connection specific socket information.
1135 static int llc_ui_getsockopt(struct socket *sock, int level, int optname,
1136 char __user *optval, int __user *optlen)
1138 struct sock *sk = sock->sk;
1139 struct llc_sock *llc = llc_sk(sk);
1140 int val = 0, len = 0, rc = -EINVAL;
1142 lock_sock(sk);
1143 if (unlikely(level != SOL_LLC))
1144 goto out;
1145 rc = get_user(len, optlen);
1146 if (rc)
1147 goto out;
1148 rc = -EINVAL;
1149 if (len != sizeof(int))
1150 goto out;
1151 switch (optname) {
1152 case LLC_OPT_RETRY:
1153 val = llc->n2; break;
1154 case LLC_OPT_SIZE:
1155 val = llc->n1; break;
1156 case LLC_OPT_ACK_TMR_EXP:
1157 val = llc->ack_timer.expire / HZ; break;
1158 case LLC_OPT_P_TMR_EXP:
1159 val = llc->pf_cycle_timer.expire / HZ; break;
1160 case LLC_OPT_REJ_TMR_EXP:
1161 val = llc->rej_sent_timer.expire / HZ; break;
1162 case LLC_OPT_BUSY_TMR_EXP:
1163 val = llc->busy_state_timer.expire / HZ; break;
1164 case LLC_OPT_TX_WIN:
1165 val = llc->k; break;
1166 case LLC_OPT_RX_WIN:
1167 val = llc->rw; break;
1168 case LLC_OPT_PKTINFO:
1169 val = (llc->cmsg_flags & LLC_CMSG_PKTINFO) != 0;
1170 break;
1171 default:
1172 rc = -ENOPROTOOPT;
1173 goto out;
1175 rc = 0;
1176 if (put_user(len, optlen) || copy_to_user(optval, &val, len))
1177 rc = -EFAULT;
1178 out:
1179 release_sock(sk);
1180 return rc;
1183 static const struct net_proto_family llc_ui_family_ops = {
1184 .family = PF_LLC,
1185 .create = llc_ui_create,
1186 .owner = THIS_MODULE,
1189 static const struct proto_ops llc_ui_ops = {
1190 .family = PF_LLC,
1191 .owner = THIS_MODULE,
1192 .release = llc_ui_release,
1193 .bind = llc_ui_bind,
1194 .connect = llc_ui_connect,
1195 .socketpair = sock_no_socketpair,
1196 .accept = llc_ui_accept,
1197 .getname = llc_ui_getname,
1198 .poll = datagram_poll,
1199 .ioctl = llc_ui_ioctl,
1200 .listen = llc_ui_listen,
1201 .shutdown = llc_ui_shutdown,
1202 .setsockopt = llc_ui_setsockopt,
1203 .getsockopt = llc_ui_getsockopt,
1204 .sendmsg = llc_ui_sendmsg,
1205 .recvmsg = llc_ui_recvmsg,
1206 .mmap = sock_no_mmap,
1207 .sendpage = sock_no_sendpage,
1210 static const char llc_proc_err_msg[] __initconst =
1211 KERN_CRIT "LLC: Unable to register the proc_fs entries\n";
1212 static const char llc_sysctl_err_msg[] __initconst =
1213 KERN_CRIT "LLC: Unable to register the sysctl entries\n";
1214 static const char llc_sock_err_msg[] __initconst =
1215 KERN_CRIT "LLC: Unable to register the network family\n";
1217 static int __init llc2_init(void)
1219 int rc = proto_register(&llc_proto, 0);
1221 if (rc != 0)
1222 goto out;
1224 llc_build_offset_table();
1225 llc_station_init();
1226 llc_ui_sap_last_autoport = LLC_SAP_DYN_START;
1227 rc = llc_proc_init();
1228 if (rc != 0) {
1229 printk(llc_proc_err_msg);
1230 goto out_station;
1232 rc = llc_sysctl_init();
1233 if (rc) {
1234 printk(llc_sysctl_err_msg);
1235 goto out_proc;
1237 rc = sock_register(&llc_ui_family_ops);
1238 if (rc) {
1239 printk(llc_sock_err_msg);
1240 goto out_sysctl;
1242 llc_add_pack(LLC_DEST_SAP, llc_sap_handler);
1243 llc_add_pack(LLC_DEST_CONN, llc_conn_handler);
1244 out:
1245 return rc;
1246 out_sysctl:
1247 llc_sysctl_exit();
1248 out_proc:
1249 llc_proc_exit();
1250 out_station:
1251 llc_station_exit();
1252 proto_unregister(&llc_proto);
1253 goto out;
1256 static void __exit llc2_exit(void)
1258 llc_station_exit();
1259 llc_remove_pack(LLC_DEST_SAP);
1260 llc_remove_pack(LLC_DEST_CONN);
1261 sock_unregister(PF_LLC);
1262 llc_proc_exit();
1263 llc_sysctl_exit();
1264 proto_unregister(&llc_proto);
1267 module_init(llc2_init);
1268 module_exit(llc2_exit);
1270 MODULE_LICENSE("GPL");
1271 MODULE_AUTHOR("Procom 1997, Jay Schullist 2001, Arnaldo C. Melo 2001-2003");
1272 MODULE_DESCRIPTION("IEEE 802.2 PF_LLC support");
1273 MODULE_ALIAS_NETPROTO(PF_LLC);