123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- /*
- * $Id$
- *
- * Copyright (C) 2001-2004 FhG FOKUS
- *
- * This file is part of ser, a free SIP server.
- *
- * ser is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version
- *
- * ser is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
- /*!
- * \file
- * \brief SIP-router core :: Destination set handling
- * \ingroup core
- * Module: \ref core
- */
- #ifndef _DSET_H
- #define _DSET_H
- #include "ip_addr.h"
- #include "qvalue.h"
- #include "flags.h"
- #include "parser/msg_parser.h"
- extern unsigned int nr_branches;
- extern int ruri_is_new;
- /*! \brief
- * Structure for storing branch attributes
- */
- struct branch
- {
- char uri[MAX_URI_SIZE];
- unsigned int len;
- /* Real destination of the request */
- char dst_uri[MAX_URI_SIZE];
- unsigned int dst_uri_len;
- /* Path set */
- char path[MAX_PATH_SIZE];
- unsigned int path_len;
- int q; /* Preference of the contact among
- * contact within the array */
- struct socket_info* force_send_socket;
- /* +sip.instance contact header param value */
- char instance[MAX_INSTANCE_SIZE];
- unsigned int instance_len;
- /* reg-id contact header param value */
- unsigned int reg_id;
- /* Branch flags */
- flag_t flags;
- };
- typedef struct branch branch_t;
- /*! \brief
- * Return pointer to branch[idx] structure
- */
- branch_t *get_sip_branch(int idx);
- /*! \brief
- * Drop branch[idx]
- */
- int drop_sip_branch(int idx);
- /*! \brief
- * Add a new branch to current transaction
- */
- int append_branch(struct sip_msg* msg, str* uri, str* dst_uri, str* path,
- qvalue_t q, unsigned int flags,
- struct socket_info* force_socket,
- str* instance, unsigned int reg_id);
- /*! \brief kamailio compatible version */
- #define km_append_branch(msg, uri, dst_uri, path, q, flags, force_socket) \
- append_branch(msg, uri, dst_uri, path, q, flags, force_socket, 0, 0)
- /*! \brief ser compatible append_branch version.
- * append_branch version compatible with ser: no path or branch flags support
- * and no str parameters.
- */
- static inline int ser_append_branch(struct sip_msg* msg,
- char* uri, int uri_len,
- char* dst_uri, int dst_uri_len,
- qvalue_t q,
- struct socket_info* force_socket)
- {
- str s_uri, s_dst_uri;
- s_uri.s=uri;
- s_uri.len=uri_len;
- s_dst_uri.s=dst_uri;
- s_dst_uri.len=dst_uri_len;
- return append_branch(msg, &s_uri, &s_dst_uri, 0, q, 0, force_socket, 0, 0);
- }
- /*! \brief
- * Init the index to iterate through the list of transaction branches
- */
- void init_branch_iterator(void);
- /*! \brief
- * Return branch iterator position
- */
- int get_branch_iterator(void);
- /*! \brief
- * Set branch iterator position
- */
- void set_branch_iterator(int n);
- /*! \brief Get the next branch in the current transaction.
- * @return pointer to the uri of the next branch (which the length written in
- * *len) or 0 if there are no more branches.
- */
- char* next_branch(int* len, qvalue_t* q, str* dst_uri, str* path,
- unsigned int* flags, struct socket_info** force_socket);
- char* get_branch( unsigned int i, int* len, qvalue_t* q, str* dst_uri,
- str* path, unsigned int *flags,
- struct socket_info** force_socket);
- /*! \brief
- * Empty the array of branches
- */
- void clear_branches(void);
- /*! \brief
- * Create a Contact header field from the
- * list of current branches
- */
- char* print_dset(struct sip_msg* msg, int* len);
- /*! \brief
- * Set the q value of the Request-URI
- */
- void set_ruri_q(qvalue_t q);
- /*! \brief
- * Get the q value of the Request-URI
- */
- qvalue_t get_ruri_q(void);
- /*
- * Get actual Request-URI
- */
- inline static int get_request_uri(struct sip_msg* _m, str* _u)
- {
- *_u=*GET_RURI(_m);
- return 0;
- }
- #define ruri_mark_new() (ruri_is_new = 1)
- #define ruri_mark_consumed() (ruri_is_new = 0)
- /** returns whether or not ruri should be used when forking.
- * (usefull for serial forking)
- * @return 0 if already marked as consumed, 1 if not.
- */
- #define ruri_get_forking_state() (ruri_is_new)
- int rewrite_uri(struct sip_msg* _m, str* _s);
- /*! \brief
- * Set a per-branch flag to 1.
- *
- * This function sets the value of one particular branch flag to 1.
- * @param branch Number of the branch (0 for the main Request-URI branch)
- * @param flag Number of the flag to be set (starting with 0)
- * @return 1 on success, -1 on failure.
- */
- int setbflag(unsigned int branch, flag_t flag);
- /*! \brief
- * Reset a per-branch flag value to 0.
- *
- * This function resets the value of one particular branch flag to 0.
- * @param branch Number of the branch (0 for the main Request-URI branch)
- * @param flag Number of the flag to be reset (starting with 0)
- * @return 1 on success, -1 on failure.
- */
- int resetbflag(unsigned int branch, flag_t flag);
- /*! \brief
- * Determine if a branch flag is set.
- *
- * This function tests the value of one particular per-branch flag.
- * @param branch Number of the branch (0 for the main Request-URI branch)
- * @param flag Number of the flag to be tested (starting with 0)
- * @return 1 if the branch flag is set, -1 if not or on failure.
- */
- int isbflagset(unsigned int branch, flag_t flag);
- /*! \brief
- * Get the value of all branch flags for a branch
- *
- * This function returns the value of all branch flags
- * combined in a single variable.
- * @param branch Number of the branch (0 for the main Request-URI branch)
- * @param res A pointer to a variable to store the result
- * @return 1 on success, -1 on failure
- */
- int getbflagsval(unsigned int branch, flag_t* res);
- /*! \brief
- * Set the value of all branch flags at once for a given branch.
- *
- * This function sets the value of all branch flags for a given
- * branch at once.
- * @param branch Number of the branch (0 for the main Request-URI branch)
- * @param val All branch flags combined into a single variable
- * @return 1 on success, -1 on failure
- */
- int setbflagsval(unsigned int branch, flag_t val);
- #endif /* _DSET_H */
|