ice.h 19.3 KB
Newer Older
Ghislain MARY's avatar
Ghislain MARY committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/*
mediastreamer2 library - modular sound and video processing and streaming
Copyright (C) 2012  Belledonne Communications

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/

#ifndef ice_h
#define ice_h

Ghislain MARY's avatar
Ghislain MARY committed
23
#include "mscommon.h"
24
#include "msticker.h"
Ghislain MARY's avatar
Ghislain MARY committed
25 26 27 28 29
#include "ortp/stun_udp.h"
#include "ortp/stun.h"
#include "ortp/ortp.h"


Ghislain MARY's avatar
Ghislain MARY committed
30 31 32 33 34 35 36 37 38 39 40 41 42
/**
 * @file ice.h
 * @brief mediastreamer2 ice.h include file
 *
 * This file provides the API to handle the ICE protocol defined in the RFC 5245.
 */


/**
 * ICE agent role.
 *
 * See the terminology in paragraph 3 of the RFC 5245 for more details.
 */
Ghislain MARY's avatar
Ghislain MARY committed
43 44 45 46 47
typedef enum {
	IR_Controlling,
	IR_Controlled
} IceRole;

Ghislain MARY's avatar
Ghislain MARY committed
48 49 50 51 52
/**
 * ICE candidate type.
 *
 * See the terminology in paragraph 3 of the RFC 5245 for more details.
 */
Ghislain MARY's avatar
Ghislain MARY committed
53
typedef enum {
54 55 56 57
	ICT_HostCandidate,
	ICT_ServerReflexiveCandidate,
	ICT_PeerReflexiveCandidate,
	ICT_RelayedCandidate
Ghislain MARY's avatar
Ghislain MARY committed
58 59
} IceCandidateType;

Ghislain MARY's avatar
Ghislain MARY committed
60 61 62 63 64
/**
 * ICE candidate pair state.
 *
 * See paragraph 5.7.4 ("Computing states") of RFC 5245 for more details.
 */
65 66 67 68 69 70 71 72
typedef enum {
	ICP_Waiting,
	ICP_InProgress,
	ICP_Succeeded,
	ICP_Failed,
	ICP_Frozen
} IceCandidatePairState;

Ghislain MARY's avatar
Ghislain MARY committed
73 74 75 76 77
/**
 * ICE check list state.
 *
 * See paragraph 5.7.4 ("Computing states") of RFC 5245 for more details.
 */
78 79 80 81 82 83
typedef enum {
	ICL_Running,
	ICL_Completed,
	ICL_Failed
} IceCheckListState;

Ghislain MARY's avatar
Ghislain MARY committed
84 85 86 87 88 89 90 91 92 93
/**
 * ICE session state.
 */
typedef enum {
	IS_Stopped,
	IS_Running,
	IS_Completed,
	IS_Failed
} IceSessionState;

Ghislain MARY's avatar
Ghislain MARY committed
94 95 96
/**
 * Structure representing an ICE session.
 */
Ghislain MARY's avatar
Ghislain MARY committed
97
typedef struct _IceSession {
98 99
	MSList *streams;	/**< List of IceChecklist structures. Each element of the list represents a media stream */
	MSTicker *ticker;	/**< Ticker used to handle retransmissions of connectivity checks */
Ghislain MARY's avatar
Ghislain MARY committed
100 101 102 103 104
	char *local_ufrag;	/**< Local username fragment for the session (assigned during the session creation) */
	char *local_pwd;	/**< Local password for the session (assigned during the session creation) */
	char *remote_ufrag;	/**< Remote username fragment for the session (provided via SDP by the peer) */
	char *remote_pwd;	/**< Remote password for the session (provided via SDP by the peer) */
	IceRole role;	/**< Role played by the agent for this session */
Ghislain MARY's avatar
Ghislain MARY committed
105
	IceSessionState state;	/**< State of the session */
Ghislain MARY's avatar
Ghislain MARY committed
106
	uint64_t tie_breaker;	/**< Random number used to resolve role conflicts (see paragraph 5.2 of the RFC 5245) */
107
	uint32_t ta;	/**< Duration of timer for sending connectivity checks in ms */
Ghislain MARY's avatar
Ghislain MARY committed
108
	uint8_t max_connectivity_checks;	/**< Configuration parameter to limit the number of connectivity checks performed by the agent (default is 100) */
Ghislain MARY's avatar
Ghislain MARY committed
109
	uint8_t keepalive_timeout;	/**< Configuration parameter to define the timeout between each keepalive packets (default is 15s) */
Ghislain MARY's avatar
Ghislain MARY committed
110 111
} IceSession;

