Asterisk - The Open Source Telephony Project GIT-master-0bf3178
Functions | Variables
res_pjsip_rfc3326.c File Reference
#include "asterisk.h"
#include <pjsip.h>
#include <pjsip_ua.h>
#include "asterisk/res_pjsip.h"
#include "asterisk/res_pjsip_session.h"
#include "asterisk/module.h"
#include "asterisk/causes.h"
#include "asterisk/threadpool.h"
Include dependency graph for res_pjsip_rfc3326.c:

Go to the source code of this file.

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static int load_module (void)
 
static void rfc3326_add_reason_header (struct ast_sip_session *session, struct pjsip_tx_data *tdata)
 
static int rfc3326_incoming_request (struct ast_sip_session *session, struct pjsip_rx_data *rdata)
 
static void rfc3326_incoming_response (struct ast_sip_session *session, struct pjsip_rx_data *rdata)
 
static void rfc3326_outgoing_request (struct ast_sip_session *session, struct pjsip_tx_data *tdata)
 
static void rfc3326_outgoing_response (struct ast_sip_session *session, struct pjsip_tx_data *tdata)
 
static void rfc3326_use_reason_header (struct ast_sip_session *session, struct pjsip_rx_data *rdata)
 
static int unload_module (void)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "PJSIP RFC3326 Support" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_APP_DEPEND, .requires = "res_pjsip,res_pjsip_session", }
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static struct ast_sip_session_supplement rfc3326_supplement
 

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 167 of file res_pjsip_rfc3326.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 167 of file res_pjsip_rfc3326.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 167 of file res_pjsip_rfc3326.c.

◆ load_module()

static int load_module ( void  )
static

Definition at line 149 of file res_pjsip_rfc3326.c.

150{
153}
@ AST_MODULE_LOAD_SUCCESS
Definition: module.h:70
static struct ast_sip_session_supplement rfc3326_supplement
#define ast_sip_session_register_supplement(supplement)

References AST_MODULE_LOAD_SUCCESS, ast_sip_session_register_supplement, and rfc3326_supplement.

◆ rfc3326_add_reason_header()

static void rfc3326_add_reason_header ( struct ast_sip_session session,
struct pjsip_tx_data *  tdata 
)
static

Definition at line 93 of file res_pjsip_rfc3326.c.

94{
95 char buf[20];
96
98 ast_sip_add_header(tdata, "Reason", "SIP;cause=200;text=\"Call completed elsewhere\"");
99 }
100
101 if (session->endpoint && session->endpoint->suppress_q850_reason_headers) {
102 ast_debug(1, "A Q.850 '%s'(%i) Reason header was suppressed for endpoint '%s'\n",
104 (ast_channel_hangupcause(session->channel) & 0x7f),
106 } else {
107 snprintf(buf, sizeof(buf), "Q.850;cause=%i", ast_channel_hangupcause(session->channel) & 0x7f);
108 ast_sip_add_header(tdata, "Reason", buf);
109 }
110}
static struct ast_mansession session
#define AST_CAUSE_ANSWERED_ELSEWHERE
Definition: causes.h:114
int ast_channel_hangupcause(const struct ast_channel *chan)
const char * ast_cause2str(int cause) attribute_pure
Gives the string form of a given cause code.
Definition: channel.c:612
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
#define ast_debug(level,...)
Log a DEBUG message.
int ast_sip_add_header(pjsip_tx_data *tdata, const char *name, const char *value)
Add a header to an outbound SIP message.
Definition: res_pjsip.c:2008
const char * ast_sorcery_object_get_id(const void *object)
Get the unique identifier of a sorcery object.
Definition: sorcery.c:2317

References ast_cause2str(), AST_CAUSE_ANSWERED_ELSEWHERE, ast_channel_hangupcause(), ast_debug, ast_sip_add_header(), ast_sorcery_object_get_id(), buf, and session.

Referenced by rfc3326_outgoing_request(), and rfc3326_outgoing_response().

◆ rfc3326_incoming_request()

static int rfc3326_incoming_request ( struct ast_sip_session session,
struct pjsip_rx_data *  rdata 
)
static

Definition at line 69 of file res_pjsip_rfc3326.c.

70{
71 if ((pjsip_method_cmp(&rdata->msg_info.msg->line.req.method, &pjsip_bye_method) &&
72 pjsip_method_cmp(&rdata->msg_info.msg->line.req.method, &pjsip_cancel_method)) ||
73 !session->channel) {
74 return 0;
75 }
76
78
79 return 0;
80}
static void rfc3326_use_reason_header(struct ast_sip_session *session, struct pjsip_rx_data *rdata)

References rfc3326_use_reason_header(), and session.

◆ rfc3326_incoming_response()

static void rfc3326_incoming_response ( struct ast_sip_session session,
struct pjsip_rx_data *  rdata 
)
static

