1 /*
2 * This file is part of the Sofia-SIP package
3 *
4 * Copyright (C) 2005 Nokia Corporation.
5 *
6 * Contact: Pekka Pessi <pekka.pessi@nokia.com>
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public License
10 * as published by the Free Software Foundation; either version 2.1 of
11 * the License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
21 * 02110-1301 USA
22 *
23 */
24
25 /**@CFILE soa_tag.c Tags and tag lists for Offer/Answer Engine
26 *
27 * @author Pekka Pessi <Pekka.Pessi@nokia.com>
28 *
29 * @date Created: Wed Aug 3 20:28:17 EEST 2005
30 */
31
32 #include "config.h"
33
34 #include <sofia-sip/su.h>
35
36 #if 1
37 #define TAG_NAMESPACE soa_tag_namespace
38 #else
39 /* Definition used by tag_dll.awk */
40 #define TAG_NAMESPACE "soa"
41 #endif
42
43 #include <sofia-sip/soa.h>
44 #include <sofia-sip/soa_tag.h>
45
46 #include <sofia-sip/su_tag_class.h>
47 #include <sofia-sip/sdp_tag.h>
48
49 #include <string.h>
50
51 char const soa_tag_namespace[] = "soa";
52
53 /** Filter soa tags. */
soa_tag_filter(tagi_t const * f,tagi_t const * t)54 int soa_tag_filter(tagi_t const *f, tagi_t const *t)
55 {
56 char const *ns;
57
58 if (!t || !t->t_tag)
59 return 0;
60
61 ns = t->t_tag->tt_ns;
62 if (!ns)
63 return 0;
64
65 return ns == soa_tag_namespace || strcmp(ns, soa_tag_namespace) == 0;
66 }
67
68 /**@def SOATAG_ANY()
69 *
70 * Filter tag matching any SOATAG_*() item.
71 */
72 tag_typedef_t soatag_any = NSTAG_TYPEDEF(*);
73
74 /**@def SOATAG_CAPS_SDP(x)
75 * Pass parsed capability description to soa session object.
76 *
77 * @par Used with
78 * soa_set_params() \n
79 * soa_get_params() \n
80 *
81 * @par Parameter type
82 * #sdp_session_t *
83 *
84 * @par Values
85 * #sdp_session_t describing @soa capabilities
86 *
87 * Corresponding tag taking reference parameter is SOATAG_CAPS_SDP_REF()
88 */
89 tag_typedef_t soatag_caps_sdp = SDPTAG_TYPEDEF(caps_sdp);
90
91 /**@def SOATAG_CAPS_SDP_STR(x)
92 * Pass capability description to @soa session object.
93 *
94 * @par Used with
95 * soa_set_param() \n
96 * soa_get_params() \n
97 *
98 * @par Parameter type
99 * char const *
100 *
101 * @par Values
102 * String containing SDP description of @soa capabilities
103 *
104 * Corresponding tag taking reference parameter is SOATAG_CAPS_SDP_STR_REF()
105 */
106 tag_typedef_t soatag_caps_sdp_str = STRTAG_TYPEDEF(caps_sdp_str);
107
108 /**@def SOATAG_LOCAL_SDP(x)
109 * Get parsed local session description from soa session object.
110 *
111 * @par Used with
112 * soa_get_params(), soa_get_paramlist() \n
113 *
114 * @par Parameter type
115 * #sdp_session_t *
116 *
117 * @par Values
118 * pointer to #sdp_session_t.
119 *
120 * Corresponding tag taking reference parameter is SOATAG_LOCAL_SDP_REF()
121 *
122 * @sa soa_get_local_sdp(), SOATAG_LOCAL_SDP_STR(), SOATAG_USER_SDP(),
123 * SOATAG_USER_SDP_STR().
124 */
125 tag_typedef_t soatag_local_sdp = SDPTAG_TYPEDEF(local_sdp);
126
127 /**@def SOATAG_LOCAL_SDP_STR(x)
128 * Get local session description as a string from soa session object.
129 *
130 * @par Used with
131 * soa_get_params(), soa_get_paramlist() \n
132 *
133 * @par Parameter type
134 * char const *
135 *
136 * @par Values
137 * String containing SDP offer or answer.
138 *
139 * Corresponding tag taking reference parameter is SOATAG_LOCAL_SDP_STR_REF()..
140 *
141 * @sa soa_get_local_sdp(), SOATAG_LOCAL_SDP(),
142 * SOATAG_USER_SDP(), SOATAG_USER_SDP_STR().
143 */
144 tag_typedef_t soatag_local_sdp_str = STRTAG_TYPEDEF(local_sdp_str);
145
146 /**@def SOATAG_REMOTE_SDP(x)
147 * Pass parsed remote session description to soa session object.
148 *
149 * @par Used with
150 * soa_get_params(), soa_get_paramlist() \n
151 *
152 * @par Parameter type
153 * #sdp_session_t *
154 *
155 * @par Values
156 * pointer to #sdp_session_t.
157 *
158 * Corresponding tag taking reference parameter is SOATAG_REMOTE_SDP_REF()
159 *
160 * @sa soa_set_remote_sdp(), soa_get_remote_sdp(), SOATAG_REMOTE_SDP_STR(),
161 * SOATAG_LOCAL_SDP(), SOATAG_LOCAL_SDP_STR().
162 */
163 tag_typedef_t soatag_remote_sdp = SDPTAG_TYPEDEF(remote_sdp);
164
165 /**@def SOATAG_REMOTE_SDP_STR(x)
166 * Pass media description file name to the NUA stack.
167 *
168 * Pass name of media description file that contains media templates
169 * (normally mss.sdp) to the NUA stack.
170 *
171 * @par Used with
172 * soa_get_params(), soa_get_paramlist() \n
173 *
174 * @par Parameter type
175 * char const *
176 *
177 * @par Values
178 * String containing SDP description received from remote end.
179 *
180 * Corresponding tag taking reference parameter is SOATAG_REMOTE_SDP_STR_REF()
181 *
182 * @sa soa_set_remote_sdp(), soa_get_remote_sdp(), SOATAG_REMOTE_SDP(),
183 * SOATAG_LOCAL_SDP(), SOATAG_LOCAL_SDP_STR().
184 */
185 tag_typedef_t soatag_remote_sdp_str = STRTAG_TYPEDEF(remote_sdp_str);
186
187 /**@def SOATAG_USER_SDP(x)
188 * Pass parsed user session description to soa session object.
189 *
190 * User SDP is used as basis for SDP Offer/Answer negotiation. It can be
191 * very minimal, consisting just sdp_session_t structures, sdp_media_t
192 * structures and sdp_rtpmap_t structures listing te supported media, used
193 * RTP port number, and RTP payload descriptions of supported codecs.
194 *
195 * When generating the offer or answer the user SDP is augmented with the
196 * required SDP lines (v=, o=, t=, c=, a=rtpmap, etc.) as required. The
197 * complete offer or answer generated by @soa is passed in
198 * SOATAG_LOCAL_SDP() (SOATAG_LOCAL_SDP_STR() contains same in text format).
199 *
200 * @par Used with
201 * soa_set_params(), soa_get_params(), soa_get_paramlist() \n
202 *
203 * @par Parameter type
204 * #sdp_session_t *
205 *
206 * @par Values
207 * pointer to #sdp_session_t.
208 *
209 * Corresponding tag taking reference parameter is SOATAG_USER_SDP_REF()
210 *
211 * @sa soa_set_user_sdp(), soa_get_user_sdp(), SOATAG_USER_SDP_STR(),
212 * SOATAG_LOCAL_SDP(), SOATAG_LOCAL_SDP_STR().
213 */
214 tag_typedef_t soatag_user_sdp = SDPTAG_TYPEDEF(user_sdp);
215
216 /**@def SOATAG_USER_SDP_STR(x)
217 * Pass unparsed user session description to soa session object.
218 *
219 * User SDP is used as basis for SDP Offer/Answer negotiation. It can be
220 * very minimal, listing just m= lines with the port numbers and RTP payload
221 * numbers of supported codecs, like
222 * @code
223 * SOATAG_USER_SDP_STR("m=audio 5004 RTP/AVP 0 8")
224 * @endcode
225 * When generating the offer or answer the user SDP is augmented with the
226 * required SDP lines (v=, o=, t=, c=, a=rtpmap, etc.) as required. The
227 * complete offer or answer generated by @soa is passed in
228 * SOATAG_LOCAL_SDP_STR() (SOATAG_LOCAL_SDP() contains session in parsed
229 * format).
230 *
231 * @par Used with
232 * soa_set_params(), soa_get_params(), soa_get_paramlist() \n
233 *
234 * @par Parameter type
235 * char const *
236 *
237 * @par Values
238 * String containing minimal SDP description.
239 *
240 * Corresponding tag taking reference parameter is SOATAG_USER_SDP_STR_REF()
241 *
242 * @sa soa_set_user_sdp(), soa_get_user_sdp(), SOATAG_USER_SDP(),
243 * SOATAG_LOCAL_SDP(), SOATAG_LOCAL_SDP_STR()
244 */
245 tag_typedef_t soatag_user_sdp_str = STRTAG_TYPEDEF(user_sdp_str);
246
247 /**@def SOATAG_AF(x)
248 *
249 * Preferred address family for media.
250 *
251 * @par Used with
252 * soa_set_params(), soa_get_params(), soa_get_paramlist() \n
253 *
254 * @par Parameter type
255 * enum #soa_af {
256 * #SOA_AF_ANY,
257 * #SOA_AF_IP4_ONLY, #SOA_AF_IP6_ONLY,
258 * #SOA_AF_IP4_IP6, #SOA_AF_IP6_IP4
259 * }
260 *
261 * @par Values
262 * - #SOA_AF_ANY (0) any address family (default)
263 * - #SOA_AF_IP4_ONLY (1) only IP version 4
264 * - #SOA_AF_IP6_ONLY (2) only IP version 6
265 * - #SOA_AF_IP4_IP6 (3) either IP version 4 or 6, version 4 preferred
266 * - #SOA_AF_IP6_IP4 (4) either IP version 4 or 6, version 6 preferred
267 *
268 * Corresponding tag taking reference parameter is SOATAG_AF_REF()
269 *
270 * @sa SOATAG_ADDRESS()
271 */
272 tag_typedef_t soatag_af = INTTAG_TYPEDEF(af);
273
274
275 /**@def SOATAG_ADDRESS(x)
276 *
277 * Pass media address.
278 *
279 * @par Used with
280 * soa_set_params(), soa_get_params(), soa_get_paramlist() \n
281 *
282 * @par Parameter type
283 * char const *
284 *
285 * @par Values
286 * NUL-terminated C string containing a domain name,
287 * IPv4 address, or IPv6 address.
288 *
289 * Corresponding tag taking reference parameter is SOATAG_ADDRESS_REF()
290 *
291 * @sa SOATAG_AF()
292 */
293 tag_typedef_t soatag_address = STRTAG_TYPEDEF(address);
294
295
296 /**@def SOATAG_RTP_SELECT(x)
297 *
298 * When generating answer or second offer, @soa can include all the supported
299 * codecs, only one codec, or only the codecs supported by both ends in the
300 * list of payload types on the m= line.
301 *
302 * @par Used with
303 * soa_set_params(), soa_get_params(), soa_get_paramlist() \n
304 *
305 * @par Parameter type
306 * enum {
307 * #SOA_RTP_SELECT_SINGLE, #SOA_RTP_SELECT_COMMON, #SOA_RTP_SELECT_ALL
308 * } \n
309 * (int in range 0..2)
310 *
311 * @par Values
312 * - #SOA_RTP_SELECT_SINGLE (0) - select the best common codec
313 * - #SOA_RTP_SELECT_COMMON (1) - select all common codecs
314 * - #SOA_RTP_SELECT_ALL (2) - select all local codecs
315 *
316 * The default value is 0, only one RTP codec is selected. Note, however,
317 * that if there is no common codec (no local codec is supported by remote
318 * end), all the codecs are included in the list. In that case the media
319 * line is rejected, too, unless SOATAG_RTP_MISMATCH(1) has been used.
320 *
321 * Corresponding tag taking a reference parameter is SOATAG_RTP_SELECT_REF().
322 *
323 * @sa SOATAG_RTP_MISMATCH(), SOATAG_RTP_SORT(), SOATAG_AUDIO_AUX()
324 */
325 tag_typedef_t soatag_rtp_select = INTTAG_TYPEDEF(rtp_select);
326
327
328 /**@def SOATAG_AUDIO_AUX(x)
329 *
330 * The named audio codecs are considered auxiliary, that is, they are
331 * considered as common codec only when they are the only codec listed on
332 * the media line.
333 *
334 * When generating answer or second offer soa includes auxiliary audio
335 * codecs in the list of codecs even if it is selecting only one codec or
336 * common codecs.
337 *
338 * @par Used with
339 * soa_set_params(), soa_get_params(), soa_get_paramlist() \n
340 *
341 * @par Parameter type
342 * A string with whitespace separated list of codec names.
343 *
344 * @par Values
345 * E.g., "telephone-event cn".
346 *
347 * By default, there are no auxiliary audio codecs.
348 *
349 * Corresponding tag taking a reference parameter is
350 * SOATAG_AUDIO_AUX_REF().
351 *
352 * @since New in @VERSION_1_12_2.
353 *
354 * @sa SOATAG_RTP_SELECT(), SOATAG_RTP_MISMATCH(), SOATAG_RTP_SORT()
355 */
356 tag_typedef_t soatag_audio_aux = STRTAG_TYPEDEF(audio_aux);
357
358 /**@def SOATAG_RTP_SORT(x)
359 *
360 * When selecting the common codecs, soa can either select first local codec
361 * supported by remote end, or first remote codec supported by local codecs.
362 * The preference is indicated with ordering: the preferred codec is
363 * first and so on.
364 *
365 * The auxiliary audio codecs (specified with SOATAG_AUDIO_AUX()) are listed
366 * after other codecs.
367 *
368 * @par Used with
369 * soa_set_params(), soa_get_params(), soa_get_paramlist() \n
370 *
371 * @par Parameter type
372 * enum {
373 * #SOA_RTP_SORT_DEFAULT, #SOA_RTP_SORT_LOCAL, #SOA_RTP_SORT_REMOTE
374 * } \n
375 * (int in range 0..2)
376 *
377 * @par Values
378 * - #SOA_RTP_SORT_DEFAULT (0) - select by local preference
379 * if media is recvonly, remote preference othewise
380 * - #SOA_RTP_SORT_LOCAL (1) - always select by local preference
381 * - #SOA_RTP_SORT_REMOTE (2) - always select by remote preference
382 *
383 * The default value is #SOA_RTP_SORT_DEFAULT (0).
384 *
385 * Corresponding tag taking reference parameter is SOATAG_RTP_SORT_REF()
386 *
387 * @sa SOATAG_RTP_SELECT(), SOATAG_RTP_MISMATCH(), SOATAG_AUDIO_AUX()
388 */
389 tag_typedef_t soatag_rtp_sort = INTTAG_TYPEDEF(rtp_sort);
390
391
392 /**@def SOATAG_RTP_MISMATCH(x)
393 *
394 * Accept media line even if the SDP negotation code determines that there
395 * are no common codecs between local and remote media. Normally, if the soa
396 * determines there are no common codecs, the media line is rejected.
397 *
398 * @par Used with
399 * soa_set_params(), soa_get_params(), soa_get_paramlist() \n
400 *
401 * @par Parameter type
402 * Boolean (int)
403 *
404 * @par Values
405 * 0 - reject media if there are no common codecs \n
406 * 1 (!= 0) - accept media even if there are no common codecs \n
407 *
408 * Default value is 0.
409 *
410 * Corresponding tag taking reference parameter is SOATAG_RTP_MISMATCH_REF()
411 *
412 * @sa SOATAG_RTP_SELECT(), SOATAG_RTP_MISMATCH(), SOATAG_AUDIO_AUX()
413 */
414 tag_typedef_t soatag_rtp_mismatch = BOOLTAG_TYPEDEF(rtp_mismatch);
415
416
417 /**@def SOATAG_ACTIVE_AUDIO(x)
418 *
419 * Audio session status.
420 *
421 * @par Used with
422 *
423 * @par Parameter type
424 * enum { #SOA_ACTIVE_DISABLED, #SOA_ACTIVE_REJECTED,
425 * #SOA_ACTIVE_INACTIVE, #SOA_ACTIVE_SENDONLY,
426 * #SOA_ACTIVE_RECVONLY, #SOA_ACTIVE_SENDRECV }
427 *
428 * @par Values
429 * - #SOA_ACTIVE_REJECTED (-8)
430 * - #SOA_ACTIVE_INACTIVE (0)
431 * - #SOA_ACTIVE_SENDONLY (1)
432 * - #SOA_ACTIVE_RECVONLY (2)
433 * - #SOA_ACTIVE_SENDRECV (3)
434 *
435 * Corresponding tag taking reference parameter is SOATAG_ACTIVE_AUDIO_REF()
436 *
437 */
438 tag_typedef_t soatag_active_audio = INTTAG_TYPEDEF(active_audio);
439
440 /**@def SOATAG_ACTIVE_VIDEO(x)
441 *
442 * Video session status
443 *
444 * @par Used with
445 *
446 * @par Parameter type
447 * enum { #SOA_ACTIVE_DISABLED, #SOA_ACTIVE_REJECTED,
448 * #SOA_ACTIVE_INACTIVE, #SOA_ACTIVE_SENDONLY,
449 * #SOA_ACTIVE_RECVONLY, #SOA_ACTIVE_SENDRECV }
450 *
451 * @par Values
452 * - #SOA_ACTIVE_REJECTED (-8)
453 * - #SOA_ACTIVE_INACTIVE (0)
454 * - #SOA_ACTIVE_SENDONLY (1)
455 * - #SOA_ACTIVE_RECVONLY (2)
456 * - #SOA_ACTIVE_SENDRECV (3)
457 *
458 * Corresponding tag taking reference parameter is SOATAG_ACTIVE_VIDEO_REF()
459 */
460 tag_typedef_t soatag_active_video = INTTAG_TYPEDEF(active_video);
461
462 /**@def SOATAG_ACTIVE_IMAGE(x)
463 *
464 * Active image session status
465 *
466 * @par Used with
467 * #nua_i_active \n
468 * #nua_i_state \n
469 *
470 * @par Parameter type
471 * enum { #SOA_ACTIVE_DISABLED, #SOA_ACTIVE_REJECTED,
472 * #SOA_ACTIVE_INACTIVE, #SOA_ACTIVE_SENDONLY,
473 * #SOA_ACTIVE_RECVONLY, #SOA_ACTIVE_SENDRECV }
474 *
475 * @par Values
476 * - #SOA_ACTIVE_REJECTED (-8)
477 * - #SOA_ACTIVE_INACTIVE (0)
478 * - #SOA_ACTIVE_SENDONLY (1)
479 * - #SOA_ACTIVE_RECVONLY (2)
480 * - #SOA_ACTIVE_SENDRECV (3)
481 *
482 * @par Parameter type
483 * enum { #SOA_ACTIVE_DISABLED, #SOA_ACTIVE_REJECTED,
484 * #SOA_ACTIVE_INACTIVE, #SOA_ACTIVE_SENDONLY,
485 * #SOA_ACTIVE_RECVONLY, #SOA_ACTIVE_SENDRECV }
486 *
487 * @par Values
488 * - #SOA_ACTIVE_REJECTED (-8)
489 * - #SOA_ACTIVE_INACTIVE (0)
490 * - #SOA_ACTIVE_SENDONLY (1)
491 * - #SOA_ACTIVE_RECVONLY (2)
492 * - #SOA_ACTIVE_SENDRECV (3)
493 *
494 * Corresponding tag taking reference parameter is SOATAG_ACTIVE_IMAGE_REF()
495 */
496 tag_typedef_t soatag_active_image = INTTAG_TYPEDEF(active_image);
497
498 /**@def SOATAG_ACTIVE_CHAT(x)
499 *
500 * Active chat session status.
501 *
502 * @par Used with
503 * #nua_i_active \n
504 * #nua_i_state \n
505 *
506 * @par Parameter type
507 * enum { #SOA_ACTIVE_DISABLED, #SOA_ACTIVE_REJECTED,
508 * #SOA_ACTIVE_INACTIVE, #SOA_ACTIVE_SENDONLY,
509 * #SOA_ACTIVE_RECVONLY, #SOA_ACTIVE_SENDRECV }
510 *
511 * @par Values
512 * - #SOA_ACTIVE_REJECTED (-8)
513 * - #SOA_ACTIVE_INACTIVE (0)
514 * - #SOA_ACTIVE_SENDONLY (1)
515 * - #SOA_ACTIVE_RECVONLY (2)
516 * - #SOA_ACTIVE_SENDRECV (3)
517 *
518 * Corresponding tag taking reference parameter is SOATAG_ACTIVE_CHAT_REF()
519 */
520 tag_typedef_t soatag_active_chat = INTTAG_TYPEDEF(active_chat);
521
522 /**@def SOATAG_SRTP_ENABLE(x)
523 *
524 * Enable SRTP
525 *
526 * @par Used with
527 * soa_set_params(), soa_get_params(), soa_get_paramlist() \n
528 *
529 * @par Parameter type
530 * boolean (int)
531 *
532 * @par Values
533 * @c !=0 enable \n
534 * @c 0 disable
535 *
536 * Corresponding tag taking reference parameter is
537 * SOATAG_SRTP_ENABLE_REF()
538 *
539 * @todo SRTP functionality is not implemented.
540 */
541 tag_typedef_t soatag_srtp_enable = BOOLTAG_TYPEDEF(srtp_enable);
542
543 /**@def SOATAG_SRTP_CONFIDENTIALITY(x)
544 *
545 * Enable SRTP confidentiality negotiation.
546 *
547 * @par Used with
548 * soa_set_params(), soa_get_params(), soa_get_paramlist() \n
549 *
550 * @par Parameter type
551 * boolean (int)
552 *
553 * @par Values
554 * @c != 0 enable SRTP confidentiality \n
555 * @c 0 disable SRTP conidentiality
556 *
557 * Corresponding tag taking reference parameter is
558 * SOATAG_SRTP_CONFIDENTIALITY_REF()
559 *
560 * @todo SRTP functionality is not implemented.
561 */
562 tag_typedef_t soatag_srtp_confidentiality =
563 BOOLTAG_TYPEDEF(srtp_confidentiality);
564
565 /**@def SOATAG_SRTP_INTEGRITY(x)
566 *
567 * Enable SRTP integrity protection
568 *
569 * @par Used with
570 * soa_set_params(), soa_get_params(), soa_get_paramlist() \n
571 *
572 * @par Parameter type
573 * boolean (int)
574 *
575 * @par Values
576 * @c !=0 enable \n
577 * @c 0 disable
578 *
579 * Corresponding tag taking reference parameter is
580 * SOATAG_SRTP_INTEGRITY_REF()
581 *
582 * @todo SRTP functionality is not implemented.
583 */
584 tag_typedef_t soatag_srtp_integrity = BOOLTAG_TYPEDEF(srtp_integrity);
585
586 /**@def SOATAG_HOLD(x)
587 *
588 * Hold media stream or streams.
589 *
590 * The hold media stream will have the attribute a=sendonly (meaning that
591 * some hold announcements or pause music is sent to the held party but that
592 * the held party should not generate any media) or a=inactive (meaning that
593 * no media is sent).
594 *
595 * When putting a SIP session on hold with sendonly, the application can
596 * include, e.g., SOATAG_HOLD("audio") or SOATAG_HOLD("video") or
597 * SOATAG_HOLD("audio, video") or SOATAG_HOLD("*") as @soa parameters. When
598 * using inactive instead, the application should use "#" or
599 * "audio=inactive" instead. When resuming the session, application should
600 * include the tag SOATAG_HOLD(NULL).
601 *
602 * Note that last SOATAG_HOLD() in the tag list will override the
603 * SOATAG_HOLD() tags before it.
604 *
605 * @par Used with
606 * soa_set_params(), soa_get_params(), soa_get_paramlist() \n
607 *
608 * @par Parameter type
609 * character string
610 *
611 * @par Values
612 * Comma-separated media name ("audio", "video") or wildcard ("*").
613 *
614 * Corresponding tag taking reference parameter is SOATAG_HOLD_REF()
615 *
616 * @sa soa_set_params(), nua_invite(), @ref nua_event_diagram_call_hold
617 */
618 tag_typedef_t soatag_hold = STRTAG_TYPEDEF(hold);
619
620
621 /**@def SOATAG_ORDERED_USER(x)
622 *
623 * Take account strict ordering of user SDP m=lines. If user SDP has been
624 * updated, the new media lines replace old ones even if the media type has
625 * been changed. This allows the application to replace @b m=audio with
626 * @b m=image/t38, for instance.
627 *
628 * @par Used with
629 * soa_set_params(), soa_get_params(), soa_get_paramlist() \n
630 *
631 * @par Parameter type
632 * boolean
633 *
634 * @par Values
635 * - false (0) - update session with user SDP based on media type
636 * - true (1) - update session with m= line in user SDP based on their order
637 *
638 * The default value is false and session are updated based on media types.
639 *
640 *
641 * Corresponding tag taking a reference parameter is SOATAG_RTP_SELECT_REF().
642 *
643 * @sa @RFC3264 section 8.3.3, T.38
644 *
645 * @NEW_1_12_7.
646 */
647 tag_typedef_t soatag_ordered_user = BOOLTAG_TYPEDEF(ordered_user);
648
649 tag_typedef_t soatag_reuse_rejected = BOOLTAG_TYPEDEF(reuse_rejected);
650