darwin-xnu/bsd/sys/protosw.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2000-2005 Apple Computer, Inc. All rights reserved.
   3 *
   4 * @APPLE_LICENSE_HEADER_START@
   5 * 
   6 * The contents of this file constitute Original Code as defined in and
   7 * are subject to the Apple Public Source License Version 1.1 (the
   8 * "License").  You may not use this file except in compliance with the
   9 * License.  Please obtain a copy of the License at
  10 * http://www.apple.com/publicsource and read it before using this file.
  11 * 
  12 * This Original Code and all software distributed under the License are
  13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
  16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
  17 * License for the specific language governing rights and limitations
  18 * under the License.
  19 * 
  20 * @APPLE_LICENSE_HEADER_END@
  21 */
  22/* Copyright (c) 1998, 1999 Apple Computer, Inc. All Rights Reserved */
  23/* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */
  24/*
  25 * Copyright (c) 1982, 1986, 1993
  26 *      The Regents of the University of California.  All rights reserved.
  27 *
  28 * Redistribution and use in source and binary forms, with or without
  29 * modification, are permitted provided that the following conditions
  30 * are met:
  31 * 1. Redistributions of source code must retain the above copyright
  32 *    notice, this list of conditions and the following disclaimer.
  33 * 2. Redistributions in binary form must reproduce the above copyright
  34 *    notice, this list of conditions and the following disclaimer in the
  35 *    documentation and/or other materials provided with the distribution.
  36 * 3. All advertising materials mentioning features or use of this software
  37 *    must display the following acknowledgement:
  38 *      This product includes software developed by the University of
  39 *      California, Berkeley and its contributors.
  40 * 4. Neither the name of the University nor the names of its contributors
  41 *    may be used to endorse or promote products derived from this software
  42 *    without specific prior written permission.
  43 *
  44 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  45 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  46 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  47 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  48 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  49 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  50 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  51 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  52 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  53 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  54 * SUCH DAMAGE.
  55 *
  56 *      @(#)protosw.h   8.1 (Berkeley) 6/2/93
  57 * $FreeBSD: src/sys/sys/protosw.h,v 1.28.2.2 2001/07/03 11:02:01 ume Exp $
  58 */
  59
  60#ifndef _SYS_PROTOSW_H_
  61#define _SYS_PROTOSW_H_
  62
  63#include <sys/appleapiopts.h>
  64#include <sys/cdefs.h>
  65
  66#define PR_SLOWHZ       2               /* 2 slow timeouts per second */
  67#define PR_FASTHZ       5               /* 5 fast timeouts per second */
  68
  69#ifdef PRIVATE
  70
  71/* Forward declare these structures referenced from prototypes below. */
  72struct mbuf;
  73struct proc;
  74struct sockaddr;
  75struct socket;
  76struct sockopt;
  77struct socket_filter;
  78
  79/*#ifdef _KERNEL*/
  80/*
  81 * Protocol switch table.
  82 *
  83 * Each protocol has a handle initializing one of these structures,
  84 * which is used for protocol-protocol and system-protocol communication.
  85 *
  86 * A protocol is called through the pr_init entry before any other.
  87 * Thereafter it is called every 200ms through the pr_fasttimo entry and
  88 * every 500ms through the pr_slowtimo for timer based actions.
  89 * The system will call the pr_drain entry if it is low on space and
  90 * this should throw away any non-critical data.
  91 *
  92 * Protocols pass data between themselves as chains of mbufs using
  93 * the pr_input and pr_output hooks.  Pr_input passes data up (towards
  94 * the users) and pr_output passes it down (towards the interfaces); control
  95 * information passes up and down on pr_ctlinput and pr_ctloutput.
  96 * The protocol is responsible for the space occupied by any the
  97 * arguments to these entries and must dispose it.
  98 *
  99 * The userreq routine interfaces protocols to the system and is
 100 * described below.
 101 */
 102 
 103#include <sys/socketvar.h>
 104#include <sys/queue.h>
 105#ifdef KERNEL
 106#include <kern/locks.h>
 107#endif /* KERNEL */
 108
 109#if __DARWIN_ALIGN_POWER
 110#pragma options align=power
 111#endif
 112
 113struct protosw {
 114        short   pr_type;                /* socket type used for */
 115        struct  domain *pr_domain;      /* domain protocol a member of */
 116        short   pr_protocol;            /* protocol number */
 117        unsigned int pr_flags;          /* see below */
 118/* protocol-protocol hooks */
 119        void    (*pr_input)(struct mbuf *, int len);
 120                                        /* input to protocol (from below) */
 121        int     (*pr_output)(struct mbuf *m, struct socket *so);
 122                                        /* output to protocol (from above) */
 123        void    (*pr_ctlinput)(int, struct sockaddr *, void *);
 124                                        /* control input (from below) */
 125        int     (*pr_ctloutput)(struct socket *, struct sockopt *);
 126                                        /* control output (from above) */
 127/* user-protocol hook */
 128        void    *pr_ousrreq;
 129/* utility hooks */
 130        void    (*pr_init)(void);       /* initialization hook */
 131        void    (*pr_fasttimo)(void);
 132                                        /* fast timeout (200ms) */
 133        void    (*pr_slowtimo)(void);
 134                                        /* slow timeout (500ms) */
 135        void    (*pr_drain)(void);
 136                                        /* flush any excess space possible */
 137#if __APPLE__
 138        int     (*pr_sysctl)(int *, u_int, void *, size_t *, void *, size_t);
 139                                        /* sysctl for protocol */
 140#endif
 141        struct  pr_usrreqs *pr_usrreqs; /* supersedes pr_usrreq() */
 142#if __APPLE__
 143        int     (*pr_lock)      (struct socket *so, int locktype, int debug); /* lock function for protocol */
 144        int     (*pr_unlock)    (struct socket *so, int locktype, int debug); /* unlock for protocol */
 145#ifdef _KERN_LOCKS_H_
 146        lck_mtx_t *     (*pr_getlock)   (struct socket *so, int locktype);
 147#else
 148        void *  (*pr_getlock)   (struct socket *so, int locktype);
 149#endif
 150#endif
 151#if __APPLE__
 152/* Implant hooks */
 153        TAILQ_HEAD(, socket_filter) pr_filter_head;
 154        struct protosw *pr_next;        /* Chain for domain */
 155        u_long  reserved[1];            /* Padding for future use */
 156#endif
 157};
 158
 159#if __DARWIN_ALIGN_POWER
 160#pragma options align=reset
 161#endif
 162
 163/*
 164 * Values for pr_flags.
 165 * PR_ADDR requires PR_ATOMIC;
 166 * PR_ADDR and PR_CONNREQUIRED are mutually exclusive.
 167 * PR_IMPLOPCL means that the protocol allows sendto without prior connect,
 168 *      and the protocol understands the MSG_EOF flag.  The first property is
 169 *      is only relevant if PR_CONNREQUIRED is set (otherwise sendto is allowed
 170 *      anyhow).
 171 */
 172#define PR_ATOMIC                       0x01            /* exchange atomic messages only */
 173#define PR_ADDR                 0x02            /* addresses given with messages */
 174#define PR_CONNREQUIRED 0x04            /* connection required by protocol */
 175#define PR_WANTRCVD             0x08            /* want PRU_RCVD calls */
 176#define PR_RIGHTS                       0x10            /* passes capabilities */
 177#define PR_IMPLOPCL             0x20            /* implied open/close */
 178#define PR_LASTHDR              0x40            /* enforce ipsec policy; last header */
 179#define PR_PROTOLOCK            0x80            /* protocol takes care of it's own locking */
 180#define PR_PCBLOCK              0x100   /* protocol supports per pcb finer grain locking */
 181#define PR_DISPOSE              0x200   /* protocol requires late lists disposal */
 182
 183/*
 184 * The arguments to usrreq are:
 185 *      (*protosw[].pr_usrreq)(up, req, m, nam, opt);
 186 * where up is a (struct socket *), req is one of these requests,
 187 * m is a optional mbuf chain containing a message,
 188 * nam is an optional mbuf chain containing an address,
 189 * and opt is a pointer to a socketopt structure or nil.
 190 * The protocol is responsible for disposal of the mbuf chain m,
 191 * the caller is responsible for any space held by nam and opt.
 192 * A non-zero return from usrreq gives an
 193 * UNIX error number which should be passed to higher level software.
 194 */
 195#define PRU_ATTACH              0       /* attach protocol to up */
 196#define PRU_DETACH              1       /* detach protocol from up */
 197#define PRU_BIND                2       /* bind socket to address */
 198#define PRU_LISTEN              3       /* listen for connection */
 199#define PRU_CONNECT             4       /* establish connection to peer */
 200#define PRU_ACCEPT              5       /* accept connection from peer */
 201#define PRU_DISCONNECT          6       /* disconnect from peer */
 202#define PRU_SHUTDOWN            7       /* won't send any more data */
 203#define PRU_RCVD                8       /* have taken data; more room now */
 204#define PRU_SEND                9       /* send this data */
 205#define PRU_ABORT               10      /* abort (fast DISCONNECT, DETATCH) */
 206#define PRU_CONTROL             11      /* control operations on protocol */
 207#define PRU_SENSE               12      /* return status into m */
 208#define PRU_RCVOOB              13      /* retrieve out of band data */
 209#define PRU_SENDOOB             14      /* send out of band data */
 210#define PRU_SOCKADDR            15      /* fetch socket's address */
 211#define PRU_PEERADDR            16      /* fetch peer's address */
 212#define PRU_CONNECT2            17      /* connect two sockets */
 213/* begin for protocols internal use */
 214#define PRU_FASTTIMO            18      /* 200ms timeout */
 215#define PRU_SLOWTIMO            19      /* 500ms timeout */
 216#define PRU_PROTORCV            20      /* receive from below */
 217#define PRU_PROTOSEND           21      /* send to below */
 218/* end for protocol's internal use */
 219#define PRU_SEND_EOF            22      /* send and close */
 220#define PRU_NREQ                22
 221
 222#ifdef PRUREQUESTS
 223char *prurequests[] = {
 224        "ATTACH",       "DETACH",       "BIND",         "LISTEN",
 225        "CONNECT",      "ACCEPT",       "DISCONNECT",   "SHUTDOWN",
 226        "RCVD",         "SEND",         "ABORT",        "CONTROL",
 227        "SENSE",        "RCVOOB",       "SENDOOB",      "SOCKADDR",
 228        "PEERADDR",     "CONNECT2",     "FASTTIMO",     "SLOWTIMO",
 229        "PROTORCV",     "PROTOSEND",
 230        "SEND_EOF",
 231};
 232#endif
 233
 234#ifdef  KERNEL                  /* users shouldn't see this decl */
 235
 236struct ifnet;
 237struct stat;
 238struct ucred;
 239struct uio;
 240
 241/*
 242 * If the ordering here looks odd, that's because it's alphabetical.
 243 * Having this structure separated out from the main protoswitch is allegedly
 244 * a big (12 cycles per call) lose on high-end CPUs.  We will eventually
 245 * migrate this stuff back into the main structure.
 246 */
 247struct pr_usrreqs {
 248        int     (*pru_abort)(struct socket *so);
 249        int     (*pru_accept)(struct socket *so, struct sockaddr **nam);
 250        int     (*pru_attach)(struct socket *so, int proto, struct proc *p);
 251        int     (*pru_bind)(struct socket *so, struct sockaddr *nam,
 252                                 struct proc *p);
 253        int     (*pru_connect)(struct socket *so, struct sockaddr *nam,
 254                                    struct proc *p);
 255        int     (*pru_connect2)(struct socket *so1, struct socket *so2);
 256        int     (*pru_control)(struct socket *so, u_long cmd, caddr_t data,
 257                                    struct ifnet *ifp, struct proc *p);
 258        int     (*pru_detach)(struct socket *so);
 259        int     (*pru_disconnect)(struct socket *so);
 260        int     (*pru_listen)(struct socket *so, struct proc *p);
 261        int     (*pru_peeraddr)(struct socket *so, struct sockaddr **nam);
 262        int     (*pru_rcvd)(struct socket *so, int flags);
 263        int     (*pru_rcvoob)(struct socket *so, struct mbuf *m, int flags);
 264        int     (*pru_send)(struct socket *so, int flags, struct mbuf *m, 
 265                                 struct sockaddr *addr, struct mbuf *control,
 266                                 struct proc *p);
 267#define PRUS_OOB        0x1
 268#define PRUS_EOF        0x2
 269#define PRUS_MORETOCOME 0x4
 270        int     (*pru_sense)(struct socket *so, struct stat *sb);
 271        int     (*pru_shutdown)(struct socket *so);
 272        int     (*pru_sockaddr)(struct socket *so, struct sockaddr **nam);
 273         
 274        /*
 275         * These three added later, so they are out of order.  They are used
 276         * for shortcutting (fast path input/output) in some protocols.
 277         * XXX - that's a lie, they are not implemented yet
 278         * Rather than calling sosend() etc. directly, calls are made
 279         * through these entry points.  For protocols which still use
 280         * the generic code, these just point to those routines.
 281         */
 282        int     (*pru_sosend)(struct socket *so, struct sockaddr *addr,
 283                                   struct uio *uio, struct mbuf *top,
 284                                   struct mbuf *control, int flags);
 285        int     (*pru_soreceive)(struct socket *so, 
 286                                      struct sockaddr **paddr,
 287                                      struct uio *uio, struct mbuf **mp0,
 288                                      struct mbuf **controlp, int *flagsp);
 289        int     (*pru_sopoll)(struct socket *so, int events, 
 290                                   struct ucred *cred, void *);
 291};
 292
 293__BEGIN_DECLS
 294
 295extern int      pru_abort_notsupp(struct socket *so);
 296extern int      pru_accept_notsupp(struct socket *so, struct sockaddr **nam);
 297extern int      pru_attach_notsupp(struct socket *so, int proto,
 298                                   struct proc *p);
 299extern int      pru_bind_notsupp(struct socket *so, struct sockaddr *nam,
 300                                 struct proc *p);
 301extern int      pru_connect_notsupp(struct socket *so, struct sockaddr *nam,
 302                                    struct proc *p);
 303extern int      pru_connect2_notsupp(struct socket *so1, struct socket *so2);
 304extern int      pru_control_notsupp(struct socket *so, u_long cmd, caddr_t data,
 305                                    struct ifnet *ifp, struct proc *p);
 306extern int      pru_detach_notsupp(struct socket *so);
 307extern int      pru_disconnect_notsupp(struct socket *so);
 308extern int      pru_listen_notsupp(struct socket *so, struct proc *p);
 309extern int      pru_peeraddr_notsupp(struct socket *so, 
 310                                     struct sockaddr **nam);
 311extern int      pru_rcvd_notsupp(struct socket *so, int flags);
 312extern int      pru_rcvoob_notsupp(struct socket *so, struct mbuf *m,
 313                                   int flags);
 314extern int      pru_send_notsupp(struct socket *so, int flags, struct mbuf *m, 
 315                                 struct sockaddr *addr, struct mbuf *control,
 316                                 struct proc *p);
 317extern int      pru_sense_null(struct socket *so, struct stat *sb);
 318extern int      pru_shutdown_notsupp(struct socket *so);
 319extern int      pru_sockaddr_notsupp(struct socket *so, 
 320                                     struct sockaddr **nam);
 321extern int      pru_sosend_notsupp(struct socket *so, struct sockaddr *addr,
 322                                   struct uio *uio, struct mbuf *top,
 323                                   struct mbuf *control, int flags);
 324extern int      pru_soreceive_notsupp(struct socket *so, 
 325                                      struct sockaddr **paddr,
 326                                      struct uio *uio, struct mbuf **mp0,
 327                                      struct mbuf **controlp, int *flagsp);
 328extern int      pru_sopoll_notsupp(struct socket *so, int events, 
 329                                   struct ucred *cred, void *);
 330
 331__END_DECLS
 332
 333#endif /* KERNEL */
 334
 335/*
 336 * The arguments to the ctlinput routine are
 337 *      (*protosw[].pr_ctlinput)(cmd, sa, arg);
 338 * where cmd is one of the commands below, sa is a pointer to a sockaddr,
 339 * and arg is a `void *' argument used within a protocol family.
 340 */
 341#define PRC_IFDOWN              0       /* interface transition */
 342#define PRC_ROUTEDEAD           1       /* select new route if possible ??? */
 343#define PRC_IFUP                2       /* interface has come back up */
 344#define PRC_QUENCH2             3       /* DEC congestion bit says slow down */
 345#define PRC_QUENCH              4       /* some one said to slow down */
 346#define PRC_MSGSIZE             5       /* message size forced drop */
 347#define PRC_HOSTDEAD            6       /* host appears to be down */
 348#define PRC_HOSTUNREACH         7       /* deprecated (use PRC_UNREACH_HOST) */
 349#define PRC_UNREACH_NET         8       /* no route to network */
 350#define PRC_UNREACH_HOST        9       /* no route to host */
 351#define PRC_UNREACH_PROTOCOL    10      /* dst says bad protocol */
 352#define PRC_UNREACH_PORT        11      /* bad port # */
 353/* was  PRC_UNREACH_NEEDFRAG    12         (use PRC_MSGSIZE) */
 354#define PRC_UNREACH_SRCFAIL     13      /* source route failed */
 355#define PRC_REDIRECT_NET        14      /* net routing redirect */
 356#define PRC_REDIRECT_HOST       15      /* host routing redirect */
 357#define PRC_REDIRECT_TOSNET     16      /* redirect for type of service & net */
 358#define PRC_REDIRECT_TOSHOST    17      /* redirect for tos & host */
 359#define PRC_TIMXCEED_INTRANS    18      /* packet lifetime expired in transit */
 360#define PRC_TIMXCEED_REASS      19      /* lifetime expired on reass q */
 361#define PRC_PARAMPROB           20      /* header incorrect */
 362#define PRC_UNREACH_ADMIN_PROHIB        21      /* packet administrativly prohibited */
 363
 364#define PRC_NCMDS               22
 365
 366#define PRC_IS_REDIRECT(cmd)    \
 367        ((cmd) >= PRC_REDIRECT_NET && (cmd) <= PRC_REDIRECT_TOSHOST)
 368
 369#ifdef PRCREQUESTS
 370char    *prcrequests[] = {
 371        "IFDOWN", "ROUTEDEAD", "IFUP", "DEC-BIT-QUENCH2",
 372        "QUENCH", "MSGSIZE", "HOSTDEAD", "#7",
 373        "NET-UNREACH", "HOST-UNREACH", "PROTO-UNREACH", "PORT-UNREACH",
 374        "#12", "SRCFAIL-UNREACH", "NET-REDIRECT", "HOST-REDIRECT",
 375        "TOSNET-REDIRECT", "TOSHOST-REDIRECT", "TX-INTRANS", "TX-REASS",
 376        "PARAMPROB", "ADMIN-UNREACH"
 377};
 378#endif
 379
 380/*
 381 * The arguments to ctloutput are:
 382 *      (*protosw[].pr_ctloutput)(req, so, level, optname, optval, p);
 383 * req is one of the actions listed below, so is a (struct socket *),
 384 * level is an indication of which protocol layer the option is intended.
 385 * optname is a protocol dependent socket option request,
 386 * optval is a pointer to a mbuf-chain pointer, for value-return results.
 387 * The protocol is responsible for disposal of the mbuf chain *optval
 388 * if supplied,
 389 * the caller is responsible for any space held by *optval, when returned.
 390 * A non-zero return from usrreq gives an
 391 * UNIX error number which should be passed to higher level software.
 392 */
 393#define PRCO_GETOPT     0
 394#define PRCO_SETOPT     1
 395
 396#define PRCO_NCMDS      2
 397
 398#ifdef PRCOREQUESTS
 399char    *prcorequests[] = {
 400        "GETOPT", "SETOPT",
 401};
 402#endif
 403
 404#ifdef KERNEL
 405
 406__BEGIN_DECLS
 407
 408void    pfctlinput(int, struct sockaddr *);
 409void    pfctlinput2(int, struct sockaddr *, void *);
 410struct protosw *pffindproto(int family, int protocol, int type);
 411struct protosw *pffindproto_locked(int family, int protocol, int type);
 412struct protosw *pffindtype(int family, int type);
 413
 414extern int net_add_proto(struct protosw *, struct domain *);
 415extern int net_del_proto(int, int, struct domain *);
 416
 417__END_DECLS
 418
 419/* Temp hack to link static domains together */
 420
 421#define LINK_PROTOS(psw) \
 422static void link_ ## psw ## _protos() \
 423{ \
 424      int i; \
 425                 \
 426    for (i=0; i < ((sizeof(psw)/sizeof(psw[0])) - 1); i++) \
 427             psw[i].pr_next = &psw[i + 1]; \
 428} 
 429
 430#endif
 431
 432#endif /* PRIVATE */
 433#endif  /* !_SYS_PROTOSW_H_ */
 434
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.