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