17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 545916cd2Sjpk * Common Development and Distribution License (the "License"). 645916cd2Sjpk * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 217c478bd9Sstevel@tonic-gate /* 2245916cd2Sjpk * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 237c478bd9Sstevel@tonic-gate * Use is subject to license terms. 247c478bd9Sstevel@tonic-gate */ 257c478bd9Sstevel@tonic-gate 267c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 277c478bd9Sstevel@tonic-gate 287c478bd9Sstevel@tonic-gate #include <sys/types.h> 297c478bd9Sstevel@tonic-gate #include <sys/stream.h> 307c478bd9Sstevel@tonic-gate #define _SUN_TPI_VERSION 2 317c478bd9Sstevel@tonic-gate #include <sys/tihdr.h> 327c478bd9Sstevel@tonic-gate #include <sys/socket.h> 337c478bd9Sstevel@tonic-gate #include <sys/xti_xtiopt.h> 347c478bd9Sstevel@tonic-gate #include <sys/xti_inet.h> 357c478bd9Sstevel@tonic-gate 367c478bd9Sstevel@tonic-gate #include <inet/common.h> 377c478bd9Sstevel@tonic-gate #include <netinet/ip6.h> 387c478bd9Sstevel@tonic-gate #include <inet/ip.h> 397c478bd9Sstevel@tonic-gate 407c478bd9Sstevel@tonic-gate #include <netinet/in.h> 417c478bd9Sstevel@tonic-gate #include <netinet/tcp.h> 427c478bd9Sstevel@tonic-gate #include <inet/optcom.h> 437c478bd9Sstevel@tonic-gate 447c478bd9Sstevel@tonic-gate 457c478bd9Sstevel@tonic-gate extern int tcp_opt_default(queue_t *q, int level, int name, uchar_t *ptr); 467c478bd9Sstevel@tonic-gate extern int tcp_opt_get(queue_t *q, int level, int name, uchar_t *ptr); 477c478bd9Sstevel@tonic-gate extern int tcp_opt_set(queue_t *q, uint_t optset_context, int level, 487c478bd9Sstevel@tonic-gate int name, uint_t inlen, uchar_t *invalp, uint_t *outlenp, uchar_t *outvalp, 497c478bd9Sstevel@tonic-gate void *thisdg_attrs, cred_t *cr, mblk_t *mblk); 507c478bd9Sstevel@tonic-gate 517c478bd9Sstevel@tonic-gate /* 527c478bd9Sstevel@tonic-gate * Table of all known options handled on a TCP protocol stack. 537c478bd9Sstevel@tonic-gate * 547c478bd9Sstevel@tonic-gate * Note: This table contains options processed by both TCP and IP levels 557c478bd9Sstevel@tonic-gate * and is the superset of options that can be performed on a TCP over IP 567c478bd9Sstevel@tonic-gate * stack. 577c478bd9Sstevel@tonic-gate */ 587c478bd9Sstevel@tonic-gate opdes_t tcp_opt_arr[] = { 597c478bd9Sstevel@tonic-gate 607c478bd9Sstevel@tonic-gate { SO_LINGER, SOL_SOCKET, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, 617c478bd9Sstevel@tonic-gate sizeof (struct linger), 0 }, 627c478bd9Sstevel@tonic-gate 637c478bd9Sstevel@tonic-gate { SO_DEBUG, SOL_SOCKET, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, sizeof (int), 0 }, 647c478bd9Sstevel@tonic-gate { SO_KEEPALIVE, SOL_SOCKET, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, sizeof (int), 0 }, 657c478bd9Sstevel@tonic-gate { SO_DONTROUTE, SOL_SOCKET, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, sizeof (int), 0 }, 667c478bd9Sstevel@tonic-gate { SO_USELOOPBACK, SOL_SOCKET, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, sizeof (int), 0 677c478bd9Sstevel@tonic-gate }, 687c478bd9Sstevel@tonic-gate { SO_BROADCAST, SOL_SOCKET, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, sizeof (int), 0 }, 697c478bd9Sstevel@tonic-gate { SO_REUSEADDR, SOL_SOCKET, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, sizeof (int), 0 }, 707c478bd9Sstevel@tonic-gate { SO_OOBINLINE, SOL_SOCKET, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, sizeof (int), 0 }, 717c478bd9Sstevel@tonic-gate { SO_TYPE, SOL_SOCKET, OA_R, OA_R, OP_NP, OP_PASSNEXT, sizeof (int), 0 }, 727c478bd9Sstevel@tonic-gate { SO_SNDBUF, SOL_SOCKET, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, sizeof (int), 0 }, 737c478bd9Sstevel@tonic-gate { SO_RCVBUF, SOL_SOCKET, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, sizeof (int), 0 }, 747c478bd9Sstevel@tonic-gate { SO_DGRAM_ERRIND, SOL_SOCKET, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, sizeof (int), 0 757c478bd9Sstevel@tonic-gate }, 767c478bd9Sstevel@tonic-gate { SO_SND_COPYAVOID, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 }, 7745916cd2Sjpk { SO_ANON_MLP, SOL_SOCKET, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, sizeof (int), 785d0bc3edSsommerfe 0 }, 7945916cd2Sjpk { SO_MAC_EXEMPT, SOL_SOCKET, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, sizeof (int), 805d0bc3edSsommerfe 0 }, 815d0bc3edSsommerfe { SO_ALLZONES, SOL_SOCKET, OA_R, OA_RW, OP_CONFIG, OP_PASSNEXT, sizeof (int), 825d0bc3edSsommerfe 0 }, 83*ae347574Skcpoon { SO_EXCLBIND, SOL_SOCKET, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, sizeof (int), 0 }, 84*ae347574Skcpoon 857c478bd9Sstevel@tonic-gate { TCP_NODELAY, IPPROTO_TCP, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, sizeof (int), 0 867c478bd9Sstevel@tonic-gate }, 877c478bd9Sstevel@tonic-gate { TCP_MAXSEG, IPPROTO_TCP, OA_R, OA_R, OP_NP, OP_PASSNEXT, sizeof (uint_t), 887c478bd9Sstevel@tonic-gate 536 }, 897c478bd9Sstevel@tonic-gate 907c478bd9Sstevel@tonic-gate { TCP_NOTIFY_THRESHOLD, IPPROTO_TCP, OA_RW, OA_RW, OP_NP, 917c478bd9Sstevel@tonic-gate (OP_PASSNEXT|OP_DEF_FN), sizeof (int), -1 /* not initialized */ }, 927c478bd9Sstevel@tonic-gate 937c478bd9Sstevel@tonic-gate { TCP_ABORT_THRESHOLD, IPPROTO_TCP, OA_RW, OA_RW, OP_NP, 947c478bd9Sstevel@tonic-gate (OP_PASSNEXT|OP_DEF_FN), sizeof (int), -1 /* not initialized */ }, 957c478bd9Sstevel@tonic-gate 967c478bd9Sstevel@tonic-gate { TCP_CONN_NOTIFY_THRESHOLD, IPPROTO_TCP, OA_RW, OA_RW, OP_NP, 977c478bd9Sstevel@tonic-gate (OP_PASSNEXT|OP_DEF_FN), sizeof (int), -1 /* not initialized */ }, 987c478bd9Sstevel@tonic-gate 997c478bd9Sstevel@tonic-gate { TCP_CONN_ABORT_THRESHOLD, IPPROTO_TCP, OA_RW, OA_RW, OP_NP, 1007c478bd9Sstevel@tonic-gate (OP_PASSNEXT|OP_DEF_FN), sizeof (int), -1 /* not initialized */ }, 1017c478bd9Sstevel@tonic-gate 1027c478bd9Sstevel@tonic-gate { TCP_RECVDSTADDR, IPPROTO_TCP, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, sizeof (int), 1037c478bd9Sstevel@tonic-gate 0 }, 1047c478bd9Sstevel@tonic-gate 1057c478bd9Sstevel@tonic-gate { TCP_ANONPRIVBIND, IPPROTO_TCP, OA_R, OA_RW, OP_PRIVPORT, OP_PASSNEXT, 1067c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 1077c478bd9Sstevel@tonic-gate 1087c478bd9Sstevel@tonic-gate { TCP_EXCLBIND, IPPROTO_TCP, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, sizeof (int), 0 1097c478bd9Sstevel@tonic-gate }, 1107c478bd9Sstevel@tonic-gate 1117c478bd9Sstevel@tonic-gate { TCP_INIT_CWND, IPPROTO_TCP, OA_RW, OA_RW, OP_CONFIG, OP_PASSNEXT, 1127c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 1137c478bd9Sstevel@tonic-gate 1147c478bd9Sstevel@tonic-gate { TCP_KEEPALIVE_THRESHOLD, IPPROTO_TCP, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, 1157c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 1167c478bd9Sstevel@tonic-gate 1177c478bd9Sstevel@tonic-gate { TCP_KEEPALIVE_ABORT_THRESHOLD, IPPROTO_TCP, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, 1187c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 1197c478bd9Sstevel@tonic-gate 1207c478bd9Sstevel@tonic-gate { TCP_CORK, IPPROTO_TCP, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, sizeof (int), 0 }, 1217c478bd9Sstevel@tonic-gate 1227c478bd9Sstevel@tonic-gate { IP_OPTIONS, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 1237c478bd9Sstevel@tonic-gate (OP_PASSNEXT|OP_VARLEN|OP_NODEFAULT), 1247c478bd9Sstevel@tonic-gate 40, -1 /* not initialized */ }, 1257c478bd9Sstevel@tonic-gate { T_IP_OPTIONS, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 1267c478bd9Sstevel@tonic-gate (OP_PASSNEXT|OP_VARLEN|OP_NODEFAULT), 1277c478bd9Sstevel@tonic-gate 40, -1 /* not initialized */ }, 1287c478bd9Sstevel@tonic-gate 1297c478bd9Sstevel@tonic-gate { IP_TOS, IPPROTO_IP, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, sizeof (int), 0 }, 1307c478bd9Sstevel@tonic-gate { T_IP_TOS, IPPROTO_IP, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, sizeof (int), 0 }, 1317c478bd9Sstevel@tonic-gate { IP_TTL, IPPROTO_IP, OA_RW, OA_RW, OP_NP, (OP_PASSNEXT|OP_DEF_FN), 1327c478bd9Sstevel@tonic-gate sizeof (int), -1 /* not initialized */ }, 1337c478bd9Sstevel@tonic-gate 1347c478bd9Sstevel@tonic-gate { IP_SEC_OPT, IPPROTO_IP, OA_RW, OA_RW, OP_NP, (OP_PASSNEXT|OP_NODEFAULT), 1357c478bd9Sstevel@tonic-gate sizeof (ipsec_req_t), -1 /* not initialized */ }, 1367c478bd9Sstevel@tonic-gate 1377c478bd9Sstevel@tonic-gate { IP_BOUND_IF, IPPROTO_IP, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, 1387c478bd9Sstevel@tonic-gate sizeof (int), 0 /* no ifindex */ }, 1397c478bd9Sstevel@tonic-gate 1407c478bd9Sstevel@tonic-gate { IP_UNSPEC_SRC, IPPROTO_IP, OA_R, OA_RW, OP_RAW, OP_PASSNEXT, 1417c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 1427c478bd9Sstevel@tonic-gate 1437c478bd9Sstevel@tonic-gate { IPV6_UNICAST_HOPS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, (OP_PASSNEXT|OP_DEF_FN), 1447c478bd9Sstevel@tonic-gate sizeof (int), -1 /* not initialized */ }, 1457c478bd9Sstevel@tonic-gate 1467c478bd9Sstevel@tonic-gate { IPV6_BOUND_IF, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, 1477c478bd9Sstevel@tonic-gate sizeof (int), 0 /* no ifindex */ }, 1487c478bd9Sstevel@tonic-gate 14943d18f1cSpriyanka { IP_NEXTHOP, IPPROTO_IP, OA_RW, OA_RW, OP_CONFIG, OP_PASSNEXT, 15043d18f1cSpriyanka sizeof (in_addr_t), -1 /* not initialized */ }, 15143d18f1cSpriyanka 1527c478bd9Sstevel@tonic-gate { IPV6_BOUND_PIF, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, 1537c478bd9Sstevel@tonic-gate sizeof (int), 0 /* no ifindex */ }, 1547c478bd9Sstevel@tonic-gate 1557c478bd9Sstevel@tonic-gate { IPV6_UNSPEC_SRC, IPPROTO_IPV6, OA_R, OA_RW, OP_RAW, OP_PASSNEXT, 1567c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 1577c478bd9Sstevel@tonic-gate 1587c478bd9Sstevel@tonic-gate { IPV6_PKTINFO, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 1597c478bd9Sstevel@tonic-gate (OP_PASSNEXT|OP_NODEFAULT|OP_VARLEN), 1607c478bd9Sstevel@tonic-gate sizeof (struct in6_pktinfo), -1 /* not initialized */ }, 1617c478bd9Sstevel@tonic-gate { IPV6_NEXTHOP, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 1627c478bd9Sstevel@tonic-gate (OP_PASSNEXT|OP_NODEFAULT), 1637c478bd9Sstevel@tonic-gate sizeof (sin6_t), -1 /* not initialized */ }, 1647c478bd9Sstevel@tonic-gate { IPV6_HOPOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 1657c478bd9Sstevel@tonic-gate (OP_PASSNEXT|OP_VARLEN|OP_NODEFAULT), 255*8, 1667c478bd9Sstevel@tonic-gate -1 /* not initialized */ }, 1677c478bd9Sstevel@tonic-gate { IPV6_DSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 1687c478bd9Sstevel@tonic-gate (OP_PASSNEXT|OP_VARLEN|OP_NODEFAULT), 255*8, 1697c478bd9Sstevel@tonic-gate -1 /* not initialized */ }, 1707c478bd9Sstevel@tonic-gate { IPV6_RTHDRDSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 1717c478bd9Sstevel@tonic-gate (OP_PASSNEXT|OP_VARLEN|OP_NODEFAULT), 255*8, 1727c478bd9Sstevel@tonic-gate -1 /* not initialized */ }, 1737c478bd9Sstevel@tonic-gate { IPV6_RTHDR, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 1747c478bd9Sstevel@tonic-gate (OP_PASSNEXT|OP_VARLEN|OP_NODEFAULT), 255*8, 1757c478bd9Sstevel@tonic-gate -1 /* not initialized */ }, 1767c478bd9Sstevel@tonic-gate { IPV6_TCLASS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 1777c478bd9Sstevel@tonic-gate (OP_PASSNEXT|OP_NODEFAULT), 1787c478bd9Sstevel@tonic-gate sizeof (int), -1 /* not initialized */ }, 1797c478bd9Sstevel@tonic-gate { IPV6_PATHMTU, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 1807c478bd9Sstevel@tonic-gate (OP_PASSNEXT|OP_NODEFAULT), 1817c478bd9Sstevel@tonic-gate sizeof (struct ip6_mtuinfo), -1 /* not initialized */ }, 1827c478bd9Sstevel@tonic-gate { IPV6_USE_MIN_MTU, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, 1837c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 1847c478bd9Sstevel@tonic-gate { IPV6_V6ONLY, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, 1857c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 1867c478bd9Sstevel@tonic-gate 1877c478bd9Sstevel@tonic-gate /* Enable receipt of ancillary data */ 1887c478bd9Sstevel@tonic-gate { IPV6_RECVPKTINFO, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, 1897c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 1907c478bd9Sstevel@tonic-gate { IPV6_RECVHOPLIMIT, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, 1917c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 1927c478bd9Sstevel@tonic-gate { IPV6_RECVHOPOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, 1937c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 1947c478bd9Sstevel@tonic-gate { _OLD_IPV6_RECVDSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, 1957c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 1967c478bd9Sstevel@tonic-gate { IPV6_RECVDSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, 1977c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 1987c478bd9Sstevel@tonic-gate { IPV6_RECVRTHDR, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, 1997c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 2007c478bd9Sstevel@tonic-gate { IPV6_RECVRTHDRDSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, 2017c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 2027c478bd9Sstevel@tonic-gate { IPV6_RECVTCLASS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, 2037c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 2047c478bd9Sstevel@tonic-gate 2057c478bd9Sstevel@tonic-gate { IPV6_SEC_OPT, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, (OP_PASSNEXT|OP_NODEFAULT), 2067c478bd9Sstevel@tonic-gate sizeof (ipsec_req_t), -1 /* not initialized */ }, 2077c478bd9Sstevel@tonic-gate { IPV6_SRC_PREFERENCES, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, OP_PASSNEXT, 2087c478bd9Sstevel@tonic-gate sizeof (uint32_t), IPV6_PREFER_SRC_DEFAULT }, 2097c478bd9Sstevel@tonic-gate }; 2107c478bd9Sstevel@tonic-gate 2117c478bd9Sstevel@tonic-gate /* 2127c478bd9Sstevel@tonic-gate * Table of all supported levels 2137c478bd9Sstevel@tonic-gate * Note: Some levels (e.g. XTI_GENERIC) may be valid but may not have 2147c478bd9Sstevel@tonic-gate * any supported options so we need this info separately. 2157c478bd9Sstevel@tonic-gate * 2167c478bd9Sstevel@tonic-gate * This is needed only for topmost tpi providers and is used only by 2177c478bd9Sstevel@tonic-gate * XTI interfaces. 2187c478bd9Sstevel@tonic-gate */ 2197c478bd9Sstevel@tonic-gate optlevel_t tcp_valid_levels_arr[] = { 2207c478bd9Sstevel@tonic-gate XTI_GENERIC, 2217c478bd9Sstevel@tonic-gate SOL_SOCKET, 2227c478bd9Sstevel@tonic-gate IPPROTO_TCP, 2237c478bd9Sstevel@tonic-gate IPPROTO_IP, 2247c478bd9Sstevel@tonic-gate IPPROTO_IPV6 2257c478bd9Sstevel@tonic-gate }; 2267c478bd9Sstevel@tonic-gate 2277c478bd9Sstevel@tonic-gate 2287c478bd9Sstevel@tonic-gate #define TCP_OPT_ARR_CNT A_CNT(tcp_opt_arr) 2297c478bd9Sstevel@tonic-gate #define TCP_VALID_LEVELS_CNT A_CNT(tcp_valid_levels_arr) 2307c478bd9Sstevel@tonic-gate 2317c478bd9Sstevel@tonic-gate uint_t tcp_max_optsize; /* initialized when TCP driver is loaded */ 2327c478bd9Sstevel@tonic-gate 2337c478bd9Sstevel@tonic-gate /* 2347c478bd9Sstevel@tonic-gate * Initialize option database object for TCP 2357c478bd9Sstevel@tonic-gate * 2367c478bd9Sstevel@tonic-gate * This object represents database of options to search passed to 2377c478bd9Sstevel@tonic-gate * {sock,tpi}optcom_req() interface routine to take care of option 2387c478bd9Sstevel@tonic-gate * management and associated methods. 2397c478bd9Sstevel@tonic-gate */ 2407c478bd9Sstevel@tonic-gate 2417c478bd9Sstevel@tonic-gate optdb_obj_t tcp_opt_obj = { 2427c478bd9Sstevel@tonic-gate tcp_opt_default, /* TCP default value function pointer */ 2437c478bd9Sstevel@tonic-gate tcp_opt_get, /* TCP get function pointer */ 2447c478bd9Sstevel@tonic-gate tcp_opt_set, /* TCP set function pointer */ 2457c478bd9Sstevel@tonic-gate B_TRUE, /* TCP is tpi provider */ 2467c478bd9Sstevel@tonic-gate TCP_OPT_ARR_CNT, /* TCP option database count of entries */ 2477c478bd9Sstevel@tonic-gate tcp_opt_arr, /* TCP option database */ 2487c478bd9Sstevel@tonic-gate TCP_VALID_LEVELS_CNT, /* TCP valid level count of entries */ 2497c478bd9Sstevel@tonic-gate tcp_valid_levels_arr /* TCP valid level array */ 2507c478bd9Sstevel@tonic-gate }; 251