#ifndef _IPFW3_H_
#define _IPFW3_H_
#define SA_SIZE(sa) \
( (!(sa) || ((struct sockaddr *)(sa))->sa_len == 0) ? \
sizeof(long) : \
1 + ( (((struct sockaddr *)(sa))->sa_len - 1) | (sizeof(long) - 1) ) )
#define GETLOPORT(x) ((x) >> 0x10)
#define GETNUMPORTS(x) ((x) & 0x0000ffff)
#define GETHIPORT(x) (GETLOPORT((x)) + GETNUMPORTS((x)))
#define SETLOPORT(x, y) ((x) = ((x) & 0x0000ffff) | ((y) << 0x10))
#define SETNUMPORTS(x, y) ((x) = ((x) & 0xffff0000) | (y))
#define INC_ARGCV() do { \
(*_av)++; \
(*_ac)--; \
av = *_av; \
ac = *_ac; \
} while (0)
enum tokens {
TOK_NULL=0,
TOK_IP,
TOK_IF,
TOK_ALOG,
TOK_DENY_INC,
TOK_SAME_PORTS,
TOK_UNREG_ONLY,
TOK_RESET_ADDR,
TOK_ALIAS_REV,
TOK_PROXY_ONLY,
TOK_REDIR_ADDR,
TOK_REDIR_PORT,
TOK_REDIR_PROTO,
TOK_PIPE,
TOK_QUEUE,
TOK_PLR,
TOK_NOERROR,
TOK_BUCKETS,
TOK_DSTIP,
TOK_SRCIP,
TOK_DSTPORT,
TOK_SRCPORT,
TOK_ALL,
TOK_MASK,
TOK_BW,
TOK_DELAY,
TOK_RED,
TOK_GRED,
TOK_DROPTAIL,
TOK_PROTO,
TOK_WEIGHT,
};
struct char_int_map {
char *key;
int val;
};
typedef void (*parser_func)(ipfw_insn **,int *, char ***);
typedef void (*shower_func)(ipfw_insn *, int);
typedef void (*register_func)(int, int, parser_func, shower_func);
typedef void (*register_keyword)(int, int, char *, int);
typedef void (*init_module)(register_func, register_keyword);
#define MAX_KEYWORD_LEN 20
#define KEYWORD_SIZE 256
#define MAPPING_SIZE 256
struct ipfw3_keyword {
int type;
char word[MAX_KEYWORD_LEN];
int module;
int opcode;
};
#define LEN_FW3_KEYWORD sizeof(struct ipfw3_keyword)
struct ipfw3_mapping {
int type;
int module;
int opcode;
parser_func parser;
shower_func shower;
};
#define LEN_FW3_MAPPING sizeof(struct ipfw3_mapping)
ipfw_insn* next_cmd(ipfw_insn *cmd);
void register_ipfw_keyword(int module, int opcode, char *word, int type);
void register_ipfw_func(int, int, parser_func, shower_func);
int do_get_x(int optname, void *rule, int *optlen);
int do_set_x(int optname, void *rule, int optlen);
int match_token(struct char_int_map *table, char *string);
void module_get(char *modules_str, int len);
void module_list(int ac, char **av);
void module_load(void);
void register_ipfw_keyword(int module, int opcode, char *word, int type);
void register_ipfw_func(int module, int opcode,
parser_func parser, shower_func shower);
void prev_show_chk(ipfw_insn *cmd, uint8_t *prev_module,
uint8_t *prev_opcode, int *show_or);
int show_filter(ipfw_insn *cmd, char *word, int type);
void help(void);
void rule_delete(int ac, char **av);
void rule_list(int ac, char **av);
void rule_add(int ac, char **av, uint8_t insert);
void rule_zero(int ac, char **av);
void rule_flush(void);
void rule_show(struct ipfw_ioc_rule *rule, int pcwidth, int bcwidth);
int do_set_x(int optname, void *rule, int optlen);
int do_get_x(int optname, void *rule, int *optlen);
int ipfw3_main(int ac, char **av);
void ipfw3_readfile(int ac, char **av);
#endif