2  * Copyright (c) 2008 Apple Computer, Inc. All rights reserved. 
   4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 
   6  * This file contains Original Code and/or Modifications of Original Code 
   7  * as defined in and that are subject to the Apple Public Source License 
   8  * Version 2.0 (the 'License'). You may not use this file except in 
   9  * compliance with the License. The rights granted to you under the License 
  10  * may not be used to create, or enable the creation or redistribution of, 
  11  * unlawful or unlicensed copies of an Apple operating system, or to 
  12  * circumvent, violate, or enable the circumvention or violation of, any 
  13  * terms of an Apple operating system software license agreement. 
  15  * Please obtain a copy of the License at 
  16  * http://www.opensource.apple.com/apsl/ and read it before using this file. 
  18  * The Original Code and all software distributed under the License are 
  19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
  22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  23  * Please see the License for the specific language governing rights and 
  24  * limitations under the License. 
  26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 
  29         @header kpi_socketfilter.h 
  30         This header defines an API for intercepting communications at the 
  33         For the most part, socket filters want to do three things: Filter 
  34         data in and out, watch for state changes, and intercept a few calls 
  35         for security. The number of function pointers supplied by a socket 
  36         filter has been significantly reduced. The filter no longer has any 
  37         knowledge of socket buffers. The filter no longer intercepts nearly 
  38         every internal socket call. There are two data filters, an in 
  39         filter, and an out filter. The in filter occurs before data is 
  40         placed in the receive socket buffer. This is done to avoid waking 
  41         the process unnecessarily. The out filter occurs before the data is 
  42         appended to the send socket buffer. This should cover inbound and 
  43         outbound data. For monitoring state changes, we've added a notify 
  44         function that will be called when various events that the filter can 
  45         not intercept occur. In addition, we've added a few functions that a 
  46         filter may use to intercept common operations. These functions are: 
  47         connect (inbound), connect (outbound), bind, set socket option, 
  48         get socket option, and listen. Bind, listen, connect in, and connect 
  49         out could be used together to build a fairly comprehensive firewall 
  50         without having to do much with individual packets. 
  52 #ifndef __KPI_SOCKETFILTER__ 
  53 #define __KPI_SOCKETFILTER__ 
  55 #include <sys/kernel_types.h> 
  56 #include <sys/kpi_socket.h> 
  62         @abstract Constants defining mbuf flags. Only the flags listed below 
  63                 can be set or retrieved. 
  64         @constant SFLT_GLOBAL Indicates this socket filter should be 
  65                 attached to all new sockets when they're created. 
  66         @constant SFLT_PROG Indicates this socket filter should be attached 
  67                 only when request by the application using the SO_NKE socket 
  69         @constant SFLT_EXTENDED Indicates that this socket filter utilizes 
  70                 the extended fields within the sflt_filter structure. 
  77 typedef u_int32_t       sflt_flags
; 
  81         @abstract A 4 byte identifier used with the SO_NKE socket option to 
  82                 identify the socket filter to be attached. 
  84 typedef u_int32_t       sflt_handle
; 
  88         @abstract Events notify a filter of state changes and other various 
  89                 events related to the socket. These events cannot be prevented 
  90                 or intercepted, only observed. 
  91         @constant sock_evt_connected Indicates this socket has moved to the 
  93         @constant sock_evt_disconnected Indicates this socket has moved to 
  94                 the disconnected state. 
  95         @constant sock_evt_flush_read The read socket buffer has been 
  97         @constant sock_evt_shutdown The read and or write side(s) of the 
  98                 connection have been shutdown. The param will point to an 
  99                 integer that indicates the direction that has been shutdown. See 
 100                 'man 2 shutdown' for more information. 
 101         @constant sock_evt_cantrecvmore Indicates the socket cannot receive 
 103         @constant sock_evt_cantsendmore Indicates the socket cannot send 
 105         @constant sock_evt_closing Indicates the socket is closing. 
 106         @constant sock_evt_bound Indicates this socket has moved to the 
 107                 bound state (only for PF_INET/PF_INET6 domain). 
 110         sock_evt_connecting             
= 1, 
 111         sock_evt_connected              
= 2, 
 112         sock_evt_disconnecting          
= 3, 
 113         sock_evt_disconnected           
= 4, 
 114         sock_evt_flush_read             
= 5, 
 115         sock_evt_shutdown               
