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