dset.h
caf80ae6
 /*
  * $Id$
7dd0b342
  *
035f593c
  * Copyright (C) 2001-2004 FhG FOKUS
7dd0b342
  *
  * 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
caf80ae6
  */
 
1ff47a5c
 /*!
  * \file
  * \brief SIP-router core :: Destination set handling
  * \ingroup core
  * Module: \ref core
  */
 
035f593c
 #ifndef _DSET_H
 #define _DSET_H
7dd0b342
 
dc4b13e8
 #include "ip_addr.h"
035f593c
 #include "qvalue.h"
0202608d
 #include "flags.h"
cbf1b779
 #include "parser/msg_parser.h"
caf80ae6
 
 
87962c1a
 extern unsigned int nr_branches;
b4ea4393
 extern int ruri_is_new;
87962c1a
 
1ff47a5c
 /*! \brief
15627cd0
  * 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;
 
571e4e3f
     /* +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;
 
e3ba8f38
     /* ruid value from usrloc */
     char ruid[MAX_RUID_SIZE];
     unsigned int ruid_len;
 
8ca114df
     char location_ua[MAX_UA_SIZE + 1];
     unsigned int location_ua_len;
 
15627cd0
     /* 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
035f593c
  * Add a new branch to current transaction 
  */
c43dc0cd
 int append_branch(struct sip_msg* msg, str* uri, str* dst_uri, str* path,
571e4e3f
 		  qvalue_t q, unsigned int flags,
 		  struct socket_info* force_socket,
e3ba8f38
 		  str* instance, unsigned int reg_id,
8ca114df
 		  str* ruid, str* location_ua);
2a78db5c
 
1ff47a5c
 /*! \brief kamailio compatible version */
c43dc0cd
 #define km_append_branch(msg, uri, dst_uri, path, q, flags, force_socket) \
8ca114df
     append_branch(msg, uri, dst_uri, path, q, flags, force_socket, 0, 0, 0, 0)
2a78db5c
 
1ff47a5c
 /*! \brief ser compatible append_branch version.
c43dc0cd
  *  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,
571e4e3f
 				    char* uri, int uri_len,
 				    char* dst_uri, int dst_uri_len,
 				    qvalue_t q,
 				    struct socket_info* force_socket)
c43dc0cd
 {
571e4e3f
     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;
8ca114df
     return append_branch(msg, &s_uri, &s_dst_uri, 0, q, 0, force_socket, 0, 0, 0, 0);
c43dc0cd
 }
52d5764e
 
 
c43dc0cd
 
1ff47a5c
 /*! \brief
c5f101df
  * Init the index to iterate through the list of transaction branches
035f593c
  */
 void init_branch_iterator(void);
 
1ff47a5c
 /*! \brief
c5f101df
  * Return branch iterator position
764bac17
  */
 int get_branch_iterator(void);
035f593c
 
c5f101df
 /*! \brief
  * Set branch iterator position
  */
 void set_branch_iterator(int n);
c43dc0cd
 
1ff47a5c
 /*! \brief Get the next branch in the current transaction.
c43dc0cd
  * @return pointer to the uri of the next branch (which the length written in
  *  *len) or 0 if there are no more branches.
035f593c
  */
c43dc0cd
 char* next_branch(int* len, qvalue_t* q, str* dst_uri, str* path,
8e6c690e
 		  unsigned int* flags, struct socket_info** force_socket,
8ca114df
 		  str *ruid, str *instance, str *location_ua);
035f593c
 
52d5764e
 char* get_branch( unsigned int i, int* len, qvalue_t* q, str* dst_uri,
571e4e3f
 		  str* path, unsigned int *flags,
8e6c690e
 		  struct socket_info** force_socket,
8ca114df
 		  str* ruid, str *instance, str *location_ua);
52d5764e
 
1ff47a5c
 /*! \brief
035f593c
  * Empty the array of branches
  */
 void clear_branches(void);
caf80ae6
 
 
1ff47a5c
 /*! \brief
035f593c
  * Create a Contact header field from the
  * list of current branches
  */
 char* print_dset(struct sip_msg* msg, int* len);
 
 
1ff47a5c
 /*! \brief
035f593c
  * Set the q value of the Request-URI
  */
 void set_ruri_q(qvalue_t q);
 
 
1ff47a5c
 /*! \brief
3f3c865e
  * Get src ip, port and proto as SIP uri or proxy address
  */
 int msg_get_src_addr(sip_msg_t *msg, str *uri, int mode);
 
 /*! \brief
035f593c
  * Get the q value of the Request-URI
  */
 qvalue_t get_ruri_q(void);
 
cbf1b779
 
 
 /*
  * Get actual Request-URI
  */
 inline static int get_request_uri(struct sip_msg* _m, str* _u)
 {
 	*_u=*GET_RURI(_m);
 	return 0;
 }
 
 
b4ea4393
 #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)
cbf1b779
 
7c8890f0
 int rewrite_uri(struct sip_msg* _m, str* _s);
 
1ff47a5c
 /*! \brief
0202608d
  * 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);
 
1ff47a5c
 /*! \brief
0202608d
  * 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);
 
1ff47a5c
 /*! \brief
0202608d
  * 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);
7c8890f0
 
1ff47a5c
 /*! \brief
5a68f95d
  * 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)
d02a166d
  * @param res A pointer to a variable to store the result
5a68f95d
  * @return 1 on success, -1 on failure
  */
d02a166d
 int getbflagsval(unsigned int branch, flag_t* res);
5a68f95d
 
1ff47a5c
 /*! \brief
5a68f95d
  * 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);
 
217f9fdd
 int uri_add_rcv_alias(sip_msg_t *msg, str *uri, str *nuri);
 int uri_restore_rcv_alias(str *uri, str *nuri, str *suri);
 
035f593c
 #endif /* _DSET_H */