alias_local.h revision 165243
177701Sbrian/*- 285964Sbrian * Copyright (c) 2001 Charles Mott <cm@linktel.net> 377701Sbrian * All rights reserved. 477701Sbrian * 577701Sbrian * Redistribution and use in source and binary forms, with or without 677701Sbrian * modification, are permitted provided that the following conditions 777701Sbrian * are met: 877701Sbrian * 1. Redistributions of source code must retain the above copyright 977701Sbrian * notice, this list of conditions and the following disclaimer. 1077701Sbrian * 2. Redistributions in binary form must reproduce the above copyright 1177701Sbrian * notice, this list of conditions and the following disclaimer in the 1277701Sbrian * documentation and/or other materials provided with the distribution. 1377701Sbrian * 1477701Sbrian * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1577701Sbrian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1677701Sbrian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1777701Sbrian * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1877701Sbrian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1977701Sbrian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2077701Sbrian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2177701Sbrian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2277701Sbrian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2377701Sbrian * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2477701Sbrian * SUCH DAMAGE. 2577701Sbrian * 2677701Sbrian * $FreeBSD: head/sys/netinet/libalias/alias_local.h 165243 2006-12-15 12:50:06Z piso $ 2777701Sbrian */ 2877701Sbrian 2974778Sbrian/* 3074778Sbrian * Alias_local.h contains the function prototypes for alias.c, 3174778Sbrian * alias_db.c, alias_util.c and alias_ftp.c, alias_irc.c (as well 3274778Sbrian * as any future add-ons). It also includes macros, globals and 3374778Sbrian * struct definitions shared by more than one alias*.c file. 3474778Sbrian * 3574778Sbrian * This include file is intended to be used only within the aliasing 3674778Sbrian * software. Outside world interfaces are defined in alias.h 3774778Sbrian * 3874778Sbrian * This software is placed into the public domain with no restrictions 3974778Sbrian * on its distribution. 4074778Sbrian * 4199207Sbrian * Initial version: August, 1996 (cjm) 4274778Sbrian * 4374778Sbrian * <updated several times by original author and Eivind Eklund> 4474778Sbrian */ 4526026Sbrian 4674778Sbrian#ifndef _ALIAS_LOCAL_H_ 4774778Sbrian#define _ALIAS_LOCAL_H_ 4844307Sbrian 49162674Spiso#include <sys/types.h> 50162674Spiso#include <sys/sysctl.h> 51124621Sphk 52162674Spiso#ifdef _KERNEL 53162674Spiso#include <sys/malloc.h> 54165243Spiso#include <sys/param.h> 55162674Spiso#include <sys/lock.h> 56165243Spiso#include <sys/mutex.h> 57165243Spiso 58145927Sglebius/* XXX: LibAliasSetTarget() uses this constant. */ 59145927Sglebius#define INADDR_NONE 0xffffffff 60145927Sglebius#endif 61145927Sglebius 62124621Sphk/* Sizes of input and output link tables */ 63124621Sphk#define LINK_TABLE_OUT_SIZE 101 64124621Sphk#define LINK_TABLE_IN_SIZE 4001 65124621Sphk 66124621Sphkstruct proxy_entry; 67124621Sphk 68124621Sphkstruct libalias { 69127094Sdes LIST_ENTRY(libalias) instancelist; 70124621Sphk 71127094Sdes int packetAliasMode; /* Mode flags */ 72127094Sdes /* - documented in alias.h */ 73124621Sphk 74127094Sdes struct in_addr aliasAddress; /* Address written onto source */ 75127094Sdes /* field of IP packet. */ 76124621Sphk 77127094Sdes struct in_addr targetAddress; /* IP address incoming packets */ 78127094Sdes /* are sent to if no aliasing */ 79127094Sdes /* link already exists */ 80124621Sphk 81127094Sdes struct in_addr nullAddress; /* Used as a dummy parameter for */ 82127094Sdes /* some function calls */ 83124621Sphk 84127094Sdes LIST_HEAD (, alias_link) linkTableOut[LINK_TABLE_OUT_SIZE]; 85127094Sdes /* Lookup table of pointers to */ 86127094Sdes /* chains of link records. Each */ 87124621Sphk 88127094Sdes LIST_HEAD (, alias_link) linkTableIn[LINK_TABLE_IN_SIZE]; 89127094Sdes /* link record is doubly indexed */ 90127094Sdes /* into input and output lookup */ 91127094Sdes /* tables. */ 92124621Sphk 93127094Sdes /* Link statistics */ 94127094Sdes int icmpLinkCount; 95127094Sdes int udpLinkCount; 96127094Sdes int tcpLinkCount; 97127094Sdes int pptpLinkCount; 98127094Sdes int protoLinkCount; 99127094Sdes int fragmentIdLinkCount; 100127094Sdes int fragmentPtrLinkCount; 101127094Sdes int sockCount; 102124621Sphk 103127094Sdes int cleanupIndex; /* Index to chain of link table */ 104127094Sdes /* being inspected for old links */ 105124621Sphk 106127094Sdes int timeStamp; /* System time in seconds for */ 107127094Sdes /* current packet */ 108124621Sphk 109127094Sdes int lastCleanupTime; /* Last time 110127094Sdes * IncrementalCleanup() */ 111127094Sdes /* was called */ 112124621Sphk 113127094Sdes int houseKeepingResidual; /* used by HouseKeeping() */ 114124621Sphk 115127094Sdes int deleteAllLinks; /* If equal to zero, DeleteLink() */ 116127094Sdes /* will not remove permanent links */ 117162674Spiso 118162674Spiso /* log descriptor */ 119162674Spiso#ifdef _KERNEL 120162674Spiso char *logDesc; 121162674Spiso#else 122162674Spiso FILE *logDesc; 123145925Sglebius#endif 124162674Spiso /* statistics monitoring */ 125124621Sphk 126127094Sdes int newDefaultLink; /* Indicates if a new aliasing */ 127127094Sdes /* link has been created after a */ 128127094Sdes /* call to PacketAliasIn/Out(). */ 129124621Sphk 130124621Sphk#ifndef NO_FW_PUNCH 131127094Sdes int fireWallFD; /* File descriptor to be able to */ 132127094Sdes /* control firewall. Opened by */ 133127094Sdes /* PacketAliasSetMode on first */ 134127094Sdes /* setting the PKT_ALIAS_PUNCH_FW */ 135127094Sdes /* flag. */ 136127094Sdes int fireWallBaseNum; /* The first firewall entry 137127094Sdes * free for our use */ 138127094Sdes int fireWallNumNums; /* How many entries can we 139127094Sdes * use? */ 140127094Sdes int fireWallActiveNum; /* Which entry did we last 141127094Sdes * use? */ 142127094Sdes char *fireWallField; /* bool array for entries */ 143124621Sphk#endif 144124621Sphk 145127094Sdes unsigned int skinnyPort; /* TCP port used by the Skinny */ 146127094Sdes /* protocol. */ 147124621Sphk 148124621Sphk struct proxy_entry *proxyList; 149124621Sphk 150127094Sdes struct in_addr true_addr; /* in network byte order. */ 151127094Sdes u_short true_port; /* in host byte order. */ 152165243Spiso#ifdef _KERNEL 153165243Spiso /* 154165243Spiso * avoid races in libalias: every public function has to use it. 155165243Spiso */ 156165243Spiso struct mtx mutex; 157165243Spiso#endif 158124621Sphk}; 159124621Sphk 16074778Sbrian/* Macros */ 16126026Sbrian 162165243Spiso#ifdef _KERNEL 163165243Spiso#define LIBALIAS_LOCK_INIT(l) \ 164165243Spiso mtx_init(&l->mutex, "per-instance libalias mutex", NULL, MTX_DEF) 165165243Spiso#define LIBALIAS_LOCK_ASSERT(l) mtx_assert(&l->mutex, MA_OWNED) 166165243Spiso#define LIBALIAS_LOCK(l) mtx_lock(&l->mutex) 167165243Spiso#define LIBALIAS_UNLOCK(l) mtx_unlock(&l->mutex) 168165243Spiso#define LIBALIAS_LOCK_DESTROY(l) mtx_destroy(&l->mutex) 169165243Spiso#else 170165243Spiso#define LIBALIAS_LOCK_INIT(l) 171165243Spiso#define LIBALIAS_LOCK_ASSERT(l) 172165243Spiso#define LIBALIAS_LOCK(l) 173165243Spiso#define LIBALIAS_UNLOCK(l) 174165243Spiso#define LIBALIAS_LOCK_DESTROY(l) 175165243Spiso#endif 176165243Spiso 17744307Sbrian/* 17874778Sbrian * The following macro is used to update an 17974778Sbrian * internet checksum. "delta" is a 32-bit 18074778Sbrian * accumulation of all the changes to the 18174778Sbrian * checksum (adding in new 16-bit words and 18274778Sbrian * subtracting out old words), and "cksum" 18374778Sbrian * is the checksum value to be updated. 18444307Sbrian */ 18574778Sbrian#define ADJUST_CHECKSUM(acc, cksum) \ 18674778Sbrian do { \ 18774778Sbrian acc += cksum; \ 18874778Sbrian if (acc < 0) { \ 18974778Sbrian acc = -acc; \ 19074778Sbrian acc = (acc >> 16) + (acc & 0xffff); \ 19174778Sbrian acc += acc >> 16; \ 19274778Sbrian cksum = (u_short) ~acc; \ 19374778Sbrian } else { \ 19474778Sbrian acc = (acc >> 16) + (acc & 0xffff); \ 19574778Sbrian acc += acc >> 16; \ 19674778Sbrian cksum = (u_short) acc; \ 19774778Sbrian } \ 19874778Sbrian } while (0) 19944307Sbrian 20044307Sbrian 20174778Sbrian/* Prototypes */ 20226026Sbrian 203147623Sglebius/* 204147623Sglebius * We do not calculate TCP checksums when libalias is a kernel 205147623Sglebius * module, since it has no idea about checksum offloading. 206147623Sglebius * If TCP data has changed, then we just set checksum to zero, 207147623Sglebius * and caller must recalculate it himself. 208147623Sglebius * In case if libalias will edit UDP data, the same approach 209147623Sglebius * should be used. 210147623Sglebius */ 211147623Sglebius#ifndef _KERNEL 212127094Sdesu_short IpChecksum(struct ip *_pip); 213127094Sdesu_short TcpChecksum(struct ip *_pip); 214147623Sglebius#endif 215127094Sdesvoid 216127689SdesDifferentialChecksum(u_short * _cksum, void * _new, void * _old, int _n); 21726026Sbrian 21826026Sbrian/* Internal data access */ 21926026Sbrianstruct alias_link * 220127094SdesFindIcmpIn(struct libalias *la, struct in_addr _dst_addr, struct in_addr _alias_addr, 221127094Sdes u_short _id_alias, int _create); 22226026Sbrianstruct alias_link * 223127094SdesFindIcmpOut(struct libalias *la, struct in_addr _src_addr, struct in_addr _dst_addr, 224127094Sdes u_short _id, int _create); 22526026Sbrianstruct alias_link * 226127094SdesFindFragmentIn1(struct libalias *la, struct in_addr _dst_addr, struct in_addr _alias_addr, 227127094Sdes u_short _ip_id); 22826026Sbrianstruct alias_link * 229127094SdesFindFragmentIn2(struct libalias *la, struct in_addr _dst_addr, struct in_addr _alias_addr, 230127094Sdes u_short _ip_id); 23126026Sbrianstruct alias_link * 232127094Sdes AddFragmentPtrLink(struct libalias *la, struct in_addr _dst_addr, u_short _ip_id); 23326026Sbrianstruct alias_link * 234127094Sdes FindFragmentPtr(struct libalias *la, struct in_addr _dst_addr, u_short _ip_id); 23526026Sbrianstruct alias_link * 236127094SdesFindProtoIn(struct libalias *la, struct in_addr _dst_addr, struct in_addr _alias_addr, 237127094Sdes u_char _proto); 23859356Srustruct alias_link * 239127094SdesFindProtoOut(struct libalias *la, struct in_addr _src_addr, struct in_addr _dst_addr, 240127094Sdes u_char _proto); 24159356Srustruct alias_link * 242127094SdesFindUdpTcpIn(struct libalias *la, struct in_addr _dst_addr, struct in_addr _alias_addr, 243127094Sdes u_short _dst_port, u_short _alias_port, u_char _proto, int _create); 24426026Sbrianstruct alias_link * 245127094SdesFindUdpTcpOut(struct libalias *la, struct in_addr _src_addr, struct in_addr _dst_addr, 246127094Sdes u_short _src_port, u_short _dst_port, u_char _proto, int _create); 24761861Srustruct alias_link * 248127094SdesAddPptp(struct libalias *la, struct in_addr _src_addr, struct in_addr _dst_addr, 249127094Sdes struct in_addr _alias_addr, u_int16_t _src_call_id); 25061861Srustruct alias_link * 251127094SdesFindPptpOutByCallId(struct libalias *la, struct in_addr _src_addr, 252127094Sdes struct in_addr _dst_addr, u_int16_t _src_call_id); 25363899Sarchiestruct alias_link * 254127094SdesFindPptpInByCallId(struct libalias *la, struct in_addr _dst_addr, 255127094Sdes struct in_addr _alias_addr, u_int16_t _dst_call_id); 25667966Srustruct alias_link * 257127094SdesFindPptpOutByPeerCallId(struct libalias *la, struct in_addr _src_addr, 258127094Sdes struct in_addr _dst_addr, u_int16_t _dst_call_id); 25967966Srustruct alias_link * 260127094SdesFindPptpInByPeerCallId(struct libalias *la, struct in_addr _dst_addr, 261127094Sdes struct in_addr _alias_addr, u_int16_t _alias_call_id); 26267966Srustruct alias_link * 263127094SdesFindRtspOut(struct libalias *la, struct in_addr _src_addr, struct in_addr _dst_addr, 264127094Sdes u_short _src_port, u_short _alias_port, u_char _proto); 26526026Sbrianstruct in_addr 266127094Sdes FindOriginalAddress(struct libalias *la, struct in_addr _alias_addr); 26726026Sbrianstruct in_addr 268127094Sdes FindAliasAddress(struct libalias *la, struct in_addr _original_addr); 26926026Sbrian 27026026Sbrian/* External data access/modification */ 271127094Sdesint 272127094SdesFindNewPortGroup(struct libalias *la, struct in_addr _dst_addr, struct in_addr _alias_addr, 273127094Sdes u_short _src_port, u_short _dst_port, u_short _port_count, 274127094Sdes u_char _proto, u_char _align); 275131614Sdesvoid GetFragmentAddr(struct alias_link *_lnk, struct in_addr *_src_addr); 276131614Sdesvoid SetFragmentAddr(struct alias_link *_lnk, struct in_addr _src_addr); 277131614Sdesvoid GetFragmentPtr(struct alias_link *_lnk, char **_fptr); 278131614Sdesvoid SetFragmentPtr(struct alias_link *_lnk, char *fptr); 279131614Sdesvoid SetStateIn(struct alias_link *_lnk, int _state); 280131614Sdesvoid SetStateOut(struct alias_link *_lnk, int _state); 281131614Sdesint GetStateIn (struct alias_link *_lnk); 282131614Sdesint GetStateOut(struct alias_link *_lnk); 28374778Sbrianstruct in_addr 284131614Sdes GetOriginalAddress(struct alias_link *_lnk); 28574778Sbrianstruct in_addr 286131614Sdes GetDestAddress(struct alias_link *_lnk); 28774778Sbrianstruct in_addr 288131614Sdes GetAliasAddress(struct alias_link *_lnk); 28974778Sbrianstruct in_addr 290127094Sdes GetDefaultAliasAddress(struct libalias *la); 291127094Sdesvoid SetDefaultAliasAddress(struct libalias *la, struct in_addr _alias_addr); 292131614Sdesu_short GetOriginalPort(struct alias_link *_lnk); 293131614Sdesu_short GetAliasPort(struct alias_link *_lnk); 29474778Sbrianstruct in_addr 295131614Sdes GetProxyAddress(struct alias_link *_lnk); 296131614Sdesvoid SetProxyAddress(struct alias_link *_lnk, struct in_addr _addr); 297131614Sdesu_short GetProxyPort(struct alias_link *_lnk); 298131614Sdesvoid SetProxyPort(struct alias_link *_lnk, u_short _port); 299131614Sdesvoid SetAckModified(struct alias_link *_lnk); 300131614Sdesint GetAckModified(struct alias_link *_lnk); 301131614Sdesint GetDeltaAckIn(struct ip *_pip, struct alias_link *_lnk); 302131614Sdesint GetDeltaSeqOut(struct ip *_pip, struct alias_link *_lnk); 303131614Sdesvoid AddSeq (struct ip *_pip, struct alias_link *_lnk, int _delta); 304131614Sdesvoid SetExpire (struct alias_link *_lnk, int _expire); 305127094Sdesvoid ClearCheckNewLink(struct libalias *la); 306131614Sdesvoid SetProtocolFlags(struct alias_link *_lnk, int _pflags); 307131614Sdesint GetProtocolFlags(struct alias_link *_lnk); 308131614Sdesvoid SetDestCallId(struct alias_link *_lnk, u_int16_t _cid); 309127094Sdes 31036711Sbrian#ifndef NO_FW_PUNCH 311131614Sdesvoid PunchFWHole(struct alias_link *_lnk); 312127094Sdes 31336711Sbrian#endif 31426026Sbrian 31526026Sbrian/* Housekeeping function */ 316127094Sdesvoid HouseKeeping(struct libalias *); 31726026Sbrian 31826026Sbrian/* Tcp specfic routines */ 31974778Sbrian/* lint -save -library Suppress flexelint warnings */ 32044307Sbrian 32144307Sbrian/* Transparent proxy routines */ 322127094Sdesint 323127094SdesProxyCheck(struct libalias *la, struct ip *_pip, struct in_addr *_proxy_server_addr, 324127094Sdes u_short * _proxy_server_port); 325127094Sdesvoid 326131614SdesProxyModify(struct libalias *la, struct alias_link *_lnk, struct ip *_pip, 327127094Sdes int _maxpacketsize, int _proxy_type); 32836321Samurai 32932377Seivindenum alias_tcp_state { 33074778Sbrian ALIAS_TCP_STATE_NOT_CONNECTED, 33174778Sbrian ALIAS_TCP_STATE_CONNECTED, 33274778Sbrian ALIAS_TCP_STATE_DISCONNECTED 33332377Seivind}; 33474778Sbrian 335131699Sdes#if defined(_NETINET_IP_H_) 336131699Sdesstatic __inline void * 337131699Sdesip_next(struct ip *iphdr) 338131699Sdes{ 339131699Sdes char *p = (char *)iphdr; 340131699Sdes return (&p[iphdr->ip_hl * 4]); 341131699Sdes} 342131699Sdes#endif 343131699Sdes 344131699Sdes#if defined(_NETINET_TCP_H_) 345131699Sdesstatic __inline void * 346131699Sdestcp_next(struct tcphdr *tcphdr) 347131699Sdes{ 348131699Sdes char *p = (char *)tcphdr; 349131699Sdes return (&p[tcphdr->th_off * 4]); 350131699Sdes} 351131699Sdes#endif 352131699Sdes 353131699Sdes#if defined(_NETINET_UDP_H_) 354131699Sdesstatic __inline void * 355131699Sdesudp_next(struct udphdr *udphdr) 356131699Sdes{ 357131699Sdes return ((void *)(udphdr + 1)); 358131699Sdes} 359131699Sdes#endif 360131699Sdes 361127094Sdes#endif /* !_ALIAS_LOCAL_H_ */ 362