1/* 2 * Copyright (C) 2012 by Darren Reed. 3 * 4 * See the IPFILTER.LICENCE file for details on licencing. 5 * 6 * $Id$ 7 */ 8#ifndef __IP_LOOKUP_H__ 9#define __IP_LOOKUP_H__ 10 11# define SIOCLOOKUPADDTABLE _IOWR('r', 60, struct iplookupop) 12# define SIOCLOOKUPDELTABLE _IOWR('r', 61, struct iplookupop) 13# define SIOCLOOKUPSTAT _IOWR('r', 64, struct iplookupop) 14# define SIOCLOOKUPSTATW _IOW('r', 64, struct iplookupop) 15# define SIOCLOOKUPFLUSH _IOWR('r', 65, struct iplookupflush) 16# define SIOCLOOKUPADDNODE _IOWR('r', 67, struct iplookupop) 17# define SIOCLOOKUPADDNODEW _IOW('r', 67, struct iplookupop) 18# define SIOCLOOKUPDELNODE _IOWR('r', 68, struct iplookupop) 19# define SIOCLOOKUPDELNODEW _IOW('r', 68, struct iplookupop) 20 21#define LOOKUP_POOL_MAX (IPL_LOGSIZE) 22#define LOOKUP_POOL_SZ (IPL_LOGSIZE + 1) 23 24typedef struct iplookupop { 25 int iplo_type; /* IPLT_* */ 26 int iplo_unit; /* IPL_LOG* */ 27 u_int iplo_arg; 28 char iplo_name[FR_GROUPLEN]; 29 size_t iplo_size; /* sizeof struct at iplo_struct */ 30 void *iplo_struct; 31} iplookupop_t; 32 33#define LOOKUP_ANON 0x80000000 34 35 36typedef struct iplookupflush { 37 int iplf_type; /* IPLT_* */ 38 int iplf_unit; /* IPL_LOG* */ 39 u_int iplf_arg; 40 u_int iplf_count; 41 char iplf_name[FR_GROUPLEN]; 42} iplookupflush_t; 43 44typedef struct iplookuplink { 45 int ipll_type; /* IPLT_* */ 46 int ipll_unit; /* IPL_LOG* */ 47 u_int ipll_num; 48 char ipll_group[FR_GROUPLEN]; 49} iplookuplink_t; 50 51#define IPLT_ALL -1 52#define IPLT_NONE 0 53#define IPLT_POOL 1 54#define IPLT_HASH 2 55#define IPLT_DSTLIST 3 56 57 58#define IPLT_ANON 0x80000000 59 60 61typedef union { 62 struct iplookupiterkey { 63 u_char ilik_ival; 64 u_char ilik_type; /* IPLT_* */ 65 u_char ilik_otype; 66 signed char ilik_unit; /* IPL_LOG* */ 67 } ilik_unstr; 68 u_32_t ilik_key; 69} iplookupiterkey_t; 70 71typedef struct ipflookupiter { 72 int ili_nitems; 73 iplookupiterkey_t ili_lkey; 74 char ili_name[FR_GROUPLEN]; 75 void *ili_data; 76} ipflookupiter_t; 77 78#define ili_key ili_lkey.ilik_key 79#define ili_ival ili_lkey.ilik_unstr.ilik_ival 80#define ili_unit ili_lkey.ilik_unstr.ilik_unit 81#define ili_type ili_lkey.ilik_unstr.ilik_type 82#define ili_otype ili_lkey.ilik_unstr.ilik_otype 83 84#define IPFLOOKUPITER_LIST 0 85#define IPFLOOKUPITER_NODE 1 86 87 88typedef struct ipf_lookup { 89 int ipfl_type; 90 void *(*ipfl_create)(ipf_main_softc_t *); 91 void (*ipfl_destroy)(ipf_main_softc_t *, void *); 92 int (*ipfl_init)(ipf_main_softc_t *, void *); 93 void (*ipfl_fini)(ipf_main_softc_t *, void *); 94 int (*ipfl_addr_find)(ipf_main_softc_t *, void *, 95 int, void *, u_int); 96 size_t (*ipfl_flush)(ipf_main_softc_t *, void *, 97 iplookupflush_t *); 98 int (*ipfl_iter_deref)(ipf_main_softc_t *, void *, 99 int, int, void *); 100 int (*ipfl_iter_next)(ipf_main_softc_t *, void *, 101 ipftoken_t *, ipflookupiter_t *); 102 int (*ipfl_node_add)(ipf_main_softc_t *, void *, 103 iplookupop_t *, int); 104 int (*ipfl_node_del)(ipf_main_softc_t *, void *, 105 iplookupop_t *, int); 106 int (*ipfl_stats_get)(ipf_main_softc_t *, void *, 107 iplookupop_t *); 108 int (*ipfl_table_add)(ipf_main_softc_t *, void *, 109 iplookupop_t *); 110 int (*ipfl_table_del)(ipf_main_softc_t *, void *, 111 iplookupop_t *); 112 int (*ipfl_table_deref)(ipf_main_softc_t *, void *, void *); 113 void *(*ipfl_table_find)(void *, int, char *); 114 void *(*ipfl_select_add_ref)(void *, int, char *); 115 int (*ipfl_select_node)(fr_info_t *, void *, u_32_t *, 116 frdest_t *); 117 void (*ipfl_expire)(ipf_main_softc_t *, void *); 118 void (*ipfl_sync)(ipf_main_softc_t *, void *); 119} ipf_lookup_t; 120 121extern int ipf_lookup_init(void); 122extern int ipf_lookup_ioctl(ipf_main_softc_t *, caddr_t, ioctlcmd_t, int, int, void *); 123extern void ipf_lookup_main_unload(void); 124extern void ipf_lookup_deref(ipf_main_softc_t *, int, void *); 125extern void ipf_lookup_iterderef(ipf_main_softc_t *, u_32_t, void *); 126extern void *ipf_lookup_res_name(ipf_main_softc_t *, int, u_int, char *, 127 lookupfunc_t *); 128extern void *ipf_lookup_res_num(ipf_main_softc_t *, int, u_int, u_int, 129 lookupfunc_t *); 130extern void ipf_lookup_soft_destroy(ipf_main_softc_t *, void *); 131extern void *ipf_lookup_soft_create(ipf_main_softc_t *); 132extern int ipf_lookup_soft_init(ipf_main_softc_t *, void *); 133extern int ipf_lookup_soft_fini(ipf_main_softc_t *, void *); 134extern void *ipf_lookup_find_htable(ipf_main_softc_t *, int, char *); 135extern void ipf_lookup_expire(ipf_main_softc_t *); 136extern void ipf_lookup_sync(ipf_main_softc_t *, void *); 137#ifndef _KERNEL 138extern void ipf_lookup_dump(ipf_main_softc_t *, void *); 139#endif 140#endif /* __IP_LOOKUP_H__ */ 141