0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/*
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * CDDL HEADER START
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * The contents of this file are subject to the terms of the
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * Common Development and Distribution License (the "License").
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * You may not use this file except in compliance with the License.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * or http://www.opensolaris.org/os/licensing.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * See the License for the specific language governing permissions
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * and limitations under the License.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * When distributing Covered Code, include this CDDL HEADER in each
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * If applicable, add the following below this CDDL HEADER, with the
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * fields enclosed by brackets "[]" replaced with your own identifying
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * information: Portions Copyright [yyyy] [name of copyright owner]
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * CDDL HEADER END
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/*
3e95bd4ab92abca814bd28e854607d1975c7dc88Anders Persson * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#ifndef _SOCKFS_SOCKTPI_H
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define _SOCKFS_SOCKTPI_H
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#ifdef __cplusplus
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern "C" {
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#endif
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/*
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * Internal representation used for addresses.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningstruct soaddr {
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct sockaddr *soa_sa; /* Actual address */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning t_uscalar_t soa_len; /* Length in bytes for kmem_free */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning t_uscalar_t soa_maxlen; /* Allocated length */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning};
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/* Maximum size address for transports that have ADDR_size == 1 */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOA_DEFSIZE 128
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningstruct sonode;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/*
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * TPI Sockets
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * ======================
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * A TPI socket can be created by the TPI socket module, or as a
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * result of fallback. In either case, the TPI related information is
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * stored in a sotpi_info_t. Sockets that are TPI based from the
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * beginning will use a sotpi_sonode_t, but fallback case the
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * sotpi_info_t will be allocated when needed. However, the so_priv
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * field in the sonode will always point to the sotpi_info_t, and the
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * structure should only be accessed via so_priv. Use SOTOTPI().
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * A TPI socket always corresponds to a VCHR stream representing the
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * transport provider (e.g. /dev/tcp). This information is retrieved
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * from the kernel socket configuration table and accessible via
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * so_sockparams->sp_sdev_info. sockfs uses this to perform
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * VOP_ACCESS checks before allowing an open of the transport
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * provider.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * AF_UNIX Sockets
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * -------------------------
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * When an AF_UNIX socket is bound to a pathname the sockfs creates a
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * VSOCK vnode in the underlying file system. However, the vnodeops
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * etc in this VNODE remain those of the underlying file system.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * Sockfs uses the v_stream pointer in the underlying file system
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * VSOCK node to find the sonode bound to the pathname. The bound
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * pathname vnode is accessed through sti_ux_vp.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * Out of Band Data Handling
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * -------------------------
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * The counts (sti_oobcnt and sti_oobsigcnt) track the number of
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * urgent indicates that are (logically) queued on the stream head
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * read queue. The urgent data is queued on the stream head
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * as follows.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * In the normal case the SIGURG is not generated until
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * the T_EXDATA_IND arrives at the stream head. However, transports
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * that have an early indication that urgent data is pending
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * (e.g. TCP receiving a "new" urgent pointer value) can send up
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * an M_PCPROTO/SIGURG message to generate the signal early.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * The mark is indicated by either:
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * - a T_EXDATA_IND (with no M_DATA b_cont) with MSGMARK set.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * When this message is consumed by sorecvmsg the socket layer
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * sets SS_RCVATMARK until data has been consumed past the mark.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * - a message with MSGMARKNEXT set (indicating that the
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * first byte of the next message constitutes the mark). When
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * the last byte of the MSGMARKNEXT message is consumed in
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * the stream head the stream head sets STRATMARK. This flag
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * is cleared when at least one byte is read. (Note that
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * the MSGMARKNEXT messages can be of zero length when there
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * is no previous data to which the marknext can be attached.)
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * While the T_EXDATA_IND method is the common case which is used
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * with all TPI transports, the MSGMARKNEXT method is needed to
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * indicate the mark when e.g. the TCP urgent byte has not been
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * received yet but the TCP urgent pointer has made TCP generate
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * the M_PCSIG/SIGURG.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * The signal (the M_PCSIG carrying the SIGURG) and the mark
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * indication can not be delivered as a single message, since
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * the signal should be delivered as high priority and any mark
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * indication must flow with the data. This implies that immediately
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * when the SIGURG has been delivered if the stream head queue is
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * empty it is impossible to determine if this will be the position
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * of the mark. This race condition is resolved by using MSGNOTMARKNEXT
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * messages and the STRNOTATMARK flag in the stream head. The
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * SIOCATMARK code calls the stream head to wait for either a
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * non-empty queue or one of the STR*ATMARK flags being set.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * This implies that any transport that is sending M_PCSIG(SIGURG)
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * should send the appropriate MSGNOTMARKNEXT message (which can be
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * zero length) after sending an M_PCSIG to prevent SIOCATMARK
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * from sleeping unnecessarily.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOTPI_INFO_MAGIC 0x12345678
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/*
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * Information used by TPI/STREAMS sockets
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningtypedef struct sotpi_info {
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning /*
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * These fields are initialized once.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning uint32_t sti_magic; /* always set to SOTPI_INFO_MAGIC */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning dev_t sti_dev; /* device the sonode represents */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct sockparams *sti_orig_sp; /* in case of fallback; the orig sp */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning kmutex_t sti_plumb_lock; /* serializes plumbs, and the related */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning /* so_pushcnt */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning short sti_pushcnt; /* Number of modules above "sockmod" */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning kcondvar_t sti_ack_cv; /* wait for TPI acks */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning uint8_t
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning sti_laddr_valid : 1, /* sti_laddr valid for user */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning sti_faddr_valid : 1, /* sti_faddr valid for user */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning sti_faddr_noxlate : 1, /* No xlation of faddr for AF_UNIX */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning sti_direct : 1, /* transport is directly below */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning sti_pad_to_bit7 : 4;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning mblk_t *sti_ack_mp; /* TPI ack received from below */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning mblk_t *sti_unbind_mp; /* Preallocated T_UNBIND_REQ message */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning time_t sti_atime; /* time of last access */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning time_t sti_mtime; /* time of last modification */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning time_t sti_ctime; /* time of last attributes change */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning ushort_t sti_delayed_error; /* From T_uderror_ind */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning mblk_t *sti_eaddr_mp; /* for so_delayed_error */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning /* put here for delayed processing */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning mblk_t *sti_conn_ind_head; /* b_next list of T_CONN_IND */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning mblk_t *sti_conn_ind_tail;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning uint_t sti_oobsigcnt; /* Number of SIGURG generated */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning uint_t sti_oobcnt; /* Number of T_EXDATA_IND queued */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning /* From T_info_ack */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning t_uscalar_t sti_tsdu_size;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning t_uscalar_t sti_etsdu_size;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning t_scalar_t sti_addr_size;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning t_uscalar_t sti_opt_size;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning t_uscalar_t sti_tidu_size;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning t_scalar_t sti_serv_type;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning /* From T_capability_ack */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning t_uscalar_t sti_acceptor_id;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning /* Internal provider information */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct tpi_provinfo *sti_provinfo;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning /*
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * The local and remote addresses have multiple purposes
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * but one of the key reasons for their existence and careful
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * tracking in sockfs is to support getsockname and getpeername
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * when the transport does not handle the TI_GET*NAME ioctls
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * and caching when it does (signalled by valid bits in so_state).
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * When all transports support the new TPI (with T_ADDR_REQ)
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * we can revisit this code.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * The other usage of sti_faddr is to keep the "connected to"
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * address for datagram sockets.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * Finally, for AF_UNIX both local and remote addresses are used
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * to record the sockaddr_un since we use a separate namespace
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * in the loopback transport.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct soaddr sti_laddr; /* Local address */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct soaddr sti_faddr; /* Peer address */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define sti_laddr_sa sti_laddr.soa_sa
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define sti_faddr_sa sti_faddr.soa_sa
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define sti_laddr_len sti_laddr.soa_len
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define sti_faddr_len sti_faddr.soa_len
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define sti_laddr_maxlen sti_laddr.soa_maxlen
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define sti_faddr_maxlen sti_faddr.soa_maxlen
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning /*
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * For AF_UNIX sockets:
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * sti_ux_laddr/faddr records the internal addresses used with the
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * transport. sti_ux_vp and v_stream->sd_vnode form the
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * cross-linkage between the underlying fs vnode corresponding
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * to the bound sockaddr_un and the socket node.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct so_ux_addr sti_ux_laddr; /* laddr bound with the transport */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct so_ux_addr sti_ux_faddr; /* temporary peer address */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct vnode *sti_ux_bound_vp; /* bound AF_UNIX file system vnode */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct sonode *sti_next_so; /* next sonode on socklist */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct sonode *sti_prev_so; /* previous sonode on socklist */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning mblk_t *sti_discon_ind_mp; /* T_DISCON_IND received from below */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning /*
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * For NL7C sockets:
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * sti_nl7c_flags the NL7C state of URL processing.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * sti_nl7c_rcv_mp mblk_t chain of already received data to be
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * passed up to the app after NL7C gives up on
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * a socket.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * sti_nl7c_rcv_rval returned rval for last mblk_t from above.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * sti_nl7c_uri the URI currently being processed.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * sti_nl7c_rtime URI request gethrestime_sec().
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * sti_nl7c_addr pointer returned by nl7c_addr_lookup().
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning uint64_t sti_nl7c_flags;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning mblk_t *sti_nl7c_rcv_mp;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int64_t sti_nl7c_rcv_rval;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning void *sti_nl7c_uri;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning time_t sti_nl7c_rtime;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning void *sti_nl7c_addr;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning} sotpi_info_t;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningstruct T_capability_ack;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern sonodeops_t sotpi_sonodeops;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int socktpi_init(void);
4117443759eb8485e3cfd93459f86a41ea241d20Anders Perssonextern int sotpi_convert_sonode(struct sonode *, struct sockparams *,
4117443759eb8485e3cfd93459f86a41ea241d20Anders Persson boolean_t *, queue_t **, struct cred *);
4117443759eb8485e3cfd93459f86a41ea241d20Anders Perssonextern void sotpi_revert_sonode(struct sonode *, struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void sotpi_update_state(struct sonode *, struct T_capability_ack *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct sockaddr *, socklen_t, struct sockaddr *, socklen_t,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning short);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern sotpi_info_t *sotpi_sototpi(struct sonode *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#ifdef DEBUG
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOTOTPI(so) (sotpi_sototpi(so))
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#else
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOTOTPI(so) ((sotpi_info_t *)(so)->so_priv)
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#endif
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/* for consumers outside sockfs */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define _SOTOTPI(so) ((sotpi_info_t *)(so)->so_priv)
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#ifdef __cplusplus
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning}
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#endif
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#endif /* _SOCKFS_SOCKTPI_H */