mirror of https://github.com/sipwise/kamailio.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
457 lines
15 KiB
457 lines
15 KiB
/*
|
|
* $Id$
|
|
*
|
|
* Copyright (C) 2012 Smile Communications, jason.penton@smilecoms.com
|
|
* Copyright (C) 2012 Smile Communications, richard.good@smilecoms.com
|
|
* The initial version of this code was written by Dragos Vingarzan
|
|
* (dragos(dot)vingarzan(at)fokus(dot)fraunhofer(dot)de and the
|
|
* Fruanhofer Institute. It was and still is maintained in a separate
|
|
* branch of the original SER. We are therefore migrating it to
|
|
* Kamailio/SR and look forward to maintaining it from here on out.
|
|
* 2011/2012 Smile Communications, Pty. Ltd.
|
|
* ported/maintained/improved by
|
|
* Jason Penton (jason(dot)penton(at)smilecoms.com and
|
|
* Richard Good (richard(dot)good(at)smilecoms.com) as part of an
|
|
* effort to add full IMS support to Kamailio/SR using a new and
|
|
* improved architecture
|
|
*
|
|
* NB: Alot of this code was originally part of OpenIMSCore,
|
|
* FhG Fokus.
|
|
* Copyright (C) 2004-2006 FhG Fokus
|
|
* Thanks for great work! This is an effort to
|
|
* break apart the various CSCF functions into logically separate
|
|
* components. We hope this will drive wider use. We also feel
|
|
* that in this way the architecture is more complete and thereby easier
|
|
* to manage in the Kamailio/SR environment
|
|
*
|
|
* This file is part of Kamailio, a free SIP server.
|
|
*
|
|
* Kamailio 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
|
|
*
|
|
* Kamailio 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*
|
|
*/
|
|
|
|
#ifndef __IMS_GETTERS_H
|
|
#define __IMS_GETTERS_H
|
|
|
|
#include "../../str.h"
|
|
|
|
#include "../../parser/contact/parse_contact.h"
|
|
|
|
/** Return and break the execution of routng script */
|
|
#define CSCF_RETURN_BREAK 0
|
|
/** Return true in the routing script */
|
|
#define CSCF_RETURN_TRUE 1
|
|
/** Return false in the routing script */
|
|
#define CSCF_RETURN_FALSE -1
|
|
/** Return error in the routing script */
|
|
#define CSCF_RETURN_ERROR -2
|
|
|
|
/** Enumeration for dialog directions */
|
|
enum cscf_dialog_direction {
|
|
CSCF_MOBILE_ORIGINATING=0,
|
|
CSCF_MOBILE_TERMINATING=1,
|
|
CSCF_MOBILE_UNKNOWN=2
|
|
};
|
|
|
|
/**
|
|
* Duplicate a str, safely.
|
|
* \Note This checks if:
|
|
* - src was an empty string
|
|
* - malloc failed
|
|
* \Note On any error, the dst values are reset for safety
|
|
* \Note A label "out_of_memory" must be defined in the calling function to handle
|
|
* allocation errors.
|
|
* @param dst - destination str
|
|
* @param src - source src
|
|
* @param mem - type of mem to duplicate into (shm/pkg)
|
|
*/
|
|
#define str_dup(dst,src,mem) \
|
|
do {\
|
|
if ((src).len) {\
|
|
(dst).s = mem##_malloc((src).len);\
|
|
if (!(dst).s){\
|
|
LM_ERR("Error allocating %d bytes in %s!\n",(src).len,#mem);\
|
|
(dst).len = 0;\
|
|
goto out_of_memory;\
|
|
}\
|
|
memcpy((dst).s,(src).s,(src).len);\
|
|
(dst).len = (src).len;\
|
|
}else{\
|
|
(dst).s=0;(dst).len=0;\
|
|
}\
|
|
} while (0)
|
|
|
|
/**
|
|
* Frees a str content.
|
|
* @param x - the str to free
|
|
* @param mem - type of memory that the content is using (shm/pkg)
|
|
*/
|
|
#define str_free(x,mem) \
|
|
do {\
|
|
if ((x).s) mem##_free((x).s);\
|
|
(x).s=0;(x).len=0;\
|
|
} while(0)
|
|
|
|
/**
|
|
* Parses all the contact headers.
|
|
* @param msg - the SIP message
|
|
* @returns the first contact_body
|
|
*/
|
|
contact_body_t *cscf_parse_contacts(struct sip_msg *msg);
|
|
/**
|
|
* Returns the Private Identity extracted from the Authorization header.
|
|
* If none found there takes the SIP URI in To without the "sip:" prefix
|
|
* \todo - remove the fallback case to the To header
|
|
* @param msg - the SIP message
|
|
* @param realm - the realm to match in an Authorization header
|
|
* @returns the str containing the private id, no mem dup
|
|
*/
|
|
str cscf_get_private_identity(struct sip_msg *msg, str realm);
|
|
/**
|
|
* Returns the Private Identity extracted from the Authorization header.
|
|
* If none found there takes the SIP URI in from without the "sip:" prefix
|
|
* @param msg - the SIP message
|
|
* @param realm - the realm to match in an Authorization header
|
|
* @returns the str containing the private id, no mem dup
|
|
*/
|
|
str cscf_get_private_identity_from(struct sip_msg *msg, str realm);
|
|
/**
|
|
* Returns the Public Identity extracted from the To header
|
|
* @param msg - the SIP message
|
|
* @returns the str containing the public id, no mem dup
|
|
*/
|
|
str cscf_get_public_identity(struct sip_msg *msg);
|
|
/**
|
|
* Returns the Public Identity extracted from the From header
|
|
* @param msg - the SIP message
|
|
* @returns the str containing the public id, no mem dup
|
|
*/
|
|
str cscf_get_public_identity_from(struct sip_msg *msg);
|
|
/**
|
|
* Returns the expires value from the Expires header in the message.
|
|
* It searches into the Expires header and if not found returns -1
|
|
* @param msg - the SIP message, if available
|
|
* @is_shm - msg from from shared memory
|
|
* @returns the value of the expire or -1 if not found
|
|
*/
|
|
int cscf_get_expires_hdr(struct sip_msg *msg, int is_shm);
|
|
/**
|
|
* Returns the expires value from the message.
|
|
* First it searches into the Expires header and if not found it also looks
|
|
* into the expires parameter in the contact header
|
|
* @param msg - the SIP message
|
|
* @param is_shm - msg from shared memory
|
|
* @returns the value of the expire or the default 3600 if none found
|
|
*/
|
|
int cscf_get_max_expires(struct sip_msg *msg, int is_shm);
|
|
/**
|
|
* Finds if the message contains the orig parameter in the first Route header
|
|
* @param msg - the SIP message
|
|
* @param str1 - not used
|
|
* @param str2 - not used
|
|
* @returns #CSCF_RETURN_TRUE if yes, else #CSCF_RETURN_FALSE
|
|
*/
|
|
int cscf_has_originating(struct sip_msg *msg, char *str1, char *str2);
|
|
/**
|
|
* Looks for the P-Asserted-Identity header and extracts its content
|
|
* @param msg - the sip message
|
|
* @is_shm - is the message a shm message
|
|
* @returns the asserted identity
|
|
*/
|
|
str cscf_get_asserted_identity(struct sip_msg *msg, int is_shm);
|
|
/**
|
|
* Extracts the realm from a SIP/TEL URI.
|
|
* - SIP - the hostname
|
|
* - TEL - the phone-context parameter
|
|
* @param msg - the SIP message
|
|
* @returns the realm
|
|
*/
|
|
str cscf_get_realm_from_uri(str uri);
|
|
/**
|
|
* Delivers the Realm from request URI
|
|
* @param msg sip message
|
|
* @returns realm as String on success 0 on fail
|
|
*/
|
|
str cscf_get_realm_from_ruri(struct sip_msg *msg);
|
|
/**
|
|
* Get the Public Identity from the Request URI of the message
|
|
* @param msg - the SIP message
|
|
* @returns the public identity
|
|
*/
|
|
str cscf_get_public_identity_from_requri(struct sip_msg *msg);
|
|
|
|
/**
|
|
* Get the contact from the Request URI of the message
|
|
* NB: free returned result str when done from shm
|
|
* @param msg - the SIP message
|
|
* @returns the contact (don't forget to free from shm)
|
|
*
|
|
* NOTE: should only be called when REQ URI has been converted sip:user@IP_ADDRESS:PORT or tel:IP_ADDRESS:PORT
|
|
*/
|
|
str cscf_get_contact_from_requri(struct sip_msg *msg);
|
|
|
|
/**
|
|
* Looks for the Call-ID header
|
|
* @param msg - the sip message
|
|
* @param hr - ptr to return the found hdr_field
|
|
* @returns the callid value
|
|
*/
|
|
str cscf_get_call_id(struct sip_msg *msg, struct hdr_field **hr);
|
|
/**
|
|
* Check if the contact has an URI parameter with the value "sos",
|
|
* used for detecting an Emergency Registration
|
|
* http://tools.ietf.org/html/draft-patel-ecrit-sos-parameter-0x
|
|
* @param uri - contact uri to be checked
|
|
* @return 1 if found, 0 if not, -1 on error
|
|
*/
|
|
int cscf_get_sos_uri_param(str uri);
|
|
/**
|
|
* Return the P-Visited-Network-ID header
|
|
* @param msg - the SIP message
|
|
* @returns the str with the header's body
|
|
*/
|
|
str cscf_get_visited_network_id(struct sip_msg *msg, struct hdr_field **h);
|
|
/**
|
|
* Adds a header to the message as the first one in the message
|
|
* @param msg - the message to add a header to
|
|
* @param content - the str containing the new header
|
|
* @returns 1 on succes, 0 on failure
|
|
*/
|
|
int cscf_add_header_first(struct sip_msg *msg, str *hdr, int type);
|
|
|
|
/**
|
|
* Returns the next header structure for a given header name.
|
|
* @param msg - the SIP message to look into
|
|
* @param header_name - the name of the header to search for
|
|
* @param last_header - last header to ignore in the search, or NULL if to start from the first one
|
|
* @returns the hdr_field on success or NULL if not found
|
|
*/
|
|
struct hdr_field* cscf_get_next_header(struct sip_msg * msg,
|
|
/**
|
|
* Looks for the First Via header and returns its body.
|
|
* @param msg - the SIP message
|
|
* @param h - the hdr_field to fill with the result
|
|
* @returns the first via_body
|
|
*/ str header_name, struct hdr_field* last_header);
|
|
struct via_body* cscf_get_first_via(struct sip_msg *msg, struct hdr_field **h);
|
|
/**
|
|
* Looks for the Last Via header and returns it.
|
|
* @param msg - the SIP message
|
|
* @returns the last via body body
|
|
*/
|
|
struct via_body* cscf_get_last_via(struct sip_msg *msg);
|
|
/**
|
|
* Looks for the UE Via in First Via header if its a request
|
|
* or in the last if its a response and returns its body
|
|
* @param msg - the SIP message
|
|
* @returns the via of the UE
|
|
*/
|
|
struct via_body* cscf_get_ue_via(struct sip_msg *msg);
|
|
/**
|
|
* Looks for the WWW-Authenticate header and returns its body.
|
|
* @param msg - the SIP message
|
|
* @param h - the hdr_field to fill with the result
|
|
* @returns the www-authenticate body
|
|
*/
|
|
str cscf_get_authenticate(struct sip_msg *msg, struct hdr_field **h);
|
|
/**
|
|
* Adds a header to the message
|
|
* @param msg - the message to add a header to
|
|
* @param content - the str containing the new header
|
|
* @returns 1 on succes, 0 on failure
|
|
*/
|
|
int cscf_add_header(struct sip_msg *msg, str *hdr, int type);
|
|
/**
|
|
* Get the expires header value from a message.
|
|
* @param msg - the SIP message
|
|
* @returns the expires value or -1 if not found
|
|
*/
|
|
int cscf_get_expires(struct sip_msg *msg);
|
|
/**
|
|
* Check if the message is an initial request for a dialog.
|
|
* - BYE, PRACK, UPDATE, NOTIFY belong to an already existing dialog
|
|
* @param msg - the message to check
|
|
* @returns 1 if initial, 0 if not
|
|
*/
|
|
int cscf_is_initial_request(struct sip_msg *msg);
|
|
|
|
/**
|
|
* Get the public identity from P-Asserted-Identity, or From if asserted not found.
|
|
* @param msg - the SIP message
|
|
* @param uri - uri to fill into
|
|
* @returns 1 if found, 0 if not
|
|
*/
|
|
int cscf_get_originating_user(struct sip_msg * msg, str *uri);
|
|
|
|
/**
|
|
* Get public identity from Request-URI for terminating.
|
|
* returns in uri the freshly pkg allocated uri - don't forget to free
|
|
* @param msg - the SIP message
|
|
* @param uri - uri to fill into
|
|
* @returns 1 if found, else 0
|
|
*/
|
|
int cscf_get_terminating_user(struct sip_msg * msg, str *uri);
|
|
|
|
/**
|
|
* Return the P-Access-Network-Info header
|
|
* @param msg - the SIP message
|
|
* @returns the str with the header's body
|
|
*/
|
|
|
|
str cscf_get_access_network_info(struct sip_msg *msg, struct hdr_field **h);
|
|
|
|
/**
|
|
* Return the P-Charging-Vector header
|
|
* @param msg - the SIP message
|
|
* @returns the str with the header's body
|
|
*/
|
|
|
|
str cscf_get_charging_vector(struct sip_msg *msg, struct hdr_field **h);
|
|
|
|
/**
|
|
* Return the P-Charging-Vector tokens
|
|
* @param msg - the SIP message
|
|
* @returns the str with icid, orig_ioi and term_ioi
|
|
*/
|
|
int cscf_get_p_charging_vector(struct sip_msg *msg, str * icid, str * orig_ioi,
|
|
str * term_ioi);
|
|
|
|
|
|
/**
|
|
* Get the to tag
|
|
* @param msg - the SIP Message to look into
|
|
* @param tag - the pointer to the tag to write to
|
|
* @returns 0 on error or 1 on success
|
|
*/
|
|
int cscf_get_to_tag(struct sip_msg* msg, str* tag);
|
|
|
|
/**
|
|
* Get the from tag
|
|
* @param msg - the SIP message to look into
|
|
* @param tag - the pointer to the tag to write to
|
|
* @returns 0 on error or 1 on success
|
|
*/
|
|
int cscf_get_from_tag(struct sip_msg* msg, str* tag);
|
|
|
|
|
|
|
|
/**
|
|
* Get the local uri from the From header.
|
|
* @param msg - the message to look into
|
|
* @param local_uri - ptr to fill with the value
|
|
* @returns 1 on success or 0 on error
|
|
*/
|
|
int cscf_get_from_uri(struct sip_msg* msg, str *local_uri);
|
|
|
|
/**
|
|
* Get the local uri from the To header.
|
|
* @param msg - the message to look into
|
|
* @param local_uri - ptr to fill with the value
|
|
* @returns 1 on success or 0 on error
|
|
*/
|
|
int cscf_get_to_uri(struct sip_msg* msg, str *local_uri);
|
|
|
|
/**
|
|
* Looks for the Event header and extracts its content.
|
|
* @param msg - the sip message
|
|
* @returns the string event value or an empty string if none found
|
|
*/
|
|
str cscf_get_event(struct sip_msg *msg);
|
|
|
|
/*! \brief
|
|
* Check if the originating REGISTER message was formed correctly
|
|
* The whole message must be parsed before calling the function
|
|
* _s indicates whether the contact was star
|
|
*/
|
|
int cscf_check_contacts(struct sip_msg* _m, int* _s);
|
|
|
|
/*! \brief
|
|
* parse all the messages required by the registrar
|
|
*/
|
|
int cscf_parse_message_for_register(struct sip_msg* _m);
|
|
|
|
/**
|
|
* Returns the content of the P-Associated-URI header
|
|
* Public_id is pkg_alloced and should be later freed.
|
|
* Inside values are not duplicated.
|
|
* @param msg - the SIP message to look into
|
|
* @param public_id - array to be allocated and filled with the result
|
|
* @param public_id_cnt - the size of the public_id array
|
|
* @param is_shm - msg from shared memory
|
|
* @returns 1 on success or 0 on error
|
|
*/
|
|
int cscf_get_p_associated_uri(struct sip_msg *msg,str **public_id,int *public_id_cnt, int is_shm);
|
|
|
|
/**
|
|
* Looks for the realm parameter in the Authorization header and returns its value.
|
|
* @param msg - the SIP message
|
|
* @returns the realm
|
|
*/
|
|
str cscf_get_realm(struct sip_msg *msg);
|
|
|
|
/**
|
|
* Returns the content of the Service-Route header.
|
|
* data vector is pkg_alloced and should be later freed
|
|
* inside values are not duplicated
|
|
* @param msg - the SIP message
|
|
* @param size - size of the returned vector, filled with the result
|
|
* @param is_shm - msg from shared memory
|
|
* @returns - the str vector of uris
|
|
*/
|
|
str* cscf_get_service_route(struct sip_msg *msg, int *size, int is_shm);
|
|
|
|
/**
|
|
* Returns the s_dialog_direction from the direction string.
|
|
* @param direction - "orig" or "term"
|
|
* @returns the s_dialog_direction if ok or #DLG_MOBILE_UNKNOWN if not found
|
|
*/
|
|
enum cscf_dialog_direction cscf_get_dialog_direction(char *direction);
|
|
|
|
long cscf_get_content_length (struct sip_msg* msg);
|
|
|
|
/**
|
|
* Looks for the Contact header and extracts its content
|
|
* @param msg - the sip message
|
|
* @returns the first contact in the message
|
|
*/
|
|
str cscf_get_contact(struct sip_msg *msg);
|
|
|
|
/**
|
|
* Adds a header to the reply message
|
|
* @param msg - the request to add a header to its reply
|
|
* @param content - the str containing the new header
|
|
* @returns 1 on succes, 0 on failure
|
|
*/
|
|
int cscf_add_header_rpl(struct sip_msg *msg, str *hdr);
|
|
|
|
/**
|
|
* Looks for the Call-ID header
|
|
* @param msg - the sip message
|
|
* @param hr - ptr to return the found hdr_field
|
|
* @returns the callid value
|
|
*/
|
|
int cscf_get_cseq(struct sip_msg *msg,struct hdr_field **hr);
|
|
|
|
/**
|
|
* Looks for the P-Called-Party-ID header and extracts the public identity from it
|
|
* @param msg - the sip message
|
|
* @param hr - ptr to return the found hdr_field
|
|
* @returns the P-Called_Party-ID
|
|
*/
|
|
str cscf_get_public_identity_from_called_party_id(struct sip_msg *msg,struct hdr_field **hr);
|
|
|
|
#endif
|
|
|