The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/netpfil/ipfw/ip_fw_table.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 2002-2009 Luigi Rizzo, Universita` di Pisa
    3  *
    4  * Redistribution and use in source and binary forms, with or without
    5  * modification, are permitted provided that the following conditions
    6  * are met:
    7  * 1. Redistributions of source code must retain the above copyright
    8  *    notice, this list of conditions and the following disclaimer.
    9  * 2. Redistributions in binary form must reproduce the above copyright
   10  *    notice, this list of conditions and the following disclaimer in the
   11  *    documentation and/or other materials provided with the distribution.
   12  *
   13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   14  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   16  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   17  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   18  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   19  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   20  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   21  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   22  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   23  * SUCH DAMAGE.
   24  *
   25  * $FreeBSD$
   26  */
   27 
   28 #ifndef _IPFW2_TABLE_H
   29 #define _IPFW2_TABLE_H
   30 
   31 /*
   32  * Internal constants and data structures used by ipfw tables
   33  * not meant to be exported outside the kernel.
   34  */
   35 #ifdef _KERNEL
   36 
   37 struct table_algo;
   38 struct tables_config {
   39         struct namedobj_instance        *namehash;
   40         struct namedobj_instance        *valhash;
   41         uint32_t                        val_size;
   42         uint32_t                        algo_count;
   43         struct table_algo               *algo[256];
   44         struct table_algo               *def_algo[IPFW_TABLE_MAXTYPE + 1];
   45         TAILQ_HEAD(op_state_l,op_state) state_list;
   46 };
   47 #define CHAIN_TO_TCFG(chain)    ((struct tables_config *)(chain)->tblcfg)
   48 
   49 struct table_info {
   50         table_lookup_t  *lookup;        /* Lookup function */
   51         void            *state;         /* Lookup radix/other structure */
   52         void            *xstate;        /* eXtended state */
   53         u_long          data;           /* Hints for given func */
   54 };
   55 
   56 struct table_value;
   57 struct tentry_info {
   58         void            *paddr;
   59         struct table_value      *pvalue;
   60         void            *ptv;           /* Temporary field to hold obj  */              
   61         uint8_t         masklen;        /* mask length                  */
   62         uint8_t         subtype;
   63         uint16_t        flags;          /* record flags                 */
   64         uint32_t        value;          /* value index                  */
   65 };
   66 #define TEI_FLAGS_UPDATE        0x0001  /* Add or update rec if exists  */
   67 #define TEI_FLAGS_UPDATED       0x0002  /* Entry has been updated       */
   68 #define TEI_FLAGS_COMPAT        0x0004  /* Called from old ABI          */
   69 #define TEI_FLAGS_DONTADD       0x0008  /* Do not create new rec        */
   70 #define TEI_FLAGS_ADDED         0x0010  /* Entry was added              */
   71 #define TEI_FLAGS_DELETED       0x0020  /* Entry was deleted            */
   72 #define TEI_FLAGS_LIMIT         0x0040  /* Limit was hit                */
   73 #define TEI_FLAGS_ERROR         0x0080  /* Unknown request error        */
   74 #define TEI_FLAGS_NOTFOUND      0x0100  /* Entry was not found          */
   75 #define TEI_FLAGS_EXISTS        0x0200  /* Entry already exists         */
   76 
   77 typedef int (ta_init)(struct ip_fw_chain *ch, void **ta_state,
   78     struct table_info *ti, char *data, uint8_t tflags);
   79 typedef void (ta_destroy)(void *ta_state, struct table_info *ti);
   80 typedef int (ta_prepare_add)(struct ip_fw_chain *ch, struct tentry_info *tei,
   81     void *ta_buf);
   82 typedef int (ta_prepare_del)(struct ip_fw_chain *ch, struct tentry_info *tei,
   83     void *ta_buf);
   84 typedef int (ta_add)(void *ta_state, struct table_info *ti,
   85     struct tentry_info *tei, void *ta_buf, uint32_t *pnum);
   86 typedef int (ta_del)(void *ta_state, struct table_info *ti,
   87     struct tentry_info *tei, void *ta_buf, uint32_t *pnum);
   88 typedef void (ta_flush_entry)(struct ip_fw_chain *ch, struct tentry_info *tei,
   89     void *ta_buf);
   90 
   91 typedef int (ta_need_modify)(void *ta_state, struct table_info *ti,
   92     uint32_t count, uint64_t *pflags);
   93 typedef int (ta_prepare_mod)(void *ta_buf, uint64_t *pflags);
   94 typedef int (ta_fill_mod)(void *ta_state, struct table_info *ti,
   95     void *ta_buf, uint64_t *pflags);
   96 typedef void (ta_modify)(void *ta_state, struct table_info *ti,
   97     void *ta_buf, uint64_t pflags);
   98 typedef void (ta_flush_mod)(void *ta_buf);
   99 
  100 typedef void (ta_change_ti)(void *ta_state, struct table_info *ti);
  101 typedef void (ta_print_config)(void *ta_state, struct table_info *ti, char *buf,
  102     size_t bufsize);
  103 
  104 typedef int ta_foreach_f(void *node, void *arg);
  105 typedef void ta_foreach(void *ta_state, struct table_info *ti, ta_foreach_f *f,
  106   void *arg);
  107 typedef int ta_dump_tentry(void *ta_state, struct table_info *ti, void *e,
  108     ipfw_obj_tentry *tent);
  109 typedef int ta_find_tentry(void *ta_state, struct table_info *ti,
  110     ipfw_obj_tentry *tent);
  111 typedef void ta_dump_tinfo(void *ta_state, struct table_info *ti, 
  112     ipfw_ta_tinfo *tinfo);
  113 typedef uint32_t ta_get_count(void *ta_state, struct table_info *ti);
  114 
  115 struct table_algo {
  116         char            name[16];
  117         uint32_t        idx;
  118         uint32_t        type;
  119         uint32_t        refcnt;
  120         uint32_t        flags;
  121         uint32_t        vlimit;
  122         size_t          ta_buf_size;
  123         ta_init         *init;
  124         ta_destroy      *destroy;
  125         ta_prepare_add  *prepare_add;
  126         ta_prepare_del  *prepare_del;
  127         ta_add          *add;
  128         ta_del          *del;
  129         ta_flush_entry  *flush_entry;
  130         ta_find_tentry  *find_tentry;
  131         ta_need_modify  *need_modify;
  132         ta_prepare_mod  *prepare_mod;
  133         ta_fill_mod     *fill_mod;
  134         ta_modify       *modify;
  135         ta_flush_mod    *flush_mod;
  136         ta_change_ti    *change_ti;
  137         ta_foreach      *foreach;
  138         ta_dump_tentry  *dump_tentry;
  139         ta_print_config *print_config;
  140         ta_dump_tinfo   *dump_tinfo;
  141         ta_get_count    *get_count;
  142 };
  143 #define TA_FLAG_DEFAULT         0x01    /* Algo is default for given type */
  144 #define TA_FLAG_READONLY        0x02    /* Algo does not support modifications*/
  145 #define TA_FLAG_EXTCOUNTER      0x04    /* Algo has external counter available*/
  146 
  147 int ipfw_add_table_algo(struct ip_fw_chain *ch, struct table_algo *ta,
  148     size_t size, int *idx);
  149 void ipfw_del_table_algo(struct ip_fw_chain *ch, int idx);
  150 
  151 void ipfw_table_algo_init(struct ip_fw_chain *chain);
  152 void ipfw_table_algo_destroy(struct ip_fw_chain *chain);
  153 
  154 MALLOC_DECLARE(M_IPFW_TBL);
  155 /* Exported to support legacy opcodes */
  156 int add_table_entry(struct ip_fw_chain *ch, struct tid_info *ti,
  157     struct tentry_info *tei, uint8_t flags, uint32_t count);
  158 int del_table_entry(struct ip_fw_chain *ch, struct tid_info *ti,
  159     struct tentry_info *tei, uint8_t flags, uint32_t count);
  160 int flush_table(struct ip_fw_chain *ch, struct tid_info *ti);
  161 void ipfw_import_table_value_legacy(uint32_t value, struct table_value *v);
  162 uint32_t ipfw_export_table_value_legacy(struct table_value *v);
  163 int ipfw_get_table_size(struct ip_fw_chain *ch, ip_fw3_opheader *op3,
  164     struct sockopt_data *sd);
  165 
  166 /* ipfw_table_value.c functions */
  167 struct table_config;
  168 struct tableop_state;
  169 void ipfw_table_value_init(struct ip_fw_chain *ch, int first);
  170 void ipfw_table_value_destroy(struct ip_fw_chain *ch, int last);
  171 int ipfw_link_table_values(struct ip_fw_chain *ch, struct tableop_state *ts,
  172     uint8_t flags);
  173 void ipfw_garbage_table_values(struct ip_fw_chain *ch, struct table_config *tc,
  174     struct tentry_info *tei, uint32_t count, int rollback);
  175 void ipfw_import_table_value_v1(ipfw_table_value *iv);
  176 void ipfw_export_table_value_v1(struct table_value *v, ipfw_table_value *iv);
  177 void ipfw_unref_table_values(struct ip_fw_chain *ch, struct table_config *tc,
  178     struct table_algo *ta, void *astate, struct table_info *ti);
  179 void rollback_table_values(struct tableop_state *ts);
  180 
  181 int ipfw_rewrite_table_uidx(struct ip_fw_chain *chain,
  182     struct rule_check_info *ci);
  183 int ipfw_mark_table_kidx(struct ip_fw_chain *chain, struct ip_fw *rule,
  184     uint32_t *bmask);
  185 int ipfw_export_table_ntlv(struct ip_fw_chain *ch, uint16_t kidx,
  186     struct sockopt_data *sd);
  187 void ipfw_unref_rule_tables(struct ip_fw_chain *chain, struct ip_fw *rule);
  188 struct namedobj_instance *ipfw_get_table_objhash(struct ip_fw_chain *ch);
  189 
  190 /* utility functions  */
  191 int ipfw_move_tables_sets(struct ip_fw_chain *ch, ipfw_range_tlv *rt,
  192     uint32_t new_set);
  193 void ipfw_swap_tables_sets(struct ip_fw_chain *ch, uint32_t old_set,
  194     uint32_t new_set, int mv);
  195 int ipfw_foreach_table_tentry(struct ip_fw_chain *ch, uint16_t kidx,
  196     ta_foreach_f f, void *arg);
  197 
  198 /* internal functions */
  199 void tc_ref(struct table_config *tc);
  200 void tc_unref(struct table_config *tc);
  201 
  202 struct op_state;
  203 typedef void (op_rollback_f)(void *object, struct op_state *state);
  204 struct op_state {
  205         TAILQ_ENTRY(op_state)   next;   /* chain link */
  206         op_rollback_f           *func;
  207 };
  208 
  209 struct tableop_state {
  210         struct op_state opstate;
  211         struct ip_fw_chain *ch;
  212         struct table_config *tc;
  213         struct table_algo *ta;
  214         struct tentry_info *tei;
  215         uint32_t count;
  216         uint32_t vmask;
  217         int vshared;
  218         int modified;
  219 };
  220 
  221 void add_toperation_state(struct ip_fw_chain *ch, struct tableop_state *ts);
  222 void del_toperation_state(struct ip_fw_chain *ch, struct tableop_state *ts);
  223 void rollback_toperation_state(struct ip_fw_chain *ch, void *object);
  224 
  225 /* Legacy interfaces */
  226 int ipfw_count_table(struct ip_fw_chain *ch, struct tid_info *ti,
  227     uint32_t *cnt);
  228 int ipfw_count_xtable(struct ip_fw_chain *ch, struct tid_info *ti,
  229     uint32_t *cnt);
  230 int ipfw_dump_table_legacy(struct ip_fw_chain *ch, struct tid_info *ti,
  231     ipfw_table *tbl);
  232 
  233 #endif /* _KERNEL */
  234 #endif /* _IPFW2_TABLE_H */

Cache object: fce864a2169e262ff0611246f260e1a3


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.