Lines 1-187
Link Here
|
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 |
--- pjsip/src/pjsip/sip_transport.c |
13 |
+++ 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 |
|