Definition at line 82 of file res_pjsip_rfc3326.c.

83{
84 struct pjsip_status_line status = rdata->msg_info.msg->line.status;
85
86 if ((status.code < 300) || !session->channel) {
87 return;
88 }
89
91}
jack_status_t status
Definition: app_jack.c:146

References rfc3326_use_reason_header(), session, and status.

◆ rfc3326_outgoing_request()

static void rfc3326_outgoing_request ( struct ast_sip_session session,
struct pjsip_tx_data *  tdata 
)
static

Definition at line 112 of file res_pjsip_rfc3326.c.

113{
114 if ((pjsip_method_cmp(&tdata->msg->line.req.method, &pjsip_bye_method)
115 && pjsip_method_cmp(&tdata->msg->line.req.method, &pjsip_cancel_method))
116 || !session->channel
117 /*
118 * The session->channel has been seen to go away on us between
119 * checks so we must also be running under the call's serializer
120 * thread.
121 */
123 return;
124 }
125
127}
static void rfc3326_add_reason_header(struct ast_sip_session *session, struct pjsip_tx_data *tdata)
struct ast_taskprocessor * ast_threadpool_serializer_get_current(void)
Get the threadpool serializer currently associated with this thread.
Definition: threadpool.c:1393

References ast_threadpool_serializer_get_current(), rfc3326_add_reason_header(), and session.

◆ rfc3326_outgoing_response()

static void rfc3326_outgoing_response ( struct ast_sip_session session,
struct pjsip_tx_data *  tdata 
)
static

Definition at line 129 of file res_pjsip_rfc3326.c.

130{
131 struct pjsip_status_line status = tdata->msg->line.status;
132
133 if (status.code < 300
134 || !session->channel
136 return;
137 }
138
140}

References ast_threadpool_serializer_get_current(), rfc3326_add_reason_header(), session, and status.

◆ rfc3326_use_reason_header()

static void rfc3326_use_reason_header ( struct ast_sip_session session,
struct pjsip_rx_data *  rdata 
)
static

Definition at line 37 of file res_pjsip_rfc3326.c.

38{
39 static const pj_str_t str_reason = { "Reason", 6 };
40 pjsip_generic_string_hdr *header;
41 char buf[20];
42 char *cause;
43 int code_q850 = 0, code_sip = 0;
44
45 header = pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &str_reason, NULL);
46 for (; header;
47 header = pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &str_reason, header->next)) {
48 int cause_q850, cause_sip;
49 ast_copy_pj_str(buf, &header->hvalue, sizeof(buf));
50 cause = ast_skip_blanks(buf);
51
52 cause_q850 = !strncasecmp(cause, "Q.850", 5);
53 cause_sip = !strncasecmp(cause, "SIP", 3);
54 if ((cause_q850 || cause_sip) && (cause = strstr(cause, "cause="))) {
55 int *code = cause_q850 ? &code_q850 : &code_sip;
56 if (sscanf(cause, "cause=%30d", code) != 1) {
57 *code = 0;
58 }
59 }
60 }
61
62 if (code_q850) {
63 ast_channel_hangupcause_set(session->channel, code_q850 & 0x7f);
64 } else if (code_sip) {
66 }
67}
void ast_channel_hangupcause_set(struct ast_channel *chan, int value)
const int ast_sip_hangup_sip2cause(int cause)
Convert SIP hangup causes to Asterisk hangup causes.
Definition: res_pjsip.c:3531
void ast_copy_pj_str(char *dest, const pj_str_t *src, size_t size)
Copy a pj_str_t into a standard character buffer.
Definition: res_pjsip.c:2201
#define NULL
Definition: resample.c:96
char * ast_skip_blanks(const char *str)
Gets a pointer to the first non-whitespace character in a string.
Definition: strings.h:161
struct header * next

References ast_channel_hangupcause_set(), ast_copy_pj_str(), ast_sip_hangup_sip2cause(), ast_skip_blanks(), buf, header::next, NULL, and session.

Referenced by rfc3326_incoming_request(), and rfc3326_incoming_response().

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 155 of file res_pjsip_rfc3326.c.

156{
158 return 0;
159}
void ast_sip_session_unregister_supplement(struct ast_sip_session_supplement *supplement)
Unregister a an supplement to SIP session processing.
Definition: pjsip_session.c:63

References ast_sip_session_unregister_supplement(), and rfc3326_supplement.

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "PJSIP RFC3326 Support" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_APP_DEPEND, .requires = "res_pjsip,res_pjsip_session", }
static

Definition at line 167 of file res_pjsip_rfc3326.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 167 of file res_pjsip_rfc3326.c.

◆ rfc3326_supplement

struct ast_sip_session_supplement rfc3326_supplement
static

Definition at line 142 of file res_pjsip_rfc3326.c.

Referenced by load_module(), and unload_module().