Ghislain MARY's avatar
Ghislain MARY committed
112 113 114
/**
 * Structure representing an ICE transport address.
 */
115
typedef struct _IceTransportAddress {
Ghislain MARY's avatar
Ghislain MARY committed
116 117
	char ip[64];
	int port;
118
	// TODO: Handling of IP version (4 or 6) and transport type: TCP, UDP...
Ghislain MARY's avatar
Ghislain MARY committed
119 120
} IceTransportAddress;

Ghislain MARY's avatar
Ghislain MARY committed
121 122 123
/**
 * Structure representing an ICE candidate.
 */
124
typedef struct _IceCandidate {
Ghislain MARY's avatar
Ghislain MARY committed
125 126 127 128
	char foundation[32];	/**< Foundation of the candidate (see paragraph 3 of the RFC 5245 for more details */
	IceTransportAddress taddr;	/**< Transport address of the candidate */
	IceCandidateType type;	/**< Type of the candidate */
	uint32_t priority;	/**< Priority of the candidate */
129
	uint16_t componentID;	/**< component ID between 1 and 256: usually 1 for RTP component and 2 for RTCP component */
Ghislain MARY's avatar
Ghislain MARY committed
130 131
	struct _IceCandidate *base;	/**< Pointer to the candidate that is the base of the current one */
	bool_t is_default;	/**< Boolean value telling whether this candidate is a default candidate or not */
Ghislain MARY's avatar
Ghislain MARY committed
132 133
} IceCandidate;

Ghislain MARY's avatar
Ghislain MARY committed
134 135 136
/**
 * Structure representing an ICE candidate pair.
 */
137
typedef struct _IceCandidatePair {
Ghislain MARY's avatar
Ghislain MARY committed
138 139 140 141
	IceCandidate *local;	/**< Pointer to the local candidate of the pair */
	IceCandidate *remote;	/**< Pointer to the remote candidate of the pair */
	IceCandidatePairState state;	/**< State of the candidate pair */
	uint64_t priority;	/**< Priority of the candidate pair */
142
	UInt96 transactionID;	/**< Transaction ID of the connectivity check sent for the candidate pair */
143
	uint64_t transmission_time;	/**< Time when the connectivity check for the candidate pair has been sent */
144 145
	uint32_t rto;	/**< Duration of the retransmit timer for the connectivity check sent for the candidate pair in ms */
	uint8_t retransmissions;	/**< Number of retransmissions for the connectivity check sent for the candidate pair */
Ghislain MARY's avatar
Ghislain MARY committed
146
	IceRole role;	/**< Role of the agent when the connectivity check has been sent for the candidate pair */
Ghislain MARY's avatar
Ghislain MARY committed
147
	bool_t is_default;	/**< Boolean value telling whether this candidate pair is a default candidate pair or not */
148
	bool_t is_nominated;	/**< Boolean value telling whether this candidate pair is nominated or not */
149
	bool_t wait_transaction_timeout;	/**< Boolean value telling to create a new binding request on retransmission timeout */
Ghislain MARY's avatar
Ghislain MARY committed
150 151
} IceCandidatePair;

Ghislain MARY's avatar
Ghislain MARY committed
152 153 154 155 156
/**
 * Structure representing the foundation of an ICE candidate pair.
 *
 * It is the concatenation of the foundation of a local candidate and the foundation of a remote candidate.
 */
