xref: /netbsd-src/sys/kern/uipc_socket2.c (revision 62bee434bcfed81d36d05693bf87fe350107864a)
1 /*	$NetBSD: uipc_socket2.c,v 1.147 2024/12/07 02:31:14 riastradh Exp $	*/
2 
3 /*-
4  * Copyright (c) 2008 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  * POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 /*
30  * Copyright (c) 1982, 1986, 1988, 1990, 1993
31  *	The Regents of the University of California.  All rights reserved.
32  *
33  * Redistribution and use in source and binary forms, with or without
34  * modification, are permitted provided that the following conditions
35  * are met:
36  * 1. Redistributions of source code must retain the above copyright
37  *    notice, this list of conditions and the following disclaimer.
38  * 2. Redistributions in binary form must reproduce the above copyright
39  *    notice, this list of conditions and the following disclaimer in the
40  *    documentation and/or other materials provided with the distribution.
41  * 3. Neither the name of the University nor the names of its contributors
42  *    may be used to endorse or promote products derived from this software
43  *    without specific prior written permission.
44  *
45  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
46  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
47  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
48  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
49  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
50  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
51  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
52  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
53  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
54  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
55  * SUCH DAMAGE.
56  *
57  *	@(#)uipc_socket2.c	8.2 (Berkeley) 2/14/95
58  */
59 
60 #include <sys/cdefs.h>
61 __KERNEL_RCSID(0, "$NetBSD: uipc_socket2.c,v 1.147 2024/12/07 02:31:14 riastradh Exp $");
62 
63 #ifdef _KERNEL_OPT
64 #include "opt_ddb.h"
65 #include "opt_inet.h"
66 #include "opt_mbuftrace.h"
67 #include "opt_sb_max.h"
68 #endif
69 
70 #include <sys/param.h>
71 #include <sys/types.h>
72 
73 #include <sys/buf.h>
74 #include <sys/domain.h>
75 #include <sys/file.h>
76 #include <sys/kauth.h>
77 #include <sys/mbuf.h>
78 #include <sys/poll.h>
79 #include <sys/pool.h>
80 #include <sys/proc.h>
81 #include <sys/protosw.h>
82 #include <sys/sdt.h>
83 #include <sys/signalvar.h>
84 #include <sys/socket.h>
85 #include <sys/socketvar.h>
86 #include <sys/systm.h>
87 #include <sys/uidinfo.h>
88 
89 #ifdef DDB
90 #include <sys/filedesc.h>
91 #include <ddb/db_active.h>
92 #endif
93 
94 /*
95  * Primitive routines for operating on sockets and socket buffers.
96  *
97  * Connection life-cycle:
98  *
99  *	Normal sequence from the active (originating) side:
100  *
101  *	- soisconnecting() is called during processing of connect() call,
102  *	- resulting in an eventual call to soisconnected() if/when the
103  *	  connection is established.
104  *
105  *	When the connection is torn down during processing of disconnect():
106  *
107  *	- soisdisconnecting() is called and,
108  *	- soisdisconnected() is called when the connection to the peer
109  *	  is totally severed.
110  *
111  *	The semantics of these routines are such that connectionless protocols
112  *	can call soisconnected() and soisdisconnected() only, bypassing the
113  *	in-progress calls when setting up a ``connection'' takes no time.
114  *
115  *	From the passive side, a socket is created with two queues of sockets:
116  *
117  *	- so_q0 (0) for partial connections (i.e. connections in progress)
118  *	- so_q (1) for connections already made and awaiting user acceptance.
119  *
120  *	As a protocol is preparing incoming connections, it creates a socket
121  *	structure queued on so_q0 by calling sonewconn().  When the connection
122  *	is established, soisconnected() is called, and transfers the
123  *	socket structure to so_q, making it available to accept().
124  *
125  *	If a socket is closed with sockets on either so_q0 or so_q, these
126  *	sockets are dropped.
127  *
128  * Locking rules and assumptions:
129  *
130  * o socket::so_lock can change on the fly.  The low level routines used
131  *   to lock sockets are aware of this.  When so_lock is acquired, the
132  *   routine locking must check to see if so_lock still points to the
133  *   lock that was acquired.  If so_lock has changed in the meantime, the
134  *   now irrelevant lock that was acquired must be dropped and the lock
135  *   operation retried.  Although not proven here, this is completely safe
136  *   on a multiprocessor system, even with relaxed memory ordering, given
137  *   the next two rules:
138  *
139  * o In order to mutate so_lock, the lock pointed to by the current value
140  *   of so_lock must be held: i.e., the socket must be held locked by the
141  *   changing thread.  The thread must issue membar_release() to prevent
142  *   memory accesses being reordered, and can set so_lock to the desired
143  *   value.  If the lock pointed to by the new value of so_lock is not
144  *   held by the changing thread, the socket must then be considered
145  *   unlocked.
146  *
147  * o If so_lock is mutated, and the previous lock referred to by so_lock
148  *   could still be visible to other threads in the system (e.g. via file
149  *   descriptor or protocol-internal reference), then the old lock must
150  *   remain valid until the socket and/or protocol control block has been
151  *   torn down.
152  *
153  * o If a socket has a non-NULL so_head value (i.e. is in the process of
154  *   connecting), then locking the socket must also lock the socket pointed
155  *   to by so_head: their lock pointers must match.
156  *
157  * o If a socket has connections in progress (so_q, so_q0 not empty) then
158  *   locking the socket must also lock the sockets attached to both queues.
159  *   Again, their lock pointers must match.
160  *
161  * o Beyond the initial lock assignment in socreate(), assigning locks to
162  *   sockets is the responsibility of the individual protocols / protocol
163  *   domains.
164  */
165 
166 static pool_cache_t	socket_cache;
167 u_long			sb_max = SB_MAX;/* maximum socket buffer size */
168 static u_long		sb_max_adj;	/* adjusted sb_max */
169 
170 void
171 soisconnecting(struct socket *so)
172 {
173 
174 	KASSERT(solocked(so));
175 
176 	so->so_state &= ~(SS_ISCONNECTED|SS_ISDISCONNECTING);
177 	so->so_state |= SS_ISCONNECTING;
178 }
179 
180 void
181 soisconnected(struct socket *so)
182 {
183 	struct socket	*head;
184 
185 	head = so->so_head;
186 
187 	KASSERT(solocked(so));
188 	KASSERT(head == NULL || solocked2(so, head));
189 
190 	so->so_state &= ~(SS_ISCONNECTING | SS_ISDISCONNECTING);
191 	so->so_state |= SS_ISCONNECTED;
192 	if (head && so->so_onq == &head->so_q0) {
193 		if ((so->so_options & SO_ACCEPTFILTER) == 0) {
194 			/*
195 			 * Re-enqueue and wake up any waiters, e.g.
196 			 * processes blocking on accept().
197 			 */
198 			soqremque(so, 0);
199 			soqinsque(head, so, 1);
200 			sorwakeup(head);
201 			cv_broadcast(&head->so_cv);
202 		} else {
203 			so->so_upcall =
204 			    head->so_accf->so_accept_filter->accf_callback;
205 			so->so_upcallarg = head->so_accf->so_accept_filter_arg;
206 			so->so_rcv.sb_flags |= SB_UPCALL;
207 			so->so_options &= ~SO_ACCEPTFILTER;
208 			(*so->so_upcall)(so, so->so_upcallarg,
209 					 POLLIN|POLLRDNORM, M_DONTWAIT);
210 		}
211 	} else {
212 		cv_broadcast(&so->so_cv);
213 		sorwakeup(so);
214 		sowwakeup(so);
215 	}
216 }
217 
218 void
219 soisdisconnecting(struct socket *so)
220 {
221 
222 	KASSERT(solocked(so));
223 
224 	so->so_state &= ~SS_ISCONNECTING;
225 	so->so_state |= (SS_ISDISCONNECTING|SS_CANTRCVMORE|SS_CANTSENDMORE);
226 	cv_broadcast(&so->so_cv);
227 	sowwakeup(so);
228 	sorwakeup(so);
229 }
230 
231 void
232 soisdisconnected(struct socket *so)
233 {
234 
235 	KASSERT(solocked(so));
236 
237 	so->so_state &= ~(SS_ISCONNECTING|SS_ISCONNECTED|SS_ISDISCONNECTING);
238 	so->so_state |= (SS_CANTRCVMORE|SS_CANTSENDMORE|SS_ISDISCONNECTED);
239 	cv_broadcast(&so->so_cv);
240 	sowwakeup(so);
241 	sorwakeup(so);
242 }
243 
244 void
245 soinit2(void)
246 {
247 
248 	socket_cache = pool_cache_init(sizeof(struct socket), 0, 0, 0,
249 	    "socket", NULL, IPL_SOFTNET, NULL, NULL, NULL);
250 }
251 
252 /*
253  * sonewconn: accept a new connection.
254  *
255  * When an attempt at a new connection is noted on a socket which accepts
256  * connections, sonewconn(9) is called.  If the connection is possible
257  * (subject to space constraints, etc) then we allocate a new structure,
258  * properly linked into the data structure of the original socket.
259  *
260  * => If 'soready' is true, then socket will become ready for accept() i.e.
261  *    inserted into the so_q queue, SS_ISCONNECTED set and waiters awoken.
262  * => May be called from soft-interrupt context.
263  * => Listening socket should be locked.
264  * => Returns the new socket locked.
265  */
266 struct socket *
267 sonewconn(struct socket *head, bool soready)
268 {
269 	struct socket *so;
270 	int soqueue, error;
271 
272 	KASSERT(solocked(head));
273 
274 	if (head->so_qlen + head->so_q0len > 3 * head->so_qlimit / 2) {
275 		/*
276 		 * Listen queue overflow.  If there is an accept filter
277 		 * active, pass through the oldest cxn it's handling.
278 		 */
279 		if (head->so_accf == NULL) {
280 			return NULL;
281 		} else {
282 			struct socket *so2, *next;
283 
284 			/* Pass the oldest connection waiting in the
285 			   accept filter */
286 			for (so2 = TAILQ_FIRST(&head->so_q0);
287 			     so2 != NULL; so2 = next) {
288 				next = TAILQ_NEXT(so2, so_qe);
289 				if (so2->so_upcall == NULL) {
290 					continue;
291 				}
292 				so2->so_upcall = NULL;
293 				so2->so_upcallarg = NULL;
294 				so2->so_options &= ~SO_ACCEPTFILTER;
295 				so2->so_rcv.sb_flags &= ~SB_UPCALL;
296 				soisconnected(so2);
297 				break;
298 			}
299 
300 			/* If nothing was nudged out of the acept filter, bail
301 			 * out; otherwise proceed allocating the socket. */
302 			if (so2 == NULL) {
303 				return NULL;
304 			}
305 		}
306 	}
307 	if ((head->so_options & SO_ACCEPTFILTER) != 0) {
308 		soready = false;
309 	}
310 	soqueue = soready ? 1 : 0;
311 
312 	if ((so = soget(false)) == NULL) {
313 		return NULL;
314 	}
315 	so->so_type = head->so_type;
316 	so->so_options = head->so_options & ~SO_ACCEPTCONN;
317 	so->so_linger = head->so_linger;
318 	so->so_state = head->so_state | SS_NOFDREF;
319 	so->so_proto = head->so_proto;
320 	so->so_timeo = head->so_timeo;
321 	so->so_pgid = head->so_pgid;
322 	so->so_send = head->so_send;
323 	so->so_receive = head->so_receive;
324 	so->so_uidinfo = head->so_uidinfo;
325 	so->so_egid = head->so_egid;
326 	so->so_cpid = head->so_cpid;
327 
328 	/*
329 	 * Share the lock with the listening-socket, it may get unshared
330 	 * once the connection is complete.
331 	 *
332 	 * so_lock is stable while we hold the socket locked, so no
333 	 * need for atomic_load_* here.
334 	 */
335 	mutex_obj_hold(head->so_lock);
336 	so->so_lock = head->so_lock;
337 
338 	/*
339 	 * Reserve the space for socket buffers.
340 	 */
341 #ifdef MBUFTRACE
342 	so->so_mowner = head->so_mowner;
343 	so->so_rcv.sb_mowner = head->so_rcv.sb_mowner;
344 	so->so_snd.sb_mowner = head->so_snd.sb_mowner;
345 #endif
346 	if (soreserve(so, head->so_snd.sb_hiwat, head->so_rcv.sb_hiwat)) {
347 		goto out;
348 	}
349 	so->so_snd.sb_lowat = head->so_snd.sb_lowat;
350 	so->so_rcv.sb_lowat = head->so_rcv.sb_lowat;
351 	so->so_rcv.sb_timeo = head->so_rcv.sb_timeo;
352 	so->so_snd.sb_timeo = head->so_snd.sb_timeo;
353 	so->so_rcv.sb_flags |= head->so_rcv.sb_flags & (SB_AUTOSIZE | SB_ASYNC);
354 	so->so_snd.sb_flags |= head->so_snd.sb_flags & (SB_AUTOSIZE | SB_ASYNC);
355 
356 	/*
357 	 * Finally, perform the protocol attach.  Note: a new socket
358 	 * lock may be assigned at this point (if so, it will be held).
359 	 */
360 	error = (*so->so_proto->pr_usrreqs->pr_attach)(so, 0);
361 	if (error) {
362 out:
363 		KASSERT(solocked(so));
364 		KASSERT(so->so_accf == NULL);
365 		soput(so);
366 
367 		/* Note: the listening socket shall stay locked. */
368 		KASSERT(solocked(head));
369 		return NULL;
370 	}
371 	KASSERT(solocked2(head, so));
372 
373 	/*
374 	 * Insert into the queue.  If ready, update the connection status
375 	 * and wake up any waiters, e.g. processes blocking on accept().
376 	 */
377 	soqinsque(head, so, soqueue);
378 	if (soready) {
379 		so->so_state |= SS_ISCONNECTED;
380 		sorwakeup(head);
381 		cv_broadcast(&head->so_cv);
382 	}
383 	return so;
384 }
385 
386 struct socket *
387 soget(bool waitok)
388 {
389 	struct socket *so;
390 
391 	so = pool_cache_get(socket_cache, (waitok ? PR_WAITOK : PR_NOWAIT));
392 	if (__predict_false(so == NULL))
393 		return (NULL);
394 	memset(so, 0, sizeof(*so));
395 	TAILQ_INIT(&so->so_q0);
396 	TAILQ_INIT(&so->so_q);
397 	cv_init(&so->so_cv, "socket");
398 	cv_init(&so->so_rcv.sb_cv, "netio");
399 	cv_init(&so->so_snd.sb_cv, "netio");
400 	selinit(&so->so_rcv.sb_sel);
401 	selinit(&so->so_snd.sb_sel);
402 	so->so_rcv.sb_so = so;
403 	so->so_snd.sb_so = so;
404 	return so;
405 }
406 
407 void
408 soput(struct socket *so)
409 {
410 
411 	KASSERT(!cv_has_waiters(&so->so_cv));
412 	KASSERT(!cv_has_waiters(&so->so_rcv.sb_cv));
413 	KASSERT(!cv_has_waiters(&so->so_snd.sb_cv));
414 	seldestroy(&so->so_rcv.sb_sel);
415 	seldestroy(&so->so_snd.sb_sel);
416 	mutex_obj_free(so->so_lock);
417 	cv_destroy(&so->so_cv);
418 	cv_destroy(&so->so_rcv.sb_cv);
419 	cv_destroy(&so->so_snd.sb_cv);
420 	pool_cache_put(socket_cache, so);
421 }
422 
423 /*
424  * soqinsque: insert socket of a new connection into the specified
425  * accept queue of the listening socket (head).
426  *
427  *	q = 0: queue of partial connections
428  *	q = 1: queue of incoming connections
429  */
430 void
431 soqinsque(struct socket *head, struct socket *so, int q)
432 {
433 	KASSERT(q == 0 || q == 1);
434 	KASSERT(solocked2(head, so));
435 	KASSERT(so->so_onq == NULL);
436 	KASSERT(so->so_head == NULL);
437 
438 	so->so_head = head;
439 	if (q == 0) {
440 		head->so_q0len++;
441 		so->so_onq = &head->so_q0;
442 	} else {
443 		head->so_qlen++;
444 		so->so_onq = &head->so_q;
445 	}
446 	TAILQ_INSERT_TAIL(so->so_onq, so, so_qe);
447 }
448 
449 /*
450  * soqremque: remove socket from the specified queue.
451  *
452  * => Returns true if socket was removed from the specified queue.
453  * => False if socket was not removed (because it was in other queue).
454  */
455 bool
456 soqremque(struct socket *so, int q)
457 {
458 	struct socket *head = so->so_head;
459 
460 	KASSERT(q == 0 || q == 1);
461 	KASSERT(solocked(so));
462 	KASSERT(so->so_onq != NULL);
463 	KASSERT(head != NULL);
464 
465 	if (q == 0) {
466 		if (so->so_onq != &head->so_q0)
467 			return false;
468 		head->so_q0len--;
469 	} else {
470 		if (so->so_onq != &head->so_q)
471 			return false;
472 		head->so_qlen--;
473 	}
474 	KASSERT(solocked2(so, head));
475 	TAILQ_REMOVE(so->so_onq, so, so_qe);
476 	so->so_onq = NULL;
477 	so->so_head = NULL;
478 	return true;
479 }
480 
481 /*
482  * socantsendmore: indicates that no more data will be sent on the
483  * socket; it would normally be applied to a socket when the user
484  * informs the system that no more data is to be sent, by the protocol
485  * code (in case pr_shutdown()).
486  */
487 void
488 socantsendmore(struct socket *so)
489 {
490 	KASSERT(solocked(so));
491 
492 	so->so_state |= SS_CANTSENDMORE;
493 	sowwakeup(so);
494 }
495 
496 /*
497  * socantrcvmore(): indicates that no more data will be received and
498  * will normally be applied to the socket by a protocol when it detects
499  * that the peer will send no more data.  Data queued for reading in
500  * the socket may yet be read.
501  */
502 void
503 socantrcvmore(struct socket *so)
504 {
505 	KASSERT(solocked(so));
506 
507 	so->so_state |= SS_CANTRCVMORE;
508 	sorwakeup(so);
509 }
510 
511 /*
512  * soroverflow(): indicates that data was attempted to be sent
513  * but the receiving buffer overflowed.
514  */
515 void
516 soroverflow(struct socket *so)
517 {
518 	KASSERT(solocked(so));
519 
520 	so->so_rcv.sb_overflowed++;
521 	if (so->so_options & SO_RERROR)  {
522 		so->so_rerror = SET_ERROR(ENOBUFS);
523 		sorwakeup(so);
524 	}
525 }
526 
527 /*
528  * Wait for data to arrive at/drain from a socket buffer.
529  */
530 int
531 sbwait(struct sockbuf *sb)
532 {
533 	struct socket *so;
534 	kmutex_t *lock;
535 	int error;
536 
537 	so = sb->sb_so;
538 
539 	KASSERT(solocked(so));
540 
541 	sb->sb_flags |= SB_NOTIFY;
542 	lock = so->so_lock;
543 	if ((sb->sb_flags & SB_NOINTR) != 0)
544 		error = cv_timedwait(&sb->sb_cv, lock, sb->sb_timeo);
545 	else
546 		error = cv_timedwait_sig(&sb->sb_cv, lock, sb->sb_timeo);
547 	if (__predict_false(lock != atomic_load_relaxed(&so->so_lock)))
548 		solockretry(so, lock);
549 	return error;
550 }
551 
552 /*
553  * Wakeup processes waiting on a socket buffer.
554  * Do asynchronous notification via SIGIO
555  * if the socket buffer has the SB_ASYNC flag set.
556  */
557 void
558 sowakeup(struct socket *so, struct sockbuf *sb, int code)
559 {
560 	int band;
561 
562 	KASSERT(solocked(so));
563 	KASSERT(sb->sb_so == so);
564 
565 	switch (code) {
566 	case POLL_IN:
567 		band = POLLIN|POLLRDNORM;
568 		break;
569 
570 	case POLL_OUT:
571 		band = POLLOUT|POLLWRNORM;
572 		break;
573 
574 	case POLL_HUP:
575 		band = POLLHUP;
576 		break;
577 
578 	default:
579 		band = 0;
580 #ifdef DIAGNOSTIC
581 		printf("bad siginfo code %d in socket notification.\n", code);
582 #endif
583 		break;
584 	}
585 
586 	sb->sb_flags &= ~SB_NOTIFY;
587 	selnotify(&sb->sb_sel, band, NOTE_SUBMIT);
588 	cv_broadcast(&sb->sb_cv);
589 	if (sb->sb_flags & SB_ASYNC)
590 		fownsignal(so->so_pgid, SIGIO, code, band, so);
591 	if (sb->sb_flags & SB_UPCALL)
592 		(*so->so_upcall)(so, so->so_upcallarg, band, M_DONTWAIT);
593 }
594 
595 /*
596  * Reset a socket's lock pointer.  Wake all threads waiting on the
597  * socket's condition variables so that they can restart their waits
598  * using the new lock.  The existing lock must be held.
599  *
600  * Caller must have issued membar_release before this.
601  */
602 void
603 solockreset(struct socket *so, kmutex_t *lock)
604 {
605 
606 	KASSERT(solocked(so));
607 
608 	so->so_lock = lock;
609 	cv_broadcast(&so->so_snd.sb_cv);
610 	cv_broadcast(&so->so_rcv.sb_cv);
611 	cv_broadcast(&so->so_cv);
612 }
613 
614 /*
615  * Socket buffer (struct sockbuf) utility routines.
616  *
617  * Each socket contains two socket buffers: one for sending data and
618  * one for receiving data.  Each buffer contains a queue of mbufs,
619  * information about the number of mbufs and amount of data in the
620  * queue, and other fields allowing poll() statements and notification
621  * on data availability to be implemented.
622  *
623  * Data stored in a socket buffer is maintained as a list of records.
624  * Each record is a list of mbufs chained together with the m_next
625  * field.  Records are chained together with the m_nextpkt field. The upper
626  * level routine soreceive() expects the following conventions to be
627  * observed when placing information in the receive buffer:
628  *
629  * 1. If the protocol requires each message be preceded by the sender's
630  *    name, then a record containing that name must be present before
631  *    any associated data (mbuf's must be of type MT_SONAME).
632  * 2. If the protocol supports the exchange of ``access rights'' (really
633  *    just additional data associated with the message), and there are
634  *    ``rights'' to be received, then a record containing this data
635  *    should be present (mbuf's must be of type MT_CONTROL).
636  * 3. If a name or rights record exists, then it must be followed by
637  *    a data record, perhaps of zero length.
638  *
639  * Before using a new socket structure it is first necessary to reserve
640  * buffer space to the socket, by calling sbreserve().  This should commit
641  * some of the available buffer space in the system buffer pool for the
642  * socket (currently, it does nothing but enforce limits).  The space
643  * should be released by calling sbrelease() when the socket is destroyed.
644  */
645 
646 int
647 sb_max_set(u_long new_sbmax)
648 {
649 	int s;
650 
651 	if (new_sbmax < (16 * 1024))
652 		return SET_ERROR(EINVAL);
653 
654 	s = splsoftnet();
655 	sb_max = new_sbmax;
656 	sb_max_adj = (u_quad_t)new_sbmax * MCLBYTES / (MSIZE + MCLBYTES);
657 	splx(s);
658 
659 	return (0);
660 }
661 
662 int
663 soreserve(struct socket *so, u_long sndcc, u_long rcvcc)
664 {
665 	KASSERT(so->so_pcb == NULL || solocked(so));
666 
667 	/*
668 	 * there's at least one application (a configure script of screen)
669 	 * which expects a fifo is writable even if it has "some" bytes
670 	 * in its buffer.
671 	 * so we want to make sure (hiwat - lowat) >= (some bytes).
672 	 *
673 	 * PIPE_BUF here is an arbitrary value chosen as (some bytes) above.
674 	 * we expect it's large enough for such applications.
675 	 */
676 	u_long  lowat = MAX(sock_loan_thresh, MCLBYTES);
677 	u_long  hiwat = lowat + PIPE_BUF;
678 
679 	if (sndcc < hiwat)
680 		sndcc = hiwat;
681 	if (sbreserve(&so->so_snd, sndcc, so) == 0)
682 		goto bad;
683 	if (sbreserve(&so->so_rcv, rcvcc, so) == 0)
684 		goto bad2;
685 	if (so->so_rcv.sb_lowat == 0)
686 		so->so_rcv.sb_lowat = 1;
687 	if (so->so_snd.sb_lowat == 0)
688 		so->so_snd.sb_lowat = lowat;
689 	if (so->so_snd.sb_lowat > so->so_snd.sb_hiwat)
690 		so->so_snd.sb_lowat = so->so_snd.sb_hiwat;
691 	return (0);
692  bad2:
693 	sbrelease(&so->so_snd, so);
694  bad:
695 	return SET_ERROR(ENOBUFS);
696 }
697 
698 /*
699  * Allot mbufs to a sockbuf.
700  * Attempt to scale mbmax so that mbcnt doesn't become limiting
701  * if buffering efficiency is near the normal case.
702  */
703 int
704 sbreserve(struct sockbuf *sb, u_long cc, struct socket *so)
705 {
706 	struct lwp *l = curlwp; /* XXX */
707 	rlim_t maxcc;
708 	struct uidinfo *uidinfo;
709 
710 	KASSERT(so->so_pcb == NULL || solocked(so));
711 	KASSERT(sb->sb_so == so);
712 	KASSERT(sb_max_adj != 0);
713 
714 	if (cc == 0 || cc > sb_max_adj)
715 		return (0);
716 
717 	maxcc = l->l_proc->p_rlimit[RLIMIT_SBSIZE].rlim_cur;
718 
719 	uidinfo = so->so_uidinfo;
720 	if (!chgsbsize(uidinfo, &sb->sb_hiwat, cc, maxcc))
721 		return 0;
722 	sb->sb_mbmax = uimin(cc * 2, sb_max);
723 	if (sb->sb_lowat > sb->sb_hiwat)
724 		sb->sb_lowat = sb->sb_hiwat;
725 
726 	return (1);
727 }
728 
729 /*
730  * Free mbufs held by a socket, and reserved mbuf space.  We do not assert
731  * that the socket is held locked here: see sorflush().
732  */
733 void
734 sbrelease(struct sockbuf *sb, struct socket *so)
735 {
736 
737 	KASSERT(sb->sb_so == so);
738 
739 	sbflush(sb);
740 	(void)chgsbsize(so->so_uidinfo, &sb->sb_hiwat, 0, RLIM_INFINITY);
741 	sb->sb_mbmax = 0;
742 }
743 
744 /*
745  * Routines to add and remove
746  * data from an mbuf queue.
747  *
748  * The routines sbappend() or sbappendrecord() are normally called to
749  * append new mbufs to a socket buffer, after checking that adequate
750  * space is available, comparing the function sbspace() with the amount
751  * of data to be added.  sbappendrecord() differs from sbappend() in
752  * that data supplied is treated as the beginning of a new record.
753  * To place a sender's address, optional access rights, and data in a
754  * socket receive buffer, sbappendaddr() should be used.  To place
755  * access rights and data in a socket receive buffer, sbappendrights()
756  * should be used.  In either case, the new data begins a new record.
757  * Note that unlike sbappend() and sbappendrecord(), these routines check
758  * for the caller that there will be enough space to store the data.
759  * Each fails if there is not enough space, or if it cannot find mbufs
760  * to store additional information in.
761  *
762  * Reliable protocols may use the socket send buffer to hold data
763  * awaiting acknowledgement.  Data is normally copied from a socket
764  * send buffer in a protocol with m_copym for output to a peer,
765  * and then removing the data from the socket buffer with sbdrop()
766  * or sbdroprecord() when the data is acknowledged by the peer.
767  */
768 
769 #ifdef SOCKBUF_DEBUG
770 void
771 sblastrecordchk(struct sockbuf *sb, const char *where)
772 {
773 	struct mbuf *m = sb->sb_mb;
774 
775 	KASSERT(solocked(sb->sb_so));
776 
777 	while (m && m->m_nextpkt)
778 		m = m->m_nextpkt;
779 
780 	if (m != sb->sb_lastrecord) {
781 		printf("sblastrecordchk: sb_mb %p sb_lastrecord %p last %p\n",
782 		    sb->sb_mb, sb->sb_lastrecord, m);
783 		printf("packet chain:\n");
784 		for (m = sb->sb_mb; m != NULL; m = m->m_nextpkt)
785 			printf("\t%p\n", m);
786 		panic("sblastrecordchk from %s", where);
787 	}
788 }
789 
790 void
791 sblastmbufchk(struct sockbuf *sb, const char *where)
792 {
793 	struct mbuf *m = sb->sb_mb;
794 	struct mbuf *n;
795 
796 	KASSERT(solocked(sb->sb_so));
797 
798 	while (m && m->m_nextpkt)
799 		m = m->m_nextpkt;
800 
801 	while (m && m->m_next)
802 		m = m->m_next;
803 
804 	if (m != sb->sb_mbtail) {
805 		printf("sblastmbufchk: sb_mb %p sb_mbtail %p last %p\n",
806 		    sb->sb_mb, sb->sb_mbtail, m);
807 		printf("packet tree:\n");
808 		for (m = sb->sb_mb; m != NULL; m = m->m_nextpkt) {
809 			printf("\t");
810 			for (n = m; n != NULL; n = n->m_next)
811 				printf("%p ", n);
812 			printf("\n");
813 		}
814 		panic("sblastmbufchk from %s", where);
815 	}
816 }
817 #endif /* SOCKBUF_DEBUG */
818 
819 /*
820  * Link a chain of records onto a socket buffer
821  */
822 #define	SBLINKRECORDCHAIN(sb, m0, mlast)				\
823 do {									\
824 	if ((sb)->sb_lastrecord != NULL)				\
825 		(sb)->sb_lastrecord->m_nextpkt = (m0);			\
826 	else								\
827 		(sb)->sb_mb = (m0);					\
828 	(sb)->sb_lastrecord = (mlast);					\
829 } while (/*CONSTCOND*/0)
830 
831 
832 #define	SBLINKRECORD(sb, m0)						\
833     SBLINKRECORDCHAIN(sb, m0, m0)
834 
835 /*
836  * Append mbuf chain m to the last record in the
837  * socket buffer sb.  The additional space associated
838  * the mbuf chain is recorded in sb.  Empty mbufs are
839  * discarded and mbufs are compacted where possible.
840  */
841 void
842 sbappend(struct sockbuf *sb, struct mbuf *m)
843 {
844 	struct mbuf	*n;
845 
846 	KASSERT(solocked(sb->sb_so));
847 
848 	if (m == NULL)
849 		return;
850 
851 #ifdef MBUFTRACE
852 	m_claimm(m, sb->sb_mowner);
853 #endif
854 
855 	SBLASTRECORDCHK(sb, "sbappend 1");
856 
857 	if ((n = sb->sb_lastrecord) != NULL) {
858 		/*
859 		 * XXX Would like to simply use sb_mbtail here, but
860 		 * XXX I need to verify that I won't miss an EOR that
861 		 * XXX way.
862 		 */
863 		do {
864 			if (n->m_flags & M_EOR) {
865 				sbappendrecord(sb, m); /* XXXXXX!!!! */
866 				return;
867 			}
868 		} while (n->m_next && (n = n->m_next));
869 	} else {
870 		/*
871 		 * If this is the first record in the socket buffer, it's
872 		 * also the last record.
873 		 */
874 		sb->sb_lastrecord = m;
875 	}
876 	sbcompress(sb, m, n);
877 	SBLASTRECORDCHK(sb, "sbappend 2");
878 }
879 
880 /*
881  * This version of sbappend() should only be used when the caller
882  * absolutely knows that there will never be more than one record
883  * in the socket buffer, that is, a stream protocol (such as TCP).
884  */
885 void
886 sbappendstream(struct sockbuf *sb, struct mbuf *m)
887 {
888 
889 	KASSERT(solocked(sb->sb_so));
890 	KDASSERT(m->m_nextpkt == NULL);
891 	KASSERT(sb->sb_mb == sb->sb_lastrecord);
892 
893 	SBLASTMBUFCHK(sb, __func__);
894 
895 #ifdef MBUFTRACE
896 	m_claimm(m, sb->sb_mowner);
897 #endif
898 
899 	sbcompress(sb, m, sb->sb_mbtail);
900 
901 	sb->sb_lastrecord = sb->sb_mb;
902 	SBLASTRECORDCHK(sb, __func__);
903 }
904 
905 #ifdef SOCKBUF_DEBUG
906 void
907 sbcheck(struct sockbuf *sb)
908 {
909 	struct mbuf	*m, *m2;
910 	u_long		len, mbcnt;
911 
912 	KASSERT(solocked(sb->sb_so));
913 
914 	len = 0;
915 	mbcnt = 0;
916 	for (m = sb->sb_mb; m; m = m->m_nextpkt) {
917 		for (m2 = m; m2 != NULL; m2 = m2->m_next) {
918 			len += m2->m_len;
919 			mbcnt += MSIZE;
920 			if (m2->m_flags & M_EXT)
921 				mbcnt += m2->m_ext.ext_size;
922 			if (m2->m_nextpkt != NULL)
923 				panic("sbcheck nextpkt");
924 		}
925 	}
926 	if (len != sb->sb_cc || mbcnt != sb->sb_mbcnt) {
927 		printf("cc %lu != %lu || mbcnt %lu != %lu\n", len, sb->sb_cc,
928 		    mbcnt, sb->sb_mbcnt);
929 		panic("sbcheck");
930 	}
931 }
932 #endif
933 
934 /*
935  * As above, except the mbuf chain
936  * begins a new record.
937  */
938 void
939 sbappendrecord(struct sockbuf *sb, struct mbuf *m0)
940 {
941 	struct mbuf	*m;
942 
943 	KASSERT(solocked(sb->sb_so));
944 
945 	if (m0 == NULL)
946 		return;
947 
948 #ifdef MBUFTRACE
949 	m_claimm(m0, sb->sb_mowner);
950 #endif
951 	/*
952 	 * Put the first mbuf on the queue.
953 	 * Note this permits zero length records.
954 	 */
955 	sballoc(sb, m0);
956 	SBLASTRECORDCHK(sb, "sbappendrecord 1");
957 	SBLINKRECORD(sb, m0);
958 	m = m0->m_next;
959 	m0->m_next = 0;
960 	if (m && (m0->m_flags & M_EOR)) {
961 		m0->m_flags &= ~M_EOR;
962 		m->m_flags |= M_EOR;
963 	}
964 	sbcompress(sb, m, m0);
965 	SBLASTRECORDCHK(sb, "sbappendrecord 2");
966 }
967 
968 /*
969  * As above except that OOB data
970  * is inserted at the beginning of the sockbuf,
971  * but after any other OOB data.
972  */
973 void
974 sbinsertoob(struct sockbuf *sb, struct mbuf *m0)
975 {
976 	struct mbuf	*m, **mp;
977 
978 	KASSERT(solocked(sb->sb_so));
979 
980 	if (m0 == NULL)
981 		return;
982 
983 	SBLASTRECORDCHK(sb, "sbinsertoob 1");
984 
985 	for (mp = &sb->sb_mb; (m = *mp) != NULL; mp = &((*mp)->m_nextpkt)) {
986 	    again:
987 		switch (m->m_type) {
988 
989 		case MT_OOBDATA:
990 			continue;		/* WANT next train */
991 
992 		case MT_CONTROL:
993 			if ((m = m->m_next) != NULL)
994 				goto again;	/* inspect THIS train further */
995 		}
996 		break;
997 	}
998 	/*
999 	 * Put the first mbuf on the queue.
1000 	 * Note this permits zero length records.
1001 	 */
1002 	sballoc(sb, m0);
1003 	m0->m_nextpkt = *mp;
1004 	if (*mp == NULL) {
1005 		/* m0 is actually the new tail */
1006 		sb->sb_lastrecord = m0;
1007 	}
1008 	*mp = m0;
1009 	m = m0->m_next;
1010 	m0->m_next = 0;
1011 	if (m && (m0->m_flags & M_EOR)) {
1012 		m0->m_flags &= ~M_EOR;
1013 		m->m_flags |= M_EOR;
1014 	}
1015 	sbcompress(sb, m, m0);
1016 	SBLASTRECORDCHK(sb, "sbinsertoob 2");
1017 }
1018 
1019 /*
1020  * Append address and data, and optionally, control (ancillary) data
1021  * to the receive queue of a socket.  If present,
1022  * m0 must include a packet header with total length.
1023  * Returns 0 if no space in sockbuf or insufficient mbufs.
1024  */
1025 int
1026 sbappendaddr(struct sockbuf *sb, const struct sockaddr *asa, struct mbuf *m0,
1027 	struct mbuf *control)
1028 {
1029 	struct mbuf	*m, *n, *nlast;
1030 	int		space, len;
1031 
1032 	KASSERT(solocked(sb->sb_so));
1033 
1034 	space = asa->sa_len;
1035 
1036 	if (m0 != NULL) {
1037 		if ((m0->m_flags & M_PKTHDR) == 0)
1038 			panic("sbappendaddr");
1039 		space += m0->m_pkthdr.len;
1040 #ifdef MBUFTRACE
1041 		m_claimm(m0, sb->sb_mowner);
1042 #endif
1043 	}
1044 	for (n = control; n; n = n->m_next) {
1045 		space += n->m_len;
1046 		MCLAIM(n, sb->sb_mowner);
1047 		if (n->m_next == NULL)	/* keep pointer to last control buf */
1048 			break;
1049 	}
1050 	if (space > sbspace(sb))
1051 		return (0);
1052 	m = m_get(M_DONTWAIT, MT_SONAME);
1053 	if (m == NULL)
1054 		return (0);
1055 	MCLAIM(m, sb->sb_mowner);
1056 	/*
1057 	 * XXX avoid 'comparison always true' warning which isn't easily
1058 	 * avoided.
1059 	 */
1060 	len = asa->sa_len;
1061 	if (len > MLEN) {
1062 		MEXTMALLOC(m, asa->sa_len, M_NOWAIT);
1063 		if ((m->m_flags & M_EXT) == 0) {
1064 			m_free(m);
1065 			return (0);
1066 		}
1067 	}
1068 	m->m_len = asa->sa_len;
1069 	memcpy(mtod(m, void *), asa, asa->sa_len);
1070 	if (n)
1071 		n->m_next = m0;		/* concatenate data to control */
1072 	else
1073 		control = m0;
1074 	m->m_next = control;
1075 
1076 	SBLASTRECORDCHK(sb, "sbappendaddr 1");
1077 
1078 	for (n = m; n->m_next != NULL; n = n->m_next)
1079 		sballoc(sb, n);
1080 	sballoc(sb, n);
1081 	nlast = n;
1082 	SBLINKRECORD(sb, m);
1083 
1084 	sb->sb_mbtail = nlast;
1085 	SBLASTMBUFCHK(sb, "sbappendaddr");
1086 	SBLASTRECORDCHK(sb, "sbappendaddr 2");
1087 
1088 	return (1);
1089 }
1090 
1091 /*
1092  * Helper for sbappendchainaddr: prepend a struct sockaddr* to
1093  * an mbuf chain.
1094  */
1095 static inline struct mbuf *
1096 m_prepend_sockaddr(struct sockbuf *sb, struct mbuf *m0,
1097 		   const struct sockaddr *asa)
1098 {
1099 	struct mbuf *m;
1100 	const int salen = asa->sa_len;
1101 
1102 	KASSERT(solocked(sb->sb_so));
1103 
1104 	/* only the first in each chain need be a pkthdr */
1105 	m = m_gethdr(M_DONTWAIT, MT_SONAME);
1106 	if (m == NULL)
1107 		return NULL;
1108 	MCLAIM(m, sb->sb_mowner);
1109 #ifdef notyet
1110 	if (salen > MHLEN) {
1111 		MEXTMALLOC(m, salen, M_NOWAIT);
1112 		if ((m->m_flags & M_EXT) == 0) {
1113 			m_free(m);
1114 			return NULL;
1115 		}
1116 	}
1117 #else
1118 	KASSERT(salen <= MHLEN);
1119 #endif
1120 	m->m_len = salen;
1121 	memcpy(mtod(m, void *), asa, salen);
1122 	m->m_next = m0;
1123 	m->m_pkthdr.len = salen + m0->m_pkthdr.len;
1124 
1125 	return m;
1126 }
1127 
1128 int
1129 sbappendaddrchain(struct sockbuf *sb, const struct sockaddr *asa,
1130 		  struct mbuf *m0, int sbprio)
1131 {
1132 	struct mbuf *m, *n, *n0, *nlast;
1133 	int error;
1134 
1135 	KASSERT(solocked(sb->sb_so));
1136 
1137 	/*
1138 	 * XXX sbprio reserved for encoding priority of this* request:
1139 	 *  SB_PRIO_NONE --> honour normal sb limits
1140 	 *  SB_PRIO_ONESHOT_OVERFLOW --> if socket has any space,
1141 	 *	take whole chain. Intended for large requests
1142 	 *      that should be delivered atomically (all, or none).
1143 	 * SB_PRIO_OVERDRAFT -- allow a small (2*MLEN) overflow
1144 	 *       over normal socket limits, for messages indicating
1145 	 *       buffer overflow in earlier normal/lower-priority messages
1146 	 * SB_PRIO_BESTEFFORT -->  ignore limits entirely.
1147 	 *       Intended for  kernel-generated messages only.
1148 	 *        Up to generator to avoid total mbuf resource exhaustion.
1149 	 */
1150 	(void)sbprio;
1151 
1152 	if (m0 && (m0->m_flags & M_PKTHDR) == 0)
1153 		panic("sbappendaddrchain");
1154 
1155 #ifdef notyet
1156 	space = sbspace(sb);
1157 
1158 	/*
1159 	 * Enforce SB_PRIO_* limits as described above.
1160 	 */
1161 #endif
1162 
1163 	n0 = NULL;
1164 	nlast = NULL;
1165 	for (m = m0; m; m = m->m_nextpkt) {
1166 		struct mbuf *np;
1167 
1168 #ifdef MBUFTRACE
1169 		m_claimm(m, sb->sb_mowner);
1170 #endif
1171 
1172 		/* Prepend sockaddr to this record (m) of input chain m0 */
1173 		n = m_prepend_sockaddr(sb, m, asa);
1174 		if (n == NULL) {
1175 			error = SET_ERROR(ENOBUFS);
1176 			goto bad;
1177 		}
1178 
1179 		/* Append record (asa+m) to end of new chain n0 */
1180 		if (n0 == NULL) {
1181 			n0 = n;
1182 		} else {
1183 			nlast->m_nextpkt = n;
1184 		}
1185 		/* Keep track of last record on new chain */
1186 		nlast = n;
1187 
1188 		for (np = n; np; np = np->m_next)
1189 			sballoc(sb, np);
1190 	}
1191 
1192 	SBLASTRECORDCHK(sb, "sbappendaddrchain 1");
1193 
1194 	/* Drop the entire chain of (asa+m) records onto the socket */
1195 	SBLINKRECORDCHAIN(sb, n0, nlast);
1196 
1197 	SBLASTRECORDCHK(sb, "sbappendaddrchain 2");
1198 
1199 	for (m = nlast; m->m_next; m = m->m_next)
1200 		;
1201 	sb->sb_mbtail = m;
1202 	SBLASTMBUFCHK(sb, "sbappendaddrchain");
1203 
1204 	return (1);
1205 
1206 bad:
1207 	/*
1208 	 * On error, free the prepended addresses. For consistency
1209 	 * with sbappendaddr(), leave it to our caller to free
1210 	 * the input record chain passed to us as m0.
1211 	 */
1212 	while ((n = n0) != NULL) {
1213 		struct mbuf *np;
1214 
1215 		/* Undo the sballoc() of this record */
1216 		for (np = n; np; np = np->m_next)
1217 			sbfree(sb, np);
1218 
1219 		n0 = n->m_nextpkt;	/* iterate at next prepended address */
1220 		np = m_free(n);		/* free prepended address (not data) */
1221 	}
1222 	return error;
1223 }
1224 
1225 
1226 int
1227 sbappendcontrol(struct sockbuf *sb, struct mbuf *m0, struct mbuf *control)
1228 {
1229 	struct mbuf	*m, *mlast, *n;
1230 	int		space;
1231 
1232 	KASSERT(solocked(sb->sb_so));
1233 
1234 	space = 0;
1235 	if (control == NULL)
1236 		panic("sbappendcontrol");
1237 	for (m = control; ; m = m->m_next) {
1238 		space += m->m_len;
1239 		MCLAIM(m, sb->sb_mowner);
1240 		if (m->m_next == NULL)
1241 			break;
1242 	}
1243 	n = m;			/* save pointer to last control buffer */
1244 	for (m = m0; m; m = m->m_next) {
1245 		MCLAIM(m, sb->sb_mowner);
1246 		space += m->m_len;
1247 	}
1248 	if (space > sbspace(sb))
1249 		return (0);
1250 	n->m_next = m0;			/* concatenate data to control */
1251 
1252 	SBLASTRECORDCHK(sb, "sbappendcontrol 1");
1253 
1254 	for (m = control; m->m_next != NULL; m = m->m_next)
1255 		sballoc(sb, m);
1256 	sballoc(sb, m);
1257 	mlast = m;
1258 	SBLINKRECORD(sb, control);
1259 
1260 	sb->sb_mbtail = mlast;
1261 	SBLASTMBUFCHK(sb, "sbappendcontrol");
1262 	SBLASTRECORDCHK(sb, "sbappendcontrol 2");
1263 
1264 	return (1);
1265 }
1266 
1267 /*
1268  * Compress mbuf chain m into the socket
1269  * buffer sb following mbuf n.  If n
1270  * is null, the buffer is presumed empty.
1271  */
1272 void
1273 sbcompress(struct sockbuf *sb, struct mbuf *m, struct mbuf *n)
1274 {
1275 	int		eor;
1276 	struct mbuf	*o;
1277 
1278 	KASSERT(solocked(sb->sb_so));
1279 
1280 	eor = 0;
1281 	while (m) {
1282 		eor |= m->m_flags & M_EOR;
1283 		if (m->m_len == 0 &&
1284 		    (eor == 0 ||
1285 		     (((o = m->m_next) || (o = n)) &&
1286 		      o->m_type == m->m_type))) {
1287 			if (sb->sb_lastrecord == m)
1288 				sb->sb_lastrecord = m->m_next;
1289 			m = m_free(m);
1290 			continue;
1291 		}
1292 		if (n && (n->m_flags & M_EOR) == 0 &&
1293 		    /* M_TRAILINGSPACE() checks buffer writeability */
1294 		    m->m_len <= MCLBYTES / 4 && /* XXX Don't copy too much */
1295 		    m->m_len <= M_TRAILINGSPACE(n) &&
1296 		    n->m_type == m->m_type) {
1297 			memcpy(mtod(n, char *) + n->m_len, mtod(m, void *),
1298 			    (unsigned)m->m_len);
1299 			n->m_len += m->m_len;
1300 			sb->sb_cc += m->m_len;
1301 			m = m_free(m);
1302 			continue;
1303 		}
1304 		if (n)
1305 			n->m_next = m;
1306 		else
1307 			sb->sb_mb = m;
1308 		sb->sb_mbtail = m;
1309 		sballoc(sb, m);
1310 		n = m;
1311 		m->m_flags &= ~M_EOR;
1312 		m = m->m_next;
1313 		n->m_next = 0;
1314 	}
1315 	if (eor) {
1316 		if (n)
1317 			n->m_flags |= eor;
1318 		else
1319 			printf("semi-panic: sbcompress\n");
1320 	}
1321 	SBLASTMBUFCHK(sb, __func__);
1322 }
1323 
1324 /*
1325  * Free all mbufs in a sockbuf.
1326  * Check that all resources are reclaimed.
1327  */
1328 void
1329 sbflush(struct sockbuf *sb)
1330 {
1331 
1332 	KASSERT(solocked(sb->sb_so));
1333 	KASSERT((sb->sb_flags & SB_LOCK) == 0);
1334 
1335 	while (sb->sb_mbcnt)
1336 		sbdrop(sb, (int)sb->sb_cc);
1337 
1338 	KASSERT(sb->sb_cc == 0);
1339 	KASSERT(sb->sb_mb == NULL);
1340 	KASSERT(sb->sb_mbtail == NULL);
1341 	KASSERT(sb->sb_lastrecord == NULL);
1342 }
1343 
1344 /*
1345  * Drop data from (the front of) a sockbuf.
1346  */
1347 void
1348 sbdrop(struct sockbuf *sb, int len)
1349 {
1350 	struct mbuf	*m, *next;
1351 
1352 	KASSERT(solocked(sb->sb_so));
1353 
1354 	next = (m = sb->sb_mb) ? m->m_nextpkt : NULL;
1355 	while (len > 0) {
1356 		if (m == NULL) {
1357 			if (next == NULL)
1358 				panic("sbdrop(%p,%d): cc=%lu",
1359 				    sb, len, sb->sb_cc);
1360 			m = next;
1361 			next = m->m_nextpkt;
1362 			continue;
1363 		}
1364 		if (m->m_len > len) {
1365 			m->m_len -= len;
1366 			m->m_data += len;
1367 			sb->sb_cc -= len;
1368 			break;
1369 		}
1370 		len -= m->m_len;
1371 		sbfree(sb, m);
1372 		m = m_free(m);
1373 	}
1374 	while (m && m->m_len == 0) {
1375 		sbfree(sb, m);
1376 		m = m_free(m);
1377 	}
1378 	if (m) {
1379 		sb->sb_mb = m;
1380 		m->m_nextpkt = next;
1381 	} else
1382 		sb->sb_mb = next;
1383 	/*
1384 	 * First part is an inline SB_EMPTY_FIXUP().  Second part
1385 	 * makes sure sb_lastrecord is up-to-date if we dropped
1386 	 * part of the last record.
1387 	 */
1388 	m = sb->sb_mb;
1389 	if (m == NULL) {
1390 		sb->sb_mbtail = NULL;
1391 		sb->sb_lastrecord = NULL;
1392 	} else if (m->m_nextpkt == NULL)
1393 		sb->sb_lastrecord = m;
1394 }
1395 
1396 /*
1397  * Drop a record off the front of a sockbuf
1398  * and move the next record to the front.
1399  */
1400 void
1401 sbdroprecord(struct sockbuf *sb)
1402 {
1403 	struct mbuf	*m, *mn;
1404 
1405 	KASSERT(solocked(sb->sb_so));
1406 
1407 	m = sb->sb_mb;
1408 	if (m) {
1409 		sb->sb_mb = m->m_nextpkt;
1410 		do {
1411 			sbfree(sb, m);
1412 			mn = m_free(m);
1413 		} while ((m = mn) != NULL);
1414 	}
1415 	SB_EMPTY_FIXUP(sb);
1416 }
1417 
1418 /*
1419  * Create a "control" mbuf containing the specified data
1420  * with the specified type for presentation on a socket buffer.
1421  */
1422 struct mbuf *
1423 sbcreatecontrol1(void **p, int size, int type, int level, int flags)
1424 {
1425 	struct cmsghdr	*cp;
1426 	struct mbuf	*m;
1427 	int space = CMSG_SPACE(size);
1428 
1429 	if ((flags & M_DONTWAIT) && space > MCLBYTES) {
1430 		printf("%s: message too large %d\n", __func__, space);
1431 		return NULL;
1432 	}
1433 
1434 	if ((m = m_get(flags, MT_CONTROL)) == NULL)
1435 		return NULL;
1436 	if (space > MLEN) {
1437 		if (space > MCLBYTES)
1438 			MEXTMALLOC(m, space, M_WAITOK);
1439 		else
1440 			MCLGET(m, flags);
1441 		if ((m->m_flags & M_EXT) == 0) {
1442 			m_free(m);
1443 			return NULL;
1444 		}
1445 	}
1446 	cp = mtod(m, struct cmsghdr *);
1447 	*p = CMSG_DATA(cp);
1448 	m->m_len = space;
1449 	cp->cmsg_len = CMSG_LEN(size);
1450 	cp->cmsg_level = level;
1451 	cp->cmsg_type = type;
1452 
1453 	memset(cp + 1, 0, CMSG_LEN(0) - sizeof(*cp));
1454 	memset((uint8_t *)*p + size, 0, CMSG_ALIGN(size) - size);
1455 
1456 	return m;
1457 }
1458 
1459 struct mbuf *
1460 sbcreatecontrol(void *p, int size, int type, int level)
1461 {
1462 	struct mbuf *m;
1463 	void *v;
1464 
1465 	m = sbcreatecontrol1(&v, size, type, level, M_DONTWAIT);
1466 	if (m == NULL)
1467 		return NULL;
1468 	memcpy(v, p, size);
1469 	return m;
1470 }
1471 
1472 void
1473 solockretry(struct socket *so, kmutex_t *lock)
1474 {
1475 
1476 	while (lock != atomic_load_relaxed(&so->so_lock)) {
1477 		mutex_exit(lock);
1478 		lock = atomic_load_consume(&so->so_lock);
1479 		mutex_enter(lock);
1480 	}
1481 }
1482 
1483 bool
1484 solocked(const struct socket *so)
1485 {
1486 
1487 	/*
1488 	 * Used only for diagnostic assertions, so so_lock should be
1489 	 * stable at this point, hence on need for atomic_load_*.
1490 	 */
1491 	return mutex_owned(so->so_lock);
1492 }
1493 
1494 bool
1495 solocked2(const struct socket *so1, const struct socket *so2)
1496 {
1497 	const kmutex_t *lock;
1498 
1499 	/*
1500 	 * Used only for diagnostic assertions, so so_lock should be
1501 	 * stable at this point, hence on need for atomic_load_*.
1502 	 */
1503 	lock = so1->so_lock;
1504 	if (lock != so2->so_lock)
1505 		return false;
1506 	return mutex_owned(lock);
1507 }
1508 
1509 /*
1510  * sosetlock: assign a default lock to a new socket.
1511  */
1512 void
1513 sosetlock(struct socket *so)
1514 {
1515 	if (so->so_lock == NULL) {
1516 		kmutex_t *lock = softnet_lock;
1517 
1518 		so->so_lock = lock;
1519 		mutex_obj_hold(lock);
1520 		mutex_enter(lock);
1521 	}
1522 	KASSERT(solocked(so));
1523 }
1524 
1525 /*
1526  * Set lock on sockbuf sb; sleep if lock is already held.
1527  * Unless SB_NOINTR is set on sockbuf, sleep is interruptible.
1528  * Returns error without lock if sleep is interrupted.
1529  */
1530 int
1531 sblock(struct sockbuf *sb, int wf)
1532 {
1533 	struct socket *so;
1534 	kmutex_t *lock;
1535 	int error;
1536 
1537 	KASSERT(solocked(sb->sb_so));
1538 
1539 	for (;;) {
1540 		if (__predict_true((sb->sb_flags & SB_LOCK) == 0)) {
1541 			sb->sb_flags |= SB_LOCK;
1542 			return 0;
1543 		}
1544 		if (wf != M_WAITOK)
1545 			return SET_ERROR(EWOULDBLOCK);
1546 		so = sb->sb_so;
1547 		lock = so->so_lock;
1548 		if ((sb->sb_flags & SB_NOINTR) != 0) {
1549 			cv_wait(&so->so_cv, lock);
1550 			error = 0;
1551 		} else
1552 			error = cv_wait_sig(&so->so_cv, lock);
1553 		if (__predict_false(lock != atomic_load_relaxed(&so->so_lock)))
1554 			solockretry(so, lock);
1555 		if (error != 0)
1556 			return error;
1557 	}
1558 }
1559 
1560 void
1561 sbunlock(struct sockbuf *sb)
1562 {
1563 	struct socket *so;
1564 
1565 	so = sb->sb_so;
1566 
1567 	KASSERT(solocked(so));
1568 	KASSERT((sb->sb_flags & SB_LOCK) != 0);
1569 
1570 	sb->sb_flags &= ~SB_LOCK;
1571 	cv_broadcast(&so->so_cv);
1572 }
1573 
1574 int
1575 sowait(struct socket *so, bool catch_p, int timo)
1576 {
1577 	kmutex_t *lock;
1578 	int error;
1579 
1580 	KASSERT(solocked(so));
1581 	KASSERT(catch_p || timo != 0);
1582 
1583 	lock = so->so_lock;
1584 	if (catch_p)
1585 		error = cv_timedwait_sig(&so->so_cv, lock, timo);
1586 	else
1587 		error = cv_timedwait(&so->so_cv, lock, timo);
1588 	if (__predict_false(lock != atomic_load_relaxed(&so->so_lock)))
1589 		solockretry(so, lock);
1590 	return error;
1591 }
1592 
1593 #ifdef DDB
1594 
1595 /*
1596  * Currently, sofindproc() is used only from DDB. It could be used from others
1597  * by using db_mutex_enter()
1598  */
1599 
1600 static inline int
1601 db_mutex_enter(kmutex_t *mtx)
1602 {
1603 	int rv;
1604 
1605 	if (!db_active) {
1606 		mutex_enter(mtx);
1607 		rv = 1;
1608 	} else
1609 		rv = mutex_tryenter(mtx);
1610 
1611 	return rv;
1612 }
1613 
1614 int
1615 sofindproc(struct socket *so, int all, void (*pr)(const char *, ...))
1616 {
1617 	proc_t *p;
1618 	filedesc_t *fdp;
1619 	fdtab_t *dt;
1620 	fdfile_t *ff;
1621 	file_t *fp = NULL;
1622 	int found = 0;
1623 	int i, t;
1624 
1625 	if (so == NULL)
1626 		return 0;
1627 
1628 	t = db_mutex_enter(&proc_lock);
1629 	if (!t) {
1630 		pr("could not acquire proc_lock mutex\n");
1631 		return 0;
1632 	}
1633 	PROCLIST_FOREACH(p, &allproc) {
1634 		if (p->p_stat == SIDL)
1635 			continue;
1636 		fdp = p->p_fd;
1637 		t = db_mutex_enter(&fdp->fd_lock);
1638 		if (!t) {
1639 			pr("could not acquire fd_lock mutex\n");
1640 			continue;
1641 		}
1642 		dt = atomic_load_consume(&fdp->fd_dt);
1643 		for (i = 0; i < dt->dt_nfiles; i++) {
1644 			ff = dt->dt_ff[i];
1645 			if (ff == NULL)
1646 				continue;
1647 
1648 			fp = atomic_load_consume(&ff->ff_file);
1649 			if (fp == NULL)
1650 				continue;
1651 
1652 			t = db_mutex_enter(&fp->f_lock);
1653 			if (!t) {
1654 				pr("could not acquire f_lock mutex\n");
1655 				continue;
1656 			}
1657 			if ((struct socket *)fp->f_data != so) {
1658 				mutex_exit(&fp->f_lock);
1659 				continue;
1660 			}
1661 			found++;
1662 			if (pr)
1663 				pr("socket %p: owner %s(pid=%d)\n",
1664 				    so, p->p_comm, p->p_pid);
1665 			mutex_exit(&fp->f_lock);
1666 			if (all == 0)
1667 				break;
1668 		}
1669 		mutex_exit(&fdp->fd_lock);
1670 		if (all == 0 && found != 0)
1671 			break;
1672 	}
1673 	mutex_exit(&proc_lock);
1674 
1675 	return found;
1676 }
1677 
1678 void
1679 socket_print(const char *modif, void (*pr)(const char *, ...))
1680 {
1681 	file_t *fp;
1682 	struct socket *so;
1683 	struct sockbuf *sb_snd, *sb_rcv;
1684 	struct mbuf *m_rec, *m;
1685 	bool opt_v = false;
1686 	bool opt_m = false;
1687 	bool opt_a = false;
1688 	bool opt_p = false;
1689 	int nrecs, nmbufs;
1690 	char ch;
1691 	const char *family;
1692 
1693 	while ( (ch = *(modif++)) != '\0') {
1694 		switch (ch) {
1695 		case 'v':
1696 			opt_v = true;
1697 			break;
1698 		case 'm':
1699 			opt_m = true;
1700 			break;
1701 		case 'a':
1702 			opt_a = true;
1703 			break;
1704 		case 'p':
1705 			opt_p = true;
1706 			break;
1707 		}
1708 	}
1709 	if (opt_v == false && pr)
1710 		(pr)("Ignore empty sockets. use /v to print all.\n");
1711 	if (opt_p == true && pr)
1712 		(pr)("Don't search owner process.\n");
1713 
1714 	LIST_FOREACH(fp, &filehead, f_list) {
1715 		if (fp->f_type != DTYPE_SOCKET)
1716 			continue;
1717 		so = (struct socket *)fp->f_data;
1718 		if (so == NULL)
1719 			continue;
1720 
1721 		if (so->so_proto->pr_domain->dom_family == AF_INET)
1722 			family = "INET";
1723 #ifdef INET6
1724 		else if (so->so_proto->pr_domain->dom_family == AF_INET6)
1725 			family = "INET6";
1726 #endif
1727 		else if (so->so_proto->pr_domain->dom_family == pseudo_AF_KEY)
1728 			family = "KEY";
1729 		else if (so->so_proto->pr_domain->dom_family == AF_ROUTE)
1730 			family = "ROUTE";
1731 		else
1732 			continue;
1733 
1734 		sb_snd = &so->so_snd;
1735 		sb_rcv = &so->so_rcv;
1736 
1737 		if (opt_v != true &&
1738 		    sb_snd->sb_cc == 0 && sb_rcv->sb_cc == 0)
1739 			continue;
1740 
1741 		pr("---SOCKET %p: type %s\n", so, family);
1742 		if (opt_p != true)
1743 			sofindproc(so, opt_a == true ? 1 : 0, pr);
1744 		pr("Send Buffer Bytes: %d [bytes]\n", sb_snd->sb_cc);
1745 		pr("Send Buffer mbufs:\n");
1746 		m_rec = m = sb_snd->sb_mb;
1747 		nrecs = 0;
1748 		nmbufs = 0;
1749 		while (m_rec) {
1750 			nrecs++;
1751 			if (opt_m == true)
1752 				pr(" mbuf chain %p\n", m_rec);
1753 			while (m) {
1754 				nmbufs++;
1755 				m = m->m_next;
1756 			}
1757 			m_rec = m = m_rec->m_nextpkt;
1758 		}
1759 		pr(" Total %d records, %d mbufs.\n", nrecs, nmbufs);
1760 
1761 		pr("Recv Buffer Usage: %d [bytes]\n", sb_rcv->sb_cc);
1762 		pr("Recv Buffer mbufs:\n");
1763 		m_rec = m = sb_rcv->sb_mb;
1764 		nrecs = 0;
1765 		nmbufs = 0;
1766 		while (m_rec) {
1767 			nrecs++;
1768 			if (opt_m == true)
1769 				pr(" mbuf chain %p\n", m_rec);
1770 			while (m) {
1771 				nmbufs++;
1772 				m = m->m_next;
1773 			}
1774 			m_rec = m = m_rec->m_nextpkt;
1775 		}
1776 		pr(" Total %d records, %d mbufs.\n", nrecs, nmbufs);
1777 	}
1778 }
1779 #endif /* DDB */
1780