1/*-
2 * Copyright (c) 1982, 1986, 1988, 1990, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
--- 16 unchanged lines hidden (view full) ---
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * @(#)uipc_socket2.c 8.1 (Berkeley) 6/10/93
30 */
31
32#include <sys/cdefs.h>
33__FBSDID("$FreeBSD: head/sys/kern/uipc_sockbuf.c 167895 2007-03-26 08:59:03Z rwatson $");
34
35#include "opt_param.h"
36
37#include <sys/param.h>
38#include <sys/aio.h> /* for aio_swake proto */
39#include <sys/kernel.h>
40#include <sys/lock.h>
41#include <sys/mbuf.h>
--- 932 unchanged lines hidden (view full) ---
974sbdroprecord(struct sockbuf *sb)
975{
976
977 SOCKBUF_LOCK(sb);
978 sbdroprecord_locked(sb);
979 SOCKBUF_UNLOCK(sb);
980}
981
982/*
983 * Create a "control" mbuf containing the specified data
984 * with the specified type for presentation on a socket buffer.
985 */
986struct mbuf *
987sbcreatecontrol(p, size, type, level)
988 caddr_t p;
989 register int size;
990 int type, level;
991{
992 register struct cmsghdr *cp;
993 struct mbuf *m;
994
995 if (CMSG_SPACE((u_int)size) > MCLBYTES)
996 return ((struct mbuf *) NULL);
997 if (CMSG_SPACE((u_int)size) > MLEN)
998 m = m_getcl(M_DONTWAIT, MT_CONTROL, 0);
999 else
1000 m = m_get(M_DONTWAIT, MT_CONTROL);
1001 if (m == NULL)
1002 return ((struct mbuf *) NULL);
1003 cp = mtod(m, struct cmsghdr *);
1004 m->m_len = 0;
1005 KASSERT(CMSG_SPACE((u_int)size) <= M_TRAILINGSPACE(m),
1006 ("sbcreatecontrol: short mbuf"));
1007 if (p != NULL)
1008 (void)memcpy(CMSG_DATA(cp), p, size);
1009 m->m_len = CMSG_SPACE(size);
1010 cp->cmsg_len = CMSG_LEN(size);
1011 cp->cmsg_level = level;
1012 cp->cmsg_type = type;
1013 return (m);
1014}
1015
1016/*
1017 * This does the same for sockbufs. Note that the xsockbuf structure,
1018 * since it is always embedded in a socket, does not include a self
1019 * pointer nor a length. We make this entry point public in case
1020 * some other mechanism needs it.
1021 */
1022void
1023sbtoxsockbuf(struct sockbuf *sb, struct xsockbuf *xsb)
1024{
1025 xsb->sb_cc = sb->sb_cc;
1026 xsb->sb_hiwat = sb->sb_hiwat;
1027 xsb->sb_mbcnt = sb->sb_mbcnt;
1028 xsb->sb_mbmax = sb->sb_mbmax;
1029 xsb->sb_lowat = sb->sb_lowat;
1030 xsb->sb_flags = sb->sb_flags;
1031 xsb->sb_timeo = sb->sb_timeo;
1032}
1033
1034/* This takes the place of kern.maxsockbuf, which moved to kern.ipc. */
1035static int dummy;
1036SYSCTL_INT(_kern, KERN_DUMMY, dummy, CTLFLAG_RW, &dummy, 0, "");
1037SYSCTL_OID(_kern_ipc, KIPC_MAXSOCKBUF, maxsockbuf, CTLTYPE_ULONG|CTLFLAG_RW,
1038 &sb_max, 0, sysctl_handle_sb_max, "LU", "Maximum socket buffer size");
1039SYSCTL_ULONG(_kern_ipc, KIPC_SOCKBUF_WASTE, sockbuf_waste_factor, CTLFLAG_RW,
1040 &sb_efficiency, 0, "");
2 * Copyright (c) 1982, 1986, 1988, 1990, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
--- 16 unchanged lines hidden (view full) ---
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * @(#)uipc_socket2.c 8.1 (Berkeley) 6/10/93
30 */
31
32#include <sys/cdefs.h>
33__FBSDID("$FreeBSD: head/sys/kern/uipc_sockbuf.c 167895 2007-03-26 08:59:03Z rwatson $");
34
35#include "opt_param.h"
36
37#include <sys/param.h>
38#include <sys/aio.h> /* for aio_swake proto */
39#include <sys/kernel.h>
40#include <sys/lock.h>
41#include <sys/mbuf.h>
--- 932 unchanged lines hidden (view full) ---
974sbdroprecord(struct sockbuf *sb)
975{
976
977 SOCKBUF_LOCK(sb);
978 sbdroprecord_locked(sb);
979 SOCKBUF_UNLOCK(sb);
980}
981
982/*
983 * Create a "control" mbuf containing the specified data
984 * with the specified type for presentation on a socket buffer.
985 */
986struct mbuf *
987sbcreatecontrol(p, size, type, level)
988 caddr_t p;
989 register int size;
990 int type, level;
991{
992 register struct cmsghdr *cp;
993 struct mbuf *m;
994
995 if (CMSG_SPACE((u_int)size) > MCLBYTES)
996 return ((struct mbuf *) NULL);
997 if (CMSG_SPACE((u_int)size) > MLEN)
998 m = m_getcl(M_DONTWAIT, MT_CONTROL, 0);
999 else
1000 m = m_get(M_DONTWAIT, MT_CONTROL);
1001 if (m == NULL)
1002 return ((struct mbuf *) NULL);
1003 cp = mtod(m, struct cmsghdr *);
1004 m->m_len = 0;
1005 KASSERT(CMSG_SPACE((u_int)size) <= M_TRAILINGSPACE(m),
1006 ("sbcreatecontrol: short mbuf"));
1007 if (p != NULL)
1008 (void)memcpy(CMSG_DATA(cp), p, size);
1009 m->m_len = CMSG_SPACE(size);
1010 cp->cmsg_len = CMSG_LEN(size);
1011 cp->cmsg_level = level;
1012 cp->cmsg_type = type;
1013 return (m);
1014}
1015
1016/*
1017 * This does the same for sockbufs. Note that the xsockbuf structure,
1018 * since it is always embedded in a socket, does not include a self
1019 * pointer nor a length. We make this entry point public in case
1020 * some other mechanism needs it.
1021 */
1022void
1023sbtoxsockbuf(struct sockbuf *sb, struct xsockbuf *xsb)
1024{
1025 xsb->sb_cc = sb->sb_cc;
1026 xsb->sb_hiwat = sb->sb_hiwat;
1027 xsb->sb_mbcnt = sb->sb_mbcnt;
1028 xsb->sb_mbmax = sb->sb_mbmax;
1029 xsb->sb_lowat = sb->sb_lowat;
1030 xsb->sb_flags = sb->sb_flags;
1031 xsb->sb_timeo = sb->sb_timeo;
1032}
1033
1034/* This takes the place of kern.maxsockbuf, which moved to kern.ipc. */
1035static int dummy;
1036SYSCTL_INT(_kern, KERN_DUMMY, dummy, CTLFLAG_RW, &dummy, 0, "");
1037SYSCTL_OID(_kern_ipc, KIPC_MAXSOCKBUF, maxsockbuf, CTLTYPE_ULONG|CTLFLAG_RW,
1038 &sb_max, 0, sysctl_handle_sb_max, "LU", "Maximum socket buffer size");
1039SYSCTL_ULONG(_kern_ipc, KIPC_SOCKBUF_WASTE, sockbuf_waste_factor, CTLFLAG_RW,
1040 &sb_efficiency, 0, "");