@@ -1193,19 +1193,19 @@ static void http_req_handler(struct http_conn *hc, const struct http_msg *msg,
1193
1193
/**
1194
1194
* Add a SIP transport
1195
1195
*
1196
- * @param sip SIP stack instance
1197
- * @param tp SIP Transport
1198
- * @param laddr Local network address
1199
- * @param ... Optional transport parameters such as TLS context
1196
+ * @param sip SIP stack instance
1197
+ * @param tp SIP Transport
1198
+ * @param listen True to open listening socket (UDP socket always opened)
1199
+ * @param laddr Local network address
1200
+ * @param ap Optional transport parameters such as TLS context
1200
1201
*
1201
1202
* @return 0 if success, otherwise errorcode
1202
1203
*/
1203
- int sip_transp_add (struct sip * sip , enum sip_transp tp ,
1204
- const struct sa * laddr , ... )
1204
+ static int add_transp (struct sip * sip , enum sip_transp tp ,
1205
+ bool listen , const struct sa * laddr , va_list ap )
1205
1206
{
1206
1207
struct sip_transport * transp ;
1207
1208
struct tls * tls ;
1208
- va_list ap ;
1209
1209
int err = 0 ;
1210
1210
1211
1211
if (!sip || !laddr || !sa_isset (laddr , SA_ADDR ))
@@ -1227,8 +1227,6 @@ int sip_transp_add(struct sip *sip, enum sip_transp tp,
1227
1227
transp -> sip = sip ;
1228
1228
transp -> tp = tp ;
1229
1229
1230
- va_start (ap , laddr );
1231
-
1232
1230
switch (tp ) {
1233
1231
1234
1232
case SIP_TRANSP_UDP :
@@ -1252,6 +1250,13 @@ int sip_transp_add(struct sip *sip, enum sip_transp tp,
1252
1250
/*@fallthrough@*/
1253
1251
1254
1252
case SIP_TRANSP_TCP :
1253
+
1254
+ if (!listen ) {
1255
+ transp -> laddr = * laddr ;
1256
+ sa_set_port (& transp -> laddr , 0 );
1257
+ return err ;
1258
+ }
1259
+
1255
1260
err = tcp_listen ((struct tcp_sock * * )& transp -> sock , laddr ,
1256
1261
tcp_connect_handler , transp );
1257
1262
if (err )
@@ -1265,15 +1270,64 @@ int sip_transp_add(struct sip *sip, enum sip_transp tp,
1265
1270
break ;
1266
1271
}
1267
1272
1268
- va_end (ap );
1269
-
1270
1273
if (err )
1271
1274
mem_deref (transp );
1272
1275
1273
1276
return err ;
1274
1277
}
1275
1278
1276
1279
1280
+ /**
1281
+ * Add a SIP transport
1282
+ *
1283
+ * @param sip SIP stack instance
1284
+ * @param tp SIP Transport
1285
+ * @param laddr Local network address
1286
+ * @param ... Optional transport parameters such as TLS context
1287
+ *
1288
+ * @return 0 if success, otherwise errorcode
1289
+ */
1290
+ int sip_transp_add (struct sip * sip , enum sip_transp tp ,
1291
+ const struct sa * laddr , ...)
1292
+ {
1293
+ int err ;
1294
+ va_list ap ;
1295
+
1296
+ va_start (ap , laddr );
1297
+ err = add_transp (sip , tp , true, laddr , ap );
1298
+ va_end (ap );
1299
+
1300
+ return err ;
1301
+ }
1302
+
1303
+
1304
+ /**
1305
+ * Add a SIP transport and open listening socket if requested
1306
+ *
1307
+ * UDP socket will always be opened even if listen is false.
1308
+ *
1309
+ * @param sip SIP stack instance
1310
+ * @param tp SIP Transport
1311
+ * @param listen True to open listening socket
1312
+ * @param laddr Local network address
1313
+ * @param ... Optional transport parameters such as TLS context
1314
+ *
1315
+ * @return 0 if success, otherwise errorcode
1316
+ */
1317
+ int sip_transp_add_sock (struct sip * sip , enum sip_transp tp ,
1318
+ bool listen , const struct sa * laddr , ...)
1319
+ {
1320
+ int err ;
1321
+ va_list ap ;
1322
+
1323
+ va_start (ap , laddr );
1324
+ err = add_transp (sip , tp , listen , laddr , ap );
1325
+ va_end (ap );
1326
+
1327
+ return err ;
1328
+ }
1329
+
1330
+
1277
1331
/**
1278
1332
* Add a SIP websocket transport
1279
1333
*
@@ -1768,11 +1822,30 @@ int sip_settos(struct sip *sip, uint8_t tos)
1768
1822
}
1769
1823
1770
1824
1825
+ static void sip_transports_print (struct re_printf * pf , const struct sip * sip )
1826
+ {
1827
+ uint32_t mask = 0 ;
1828
+
1829
+ for (struct le * le = sip -> transpl .head ; le ; le = le -> next ) {
1830
+ const struct sip_transport * transp = le -> data ;
1831
+ mask |= (1 << transp -> tp );
1832
+ }
1833
+
1834
+ for (uint8_t i = 0 ; i < SIP_TRANSPC ; ++ i ) {
1835
+ if (mask == 0 || (0 != (mask & (1u << i ))))
1836
+ (void )re_hprintf (pf , " %s\n" , sip_transp_name (i ));
1837
+ }
1838
+ }
1839
+
1840
+
1771
1841
static bool debug_handler (struct le * le , void * arg )
1772
1842
{
1773
1843
const struct sip_transport * transp = le -> data ;
1774
1844
struct re_printf * pf = arg ;
1775
1845
1846
+ if (sa_port (& transp -> laddr ) == 0 )
1847
+ return false;
1848
+
1776
1849
(void )re_hprintf (pf , " %J (%s)\n" ,
1777
1850
& transp -> laddr ,
1778
1851
sip_transp_name (transp -> tp ));
@@ -1813,6 +1886,9 @@ int sip_transp_debug(struct re_printf *pf, const struct sip *sip)
1813
1886
int err ;
1814
1887
1815
1888
err = re_hprintf (pf , "transports:\n" );
1889
+ sip_transports_print (pf , sip );
1890
+
1891
+ err |= re_hprintf (pf , "transport sockets:\n" );
1816
1892
list_apply (& sip -> transpl , true, debug_handler , pf );
1817
1893
1818
1894
err |= re_hprintf (pf , "connections:\n" );
0 commit comments