| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
| |
Once an interface got ignored, ALL interfaces coming after it were
dropped too.
|
|
|
| |
Fixes MSVC build.
|
|
|
|
| |
Since g_parse_debug_string() was looking only at the first 4 items in
GDebugKey arrays, "libnice-verbose" couldn't get activated.
|
|
|
|
|
| |
We support turn-tcp in oc2007 compatibility only and when the
host candidate transport is compatible, ie when reliable_tcp is true.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
When receiving an stun packet on a socket, and looking for the matching
local candidate, normally it doesn't make a difference to test the
address or the base address. Because a pair cannot have a local candidate
of type srv-rflx, where there would be a difference, the local candidate
obtained will be part of a pair of the conncheck list.
Except for the case of a pairs with tcp-act local candidate, where the
addr has a port number of zero (tcp-act socket before connect), and the
socket of the stun packet has a non-null port number (tcp-act socket
after connect), corresponding to the base address of another
peer-reflexive tcp-act local candidate, previously discoverd.
The selection of the local candidate concerned by an inbound stun
request happens when early incoming checks are processed, and when
inbound stun packets are normally received during the conncheck.
This commit complete commit e6a1941 (for early incoming checks)
in the normal inbound stun packets code path, where is similar
modification is needed.
|
|
|
|
|
| |
This patch rewrites the comment surrounding this code snippet, to make it
clear, that this pair selection is not specific to the tcp transport.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The current valid pair nomination makes no effort to select pairs that
could have some similarities across different components and different
streams. This is normally not required by the RFC8445, but some well
known applications will misbehave when the libnice agent is in this
position to choose the nominated pairs (regular nomination mode, and
controlling mode) and if it makes an unexpected choice from the peer
point-of-view.
This patch improves the stopping criterion and the selection of the
preferred pair to nominate in that case.
When no other pair has been nominated yet (across all streams), the
previous stopping criterion still applies, and the best ranked pair of
the checklist is selected.
When a nominated pair exists from another component, we try to nominate
a pair of the same kind (same local and remote addresses and same
transport) if we have one, and possibly the best pair we have in the
checklist, and else we look for a nominated pair from another stream.
|
| |
|
|
|
|
| |
The source is also detached in socket_source_free()
|
|
|
|
|
|
|
|
|
|
| |
This final idle timeout is renamed from the
NICE_AGENT_MAX_TIMER_GRACE_PERIOD macro, and keeps its semantic.
We also increase the default value of this timeout from 1 second to 5
seconds. This is useful for the sipe pidgin plugin that has to deal
with SfB agents, that may take some time in controlling mode before
choosing and testing the nominated pair
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This patch fixes the priority assigned to a peer reflexive discovered
local candidate, when the agent has the stun client role and receives an
stun reply. This priority must be the value put in the stun request, ie
the pair->rflx_priority from the parent pair. This ensures two similar
ordered pairs, will generate discovered pairs ordered in the same way
for the stun client, and also for the stun server on the other side.
Without this identical ordered on both sides of the connections, the two
agents may nominate a different pair with the aggresive nomination
scenario, since both are valid.
The other fix concerns the function that ensures local candidates
priority uniqueness, that breaks the assumption that "two local
candidates having the same priority should generate the same
prflx_priority in the pairs they contribute". Respecting this assumption
is important to stay coherent with the behavior of the other agent, that
considers that two stun requests coming from the same peer-reflexive
remote candidate will have the same remote priority (once a remote
candidate is added to the component remote_candidates list, its priority
is not supposed to change).
|
|
|
|
|
|
| |
When replaying the incoming checks, we have to create the succeeded
valid pair matching this tcp connection the same way we do it
in conn_check_handle_inbound_stun().
|
|
|
|
|
|
|
|
| |
These candidates type is updated from peer-reflexive, discovered during
early incoming checks, to the type of the matching regularly transmitted
candidate, so the previous sockptr value is no longer of interest here.
The same socket is already associated to the initial local candidate
anyway, source of the early discovery.
|
|
|
|
|
|
|
|
|
|
|
| |
A socket to be removed may also come from a peer-reflexive remote
candidate, and some cleanup also needs to be done in this case. This
reference in a remote peer-reflexive tcp-active candidate caused a
heap-use-after-free asan error in some custom debugging dump of the list
of sockets of a component, after a read error in component_io_cb():
agent_recv_message_unlocked returned -1, errno (25) :
Inappropriate ioctl for device
|
| |
|
| |
|
|
|
|
|
|
|
|
| |
The candidate may be a newly discovered peer reflexive one,
or a server reflexive initial candidate, where address and
base address differ. Early incoming checks are received on
the base address. These incoming checks may accumulate if remote
credentials arrive with a delay.
|
|
|
|
|
| |
In complement to the conncheck list, we dump the pair transport type,
the socket type, and the incoming checks list.
|
| |
|
|
|
|
|
|
|
| |
This complete the similar debug trace when remote candidates are
received, and help to debug our tests with the patched farstream
library, where candidates and credentials are transmitted with a
random delay.
|
|
|
|
|
|
| |
This foundation update may be needed when a selected pair contains a remote
candidate that has been found by an inbound stun request, but has not
been received by nice_agent_set_remote_candidates()
|
|
|
|
| |
This reverts commit ca47519feda9d4dad38a06e2f7d94c0afc501364.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
conn_check_prune_socket() on nsocket must be called before removing the
candidate with this socket inside the loop, to prevent the
use-after-free reported initially in issue #73.
But commit 541801d introduced a regression during discovery when an udp
turn over tcp socket is immediately closed by a HUP condition for
example. In this case, discovery_prune_socket() is never called, because
we don't have a candidate with this socket inside the loop. So the
nsocket is freed by the final nice_component_detach_socket() but is
still used by the discovery timer callback.
This commit moves the discovery_prune_socket() and
conn_check_prune_socket() actions before the loop instead of after, or
inside.
Closes #73
|
| |
|
|
|
|
|
|
|
| |
The patch makes the agent alive at least until the last callback of
the removal of turn refreshes when a stream is deleted from the agent.
Closes #84
|
|
|
|
|
|
| |
The base64 decoded username and password strings given to
stun_usage_turn_create() should not freed immediately, since they remain
used when handling the following related inbound stun replies.
|
|
|
|
|
| |
The automake generated ones are a little funky, so the meson one have to also be
to not break API...
|
|
|
|
|
|
|
| |
This API makes it possible to get an array of all of the sockets used
by a specific component, this is useful to set options on the socket.
Also bump GLib requirement to 2.54, which is the version in RHEL 7
|
| |
|
|
|
|
|
|
|
|
| |
Improve on commit b4abda09c79e4ce372a3771300abf568c85c7ff5
Instead of checking one prefix, check against a list of prefixes. This
allows libnice to be configured to ignore interfaces from virtual
machines and containers.
|
|
|
|
| |
Check for IFF_UP and IFF_RUNNING flags on the interface.
|
|
|
|
|
|
|
| |
Update nice_interfaces_is_private_ip() to handle IPv6 too:
- unique local address block: fc00::/7
- link-local address block: fe80::/10
|
|
|
|
|
|
| |
This fixes commit b4abda09c79e4ce372a3771300abf568c85c7ff5
Copy the implementation to the !HAVE_GETIFADDRS branch too.
|
|
|
|
|
| |
Clone implementation from HAVE_GETIFADDRS branch to !HAVE_GETIFADDRS
branch of nice_interfaces_get_local_ips()
|
|
|
|
| |
Code comment mentions peer reflexive candidate pair should be selected
only in the case of TCP local candidates, but it was done in all cases.
|
|
|
|
| |
This makes the API more GIO style
|
|
|
|
|
| |
Asynchronously closes resources the agent has allocated on remote
servers.
|
| |
|
|
|
|
|
|
|
|
| |
When deleting a turn refresh, ensure the assocaited port allocations on
the TURN server are properly removed. This means wait for a response for
our 0-lifetime refresh request and implement retransmissions. Only
delete the refresh after TURN port removal has been confirmed or all
our retransmissions timed out.
|
|
|
|
| |
First collect the relay candidates, then dispose them in a loop.
|
| |
|
| |
|
|
|
|
|
|
| |
Attribute is proposed here: https://tools.ietf.org/html/draft-thatcher-ice-renomination-00
WebRTC supports this attribute: controlling side provides attribute value increased by one each time selected pair is changed:
https://chromium.googlesource.com/external/webrtc/+/3c7d599750405bc734e1d5adbf1b54265b725a9d/p2p/base/p2ptransportchannel.cc#1821
|
|
|
|
|
|
|
| |
conn_check_prune_socket() was trying to access deleted NiceCandidate
instance. Prune the socket before removing the candidate.
Closes #73
|
| |
|
|
|
|
|
|
|
|
|
| |
In this mode, activated by setting "ice-trickle" property of a
NiceAgent to TRUE, a component without a successful connectivity check
will wait indefinitely for more remote candidates to come.
nice_agent_peer_candidate_gathering_done() must be called after
receiving the last remote candidate for the component to finally change
its state to NICE_COMPONENT_STATE_FAILED.
|
|
|
| |
Limits accidental leakage of secret information.
|
|
|
|
|
| |
Don't set a timeout to the very far future if the lifetime sent by the
server is under 60s. Instead of doing "lifetime - 60", switch to lifetime/2.
|
|
|
|
|
| |
Don't unref NiceAgent while holding agent mutex. If it's the last
reference, nice_agent_dispose() will try to acquire the mutex again and
deadlock.
|
| |
|