| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
|
| |
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
|
|
|
|
|
| |
Asynchronously closes resources the agent has allocated on remote
servers.
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This patch implements Regular Nomation as described in RFC5245
8.1.1.1. The controlling agent lets valid pairs accumulate, and
decides which pair to recheck with the use-candidate attribute set.
priv_mark_pair_nominated() follows 7.2.1.5, to update the nominated
pair when acting as a STUN server, and
priv_map_reply_to_conn_check_request() implements 7.1.3.2.4 to
update the nominated pair when acting as a STUN client. A new
property is also added to the agent to control the nomination
mode, which can be regular of aggressive, with default value
set to aggressive.
Two new flags are introduced in the CandidateCheckPair structure:
- use_candidate_on_next_check indicates the STUN client to add the
use-candidate attribute when the pair will be checked. At this
time, the nominated flag has not been set on this pair yet.
- mark_nominated_on_response_arrival indicates the STUN server
to nominate the pair when its succesfull response to a
previous triggered check will arrive (7.2.1.5, item #2)
Differential Revision: https://phabricator.freedesktop.org/D811
|
|
|
|
|
|
|
|
|
| |
Add a function that can check if two candidates point to the same place.
https://phabricator.freedesktop.org/T104
Reviewed-by: Philip Withnall <philip.withnall@collabora.co.uk>
Differential Revision: https://phabricator.freedesktop.org/D1715
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
|
| |
We depend on GLib 2.36.0, which deprecated g_type_init() since GType
initialisation is now done automatically.
Reviewed-by: Olivier Crête <olivier.crete@collabora.com>
Differential Revision: https://phabricator.freedesktop.org/D296
|
|
|
|
|
|
|
|
| |
There is no point in the NiceComponents having a state machine if the
state transition graph is not documented or enforced. Document and
enforce it.
http://phabricator.freedesktop.org/T120
|
|
|
|
| |
Adds new API: nice_agent_set_local_credentials().
|
|
|
|
| |
Now that they pass, we should endeavour to ensure they continue to pass.
|
|
|
|
| |
This should have been included before. This fixes `make check` in docs/.
|
|
|
|
|
| |
This straightens out the last few bits of the documentation and almost
allows `make check` to pass in docs/.
|
|
|
|
| |
This allows it to order the index a little better.
|
|
|
|
|
| |
We already used XML everywhere; just formally switch to XML mode and
eliminate the last few traces of SGML.
|
| |
|
|
|
|
|
| |
This is analogous to the UNIX shutdown() function, allowing either or
both sides of a pseudo-TCP connection to be shut down.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
In order to detect cases where the peer closes its connection without an
explicit in-band close message (e.g. in protocols such as Telnet where
there is none), pseudo-TCP needs to grow support for a shutdown
handshake, following the TCP FIN–ACK specification. Arguably it should
have had this all along, but Jingle apparently doesn’t need it.
This adds support for FIN–ACK to the pseudo-TCP implementation. It is
backwards-compatible, only being used if the TCP_OPT_FIN_ACK option is
specified in the SYN segment.
If enabled, full-duplex closes are supported, and the standard method
for notifying a peer of the other end closing its connection (returning
0 from recv()) is used.
Also allow rapidly tearing down a connection, discarding unsent and
unreceived data, by sending an RST segment. This preserves the ability to
do a forced socket closure with pseudo_tcp_socket_close(sock, TRUE).
It also permits graceful socket shutdown in the case where the final ACK
is lost, and one peer gets stuck in the LAST-ACK state: that peer will
eventually re-transmit its FIN segment. The other peer, in the CLOSED
state, will respond with a RST segment, and the first peer will then
reach CLOSED.
References (most useful first):
• http://tools.ietf.org/html/rfc793#section-3.5
• http://tools.ietf.org/html/rfc1122#page-87
• http://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux.html
• http://tools.ietf.org/html/rfc675
Diagram:
•
http://en.wikipedia.org/wiki/Transmission_Control_Protocol#mediaviewer/File:TCP_CLOSE.svg
|
|
|
|
|
|
|
|
|
|
| |
This is needed for the upcoming new test suite for pseudo-TCP. It
shouldn’t be used in normal code — only in tests.
Ideally, the pseudo-TCP code should originally never have called
g_get_monotonic_time() itself, and should have always taken a time
parameter from the caller; then it would be more testable.
Unfortunately, API guarantees prevent this from being changed now.
|
|
|
|
| |
New convenience API to check if the socket is in state TCP_CLOSED.
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
| |
Nice to make debug logs more friendly to read.
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Add one new public function, nice_agent_send_messages_nonblocking(),
which replaces nice_agent_send_full(). This isn’t an API break, because
nice_agent_send_full() hasn’t been in a release yet. The new API allows
sending multiple messages in a single call, and supports vectors of
buffers to transmit the messages from.
The existing nice_agent_send() API has been left untouched, although
it’s a bit of a bugbear because it’s non-blocking and doesn’t fit with
the new *_nonblocking() naming scheme. Oh well.
This doesn’t bring any notable changes to the number of memcpy()s on the
critical path: it remains at zero for the common cases and common socket
types. It introduces the possibility for future work to eliminate some
memcpy()s in more complex socket types, like tcp-turn and tcp-bsd, but
these optimisations have not been made yet. FIXME comments have been
added.
This includes modifications to the test-send-recv unit test to cover the
new API.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Add two new public functions:
• nice_agent_recv_messages()
• nice_agent_recv_messages_nonblocking()
which allow receiving multiple messages in a single call, and support
vectors of buffers to receive the messages into.
The existing nice_agent_recv[_nonblocking]() APIs have been left
untouched.
This tidies up a lot of the message handling code internally, and
eliminates a couple of memcpy()s. There are still a few more memcpy()s
on the critical path, which could be eliminated with further work.
In the reliable agent case, every message is memcpy()ed twice: once into
the pseudo-TCP receive buffer, and once out of it. The copy on input
could be eliminated (in the case of in-order delivery of packets) by
receiving directly into the receive buffer. The copy on output can’t be
eliminated except in the I/O callback case (when
nice_agent_attach_recv() has been used), in which case the callback
could be invoked with a pointer directly into the pseudo-TCP receive
buffer.
In the non-reliable agent case, zero memcpy()s are used.
A couple of the more complex socket implementations (TURN and HTTP) have
slow paths during setup, and partially also during normal use. These
could be optimised further, and FIXME comments have been added.
|
|
|
|
|
|
|
|
|
|
|
|
| |
Replace the recv() API with a recv_messages() API, which supports
receiving multiple messages, each with multiple buffers rather than a
single monolithic buffer.
This doesn’t break API, as the socket API is not exposed outside
libnice. It does introduce a new struct: NiceInputMessage, which is
analogous to struct mmsghdr.
This includes updates to the test-bsd test to cover the changed API.
|
|
|
|
|
|
|
|
|
| |
This is a non-blocking variant of nice_agent_recv(), and will be used
internally by the GPollableInputStream implementation. External
implementations may use it as well.
It reserves the right to iterate the main context, but doesn’t currently
do so.
|
|
|
|
|
| |
This allows creation of a NiceIOStream from an existing NiceAgent
instance.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This adds three new classes:
• NiceIOStream
• NiceInputStream
• NiceOutputStream
which allow wrapping a single stream/component pair in an I/O stream
which can be used with the standard GIO functions.
The streams are constructed as wrappers around a NiceAgent, with changes
to the NiceAgent’s properties affecting all instantiated streams.
Streams are only supported for reliable connections.
If the NiceAgent stream which underlies a NiceInputStream,
NiceOutputStream or NiceIOStream is removed, the I/O stream is marked as
closed.
This is based on work originally done by Youness Alaoui
<youness.alaoui@collabora.co.uk>.
|
|
|
|
|
|
|
|
|
|
|
|
| |
This adds GError and GCancellable parameters to the existing
nice_agent_send() API, and is identical in all other respects (notably,
it is non-blocking).
The GCancellable is currently unused, but could be used in future if the
API grows to support blocking writes.
The GError is used to return more interesting error codes than just
‘-1’.
|
|
|
|
|
|
|
|
| |
This is a blocking receive function, designed to be called from a worker
thread. It cannot be used in conjunction with the existing
nice_agent_attach_recv() API, as the blocking receive and the GSource
would compete over access to the single copy of the data in the kernel’s
receive buffer.
|
| |
|
|
|
|
| |
Older compilers don't understand all of the flags
|
| |
|
| |
|
| |
|
|
|
|
|
| |
This adds nice_agent_set_stream_name, nice_agent_get_stream_name,
nice_agent_generate_local_sdp, nice_agent_parse_remote_sdp.
|
| |
|