1 /* 2 * 3 * adding/removing headers or any other data chunk from a message 4 * 5 * Copyright (C) 2001-2003 FhG Fokus 6 * 7 * This file is part of Kamailio, a free SIP server. 8 * 9 * Kamailio is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License as published by 11 * the Free Software Foundation; either version 2 of the License, or 12 * (at your option) any later version 13 * 14 * Kamailio is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to the Free Software 21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 22 */ 23 /*! 24 * \file 25 * \brief Kamailio core :: Adding/removing headers or any other data chunk from a message 26 * \ingroup core 27 * \author jiri, andrei, janakj 28 * Module: \ref core 29 */ 30 31 #ifndef lump_struct_h 32 #define lump_struct_h 33 34 #include "./parser/hf.h" 35 36 37 enum lump_op { LUMP_NOP=0, LUMP_DEL, LUMP_ADD, LUMP_ADD_SUBST, LUMP_ADD_OPT }; 38 39 enum lump_subst{ SUBST_NOP=0, /* do nothing */ 40 SUBST_RCV_IP, SUBST_SND_IP, /* add ip address */ 41 SUBST_RCV_PORT, SUBST_SND_PORT, /* add port no */ 42 SUBST_RCV_PROTO, SUBST_SND_PROTO, /* add protocol(udp,tcp,tls)*/ 43 SUBST_RCV_ALL, SUBST_SND_ALL, /* ip:port;transport=proto */ 44 SUBST_RCV_ALL_EX, SUBST_SND_ALL_EX /* ip:port;transport=proto;sn=xyz */ 45 }; 46 /* Where: 47 * SND = sending, e.g the src ip of the outgoing message 48 * RCV = received e.g the dst ip of the original incoming msg, 49 * or the ip of the ser socket on which the msg was received 50 * For SUBST_{RCV,SND}_ALL, :port is added only if port!=5060 51 * and transport=proto only if proto!=udp 52 */ 53 54 enum lump_conditions { COND_FALSE, /* always false */ 55 COND_TRUE, /* always true */ 56 COND_IF_DIFF_REALMS,/* true if RCV realm != SND realm */ 57 COND_IF_DIFF_AF, /* true if RCV af != SND af */ 58 COND_IF_DIFF_PROTO, /* true if RCV proto != SND proto */ 59 COND_IF_DIFF_PORT, /* true if RCV port != SND port */ 60 COND_IF_DIFF_IP, /* true if RCV ip != SND ip */ 61 COND_IF_RAND /* 50-50 random prob.of being true*/ 62 }; 63 /* Where: 64 * REALM= ip_addr:port:proto 65 * af = address family (ipv4 or ipv6) 66 * proto = protocol (tcp, udp, tls) 67 */ 68 69 enum lump_flag { LUMPFLAG_NONE=0, /* */ 70 LUMPFLAG_DUPED=1, /* lump struct duplicated in pkg, with value 71 * pointing to initial lump structure 72 * - e.g., used for branch_route execution */ 73 LUMPFLAG_SHMEM=2, /* lump stored in shared memory (e.g., tm) */ 74 LUMPFLAG_BRANCH=4, /* not in use ?!? */ 75 LUMPFLAG_COND_TRUE=8 /* conditional lump processing */ 76 }; 77 78 #define LUMP_SET_COND_TRUE(_lump) (_lump)->flags |= LUMPFLAG_COND_TRUE 79 #define LUMP_IS_COND_TRUE(_lump) ((_lump)->flags & LUMPFLAG_COND_TRUE) 80 81 typedef struct lump{ 82 enum _hdr_types_t type; /* HDR_VIA_T, HDR_OTHER_T (0), ... */ 83 enum lump_op op; /* DEL, ADD, NOP, UNSPEC(=0) */ 84 85 union{ 86 int offset; /* used for DEL, MODIFY */ 87 enum lump_subst subst; /*what to subst: ip addr, port, proto*/ 88 enum lump_conditions cond; /* condition for LUMP_ADD_OPT */ 89 char * value; /* used for ADD */ 90 }u; 91 int len; /* length of this header field */ 92 93 94 struct lump* before; /* list of headers to be inserted in front of the 95 current one */ 96 struct lump* after; /* list of headers to be inserted immediately after 97 * the current one */ 98 99 struct lump* next; 100 101 enum lump_flag flags; /* additional hints for use from TM's shmem */ 102 } sr_lump_t; 103 104 105 /* 106 * hdrs must be kept sorted after their offset (DEL, NOP, UNSPEC) 107 * and/or their position (ADD). E.g.: 108 * - to delete header Z insert it in to the list according to its offset 109 * and with op=DELETE 110 * - if you want to add a new header X after a header Y, insert Y in the list 111 * with op NOP and after it X (op ADD). 112 * - if you want X before Y, insert X in Y's before list. 113 * - if you want X to be the first header just put it first in hdr_lst. 114 * -if you want to replace Y with X, insert Y with op=DELETE and then X with 115 * op=ADD. 116 * before and after must contain only ADD ops! 117 * 118 * Difference between "after" & "next" when Adding: 119 * "after" forces the new header immediately after the current one while 120 * "next" means another header can be inserted between them. 121 * 122 */ 123 124 /* frees the content of a lump struct */ 125 void free_lump(struct lump* l); 126 /* frees an entire lump list, recursively */ 127 void free_lump_list(struct lump* lump_list); 128 /* count applied lumps in a list having a specific type */ 129 unsigned int count_applied_lumps(struct lump *ll, int type); 130 #endif 131