summaryrefslogtreecommitdiff
path: root/pjsip/src
diff options
context:
space:
mode:
authorLiong Sauw Ming <ming@teluu.com>2015-05-18 04:42:42 +0000
committerLiong Sauw Ming <ming@teluu.com>2015-05-18 04:42:42 +0000
commit476a04aca75f9b49813db98744a3214d41aef2d2 (patch)
treef54c87741d1fde1f989c1df8be0cd547c7f50d14 /pjsip/src
parentf33fab4fc22321a8c4e19015f9a11b6299272e3e (diff)
Fixed #1853: Add callback for dropped data in SIP transport
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5097 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src')
-rw-r--r--pjsip/src/pjsip/sip_transport.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/pjsip/src/pjsip/sip_transport.c b/pjsip/src/pjsip/sip_transport.c
index 2913053b..7c837168 100644
--- a/pjsip/src/pjsip/sip_transport.c
+++ b/pjsip/src/pjsip/sip_transport.c
@@ -99,6 +99,7 @@ struct pjsip_tpmgr
void (*on_rx_msg)(pjsip_endpoint*, pj_status_t, pjsip_rx_data*);
pj_status_t (*on_tx_msg)(pjsip_endpoint*, pjsip_tx_data*);
pjsip_tp_state_callback tp_state_cb;
+ pjsip_tp_on_rx_dropped_cb tp_drop_data_cb;
/* Transmit data list, for transmit data cleanup when transport manager
* is destroyed.
@@ -1693,6 +1694,18 @@ PJ_DEF(pj_ssize_t) pjsip_tpmgr_receive_packet( pjsip_tpmgr *mgr,
if (p!=current_pkt) {
remaining_len -= (p - current_pkt);
total_processed += (p - current_pkt);
+
+ /* Notify application about the dropped newlines */
+ if (mgr->tp_drop_data_cb) {
+ pjsip_tp_dropped_data dd;
+ pj_bzero(&dd, sizeof(dd));
+ dd.tp = tr;
+ dd.data = current_pkt;
+ dd.len = p - current_pkt;
+ dd.status = PJ_EIGNORED;
+ (*mgr->tp_drop_data_cb)(&dd);
+ }
+
current_pkt = p;
if (remaining_len == 0) {
return total_processed;
@@ -1719,6 +1732,18 @@ PJ_DEF(pj_ssize_t) pjsip_tpmgr_receive_packet( pjsip_tpmgr *mgr,
if (msg_status != PJ_SUCCESS) {
if (remaining_len == PJSIP_MAX_PKT_LEN) {
mgr->on_rx_msg(mgr->endpt, PJSIP_ERXOVERFLOW, rdata);
+
+ /* Notify application about the message overflow */
+ if (mgr->tp_drop_data_cb) {
+ pjsip_tp_dropped_data dd;
+ pj_bzero(&dd, sizeof(dd));
+ dd.tp = tr;
+ dd.data = current_pkt;
+ dd.len = msg_fragment_size;
+ dd.status = PJSIP_ERXOVERFLOW;
+ (*mgr->tp_drop_data_cb)(&dd);
+ }
+
/* Exhaust all data. */
return rdata->pkt_info.len;
} else {
@@ -1783,6 +1808,20 @@ PJ_DEF(pj_ssize_t) pjsip_tpmgr_receive_packet( pjsip_tpmgr *mgr,
rdata->msg_info.msg_buf));
}
+ /* Notify application about the dropped data (syntax error) */
+ if (tmp.slen && mgr->tp_drop_data_cb) {
+ pjsip_tp_dropped_data dd;
+ pj_bzero(&dd, sizeof(dd));
+ dd.tp = tr;
+ dd.data = current_pkt;
+ dd.len = msg_fragment_size;
+ dd.status = PJSIP_EINVALIDMSG;
+ (*mgr->tp_drop_data_cb)(&dd);
+
+ if (dd.len > 0 && dd.len < msg_fragment_size)
+ msg_fragment_size = dd.len;
+ }
+
goto finish_process_fragment;
}
@@ -2265,3 +2304,16 @@ PJ_DEF(pj_status_t) pjsip_transport_remove_state_listener (
return PJ_SUCCESS;
}
+
+/*
+ * Set callback of data dropping.
+ */
+PJ_DEF(pj_status_t) pjsip_tpmgr_set_drop_data_cb(pjsip_tpmgr *mgr,
+ pjsip_tp_on_rx_dropped_cb cb)
+{
+ PJ_ASSERT_RETURN(mgr, PJ_EINVAL);
+
+ mgr->tp_drop_data_cb = cb;
+
+ return PJ_SUCCESS;
+}