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