Skip to content

Commit 6579acf

Browse files
transp.c: add sip_transp_add_sock
to add SIP transport protocol without opening a listening socket and adapt sip_transp_send accordingly to make UDP work.
1 parent b8b8872 commit 6579acf

File tree

2 files changed

+89
-11
lines changed

2 files changed

+89
-11
lines changed

include/re_sip.h

+2
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,8 @@ void sip_set_trace_handler(struct sip *sip, sip_trace_h *traceh);
311311
/* transport */
312312
int sip_transp_add(struct sip *sip, enum sip_transp tp,
313313
const struct sa *laddr, ...);
314+
int sip_transp_add_sock(struct sip *sip, enum sip_transp tp,
315+
bool listen, const struct sa *laddr, ...);
314316
int sip_transp_add_websock(struct sip *sip, enum sip_transp tp,
315317
const struct sa *laddr,
316318
bool server, const char *cert, struct tls *tls);

src/sip/transp.c

+87-11
Original file line numberDiff line numberDiff line change
@@ -1193,19 +1193,19 @@ static void http_req_handler(struct http_conn *hc, const struct http_msg *msg,
11931193
/**
11941194
* Add a SIP transport
11951195
*
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
12001201
*
12011202
* @return 0 if success, otherwise errorcode
12021203
*/
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)
12051206
{
12061207
struct sip_transport *transp;
12071208
struct tls *tls;
1208-
va_list ap;
12091209
int err = 0;
12101210

12111211
if (!sip || !laddr || !sa_isset(laddr, SA_ADDR))
@@ -1227,8 +1227,6 @@ int sip_transp_add(struct sip *sip, enum sip_transp tp,
12271227
transp->sip = sip;
12281228
transp->tp = tp;
12291229

1230-
va_start(ap, laddr);
1231-
12321230
switch (tp) {
12331231

12341232
case SIP_TRANSP_UDP:
@@ -1252,6 +1250,13 @@ int sip_transp_add(struct sip *sip, enum sip_transp tp,
12521250
/*@fallthrough@*/
12531251

12541252
case SIP_TRANSP_TCP:
1253+
1254+
if (!listen) {
1255+
transp->laddr = *laddr;
1256+
sa_set_port(&transp->laddr, 0);
1257+
return err;
1258+
}
1259+
12551260
err = tcp_listen((struct tcp_sock **)&transp->sock, laddr,
12561261
tcp_connect_handler, transp);
12571262
if (err)
@@ -1265,15 +1270,64 @@ int sip_transp_add(struct sip *sip, enum sip_transp tp,
12651270
break;
12661271
}
12671272

1268-
va_end(ap);
1269-
12701273
if (err)
12711274
mem_deref(transp);
12721275

12731276
return err;
12741277
}
12751278

12761279

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+
12771331
/**
12781332
* Add a SIP websocket transport
12791333
*
@@ -1768,11 +1822,30 @@ int sip_settos(struct sip *sip, uint8_t tos)
17681822
}
17691823

17701824

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+
17711841
static bool debug_handler(struct le *le, void *arg)
17721842
{
17731843
const struct sip_transport *transp = le->data;
17741844
struct re_printf *pf = arg;
17751845

1846+
if (sa_port(&transp->laddr) == 0)
1847+
return false;
1848+
17761849
(void)re_hprintf(pf, " %J (%s)\n",
17771850
&transp->laddr,
17781851
sip_transp_name(transp->tp));
@@ -1813,6 +1886,9 @@ int sip_transp_debug(struct re_printf *pf, const struct sip *sip)
18131886
int err;
18141887

18151888
err = re_hprintf(pf, "transports:\n");
1889+
sip_transports_print(pf, sip);
1890+
1891+
err |= re_hprintf(pf, "transport sockets:\n");
18161892
list_apply(&sip->transpl, true, debug_handler, pf);
18171893

18181894
err |= re_hprintf(pf, "connections:\n");

0 commit comments

Comments
 (0)