xref: /onnv-gate/usr/src/lib/libcommputil/common/sdp.h (revision 5306:fedb0b5a9fb4)
1*5306Sgm209912 /*
2*5306Sgm209912  * CDDL HEADER START
3*5306Sgm209912  *
4*5306Sgm209912  * The contents of this file are subject to the terms of the
5*5306Sgm209912  * Common Development and Distribution License (the "License").
6*5306Sgm209912  * You may not use this file except in compliance with the License.
7*5306Sgm209912  *
8*5306Sgm209912  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*5306Sgm209912  * or http://www.opensolaris.org/os/licensing.
10*5306Sgm209912  * See the License for the specific language governing permissions
11*5306Sgm209912  * and limitations under the License.
12*5306Sgm209912  *
13*5306Sgm209912  * When distributing Covered Code, include this CDDL HEADER in each
14*5306Sgm209912  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*5306Sgm209912  * If applicable, add the following below this CDDL HEADER, with the
16*5306Sgm209912  * fields enclosed by brackets "[]" replaced with your own identifying
17*5306Sgm209912  * information: Portions Copyright [yyyy] [name of copyright owner]
18*5306Sgm209912  *
19*5306Sgm209912  * CDDL HEADER END
20*5306Sgm209912  */
21*5306Sgm209912 
22*5306Sgm209912 /*
23*5306Sgm209912  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
24*5306Sgm209912  * Use is subject to license terms.
25*5306Sgm209912  */
26*5306Sgm209912 
27*5306Sgm209912 #ifndef _SDP_H
28*5306Sgm209912 #define	_SDP_H
29*5306Sgm209912 
30*5306Sgm209912 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31*5306Sgm209912 
32*5306Sgm209912 #ifdef __cplusplus
33*5306Sgm209912 extern "C" {
34*5306Sgm209912 #endif
35*5306Sgm209912 
36*5306Sgm209912 #include <sys/types.h>
37*5306Sgm209912 
38*5306Sgm209912 #define	SDP_VERSION_FIELD	'v'
39*5306Sgm209912 #define	SDP_ORIGIN_FIELD	'o'
40*5306Sgm209912 #define	SDP_NAME_FIELD		's'
41*5306Sgm209912 #define	SDP_INFO_FIELD		'i'
42*5306Sgm209912 #define	SDP_URI_FIELD		'u'
43*5306Sgm209912 #define	SDP_EMAIL_FIELD		'e'
44*5306Sgm209912 #define	SDP_PHONE_FIELD		'p'
45*5306Sgm209912 #define	SDP_CONNECTION_FIELD	'c'
46*5306Sgm209912 #define	SDP_BANDWIDTH_FIELD	'b'
47*5306Sgm209912 #define	SDP_TIME_FIELD		't'
48*5306Sgm209912 #define	SDP_REPEAT_FIELD	'r'
49*5306Sgm209912 #define	SDP_ZONE_FIELD		'z'
50*5306Sgm209912 #define	SDP_KEY_FIELD		'k'
51*5306Sgm209912 #define	SDP_ATTRIBUTE_FIELD	'a'
52*5306Sgm209912 #define	SDP_MEDIA_FIELD		'm'
53*5306Sgm209912 
54*5306Sgm209912 /* SDP Parse errors */
55*5306Sgm209912 #define	SDP_VERSION_ERROR	0x00000001
56*5306Sgm209912 #define	SDP_ORIGIN_ERROR	0x00000002
57*5306Sgm209912 #define	SDP_NAME_ERROR		0x00000004
58*5306Sgm209912 #define	SDP_INFO_ERROR		0x00000008
59*5306Sgm209912 #define	SDP_URI_ERROR		0x00000010
60*5306Sgm209912 #define	SDP_EMAIL_ERROR		0x00000020
61*5306Sgm209912 #define	SDP_PHONE_ERROR		0x00000040
62*5306Sgm209912 #define	SDP_CONNECTION_ERROR	0x00000080
63*5306Sgm209912 #define	SDP_BANDWIDTH_ERROR	0x00000100
64*5306Sgm209912 #define	SDP_TIME_ERROR		0x00000200
65*5306Sgm209912 #define	SDP_REPEAT_TIME_ERROR	0x00000400
66*5306Sgm209912 #define	SDP_ZONE_ERROR		0x00000800
67*5306Sgm209912 #define	SDP_KEY_ERROR		0x00001000
68*5306Sgm209912 #define	SDP_ATTRIBUTE_ERROR	0x00002000
69*5306Sgm209912 #define	SDP_MEDIA_ERROR		0x00004000
70*5306Sgm209912 #define	SDP_FIELDS_ORDER_ERROR	0x00008000
71*5306Sgm209912 #define	SDP_MISSING_FIELDS	0x00010000
72*5306Sgm209912 
73*5306Sgm209912 #define	SDP_AUDIO		"audio"
74*5306Sgm209912 #define	SDP_VIDEO		"video"
75*5306Sgm209912 #define	SDP_TEXT		"text"
76*5306Sgm209912 #define	SDP_APPLICATION		"application"
77*5306Sgm209912 #define	SDP_MESSAGE		"message"
78*5306Sgm209912 #define	SDP_RTPMAP		"rtpmap"
79*5306Sgm209912 
80*5306Sgm209912 #define	SDP_SESSION_VERSION_1	1
81*5306Sgm209912 
82*5306Sgm209912 typedef struct sdp_list {
83*5306Sgm209912 	void			*value;
84*5306Sgm209912 	struct sdp_list		*next;
85*5306Sgm209912 } sdp_list_t;
86*5306Sgm209912 
87*5306Sgm209912 /*
88*5306Sgm209912  * SDP origin field.
89*5306Sgm209912  * o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>
90*5306Sgm209912  */
91*5306Sgm209912 typedef struct sdp_origin {
92*5306Sgm209912 	char			*o_username;
93*5306Sgm209912 	uint64_t 		o_id;
94*5306Sgm209912 	uint64_t 		o_version;
95*5306Sgm209912 	char			*o_nettype;
96*5306Sgm209912 	char			*o_addrtype;
97*5306Sgm209912 	char			*o_address;
98*5306Sgm209912 } sdp_origin_t;
99*5306Sgm209912 
100*5306Sgm209912 /*
101*5306Sgm209912  * SDP connection field.
102*5306Sgm209912  * c=<nettype> <addrtype> <connection-address>[/ttl]/<number of addresses>
103*5306Sgm209912  */
104*5306Sgm209912 typedef struct sdp_conn {
105*5306Sgm209912 	char			*c_nettype;
106*5306Sgm209912 	char			*c_addrtype;
107*5306Sgm209912 	char			*c_address;
108*5306Sgm209912 	int 			c_addrcount;
109*5306Sgm209912 	struct sdp_conn		*c_next;
110*5306Sgm209912 	uint8_t			c_ttl;
111*5306Sgm209912 } sdp_conn_t;
112*5306Sgm209912 
113*5306Sgm209912 /*
114*5306Sgm209912  * SDP repeat field. Always found in time structure.
115*5306Sgm209912  * r=<repeat interval> <active duration> <offsets from start-time>
116*5306Sgm209912  */
117*5306Sgm209912 typedef struct sdp_repeat {
118*5306Sgm209912 	uint64_t		r_interval;
119*5306Sgm209912 	uint64_t		r_duration;
120*5306Sgm209912 	sdp_list_t 		*r_offset;
121*5306Sgm209912 	struct sdp_repeat	*r_next;
122*5306Sgm209912 } sdp_repeat_t;
123*5306Sgm209912 
124*5306Sgm209912 /*
125*5306Sgm209912  * SDP time field.
126*5306Sgm209912  * t=<start-time> <stop-time>
127*5306Sgm209912  */
128*5306Sgm209912 typedef struct sdp_time {
129*5306Sgm209912 	uint64_t 		t_start;
130*5306Sgm209912 	uint64_t 		t_stop;
131*5306Sgm209912 	sdp_repeat_t 		*t_repeat;
132*5306Sgm209912 	struct sdp_time		*t_next;
133*5306Sgm209912 } sdp_time_t;
134*5306Sgm209912 
135*5306Sgm209912 /*
136*5306Sgm209912  * SDP time zone field.
137*5306Sgm209912  * z=<adjustment time> <offset> <adjustment time> <offset> ....
138*5306Sgm209912  */
139*5306Sgm209912 typedef struct sdp_zone {
140*5306Sgm209912 	uint64_t 		z_time;
141*5306Sgm209912 	char			*z_offset;
142*5306Sgm209912 	struct sdp_zone		*z_next;
143*5306Sgm209912 } sdp_zone_t;
144*5306Sgm209912 
145*5306Sgm209912 /*
146*5306Sgm209912  * SDP attribute field.
147*5306Sgm209912  * a=<attribute> or a=<attribute>:<value>
148*5306Sgm209912  */
149*5306Sgm209912 typedef struct sdp_attr {
150*5306Sgm209912 	char			*a_name;
151*5306Sgm209912 	char			*a_value;
152*5306Sgm209912 	struct sdp_attr		*a_next;
153*5306Sgm209912 } sdp_attr_t;
154*5306Sgm209912 
155*5306Sgm209912 /*
156*5306Sgm209912  * SDP bandwidth field.
157*5306Sgm209912  * b=<bwtype>:<bandwidth>
158*5306Sgm209912  */
159*5306Sgm209912 typedef struct sdp_bandwidth {
160*5306Sgm209912 	char			*b_type;
161*5306Sgm209912 	uint64_t 		b_value;
162*5306Sgm209912 	struct sdp_bandwidth	*b_next;
163*5306Sgm209912 } sdp_bandwidth_t;
164*5306Sgm209912 
165*5306Sgm209912 /*
166*5306Sgm209912  * SDP key field to session or media section of SDP.
167*5306Sgm209912  * k=<method> or k=<method>:<encryption key>
168*5306Sgm209912  */
169*5306Sgm209912 typedef struct sdp_key {
170*5306Sgm209912 	char			*k_method;
171*5306Sgm209912 	char			*k_enckey;
172*5306Sgm209912 } sdp_key_t;
173*5306Sgm209912 
174*5306Sgm209912 typedef struct sdp_session	sdp_session_t;
175*5306Sgm209912 
176*5306Sgm209912 /*
177*5306Sgm209912  * SDP media section, contains media fields and other fields within
178*5306Sgm209912  * media section.
179*5306Sgm209912  * m=<media> <port>[/portcount] <proto> <fmt> ...
180*5306Sgm209912  */
181*5306Sgm209912 typedef struct sdp_media {
182*5306Sgm209912 	char			*m_name;
183*5306Sgm209912 	uint_t			m_port;
184*5306Sgm209912 	int			m_portcount;
185*5306Sgm209912 	char			*m_proto;
186*5306Sgm209912 	sdp_list_t 		*m_format;
187*5306Sgm209912 	char			*m_info;
188*5306Sgm209912 	sdp_conn_t 		*m_conn;
189*5306Sgm209912 	sdp_bandwidth_t 	*m_bw;
190*5306Sgm209912 	sdp_key_t 		*m_key;
191*5306Sgm209912 	sdp_attr_t 		*m_attr;
192*5306Sgm209912 	struct sdp_media 	*m_next;
193*5306Sgm209912 	sdp_session_t		*m_session;
194*5306Sgm209912 } sdp_media_t;
195*5306Sgm209912 
196*5306Sgm209912 struct sdp_session {
197*5306Sgm209912 	int			sdp_session_version;
198*5306Sgm209912 	int 			s_version;
199*5306Sgm209912 	sdp_origin_t 		*s_origin;
200*5306Sgm209912 	char			*s_name;
201*5306Sgm209912 	char			*s_info;
202*5306Sgm209912 	char			*s_uri;
203*5306Sgm209912 	sdp_list_t 		*s_email;
204*5306Sgm209912 	sdp_list_t 		*s_phone;
205*5306Sgm209912 	sdp_conn_t 		*s_conn;
206*5306Sgm209912 	sdp_bandwidth_t 	*s_bw;
207*5306Sgm209912 	sdp_time_t 		*s_time;
208*5306Sgm209912 	sdp_zone_t 		*s_zone;
209*5306Sgm209912 	sdp_key_t 		*s_key;
210*5306Sgm209912 	sdp_attr_t 		*s_attr;
211*5306Sgm209912 	sdp_media_t 		*s_media;
212*5306Sgm209912 };
213*5306Sgm209912 
214*5306Sgm209912 extern int		sdp_parse(const char *, int, int, sdp_session_t **,
215*5306Sgm209912 			    uint_t *);
216*5306Sgm209912 extern sdp_media_t	*sdp_find_media(sdp_media_t *, const char *);
217*5306Sgm209912 extern sdp_attr_t	*sdp_find_attribute(sdp_attr_t *, const char *);
218*5306Sgm209912 extern sdp_attr_t	*sdp_find_media_rtpmap(sdp_media_t *, const char *);
219*5306Sgm209912 extern sdp_session_t	*sdp_clone_session(const sdp_session_t *);
220*5306Sgm209912 extern sdp_session_t	*sdp_new_session();
221*5306Sgm209912 extern int		sdp_add_origin(sdp_session_t *, const char *, uint64_t,
222*5306Sgm209912 			    uint64_t, const char *, const char *, const char *);
223*5306Sgm209912 extern int		sdp_add_name(sdp_session_t *, const char *);
224*5306Sgm209912 extern int		sdp_add_information(char **, const char *);
225*5306Sgm209912 extern int		sdp_add_uri(sdp_session_t *, const char *);
226*5306Sgm209912 extern int		sdp_add_email(sdp_session_t *, const char *);
227*5306Sgm209912 extern int		sdp_add_phone(sdp_session_t *, const char *);
228*5306Sgm209912 extern int		sdp_add_connection(sdp_conn_t **, const char *,
229*5306Sgm209912 			    const char *, const char *, uint8_t, int);
230*5306Sgm209912 extern int		sdp_add_bandwidth(sdp_bandwidth_t **, const char *,
231*5306Sgm209912 			    uint64_t);
232*5306Sgm209912 extern int		sdp_add_repeat(sdp_time_t *, uint64_t, uint64_t,
233*5306Sgm209912 			    const char *);
234*5306Sgm209912 extern int		sdp_add_time(sdp_session_t *, uint64_t, uint64_t,
235*5306Sgm209912 			    sdp_time_t **);
236*5306Sgm209912 extern int		sdp_add_zone(sdp_session_t *, uint64_t, const char *);
237*5306Sgm209912 extern int		sdp_add_key(sdp_key_t **, const char *, const char *);
238*5306Sgm209912 extern int		sdp_add_attribute(sdp_attr_t **, const char *,
239*5306Sgm209912 			    const char *);
240*5306Sgm209912 extern int		sdp_add_media(sdp_session_t *, const char *, uint_t,
241*5306Sgm209912 			    int, const char *, const char *, sdp_media_t **);
242*5306Sgm209912 extern int		sdp_delete_all_field(sdp_session_t *, const char);
243*5306Sgm209912 extern int		sdp_delete_all_media_field(sdp_media_t *, const char);
244*5306Sgm209912 extern int		sdp_delete_media(sdp_media_t **, sdp_media_t *);
245*5306Sgm209912 extern int		sdp_delete_attribute(sdp_attr_t **, sdp_attr_t *);
246*5306Sgm209912 extern void		sdp_free_session(sdp_session_t *);
247*5306Sgm209912 extern char		*sdp_session_to_str(const sdp_session_t *, int *);
248*5306Sgm209912 
249*5306Sgm209912 
250*5306Sgm209912 #ifdef __cplusplus
251*5306Sgm209912 }
252*5306Sgm209912 #endif
253*5306Sgm209912 
254*5306Sgm209912 #endif /* _SDP_H */
255