| agent.h | | agent.h | |
| | | | |
| skipping to change at line 55 | | skipping to change at line 55 | |
| * @short_description: ICE agent API implementation | | * @short_description: ICE agent API implementation | |
| * @see_also: #NiceCandidate, #NiceAddress | | * @see_also: #NiceCandidate, #NiceAddress | |
| * @include: agent.h | | * @include: agent.h | |
| * @stability: Stable | | * @stability: Stable | |
| * | | * | |
| * The #NiceAgent is your main object when using libnice. | | * The #NiceAgent is your main object when using libnice. | |
| * It is the agent that will take care of everything relating to ICE. | | * It is the agent that will take care of everything relating to ICE. | |
| * It will take care of discovering your local candidates and do | | * It will take care of discovering your local candidates and do | |
| * connectivity checks to create a stream of data between you and your pee
r. | | * connectivity checks to create a stream of data between you and your pee
r. | |
| * | | * | |
|
| | | * A #NiceAgent must always be used with a #GMainLoop running the #GMainCon | |
| | | text | |
| | | * passed into nice_agent_new() (or nice_agent_new_reliable()). Without the | |
| | | * #GMainContext being iterated, the agent’s timers will not fire and, if | |
| | | * nice_agent_attach_recv() is used, packets will not be received. | |
| | | * | |
| * Streams and their components are referenced by integer IDs (with respect
to a | | * Streams and their components are referenced by integer IDs (with respect
to a | |
| * given #NiceAgent). These IDs are guaranteed to be positive (i.e. non-zer
o) | | * given #NiceAgent). These IDs are guaranteed to be positive (i.e. non-zer
o) | |
| * for valid streams/components. | | * for valid streams/components. | |
| * | | * | |
| * Each stream can receive data in one of two ways: using | | * Each stream can receive data in one of two ways: using | |
| * nice_agent_attach_recv() or nice_agent_recv_messages() (and the derived | | * nice_agent_attach_recv() or nice_agent_recv_messages() (and the derived | |
| * #NiceInputStream and #NiceIOStream classes accessible using | | * #NiceInputStream and #NiceIOStream classes accessible using | |
| * nice_agent_get_io_stream()). nice_agent_attach_recv() is non-blocking: i
t | | * nice_agent_get_io_stream()). nice_agent_attach_recv() is non-blocking: i
t | |
| * takes a user-provided callback function and attaches the stream’s sock
et to | | * takes a user-provided callback function and attaches the stream’s sock
et to | |
| * the provided #GMainContext, invoking the callback in that context for ev
ery | | * the provided #GMainContext, invoking the callback in that context for ev
ery | |
| | | | |
| skipping to change at line 76 | | skipping to change at line 81 | |
| * packet, and writes it directly into a user-provided buffer. This reduces
the | | * packet, and writes it directly into a user-provided buffer. This reduces
the | |
| * number of callback invokations and (potentially) buffer copies required
to | | * number of callback invokations and (potentially) buffer copies required
to | |
| * receive packets. nice_agent_recv_messages() (or #NiceInputStream) is des
igned | | * receive packets. nice_agent_recv_messages() (or #NiceInputStream) is des
igned | |
| * to be used in a blocking loop in a separate thread. | | * to be used in a blocking loop in a separate thread. | |
| * | | * | |
| * <example> | | * <example> | |
| * <title>Simple example on how to use libnice</title> | | * <title>Simple example on how to use libnice</title> | |
| * <programlisting> | | * <programlisting> | |
| * guint stream_id; | | * guint stream_id; | |
| * gchar buffer[] = "hello world!"; | | * gchar buffer[] = "hello world!"; | |
|
| | | * gchar *ufrag = NULL, *pwd = NULL; | |
| | | * gchar *remote_ufrag, *remote_pwd; | |
| * GSList *lcands = NULL; | | * GSList *lcands = NULL; | |
| * | | * | |
|
| * // Create a nice agent | | * // Create a nice agent, passing in the global default GMainContext. | |
| * NiceAgent *agent = nice_agent_new (NULL, NICE_COMPATIBILITY_RFC5245); | | * NiceAgent *agent = nice_agent_new (NULL, NICE_COMPATIBILITY_RFC5245); | |
|
| | | * spawn_thread_to_run_main_loop (g_main_loop_new (NULL, FALSE)); | |
| * | | * | |
| * // Connect the signals | | * // Connect the signals | |
| * g_signal_connect (G_OBJECT (agent), "candidate-gathering-done", | | * g_signal_connect (G_OBJECT (agent), "candidate-gathering-done", | |
| * G_CALLBACK (cb_candidate_gathering_done), NULL); | | * G_CALLBACK (cb_candidate_gathering_done), NULL); | |
| * g_signal_connect (G_OBJECT (agent), "component-state-changed", | | * g_signal_connect (G_OBJECT (agent), "component-state-changed", | |
| * G_CALLBACK (cb_component_state_changed), NULL); | | * G_CALLBACK (cb_component_state_changed), NULL); | |
| * g_signal_connect (G_OBJECT (agent), "new-selected-pair", | | * g_signal_connect (G_OBJECT (agent), "new-selected-pair", | |
| * G_CALLBACK (cb_new_selected_pair), NULL); | | * G_CALLBACK (cb_new_selected_pair), NULL); | |
| * | | * | |
| * // Create a new stream with one component and start gathering candidat
es | | * // Create a new stream with one component and start gathering candidat
es | |
| * stream_id = nice_agent_add_stream (agent, 1); | | * stream_id = nice_agent_add_stream (agent, 1); | |
| * nice_agent_gather_candidates (agent, stream_id); | | * nice_agent_gather_candidates (agent, stream_id); | |
| * | | * | |
| * // Attach to the component to receive the data | | * // Attach to the component to receive the data | |
| * nice_agent_attach_recv (agent, stream_id, 1, NULL, | | * nice_agent_attach_recv (agent, stream_id, 1, NULL, | |
| * cb_nice_recv, NULL); | | * cb_nice_recv, NULL); | |
| * | | * | |
| * // ... Wait until the signal candidate-gathering-done is fired ... | | * // ... Wait until the signal candidate-gathering-done is fired ... | |
| * lcands = nice_agent_get_local_candidates(agent, stream_id, 1); | | * lcands = nice_agent_get_local_candidates(agent, stream_id, 1); | |
|
| | | | |
| | | * nice_agent_get_local_credentials(agent, stream_id, &ufrag, &pwd); | |
| | | * | |
| | | * // ... Send local candidates and credentials to the peer | |
| * | | * | |
|
| * // ... Send local candidates to the peer and set the peer's remote can | | * // Set the peer's remote credentials and remote candidates | |
| didates | | * nice_agent_set_remote_credentials (agent, stream_id, remote_ufrag, rem | |
| | | ote_pwd); | |
| * nice_agent_set_remote_candidates (agent, stream_id, 1, rcands); | | * nice_agent_set_remote_candidates (agent, stream_id, 1, rcands); | |
| * | | * | |
| * // ... Wait until the signal new-selected-pair is fired ... | | * // ... Wait until the signal new-selected-pair is fired ... | |
| * // Send our message! | | * // Send our message! | |
| * nice_agent_send (agent, stream_id, 1, sizeof(buffer), buffer); | | * nice_agent_send (agent, stream_id, 1, sizeof(buffer), buffer); | |
| * | | * | |
|
| * // Anything received will be received through the cb_nice_recv callbac | | * // Anything received will be received through the cb_nice_recv callbac | |
| k | | k. | |
| | | * // You must be running a GMainLoop on the global default GMainContext | |
| | | in | |
| | | * // another thread for this to work. | |
| * | | * | |
| * // Destroy the object | | * // Destroy the object | |
| * g_object_unref(agent); | | * g_object_unref(agent); | |
| * | | * | |
| * </programlisting> | | * </programlisting> | |
| * </example> | | * </example> | |
| * | | * | |
| * Refer to the examples in the examples/ subdirectory of the libnice sourc
e for | | * Refer to the examples in the examples/ subdirectory of the libnice sourc
e for | |
| * more complete examples. | | * more complete examples. | |
| * | | * | |
| | | | |
| skipping to change at line 550 | | skipping to change at line 565 | |
| * (length must be between 22 and 256 chars) | | * (length must be between 22 and 256 chars) | |
| * @pwd: NULL-terminated string containing an ICE password | | * @pwd: NULL-terminated string containing an ICE password | |
| * (length must be between 4 and 256 chars) | | * (length must be between 4 and 256 chars) | |
| * | | * | |
| * Sets the remote credentials for stream @stream_id. | | * Sets the remote credentials for stream @stream_id. | |
| * | | * | |
| <note> | | <note> | |
| <para> | | <para> | |
| Stream credentials do not override per-candidate credentials if set | | Stream credentials do not override per-candidate credentials if set | |
| </para> | | </para> | |
|
| | | <para> | |
| | | Due to the native of peer-reflexive candidates, any agent using a per- | |
| | | stream | |
| | | credentials (RFC5245, WLM2009, OC2007R2 and DRAFT19) instead of | |
| | | per-candidate credentials (GOOGLE, MSN, OC2007), must | |
| | | use the nice_agent_set_remote_credentials() API instead of setting the | |
| | | username and password on the candidates. | |
| | | </para> | |
| </note> | | </note> | |
| * | | * | |
| * Returns: %TRUE on success, %FALSE on error. | | * Returns: %TRUE on success, %FALSE on error. | |
| */ | | */ | |
| gboolean | | gboolean | |
| nice_agent_set_remote_credentials ( | | nice_agent_set_remote_credentials ( | |
| NiceAgent *agent, | | NiceAgent *agent, | |
| guint stream_id, | | guint stream_id, | |
| const gchar *ufrag, const gchar *pwd); | | const gchar *ufrag, const gchar *pwd); | |
| | | | |
| | | | |
End of changes. 8 change blocks. |
| 5 lines changed or deleted | | 30 lines changed or added | |
|
| constants.h | | constants.h | |
| | | | |
| skipping to change at line 40 | | skipping to change at line 40 | |
| * LGPL and not to allow others to use your version of this file under the | | * LGPL and not to allow others to use your version of this file under the | |
| * MPL, indicate your decision by deleting the provisions above and replace | | * MPL, indicate your decision by deleting the provisions above and replace | |
| * them with the notice and other provisions required by the LGPL. If you d
o | | * them with the notice and other provisions required by the LGPL. If you d
o | |
| * not delete the provisions above, a recipient may use your version of thi
s | | * not delete the provisions above, a recipient may use your version of thi
s | |
| * file under either the MPL or the LGPL. | | * file under either the MPL or the LGPL. | |
| */ | | */ | |
| | | | |
| #ifndef _STUN_CONSTANTS_H | | #ifndef _STUN_CONSTANTS_H | |
| #define _STUN_CONSTANTS_H | | #define _STUN_CONSTANTS_H | |
| | | | |
|
| | | /** | |
| | | * SECTION:stunconstants | |
| | | * @short_description: STUN constants | |
| | | * @include: stun/constants.h | |
| | | * @stability: Stable | |
| | | * | |
| | | * Various constants defining parts of the STUN and TURN protocols and | |
| | | * on-the-wire packet formats. | |
| | | */ | |
| | | | |
| | | /** | |
| | | * STUN_ATTRIBUTE_LENGTH_LEN: | |
| | | * | |
| | | * Length of the length field of a STUN attribute (in bytes). | |
| | | */ | |
| | | /** | |
| | | * STUN_ATTRIBUTE_LENGTH_POS: | |
| | | * | |
| | | * Offset of the length field of a STUN attribute (in bytes). | |
| | | */ | |
| | | /** | |
| | | * STUN_ATTRIBUTE_TYPE_LEN: | |
| | | * | |
| | | * Length of the type field of a STUN attribute (in bytes). | |
| | | */ | |
| | | /** | |
| | | * STUN_ATTRIBUTE_TYPE_POS: | |
| | | * | |
| | | * Offset of the type field of a STUN attribute (in bytes). | |
| | | */ | |
| | | /** | |
| | | * STUN_ATTRIBUTE_VALUE_POS: | |
| | | * | |
| | | * Offset of the value field of a STUN attribute (in bytes). | |
| | | */ | |
| | | /** | |
| | | * STUN_ID_LEN: | |
| | | * | |
| | | * Length of the ID field of a STUN message (in bytes). | |
| | | */ | |
| | | /** | |
| | | * STUN_MAGIC_COOKIE: | |
| | | * | |
| | | * Magic cookie value used to identify STUN messages. | |
| | | */ | |
| | | /** | |
| | | * TURN_MAGIC_COOKIE: | |
| | | * | |
| | | * Magic cookie value used to identify TURN messages. | |
| | | */ | |
| | | /** | |
| | | * STUN_MAX_MESSAGE_SIZE_IPV4: | |
| | | * | |
| | | * Maximum size of a STUN message sent over IPv4 (in bytes). | |
| | | */ | |
| | | /** | |
| | | * STUN_MAX_MESSAGE_SIZE_IPV6: | |
| | | * | |
| | | * Maximum size of a STUN message sent over IPv6 (in bytes). | |
| | | */ | |
| | | /** | |
| | | * STUN_MESSAGE_ATTRIBUTES_POS: | |
| | | * | |
| | | * Offset of the attributes of a STUN message (in bytes). | |
| | | */ | |
| | | /** | |
| | | * STUN_MESSAGE_HEADER_LENGTH: | |
| | | * | |
| | | * Total length of a STUN message header (in bytes). | |
| | | */ | |
| | | /** | |
| | | * STUN_MESSAGE_LENGTH_LEN: | |
| | | * | |
| | | * Length of the length field of a STUN message (in bytes). | |
| | | */ | |
| | | /** | |
| | | * STUN_MESSAGE_LENGTH_POS: | |
| | | * | |
| | | * Offset of the length field of a STUN message (in bytes). | |
| | | */ | |
| | | /** | |
| | | * STUN_MESSAGE_TRANS_ID_LEN: | |
| | | * | |
| | | * Length of the transaction ID field of a STUN message (in bytes). | |
| | | */ | |
| | | /** | |
| | | * STUN_MESSAGE_TRANS_ID_POS: | |
| | | * | |
| | | * Offset of the transaction ID field of a STUN message (in bytes). | |
| | | */ | |
| | | /** | |
| | | * STUN_MESSAGE_TYPE_LEN: | |
| | | * | |
| | | * Length of the type field of a STUN message (in bytes). | |
| | | */ | |
| | | /** | |
| | | * STUN_MESSAGE_TYPE_POS: | |
| | | * | |
| | | * Offset of the type field of a STUN message (in bytes). | |
| | | */ | |
| | | | |
| #define STUN_MESSAGE_TYPE_POS 0 | | #define STUN_MESSAGE_TYPE_POS 0 | |
| #define STUN_MESSAGE_TYPE_LEN 2 | | #define STUN_MESSAGE_TYPE_LEN 2 | |
| #define STUN_MESSAGE_LENGTH_POS \ | | #define STUN_MESSAGE_LENGTH_POS \ | |
| (STUN_MESSAGE_TYPE_POS + STUN_MESSAGE_TYPE_LEN) | | (STUN_MESSAGE_TYPE_POS + STUN_MESSAGE_TYPE_LEN) | |
| #define STUN_MESSAGE_LENGTH_LEN 2 | | #define STUN_MESSAGE_LENGTH_LEN 2 | |
| #define STUN_MESSAGE_TRANS_ID_POS \ | | #define STUN_MESSAGE_TRANS_ID_POS \ | |
| (STUN_MESSAGE_LENGTH_POS + STUN_MESSAGE_LENGTH_LEN) | | (STUN_MESSAGE_LENGTH_POS + STUN_MESSAGE_LENGTH_LEN) | |
| #define STUN_MESSAGE_TRANS_ID_LEN 16 | | #define STUN_MESSAGE_TRANS_ID_LEN 16 | |
| #define STUN_MESSAGE_ATTRIBUTES_POS \ | | #define STUN_MESSAGE_ATTRIBUTES_POS \ | |
| (STUN_MESSAGE_TRANS_ID_POS + STUN_MESSAGE_TRANS_ID_LEN) | | (STUN_MESSAGE_TRANS_ID_POS + STUN_MESSAGE_TRANS_ID_LEN) | |
| | | | |
| skipping to change at line 61 | | skipping to change at line 162 | |
| #define STUN_MESSAGE_HEADER_LENGTH STUN_MESSAGE_ATTRIBUTES_POS | | #define STUN_MESSAGE_HEADER_LENGTH STUN_MESSAGE_ATTRIBUTES_POS | |
| | | | |
| #define STUN_ATTRIBUTE_TYPE_POS 0 | | #define STUN_ATTRIBUTE_TYPE_POS 0 | |
| #define STUN_ATTRIBUTE_TYPE_LEN 2 | | #define STUN_ATTRIBUTE_TYPE_LEN 2 | |
| #define STUN_ATTRIBUTE_LENGTH_POS \ | | #define STUN_ATTRIBUTE_LENGTH_POS \ | |
| (STUN_ATTRIBUTE_TYPE_POS + STUN_ATTRIBUTE_TYPE_LEN) | | (STUN_ATTRIBUTE_TYPE_POS + STUN_ATTRIBUTE_TYPE_LEN) | |
| #define STUN_ATTRIBUTE_LENGTH_LEN 2 | | #define STUN_ATTRIBUTE_LENGTH_LEN 2 | |
| #define STUN_ATTRIBUTE_VALUE_POS \ | | #define STUN_ATTRIBUTE_VALUE_POS \ | |
| (STUN_ATTRIBUTE_LENGTH_POS + STUN_ATTRIBUTE_LENGTH_LEN) | | (STUN_ATTRIBUTE_LENGTH_POS + STUN_ATTRIBUTE_LENGTH_LEN) | |
| | | | |
|
| | | /** | |
| | | * STUN_ATTRIBUTE_HEADER_LENGTH: | |
| | | * | |
| | | * Length of a single STUN attribute header (in bytes). | |
| | | */ | |
| #define STUN_ATTRIBUTE_HEADER_LENGTH STUN_ATTRIBUTE_VALUE_POS | | #define STUN_ATTRIBUTE_HEADER_LENGTH STUN_ATTRIBUTE_VALUE_POS | |
| | | | |
| #define STUN_MAX_MESSAGE_SIZE_IPV4 576 | | #define STUN_MAX_MESSAGE_SIZE_IPV4 576 | |
| #define STUN_MAX_MESSAGE_SIZE_IPV6 1280 | | #define STUN_MAX_MESSAGE_SIZE_IPV6 1280 | |
| /* #define STUN_MAX_MESSAGE_SIZE STUN_MAX_MESSAGE_SIZE_IPV4 */ | | /* #define STUN_MAX_MESSAGE_SIZE STUN_MAX_MESSAGE_SIZE_IPV4 */ | |
| | | | |
| #define STUN_ID_LEN 16 | | #define STUN_ID_LEN 16 | |
| | | | |
|
| | | /** | |
| | | * STUN_AGENT_MAX_SAVED_IDS: | |
| | | * | |
| | | * Maximum number of simultaneously ongoing STUN transactions. | |
| | | */ | |
| #define STUN_AGENT_MAX_SAVED_IDS 200 | | #define STUN_AGENT_MAX_SAVED_IDS 200 | |
|
| | | | |
| | | /** | |
| | | * STUN_AGENT_MAX_UNKNOWN_ATTRIBUTES: | |
| | | * | |
| | | * Maximum number of unknown attribute which can be handled in a single STU | |
| | | N | |
| | | * message. | |
| | | */ | |
| #define STUN_AGENT_MAX_UNKNOWN_ATTRIBUTES 256 | | #define STUN_AGENT_MAX_UNKNOWN_ATTRIBUTES 256 | |
| | | | |
| #define STUN_MAGIC_COOKIE 0x2112A442 | | #define STUN_MAGIC_COOKIE 0x2112A442 | |
| #define TURN_MAGIC_COOKIE 0x72c64bc6 | | #define TURN_MAGIC_COOKIE 0x72c64bc6 | |
| | | | |
| #ifndef TRUE | | #ifndef TRUE | |
| #define TRUE (1 == 1) | | #define TRUE (1 == 1) | |
| #endif | | #endif | |
| | | | |
| #ifndef FALSE | | #ifndef FALSE | |
| | | | |
End of changes. 4 change blocks. |
| 0 lines changed or deleted | | 119 lines changed or added | |
|
| turn.h | | turn.h | |
| | | | |
| skipping to change at line 98 | | skipping to change at line 98 | |
| } StunUsageTurnRequestPorts; | | } StunUsageTurnRequestPorts; | |
| | | | |
| /** | | /** | |
| * StunUsageTurnCompatibility: | | * StunUsageTurnCompatibility: | |
| * @STUN_USAGE_TURN_COMPATIBILITY_DRAFT9: Use the specification compatible
with | | * @STUN_USAGE_TURN_COMPATIBILITY_DRAFT9: Use the specification compatible
with | |
| * TURN Draft 09 | | * TURN Draft 09 | |
| * @STUN_USAGE_TURN_COMPATIBILITY_GOOGLE: Use the specification compatible
with | | * @STUN_USAGE_TURN_COMPATIBILITY_GOOGLE: Use the specification compatible
with | |
| * Google Talk's relay server | | * Google Talk's relay server | |
| * @STUN_USAGE_TURN_COMPATIBILITY_MSN: Use the specification compatible wit
h | | * @STUN_USAGE_TURN_COMPATIBILITY_MSN: Use the specification compatible wit
h | |
| * MSN TURN servers | | * MSN TURN servers | |
|
| | | * @STUN_USAGE_TURN_COMPATIBILITY_OC2007: Use the specification compatible | |
| | | with | |
| | | * Microsoft Office Communicator 2007 | |
| | | * @STUN_USAGE_TURN_COMPATIBILITY_RFC5766: Use the specification compatible | |
| | | with | |
| | | * RFC 5766 (the final, canonical TURN standard) | |
| * | | * | |
| * Specifies which TURN specification compatibility to use | | * Specifies which TURN specification compatibility to use | |
| */ | | */ | |
| typedef enum { | | typedef enum { | |
| STUN_USAGE_TURN_COMPATIBILITY_DRAFT9, | | STUN_USAGE_TURN_COMPATIBILITY_DRAFT9, | |
| STUN_USAGE_TURN_COMPATIBILITY_GOOGLE, | | STUN_USAGE_TURN_COMPATIBILITY_GOOGLE, | |
| STUN_USAGE_TURN_COMPATIBILITY_MSN, | | STUN_USAGE_TURN_COMPATIBILITY_MSN, | |
| STUN_USAGE_TURN_COMPATIBILITY_OC2007, | | STUN_USAGE_TURN_COMPATIBILITY_OC2007, | |
| STUN_USAGE_TURN_COMPATIBILITY_RFC5766, | | STUN_USAGE_TURN_COMPATIBILITY_RFC5766, | |
| } StunUsageTurnCompatibility; | | } StunUsageTurnCompatibility; | |
| | | | |
| skipping to change at line 206 | | skipping to change at line 210 | |
| * Create a new TURN Refresh request | | * Create a new TURN Refresh request | |
| * Returns: The length of the message to send | | * Returns: The length of the message to send | |
| */ | | */ | |
| size_t stun_usage_turn_create_refresh (StunAgent *agent, StunMessage *msg, | | size_t stun_usage_turn_create_refresh (StunAgent *agent, StunMessage *msg, | |
| uint8_t *buffer, size_t buffer_len, | | uint8_t *buffer, size_t buffer_len, | |
| StunMessage *previous_response, int32_t lifetime, | | StunMessage *previous_response, int32_t lifetime, | |
| uint8_t *username, size_t username_len, | | uint8_t *username, size_t username_len, | |
| uint8_t *password, size_t password_len, | | uint8_t *password, size_t password_len, | |
| StunUsageTurnCompatibility compatibility); | | StunUsageTurnCompatibility compatibility); | |
| | | | |
|
| | | /** | |
| | | * stun_usage_turn_create_permission: | |
| | | * @agent: The #StunAgent to use to build the request | |
| | | * @msg: The #StunMessage to build | |
| | | * @buffer: The buffer to use for creating the #StunMessage | |
| | | * @buffer_len: The size of the @buffer | |
| | | * @username: The username to use in the request | |
| | | * @username_len: The length of @username | |
| | | * @password: The key to use for building the MESSAGE-INTEGRITY | |
| | | * @password_len: The length of @password | |
| | | * @realm: The realm identifier to use in the request | |
| | | * @realm_len: The length of @realm | |
| | | * @nonce: Unique and securely random nonce to use in the request | |
| | | * @nonce_len: The length of @nonce | |
| | | * @peer: Server-reflexive host address to request permission for | |
| | | * @compatibility: The compatibility mode to use for building the | |
| | | * CreatePermission request | |
| | | * | |
| | | * Create a new TURN CreatePermission request | |
| | | * | |
| | | * Returns: The length of the message to send | |
| | | */ | |
| size_t stun_usage_turn_create_permission (StunAgent *agent, StunMessage *ms
g, | | size_t stun_usage_turn_create_permission (StunAgent *agent, StunMessage *ms
g, | |
| uint8_t *buffer, size_t buffer_len, | | uint8_t *buffer, size_t buffer_len, | |
| uint8_t *username, size_t username_len, | | uint8_t *username, size_t username_len, | |
| uint8_t *password, size_t password_len, | | uint8_t *password, size_t password_len, | |
| uint8_t *realm, size_t realm_len, | | uint8_t *realm, size_t realm_len, | |
| uint8_t *nonce, size_t nonce_len, | | uint8_t *nonce, size_t nonce_len, | |
| struct sockaddr_storage *peer, | | struct sockaddr_storage *peer, | |
| StunUsageTurnCompatibility compatibility); | | StunUsageTurnCompatibility compatibility); | |
| | | | |
| /** | | /** | |
| | | | |
End of changes. 2 change blocks. |
| 0 lines changed or deleted | | 28 lines changed or added | |
|