2014-06-14 11:13:02 +00:00
|
|
|
/*-
|
|
|
|
* Copyright (c) 2002-2009 Luigi Rizzo, Universita` di Pisa
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
|
|
|
*
|
|
|
|
* $FreeBSD: projects/ipfw/sys/netpfil/ipfw/ip_fw_private.h 267467 2014-06-14 10:58:39Z melifaro $
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _IPFW2_TABLE_H
|
|
|
|
#define _IPFW2_TABLE_H
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Internal constants and data structures used by ipfw tables
|
|
|
|
* and not meant to be exported outside the kernel.
|
|
|
|
*/
|
|
|
|
#ifdef _KERNEL
|
|
|
|
|
|
|
|
struct table_info {
|
|
|
|
table_lookup_t *lookup; /* Lookup function */
|
|
|
|
void *state; /* Lookup radix/other structure */
|
|
|
|
void *xstate; /* eXtended state */
|
|
|
|
u_long data; /* Hints for given func */
|
|
|
|
};
|
|
|
|
|
2014-07-03 22:25:59 +00:00
|
|
|
/* Internal structures for handling sockopt data */
|
|
|
|
struct tid_info {
|
|
|
|
uint32_t set; /* table set */
|
|
|
|
uint16_t uidx; /* table index */
|
|
|
|
uint8_t type; /* table type */
|
|
|
|
uint8_t atype;
|
|
|
|
void *tlvs; /* Pointer to first TLV */
|
|
|
|
int tlen; /* Total TLV size block */
|
|
|
|
};
|
|
|
|
|
2014-06-15 13:40:27 +00:00
|
|
|
struct tentry_info {
|
|
|
|
void *paddr;
|
|
|
|
uint8_t masklen; /* mask length */
|
2014-07-03 22:25:59 +00:00
|
|
|
uint8_t subtype;
|
2014-06-15 13:40:27 +00:00
|
|
|
uint16_t flags; /* record flags */
|
|
|
|
uint32_t value; /* value */
|
|
|
|
};
|
2014-07-03 22:25:59 +00:00
|
|
|
#define TEI_FLAGS_UPDATE 0x01 /* Update record if exists */
|
|
|
|
#define TEI_FLAGS_UPDATED 0x02 /* Entry has been updated */
|
2014-07-26 13:37:25 +00:00
|
|
|
#define TEI_FLAGS_COMPAT 0x04 /* Called from old ABI */
|
2014-06-15 13:40:27 +00:00
|
|
|
|
2014-06-16 13:05:07 +00:00
|
|
|
typedef int (ta_init)(void **ta_state, struct table_info *ti, char *data);
|
2014-06-14 11:13:02 +00:00
|
|
|
typedef void (ta_destroy)(void *ta_state, struct table_info *ti);
|
|
|
|
typedef int (ta_prepare_add)(struct tentry_info *tei, void *ta_buf);
|
|
|
|
typedef int (ta_prepare_del)(struct tentry_info *tei, void *ta_buf);
|
|
|
|
typedef int (ta_add)(void *ta_state, struct table_info *ti,
|
2014-07-26 13:37:25 +00:00
|
|
|
struct tentry_info *tei, void *ta_buf, uint64_t *pflags);
|
2014-06-14 11:13:02 +00:00
|
|
|
typedef int (ta_del)(void *ta_state, struct table_info *ti,
|
2014-07-26 13:37:25 +00:00
|
|
|
struct tentry_info *tei, void *ta_buf, uint64_t *pflags);
|
2014-06-14 11:13:02 +00:00
|
|
|
typedef void (ta_flush_entry)(struct tentry_info *tei, void *ta_buf);
|
2014-07-26 13:37:25 +00:00
|
|
|
|
|
|
|
typedef int (ta_prepare_mod)(void *ta_buf, uint64_t *pflags);
|
|
|
|
typedef int (ta_fill_mod)(void *ta_state, struct table_info *ti,
|
|
|
|
void *ta_buf, uint64_t *pflags);
|
|
|
|
typedef int (ta_modify)(void *ta_state, struct table_info *ti,
|
|
|
|
void *ta_buf, uint64_t pflags);
|
|
|
|
typedef void (ta_flush_mod)(void *ta_buf);
|
|
|
|
|
2014-07-03 22:25:59 +00:00
|
|
|
typedef void (ta_print_config)(void *ta_state, struct table_info *ti, char *buf,
|
|
|
|
size_t bufsize);
|
2014-06-14 11:13:02 +00:00
|
|
|
|
|
|
|
typedef int ta_foreach_f(void *node, void *arg);
|
|
|
|
typedef void ta_foreach(void *ta_state, struct table_info *ti, ta_foreach_f *f,
|
|
|
|
void *arg);
|
2014-07-06 18:16:04 +00:00
|
|
|
typedef int ta_dump_tentry(void *ta_state, struct table_info *ti, void *e,
|
|
|
|
ipfw_obj_tentry *tent);
|
|
|
|
typedef int ta_find_tentry(void *ta_state, struct table_info *ti, void *key,
|
|
|
|
uint32_t keylen, ipfw_obj_tentry *tent);
|
2014-06-14 11:13:02 +00:00
|
|
|
|
|
|
|
struct table_algo {
|
2014-06-16 13:05:07 +00:00
|
|
|
char name[16];
|
2014-06-14 11:13:02 +00:00
|
|
|
int idx;
|
|
|
|
ta_init *init;
|
|
|
|
ta_destroy *destroy;
|
|
|
|
table_lookup_t *lookup;
|
|
|
|
ta_prepare_add *prepare_add;
|
|
|
|
ta_prepare_del *prepare_del;
|
|
|
|
ta_add *add;
|
|
|
|
ta_del *del;
|
|
|
|
ta_flush_entry *flush_entry;
|
2014-07-26 13:37:25 +00:00
|
|
|
ta_prepare_mod *prepare_mod;
|
|
|
|
ta_fill_mod *fill_mod;
|
|
|
|
ta_modify *modify;
|
|
|
|
ta_flush_mod *flush_mod;
|
2014-06-14 11:13:02 +00:00
|
|
|
ta_foreach *foreach;
|
2014-07-06 18:16:04 +00:00
|
|
|
ta_dump_tentry *dump_tentry;
|
2014-07-03 22:25:59 +00:00
|
|
|
ta_print_config *print_config;
|
2014-07-06 18:16:04 +00:00
|
|
|
ta_find_tentry *find_tentry;
|
2014-06-14 11:13:02 +00:00
|
|
|
};
|
|
|
|
void ipfw_add_table_algo(struct ip_fw_chain *ch, struct table_algo *ta);
|
|
|
|
extern struct table_algo radix_cidr, radix_iface;
|
|
|
|
|
2014-06-15 13:40:27 +00:00
|
|
|
void ipfw_table_algo_init(struct ip_fw_chain *chain);
|
|
|
|
void ipfw_table_algo_destroy(struct ip_fw_chain *chain);
|
|
|
|
|
|
|
|
|
2014-06-14 22:47:25 +00:00
|
|
|
/* direct ipfw_ctl handlers */
|
2014-06-27 10:07:00 +00:00
|
|
|
int ipfw_listsize_tables(struct ip_fw_chain *ch, struct sockopt_data *sd);
|
|
|
|
int ipfw_list_tables(struct ip_fw_chain *ch, struct sockopt_data *sd);
|
|
|
|
int ipfw_dump_table(struct ip_fw_chain *ch, ip_fw3_opheader *op3,
|
|
|
|
struct sockopt_data *sd);
|
|
|
|
int ipfw_describe_table(struct ip_fw_chain *ch, struct sockopt_data *sd);
|
2014-06-14 22:47:25 +00:00
|
|
|
|
2014-07-06 18:16:04 +00:00
|
|
|
int ipfw_find_table_entry(struct ip_fw_chain *ch, ip_fw3_opheader *op3,
|
|
|
|
struct sockopt_data *sd);
|
2014-07-03 22:25:59 +00:00
|
|
|
int ipfw_create_table(struct ip_fw_chain *ch, ip_fw3_opheader *op3,
|
|
|
|
struct sockopt_data *sd);
|
2014-07-26 13:37:25 +00:00
|
|
|
int ipfw_manage_table_ent(struct ip_fw_chain *ch, ip_fw3_opheader *op3,
|
2014-07-03 22:25:59 +00:00
|
|
|
struct sockopt_data *sd);
|
2014-07-08 23:11:15 +00:00
|
|
|
int ipfw_flush_table(struct ip_fw_chain *ch, ip_fw3_opheader *op3,
|
|
|
|
struct sockopt_data *sd);
|
2014-07-04 07:02:11 +00:00
|
|
|
/* Exported to support legacy opcodes */
|
|
|
|
int add_table_entry(struct ip_fw_chain *ch, struct tid_info *ti,
|
2014-06-14 11:13:02 +00:00
|
|
|
struct tentry_info *tei);
|
2014-07-04 07:02:11 +00:00
|
|
|
int del_table_entry(struct ip_fw_chain *ch, struct tid_info *ti,
|
2014-06-14 11:13:02 +00:00
|
|
|
struct tentry_info *tei);
|
2014-07-04 07:02:11 +00:00
|
|
|
int flush_table(struct ip_fw_chain *ch, struct tid_info *ti);
|
2014-07-03 22:25:59 +00:00
|
|
|
|
2014-06-15 13:40:27 +00:00
|
|
|
int ipfw_rewrite_table_uidx(struct ip_fw_chain *chain,
|
|
|
|
struct rule_check_info *ci);
|
2014-07-08 23:11:15 +00:00
|
|
|
int ipfw_rewrite_table_kidx(struct ip_fw_chain *chain,
|
|
|
|
struct ip_fw_rule0 *rule);
|
2014-06-28 23:20:24 +00:00
|
|
|
int ipfw_mark_table_kidx(struct ip_fw_chain *chain, struct ip_fw *rule,
|
|
|
|
uint32_t *bmask);
|
|
|
|
int ipfw_export_table_ntlv(struct ip_fw_chain *ch, uint16_t kidx,
|
|
|
|
struct sockopt_data *sd);
|
2014-06-15 13:40:27 +00:00
|
|
|
void ipfw_unbind_table_rule(struct ip_fw_chain *chain, struct ip_fw *rule);
|
|
|
|
void ipfw_unbind_table_list(struct ip_fw_chain *chain, struct ip_fw *head);
|
|
|
|
|
|
|
|
/* utility functions */
|
|
|
|
void objheader_to_ti(struct _ipfw_obj_header *oh, struct tid_info *ti);
|
2014-07-03 22:25:59 +00:00
|
|
|
int ipfw_check_table_name(char *name);
|
2014-06-15 13:40:27 +00:00
|
|
|
|
|
|
|
/* Legacy interfaces */
|
2014-06-14 11:13:02 +00:00
|
|
|
int ipfw_count_table(struct ip_fw_chain *ch, struct tid_info *ti,
|
|
|
|
uint32_t *cnt);
|
|
|
|
int ipfw_count_xtable(struct ip_fw_chain *ch, struct tid_info *ti,
|
|
|
|
uint32_t *cnt);
|
2014-06-14 22:47:25 +00:00
|
|
|
int ipfw_dump_table_legacy(struct ip_fw_chain *ch, struct tid_info *ti,
|
2014-06-14 11:13:02 +00:00
|
|
|
ipfw_table *tbl);
|
|
|
|
|
|
|
|
|
|
|
|
#endif /* _KERNEL */
|
|
|
|
#endif /* _IPFW2_TABLE_H */
|