157
typedef struct _IcePairFoundation {
Ghislain MARY's avatar
Ghislain MARY committed
158 159
	char local[32];	/**< Foundation of the local candidate */
	char remote[32];	/**< Foundation of the remote candidate */
160 161
} IcePairFoundation;

162
typedef struct _IceValidCandidatePair {
163 164
	IceCandidatePair *valid;	/**< Pointer to a valid candidate pair (it may be in the check list or not */
	IceCandidatePair *generated_from;	/**< Pointer to the candidate pair that generated the connectivity check producing the valid candidate pair */
165 166
} IceValidCandidatePair;

Ghislain MARY's avatar
Ghislain MARY committed
167 168 169 170 171 172
/**
 * Structure representing an ICE check list.
 *
 * Each media stream must be assigned a check list.
 * Check lists are added to an ICE session using the ice_session_add_check_list() function.
 */
173
typedef struct _IceCheckList {
174 175 176
	IceSession *session;	/**< Pointer to the ICE session */
	char *remote_ufrag;	/**< Remote username fragment for this check list (provided via SDP by the peer) */
	char *remote_pwd;	/**< Remote password for this check list (provided via SDP by the peer) */
177 178 179
	MSList *local_candidates;	/**< List of IceCandidate structures */
	MSList *remote_candidates;	/**< List of IceCandidate structures */
	MSList *pairs;	/**< List of IceCandidatePair structures */
180
	MSList *triggered_checks_queue;	/**< List of IceCandidatePair structures */
181
	MSList *check_list;	/**< List of IceCandidatePair structures */
182
	MSList *valid_list;	/**< List of IceValidCandidatePair structures */
183
	MSList *foundations;	/**< List of IcePairFoundation structures */
184
	MSList *componentIDs;	/**< List of uint16_t */
185
	IceCheckListState state;	/**< Global state of the ICE check list */
186
	uint64_t ta_time;	/**< Time when the Ta timer has been processed for the last time */
Ghislain MARY's avatar
Ghislain MARY committed
187
	uint64_t keepalive_time;	/**< Time when the last keepalive packet has been sent for this stream */
188
	uint32_t foundation_generator;	/**< Autoincremented integer to generate unique foundation values */
Ghislain MARY's avatar
Ghislain MARY committed
189 190 191
} IceCheckList;


192

