Linux Audio

Check our new training course

Loading...
v5.4
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * File: socket.c
  4 *
  5 * Phonet sockets
  6 *
  7 * Copyright (C) 2008 Nokia Corporation.
  8 *
  9 * Authors: Sakari Ailus <sakari.ailus@nokia.com>
 10 *          RĂ©mi Denis-Courmont
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 11 */
 12
 13#include <linux/gfp.h>
 14#include <linux/kernel.h>
 15#include <linux/net.h>
 16#include <linux/poll.h>
 17#include <linux/sched/signal.h>
 18
 19#include <net/sock.h>
 20#include <net/tcp_states.h>
 21
 22#include <linux/phonet.h>
 23#include <linux/export.h>
 24#include <net/phonet/phonet.h>
 25#include <net/phonet/pep.h>
 26#include <net/phonet/pn_dev.h>
 27
 28static int pn_socket_release(struct socket *sock)
 29{
 30	struct sock *sk = sock->sk;
 31
 32	if (sk) {
 33		sock->sk = NULL;
 34		sk->sk_prot->close(sk, 0);
 35	}
 36	return 0;
 37}
 38
 39#define PN_HASHSIZE	16
 40#define PN_HASHMASK	(PN_HASHSIZE-1)
 41
 42
 43static struct  {
 44	struct hlist_head hlist[PN_HASHSIZE];
 45	struct mutex lock;
 46} pnsocks;
 47
 48void __init pn_sock_init(void)
 49{
 50	unsigned int i;
 51
 52	for (i = 0; i < PN_HASHSIZE; i++)
 53		INIT_HLIST_HEAD(pnsocks.hlist + i);
 54	mutex_init(&pnsocks.lock);
 55}
 56
 57static struct hlist_head *pn_hash_list(u16 obj)
 58{
 59	return pnsocks.hlist + (obj & PN_HASHMASK);
 60}
 61
 62/*
 63 * Find address based on socket address, match only certain fields.
 64 * Also grab sock if it was found. Remember to sock_put it later.
 65 */
 66struct sock *pn_find_sock_by_sa(struct net *net, const struct sockaddr_pn *spn)
 67{
 68	struct sock *sknode;
 69	struct sock *rval = NULL;
 70	u16 obj = pn_sockaddr_get_object(spn);
 71	u8 res = spn->spn_resource;
 72	struct hlist_head *hlist = pn_hash_list(obj);
 73
 74	rcu_read_lock();
 75	sk_for_each_rcu(sknode, hlist) {
 76		struct pn_sock *pn = pn_sk(sknode);
 77		BUG_ON(!pn->sobject); /* unbound socket */
 78
 79		if (!net_eq(sock_net(sknode), net))
 80			continue;
 81		if (pn_port(obj)) {
 82			/* Look up socket by port */
 83			if (pn_port(pn->sobject) != pn_port(obj))
 84				continue;
 85		} else {
 86			/* If port is zero, look up by resource */
 87			if (pn->resource != res)
 88				continue;
 89		}
 90		if (pn_addr(pn->sobject) &&
 91		    pn_addr(pn->sobject) != pn_addr(obj))
 92			continue;
 93
 94		rval = sknode;
 95		sock_hold(sknode);
 96		break;
 97	}
 98	rcu_read_unlock();
 99
100	return rval;
101}
102
103/* Deliver a broadcast packet (only in bottom-half) */
104void pn_deliver_sock_broadcast(struct net *net, struct sk_buff *skb)
105{
106	struct hlist_head *hlist = pnsocks.hlist;
107	unsigned int h;
108
109	rcu_read_lock();
110	for (h = 0; h < PN_HASHSIZE; h++) {
111		struct sock *sknode;
112
113		sk_for_each(sknode, hlist) {
114			struct sk_buff *clone;
115
116			if (!net_eq(sock_net(sknode), net))
117				continue;
118			if (!sock_flag(sknode, SOCK_BROADCAST))
119				continue;
120
121			clone = skb_clone(skb, GFP_ATOMIC);
122			if (clone) {
123				sock_hold(sknode);
124				sk_receive_skb(sknode, clone, 0);
125			}
126		}
127		hlist++;
128	}
129	rcu_read_unlock();
130}
131
132int pn_sock_hash(struct sock *sk)
133{
134	struct hlist_head *hlist = pn_hash_list(pn_sk(sk)->sobject);
135
136	mutex_lock(&pnsocks.lock);
137	sk_add_node_rcu(sk, hlist);
138	mutex_unlock(&pnsocks.lock);
139
140	return 0;
141}
142EXPORT_SYMBOL(pn_sock_hash);
143
144void pn_sock_unhash(struct sock *sk)
145{
146	mutex_lock(&pnsocks.lock);
147	sk_del_node_init_rcu(sk);
148	mutex_unlock(&pnsocks.lock);
149	pn_sock_unbind_all_res(sk);
150	synchronize_rcu();
151}
152EXPORT_SYMBOL(pn_sock_unhash);
153
154static DEFINE_MUTEX(port_mutex);
155
156static int pn_socket_bind(struct socket *sock, struct sockaddr *addr, int len)
157{
158	struct sock *sk = sock->sk;
159	struct pn_sock *pn = pn_sk(sk);
160	struct sockaddr_pn *spn = (struct sockaddr_pn *)addr;
161	int err;
162	u16 handle;
163	u8 saddr;
164
165	if (sk->sk_prot->bind)
166		return sk->sk_prot->bind(sk, addr, len);
167
168	if (len < sizeof(struct sockaddr_pn))
169		return -EINVAL;
170	if (spn->spn_family != AF_PHONET)
171		return -EAFNOSUPPORT;
172
173	handle = pn_sockaddr_get_object((struct sockaddr_pn *)addr);
174	saddr = pn_addr(handle);
175	if (saddr && phonet_address_lookup(sock_net(sk), saddr))
176		return -EADDRNOTAVAIL;
177
178	lock_sock(sk);
179	if (sk->sk_state != TCP_CLOSE || pn_port(pn->sobject)) {
180		err = -EINVAL; /* attempt to rebind */
181		goto out;
182	}
183	WARN_ON(sk_hashed(sk));
184	mutex_lock(&port_mutex);
185	err = sk->sk_prot->get_port(sk, pn_port(handle));
186	if (err)
187		goto out_port;
188
189	/* get_port() sets the port, bind() sets the address if applicable */
190	pn->sobject = pn_object(saddr, pn_port(pn->sobject));
191	pn->resource = spn->spn_resource;
192
193	/* Enable RX on the socket */
194	err = sk->sk_prot->hash(sk);
195out_port:
196	mutex_unlock(&port_mutex);
197out:
198	release_sock(sk);
199	return err;
200}
201
202static int pn_socket_autobind(struct socket *sock)
203{
204	struct sockaddr_pn sa;
205	int err;
206
207	memset(&sa, 0, sizeof(sa));
208	sa.spn_family = AF_PHONET;
209	err = pn_socket_bind(sock, (struct sockaddr *)&sa,
210				sizeof(struct sockaddr_pn));
211	if (err != -EINVAL)
212		return err;
213	BUG_ON(!pn_port(pn_sk(sock->sk)->sobject));
214	return 0; /* socket was already bound */
215}
216
217static int pn_socket_connect(struct socket *sock, struct sockaddr *addr,
218		int len, int flags)
219{
220	struct sock *sk = sock->sk;
221	struct pn_sock *pn = pn_sk(sk);
222	struct sockaddr_pn *spn = (struct sockaddr_pn *)addr;
223	struct task_struct *tsk = current;
224	long timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
225	int err;
226
227	if (pn_socket_autobind(sock))
228		return -ENOBUFS;
229	if (len < sizeof(struct sockaddr_pn))
230		return -EINVAL;
231	if (spn->spn_family != AF_PHONET)
232		return -EAFNOSUPPORT;
233
234	lock_sock(sk);
235
236	switch (sock->state) {
237	case SS_UNCONNECTED:
238		if (sk->sk_state != TCP_CLOSE) {
239			err = -EISCONN;
240			goto out;
241		}
242		break;
243	case SS_CONNECTING:
244		err = -EALREADY;
245		goto out;
246	default:
247		err = -EISCONN;
248		goto out;
249	}
250
251	pn->dobject = pn_sockaddr_get_object(spn);
252	pn->resource = pn_sockaddr_get_resource(spn);
253	sock->state = SS_CONNECTING;
254
255	err = sk->sk_prot->connect(sk, addr, len);
256	if (err) {
257		sock->state = SS_UNCONNECTED;
258		pn->dobject = 0;
259		goto out;
260	}
261
262	while (sk->sk_state == TCP_SYN_SENT) {
263		DEFINE_WAIT(wait);
264
265		if (!timeo) {
266			err = -EINPROGRESS;
267			goto out;
268		}
269		if (signal_pending(tsk)) {
270			err = sock_intr_errno(timeo);
271			goto out;
272		}
273
274		prepare_to_wait_exclusive(sk_sleep(sk), &wait,
275						TASK_INTERRUPTIBLE);
276		release_sock(sk);
277		timeo = schedule_timeout(timeo);
278		lock_sock(sk);
279		finish_wait(sk_sleep(sk), &wait);
280	}
281
282	if ((1 << sk->sk_state) & (TCPF_SYN_RECV|TCPF_ESTABLISHED))
283		err = 0;
284	else if (sk->sk_state == TCP_CLOSE_WAIT)
285		err = -ECONNRESET;
286	else
287		err = -ECONNREFUSED;
288	sock->state = err ? SS_UNCONNECTED : SS_CONNECTED;
289out:
290	release_sock(sk);
291	return err;
292}
293
294static int pn_socket_accept(struct socket *sock, struct socket *newsock,
295			    int flags, bool kern)
296{
297	struct sock *sk = sock->sk;
298	struct sock *newsk;
299	int err;
300
301	if (unlikely(sk->sk_state != TCP_LISTEN))
302		return -EINVAL;
303
304	newsk = sk->sk_prot->accept(sk, flags, &err, kern);
305	if (!newsk)
306		return err;
307
308	lock_sock(newsk);
309	sock_graft(newsk, newsock);
310	newsock->state = SS_CONNECTED;
311	release_sock(newsk);
312	return 0;
313}
314
315static int pn_socket_getname(struct socket *sock, struct sockaddr *addr,
316				int peer)
317{
318	struct sock *sk = sock->sk;
319	struct pn_sock *pn = pn_sk(sk);
320
321	memset(addr, 0, sizeof(struct sockaddr_pn));
322	addr->sa_family = AF_PHONET;
323	if (!peer) /* Race with bind() here is userland's problem. */
324		pn_sockaddr_set_object((struct sockaddr_pn *)addr,
325					pn->sobject);
326
327	return sizeof(struct sockaddr_pn);
328}
329
330static __poll_t pn_socket_poll(struct file *file, struct socket *sock,
331					poll_table *wait)
332{
333	struct sock *sk = sock->sk;
334	struct pep_sock *pn = pep_sk(sk);
335	__poll_t mask = 0;
336
337	poll_wait(file, sk_sleep(sk), wait);
338
339	if (sk->sk_state == TCP_CLOSE)
340		return EPOLLERR;
341	if (!skb_queue_empty_lockless(&sk->sk_receive_queue))
342		mask |= EPOLLIN | EPOLLRDNORM;
343	if (!skb_queue_empty_lockless(&pn->ctrlreq_queue))
344		mask |= EPOLLPRI;
345	if (!mask && sk->sk_state == TCP_CLOSE_WAIT)
346		return EPOLLHUP;
347
348	if (sk->sk_state == TCP_ESTABLISHED &&
349		refcount_read(&sk->sk_wmem_alloc) < sk->sk_sndbuf &&
350		atomic_read(&pn->tx_credits))
351		mask |= EPOLLOUT | EPOLLWRNORM | EPOLLWRBAND;
352
353	return mask;
354}
355
356static int pn_socket_ioctl(struct socket *sock, unsigned int cmd,
357				unsigned long arg)
358{
359	struct sock *sk = sock->sk;
360	struct pn_sock *pn = pn_sk(sk);
361
362	if (cmd == SIOCPNGETOBJECT) {
363		struct net_device *dev;
364		u16 handle;
365		u8 saddr;
366
367		if (get_user(handle, (__u16 __user *)arg))
368			return -EFAULT;
369
370		lock_sock(sk);
371		if (sk->sk_bound_dev_if)
372			dev = dev_get_by_index(sock_net(sk),
373						sk->sk_bound_dev_if);
374		else
375			dev = phonet_device_get(sock_net(sk));
376		if (dev && (dev->flags & IFF_UP))
377			saddr = phonet_address_get(dev, pn_addr(handle));
378		else
379			saddr = PN_NO_ADDR;
380		release_sock(sk);
381
382		if (dev)
383			dev_put(dev);
384		if (saddr == PN_NO_ADDR)
385			return -EHOSTUNREACH;
386
387		handle = pn_object(saddr, pn_port(pn->sobject));
388		return put_user(handle, (__u16 __user *)arg);
389	}
390
391	return sk->sk_prot->ioctl(sk, cmd, arg);
392}
393
394static int pn_socket_listen(struct socket *sock, int backlog)
395{
396	struct sock *sk = sock->sk;
397	int err = 0;
398
399	if (pn_socket_autobind(sock))
400		return -ENOBUFS;
401
402	lock_sock(sk);
403	if (sock->state != SS_UNCONNECTED) {
404		err = -EINVAL;
405		goto out;
406	}
407
408	if (sk->sk_state != TCP_LISTEN) {
409		sk->sk_state = TCP_LISTEN;
410		sk->sk_ack_backlog = 0;
411	}
412	sk->sk_max_ack_backlog = backlog;
413out:
414	release_sock(sk);
415	return err;
416}
417
418static int pn_socket_sendmsg(struct socket *sock, struct msghdr *m,
419			     size_t total_len)
420{
421	struct sock *sk = sock->sk;
422
423	if (pn_socket_autobind(sock))
424		return -EAGAIN;
425
426	return sk->sk_prot->sendmsg(sk, m, total_len);
427}
428
429const struct proto_ops phonet_dgram_ops = {
430	.family		= AF_PHONET,
431	.owner		= THIS_MODULE,
432	.release	= pn_socket_release,
433	.bind		= pn_socket_bind,
434	.connect	= sock_no_connect,
435	.socketpair	= sock_no_socketpair,
436	.accept		= sock_no_accept,
437	.getname	= pn_socket_getname,
438	.poll		= datagram_poll,
439	.ioctl		= pn_socket_ioctl,
440	.listen		= sock_no_listen,
441	.shutdown	= sock_no_shutdown,
442	.setsockopt	= sock_no_setsockopt,
443	.getsockopt	= sock_no_getsockopt,
444#ifdef CONFIG_COMPAT
445	.compat_setsockopt = sock_no_setsockopt,
446	.compat_getsockopt = sock_no_getsockopt,
447#endif
448	.sendmsg	= pn_socket_sendmsg,
449	.recvmsg	= sock_common_recvmsg,
450	.mmap		= sock_no_mmap,
451	.sendpage	= sock_no_sendpage,
452};
453
454const struct proto_ops phonet_stream_ops = {
455	.family		= AF_PHONET,
456	.owner		= THIS_MODULE,
457	.release	= pn_socket_release,
458	.bind		= pn_socket_bind,
459	.connect	= pn_socket_connect,
460	.socketpair	= sock_no_socketpair,
461	.accept		= pn_socket_accept,
462	.getname	= pn_socket_getname,
463	.poll		= pn_socket_poll,
464	.ioctl		= pn_socket_ioctl,
465	.listen		= pn_socket_listen,
466	.shutdown	= sock_no_shutdown,
467	.setsockopt	= sock_common_setsockopt,
468	.getsockopt	= sock_common_getsockopt,
469#ifdef CONFIG_COMPAT
470	.compat_setsockopt = compat_sock_common_setsockopt,
471	.compat_getsockopt = compat_sock_common_getsockopt,
472#endif
473	.sendmsg	= pn_socket_sendmsg,
474	.recvmsg	= sock_common_recvmsg,
475	.mmap		= sock_no_mmap,
476	.sendpage	= sock_no_sendpage,
477};
478EXPORT_SYMBOL(phonet_stream_ops);
479
480/* allocate port for a socket */
481int pn_sock_get_port(struct sock *sk, unsigned short sport)
482{
483	static int port_cur;
484	struct net *net = sock_net(sk);
485	struct pn_sock *pn = pn_sk(sk);
486	struct sockaddr_pn try_sa;
487	struct sock *tmpsk;
488
489	memset(&try_sa, 0, sizeof(struct sockaddr_pn));
490	try_sa.spn_family = AF_PHONET;
491	WARN_ON(!mutex_is_locked(&port_mutex));
492	if (!sport) {
493		/* search free port */
494		int port, pmin, pmax;
495
496		phonet_get_local_port_range(&pmin, &pmax);
497		for (port = pmin; port <= pmax; port++) {
498			port_cur++;
499			if (port_cur < pmin || port_cur > pmax)
500				port_cur = pmin;
501
502			pn_sockaddr_set_port(&try_sa, port_cur);
503			tmpsk = pn_find_sock_by_sa(net, &try_sa);
504			if (tmpsk == NULL) {
505				sport = port_cur;
506				goto found;
507			} else
508				sock_put(tmpsk);
509		}
510	} else {
511		/* try to find specific port */
512		pn_sockaddr_set_port(&try_sa, sport);
513		tmpsk = pn_find_sock_by_sa(net, &try_sa);
514		if (tmpsk == NULL)
515			/* No sock there! We can use that port... */
516			goto found;
517		else
518			sock_put(tmpsk);
519	}
520	/* the port must be in use already */
521	return -EADDRINUSE;
522
523found:
524	pn->sobject = pn_object(pn_addr(pn->sobject), sport);
525	return 0;
526}
527EXPORT_SYMBOL(pn_sock_get_port);
528
529#ifdef CONFIG_PROC_FS
530static struct sock *pn_sock_get_idx(struct seq_file *seq, loff_t pos)
531{
532	struct net *net = seq_file_net(seq);
533	struct hlist_head *hlist = pnsocks.hlist;
534	struct sock *sknode;
535	unsigned int h;
536
537	for (h = 0; h < PN_HASHSIZE; h++) {
538		sk_for_each_rcu(sknode, hlist) {
539			if (!net_eq(net, sock_net(sknode)))
540				continue;
541			if (!pos)
542				return sknode;
543			pos--;
544		}
545		hlist++;
546	}
547	return NULL;
548}
549
550static struct sock *pn_sock_get_next(struct seq_file *seq, struct sock *sk)
551{
552	struct net *net = seq_file_net(seq);
553
554	do
555		sk = sk_next(sk);
556	while (sk && !net_eq(net, sock_net(sk)));
557
558	return sk;
559}
560
561static void *pn_sock_seq_start(struct seq_file *seq, loff_t *pos)
562	__acquires(rcu)
563{
564	rcu_read_lock();
565	return *pos ? pn_sock_get_idx(seq, *pos - 1) : SEQ_START_TOKEN;
566}
567
568static void *pn_sock_seq_next(struct seq_file *seq, void *v, loff_t *pos)
569{
570	struct sock *sk;
571
572	if (v == SEQ_START_TOKEN)
573		sk = pn_sock_get_idx(seq, 0);
574	else
575		sk = pn_sock_get_next(seq, v);
576	(*pos)++;
577	return sk;
578}
579
580static void pn_sock_seq_stop(struct seq_file *seq, void *v)
581	__releases(rcu)
582{
583	rcu_read_unlock();
584}
585
586static int pn_sock_seq_show(struct seq_file *seq, void *v)
587{
588	seq_setwidth(seq, 127);
589	if (v == SEQ_START_TOKEN)
590		seq_puts(seq, "pt  loc  rem rs st tx_queue rx_queue "
591			"  uid inode ref pointer drops");
592	else {
593		struct sock *sk = v;
594		struct pn_sock *pn = pn_sk(sk);
595
596		seq_printf(seq, "%2d %04X:%04X:%02X %02X %08X:%08X %5d %lu "
597			"%d %pK %u",
598			sk->sk_protocol, pn->sobject, pn->dobject,
599			pn->resource, sk->sk_state,
600			sk_wmem_alloc_get(sk), sk_rmem_alloc_get(sk),
601			from_kuid_munged(seq_user_ns(seq), sock_i_uid(sk)),
602			sock_i_ino(sk),
603			refcount_read(&sk->sk_refcnt), sk,
604			atomic_read(&sk->sk_drops));
605	}
606	seq_pad(seq, '\n');
607	return 0;
608}
609
610const struct seq_operations pn_sock_seq_ops = {
611	.start = pn_sock_seq_start,
612	.next = pn_sock_seq_next,
613	.stop = pn_sock_seq_stop,
614	.show = pn_sock_seq_show,
615};
 
 
 
 
 
 
 
 
 
 
 
 
 
