home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 4 / hacker04 / 04_HACK04.ISO / darwin / darwinx86.iso / usr / include / net / kext_net.h < prev    next >
Encoding:
C/C++ Source or Header  |  2001-09-30  |  7.1 KB  |  205 lines

  1. /*
  2.  * Copyright (c) 2000 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) 1999 Apple Computer, Inc.  */
  23. /*
  24.  * Support for network filter kernel extensions
  25.  * Justin C. Walker, 990319
  26.  */
  27. #ifndef NET_KEXT_NET_H
  28. #define NET_KEXT_NET_H
  29.  
  30. #include <sys/queue.h>
  31. #include <sys/socketvar.h>
  32.  
  33. struct mbuf;
  34. struct socket;
  35. struct uio;
  36. struct sockbuf;
  37. struct sockaddr;
  38. struct kextcb;
  39. struct protosw;
  40. struct sockif;
  41. struct sockutil;
  42. struct sockopt;
  43.  
  44. /*
  45.  * This structure gives access to the functionality of the filter.
  46.  * The kextcb provides the link from the socket structure.
  47.  */
  48. struct NFDescriptor
  49. {    TAILQ_ENTRY(NFDescriptor) nf_next;    /* protosw chain */
  50.     TAILQ_ENTRY(NFDescriptor) nf_list;    /* descriptor list */
  51.     unsigned int nf_handle;            /* Identifier */
  52.     int nf_flags;
  53.     /* Dispatch for PF_FILTER control */
  54.     int (*nf_connect)();            /* Make contact */
  55.     void (*nf_disconnect)();        /* Break contact */
  56.     int (*nf_read)();            /* Get data from filter */
  57.     int (*nf_write)();            /* Send data to filter */
  58.     int (*nf_get)();            /* Get filter config */
  59.     int (*nf_set)();            /* Set filter config */
  60.     /*
  61.      * Socket function dispatch vectors - copied to kextcb
  62.      *  during socreate()
  63.      */
  64.     struct  sockif *nf_soif;        /* Socket functions */
  65.     struct    sockutil *nf_soutil;        /* Sockbuf utility functions */
  66.     u_long    reserved[4];            /* for future use if needed */
  67. };
  68.  
  69. #define NFD_GLOBAL    0x01
  70. #define NFD_PROG    0x02
  71. #define NFD_VISIBLE    0x80000000
  72.  
  73. #define NFF_BEFORE        0x01
  74. #define NFF_AFTER        0x02
  75.  
  76. #ifdef KERNEL
  77. /* How to register: filter, insert location, target protosw, flags */
  78. extern int register_sockfilter(struct NFDescriptor *,
  79.                    struct NFDescriptor *,
  80.                    struct protosw *, int);
  81. /* How to unregister: filter, original protosw, flags */
  82. extern int unregister_sockfilter(struct NFDescriptor *, struct protosw *, int);
  83.  
  84. TAILQ_HEAD(nf_list, NFDescriptor);
  85.  
  86. extern struct nf_list nf_list;
  87. #endif
  88.  
  89. #define NKE_OK 0
  90. #define NKE_REMOVE -1
  91.  
  92. /*
  93.  * Interface structure for inserting an installed socket NKE into an
  94.  *  existing socket.
  95.  * 'handle' is the NKE to be inserted, 'where' is an insertion point,
  96.  *  and flags dictate the position of the to-be-inserted NKE relative to
  97.  *  the 'where' NKE.  If the latter is NULL, the flags indicate "first"
  98.  *  or "last"
  99.  */
  100. struct so_nke
  101. {    unsigned int nke_handle;
  102.     unsigned int nke_where;
  103.     int nke_flags; /* NFF_BEFORE, NFF_AFTER: net/kext_net.h */
  104.     unsigned long reserved[4];    /* for future use */
  105. };
  106.  
  107. /*
  108.  * sockif:
  109.  * Contains socket interface:
  110.  *  dispatch vector abstracting the interface between protocols and
  111.  *  the socket layer.
  112.  * TODO: add sf_sosense()
  113.  */
  114. struct sockif
  115. {    int (*sf_soabort)(struct socket *, struct kextcb *);
  116.     int (*sf_soaccept)(struct socket *, struct sockaddr **,
  117.                struct kextcb *);
  118.     int (*sf_sobind)(struct socket *, struct sockaddr *, struct kextcb *);
  119.     int (*sf_soclose)(struct socket *, struct kextcb *);
  120.     int (*sf_soconnect)(struct socket *, struct sockaddr *,
  121.                 struct kextcb *);
  122.     int (*sf_soconnect2)(struct socket *, struct socket *,
  123.                  struct kextcb *);
  124.     int (*sf_socontrol)(struct socket *, struct sockopt *,
  125.                 struct kextcb *);
  126.     int (*sf_socreate)(struct socket *, struct protosw *, struct kextcb *);
  127.     int (*sf_sodisconnect)(struct socket *, struct kextcb *);
  128.     int (*sf_sofree)(struct socket *, struct kextcb *);
  129.     int (*sf_sogetopt)(struct socket *, int, int, struct mbuf **,
  130.                struct kextcb *);
  131.     int (*sf_sohasoutofband)(struct socket *, struct kextcb *);
  132.     int (*sf_solisten)(struct socket *, struct kextcb *);
  133.     int (*sf_soreceive)(struct socket *, struct sockaddr **, struct uio **,
  134.                 struct mbuf **, struct mbuf **, int *,
  135.                 struct kextcb *);
  136.     int (*sf_sorflush)(struct socket *, struct kextcb *);
  137.     int (*sf_sosend)(struct socket *, struct sockaddr **, struct uio **,
  138.              struct mbuf **, struct mbuf **, int *,
  139.              struct kextcb *);
  140.     int (*sf_sosetopt)(struct socket *, int, int, struct mbuf *,
  141.                struct kextcb *);
  142.     int (*sf_soshutdown)(struct socket *, int, struct kextcb *);
  143.     /* Calls sorwakeup() */
  144.     int (*sf_socantrcvmore)(struct socket *, struct kextcb *);
  145.     /* Calls sowwakeup() */
  146.     int (*sf_socantsendmore)(struct socket *, struct kextcb *);
  147.     /* Calls soqinsque(), sorwakeup(), sowwakeup() */
  148.     int (*sf_soisconnected)(struct socket *, struct kextcb *);
  149.     int (*sf_soisconnecting)(struct socket *, struct kextcb *);
  150.     /* Calls sowwakeup(), sorwakeup() */
  151.     int (*sf_soisdisconnected)(struct socket *, struct kextcb *);
  152.     /* Calls sowwakeup(), sorwakeup() */
  153.     int (*sf_soisdisconnecting)(struct socket *, struct kextcb *);
  154.     /* Calls soreserve(), soqinsque(), soqremque(), sorwakeup() */
  155.     struct socket *(*sf_sonewconn1)(struct socket *, int, struct kextcb *);
  156.     int (*sf_soqinsque)(struct socket *, struct socket *, int,
  157.                  struct kextcb *);
  158.     int (*sf_soqremque)(struct socket *, int, struct kextcb *);
  159.     int (*sf_soreserve)(struct socket *, u_long, u_long, struct kextcb *);
  160.     int (*sf_sowakeup)(struct socket *, struct sockbuf *,
  161.                 struct kextcb *);
  162.     u_long    reserved[4];
  163. };
  164.  
  165.  
  166. /*
  167.  * sockutil:
  168.  * Contains the utility functions for socket layer access
  169.  */
  170. struct sockutil
  171. {    /* Sleeps if locked */
  172.     int (*su_sb_lock)(struct sockbuf *, struct kextcb *);
  173.     /* Conditionally calls sbappendrecord, Calls sbcompress */
  174.     int (*su_sbappend)(struct sockbuf *, struct mbuf *, struct kextcb *);
  175.     /* Calls sbspace(), sballoc() */
  176.     int (*su_sbappendaddr)(struct sockbuf *, struct sockaddr *,
  177.                    struct mbuf *, struct mbuf *, struct kextcb *);
  178.     /* Calls sbspace(), sballoc() */
  179.     int (*su_sbappendcontrol)(struct sockbuf *, struct mbuf *,
  180.                   struct mbuf *, struct kextcb *);
  181.     /* Calls sballoc(), sbcompress() */
  182.     int (*su_sbappendrecord)(struct sockbuf *, struct mbuf *,
  183.                   struct kextcb *);
  184.     /* Calls sballoc() */
  185.     int (*su_sbcompress)(struct sockbuf *, struct mbuf *, struct mbuf *,
  186.                   struct kextcb *);
  187.     /* Calls sbfree() */
  188.     int (*su_sbdrop)(struct sockbuf *, int, struct kextcb *);
  189.     /* Calls sbfree() */
  190.     int (*su_sbdroprecord)(struct sockbuf *, struct kextcb *);
  191.     /* Calls sbdrop() */
  192.     int (*su_sbflush)(struct sockbuf *, struct kextcb *);
  193.     /* Calls sballoc(), sbcompress() */
  194.     int (*su_sbinsertoob)(struct sockbuf *, struct mbuf *,
  195.                    struct kextcb *);
  196.     /* Calls sbflush() */
  197.     int (*su_sbrelease)(struct sockbuf *, struct kextcb *);
  198.     int (*su_sbreserve)(struct sockbuf *, u_long, struct kextcb *);
  199.     /* Calls tsleep() */
  200.     int (*su_sbwait)(struct sockbuf *, struct kextcb *);
  201.     u_long    reserved[4];
  202. };
  203.  
  204. #endif
  205.