Ghislain MARY's avatar
Ghislain MARY committed
193 194 195 196
#ifdef __cplusplus
extern "C"{
#endif

Ghislain MARY's avatar
Ghislain MARY committed
197 198 199 200 201 202 203 204
/**
 * Allocate a new ICE session.
 *
 * @return Pointer to the allocated session
 *
 * This must be performed for each media session that is to use ICE.
 */
MS2_PUBLIC IceSession * ice_session_new(void);
Ghislain MARY's avatar
Ghislain MARY committed
205

Ghislain MARY's avatar
Ghislain MARY committed
206 207 208 209 210 211 212 213
/**
 * Destroy a previously allocated ICE session.
 *
 * @param session The session to destroy.
 *
 * To be used when a media session using ICE is tore down.
 */
MS2_PUBLIC void ice_session_destroy(IceSession *session);
Ghislain MARY's avatar
Ghislain MARY committed
214

Ghislain MARY's avatar
Ghislain MARY committed
215 216 217 218 219 220 221
/**
 * Allocate a new ICE check list.
 *
 * @return Pointer to the allocated check list
 *
 * A check list must be allocated for each media stream of a media session and be added to an ICE session using the ice_session_add_check_list() function.
 */
222 223
MS2_PUBLIC IceCheckList * ice_check_list_new(void);

Ghislain MARY's avatar
Ghislain MARY committed
224 225 226 227 228 229
/**
 * Destroy a previously allocated ICE check list.
 *
 * @param cl The check list to destroy
 */
MS2_PUBLIC void ice_check_list_destroy(IceCheckList *cl);
230

231 232 233 234 235 236 237 238 239
/**
 * Get the nth check list of an ICE session.
 *
 * @param session A pointer to a session
 * @param n The number of the check list to access
 * @return A pointer to the nth check list of the session if it exists, NULL otherwise
 */
MS2_PUBLIC IceCheckList *ice_session_check_list(const IceSession *session, unsigned int n);

Ghislain MARY's avatar
Ghislain MARY committed
240 241 242 243 244 245
/**
 * Get the local username fragment of an ICE session.
 *
 * @param session A pointer to a session
 * @return A pointer to the local username fragment of the session
 */
246
MS2_PUBLIC const char * ice_session_local_ufrag(const IceSession *session);
Ghislain MARY's avatar
Ghislain MARY committed
247

Ghislain MARY's avatar
Ghislain MARY committed
248 249 250 251 252 253
/**
 * Get the local password of an ICE session.
 *
 * @param session A pointer to a session
 * @return A pointer to the local password of the session
 */
254
MS2_PUBLIC const char * ice_session_local_pwd(const IceSession *session);
Ghislain MARY's avatar
Ghislain MARY committed
255

Ghislain MARY's avatar
Ghislain MARY committed
256 257 258 259 260 261
/**
 * Get the remote username fragment of an ICE session.
 *
 * @param session A pointer to a session
 * @return A pointer to the remote username fragment of the session
 */
262
MS2_PUBLIC const char * ice_session_remote_ufrag(const IceSession *session);
Ghislain MARY's avatar
Ghislain MARY committed
263

Ghislain MARY's avatar
Ghislain MARY committed
264 265 266 267 268 269
/**
 * Get the remote password of an ICE session.
 *
 * @param session A pointer to a session
 * @return A pointer to the remote password of the session
 */
270
MS2_PUBLIC const char * ice_session_remote_pwd(const IceSession *session);
Ghislain MARY's avatar
Ghislain MARY committed
271

Ghislain MARY's avatar
Ghislain MARY committed
272 273 274 275 276 277 278 279
/**
 * Gte the role of the agent for an ICE session.
 *
 * @param session A pointer to a session
 * @return The role of the agent for the session
 */
MS2_PUBLIC IceRole ice_session_role(IceSession *session);

Ghislain MARY's avatar
Ghislain MARY committed
280 281 282 283 284 285 286
/**
 * Set the role of the agent for an ICE session.
 *
 * @param session The session for which to set the role
 * @param role The role to set the session to
 */
MS2_PUBLIC void ice_session_set_role(IceSession *session, IceRole role);
Ghislain MARY's avatar
Ghislain MARY committed
287

Ghislain MARY's avatar
Ghislain MARY committed
288
/**
Ghislain MARY's avatar
Ghislain MARY committed
289 290
 * Set the local credentials of an ICE session.
 *
Ghislain MARY's avatar
Ghislain MARY committed
291 292 293
 * This function SHOULD not be used. However, it is used by mediastream for testing purpose to
 * apply the same credentials for local and remote agents because the SDP exchange is bypassed.
 */
294
void ice_session_set_local_credentials(IceSession *session, const char *ufrag, const char *pwd);
Ghislain MARY's avatar
Ghislain MARY committed
295

Ghislain MARY's avatar
Ghislain MARY committed
296 297 298 299 300 301 302 303 304 305
/**
 * Set the remote credentials of an ICE session.
 *
 * @param session A pointer to a session
 * @param ufrag The remote username fragment
 * @param pwd The remote password
 *
 * This function is to be called once the remote credentials have been received via SDP.
 */
MS2_PUBLIC void ice_session_set_remote_credentials(IceSession *session, const char *ufrag, const char *pwd);
Ghislain MARY's avatar
Ghislain MARY committed
306

Ghislain MARY's avatar
Ghislain MARY committed
307 308 309 310 311 312 313 314 315 316
/**
 * Define the maximum number of connectivity checks that will be performed by the agent.
 *
 * @param session A pointer to a session
 * @param max_connectivity_checks The maximum number of connectivity checks to perform
 *
 * This function is to be called just after the creation of the session, before any connectivity check is performed.
 * The default number of connectivity checks is 100.
 */
MS2_PUBLIC void ice_session_set_max_connectivity_checks(IceSession *session, uint8_t max_connectivity_checks);
317

Ghislain MARY's avatar
Ghislain MARY committed
318 319 320 321 322 323 324 325 326 327
/**
 * Define the timeout between each keepalive packet in seconds.
 *
 * @param session A pointer to a session
 * @param timeout The duration of the keepalive timeout in seconds
 *
 * The default keepalive timeout is set to 15 seconds.
 */
MS2_PUBLIC void ice_session_set_keepalive_timeout(IceSession *session, uint8_t timeout);

Ghislain MARY's avatar
Ghislain MARY committed
328 329 330 331 332 333 334
/**
 * Add an ICE check list to an ICE session.
 *
 * @param session The session that is assigned the check list
 * @param cl The check list to assign to the session
 */
MS2_PUBLIC void ice_session_add_check_list(IceSession *session, IceCheckList *cl);
Ghislain MARY's avatar
Ghislain MARY committed
335

Ghislain MARY's avatar
Ghislain MARY committed
336 337 338 339 340 341
/**
 * Get the state of an ICE check list.
 *
 * @param cl A pointer to a check list
 * @return The check list state
 */
342
MS2_PUBLIC IceCheckListState ice_check_list_state(const IceCheckList *cl);
343

Ghislain MARY's avatar
Ghislain MARY committed
344 345 346 347 348 349
/**
 * Get the local username fragment of an ICE check list.
 *
 * @param cl A pointer to a check list
 * @return A pointer to the local username fragment of the check list
 */
350
MS2_PUBLIC const char * ice_check_list_local_ufrag(const IceCheckList *cl);
Ghislain MARY's avatar
Ghislain MARY committed
351

Ghislain MARY's avatar
Ghislain MARY committed
352 353 354 355 356 357
/**
 * Get the local password of an ICE check list.
 *
 * @param cl A pointer to a check list
 * @return A pointer to the local password of the check list
 */
358
MS2_PUBLIC const char * ice_check_list_local_pwd(const IceCheckList *cl);
Ghislain MARY's avatar
Ghislain MARY committed
359

Ghislain MARY's avatar
Ghislain MARY committed
360 361 362 363 364 365
/**
 * Get the remote username fragment of an ICE check list.
 *
 * @param cl A pointer to a check list
 * @return A pointer to the remote username fragment of the check list
 */
366
MS2_PUBLIC const char * ice_check_list_remote_ufrag(const IceCheckList *cl);
Ghislain MARY's avatar
Ghislain MARY committed
367

Ghislain MARY's avatar
Ghislain MARY committed
368 369 370 371 372 373
/**
 * Get the remote password of an ICE check list.
 *
 * @param cl A pointer to a check list
 * @return A pointer to the remote password of the check list
 */
374
MS2_PUBLIC const char * ice_check_list_remote_pwd(const IceCheckList *cl);
Ghislain MARY's avatar
Ghislain MARY committed
375

376 377 378 379 380 381 382 383 384 385 386
/**
 * Set the remote credentials of an ICE check list.
 *
 * @param cl A pointer to a check list
 * @param ufrag The remote username fragment
 * @param pwd The remote password
 *
 * This function is to be called once the remote credentials have been received via SDP.
 */
MS2_PUBLIC void ice_check_list_set_remote_credentials(IceCheckList *cl, const char *ufrag, const char *pwd);

387 388 389 390 391 392
/**
 * Get the default local candidate for an ICE check list.
 *
 * @param cl A pointer to a check list
 * @return A pointer to the default local candidate for the check list if found, NULL otherwise
 */
393
MS2_PUBLIC const IceCandidate * ice_check_list_default_local_candidate(const IceCheckList *cl);
394

Ghislain MARY's avatar
Ghislain MARY committed
395 396 397 398 399 400 401 402
/**
 * Get the nominated valid local candidate for an ICE check list.
 *
 * @param cl A pointer to a check list
 * @return A pointer to the nominated valid local candidate for the check list if found, NULL otherwise
 */
MS2_PUBLIC const IceCandidate * ice_check_list_nominated_valid_local_candidate(const IceCheckList *cl);

403 404 405 406 407 408
/**
 * Get the candidate type as a string.
 *
 * @param candidate A pointer to a candidate
 * @return A pointer to the candidate type as a string
 */
409
MS2_PUBLIC const char * ice_candidate_type(const IceCandidate *candidate);
410

411
/**
Ghislain MARY's avatar
Ghislain MARY committed
412 413
 * Add a local candidate to an ICE check list.
 *
414
 * This function is not to be used directly. The ice_session_gather_candidates() function SHOULD be used instead.
415 416
 * However, it is used by mediastream for testing purpose since it does not use gathering.
 */
Ghislain MARY's avatar
Ghislain MARY committed
417
MS2_PUBLIC IceCandidate * ice_add_local_candidate(IceCheckList *cl, const char *type, const char *ip, int port, uint16_t componentID, IceCandidate *base);
418

Ghislain MARY's avatar
Ghislain MARY committed
419 420 421 422 423 424 425 426 427 428 429 430 431 432
/**
 * Add a remote candidate to an ICE check list.
 *
 * @param cl A pointer to a check list
 * @param type The type of the remote candidate to add as a string (must be one of: "host", "srflx", "prflx" or "relay")
 * @param ip The IP address of the remote candidate as a string (eg. 192.168.0.10)
 * @param port The port of the remote candidate
 * @param componentID The component ID of the remote candidate (usually 1 for RTP and 2 for RTCP)
 * @param priority The priority of the remote candidate
 * @param foundation The foundation of the remote candidate
 *
 * This function is to be called once the remote candidate list has been received via SDP.
 */
MS2_PUBLIC IceCandidate * ice_add_remote_candidate(IceCheckList *cl, const char *type, const char *ip, int port, uint16_t componentID, uint32_t priority, const char * const foundation);
433

434 435 436 437 438 439 440 441
/**
 * Set the base for the local server reflexive candidates of an ICE session.
 *
 * This function SHOULD not be used. However, it is used by mediastream for testing purpose to
 * work around the fact that it does not use candidates gathering.
 * It is to be called automatically when the gathering process finishes.
 */
void ice_session_set_base_for_srflx_candidates(IceSession *session);
442

443 444 445
/**
 * Compute the foundations of the local candidates of an ICE session.
 *
Ghislain MARY's avatar
Ghislain MARY committed
446 447 448 449
 * @param session A pointer to a session
 *
 * This function is to be called at the end of the local candidates gathering process, before sending
 * the SDP to the remote agent.
450
 */
Ghislain MARY's avatar
Ghislain MARY committed
451
MS2_PUBLIC void ice_session_compute_candidates_foundations(IceSession *session);
452

453 454 455 456 457
/**
 * Choose the default candidates of an ICE session.
 *
 * @param session A pointer to a session
 *
Ghislain MARY's avatar
Ghislain MARY committed
458 459
 * This function is to be called at the end of the local candidates gathering process, before sending
 * the SDP to the remote agent.
460 461
 */
MS2_PUBLIC void ice_session_choose_default_candidates(IceSession *session);
Ghislain MARY's avatar
Ghislain MARY committed
462

463 464 465 466 467 468
/**
 * Pair the local and the remote candidates for an ICE session.
 *
 * @param session A pointer to a session
 */
MS2_PUBLIC void ice_session_pair_candidates(IceSession *session);
Ghislain MARY's avatar
Ghislain MARY committed
469

470 471 472 473 474
/**
 * Core ICE check list processing.
 *
 * This function is called from the audiostream or the videostream and is NOT to be called by the user.
 */
475
void ice_check_list_process(IceCheckList* cl, RtpSession* rtp_session);
476

477 478 479 480 481
/**
 * Handle a STUN packet that has been received.
 *
 * This function is called from the audiostream or the videostream and is NOT to be called by the user.
 */
482
void ice_handle_stun_packet(IceCheckList* cl, RtpSession* rtp_session, const OrtpEventData* evt_data);
483

484 485 486 487 488 489 490 491 492 493 494
/**
 * Get the remote address, RTP port and RTCP port to use to send the stream once the ICE process has finished successfully.
 *
 * @param cl A pointer to a check list
 * @param addr A pointer to the buffer to use to store the remote address
 * @param addr_len The size of the buffer to use to store the remote address
 * @param rtp_port A pointer to the location to store the RTP port to
 * @param rtcp_port A pointer to the location to store the RTCP port to
 *
 * This function will usually be called from within the success callback defined while creating the ICE check list with ice_check_list_new().
 */
495
MS2_PUBLIC void ice_get_remote_addr_and_ports_from_valid_pairs(const IceCheckList* cl, char* addr, int addr_len, int* rtp_port, int* rtcp_port);
496

497 498 499 500 501 502 503 504
/**
 * Print the route used to send the stream if the ICE process has finished successfully.
 *
 * @param cl A pointer to a check list
 * @param message A message to print before the route
 */
MS2_PUBLIC void ice_check_list_print_route(const IceCheckList *cl, const char *message);

Ghislain MARY's avatar
Ghislain MARY committed
505 506 507
/**
 * Dump an ICE session in the traces (debug function).
 */
508
MS2_PUBLIC void ice_dump_session(const IceSession *session);
Ghislain MARY's avatar
Ghislain MARY committed
509

Ghislain MARY's avatar
Ghislain MARY committed
510 511 512
/**
 * Dump the candidates of an ICE check list in the traces (debug function).
 */
513
MS2_PUBLIC void ice_dump_candidates(const IceCheckList *cl);
514

Ghislain MARY's avatar
Ghislain MARY committed
515 516 517
/**
 * Dump the candidate pairs of an ICE check list in the traces (debug function).
 */
518
MS2_PUBLIC void ice_dump_candidate_pairs(const IceCheckList *cl);
Ghislain MARY's avatar
Ghislain MARY committed
519

520 521 522
/**
 * Dump the valid list of an ICE check list in the traces (debug function).
 */
523
MS2_PUBLIC void ice_dump_valid_list(const IceCheckList *cl);
524

Ghislain MARY's avatar
Ghislain MARY committed
525 526 527
/**
 * Dump the list of candidate pair foundations of an ICE check list in the traces (debug function).
 */
528
MS2_PUBLIC void ice_dump_candidate_pairs_foundations(const IceCheckList *cl);
529

530 531 532
/**
 * Dump the list of component IDs of an ICE check list in the traces (debug function).
 */
533
MS2_PUBLIC void ice_dump_componentIDs(const IceCheckList *cl);
534

Ghislain MARY's avatar
Ghislain MARY committed
535 536 537
/**
 * Dump an ICE check list in the traces (debug function).
 */
538
MS2_PUBLIC void ice_dump_check_list(const IceCheckList *cl);
Ghislain MARY's avatar
Ghislain MARY committed
539 540 541 542

/**
 * Dump the triggered checks queue of an ICE check list in the traces (debug function).
 */
543
MS2_PUBLIC void ice_dump_triggered_checks_queue(const IceCheckList *cl);
Ghislain MARY's avatar
Ghislain MARY committed
544

Ghislain MARY's avatar
Ghislain MARY committed
545 546 547 548 549
#ifdef __cplusplus
}
#endif

#endif