1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 /* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */ 28 /* All Rights Reserved */ 29 30 /* 31 * University Copyright- Copyright (c) 1982, 1986, 1988 32 * The Regents of the University of California 33 * All Rights Reserved 34 * 35 * University Acknowledgment- Portions of this document are derived from 36 * software developed by the University of California, Berkeley, and its 37 * contributors. 38 */ 39 40 #ifndef _SYS_SOCKETVAR_H 41 #define _SYS_SOCKETVAR_H 42 43 #pragma ident "%Z%%M% %I% %E% SMI" 44 45 #include <sys/types.h> 46 #include <sys/stream.h> 47 #include <sys/t_lock.h> 48 #include <sys/cred.h> 49 #include <sys/vnode.h> 50 #include <sys/file.h> 51 #include <sys/param.h> 52 #include <sys/zone.h> 53 #include <inet/kssl/ksslapi.h> 54 55 #ifdef __cplusplus 56 extern "C" { 57 #endif 58 59 60 61 /* 62 * Internal representation used for addresses. 63 */ 64 struct soaddr { 65 struct sockaddr *soa_sa; /* Actual address */ 66 t_uscalar_t soa_len; /* Length in bytes for kmem_free */ 67 t_uscalar_t soa_maxlen; /* Allocated length */ 68 }; 69 /* Maximum size address for transports that have ADDR_size == 1 */ 70 #define SOA_DEFSIZE 128 71 72 /* 73 * Internal representation of the address used to represent addresses 74 * in the loopback transport for AF_UNIX. While the sockaddr_un is used 75 * as the sockfs layer address for AF_UNIX the pathnames contained in 76 * these addresses are not unique (due to relative pathnames) thus can not 77 * be used in the transport. 78 * 79 * The transport level address consists of a magic number (used to separate the 80 * name space for specific and implicit binds). For a specific bind 81 * this is followed by a "vnode *" which ensures that all specific binds 82 * have a unique transport level address. For implicit binds the latter 83 * part of the address is a byte string (of the same length as a pointer) 84 * that is assigned by the loopback transport. 85 * 86 * The uniqueness assumes that the loopback transport has a separate namespace 87 * for sockets in order to avoid name conflicts with e.g. TLI use of the 88 * same transport. 89 */ 90 struct so_ux_addr { 91 void *soua_vp; /* vnode pointer or assigned by tl */ 92 uint_t soua_magic; /* See below */ 93 }; 94 95 #define SOU_MAGIC_EXPLICIT 0x75787670 /* "uxvp" */ 96 #define SOU_MAGIC_IMPLICIT 0x616e6f6e /* "anon" */ 97 98 struct sockaddr_ux { 99 sa_family_t sou_family; /* AF_UNIX */ 100 struct so_ux_addr sou_addr; 101 }; 102 103 typedef struct sonodeops sonodeops_t; 104 typedef struct sonode sonode_t; 105 106 /* 107 * The sonode represents a socket. A sonode never exist in the file system 108 * name space and can not be opened using open() - only the socket, socketpair 109 * and accept calls create sonodes. 110 * 111 * When an AF_UNIX socket is bound to a pathname the sockfs 112 * creates a VSOCK vnode in the underlying file system. However, the vnodeops 113 * etc in this VNODE remain those of the underlying file system. 114 * Sockfs uses the v_stream pointer in the underlying file system VSOCK node 115 * to find the sonode bound to the pathname. The bound pathname vnode 116 * is accessed through so_ux_vp. 117 * 118 * A socket always corresponds to a VCHR stream representing the transport 119 * provider (e.g. /dev/tcp). This information is retrieved from the kernel 120 * socket configuration table and entered into so_accessvp. sockfs uses 121 * this to perform VOP_ACCESS checks before allowing an open of the transport 122 * provider. 123 * 124 * The locking of sockfs uses the so_lock mutex plus the SOLOCKED 125 * and SOREADLOCKED flags in so_flag. The mutex protects all the state 126 * in the sonode. The SOLOCKED flag is used to single-thread operations from 127 * sockfs users to prevent e.g. multiple bind() calls to operate on the 128 * same sonode concurrently. The SOREADLOCKED flag is used to ensure that 129 * only one thread sleeps in kstrgetmsg for a given sonode. This is needed 130 * to ensure atomic operation for things like MSG_WAITALL. 131 * 132 * Note that so_lock is sometimes held across calls that might go to sleep 133 * (kmem_alloc and soallocproto*). This implies that no other lock in 134 * the system should be held when calling into sockfs; from the system call 135 * side or from strrput. If locks are held while calling into sockfs 136 * the system might hang when running low on memory. 137 */ 138 struct sonode { 139 struct vnode *so_vnode; /* vnode associated with this sonode */ 140 141 sonodeops_t *so_ops; /* operations vector for this sonode */ 142 143 /* 144 * These fields are initialized once. 145 */ 146 dev_t so_dev; /* device the sonode represents */ 147 struct vnode *so_accessvp; /* vnode for the /dev entry */ 148 149 /* The locks themselves */ 150 kmutex_t so_lock; /* protects sonode fields */ 151 kmutex_t so_plumb_lock; /* serializes plumbs, and the related */ 152 /* fields so_version and so_pushcnt */ 153 kcondvar_t so_state_cv; /* synchronize state changes */ 154 kcondvar_t so_ack_cv; /* wait for TPI acks */ 155 kcondvar_t so_connind_cv; /* wait for T_CONN_IND */ 156 kcondvar_t so_want_cv; /* wait due to SOLOCKED */ 157 158 /* These fields are protected by so_lock */ 159 uint_t so_state; /* internal state flags SS_*, below */ 160 uint_t so_mode; /* characteristics on socket. SM_* */ 161 162 mblk_t *so_ack_mp; /* TPI ack received from below */ 163 mblk_t *so_conn_ind_head; /* b_next list of T_CONN_IND */ 164 mblk_t *so_conn_ind_tail; 165 mblk_t *so_unbind_mp; /* Preallocated T_UNBIND_REQ message */ 166 167 ushort_t so_flag; /* flags, see below */ 168 dev_t so_fsid; /* file system identifier */ 169 time_t so_atime; /* time of last access */ 170 time_t so_mtime; /* time of last modification */ 171 time_t so_ctime; /* time of last attributes change */ 172 int so_count; /* count of opened references */ 173 174 /* Needed to recreate the same socket for accept */ 175 short so_family; 176 short so_type; 177 short so_protocol; 178 short so_version; /* From so_socket call */ 179 short so_pushcnt; /* Number of modules above "sockmod" */ 180 181 /* Options */ 182 short so_options; /* From socket call, see socket.h */ 183 struct linger so_linger; /* SO_LINGER value */ 184 int so_sndbuf; /* SO_SNDBUF value */ 185 int so_rcvbuf; /* SO_RCVBUF value */ 186 int so_sndlowat; /* send low water mark */ 187 int so_rcvlowat; /* receive low water mark */ 188 #ifdef notyet 189 int so_sndtimeo; /* Not yet implemented */ 190 int so_rcvtimeo; /* Not yet implemented */ 191 #endif /* notyet */ 192 ushort_t so_error; /* error affecting connection */ 193 ushort_t so_delayed_error; /* From T_uderror_ind */ 194 int so_backlog; /* Listen backlog */ 195 196 /* 197 * The counts (so_oobcnt and so_oobsigcnt) track the number of 198 * urgent indicates that are (logically) queued on the stream head 199 * read queue. The urgent data is queued on the stream head 200 * as follows. 201 * 202 * In the normal case the SIGURG is not generated until 203 * the T_EXDATA_IND arrives at the stream head. However, transports 204 * that have an early indication that urgent data is pending 205 * (e.g. TCP receiving a "new" urgent pointer value) can send up 206 * an M_PCPROTO/SIGURG message to generate the signal early. 207 * 208 * The mark is indicated by either: 209 * - a T_EXDATA_IND (with no M_DATA b_cont) with MSGMARK set. 210 * When this message is consumed by sorecvmsg the socket layer 211 * sets SS_RCVATMARK until data has been consumed past the mark. 212 * - a message with MSGMARKNEXT set (indicating that the 213 * first byte of the next message constitutes the mark). When 214 * the last byte of the MSGMARKNEXT message is consumed in 215 * the stream head the stream head sets STRATMARK. This flag 216 * is cleared when at least one byte is read. (Note that 217 * the MSGMARKNEXT messages can be of zero length when there 218 * is no previous data to which the marknext can be attached.) 219 * 220 * While the T_EXDATA_IND method is the common case which is used 221 * with all TPI transports, the MSGMARKNEXT method is needed to 222 * indicate the mark when e.g. the TCP urgent byte has not been 223 * received yet but the TCP urgent pointer has made TCP generate 224 * the M_PCSIG/SIGURG. 225 * 226 * The signal (the M_PCSIG carrying the SIGURG) and the mark 227 * indication can not be delivered as a single message, since 228 * the signal should be delivered as high priority and any mark 229 * indication must flow with the data. This implies that immediately 230 * when the SIGURG has been delivered if the stream head queue is 231 * empty it is impossible to determine if this will be the position 232 * of the mark. This race condition is resolved by using MSGNOTMARKNEXT 233 * messages and the STRNOTATMARK flag in the stream head. The 234 * SIOCATMARK code calls the stream head to wait for either a 235 * non-empty queue or one of the STR*ATMARK flags being set. 236 * This implies that any transport that is sending M_PCSIG(SIGURG) 237 * should send the appropriate MSGNOTMARKNEXT message (which can be 238 * zero length) after sending an M_PCSIG to prevent SIOCATMARK 239 * from sleeping unnecessarily. 240 */ 241 mblk_t *so_oobmsg; /* outofline oob data */ 242 uint_t so_oobsigcnt; /* Number of SIGURG generated */ 243 uint_t so_oobcnt; /* Number of T_EXDATA_IND queued */ 244 pid_t so_pgrp; /* pgrp for signals */ 245 246 /* From T_info_ack */ 247 t_uscalar_t so_tsdu_size; 248 t_uscalar_t so_etsdu_size; 249 t_scalar_t so_addr_size; 250 t_uscalar_t so_opt_size; 251 t_uscalar_t so_tidu_size; 252 t_scalar_t so_serv_type; 253 254 /* From T_capability_ack */ 255 t_uscalar_t so_acceptor_id; 256 257 /* Internal provider information */ 258 struct tpi_provinfo *so_provinfo; 259 260 /* 261 * The local and remote addresses have multiple purposes 262 * but one of the key reasons for their existence and careful 263 * tracking in sockfs is to support getsockname and getpeername 264 * when the transport does not handle the TI_GET*NAME ioctls 265 * and caching when it does (signalled by valid bits in so_state). 266 * When all transports support the new TPI (with T_ADDR_REQ) 267 * we can revisit this code. 268 * The other usage of so_faddr is to keep the "connected to" 269 * address for datagram sockets. 270 * Finally, for AF_UNIX both local and remote addresses are used 271 * to record the sockaddr_un since we use a separate namespace 272 * in the loopback transport. 273 */ 274 struct soaddr so_laddr; /* Local address */ 275 struct soaddr so_faddr; /* Peer address */ 276 #define so_laddr_sa so_laddr.soa_sa 277 #define so_faddr_sa so_faddr.soa_sa 278 #define so_laddr_len so_laddr.soa_len 279 #define so_faddr_len so_faddr.soa_len 280 #define so_laddr_maxlen so_laddr.soa_maxlen 281 #define so_faddr_maxlen so_faddr.soa_maxlen 282 mblk_t *so_eaddr_mp; /* for so_delayed_error */ 283 284 /* 285 * For AF_UNIX sockets: 286 * so_ux_laddr/faddr records the internal addresses used with the 287 * transport. 288 * so_ux_vp and v_stream->sd_vnode form the cross- 289 * linkage between the underlying fs vnode corresponding to 290 * the bound sockaddr_un and the socket node. 291 */ 292 struct so_ux_addr so_ux_laddr; /* laddr bound with the transport */ 293 struct so_ux_addr so_ux_faddr; /* temporary peer address */ 294 struct vnode *so_ux_bound_vp; /* bound AF_UNIX file system vnode */ 295 struct sonode *so_next; /* next sonode on socklist */ 296 struct sonode *so_prev; /* previous sonode on socklist */ 297 mblk_t *so_discon_ind_mp; /* T_DISCON_IND received from below */ 298 299 /* put here for delayed processing */ 300 void *so_priv; /* sonode private data */ 301 cred_t *so_peercred; /* connected socket peer cred */ 302 pid_t so_cpid; /* connected socket peer cached pid */ 303 zoneid_t so_zoneid; /* opener's zoneid */ 304 305 kmem_cache_t *so_cache; /* object cache of this "sonode". */ 306 void *so_obj; /* object to free */ 307 308 /* 309 * For NL7C sockets: 310 * 311 * so_nl7c_flags the NL7C state of URL processing. 312 * 313 * so_nl7c_rcv_mp mblk_t chain of already received data to be 314 * passed up to the app after NL7C gives up on 315 * a socket. 316 * 317 * so_nl7c_rcv_rval returned rval for last mblk_t from above. 318 * 319 * so_nl7c_uri the URI currently being processed. 320 * 321 * so_nl7c_rtime URI request gethrestime_sec(). 322 */ 323 uint64_t so_nl7c_flags; 324 mblk_t *so_nl7c_rcv_mp; 325 int64_t so_nl7c_rcv_rval; 326 void *so_nl7c_uri; 327 time_t so_nl7c_rtime; 328 329 /* For sockets acting as an in-kernel SSL proxy */ 330 kssl_endpt_type_t so_kssl_type; /* is proxy/is proxied/none */ 331 kssl_ent_t so_kssl_ent; /* SSL config entry */ 332 kssl_ctx_t so_kssl_ctx; /* SSL session context */ 333 }; 334 335 /* flags */ 336 #define SOMOD 0x0001 /* update socket modification time */ 337 #define SOACC 0x0002 /* update socket access time */ 338 339 #define SOLOCKED 0x0010 /* use to serialize open/closes */ 340 #define SOREADLOCKED 0x0020 /* serialize kstrgetmsg calls */ 341 #define SOWANT 0x0040 /* some process waiting on lock */ 342 #define SOCLONE 0x0080 /* child of clone driver */ 343 #define SOASYNC_UNBIND 0x0100 /* wait for ACK of async unbind */ 344 345 /* 346 * Socket state bits. 347 */ 348 #define SS_ISCONNECTED 0x00000001 /* socket connected to a peer */ 349 #define SS_ISCONNECTING 0x00000002 /* in process, connecting to peer */ 350 #define SS_ISDISCONNECTING 0x00000004 /* in process of disconnecting */ 351 #define SS_CANTSENDMORE 0x00000008 /* can't send more data to peer */ 352 353 #define SS_CANTRCVMORE 0x00000010 /* can't receive more data */ 354 #define SS_ISBOUND 0x00000020 /* socket is bound */ 355 #define SS_NDELAY 0x00000040 /* FNDELAY non-blocking */ 356 #define SS_NONBLOCK 0x00000080 /* O_NONBLOCK non-blocking */ 357 358 #define SS_ASYNC 0x00000100 /* async i/o notify */ 359 #define SS_ACCEPTCONN 0x00000200 /* listen done */ 360 #define SS_HASCONNIND 0x00000400 /* T_CONN_IND for poll */ 361 #define SS_SAVEDEOR 0x00000800 /* Saved MSG_EOR rcv side state */ 362 363 #define SS_RCVATMARK 0x00001000 /* at mark on input */ 364 #define SS_OOBPEND 0x00002000 /* OOB pending or present - poll */ 365 #define SS_HAVEOOBDATA 0x00004000 /* OOB data present */ 366 #define SS_HADOOBDATA 0x00008000 /* OOB data consumed */ 367 368 #define SS_FADDR_NOXLATE 0x00020000 /* No xlation of faddr for AF_UNIX */ 369 370 #define SS_HASDATA 0x00040000 /* NCAfs: data available */ 371 #define SS_DONEREAD 0x00080000 /* NCAfs: all data read */ 372 #define SS_MOREDATA 0x00100000 /* NCAfs: NCA has more data */ 373 374 #define SS_DIRECT 0x00200000 /* transport is directly below */ 375 376 #define SS_LADDR_VALID 0x01000000 /* so_laddr valid for user */ 377 #define SS_FADDR_VALID 0x02000000 /* so_faddr valid for user */ 378 379 /* Set of states when the socket can't be rebound */ 380 #define SS_CANTREBIND (SS_ISCONNECTED|SS_ISCONNECTING|SS_ISDISCONNECTING|\ 381 SS_CANTSENDMORE|SS_CANTRCVMORE|SS_ACCEPTCONN) 382 383 /* 384 * Characteristics of sockets. Not changed after the socket is created. 385 */ 386 #define SM_PRIV 0x001 /* privileged for broadcast, raw... */ 387 #define SM_ATOMIC 0x002 /* atomic data transmission */ 388 #define SM_ADDR 0x004 /* addresses given with messages */ 389 #define SM_CONNREQUIRED 0x008 /* connection required by protocol */ 390 391 #define SM_FDPASSING 0x010 /* passes file descriptors */ 392 #define SM_EXDATA 0x020 /* Can handle T_EXDATA_REQ */ 393 #define SM_OPTDATA 0x040 /* Can handle T_OPTDATA_REQ */ 394 #define SM_BYTESTREAM 0x080 /* Byte stream - can use M_DATA */ 395 396 #define SM_ACCEPTOR_ID 0x100 /* so_acceptor_id is valid */ 397 398 /* 399 * Socket versions. Used by the socket library when calling _so_socket(). 400 */ 401 #define SOV_STREAM 0 /* Not a socket - just a stream */ 402 #define SOV_DEFAULT 1 /* Select based on so_default_version */ 403 #define SOV_SOCKSTREAM 2 /* Socket plus streams operations */ 404 #define SOV_SOCKBSD 3 /* Socket with no streams operations */ 405 #define SOV_XPG4_2 4 /* Xnet socket */ 406 407 #if defined(_KERNEL) || defined(_KMEMUSER) 408 /* 409 * Used for mapping family/type/protocol to vnode. 410 * Defined here so that crash can use it. 411 */ 412 struct sockparams { 413 int sp_domain; 414 int sp_type; 415 int sp_protocol; 416 char *sp_devpath; 417 int sp_devpathlen; /* Is 0 if sp_devpath is a static string */ 418 vnode_t *sp_vnode; 419 struct sockparams *sp_next; 420 }; 421 422 extern struct sockparams *sphead; 423 424 /* 425 * Used to traverse the list of AF_UNIX sockets to construct the kstat 426 * for netstat(1m). 427 */ 428 struct socklist { 429 kmutex_t sl_lock; 430 struct sonode *sl_list; 431 }; 432 433 extern struct socklist socklist; 434 /* 435 * ss_full_waits is the number of times the reader thread 436 * waits when the queue is full and ss_empty_waits is the number 437 * of times the consumer thread waits when the queue is empty. 438 * No locks for these as they are just indicators of whether 439 * disk or network or both is slow or fast. 440 */ 441 struct sendfile_stats { 442 uint32_t ss_file_cached; 443 uint32_t ss_file_not_cached; 444 uint32_t ss_full_waits; 445 uint32_t ss_empty_waits; 446 uint32_t ss_file_segmap; 447 }; 448 449 /* 450 * A single sendfile request is represented by snf_req. 451 */ 452 typedef struct snf_req { 453 struct snf_req *sr_next; 454 mblk_t *sr_mp_head; 455 mblk_t *sr_mp_tail; 456 kmutex_t sr_lock; 457 kcondvar_t sr_cv; 458 uint_t sr_qlen; 459 int sr_hiwat; 460 int sr_lowat; 461 int sr_operation; 462 struct vnode *sr_vp; 463 file_t *sr_fp; 464 ssize_t sr_maxpsz; 465 u_offset_t sr_file_off; 466 u_offset_t sr_file_size; 467 #define SR_READ_DONE 0x80000000 468 int sr_read_error; 469 int sr_write_error; 470 } snf_req_t; 471 472 /* A queue of sendfile requests */ 473 struct sendfile_queue { 474 snf_req_t *snfq_req_head; 475 snf_req_t *snfq_req_tail; 476 kmutex_t snfq_lock; 477 kcondvar_t snfq_cv; 478 int snfq_svc_threads; /* # of service threads */ 479 int snfq_idle_cnt; /* # of idling threads */ 480 int snfq_max_threads; 481 int snfq_req_cnt; /* Number of requests */ 482 }; 483 484 #define READ_OP 1 485 #define SNFQ_TIMEOUT (60 * 5 * hz) /* 5 minutes */ 486 487 /* Socket network operations switch */ 488 struct sonodeops { 489 int (*sop_accept)(struct sonode *, int, struct sonode **); 490 int (*sop_bind)(struct sonode *, struct sockaddr *, socklen_t, 491 int); 492 int (*sop_listen)(struct sonode *, int); 493 int (*sop_connect)(struct sonode *, const struct sockaddr *, 494 socklen_t, int, int); 495 int (*sop_recvmsg)(struct sonode *, struct msghdr *, 496 struct uio *); 497 int (*sop_sendmsg)(struct sonode *, struct msghdr *, 498 struct uio *); 499 int (*sop_getpeername)(struct sonode *); 500 int (*sop_getsockname)(struct sonode *); 501 int (*sop_shutdown)(struct sonode *, int); 502 int (*sop_getsockopt)(struct sonode *, int, int, void *, 503 socklen_t *, int); 504 int (*sop_setsockopt)(struct sonode *, int, int, const void *, 505 socklen_t); 506 }; 507 508 #define SOP_ACCEPT(so, fflag, nsop) \ 509 ((so)->so_ops->sop_accept((so), (fflag), (nsop))) 510 #define SOP_BIND(so, name, namelen, flags) \ 511 ((so)->so_ops->sop_bind((so), (name), (namelen), (flags))) 512 #define SOP_LISTEN(so, backlog) \ 513 ((so)->so_ops->sop_listen((so), (backlog))) 514 #define SOP_CONNECT(so, name, namelen, fflag, flags) \ 515 ((so)->so_ops->sop_connect((so), (name), (namelen), (fflag), (flags))) 516 #define SOP_RECVMSG(so, msg, uiop) \ 517 ((so)->so_ops->sop_recvmsg((so), (msg), (uiop))) 518 #define SOP_SENDMSG(so, msg, uiop) \ 519 ((so)->so_ops->sop_sendmsg((so), (msg), (uiop))) 520 #define SOP_GETPEERNAME(so) \ 521 ((so)->so_ops->sop_getpeername((so))) 522 #define SOP_GETSOCKNAME(so) \ 523 ((so)->so_ops->sop_getsockname((so))) 524 #define SOP_SHUTDOWN(so, how) \ 525 ((so)->so_ops->sop_shutdown((so), (how))) 526 #define SOP_GETSOCKOPT(so, level, optionname, optval, optlenp, flags) \ 527 ((so)->so_ops->sop_getsockopt((so), (level), (optionname), \ 528 (optval), (optlenp), (flags))) 529 #define SOP_SETSOCKOPT(so, level, optionname, optval, optlen) \ 530 ((so)->so_ops->sop_setsockopt((so), (level), (optionname), \ 531 (optval), (optlen))) 532 533 #endif /* defined(_KERNEL) || defined(_KMEMUSER) */ 534 535 #ifdef _KERNEL 536 537 #define ISALIGNED_cmsghdr(addr) \ 538 (((uintptr_t)(addr) & (_CMSG_HDR_ALIGNMENT - 1)) == 0) 539 540 #define ROUNDUP_cmsglen(len) \ 541 (((len) + _CMSG_HDR_ALIGNMENT - 1) & ~(_CMSG_HDR_ALIGNMENT - 1)) 542 543 /* 544 * Used in parsing msg_control 545 */ 546 #define CMSG_NEXT(cmsg) \ 547 (struct cmsghdr *)((uintptr_t)(cmsg) + \ 548 ROUNDUP_cmsglen((cmsg)->cmsg_len)) 549 550 /* 551 * Maximum size of any argument that is copied in (addresses, options, 552 * access rights). MUST be at least MAXPATHLEN + 3. 553 * BSD and SunOS 4.X limited this to MLEN or MCLBYTES. 554 */ 555 #define SO_MAXARGSIZE 8192 556 557 /* 558 * Convert between vnode and sonode 559 */ 560 #define VTOSO(vp) ((struct sonode *)((vp)->v_data)) 561 #define SOTOV(sp) ((sp)->so_vnode) 562 563 /* 564 * Internal flags for sobind() 565 */ 566 #define _SOBIND_REBIND 0x01 /* Bind to existing local address */ 567 #define _SOBIND_UNSPEC 0x02 /* Bind to unspecified address */ 568 #define _SOBIND_LOCK_HELD 0x04 /* so_excl_lock held by caller */ 569 #define _SOBIND_NOXLATE 0x08 /* No addr translation for AF_UNIX */ 570 #define _SOBIND_XPG4_2 0x10 /* xpg4.2 semantics */ 571 #define _SOBIND_SOCKBSD 0x20 /* BSD semantics */ 572 #define _SOBIND_LISTEN 0x40 /* Make into SS_ACCEPTCONN */ 573 #define _SOBIND_SOCKETPAIR 0x80 /* Internal flag for so_socketpair() */ 574 /* to enable listen with backlog = 1 */ 575 576 /* 577 * Internal flags for sounbind() 578 */ 579 #define _SOUNBIND_REBIND 0x01 /* Don't clear fields - will rebind */ 580 581 /* 582 * Internal flags for soconnect() 583 */ 584 #define _SOCONNECT_NOXLATE 0x01 /* No addr translation for AF_UNIX */ 585 #define _SOCONNECT_DID_BIND 0x02 /* Unbind when connect fails */ 586 #define _SOCONNECT_XPG4_2 0x04 /* xpg4.2 semantics */ 587 588 /* 589 * Internal flags for sodisconnect() 590 */ 591 #define _SODISCONNECT_LOCK_HELD 0x01 /* so_excl_lock held by caller */ 592 593 /* 594 * Internal flags for sotpi_getsockopt(). 595 */ 596 #define _SOGETSOCKOPT_XPG4_2 0x01 /* xpg4.2 semantics */ 597 598 /* 599 * Internal flags for soallocproto*() 600 */ 601 #define _ALLOC_NOSLEEP 0 /* Don't sleep for memory */ 602 #define _ALLOC_INTR 1 /* Sleep until interrupt */ 603 #define _ALLOC_SLEEP 2 /* Sleep forever */ 604 605 /* 606 * Internal structure for handling AF_UNIX file descriptor passing 607 */ 608 struct fdbuf { 609 int fd_size; /* In bytes, for kmem_free */ 610 int fd_numfd; /* Number of elements below */ 611 char *fd_ebuf; /* Extra buffer to free */ 612 int fd_ebuflen; 613 frtn_t fd_frtn; 614 struct file *fd_fds[1]; /* One or more */ 615 }; 616 #define FDBUF_HDRSIZE (sizeof (struct fdbuf) - sizeof (struct file *)) 617 618 /* 619 * Variable that can be patched to set what version of socket socket() 620 * will create. 621 */ 622 extern int so_default_version; 623 624 #ifdef DEBUG 625 /* Turn on extra testing capabilities */ 626 #define SOCK_TEST 627 #endif /* DEBUG */ 628 629 #ifdef DEBUG 630 char *pr_state(uint_t, uint_t); 631 char *pr_addr(int, struct sockaddr *, t_uscalar_t); 632 int so_verify_oobstate(struct sonode *); 633 #endif /* DEBUG */ 634 635 /* 636 * DEBUG macros 637 */ 638 #if defined(DEBUG) && !defined(__lint) 639 #define SOCK_DEBUG 640 641 extern int sockdebug; 642 extern int sockprinterr; 643 644 #define eprint(args) printf args 645 #define eprintso(so, args) \ 646 { if (sockprinterr && ((so)->so_options & SO_DEBUG)) printf args; } 647 #define eprintline(error) \ 648 { \ 649 if (error != EINTR && (sockprinterr || sockdebug > 0)) \ 650 printf("socket error %d: line %d file %s\n", \ 651 (error), __LINE__, __FILE__); \ 652 } 653 654 #define eprintsoline(so, error) \ 655 { if (sockprinterr && ((so)->so_options & SO_DEBUG)) \ 656 printf("socket(%p) error %d: line %d file %s\n", \ 657 (so), (error), __LINE__, __FILE__); \ 658 } 659 #define dprint(level, args) { if (sockdebug > (level)) printf args; } 660 #define dprintso(so, level, args) \ 661 { if (sockdebug > (level) && ((so)->so_options & SO_DEBUG)) printf args; } 662 663 #else /* define(DEBUG) && !defined(__lint) */ 664 665 #define eprint(args) {} 666 #define eprintso(so, args) {} 667 #define eprintline(error) {} 668 #define eprintsoline(so, error) {} 669 #define dprint(level, args) {} 670 #define dprintso(so, level, args) {} 671 #ifdef DEBUG 672 #undef DEBUG 673 #endif 674 675 #endif /* defined(DEBUG) && !defined(__lint) */ 676 677 extern struct vfsops sock_vfsops; 678 extern struct vnodeops *socktpi_vnodeops; 679 extern const struct fs_operation_def socktpi_vnodeops_template[]; 680 681 extern sonodeops_t sotpi_sonodeops; 682 683 extern dev_t sockdev; 684 685 /* NCAfs symbols */ 686 687 extern int socknca_read(struct vnode *, struct uio *, int, struct cred *, 688 struct caller_context *); 689 extern int socknca_write(struct vnode *, struct uio *, int, struct cred *, 690 struct caller_context *); 691 extern int socknca_ioctl(struct vnode *, int, intptr_t, int, 692 struct cred *, int *); 693 extern int nca_poll(struct vnode *, short, int, short *, 694 struct pollhead **); 695 extern int socknca_close(struct vnode *, int, int, offset_t, 696 struct cred *); 697 extern void socknca_inactive(struct vnode *, struct cred *); 698 699 extern const struct fs_operation_def socknca_vnodeops_template[]; 700 extern struct vnodeops *socknca_vnodeops; 701 702 extern void sonca_init(void); 703 extern struct sonode *sonca_create(vnode_t *, int, int, int, int, 704 struct sonode *, int *); 705 706 /* 707 * sockfs functions 708 */ 709 extern int sock_getmsg(vnode_t *, struct strbuf *, struct strbuf *, 710 uchar_t *, int *, int, rval_t *); 711 extern int sock_putmsg(vnode_t *, struct strbuf *, struct strbuf *, 712 uchar_t, int, int); 713 struct sonode *sotpi_create(vnode_t *, int, int, int, int, struct sonode *, 714 int *); 715 extern int socktpi_open(struct vnode **, int, struct cred *); 716 extern int so_sock2stream(struct sonode *); 717 extern void so_stream2sock(struct sonode *); 718 extern int sockinit(int, char *); 719 extern struct vnode 720 *makesockvp(struct vnode *, int, int, int); 721 extern void sockfree(struct sonode *); 722 extern void so_update_attrs(struct sonode *, int); 723 extern int soconfig(int, int, int, char *, int); 724 extern struct vnode 725 *solookup(int, int, int, char *, int *); 726 extern void so_lock_single(struct sonode *); 727 extern void so_unlock_single(struct sonode *, int); 728 extern int so_lock_read(struct sonode *, int); 729 extern int so_lock_read_intr(struct sonode *, int); 730 extern void so_unlock_read(struct sonode *); 731 extern void *sogetoff(mblk_t *, t_uscalar_t, t_uscalar_t, uint_t); 732 extern void so_getopt_srcaddr(void *, t_uscalar_t, 733 void **, t_uscalar_t *); 734 extern int so_getopt_unix_close(void *, t_uscalar_t); 735 extern int so_addr_verify(struct sonode *, const struct sockaddr *, 736 socklen_t); 737 extern int so_ux_addr_xlate(struct sonode *, struct sockaddr *, 738 socklen_t, int, void **, socklen_t *); 739 extern void fdbuf_free(struct fdbuf *); 740 extern mblk_t *fdbuf_allocmsg(int, struct fdbuf *); 741 extern int fdbuf_create(void *, int, struct fdbuf **); 742 extern void so_closefds(void *, t_uscalar_t, int, int); 743 extern int so_getfdopt(void *, t_uscalar_t, int, void **, int *); 744 t_uscalar_t so_optlen(void *, t_uscalar_t, int); 745 extern void so_cmsg2opt(void *, t_uscalar_t, int, mblk_t *); 746 extern t_uscalar_t 747 so_cmsglen(mblk_t *, void *, t_uscalar_t, int); 748 extern int so_opt2cmsg(mblk_t *, void *, t_uscalar_t, int, 749 void *, t_uscalar_t); 750 extern void soisconnecting(struct sonode *); 751 extern void soisconnected(struct sonode *); 752 extern void soisdisconnected(struct sonode *, int); 753 extern void socantsendmore(struct sonode *); 754 extern void socantrcvmore(struct sonode *); 755 extern void soseterror(struct sonode *, int); 756 extern int sogeterr(struct sonode *); 757 extern int sogetrderr(vnode_t *, int, int *); 758 extern int sogetwrerr(vnode_t *, int, int *); 759 extern void so_unix_close(struct sonode *); 760 extern mblk_t *soallocproto(size_t, int); 761 extern mblk_t *soallocproto1(const void *, ssize_t, ssize_t, int); 762 extern void soappendmsg(mblk_t *, const void *, ssize_t); 763 extern mblk_t *soallocproto2(const void *, ssize_t, const void *, ssize_t, 764 ssize_t, int); 765 extern mblk_t *soallocproto3(const void *, ssize_t, const void *, ssize_t, 766 const void *, ssize_t, ssize_t, int); 767 extern int sowaitprim(struct sonode *, t_scalar_t, t_scalar_t, 768 t_uscalar_t, mblk_t **, clock_t); 769 extern int sowaitokack(struct sonode *, t_scalar_t); 770 extern int sowaitack(struct sonode *, mblk_t **, clock_t); 771 extern void soqueueack(struct sonode *, mblk_t *); 772 extern int sowaitconnind(struct sonode *, int, mblk_t **); 773 extern void soqueueconnind(struct sonode *, mblk_t *); 774 extern int soflushconnind(struct sonode *, t_scalar_t); 775 extern void so_drain_discon_ind(struct sonode *); 776 extern void so_flush_discon_ind(struct sonode *); 777 extern int sowaitconnected(struct sonode *, int, int); 778 779 extern int sostream_direct(struct sonode *, struct uio *, 780 mblk_t *, cred_t *); 781 extern int sosend_dgram(struct sonode *, struct sockaddr *, 782 socklen_t, struct uio *, int); 783 extern int sosend_svc(struct sonode *, struct uio *, t_scalar_t, int, int); 784 extern void so_installhooks(struct sonode *); 785 extern int so_strinit(struct sonode *, struct sonode *); 786 extern int sotpi_recvmsg(struct sonode *, struct nmsghdr *, 787 struct uio *); 788 extern int sotpi_getpeername(struct sonode *); 789 extern int sotpi_getsockopt(struct sonode *, int, int, void *, 790 socklen_t *, int); 791 extern int sotpi_setsockopt(struct sonode *, int, int, const void *, 792 socklen_t); 793 extern int socktpi_ioctl(struct vnode *, int, intptr_t, int, 794 struct cred *, int *); 795 extern int sodisconnect(struct sonode *, t_scalar_t, int); 796 extern ssize_t soreadfile(file_t *, uchar_t *, u_offset_t, int *, size_t); 797 extern int so_set_asyncsigs(vnode_t *, pid_t, int, int, cred_t *); 798 extern int so_set_events(struct sonode *, vnode_t *, cred_t *); 799 extern int so_flip_async(struct sonode *, vnode_t *, int, cred_t *); 800 extern int so_set_siggrp(struct sonode *, vnode_t *, pid_t, int, cred_t *); 801 extern void *sock_kstat_init(zoneid_t); 802 extern void sock_kstat_fini(zoneid_t, void *); 803 804 /* 805 * Function wrappers (mostly arround the sonode switch) for 806 * backward compatibility. 807 */ 808 extern int soaccept(struct sonode *, int, struct sonode **); 809 extern int sobind(struct sonode *, struct sockaddr *, socklen_t, 810 int, int); 811 extern int solisten(struct sonode *, int); 812 extern int soconnect(struct sonode *, const struct sockaddr *, socklen_t, 813 int, int); 814 extern int sorecvmsg(struct sonode *, struct nmsghdr *, struct uio *); 815 extern int sosendmsg(struct sonode *, struct nmsghdr *, struct uio *); 816 extern int sogetpeername(struct sonode *); 817 extern int sogetsockname(struct sonode *); 818 extern int soshutdown(struct sonode *, int); 819 extern int sogetsockopt(struct sonode *, int, int, void *, socklen_t *, 820 int); 821 extern int sosetsockopt(struct sonode *, int, int, const void *, 822 t_uscalar_t); 823 824 extern struct sonode *socreate(vnode_t *, int, int, int, int, 825 struct sonode *, int *); 826 827 extern int so_copyin(const void *, void *, size_t, int); 828 extern int so_copyout(const void *, void *, size_t, int); 829 830 extern int socktpi_access(struct vnode *, int, int, struct cred *); 831 extern int socktpi_fid(struct vnode *, struct fid *); 832 extern int socktpi_fsync(struct vnode *, int, struct cred *); 833 extern int socktpi_getattr(struct vnode *, struct vattr *, int, 834 struct cred *); 835 extern int socktpi_seek(struct vnode *, offset_t, offset_t *); 836 extern int socktpi_setattr(struct vnode *, struct vattr *, int, 837 struct cred *, caller_context_t *); 838 extern int socktpi_setfl(vnode_t *, int, int, cred_t *); 839 840 /* SCTP sockfs */ 841 extern struct sonode *sosctp_create(vnode_t *, int, int, int, int, 842 struct sonode *, int *); 843 extern int sosctp_init(void); 844 845 #endif 846 847 /* 848 * Internal structure for obtaining sonode information from the socklist. 849 * These types match those corresponding in the sonode structure. 850 * This is not a published interface, and may change at any time. 851 */ 852 struct sockinfo { 853 uint_t si_size; /* real length of this struct */ 854 short si_family; 855 short si_type; 856 ushort_t si_flag; 857 uint_t si_state; 858 uint_t si_ux_laddr_sou_magic; 859 uint_t si_ux_faddr_sou_magic; 860 t_scalar_t si_serv_type; 861 t_uscalar_t si_laddr_soa_len; 862 t_uscalar_t si_faddr_soa_len; 863 uint16_t si_laddr_family; 864 uint16_t si_faddr_family; 865 char si_laddr_sun_path[MAXPATHLEN + 1]; /* NULL terminated */ 866 char si_faddr_sun_path[MAXPATHLEN + 1]; 867 zoneid_t si_szoneid; 868 }; 869 870 871 #ifdef __cplusplus 872 } 873 #endif 874 875 #endif /* _SYS_SOCKETVAR_H */ 876