1be4f3cd0SPaolo Pisati /*- 24d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 3fe267a55SPedro F. Giffuni * 4be4f3cd0SPaolo Pisati * Copyright (c) 2005 Paolo Pisati <piso@FreeBSD.org> 5be4f3cd0SPaolo Pisati * All rights reserved. 6be4f3cd0SPaolo Pisati * 7be4f3cd0SPaolo Pisati * Redistribution and use in source and binary forms, with or without 8be4f3cd0SPaolo Pisati * modification, are permitted provided that the following conditions 9be4f3cd0SPaolo Pisati * are met: 10be4f3cd0SPaolo Pisati * 1. Redistributions of source code must retain the above copyright 11be4f3cd0SPaolo Pisati * notice, this list of conditions and the following disclaimer. 12be4f3cd0SPaolo Pisati * 2. Redistributions in binary form must reproduce the above copyright 13be4f3cd0SPaolo Pisati * notice, this list of conditions and the following disclaimer in the 14be4f3cd0SPaolo Pisati * documentation and/or other materials provided with the distribution. 15be4f3cd0SPaolo Pisati * 16be4f3cd0SPaolo Pisati * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17be4f3cd0SPaolo Pisati * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18be4f3cd0SPaolo Pisati * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19be4f3cd0SPaolo Pisati * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20be4f3cd0SPaolo Pisati * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21be4f3cd0SPaolo Pisati * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22be4f3cd0SPaolo Pisati * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23be4f3cd0SPaolo Pisati * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24be4f3cd0SPaolo Pisati * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25be4f3cd0SPaolo Pisati * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26be4f3cd0SPaolo Pisati * SUCH DAMAGE. 27be4f3cd0SPaolo Pisati */ 28be4f3cd0SPaolo Pisati 29be4f3cd0SPaolo Pisati /* 30be4f3cd0SPaolo Pisati * Alias_mod.h defines the outside world interfaces for the packet aliasing 31be4f3cd0SPaolo Pisati * modular framework 32be4f3cd0SPaolo Pisati */ 33be4f3cd0SPaolo Pisati 34be4f3cd0SPaolo Pisati #ifndef _ALIAS_MOD_H_ 35be4f3cd0SPaolo Pisati #define _ALIAS_MOD_H_ 36be4f3cd0SPaolo Pisati 37be4f3cd0SPaolo Pisati #ifdef _KERNEL 38be4f3cd0SPaolo Pisati MALLOC_DECLARE(M_ALIAS); 39be4f3cd0SPaolo Pisati 40be4f3cd0SPaolo Pisati /* Use kernel allocator. */ 41be4f3cd0SPaolo Pisati #if defined(_SYS_MALLOC_H_) 4234c538c3SMateusz Guzik #undef malloc 43be4f3cd0SPaolo Pisati #define malloc(x) malloc(x, M_ALIAS, M_NOWAIT|M_ZERO) 4484f21095SPedro F. Giffuni #define calloc(n, x) mallocarray((n), (x), M_ALIAS, M_NOWAIT|M_ZERO) 45be4f3cd0SPaolo Pisati #define free(x) free(x, M_ALIAS) 46be4f3cd0SPaolo Pisati #endif 47be4f3cd0SPaolo Pisati #endif 48be4f3cd0SPaolo Pisati 49535e0a09SGleb Smirnoff /* Packet flow direction flags. */ 50535e0a09SGleb Smirnoff #define IN 0x0001 51535e0a09SGleb Smirnoff #define OUT 0x0002 52535e0a09SGleb Smirnoff #define NODIR 0x4000 53be4f3cd0SPaolo Pisati 54535e0a09SGleb Smirnoff /* Working protocol flags. */ 55535e0a09SGleb Smirnoff #define IP 0x01 56535e0a09SGleb Smirnoff #define TCP 0x02 57535e0a09SGleb Smirnoff #define UDP 0x04 58be4f3cd0SPaolo Pisati 59be4f3cd0SPaolo Pisati /* 60be4f3cd0SPaolo Pisati * Data passed to protocol handler module, it must be filled 61be4f3cd0SPaolo Pisati * right before calling find_handler() to determine which 62be4f3cd0SPaolo Pisati * module is elegible to be called. 63be4f3cd0SPaolo Pisati */ 64be4f3cd0SPaolo Pisati struct alias_data { 65be4f3cd0SPaolo Pisati struct alias_link *lnk; 66be4f3cd0SPaolo Pisati struct in_addr *oaddr; /* Original address. */ 67be4f3cd0SPaolo Pisati struct in_addr *aaddr; /* Alias address. */ 68be4f3cd0SPaolo Pisati uint16_t *aport; /* Alias port. */ 69be4f3cd0SPaolo Pisati uint16_t *sport, *dport; /* Source & destination port */ 70be4f3cd0SPaolo Pisati uint16_t maxpktsize; /* Max packet size. */ 71be4f3cd0SPaolo Pisati }; 72be4f3cd0SPaolo Pisati 73be4f3cd0SPaolo Pisati /* 74be4f3cd0SPaolo Pisati * This structure contains all the information necessary to make 75be4f3cd0SPaolo Pisati * a protocol handler correctly work. 76be4f3cd0SPaolo Pisati */ 77be4f3cd0SPaolo Pisati struct proto_handler { 78be4f3cd0SPaolo Pisati u_int pri; /* Handler priority. */ 79be4f3cd0SPaolo Pisati int16_t dir; /* Flow direction. */ 80be4f3cd0SPaolo Pisati uint8_t proto; /* Working protocol. */ 8122d3fb19SGleb Smirnoff /* Fingerprint * function. */ 8222d3fb19SGleb Smirnoff int (*fingerprint)(struct libalias *, struct alias_data *); 8322d3fb19SGleb Smirnoff /* Aliasing * function. */ 8422d3fb19SGleb Smirnoff int (*protohandler)(struct libalias *, struct ip *, 8543197d29SPaolo Pisati struct alias_data *); 86535e0a09SGleb Smirnoff TAILQ_ENTRY(proto_handler) link; 87535e0a09SGleb Smirnoff }; 88535e0a09SGleb Smirnoff 891019f603SGleb Smirnoff /* End of handlers. */ 90535e0a09SGleb Smirnoff #define EOH .dir = NODIR 91be4f3cd0SPaolo Pisati 921019f603SGleb Smirnoff /* Functions used with protocol handlers. */ 931019f603SGleb Smirnoff int LibAliasAttachHandlers(struct proto_handler *); 941019f603SGleb Smirnoff int LibAliasDetachHandlers(struct proto_handler *); 951019f603SGleb Smirnoff int find_handler(int8_t, int8_t, struct libalias *, struct ip *, 961019f603SGleb Smirnoff struct alias_data *); 971019f603SGleb Smirnoff struct proto_handler *first_handler(void); 981019f603SGleb Smirnoff 991019f603SGleb Smirnoff #ifndef _KERNEL 100be4f3cd0SPaolo Pisati /* 101be4f3cd0SPaolo Pisati * Used only in userland when libalias needs to keep track of all 102be4f3cd0SPaolo Pisati * module loaded. In kernel land (kld mode) we don't need to care 103be4f3cd0SPaolo Pisati * care about libalias modules cause it's kld to do it for us. 104be4f3cd0SPaolo Pisati */ 105be4f3cd0SPaolo Pisati #define DLL_LEN 32 106be4f3cd0SPaolo Pisati struct dll { 107be4f3cd0SPaolo Pisati char name[DLL_LEN]; /* Name of module. */ 108be4f3cd0SPaolo Pisati void *handle; /* 109be4f3cd0SPaolo Pisati * Ptr to shared obj obtained through 110be4f3cd0SPaolo Pisati * dlopen() - use this ptr to get access 111be4f3cd0SPaolo Pisati * to any symbols from a loaded module 112be4f3cd0SPaolo Pisati * via dlsym(). 113be4f3cd0SPaolo Pisati */ 114be4f3cd0SPaolo Pisati SLIST_ENTRY(dll) next; 115be4f3cd0SPaolo Pisati }; 116be4f3cd0SPaolo Pisati 117be4f3cd0SPaolo Pisati /* Functions used with dll module. */ 118be4f3cd0SPaolo Pisati void dll_chain_init(void); 119be4f3cd0SPaolo Pisati void dll_chain_destroy(void); 120be4f3cd0SPaolo Pisati int attach_dll(struct dll *); 121be4f3cd0SPaolo Pisati void *detach_dll(char *); 122be4f3cd0SPaolo Pisati struct dll *walk_dll_chain(void); 123be4f3cd0SPaolo Pisati 124be4f3cd0SPaolo Pisati /* 125be4f3cd0SPaolo Pisati * Some defines borrowed from sys/module.h used to compile a kld 126be4f3cd0SPaolo Pisati * in userland as a shared lib. 127be4f3cd0SPaolo Pisati */ 128be4f3cd0SPaolo Pisati typedef enum modeventtype { 129be4f3cd0SPaolo Pisati MOD_LOAD, 130be4f3cd0SPaolo Pisati MOD_UNLOAD, 131be4f3cd0SPaolo Pisati MOD_SHUTDOWN, 132be4f3cd0SPaolo Pisati MOD_QUIESCE 133be4f3cd0SPaolo Pisati } modeventtype_t; 134be4f3cd0SPaolo Pisati 135be4f3cd0SPaolo Pisati typedef struct module *module_t; 136be4f3cd0SPaolo Pisati typedef int (*modeventhand_t)(module_t, int /* modeventtype_t */, void *); 137be4f3cd0SPaolo Pisati 138be4f3cd0SPaolo Pisati /* 139be4f3cd0SPaolo Pisati * Struct for registering modules statically via SYSINIT. 140be4f3cd0SPaolo Pisati */ 141be4f3cd0SPaolo Pisati typedef struct moduledata { 142be4f3cd0SPaolo Pisati const char *name; /* module name */ 143be4f3cd0SPaolo Pisati modeventhand_t evhand; /* event handler */ 144be4f3cd0SPaolo Pisati void *priv; /* extra data */ 145be4f3cd0SPaolo Pisati } moduledata_t; 1461019f603SGleb Smirnoff #endif /* !_KERNEL */ 147be4f3cd0SPaolo Pisati 148be4f3cd0SPaolo Pisati #endif /* !_ALIAS_MOD_H_ */ 149