= 6, /* param points to an integer specifying how (read, write, or both) see man 2 shutdown */ 
 116         sock_evt_cantrecvmore           
= 7, 
 117         sock_evt_cantsendmore           
= 8, 
 118         sock_evt_closing                
= 9, 
 121 typedef u_int32_t       sflt_event_t
; 
 124         @enum sflt_data_flag_t 
 125         @abstract Inbound and outbound data filters may handle many 
 126                 different types of incoming and outgoing data. These flags help 
 127                 distinguish between normal data, out-of-band data, and records. 
 128         @constant sock_data_filt_flag_oob Indicates this data is out-of-band 
 130         @constant sock_data_filt_flag_record Indicates this data is a 
 131                 record. This flag is only ever seen on inbound data. 
 134         sock_data_filt_flag_oob         
= 1, 
 135         sock_data_filt_flag_record      
= 2 
 137 typedef u_int32_t       sflt_data_flag_t
; 
 142         @typedef sf_unregistered_func 
 144         @discussion sf_unregistered_func is called to notify the filter it 
 145                 has been unregistered. This is the last function the stack will 
 146                 call and this function will only be called once all other 
 147                 function calls in to your filter have completed. Once this 
 148                 function has been called, your kext may safely unload. 
 149         @param handle The socket filter handle used to identify this filter. 
 151 typedef void (*sf_unregistered_func
)(sflt_handle handle
); 
 154         @typedef sf_attach_func 
 156         @discussion sf_attach_func is called to notify the filter it has 
 157                 been attached to a socket. The filter may allocate memory for 
 158                 this attachment and use the cookie to track it. This filter is 
 159                 called in one of two cases: 
 160                 1) You've installed a global filter and a new socket was created. 
 161                 2) Your non-global socket filter is being attached using the SO_NKE 
 163         @param cookie Used to allow the socket filter to set the cookie for 
 165         @param so The socket the filter is being attached to. 
 166         @result If you return a non-zero value, your filter will not be 
 167                 attached to this socket. 
 169 typedef errno_t (*sf_attach_func
)(void  **cookie
, socket_t so
); 
 172         @typedef sf_detach_func 
 174         @discussion sf_detach_func is called to notify the filter it has 
 175                 been detached from a socket. If the filter allocated any memory 
 176                 for this attachment, it should be freed. This function will 
 177                 be called when the socket is disposed of. 
 178         @param cookie Cookie value specified when the filter attach was 
 180         @param so The socket the filter is attached to. 
 181         @result If you return a non-zero value, your filter will not be 
 182                 attached to this socket. 
 184 typedef void (*sf_detach_func
)(void *cookie
, socket_t so
); 
 187         @typedef sf_notify_func 
 189         @discussion sf_notify_func is called to notify the filter of various 
 190                 state changes and other events occuring on the socket. 
 191         @param cookie Cookie value specified when the filter attach was 
 193         @param so The socket the filter is attached to. 
 194         @param event The type of event that has occurred. 
 195         @param param Additional information about the event. 
 197 typedef void (*sf_notify_func
)(void *cookie
, socket_t so
, sflt_event_t event
, 
 201         @typedef sf_getpeername_func 
 203         @discussion sf_getpeername_func is called to allow a filter to 
 204                 to intercept the getpeername function. When called, sa will 
 205                 point to a pointer to a socket address that was malloced 
 206                 in zone M_SONAME. If you want to replace this address, either 
 207                 modify the currenty copy or allocate a new one and free the 
 209         @param cookie Cookie value specified when the filter attach was 
 211         @param so The socket the filter is attached to. 
 212         @param sa A pointer to a socket address pointer. 
 213         @result If you return a non-zero value, processing will stop. If 
 214                 you return EJUSTRETURN, no further filters will be called 
 215                 but a result of zero will be returned to the caller of 
 218 typedef int (*sf_getpeername_func
)(void *cookie
, socket_t so
, 
 219     struct sockaddr 
**sa
); 
 222         @typedef sf_getsockname_func 
 224         @discussion sf_getsockname_func is called to allow a filter to 
 225                 to intercept the getsockname function. When called, sa will 
 226                 point to a pointer to a socket address that was malloced 
 227                 in zone M_SONAME. If you want to replace this address, either 
 228                 modify the currenty copy or allocate a new one and free the 
 230         @param cookie Cookie value specified when the filter attach was 
 232         @param so The socket the filter is attached to. 
 233         @param sa A pointer to a socket address pointer. 
 234         @result If you return a non-zero value, processing will stop. If 
 235                 you return EJUSTRETURN, no further filters will be called 
 236                 but a result of zero will be returned to the caller of 
 239 typedef int (*sf_getsockname_func
)(void *cookie
, socket_t so
, 
 240     struct sockaddr 
**sa
); 
 243         @typedef sf_data_in_func 
 245         @discussion sf_data_in_func is called to filter incoming data. If your 
 246                 filter intercepts data for later reinjection, it must queue 
 247                 all incoming data to preserve the order of the data. Use 
 248                 sock_inject_data_in to later reinject this data if you return 
 249                 EJUSTRETURN. Warning: This filter is on the data path. Do not 
 250                 spend excesive time. Do not wait for data on another socket. 
 251         @param cookie Cookie value specified when the filter attach was 
 253         @param so The socket the filter is attached to. 
 254         @param from The addres the data is from, may be NULL if the socket 
 256         @param data The data being received. Control data may appear in the 
 257                 mbuf chain, be sure to check the mbuf types to find control 
 259         @param control Control data being passed separately from the data. 
 260         @param flags Flags to indicate if this is out of band data or a 
 263                 0 - The caller will continue with normal processing of the data. 
 264                 EJUSTRETURN - The caller will stop processing the data, the 
 265                         data will not be freed. 
 266                 Anything Else - The caller will free the data and stop 
 269 typedef errno_t (*sf_data_in_func
)(void *cookie
, socket_t so
, 
 270     const struct sockaddr 
*from
, mbuf_t 
*data
, mbuf_t 
*control
, 
 271     sflt_data_flag_t flags
); 
 274         @typedef sf_data_out_func 
 276         @discussion sf_data_out_func is called to filter outbound data. If 
 277                 your filter intercepts data for later reinjection, it must queue 
 278                 all outbound data to preserve the order of the data when 
 279                 reinjecting. Use sock_inject_data_out to later reinject this 
 281         @param cookie Cookie value specified when the filter attach was 
 283         @param so The socket the filter is attached to. 
 284         @param from The address the data is from, may be NULL if the socket 
 286         @param data The data being received. Control data may appear in the 
 287                 mbuf chain, be sure to check the mbuf types to find control 
 289         @param control Control data being passed separately from the data. 
 290         @param flags Flags to indicate if this is out of band data or a 
 293                 0 - The caller will continue with normal processing of the data. 
 294                 EJUSTRETURN - The caller will stop processing the data, 
 295                         the data will not be freed. 
 296                 Anything Else - The caller will free the data and stop 
 299 typedef errno_t (*sf_data_out_func
)(void *cookie
, socket_t so
, 
 300     const struct sockaddr 
*to
, mbuf_t 
*data
, mbuf_t 
*control
, 
 301     sflt_data_flag_t flags
); 
 304         @typedef sf_connect_in_func 
 306         @discussion sf_connect_in_func is called to filter inbound connections. 
 307                 A protocol will call this before accepting an incoming 
 308                 connection and placing it on the queue of completed connections. 
 309                 Warning: This filter is on the data path. Do not spend excesive 
 310                 time. Do not wait for data on another socket. 
 311         @param cookie Cookie value specified when the filter attach was 
 313         @param so The socket the filter is attached to. 
 314         @param from The address the incoming connection is from. 
 316                 0 - The caller will continue with normal processing of the 
 318                 Anything Else - The caller will rejecting the incoming 
 321 typedef errno_t (*sf_connect_in_func
)(void *cookie
, socket_t so
, 
 322     const struct sockaddr 
*from
); 
 325         @typedef sf_connect_out_func 
 327         @discussion sf_connect_out_func is called to filter outbound 
 328                 connections. A protocol will call this before initiating an 
 330         @param cookie Cookie value specified when the filter attach was 
 332         @param so The socket the filter is attached to. 
 333         @param to The remote address of the outbound connection. 
 335                 0 - The caller will continue with normal processing of the 
 337                 Anything Else - The caller will rejecting the outbound 
 340 typedef errno_t (*sf_connect_out_func
)(void *cookie
, socket_t so
, 
 341     const struct sockaddr 
*to
); 
 344         @typedef sf_bind_func 
 346         @discussion sf_bind_func is called before performing a bind 
 347                 operation on a socket. 
 348         @param cookie Cookie value specified when the filter attach was 
 350         @param so The socket the filter is attached to. 
 351         @param to The local address of the socket will be bound to. 
 353                 0 - The caller will continue with normal processing of the bind. 
 354                 Anything Else - The caller will rejecting the bind. 
 356 typedef errno_t (*sf_bind_func
)(void *cookie
, socket_t so
, 
 357     const struct sockaddr 
*to
); 
 360         @typedef sf_setoption_func 
 362         @discussion sf_setoption_func is called before performing setsockopt 
 364         @param cookie Cookie value specified when the filter attach was 
 366         @param so The socket the filter is attached to. 
 367         @param opt The socket option to set. 
 369                 0 - The caller will continue with normal processing of the 
 371                 Anything Else - The caller will stop processing and return 
 374 typedef errno_t (*sf_setoption_func
)(void *cookie
, socket_t so
, sockopt_t opt
); 
 377         @typedef sf_getoption_func 
 379         @discussion sf_getoption_func is called before performing getsockopt 
 381         @param cookie Cookie value specified when the filter attach was 
 383         @param so The socket the filter is attached to. 
 384         @param opt The socket option to get. 
 386                 0 - The caller will continue with normal processing of the 
 388                 Anything Else - The caller will stop processing and return 
 391 typedef errno_t (*sf_getoption_func
)(void *cookie
, socket_t so
, sockopt_t opt
); 
 394         @typedef sf_listen_func 
 396         @discussion sf_listen_func is called before performing listen 
 398         @param cookie Cookie value specified when the filter attach was 
 400         @param so The socket the filter is attached to. 
 402                 0 - The caller will continue with normal processing of listen. 
 403                 Anything Else - The caller will stop processing and return 
 406 typedef errno_t (*sf_listen_func
)(void *cookie
, socket_t so
); 
 409         @typedef sf_ioctl_func 
 411         @discussion sf_ioctl_func is called before performing an ioctl 
 414                 All undefined ioctls are reserved for future use by Apple. If 
 415                 you need to communicate with your kext using an ioctl, please 
 416                 use SIOCSIFKPI and SIOCGIFKPI. 
 417         @param cookie Cookie value specified when the filter attach was 
 419         @param so The socket the filter is attached to. 
 420         @param request The ioctl name. 
 421         @param argp A pointer to the ioctl parameter. 
 423                 0 - The caller will continue with normal processing of 
 425                 Anything Else - The caller will stop processing and return 
 428 typedef errno_t (*sf_ioctl_func
)(void *cookie
, socket_t so
, 
 429     unsigned long request
, const char* argp
); 
 432         @typedef sf_accept_func 
 434         @discussion sf_accept_func is called after a socket is dequeued 
 435                 off the completed (incoming) connection list and before 
 436                 the file descriptor is associated with it.  A filter can 
 437                 utilize this callback to intercept the accepted socket 
 438                 in order to examine it, prior to returning the socket to 
 439                 the caller of accept.  Such a filter may also choose to 
 440                 discard the accepted socket if it wishes to do so. 
 441         @param cookie Cookie value specified when the filter attach was called. 
 442         @param so_listen The listening socket. 
 443         @param so The socket that is about to be accepted. 
 444         @param local The local address of the about to be accepted socket. 
 445         @param remote The remote address of the about to be accepted socket. 
 447                 0 - The caller will continue with normal processing of accept. 
 448                 EJUSTRETURN - The to be accepted socket will be disconnected 
 449                     prior to being returned to the caller of accept.  No further 
 450                     control or data operations on the socket will be allowed. 
 451                     This is the recommended return value as it has the least 
 452                     amount of impact, especially to applications which don't 
 453                     check the error value returned by accept. 
 454                 Anything Else - The to be accepted socket will be closed and 
 455                     the error will be returned to the caller of accept. 
 456                     Note that socket filter developers are advised to exercise 
 457                     caution when returning non-zero values to the caller, 
 458                     since some applications don't check the error value 
 459                     returned by accept and therefore risk breakage. 
 461 typedef errno_t (*sf_accept_func
)(void *cookie
, socket_t so_listen
, socket_t so
, 
 462     const struct sockaddr 
*local
, const struct sockaddr 
*remote
); 
 466         @discussion This structure is used to define a socket filter. 
 467         @field sf_handle A value used to find socket filters by 
 468                 applications. An application can use this value to specify that 
 469                 this filter should be attached when using the SO_NKE socket 
 471         @field sf_flags Indicate whether this filter should be attached to 
 472                 all new sockets or just those that request the filter be 
 473                 attached using the SO_NKE socket option. If this filter 
 474                 utilizes the socket filter extension fields, it must also 
 476         @field sf_name A name used for debug purposes. 
 477         @field sf_unregistered Your function for being notified when your 
 478                 filter has been unregistered. 
 479         @field sf_attach Your function for handling attaches to sockets. 
 480         @field sf_detach Your function for handling detaches from sockets. 
 481         @field sf_notify Your function for handling events. May be null. 
 482         @field sf_data_in Your function for handling incoming data. May be 
 484         @field sf_data_out Your function for handling outgoing data. May be 
 486         @field sf_connect_in Your function for handling inbound 
 487                 connections. May be null. 
 488         @field sf_connect_out Your function for handling outbound 
 489                 connections. May be null. 
 490         @field sf_bind Your function for handling binds. May be null. 
 491         @field sf_setoption Your function for handling setsockopt. May be null. 
 492         @field sf_getoption Your function for handling getsockopt. May be null. 
 493         @field sf_listen Your function for handling listen. May be null. 
 494         @field sf_ioctl Your function for handling ioctls. May be null. 
 495         @field sf_len Length of socket filter extension structure; developers 
 496                 must initialize this to sizeof sflt_filter_ext structure. 
 497                 This field and all fields following it will only be valid 
 498                 if SFLT_EXTENDED flag is set in sf_flags field. 
 499         @field sf_ext_accept Your function for handling inbound connections 
 500                 at accept time.  May be null. 
 501         @field sf_ext_rsvd Reserved for future use; you must initialize 
 502                 the reserved fields with zeroes. 
 505         sflt_handle                     sf_handle
; 
 509         sf_unregistered_func            sf_unregistered
; 
 510         sf_attach_func                  sf_attach
; 
 511         sf_detach_func                  sf_detach
; 
 513         sf_notify_func                  sf_notify
; 
 514         sf_getpeername_func             sf_getpeername
; 
 515         sf_getsockname_func             sf_getsockname
; 
 516         sf_data_in_func                 sf_data_in
; 
 517         sf_data_out_func                sf_data_out
; 
 518         sf_connect_in_func              sf_connect_in
; 
 519         sf_connect_out_func             sf_connect_out
; 
 520         sf_bind_func                    sf_bind
; 
 521         sf_setoption_func               sf_setoption
; 
 522         sf_getoption_func               sf_getoption
; 
 523         sf_listen_func                  sf_listen
; 
 524         sf_ioctl_func                   sf_ioctl
; 
 526          * The following are valid only if SFLT_EXTENDED flag is set. 
 527          * Initialize sf_ext_len to sizeof sflt_filter_ext structure. 
 528          * Filters must also initialize reserved fields with zeroes. 
 530         struct sflt_filter_ext 
{ 
 531                 unsigned int            sf_ext_len
; 
 532                 sf_accept_func          sf_ext_accept
; 
 533                 void                    *sf_ext_rsvd
[5];        /* Reserved */ 
 535 #define sf_len          sf_ext.sf_ext_len 
 536 #define sf_accept       sf_ext.sf_ext_accept 
 540         @function sflt_register 
 541         @discussion Registers a socket filter. See 'man 2 socket' for a 
 542                 desciption of domain, type, and protocol. 
 543         @param filter A structure describing the filter. 
 544         @param domain The protocol domain these filters will be attached to. 
 545         @param type The socket type these filters will be attached to. 
 546         @param protocol The protocol these filters will be attached to. 
 547         @result 0 on success otherwise the errno error. 
 549 extern errno_t 
sflt_register(const struct sflt_filter 
*filter
, int domain
, 
 550     int type
, int protocol
); 
 553         @function sflt_unregister 
 554         @discussion Unregisters a socket filter. This will not detach the 
 555                 socket filter from all sockets it may be attached to at the 
 556                 time, it will just prevent the socket filter from being attached 
 558         @param handle The sf_handle of the socket filter to unregister. 
 559         @result 0 on success otherwise the errno error. 
 561 extern errno_t 
sflt_unregister(sflt_handle handle
); 
 564         @function sflt_attach 
 565         @discussion Attaches a socket filter to the specified socket. A 
 566                 filter must be registered before it can be attached. 
 567         @param socket The socket the filter should be attached to. 
 568         @param handle The handle of the registered filter to be attached. 
 569         @result 0 on success otherwise the errno error. 
 571 extern errno_t 
sflt_attach(socket_t so
, sflt_handle
); 
 574         @function sflt_detach 
 575         @discussion Detaches a socket filter from a specified socket. 
 576         @param socket The socket the filter should be detached from. 
 577         @param handle The handle of the registered filter to be detached. 
 578         @result 0 on success otherwise the errno error. 
 580 extern errno_t 
sflt_detach(socket_t so
, sflt_handle
); 
 582 /* Functions for manipulating sockets */ 
 584  * Inject data in to the receive buffer of the socket as if it 
 585  * had come from the network. 
 587  * flags should match sflt_data_flag_t 
 591         @function sock_inject_data_in 
 592         @discussion Inject data in to the receive buffer of the socket as if 
 593                 it had come from the network. 
 594         @param so The socket to inject the data on. 
 595         @param from The address the data is from, only necessary on 
 596                 un-connected sockets. A copy of the address will be made, caller 
 597                 is responsible for freeing the address after calling this 
 599         @param data The data and possibly control mbufs. 
 600         @param control The separate control mbufs. 
 601         @param flags Flags indicating the type of data. 
 602         @result 0 on success otherwise the errno error. If the function 
 603                 returns an error, the caller is responsible for freeing the 
 606 extern errno_t 
sock_inject_data_in(socket_t so
, const struct sockaddr 
*from
, 
 607     mbuf_t data
, mbuf_t control
, sflt_data_flag_t flags
); 
 610         @function sock_inject_data_out 
 611         @discussion Inject data in to the send buffer of the socket as if it 
 612                 had come from the client. 
 613         @param so The socket to inject the data on. 
 614         @param to The address the data should be sent to, only necessary on 
 615                 un-connected sockets. The caller is responsible for freeing the 
 616                 to address after sock_inject_data_out returns. 
 617         @param data The data and possibly control mbufs. 
 618         @param control The separate control mbufs. 
 619         @param flags Flags indicating the type of data. 
 620         @result 0 on success otherwise the errno error. The data and control 
 621                 values are always freed regardless of return value. 
 623 extern errno_t 
sock_inject_data_out(socket_t so
, const struct sockaddr 
*to
, 
 624     mbuf_t data
, mbuf_t control
, sflt_data_flag_t flags
); 
 628  * sockopt_t accessors 
 635 typedef u_int8_t sockopt_dir
; 
 638         @function sockopt_direction 
 639         @discussion Retrieves the direction of the socket option (Get or 
 641         @param sopt The socket option. 
 642         @result sock_opt_get or sock_opt_set. 
 644 extern sockopt_dir 
sockopt_direction(sockopt_t sopt
); 
 647         @function sockopt_level 
 648         @discussion Retrieves the socket option level. (SOL_SOCKET, etc). 
 649         @param sopt The socket option. 
 650         @result The socket option level. See man 2 setsockopt 
 652 extern int sockopt_level(sockopt_t sopt
); 
 655         @function sockopt_name 
 656         @discussion Retrieves the socket option name. (SO_SNDBUF, etc). 
 657         @param sopt The socket option. 
 658         @result The socket option name. See man 2 setsockopt 
 660 extern int sockopt_name(sockopt_t sopt
); 
 663         @function sockopt_valsize 
 664         @discussion Retrieves the size of the socket option data. 
 665         @param sopt The socket option. 
 666         @result The length, in bytes, of the data. 
 668 extern size_t sockopt_valsize(sockopt_t sopt
); 
 671         @function sockopt_copyin 
 672         @discussion Copies the data from the socket option to a buffer. 
 673         @param sopt The socket option. 
 674         @param data A pointer to the buffer to copy the data in to. 
 675         @param length The number of bytes to copy. 
 676         @result An errno error or zero upon success. 
 678 extern errno_t 
sockopt_copyin(sockopt_t sopt
, void *data
, size_t length
); 
 681         @function sockopt_copyout 
 682         @discussion Copies the data from a buffer to a socket option. 
 683         @param sopt The socket option. 
 684         @param data A pointer to the buffer to copy the data out of. 
 685         @param length The number of bytes to copy. 
 686         @result An errno error or zero upon success. 
 688 extern errno_t 
sockopt_copyout(sockopt_t sopt
, void *data
, size_t length
); 
 691 #endif /* __KPI_SOCKETFILTER__ */