616#endif
617
618static struct  {
619	struct sock *sk[256];
620} pnres;
621
622/*
623 * Find and hold socket based on resource.
624 */
625struct sock *pn_find_sock_by_res(struct net *net, u8 res)
626{
627	struct sock *sk;
628
629	if (!net_eq(net, &init_net))
630		return NULL;
631
632	rcu_read_lock();
633	sk = rcu_dereference(pnres.sk[res]);
634	if (sk)
635		sock_hold(sk);
636	rcu_read_unlock();
637	return sk;
638}
639
640static DEFINE_MUTEX(resource_mutex);
641
642int pn_sock_bind_res(struct sock *sk, u8 res)
643{
644	int ret = -EADDRINUSE;
645
646	if (!net_eq(sock_net(sk), &init_net))
647		return -ENOIOCTLCMD;
648	if (!capable(CAP_SYS_ADMIN))
649		return -EPERM;
650	if (pn_socket_autobind(sk->sk_socket))
651		return -EAGAIN;
652
653	mutex_lock(&resource_mutex);
654	if (pnres.sk[res] == NULL) {
655		sock_hold(sk);
656		rcu_assign_pointer(pnres.sk[res], sk);
657		ret = 0;
658	}
659	mutex_unlock(&resource_mutex);
660	return ret;
661}
662
663int pn_sock_unbind_res(struct sock *sk, u8 res)
664{
665	int ret = -ENOENT;
666
667	if (!capable(CAP_SYS_ADMIN))
668		return -EPERM;
669
670	mutex_lock(&resource_mutex);
671	if (pnres.sk[res] == sk) {
672		RCU_INIT_POINTER(pnres.sk[res], NULL);
673		ret = 0;
674	}
675	mutex_unlock(&resource_mutex);
676
677	if (ret == 0) {
678		synchronize_rcu();
679		sock_put(sk);
680	}
681	return ret;
682}
683
684void pn_sock_unbind_all_res(struct sock *sk)
685{
686	unsigned int res, match = 0;
687
688	mutex_lock(&resource_mutex);
689	for (res = 0; res < 256; res++) {
690		if (pnres.sk[res] == sk) {
691			RCU_INIT_POINTER(pnres.sk[res], NULL);
692			match++;
693		}
694	}
695	mutex_unlock(&resource_mutex);
696
697	while (match > 0) {
698		__sock_put(sk);
699		match--;
700	}
701	/* Caller is responsible for RCU sync before final sock_put() */
702}
703
704#ifdef CONFIG_PROC_FS
705static struct sock **pn_res_get_idx(struct seq_file *seq, loff_t pos)
706{
707	struct net *net = seq_file_net(seq);
708	unsigned int i;
709
710	if (!net_eq(net, &init_net))
711		return NULL;
712
713	for (i = 0; i < 256; i++) {
714		if (pnres.sk[i] == NULL)
715			continue;
716		if (!pos)
717			return pnres.sk + i;
718		pos--;
719	}
720	return NULL;
721}
722
723static struct sock **pn_res_get_next(struct seq_file *seq, struct sock **sk)
724{
725	struct net *net = seq_file_net(seq);
726	unsigned int i;
727
728	BUG_ON(!net_eq(net, &init_net));
729
730	for (i = (sk - pnres.sk) + 1; i < 256; i++)
731		if (pnres.sk[i])
732			return pnres.sk + i;
733	return NULL;
734}
735
736static void *pn_res_seq_start(struct seq_file *seq, loff_t *pos)
737	__acquires(resource_mutex)
738{
739	mutex_lock(&resource_mutex);
740	return *pos ? pn_res_get_idx(seq, *pos - 1) : SEQ_START_TOKEN;
741}
742
743static void *pn_res_seq_next(struct seq_file *seq, void *v, loff_t *pos)
744{
745	struct sock **sk;
746
747	if (v == SEQ_START_TOKEN)
748		sk = pn_res_get_idx(seq, 0);
749	else
750		sk = pn_res_get_next(seq, v);
751	(*pos)++;
752	return sk;
753}
754
755static void pn_res_seq_stop(struct seq_file *seq, void *v)
756	__releases(resource_mutex)
757{
758	mutex_unlock(&resource_mutex);
759}
760
761static int pn_res_seq_show(struct seq_file *seq, void *v)
762{
763	seq_setwidth(seq, 63);
764	if (v == SEQ_START_TOKEN)
765		seq_puts(seq, "rs   uid inode");
766	else {
767		struct sock **psk = v;
768		struct sock *sk = *psk;
769
770		seq_printf(seq, "%02X %5u %lu",
771			   (int) (psk - pnres.sk),
772			   from_kuid_munged(seq_user_ns(seq), sock_i_uid(sk)),
773			   sock_i_ino(sk));
774	}
775	seq_pad(seq, '\n');
776	return 0;
777}
778
779const struct seq_operations pn_res_seq_ops = {
780	.start = pn_res_seq_start,
781	.next = pn_res_seq_next,
782	.stop = pn_res_seq_stop,
783	.show = pn_res_seq_show,
 
 
 
 
 
 
 
 
 
 
 
 
 
784};
785#endif
v4.17
 
  1/*
  2 * File: socket.c
  3 *
  4 * Phonet sockets
  5 *
  6 * Copyright (C) 2008 Nokia Corporation.
  7 *
  8 * Authors: Sakari Ailus <sakari.ailus@nokia.com>
  9 *          RĂ©mi Denis-Courmont
 10 *
 11 * This program is free software; you can redistribute it and/or
 12 * modify it under the terms of the GNU General Public License
 13 * version 2 as published by the Free Software Foundation.
 14 *
 15 * This program is distributed in the hope that it will be useful, but
 16 * WITHOUT ANY WARRANTY; without even the implied warranty of
 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 18 * General Public License for more details.
 19 *
 20 * You should have received a copy of the GNU General Public License
 21 * along with this program; if not, write to the Free Software
 22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 23 * 02110-1301 USA
 24 */
 25
 26#include <linux/gfp.h>
 27#include <linux/kernel.h>
 28#include <linux/net.h>
 29#include <linux/poll.h>
 30#include <linux/sched/signal.h>
 31
 32#include <net/sock.h>
 33#include <net/tcp_states.h>
 34
 35#include <linux/phonet.h>
 36#include <linux/export.h>
 37#include <net/phonet/phonet.h>
 38#include <net/phonet/pep.h>
 39#include <net/phonet/pn_dev.h>
 40
 41static int pn_socket_release(struct socket *sock)
 42{
 43	struct sock *sk = sock->sk;
 44
 45	if (sk) {
 46		sock->sk = NULL;
 47		sk->sk_prot->close(sk, 0);
 48	}
 49	return 0;
 50}
 51
 52#define PN_HASHSIZE	16
 53#define PN_HASHMASK	(PN_HASHSIZE-1)
 54
 55
 56static struct  {
 57	struct hlist_head hlist[PN_HASHSIZE];
 58	struct mutex lock;
 59} pnsocks;
 60
 61void __init pn_sock_init(void)
 62{
 63	unsigned int i;
 64
 65	for (i = 0; i < PN_HASHSIZE; i++)
 66		INIT_HLIST_HEAD(pnsocks.hlist + i);
 67	mutex_init(&pnsocks.lock);
 68}
 69
 70static struct hlist_head *pn_hash_list(u16 obj)
 71{
 72	return pnsocks.hlist + (obj & PN_HASHMASK);
 73}
 74
 75/*
 76 * Find address based on socket address, match only certain fields.
 77 * Also grab sock if it was found. Remember to sock_put it later.
 78 */
 79struct sock *pn_find_sock_by_sa(struct net *net, const struct sockaddr_pn *spn)
 80{
 81	struct sock *sknode;
 82	struct sock *rval = NULL;
 83	u16 obj = pn_sockaddr_get_object(spn);
 84	u8 res = spn->spn_resource;
 85	struct hlist_head *hlist = pn_hash_list(obj);
 86
 87	rcu_read_lock();
 88	sk_for_each_rcu(sknode, hlist) {
 89		struct pn_sock *pn = pn_sk(sknode);
 90		BUG_ON(!pn->sobject); /* unbound socket */
 91
 92		if (!net_eq(sock_net(sknode), net))
 93			continue;
 94		if (pn_port(obj)) {
 95			/* Look up socket by port */
 96			if (pn_port(pn->sobject) != pn_port(obj))
 97				continue;
 98		} else {
 99			/* If port is zero, look up by resource */
100			if (pn->resource != res)
101				continue;
102		}
103		if (pn_addr(pn->sobject) &&
104		    pn_addr(pn->sobject) != pn_addr(obj))
105			continue;
106
107		rval = sknode;
108		sock_hold(sknode);
109		break;
110	}
111	rcu_read_unlock();
112
113	return rval;
114}
115
116/* Deliver a broadcast packet (only in bottom-half) */
117void pn_deliver_sock_broadcast(struct net *net, struct sk_buff *skb)
118{
119	struct hlist_head *hlist = pnsocks.hlist;
120	unsigned int h;
121
122	rcu_read_lock();
123	for (h = 0; h < PN_HASHSIZE; h++) {
124		struct sock *sknode;
125
126		sk_for_each(sknode, hlist) {
127			struct sk_buff *clone;
128
129			if (!net_eq(sock_net(sknode), net))
130				continue;
131			if (!sock_flag(sknode, SOCK_BROADCAST))
132				continue;
133
134			clone = skb_clone(skb, GFP_ATOMIC);
135			if (clone) {
136				sock_hold(sknode);
137				sk_receive_skb(sknode, clone, 0);
138			}
139		}
140		hlist++;
141	}
142	rcu_read_unlock();
143}
144
145int pn_sock_hash(struct sock *sk)
146{
147	struct hlist_head *hlist = pn_hash_list(pn_sk(sk)->sobject);
148
149	mutex_lock(&pnsocks.lock);
150	sk_add_node_rcu(sk, hlist);
151	mutex_unlock(&pnsocks.lock);
152
153	return 0;
154}
155EXPORT_SYMBOL(pn_sock_hash);
156
157void pn_sock_unhash(struct sock *sk)
158{
159	mutex_lock(&pnsocks.lock);
160	sk_del_node_init_rcu(sk);
161	mutex_unlock(&pnsocks.lock);
162	pn_sock_unbind_all_res(sk);
163	synchronize_rcu();
164}
165EXPORT_SYMBOL(pn_sock_unhash);
166
167static DEFINE_MUTEX(port_mutex);
168
169static int pn_socket_bind(struct socket *sock, struct sockaddr *addr, int len)
170{
171	struct sock *sk = sock->sk;
172	struct pn_sock *pn = pn_sk(sk);
173	struct sockaddr_pn *spn = (struct sockaddr_pn *)addr;
174	int err;
175	u16 handle;
176	u8 saddr;
177
178	if (sk->sk_prot->bind)
179		return sk->sk_prot->bind(sk, addr, len);
180
181	if (len < sizeof(struct sockaddr_pn))
182		return -EINVAL;
183	if (spn->spn_family != AF_PHONET)
184		return -EAFNOSUPPORT;
185
186	handle = pn_sockaddr_get_object((struct sockaddr_pn *)addr);
187	saddr = pn_addr(handle);
188	if (saddr && phonet_address_lookup(sock_net(sk), saddr))
189		return -EADDRNOTAVAIL;
190
191	lock_sock(sk);
192	if (sk->sk_state != TCP_CLOSE || pn_port(pn->sobject)) {
193		err = -EINVAL; /* attempt to rebind */
194		goto out;
195	}
196	WARN_ON(sk_hashed(sk));
197	mutex_lock(&port_mutex);
198	err = sk->sk_prot->get_port(sk, pn_port(handle));
199	if (err)
200		goto out_port;
201
202	/* get_port() sets the port, bind() sets the address if applicable */
203	pn->sobject = pn_object(saddr, pn_port(pn->sobject));
204	pn->resource = spn->spn_resource;
205
206	/* Enable RX on the socket */
207	err = sk->sk_prot->hash(sk);
208out_port:
209	mutex_unlock(&port_mutex);
210out:
211	release_sock(sk);
212	return err;
213}
214
215static int pn_socket_autobind(struct socket *sock)
216{
217	struct sockaddr_pn sa;
218	int err;
219
220	memset(&sa, 0, sizeof(sa));
221	sa.spn_family = AF_PHONET;
222	err = pn_socket_bind(sock, (struct sockaddr *)&sa,
223				sizeof(struct sockaddr_pn));
224	if (err != -EINVAL)
225		return err;
226	BUG_ON(!pn_port(pn_sk(sock->sk)->sobject));
227	return 0; /* socket was already bound */
228}
229
230static int pn_socket_connect(struct socket *sock, struct sockaddr *addr,
231		int len, int flags)
232{
233	struct sock *sk = sock->sk;
234	struct pn_sock *pn = pn_sk(sk);
235	struct sockaddr_pn *spn = (struct sockaddr_pn *)addr;
236	struct task_struct *tsk = current;
237	long timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
238	int err;
239
240	if (pn_socket_autobind(sock))
241		return -ENOBUFS;
242	if (len < sizeof(struct sockaddr_pn))
243		return -EINVAL;
244	if (spn->spn_family != AF_PHONET)
245		return -EAFNOSUPPORT;
246
247	lock_sock(sk);
248
249	switch (sock->state) {
250	case SS_UNCONNECTED:
251		if (sk->sk_state != TCP_CLOSE) {
252			err = -EISCONN;
253			goto out;
254		}
255		break;
256	case SS_CONNECTING:
257		err = -EALREADY;
258		goto out;
259	default:
260		err = -EISCONN;
261		goto out;
262	}
263
264	pn->dobject = pn_sockaddr_get_object(spn);
265	pn->resource = pn_sockaddr_get_resource(spn);
266	sock->state = SS_CONNECTING;
267
268	err = sk->sk_prot->connect(sk, addr, len);
269	if (err) {
270		sock->state = SS_UNCONNECTED;
271		pn->dobject = 0;
272		goto out;
273	}
274
275	while (sk->sk_state == TCP_SYN_SENT) {
276		DEFINE_WAIT(wait);
277
278		if (!timeo) {
279			err = -EINPROGRESS;
280			goto out;
281		}
282		if (signal_pending(tsk)) {
283			err = sock_intr_errno(timeo);
284			goto out;
285		}
286
287		prepare_to_wait_exclusive(sk_sleep(sk), &wait,
288						TASK_INTERRUPTIBLE);
289		release_sock(sk);
290		timeo = schedule_timeout(timeo);
291		lock_sock(sk);
292		finish_wait(sk_sleep(sk), &wait);
293	}
294
295	if ((1 << sk->sk_state) & (TCPF_SYN_RECV|TCPF_ESTABLISHED))
296		err = 0;
297	else if (sk->sk_state == TCP_CLOSE_WAIT)
298		err = -ECONNRESET;
299	else
300		err = -ECONNREFUSED;
301	sock->state = err ? SS_UNCONNECTED : SS_CONNECTED;
302out:
303	release_sock(sk);
304	return err;
305}
306
307static int pn_socket_accept(struct socket *sock, struct socket *newsock,
308			    int flags, bool kern)
309{
310	struct sock *sk = sock->sk;
311	struct sock *newsk;
312	int err;
313
314	if (unlikely(sk->sk_state != TCP_LISTEN))
315		return -EINVAL;
316
317	newsk = sk->sk_prot->accept(sk, flags, &err, kern);
318	if (!newsk)
319		return err;
320
321	lock_sock(newsk);
322	sock_graft(newsk, newsock);
323	newsock->state = SS_CONNECTED;
324	release_sock(newsk);
325	return 0;
326}
327
328static int pn_socket_getname(struct socket *sock, struct sockaddr *addr,
329				int peer)
330{
331	struct sock *sk = sock->sk;
332	struct pn_sock *pn = pn_sk(sk);
333
334	memset(addr, 0, sizeof(struct sockaddr_pn));
335	addr->sa_family = AF_PHONET;
336	if (!peer) /* Race with bind() here is userland's problem. */
337		pn_sockaddr_set_object((struct sockaddr_pn *)addr,
338					pn->sobject);
339
340	return sizeof(struct sockaddr_pn);
341}
342
343static __poll_t pn_socket_poll(struct file *file, struct socket *sock,
344					poll_table *wait)
345{
346	struct sock *sk = sock->sk;
347	struct pep_sock *pn = pep_sk(sk);
348	__poll_t mask = 0;
349
350	poll_wait(file, sk_sleep(sk), wait);
351
352	if (sk->sk_state == TCP_CLOSE)
353		return EPOLLERR;
354	if (!skb_queue_empty(&sk->sk_receive_queue))
355		mask |= EPOLLIN | EPOLLRDNORM;
356	if (!skb_queue_empty(&pn->ctrlreq_queue))
357		mask |= EPOLLPRI;
358	if (!mask && sk->sk_state == TCP_CLOSE_WAIT)
359		return EPOLLHUP;
360
361	if (sk->sk_state == TCP_ESTABLISHED &&
362		refcount_read(&sk->sk_wmem_alloc) < sk->sk_sndbuf &&
363		atomic_read(&pn->tx_credits))
364		mask |= EPOLLOUT | EPOLLWRNORM | EPOLLWRBAND;
365
366	return mask;
367}
368
369static int pn_socket_ioctl(struct socket *sock, unsigned int cmd,
370				unsigned long arg)
371{
372	struct sock *sk = sock->sk;
373	struct pn_sock *pn = pn_sk(sk);
374
375	if (cmd == SIOCPNGETOBJECT) {
376		struct net_device *dev;
377		u16 handle;
378		u8 saddr;
379
380		if (get_user(handle, (__u16 __user *)arg))
381			return -EFAULT;
382
383		lock_sock(sk);
384		if (sk->sk_bound_dev_if)
385			dev = dev_get_by_index(sock_net(sk),
386						sk->sk_bound_dev_if);
387		else
388			dev = phonet_device_get(sock_net(sk));
389		if (dev && (dev->flags & IFF_UP))
390			saddr = phonet_address_get(dev, pn_addr(handle));
391		else
392			saddr = PN_NO_ADDR;
393		release_sock(sk);
394
395		if (dev)
396			dev_put(dev);
397		if (saddr == PN_NO_ADDR)
398			return -EHOSTUNREACH;
399
400		handle = pn_object(saddr, pn_port(pn->sobject));
401		return put_user(handle, (__u16 __user *)arg);
402	}
403
404	return sk->sk_prot->ioctl(sk, cmd, arg);
405}
406
407static int pn_socket_listen(struct socket *sock, int backlog)
408{
409	struct sock *sk = sock->sk;
410	int err = 0;
411
412	if (pn_socket_autobind(sock))
413		return -ENOBUFS;
414
415	lock_sock(sk);
416	if (sock->state != SS_UNCONNECTED) {
417		err = -EINVAL;
418		goto out;
419	}
420
421	if (sk->sk_state != TCP_LISTEN) {
422		sk->sk_state = TCP_LISTEN;
423		sk->sk_ack_backlog = 0;
424	}
425	sk->sk_max_ack_backlog = backlog;
426out:
427	release_sock(sk);
428	return err;
429}
430
431static int pn_socket_sendmsg(struct socket *sock, struct msghdr *m,
432			     size_t total_len)
433{
434	struct sock *sk = sock->sk;
435
436	if (pn_socket_autobind(sock))
437		return -EAGAIN;
438
439	return sk->sk_prot->sendmsg(sk, m, total_len);
440}
441
442const struct proto_ops phonet_dgram_ops = {
443	.family		= AF_PHONET,
444	.owner		= THIS_MODULE,
445	.release	= pn_socket_release,
446	.bind		= pn_socket_bind,
447	.connect	= sock_no_connect,
448	.socketpair	= sock_no_socketpair,
449	.accept		= sock_no_accept,
450	.getname	= pn_socket_getname,
451	.poll		= datagram_poll,
452	.ioctl		= pn_socket_ioctl,
453	.listen		= sock_no_listen,
454	.shutdown	= sock_no_shutdown,
455	.setsockopt	= sock_no_setsockopt,
456	.getsockopt	= sock_no_getsockopt,
457#ifdef CONFIG_COMPAT
458	.compat_setsockopt = sock_no_setsockopt,
459	.compat_getsockopt = sock_no_getsockopt,
460#endif
461	.sendmsg	= pn_socket_sendmsg,
462	.recvmsg	= sock_common_recvmsg,
463	.mmap		= sock_no_mmap,
464	.sendpage	= sock_no_sendpage,
465};
466
467const struct proto_ops phonet_stream_ops = {
468	.family		= AF_PHONET,
469	.owner		= THIS_MODULE,
470	.release	= pn_socket_release,
471	.bind		= pn_socket_bind,
472	.connect	= pn_socket_connect,
473	.socketpair	= sock_no_socketpair,
474	.accept		= pn_socket_accept,
475	.getname	= pn_socket_getname,
476	.poll		= pn_socket_poll,
477	.ioctl		= pn_socket_ioctl,
478	.listen		= pn_socket_listen,
479	.shutdown	= sock_no_shutdown,
480	.setsockopt	= sock_common_setsockopt,
481	.getsockopt	= sock_common_getsockopt,
482#ifdef CONFIG_COMPAT
483	.compat_setsockopt = compat_sock_common_setsockopt,
484	.compat_getsockopt = compat_sock_common_getsockopt,
485#endif
486	.sendmsg	= pn_socket_sendmsg,
487	.recvmsg	= sock_common_recvmsg,
488	.mmap		= sock_no_mmap,
489	.sendpage	= sock_no_sendpage,
490};
491EXPORT_SYMBOL(phonet_stream_ops);
492
493/* allocate port for a socket */
494int pn_sock_get_port(struct sock *sk, unsigned short sport)
495{
496	static int port_cur;
497	struct net *net = sock_net(sk);
498	struct pn_sock *pn = pn_sk(sk);
499	struct sockaddr_pn try_sa;
500	struct sock *tmpsk;
501
502	memset(&try_sa, 0, sizeof(struct sockaddr_pn));
503	try_sa.spn_family = AF_PHONET;
504	WARN_ON(!mutex_is_locked(&port_mutex));
505	if (!sport) {
506		/* search free port */
507		int port, pmin, pmax;
508
509		phonet_get_local_port_range(&pmin, &pmax);
510		for (port = pmin; port <= pmax; port++) {
511			port_cur++;
512			if (port_cur < pmin || port_cur > pmax)
513				port_cur = pmin;
514
515			pn_sockaddr_set_port(&try_sa, port_cur);
516			tmpsk = pn_find_sock_by_sa(net, &try_sa);
517			if (tmpsk == NULL) {
518				sport = port_cur;
519				goto found;
520			} else
521				sock_put(tmpsk);
522		}
523	} else {
524		/* try to find specific port */
525		pn_sockaddr_set_port(&try_sa, sport);
526		tmpsk = pn_find_sock_by_sa(net, &try_sa);
527		if (tmpsk == NULL)
528			/* No sock there! We can use that port... */
529			goto found;
530		else
531			sock_put(tmpsk);
532	}
533	/* the port must be in use already */
534	return -EADDRINUSE;
535
536found:
537	pn->sobject = pn_object(pn_addr(pn->sobject), sport);
538	return 0;
539}
540EXPORT_SYMBOL(pn_sock_get_port);
541
542#ifdef CONFIG_PROC_FS
543static struct sock *pn_sock_get_idx(struct seq_file *seq, loff_t pos)
544{
545	struct net *net = seq_file_net(seq);
546	struct hlist_head *hlist = pnsocks.hlist;
547	struct sock *sknode;
548	unsigned int h;
549
550	for (h = 0; h < PN_HASHSIZE; h++) {
551		sk_for_each_rcu(sknode, hlist) {
552			if (!net_eq(net, sock_net(sknode)))
553				continue;
554			if (!pos)
555				return sknode;
556			pos--;
557		}
558		hlist++;
559	}
560	return NULL;
561}
562
563static struct sock *pn_sock_get_next(struct seq_file *seq, struct sock *sk)
564{
565	struct net *net = seq_file_net(seq);
566
567	do
568		sk = sk_next(sk);
569	while (sk && !net_eq(net, sock_net(sk)));
570
571	return sk;
572}
573
574static void *pn_sock_seq_start(struct seq_file *seq, loff_t *pos)
575	__acquires(rcu)
576{
577	rcu_read_lock();
578	return *pos ? pn_sock_get_idx(seq, *pos - 1) : SEQ_START_TOKEN;
579}
580
581static void *pn_sock_seq_next(struct seq_file *seq, void *v, loff_t *pos)
582{
583	struct sock *sk;
584
585	if (v == SEQ_START_TOKEN)
586		sk = pn_sock_get_idx(seq, 0);
587	else
588		sk = pn_sock_get_next(seq, v);
589	(*pos)++;
590	return sk;
591}
592
593static void pn_sock_seq_stop(struct seq_file *seq, void *v)
594	__releases(rcu)
595{
596	rcu_read_unlock();
597}
598
599static int pn_sock_seq_show(struct seq_file *seq, void *v)
600{
601	seq_setwidth(seq, 127);
602	if (v == SEQ_START_TOKEN)
603		seq_puts(seq, "pt  loc  rem rs st tx_queue rx_queue "
604			"  uid inode ref pointer drops");
605	else {
606		struct sock *sk = v;
607		struct pn_sock *pn = pn_sk(sk);
608
609		seq_printf(seq, "%2d %04X:%04X:%02X %02X %08X:%08X %5d %lu "
610			"%d %pK %d",
611			sk->sk_protocol, pn->sobject, pn->dobject,
612			pn->resource, sk->sk_state,
613			sk_wmem_alloc_get(sk), sk_rmem_alloc_get(sk),
614			from_kuid_munged(seq_user_ns(seq), sock_i_uid(sk)),
615			sock_i_ino(sk),
616			refcount_read(&sk->sk_refcnt), sk,
617			atomic_read(&sk->sk_drops));
618	}
619	seq_pad(seq, '\n');
620	return 0;
621}
622
623static const struct seq_operations pn_sock_seq_ops = {
624	.start = pn_sock_seq_start,
625	.next = pn_sock_seq_next,
626	.stop = pn_sock_seq_stop,
627	.show = pn_sock_seq_show,
628};
629
630static int pn_sock_open(struct inode *inode, struct file *file)
631{
632	return seq_open_net(inode, file, &pn_sock_seq_ops,
633				sizeof(struct seq_net_private));
634}
635
636const struct file_operations pn_sock_seq_fops = {
637	.open = pn_sock_open,
638	.read = seq_read,
639	.llseek = seq_lseek,
640	.release = seq_release_net,
641};
642#endif
643
644static struct  {
645	struct sock *sk[256];
646} pnres;
647
648/*
649 * Find and hold socket based on resource.
650 */
651struct sock *pn_find_sock_by_res(struct net *net, u8 res)
652{
653	struct sock *sk;
654
655	if (!net_eq(net, &init_net))
656		return NULL;
657
658	rcu_read_lock();
659	sk = rcu_dereference(pnres.sk[res]);
660	if (sk)
661		sock_hold(sk);
662	rcu_read_unlock();
663	return sk;
664}
665
666static DEFINE_MUTEX(resource_mutex);
667
668int pn_sock_bind_res(struct sock *sk, u8 res)
669{
670	int ret = -EADDRINUSE;
671
672	if (!net_eq(sock_net(sk), &init_net))
673		return -ENOIOCTLCMD;
674	if (!capable(CAP_SYS_ADMIN))
675		return -EPERM;
676	if (pn_socket_autobind(sk->sk_socket))
677		return -EAGAIN;
678
679	mutex_lock(&resource_mutex);
680	if (pnres.sk[res] == NULL) {
681		sock_hold(sk);
682		rcu_assign_pointer(pnres.sk[res], sk);
683		ret = 0;
684	}
685	mutex_unlock(&resource_mutex);
686	return ret;
687}
688
689int pn_sock_unbind_res(struct sock *sk, u8 res)
690{
691	int ret = -ENOENT;
692
693	if (!capable(CAP_SYS_ADMIN))
694		return -EPERM;
695
696	mutex_lock(&resource_mutex);
697	if (pnres.sk[res] == sk) {
698		RCU_INIT_POINTER(pnres.sk[res], NULL);
699		ret = 0;
700	}
701	mutex_unlock(&resource_mutex);
702
703	if (ret == 0) {
704		synchronize_rcu();
705		sock_put(sk);
706	}
707	return ret;
708}
709
710void pn_sock_unbind_all_res(struct sock *sk)
711{
712	unsigned int res, match = 0;
713
714	mutex_lock(&resource_mutex);
715	for (res = 0; res < 256; res++) {
716		if (pnres.sk[res] == sk) {
717			RCU_INIT_POINTER(pnres.sk[res], NULL);
718			match++;
719		}
720	}
721	mutex_unlock(&resource_mutex);
722
723	while (match > 0) {
724		__sock_put(sk);
725		match--;
726	}
727	/* Caller is responsible for RCU sync before final sock_put() */
728}
729
730#ifdef CONFIG_PROC_FS
731static struct sock **pn_res_get_idx(struct seq_file *seq, loff_t pos)
732{
733	struct net *net = seq_file_net(seq);
734	unsigned int i;
735
736	if (!net_eq(net, &init_net))
737		return NULL;
738
739	for (i = 0; i < 256; i++) {
740		if (pnres.sk[i] == NULL)
741			continue;
742		if (!pos)
743			return pnres.sk + i;
744		pos--;
745	}
746	return NULL;
747}
748
749static struct sock **pn_res_get_next(struct seq_file *seq, struct sock **sk)
750{
751	struct net *net = seq_file_net(seq);
752	unsigned int i;
753
754	BUG_ON(!net_eq(net, &init_net));
755
756	for (i = (sk - pnres.sk) + 1; i < 256; i++)
757		if (pnres.sk[i])
758			return pnres.sk + i;
759	return NULL;
760}
761
762static void *pn_res_seq_start(struct seq_file *seq, loff_t *pos)
763	__acquires(resource_mutex)
764{
765	mutex_lock(&resource_mutex);
766	return *pos ? pn_res_get_idx(seq, *pos - 1) : SEQ_START_TOKEN;
767}
768
769static void *pn_res_seq_next(struct seq_file *seq, void *v, loff_t *pos)
770{
771	struct sock **sk;
772
773	if (v == SEQ_START_TOKEN)
774		sk = pn_res_get_idx(seq, 0);
775	else
776		sk = pn_res_get_next(seq, v);
777	(*pos)++;
778	return sk;
779}
780
781static void pn_res_seq_stop(struct seq_file *seq, void *v)
782	__releases(resource_mutex)
783{
784	mutex_unlock(&resource_mutex);
785}
786
787static int pn_res_seq_show(struct seq_file *seq, void *v)
788{
789	seq_setwidth(seq, 63);
790	if (v == SEQ_START_TOKEN)
791		seq_puts(seq, "rs   uid inode");
792	else {
793		struct sock **psk = v;
794		struct sock *sk = *psk;
795
796		seq_printf(seq, "%02X %5u %lu",
797			   (int) (psk - pnres.sk),
798			   from_kuid_munged(seq_user_ns(seq), sock_i_uid(sk)),
799			   sock_i_ino(sk));
800	}
801	seq_pad(seq, '\n');
802	return 0;
803}
804
805static const struct seq_operations pn_res_seq_ops = {
806	.start = pn_res_seq_start,
807	.next = pn_res_seq_next,
808	.stop = pn_res_seq_stop,
809	.show = pn_res_seq_show,
810};
811
812static int pn_res_open(struct inode *inode, struct file *file)
813{
814	return seq_open_net(inode, file, &pn_res_seq_ops,
815				sizeof(struct seq_net_private));
816}
817
818const struct file_operations pn_res_seq_fops = {
819	.open = pn_res_open,
820	.read = seq_read,
821	.llseek = seq_lseek,
822	.release = seq_release_net,
823};
824#endif