Asterisk - The Open Source Telephony Project GIT-master-20e40a9
Loading...
Searching...
No Matches
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 = ASTERISK_GPL_KEY , .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:2381

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:149

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.

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:3570
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:2240
#define NULL
Definition resample.c:96
char *attribute_pure 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.

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 = ASTERISK_GPL_KEY , .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.

142 {
143 .incoming_request = rfc3326_incoming_request,
144 .incoming_response = rfc3326_incoming_response,
145 .outgoing_request = rfc3326_outgoing_request,
146 .outgoing_response = rfc3326_outgoing_response,
147};
static void rfc3326_outgoing_response(struct ast_sip_session *session, struct pjsip_tx_data *tdata)
static void rfc3326_outgoing_request(struct ast_sip_session *session, struct pjsip_tx_data *tdata)
static void rfc3326_incoming_response(struct ast_sip_session *session, struct pjsip_rx_data *rdata)
static int rfc3326_incoming_request(struct ast_sip_session *session, struct pjsip_rx_data *rdata)

Referenced by load_module(), and unload_module().