From 01624e6f86e7a5d9bb0ef990bda23bd365dac64a Mon Sep 17 00:00:00 2001 From: Ben Gras Date: Fri, 6 Dec 2013 15:56:45 +0100 Subject: [PATCH] , . add sa_len to sockaddr, sin_len to sockaddr_in . rename SCM_CREDENTIALS to SCM_CREDS . retire PF_FILE (same as PF_UNIX) Change-Id: Id3ec63fe2556fc7ceb48de8ad4e80736df3ddfc7 --- drivers/uds/ioc_uds.c | 2 +- lib/libc/net/minix/getpeereid.c | 1 + lib/libc/sys-minix/getpeername.c | 2 + lib/libc/sys-minix/getsockname.c | 2 + lib/libc/sys-minix/recvfrom.c | 3 + lib/libc/sys-minix/socket.c | 2 +- libexec/ftpd/ftpd.c | 2 - sys/netinet/Makefile | 2 +- sys/netinet/in.h | 24 +- sys/netinet/tcp.h | 34 ++- sys/netinet/udp.h | 3 +- sys/netinet/udp_var.h | 4 +- sys/sys/socket.h | 381 ++++++++++++++++++++++++++----- test/test56.c | 7 +- 14 files changed, 365 insertions(+), 104 deletions(-) diff --git a/drivers/uds/ioc_uds.c b/drivers/uds/ioc_uds.c index 762bfd6f6..0a49e9ad0 100644 --- a/drivers/uds/ioc_uds.c +++ b/drivers/uds/ioc_uds.c @@ -791,7 +791,7 @@ recv_cred(devminor_t minor, struct ancillary *data, cmsg->cmsg_len = CMSG_LEN(sizeof(struct uucred)); cmsg->cmsg_level = SOL_SOCKET; - cmsg->cmsg_type = SCM_CREDENTIALS; + cmsg->cmsg_type = SCM_CREDS; memcpy(CMSG_DATA(cmsg), &data->cred, sizeof(struct uucred)); return OK; diff --git a/lib/libc/net/minix/getpeereid.c b/lib/libc/net/minix/getpeereid.c index 775256f8f..7638c12ba 100644 --- a/lib/libc/net/minix/getpeereid.c +++ b/lib/libc/net/minix/getpeereid.c @@ -2,6 +2,7 @@ #include #include #include +#include /* * get the effective user ID and effective group ID of a peer diff --git a/lib/libc/sys-minix/getpeername.c b/lib/libc/sys-minix/getpeername.c index a537685ef..35097c57e 100644 --- a/lib/libc/sys-minix/getpeername.c +++ b/lib/libc/sys-minix/getpeername.c @@ -95,6 +95,7 @@ static int _tcp_getpeername(int sock, struct sockaddr *__restrict address, sin.sin_family= AF_INET; sin.sin_addr.s_addr= tcpconfp->nwtc_remaddr; sin.sin_port= tcpconfp->nwtc_remport; + sin.sin_len = sizeof(sin); len= *address_len; if (len > sizeof(sin)) @@ -122,6 +123,7 @@ static int _udp_getpeername(int sock, struct sockaddr *__restrict address, sin.sin_family= AF_INET; sin.sin_addr.s_addr= udpopt->nwuo_remaddr; sin.sin_port= udpopt->nwuo_remport; + sin.sin_len = sizeof(sin); len= *address_len; if (len > sizeof(sin)) diff --git a/lib/libc/sys-minix/getsockname.c b/lib/libc/sys-minix/getsockname.c index 84b55a845..7eb06114c 100644 --- a/lib/libc/sys-minix/getsockname.c +++ b/lib/libc/sys-minix/getsockname.c @@ -111,6 +111,7 @@ static int _tcp_getsockname(int fd, struct sockaddr *__restrict address, sin.sin_family= AF_INET; sin.sin_addr.s_addr= tcpconf->nwtc_locaddr ; sin.sin_port= tcpconf->nwtc_locport; + sin.sin_len= sizeof(sin); len= *address_len; if (len > sizeof(sin)) @@ -140,6 +141,7 @@ static int _udp_getsockname(int fd, struct sockaddr *__restrict address, sin.sin_family= AF_INET; sin.sin_addr.s_addr= udpopt->nwuo_locaddr ; sin.sin_port= udpopt->nwuo_locport; + sin.sin_len= sizeof(sin); len= *address_len; if (len > sizeof(sin)) diff --git a/lib/libc/sys-minix/recvfrom.c b/lib/libc/sys-minix/recvfrom.c index 0cc663321..5f5a19b9e 100644 --- a/lib/libc/sys-minix/recvfrom.c +++ b/lib/libc/sys-minix/recvfrom.c @@ -117,6 +117,7 @@ static ssize_t _tcp_recvfrom(int sock, void *__restrict buffer, size_t length, sin.sin_family= AF_INET; sin.sin_addr.s_addr= tcpconfp->nwtc_remaddr; sin.sin_port= tcpconfp->nwtc_remport; + sin.sin_len= sizeof(sin); len= *address_len; if (len > sizeof(sin)) len= sizeof(sin); @@ -170,6 +171,7 @@ static ssize_t _udp_recvfrom(int sock, void *__restrict buffer, size_t length, sin.sin_family= AF_INET; sin.sin_addr.s_addr= udpoptp->nwuo_remaddr; sin.sin_port= udpoptp->nwuo_remport; + sin.sin_len= sizeof(sin); len= *address_len; if (len > sizeof(sin)) len= sizeof(sin); @@ -216,6 +218,7 @@ static ssize_t _udp_recvfrom(int sock, void *__restrict buffer, size_t length, sin.sin_family= AF_INET; sin.sin_addr.s_addr= io_hdrp->uih_src_addr; sin.sin_port= io_hdrp->uih_src_port; + sin.sin_len= sizeof(sin); len= *address_len; if (len > sizeof(sin)) len= sizeof(sin); diff --git a/lib/libc/sys-minix/socket.c b/lib/libc/sys-minix/socket.c index cc00596a0..9f1883847 100644 --- a/lib/libc/sys-minix/socket.c +++ b/lib/libc/sys-minix/socket.c @@ -2,7 +2,7 @@ #include "namespace.h" #ifdef __weak_alias -__weak_alias(socket, _socket) +__weak_alias(socket, __socket30) #endif #include diff --git a/libexec/ftpd/ftpd.c b/libexec/ftpd/ftpd.c index 01792f004..4d9f1ece5 100644 --- a/libexec/ftpd/ftpd.c +++ b/libexec/ftpd/ftpd.c @@ -113,10 +113,8 @@ __RCSID("$NetBSD: ftpd.c,v 1.198 2012/06/19 06:06:34 dholland Exp $"); #include #include -#ifndef __minix #include #include -#endif #define FTP_NAMES #include diff --git a/sys/netinet/Makefile b/sys/netinet/Makefile index 805741080..b8f61d8c1 100644 --- a/sys/netinet/Makefile +++ b/sys/netinet/Makefile @@ -1,5 +1,5 @@ INCSDIR= /usr/include/netinet -INCS+= in.h tcp.h +INCS+= in.h tcp.h in_systm.h ip.h .include diff --git a/sys/netinet/in.h b/sys/netinet/in.h index 8bbc39478..d606ced4d 100644 --- a/sys/netinet/in.h +++ b/sys/netinet/in.h @@ -1,4 +1,4 @@ -/* $NetBSD: in.h,v 1.86 2009/09/14 10:36:50 degroote Exp $ */ +/* $NetBSD: in.h,v 1.87 2012/06/22 14:54:35 christos Exp $ */ /* * Copyright (c) 1982, 1986, 1990, 1993 @@ -234,14 +234,6 @@ struct in_addr { /* * Socket address, internet style. */ -#ifdef __minix -struct sockaddr_in -{ - sa_family_t sin_family; - in_port_t sin_port; - struct in_addr sin_addr; -}; -#else /* !__minix */ struct sockaddr_in { uint8_t sin_len; sa_family_t sin_family; @@ -249,11 +241,9 @@ struct sockaddr_in { struct in_addr sin_addr; __int8_t sin_zero[8]; }; -#endif /* !__minix */ #define INET_ADDRSTRLEN 16 -#ifndef __minix /* * Structure used to describe IP options. * Used to store options internally, to pass them to a process, @@ -269,13 +259,11 @@ struct ip_opts { __int8_t ip_opts[40]; /* actually variable in size */ #endif }; -#endif /* __minix */ /* * Options for use with [gs]etsockopt at the IP level. * First word of comment is data type; bool is stored in int. */ -#ifndef __minix #define IP_OPTIONS 1 /* buf/ip_opts; set/get IP options */ #define IP_HDRINCL 2 /* int; header is included with data */ #define IP_TOS 3 /* int; IP type of service and preced. */ @@ -287,10 +275,9 @@ struct ip_opts { #define IP_MULTICAST_IF 9 /* in_addr; set/get IP multicast i/f */ #define IP_MULTICAST_TTL 10 /* u_char; set/get IP multicast ttl */ #define IP_MULTICAST_LOOP 11 /* u_char; set/get IP multicast loopback */ -#endif /* !__minix */ #define IP_ADD_MEMBERSHIP 12 /* ip_mreq; add an IP group membership */ #define IP_DROP_MEMBERSHIP 13 /* ip_mreq; drop an IP group membership */ -#ifndef __minix +#define IP_PORTALGO 18 /* int; port selection algo (rfc6056) */ #define IP_PORTRANGE 19 /* int; range to use for ephemeral port */ #define IP_RECVIF 20 /* bool; receive reception if w/dgram */ #define IP_ERRORMTU 21 /* int; get MTU of last xmit = EMSGSIZE */ @@ -299,16 +286,13 @@ struct ip_opts { #endif #define IP_RECVTTL 23 /* bool; receive IP TTL w/dgram */ #define IP_MINTTL 24 /* minimum TTL for packet or drop */ -#endif /* !__minix */ -#ifndef __minix /* * Defaults and limits for options */ #define IP_DEFAULT_MULTICAST_TTL 1 /* normally limit m'casts to 1 hop */ #define IP_DEFAULT_MULTICAST_LOOP 1 /* normally hear sends if a member */ #define IP_MAX_MEMBERSHIPS 20 /* per socket; must fit in one mbuf */ -#endif /* !__minix */ /* * Argument structure for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP. @@ -318,7 +302,6 @@ struct ip_mreq { struct in_addr imr_interface; /* local IP address of interface */ }; -#ifndef __minix /* * Argument for IP_PORTRANGE: * - which range to search when port is unspecified at bind() or connect() @@ -502,14 +485,12 @@ struct ip_mreq { { "stats", CTLTYPE_STRUCT }, \ } #endif /* _NETBSD_SOURCE */ -#endif /* __minix */ /* INET6 stuff */ #define __KAME_NETINET_IN_H_INCLUDED_ #include #undef __KAME_NETINET_IN_H_INCLUDED_ -#ifndef __minix #ifdef _KERNEL /* * in_cksum_phdr: @@ -617,6 +598,5 @@ sockaddr_in_alloc(const struct in_addr *addr, in_port_t port, int flags) return sa; } #endif /* _KERNEL */ -#endif /* __minix */ #endif /* !_NETINET_IN_H_ */ diff --git a/sys/netinet/tcp.h b/sys/netinet/tcp.h index 17a0540d3..d987f2e29 100644 --- a/sys/netinet/tcp.h +++ b/sys/netinet/tcp.h @@ -1,4 +1,4 @@ -/* $NetBSD: tcp.h,v 1.28 2007/12/25 18:33:47 perry Exp $ */ +/* $NetBSD: tcp.h,v 1.30 2012/01/07 20:20:22 christos Exp $ */ /* * Copyright (c) 1982, 1986, 1993 @@ -37,29 +37,30 @@ #include #if defined(_NETBSD_SOURCE) +#include -typedef u_int32_t tcp_seq; +typedef uint32_t tcp_seq; /* * TCP header. * Per RFC 793, September, 1981. * Updated by RFC 3168, September, 2001. */ struct tcphdr { - u_int16_t th_sport; /* source port */ - u_int16_t th_dport; /* destination port */ + uint16_t th_sport; /* source port */ + uint16_t th_dport; /* destination port */ tcp_seq th_seq; /* sequence number */ tcp_seq th_ack; /* acknowledgement number */ #if BYTE_ORDER == LITTLE_ENDIAN /*LINTED non-portable bitfields*/ - u_int8_t th_x2:4, /* (unused) */ + uint8_t th_x2:4, /* (unused) */ th_off:4; /* data offset */ #endif #if BYTE_ORDER == BIG_ENDIAN /*LINTED non-portable bitfields*/ - u_int8_t th_off:4, /* data offset */ + uint8_t th_off:4, /* data offset */ th_x2:4; /* (unused) */ #endif - u_int8_t th_flags; + uint8_t th_flags; #define TH_FIN 0x01 #define TH_SYN 0x02 #define TH_RST 0x04 @@ -68,9 +69,9 @@ struct tcphdr { #define TH_URG 0x20 #define TH_ECE 0x40 #define TH_CWR 0x80 - u_int16_t th_win; /* window */ - u_int16_t th_sum; /* checksum */ - u_int16_t th_urp; /* urgent pointer */ + uint16_t th_win; /* window */ + uint16_t th_sum; /* checksum */ + uint16_t th_urp; /* urgent pointer */ } __packed; #define TCPOPT_EOL 0 @@ -115,5 +116,18 @@ struct tcphdr { * User-settable options (used with setsockopt). */ #define TCP_NODELAY 1 /* don't delay send to coalesce packets */ +#define TCP_MAXSEG 2 /* set maximum segment size */ +#define TCP_KEEPIDLE 3 +#ifdef notyet +#define TCP_NOPUSH 4 /* reserved for FreeBSD compat */ +#endif +#define TCP_KEEPINTVL 5 +#define TCP_KEEPCNT 6 +#define TCP_KEEPINIT 7 +#ifdef notyet +#define TCP_NOOPT 8 /* reserved for FreeBSD compat */ +#endif +#define TCP_MD5SIG 0x10 /* use MD5 digests (RFC2385) */ +#define TCP_CONGCTL 0x20 /* selected congestion control */ #endif /* !_NETINET_TCP_H_ */ diff --git a/sys/netinet/udp.h b/sys/netinet/udp.h index ece7d0ed7..c8c10ecdd 100644 --- a/sys/netinet/udp.h +++ b/sys/netinet/udp.h @@ -1,4 +1,4 @@ -/* $NetBSD: udp.h,v 1.15 2012/01/07 20:20:12 christos Exp $ */ +/* $NetBSD: udp.h,v 1.16 2012/06/22 14:54:35 christos Exp $ */ /* * Copyright (c) 1982, 1986, 1993 @@ -48,7 +48,6 @@ struct udphdr { /* socket options for UDP */ #define UDP_ENCAP 100 -#define UDP_RFC6056ALGO 200 /* Encapsulation types */ #define UDP_ENCAP_ESPINUDP_NON_IKE 1 /* draft-ietf-ipsec-nat-t-ike-00/01 */ diff --git a/sys/netinet/udp_var.h b/sys/netinet/udp_var.h index b4e7fabad..49c130677 100644 --- a/sys/netinet/udp_var.h +++ b/sys/netinet/udp_var.h @@ -1,4 +1,4 @@ -/* $NetBSD: udp_var.h,v 1.37 2011/09/24 17:18:17 christos Exp $ */ +/* $NetBSD: udp_var.h,v 1.38 2012/06/22 14:54:35 christos Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1993 @@ -75,7 +75,6 @@ struct udpiphdr { #define UDPCTL_RECVSPACE 3 /* default recv buffer */ #define UDPCTL_LOOPBACKCKSUM 4 /* do UDP checksum on loopback */ #define UDPCTL_STATS 5 /* UDP statistics */ -#define UDPCTL_RFC6056 6 /* RFC 6056 algorithm selection */ #define UDPCTL_MAXID 7 #define UDPCTL_NAMES { \ @@ -85,7 +84,6 @@ struct udpiphdr { { "recvspace", CTLTYPE_INT }, \ { "do_loopback_cksum", CTLTYPE_INT }, \ { "stats", CTLTYPE_STRUCT }, \ - { "rfc6056", CTLTYPE_INT }, \ } #ifdef _KERNEL diff --git a/sys/sys/socket.h b/sys/sys/socket.h index d5c3deb64..3acea3ae3 100644 --- a/sys/sys/socket.h +++ b/sys/sys/socket.h @@ -120,10 +120,22 @@ typedef _BSD_SSIZE_T_ ssize_t; #define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ #define SO_REUSEADDR 0x0004 /* allow local address reuse */ #define SO_KEEPALIVE 0x0008 /* keep connections alive */ -#define SO_TYPE 0x0010 /* get socket type */ +#define SO_DONTROUTE 0x0010 /* just use interface addresses */ +#define SO_BROADCAST 0x0020 /* permit sending of broadcast msgs */ +#define SO_USELOOPBACK 0x0040 /* bypass hardware when possible */ +#define SO_LINGER 0x0080 /* linger on close if data present */ +#define SO_OOBINLINE 0x0100 /* leave received OOB data in line */ +#define SO_REUSEPORT 0x0200 /* allow local address & port reuse */ +/* SO_OTIMESTAMP 0x0400 */ +#define SO_NOSIGPIPE 0x0800 /* no SIGPIPE from EPIPE */ +#define SO_ACCEPTFILTER 0x1000 /* there is an accept filter */ +#define SO_TIMESTAMP 0x2000 /* timestamp received dgram traffic */ + +#ifdef __minix +#define SO_PASSCRED 0x100000 +#define SO_PEERCRED 0x200000 +#endif -#define SO_PASSCRED 0x0012 -#define SO_PEERCRED 0x0014 /* * Additional options, not kept in so_options. @@ -135,8 +147,27 @@ typedef _BSD_SSIZE_T_ ssize_t; /* SO_OSNDTIMEO 0x1005 */ /* SO_ORCVTIMEO 0x1006 */ #define SO_ERROR 0x1007 /* get error status and clear */ +#define SO_TYPE 0x1008 /* get socket type */ #define SO_OVERFLOWED 0x1009 /* datagrams: return packets dropped */ +#define SO_NOHEADER 0x100a /* user supplies no header to kernel; + * kernel removes header and supplies + * payload + */ +#define SO_SNDTIMEO 0x100b /* send timeout */ +#define SO_RCVTIMEO 0x100c /* receive timeout */ +/* + * Structure used for manipulating linger option. + */ +struct linger { + int l_onoff; /* option on/off */ + int l_linger; /* linger time in seconds */ +}; + +struct accept_filter_arg { + char af_name[16]; + char af_arg[256-16]; +}; /* * Level number for (get/set)sockopt() to apply to socket itself. @@ -165,7 +196,7 @@ typedef _BSD_SSIZE_T_ ssize_t; #define AF_LAT 14 /* LAT */ #define AF_HYLINK 15 /* NSC Hyperchannel */ #define AF_APPLETALK 16 /* Apple Talk */ -#define AF_ROUTE 17 /* Internal Routing Protocol */ +#define AF_OROUTE 17 /* Internal Routing Protocol */ #define AF_LINK 18 /* Link layer interface */ #if defined(_NETBSD_SOURCE) #define pseudo_AF_XTP 19 /* eXpress Transfer Protocol (no AF) */ @@ -191,44 +222,44 @@ typedef _BSD_SSIZE_T_ ssize_t; #endif #define AF_BLUETOOTH 31 /* Bluetooth: HCI, SCO, L2CAP, RFCOMM */ #define AF_IEEE80211 32 /* IEEE80211 */ - -#define AF_MAX 33 - -#ifndef gid_t -typedef __gid_t gid_t; /* group id */ -#define gid_t __gid_t -#endif - -#ifndef uid_t -typedef __uid_t uid_t; /* user id */ -#define uid_t __uid_t -#endif - -#if defined(__minix) && !defined(_STANDALONE) -#include -#endif +#define AF_MPLS 33 /* MultiProtocol Label Switching */ +#define AF_ROUTE 34 /* Internal Routing Protocol */ +#define AF_MAX 35 /* * Structure used by kernel to store most * addresses. */ -struct sockaddr -{ - sa_family_t sa_family; - char sa_data[8]; /* Big enough for sockaddr_in */ +struct sockaddr { + __uint8_t sa_len; /* total length */ + sa_family_t sa_family; /* address family */ + char sa_data[14]; /* actually longer; address value */ }; +#if defined(_KERNEL) +/* + * Structure used by kernel to pass protocol + * information in raw sockets. + */ +struct sockproto { + u_short sp_family; /* address family */ + u_short sp_protocol; /* protocol */ +}; +#endif /* _KERNEL */ + +#if 1 /* * RFC 2553: protocol-independent placeholder for socket addresses */ #define _SS_MAXSIZE 128 #define _SS_ALIGNSIZE (sizeof(__int64_t)) -#define _SS_PAD1SIZE (_SS_ALIGNSIZE - 1) -#define _SS_PAD2SIZE (_SS_MAXSIZE - 1 - \ +#define _SS_PAD1SIZE (_SS_ALIGNSIZE - 2) +#define _SS_PAD2SIZE (_SS_MAXSIZE - 2 - \ _SS_PAD1SIZE - _SS_ALIGNSIZE) #if (_XOPEN_SOURCE - 0) >= 500 || defined(_NETBSD_SOURCE) struct sockaddr_storage { + __uint8_t ss_len; /* address length */ sa_family_t ss_family; /* address family */ char __ss_pad1[_SS_PAD1SIZE]; __int64_t __ss_align;/* force desired structure storage alignment */ @@ -237,6 +268,7 @@ struct sockaddr_storage { #define sstosa(__ss) ((struct sockaddr *)(__ss)) #define sstocsa(__ss) ((const struct sockaddr *)(__ss)) #endif /* _XOPEN_SOURCE >= 500 || _NETBSD_SOURCE */ +#endif /* 1 */ /* * Protocol families, same as address families for now. @@ -244,7 +276,6 @@ struct sockaddr_storage { #define PF_UNSPEC AF_UNSPEC #define PF_LOCAL AF_LOCAL #define PF_UNIX PF_LOCAL /* backward compatibility */ -#define PF_FILE PF_LOCAL /* Minix compatibility */ #define PF_INET AF_INET #define PF_IMPLINK AF_IMPLINK #define PF_PUP AF_PUP @@ -287,6 +318,160 @@ struct sockaddr_storage { #define PF_MAX AF_MAX +#if defined(_NETBSD_SOURCE) + +#ifndef gid_t +typedef __gid_t gid_t; /* group id */ +#define gid_t __gid_t +#endif + +#ifndef uid_t +typedef __uid_t uid_t; /* user id */ +#define uid_t __uid_t +#endif + +/* + * Socket credentials. + */ +struct sockcred { + uid_t sc_uid; /* real user id */ + uid_t sc_euid; /* effective user id */ + gid_t sc_gid; /* real group id */ + gid_t sc_egid; /* effective group id */ + int sc_ngroups; /* number of supplemental groups */ + gid_t sc_groups[1]; /* variable length */ +}; + +/* + * Compute size of a sockcred structure with groups. + */ +#define SOCKCREDSIZE(ngrps) \ + (sizeof(struct sockcred) + (sizeof(gid_t) * ((ngrps) - 1))) +#endif /* _NETBSD_SOURCE */ + + +#if defined(_NETBSD_SOURCE) +/* + * Definitions for network related sysctl, CTL_NET. + * + * Second level is protocol family. + * Third level is protocol number. + * + * Further levels are defined by the individual families below. + */ +#define NET_MAXID AF_MAX + +#define CTL_NET_NAMES { \ + { 0, 0 }, \ + { "local", CTLTYPE_NODE }, \ + { "inet", CTLTYPE_NODE }, \ + { "implink", CTLTYPE_NODE }, \ + { "pup", CTLTYPE_NODE }, \ + { "chaos", CTLTYPE_NODE }, \ + { "xerox_ns", CTLTYPE_NODE }, \ + { "iso", CTLTYPE_NODE }, \ + { "emca", CTLTYPE_NODE }, \ + { "datakit", CTLTYPE_NODE }, \ + { "ccitt", CTLTYPE_NODE }, \ + { "ibm_sna", CTLTYPE_NODE }, \ + { "decnet", CTLTYPE_NODE }, \ + { "dec_dli", CTLTYPE_NODE }, \ + { "lat", CTLTYPE_NODE }, \ + { "hylink", CTLTYPE_NODE }, \ + { "appletalk", CTLTYPE_NODE }, \ + { "oroute", CTLTYPE_NODE }, \ + { "link_layer", CTLTYPE_NODE }, \ + { "xtp", CTLTYPE_NODE }, \ + { "coip", CTLTYPE_NODE }, \ + { "cnt", CTLTYPE_NODE }, \ + { "rtip", CTLTYPE_NODE }, \ + { "ipx", CTLTYPE_NODE }, \ + { "inet6", CTLTYPE_NODE }, \ + { "pip", CTLTYPE_NODE }, \ + { "isdn", CTLTYPE_NODE }, \ + { "natm", CTLTYPE_NODE }, \ + { "arp", CTLTYPE_NODE }, \ + { "key", CTLTYPE_NODE }, \ + { "ieee80211", CTLTYPE_NODE }, \ + { "mlps", CTLTYPE_NODE }, \ + { "route", CTLTYPE_NODE }, \ +} + +struct kinfo_pcb { + __uint64_t ki_pcbaddr; /* PTR: pcb addr */ + __uint64_t ki_ppcbaddr; /* PTR: ppcb addr */ + __uint64_t ki_sockaddr; /* PTR: socket addr */ + + __uint32_t ki_family; /* INT: protocol family */ + __uint32_t ki_type; /* INT: socket type */ + __uint32_t ki_protocol; /* INT: protocol */ + __uint32_t ki_pflags; /* INT: generic protocol flags */ + + __uint32_t ki_sostate; /* INT: socket state */ + __uint32_t ki_prstate; /* INT: protocol state */ + __int32_t ki_tstate; /* INT: tcp state */ + __uint32_t ki_tflags; /* INT: tcp flags */ + + __uint64_t ki_rcvq; /* U_LONG: receive queue len */ + __uint64_t ki_sndq; /* U_LONG: send queue len */ + + union { + struct sockaddr _kis_src; /* STRUCT: local address */ + char _kis_pad[256 + 8]; /* pad to max addr length */ + } ki_s; + union { + struct sockaddr _kid_dst; /* STRUCT: remote address */ + char _kid_pad[256 + 8]; /* pad to max addr length */ + } ki_d; + + __uint64_t ki_inode; /* INO_T: fake inode number */ + __uint64_t ki_vnode; /* PTR: if associated with file */ + __uint64_t ki_conn; /* PTR: control block of peer */ + __uint64_t ki_refs; /* PTR: referencing socket */ + __uint64_t ki_nextref; /* PTR: link in refs list */ +}; + +#define ki_src ki_s._kis_src +#define ki_dst ki_d._kid_dst + +#define PCB_SLOP 20 +#define PCB_ALL 0 + +#endif /* _NETBSD_SOURCE */ + +#if defined(_NETBSD_SOURCE) +/* + * PF_ROUTE - Routing table + * + * Three additional levels are defined: + * Fourth: address family, 0 is wildcard + * Fifth: type of info, defined below + * Sixth: flag(s) to mask with for NET_RT_FLAGS + */ +#define NET_RT_DUMP 1 /* dump; may limit to a.f. */ +#define NET_RT_FLAGS 2 /* by flags, e.g. RESOLVING */ +#define NET_RT_OOIFLIST 3 /* old NET_RT_IFLIST (pre 1.5) */ +#define NET_RT_OIFLIST 4 /* survey interface list */ +#define NET_RT_IFLIST 5 +#define NET_RT_MAXID 6 + +#define CTL_NET_RT_NAMES { \ + { 0, 0 }, \ + { "dump", CTLTYPE_STRUCT }, \ + { "flags", CTLTYPE_STRUCT }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { "iflist", CTLTYPE_STRUCT }, \ +} +#endif /* _NETBSD_SOURCE */ + +/* + * Maximum queue length specifiable by listen(2). + */ +#ifndef SOMAXCONN +#define SOMAXCONN 128 +#endif + /* * Message header for recvmsg and sendmsg calls. * Used value-result for recvmsg, value only for sendmsg. @@ -301,10 +486,35 @@ struct msghdr { int msg_flags; /* flags on received message */ }; -#define MSG_OOB 0x0001 /* process out-of-band data */ -#define MSG_PEEK 0x0002 /* peek at incoming message */ -#define MSG_DONTROUTE 0x0004 /* send without using routing tables */ -#define MSG_EOR 0x0008 /* complete record */ +#define MSG_OOB 0x0001 /* process out-of-band data */ +#define MSG_PEEK 0x0002 /* peek at incoming message */ +#define MSG_DONTROUTE 0x0004 /* send without using routing tables */ +#define MSG_EOR 0x0008 /* data completes record */ +#define MSG_TRUNC 0x0010 /* data discarded before delivery */ +#define MSG_CTRUNC 0x0020 /* control data lost before delivery */ +#define MSG_WAITALL 0x0040 /* wait for full request or error */ +#define MSG_DONTWAIT 0x0080 /* this message should be nonblocking */ +#define MSG_BCAST 0x0100 /* this message was rcvd using link-level brdcst */ +#define MSG_MCAST 0x0200 /* this message was rcvd using link-level mcast */ +#define MSG_NOSIGNAL 0x0400 /* do not generate SIGPIPE on EOF */ +#if defined(_NETBSD_SOURCE) +#define MSG_CMSG_CLOEXEC 0x0800 /* close on exec receiving fd */ +#define MSG_NBIO 0x1000 /* use non-blocking I/O */ +#define MSG_WAITFORONE 0x2000 /* recvmmsg() wait for one message */ + +struct mmsghdr { + struct msghdr msg_hdr; + unsigned int msg_len; +}; +#endif + +/* Extra flags used internally only */ +#define MSG_USERFLAGS 0x0ffffff +#define MSG_NAMEMBUF 0x1000000 /* msg_name is an mbuf */ +#define MSG_CONTROLMBUF 0x2000000 /* msg_control is an mbuf */ +#define MSG_IOVUSRSPACE 0x4000000 /* msg_iov is in user space */ +#define MSG_LENUSRSPACE 0x8000000 /* address length is in user space */ + /* * Header for ancillary data objects in msg_control buffer. * Used for additional information with/about a datagram @@ -318,37 +528,55 @@ struct cmsghdr { /* followed by u_char cmsg_data[]; */ }; -#define CMSG_FIRSTHDR(mhdr) \ - ( (mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \ - (struct cmsghdr *)(mhdr)->msg_control : \ - (struct cmsghdr *)NULL ) +/* given pointer to struct cmsghdr, return pointer to data */ +#define CMSG_DATA(cmsg) \ + ((u_char *)(void *)(cmsg) + __CMSG_ALIGN(sizeof(struct cmsghdr))) +#define CCMSG_DATA(cmsg) \ + ((const u_char *)(const void *)(cmsg) + \ + __CMSG_ALIGN(sizeof(struct cmsghdr))) -#define CMSG_ALIGN(len) \ - ( (len % sizeof(long) == 0) ? \ - len : \ - len + sizeof(long) - (len % sizeof(long)) ) +/* + * Alignment requirement for CMSG struct manipulation. + * This basically behaves the same as ALIGN() ARCH/include/param.h. + * We declare it separately for two reasons: + * (1) avoid dependency between machine/param.h, and (2) to sync with kernel's + * idea of ALIGNBYTES at runtime. + * without (2), we can't guarantee binary compatibility in case of future + * changes in ALIGNBYTES. + */ +#define __CMSG_ALIGN(n) (((n) + __ALIGNBYTES) & ~__ALIGNBYTES) +#ifdef _KERNEL +#define CMSG_ALIGN(n) __CMSG_ALIGN(n) +#endif -#define CMSG_NXTHDR(mhdr, cmsg) \ - ( ((cmsg) == NULL) ? CMSG_FIRSTHDR(mhdr) : \ - (((unsigned char *)(cmsg) + CMSG_ALIGN((cmsg)->cmsg_len) \ - + CMSG_ALIGN(sizeof(struct cmsghdr)) > \ - (unsigned char *)((mhdr)->msg_control) + \ - (mhdr)->msg_controllen) ? \ - (struct cmsghdr *)NULL : \ - (struct cmsghdr *)((unsigned char *)(cmsg) + \ - CMSG_ALIGN((cmsg)->cmsg_len))) ) +/* given pointer to struct cmsghdr, return pointer to next cmsghdr */ +#define CMSG_NXTHDR(mhdr, cmsg) \ + (((char *)(cmsg) + __CMSG_ALIGN((cmsg)->cmsg_len) + \ + __CMSG_ALIGN(sizeof(struct cmsghdr)) > \ + (((char *)(mhdr)->msg_control) + (mhdr)->msg_controllen)) ? \ + (struct cmsghdr *)0 : \ + (struct cmsghdr *)(void *)((char *)(cmsg) + \ + __CMSG_ALIGN((cmsg)->cmsg_len))) -#define CMSG_DATA(cmsg) \ - ( (unsigned char *)(cmsg) + CMSG_ALIGN(sizeof(struct cmsghdr)) ) +/* + * RFC 2292 requires to check msg_controllen, in case that the kernel returns + * an empty list for some reasons. + */ +#define CMSG_FIRSTHDR(mhdr) \ + ((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \ + (struct cmsghdr *)(mhdr)->msg_control : \ + (struct cmsghdr *)0) -#define CMSG_SPACE(l) (CMSG_ALIGN(sizeof(struct cmsghdr)) + CMSG_ALIGN(l)) -#define CMSG_LEN(l) (CMSG_ALIGN(sizeof(struct cmsghdr)) + (l)) +#define CMSG_SPACE(l) (__CMSG_ALIGN(sizeof(struct cmsghdr)) + __CMSG_ALIGN(l)) +#define CMSG_LEN(l) (__CMSG_ALIGN(sizeof(struct cmsghdr)) + (l)) /* "Socket"-level control message types: */ -#define SCM_RIGHTS 0x01 -#define SCM_CREDENTIALS 0x02 -#define SCM_SECURITY 0x04 - +#define SCM_RIGHTS 0x01 /* access rights (array of int) */ +#if defined(_NETBSD_SOURCE) +/* 0x02 timestamp (struct timeval50) */ +#define SCM_CREDS 0x04 /* credentials (struct sockcred) */ +#define SCM_TIMESTAMP 0x08 /* timestamp (struct timeval) */ +#endif /* * Types of socket shutdown(2). @@ -359,9 +587,31 @@ struct cmsghdr { #include +#ifdef _KERNEL +static inline socklen_t +sockaddr_getlen(const struct sockaddr *sa) +{ + return sa->sa_len; +} + __BEGIN_DECLS -int __cmsg_alignbytes(void); +struct sockaddr *sockaddr_copy(struct sockaddr *, socklen_t, + const struct sockaddr *); +struct sockaddr *sockaddr_externalize(struct sockaddr *, socklen_t, + const struct sockaddr *); +struct sockaddr *sockaddr_alloc(sa_family_t, socklen_t, int); +const void *sockaddr_const_addr(const struct sockaddr *, socklen_t *); +void *sockaddr_addr(struct sockaddr *, socklen_t *); +const struct sockaddr *sockaddr_any(const struct sockaddr *); +const struct sockaddr *sockaddr_any_by_family(int); +const void *sockaddr_anyaddr(const struct sockaddr *, socklen_t *); +int sockaddr_cmp(const struct sockaddr *, const struct sockaddr *); +struct sockaddr *sockaddr_dup(const struct sockaddr *, int); +void sockaddr_free(struct sockaddr *); __END_DECLS +#endif /* _KERNEL */ + +#ifndef _KERNEL __BEGIN_DECLS int accept(int, struct sockaddr * __restrict, socklen_t * __restrict); @@ -371,6 +621,8 @@ int getpeername(int, struct sockaddr * __restrict, socklen_t * __restrict); int getsockname(int, struct sockaddr * __restrict, socklen_t * __restrict); int getsockopt(int, int, int, void *__restrict, socklen_t * __restrict); int listen(int, int); +int paccept(int, struct sockaddr * __restrict, socklen_t * __restrict, + const sigset_t * __restrict, int); ssize_t recv(int, void *, size_t, int); ssize_t recvfrom(int, void *__restrict, size_t, int, struct sockaddr * __restrict, socklen_t * __restrict); @@ -382,9 +634,20 @@ ssize_t sendmsg(int, const struct msghdr *, int); int setsockopt(int, int, int, const void *, socklen_t); int shutdown(int, int); int sockatmark(int); -int socket(int, int, int); +int socket(int, int, int) +#if !defined(__LIBC12_SOURCE__) && !defined(_STANDALONE) +__RENAME(__socket30) +#endif + ; int socketpair(int, int, int, int *); -__END_DECLS +#if defined(_NETBSD_SOURCE) +int sendmmsg(int, struct mmsghdr *, unsigned int, unsigned int); +struct timespec; +int recvmmsg(int, struct mmsghdr *, unsigned int, unsigned int, + struct timespec *); +#endif +__END_DECLS +#endif /* !_KERNEL */ #endif /* !_SYS_SOCKET_H_ */ diff --git a/test/test56.c b/test/test56.c index 88e0c49e7..8fbf9488b 100644 --- a/test/test56.c +++ b/test/test56.c @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -306,8 +307,8 @@ void test_header(void) test_fail("SUN_LEN(&sun) should be 5"); } - if (PF_UNIX != PF_LOCAL || PF_UNIX != PF_FILE || PF_UNIX != AF_UNIX) { - test_fail("PF_UNIX, PF_LOCAL, PF_FILE, and AF_UNIX"); + if (PF_UNIX != PF_LOCAL || PF_UNIX != AF_UNIX) { + test_fail("PF_UNIX, PF_LOCAL and AF_UNIX"); } } @@ -2242,7 +2243,7 @@ void test_scm_credentials(void) cmsg = CMSG_NXTHDR(&msg2, cmsg)) { if (cmsg->cmsg_level == SOL_SOCKET && - cmsg->cmsg_type == SCM_CREDENTIALS) { + cmsg->cmsg_type == SCM_CREDS) { memcpy(&cred, CMSG_DATA(cmsg), sizeof(struct uucred)); break;