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