fdd883623d5327b612d5a4241f18404c7f6017f0
[feed/telephony.git] / libs / pjproject / patches / 0031-transport-regression-fix.patch
1 From 9c6108ca392d5e0392e7fb5d2ffde85e3c44ce55 Mon Sep 17 00:00:00 2001
2 From: George Joseph <gjoseph@digium.com>
3 Date: Wed, 9 Oct 2019 07:50:32 -0600
4 Subject: [PATCH 31/31] transport regression fix
5
6 ---
7 pjsip/src/pjsip/sip_transport.c | 73 +++++++++++++++++++++++++++------
8 1 file changed, 61 insertions(+), 12 deletions(-)
9
10 diff --git a/pjsip/src/pjsip/sip_transport.c b/pjsip/src/pjsip/sip_transport.c
11 index 65ac823d4..da6b70e50 100644
12 --- a/pjsip/src/pjsip/sip_transport.c
13 +++ b/pjsip/src/pjsip/sip_transport.c
14 @@ -50,6 +50,24 @@ static const char *addr_string(const pj_sockaddr_t *addr)
15 str, sizeof(str));
16 return str;
17 }
18 +static const char* print_tpsel_info(const pjsip_tpselector *sel)
19 +{
20 + static char tpsel_info_buf[80];
21 + if (!sel) return "(null)";
22 + if (sel->type==PJSIP_TPSELECTOR_LISTENER)
23 + pj_ansi_snprintf(tpsel_info_buf, sizeof(tpsel_info_buf),
24 + "listener[%s], reuse=%d", sel->u.listener->obj_name,
25 + !sel->disable_connection_reuse);
26 + else if (sel->type==PJSIP_TPSELECTOR_TRANSPORT)
27 + pj_ansi_snprintf(tpsel_info_buf, sizeof(tpsel_info_buf),
28 + "transport[%s], reuse=%d", sel->u.transport->info,
29 + !sel->disable_connection_reuse);
30 + else
31 + pj_ansi_snprintf(tpsel_info_buf, sizeof(tpsel_info_buf),
32 + "unknown[%p], reuse=%d", sel->u.ptr,
33 + !sel->disable_connection_reuse);
34 + return tpsel_info_buf;
35 +}
36 #else
37 # define TRACE_(x)
38 #endif
39 @@ -1210,10 +1228,14 @@ PJ_DEF(pj_status_t) pjsip_transport_register( pjsip_tpmgr *mgr,
40 * new transport to the list.
41 */
42 pj_list_push_back(tp_ref, tp_add);
43 + TRACE_((THIS_FILE, "Remote address already registered, "
44 + "appended the transport to the list"));
45 } else {
46 /* Transport list not found, add it to the hash table. */
47 pj_hash_set_np(mgr->table, &tp->key, key_len, hval, tp_add->tp_buf,
48 tp_add);
49 + TRACE_((THIS_FILE, "Remote address not registered, "
50 + "added the transport to the hash"));
51 }
52
53 /* Add ref transport group lock, if any */
54 @@ -1283,6 +1305,13 @@ static pj_status_t destroy_transport( pjsip_tpmgr *mgr,
55 /* The transport list has multiple entry. */
56 pj_hash_set_np(mgr->table, &tp_next->tp->key, key_len,
57 hval, tp_next->tp_buf, tp_next);
58 + TRACE_((THIS_FILE, "Hash entry updated after "
59 + "transport %d being destroyed",
60 + tp->obj_name));
61 + } else {
62 + TRACE_((THIS_FILE, "Hash entry deleted after "
63 + "transport %d being destroyed",
64 + tp->obj_name));
65 }
66 }
67
68 @@ -1294,6 +1323,14 @@ static pj_status_t destroy_transport( pjsip_tpmgr *mgr,
69 }
70 tp_iter = tp_iter->next;
71 } while (tp_iter != tp_ref);
72 +
73 + if (tp_iter->tp != tp) {
74 + PJ_LOG(3, (THIS_FILE, "Warning: transport %s being destroyed is "
75 + "not registered", tp->obj_name));
76 + }
77 + } else {
78 + PJ_LOG(3, (THIS_FILE, "Warning: transport %s being destroyed is "
79 + "not found in the hash table", tp->obj_name));
80 }
81
82 pj_lock_release(mgr->lock);
83 @@ -2159,6 +2196,7 @@ PJ_DEF(pj_status_t) pjsip_tpmgr_acquire_transport(pjsip_tpmgr *mgr,
84 NULL, tp);
85 }
86
87 +
88 /*
89 * pjsip_tpmgr_acquire_transport2()
90 *
91 @@ -2176,8 +2214,9 @@ PJ_DEF(pj_status_t) pjsip_tpmgr_acquire_transport2(pjsip_tpmgr *mgr,
92 pjsip_tpfactory *factory;
93 pj_status_t status;
94
95 - TRACE_((THIS_FILE,"Acquiring transport type=%s, remote=%s:%d",
96 + TRACE_((THIS_FILE,"Acquiring transport type=%s, sel=%s remote=%s:%d",
97 pjsip_transport_get_type_name(type),
98 + print_tpsel_info(sel),
99 addr_string(remote),
100 pj_sockaddr_get_port(remote)));
101
102 @@ -2194,6 +2233,7 @@ PJ_DEF(pj_status_t) pjsip_tpmgr_acquire_transport2(pjsip_tpmgr *mgr,
103 /* See if the transport is (not) suitable */
104 if (seltp->key.type != type) {
105 pj_lock_release(mgr->lock);
106 + TRACE_((THIS_FILE, "Transport type in tpsel not matched"));
107 return PJSIP_ETPNOTSUITABLE;
108 }
109
110 @@ -2234,6 +2274,7 @@ PJ_DEF(pj_status_t) pjsip_tpmgr_acquire_transport2(pjsip_tpmgr *mgr,
111 {
112 if (sel->u.listener->type != type) {
113 pj_lock_release(mgr->lock);
114 + TRACE_((THIS_FILE, "Listener type in tpsel not matched"));
115 return PJSIP_ETPNOTSUITABLE;
116 }
117 }
118 @@ -2249,21 +2290,25 @@ PJ_DEF(pj_status_t) pjsip_tpmgr_acquire_transport2(pjsip_tpmgr *mgr,
119 tp_entry = (transport *)pj_hash_get(mgr->table, &key, key_len,
120 NULL);
121 if (tp_entry) {
122 - if (sel && sel->type == PJSIP_TPSELECTOR_LISTENER) {
123 - transport *tp_iter = tp_entry;
124 - do {
125 + transport *tp_iter = tp_entry;
126 + do {
127 + /* Don't use transport being shutdown */
128 + if (!tp_iter->tp->is_shutdown) {
129 if (sel && sel->type == PJSIP_TPSELECTOR_LISTENER &&
130 - sel->u.listener &&
131 - tp_iter->tp->factory == sel->u.listener)
132 + sel->u.listener)
133 {
134 + /* Match listener if selector is set */
135 + if (tp_iter->tp->factory == sel->u.listener) {
136 + tp_ref = tp_iter->tp;
137 + break;
138 + }
139 + } else {
140 tp_ref = tp_iter->tp;
141 break;
142 }
143 - tp_iter = tp_iter->next;
144 - } while (tp_iter != tp_entry);
145 - } else {
146 - tp_ref = tp_entry->tp;
147 - }
148 + }
149 + tp_iter = tp_iter->next;
150 + } while (tp_iter != tp_entry);
151 }
152 }
153
154 @@ -2276,7 +2321,7 @@ PJ_DEF(pj_status_t) pjsip_tpmgr_acquire_transport2(pjsip_tpmgr *mgr,
155
156 /* Ignore address for loop transports. */
157 if (type == PJSIP_TRANSPORT_LOOP ||
158 - type == PJSIP_TRANSPORT_LOOP_DGRAM)
159 + type == PJSIP_TRANSPORT_LOOP_DGRAM)
160 {
161 pj_sockaddr *addr = &key.rem_addr;
162
163 @@ -2315,6 +2360,7 @@ PJ_DEF(pj_status_t) pjsip_tpmgr_acquire_transport2(pjsip_tpmgr *mgr,
164 * 'duplicate' of the existing transport (same type & remote addr,
165 * but different factory).
166 */
167 + TRACE_((THIS_FILE, "Transport found but from different listener"));
168 }
169
170 if (tp_ref!=NULL && !tp_ref->is_shutdown) {
171 @@ -2347,10 +2393,13 @@ PJ_DEF(pj_status_t) pjsip_tpmgr_acquire_transport2(pjsip_tpmgr *mgr,
172 */
173
174 /* Verify that the listener type matches the destination type */
175 + /* Already checked above. */
176 + /*
177 if (sel->u.listener->type != type) {
178 pj_lock_release(mgr->lock);
179 return PJSIP_ETPNOTSUITABLE;
180 }
181 + */
182
183 /* We'll use this listener to create transport */
184 factory = sel->u.listener;
185 --
186 2.21.0
187