// If socket_factory() is set to NULL each PortAllocatorSession // creates its own socket factory.
PacketSocketFactory* socket_factory() {
CheckRunOnValidThreadIfInitialized(); return socket_factory_;
}
struct PortConfiguration; class AllocationSequence;
enumclass SessionState {
GATHERING, // Actively allocating ports and gathering candidates.
CLEARED, // Current allocation process has been stopped but may start // new ones.
STOPPED // This session has completely stopped, no new allocation // process will be started.
};
// This class is thread-compatible and assumes it's created, operated upon and // destroyed on the network thread. class RTC_EXPORT BasicPortAllocatorSession : public PortAllocatorSession {
public:
BasicPortAllocatorSession(BasicPortAllocator* allocator,
absl::string_view content_name, int component,
absl::string_view ice_ufrag,
absl::string_view ice_pwd);
~BasicPortAllocatorSession() override;
// If the new filter allows new types of candidates compared to the previous // filter, gathered candidates that were discarded because of not matching the // previous filter will be signaled if they match the new one. // // We do not perform any regathering since the port allocator flags decide // the type of candidates to gather and the candidate filter only controls the // signaling of candidates. As a result, with the candidate filter changed // alone, all newly allowed candidates for signaling should already be // gathered by the respective Port. void SetCandidateFilter(uint32_t filter) override; void StartGettingPorts() override; void StopGettingPorts() override; void ClearGettingPorts() override; bool IsGettingPorts() override; bool IsCleared() const override; bool IsStopped() const override; // These will all be Ports.
std::vector<PortInterface*> ReadyPorts() const override;
std::vector<Candidate> ReadyCandidates() const override; bool CandidatesAllocationDone() const override; void RegatherOnFailedNetworks() override; void GetCandidateStatsFromReadyPorts(
CandidateStatsList* candidate_stats_list) const override; void SetStunKeepaliveIntervalForReadyPorts( const std::optional<TimeDelta>& stun_keepalive_interval) override; void PruneAllPorts() override; static std::vector<const Network*> SelectIPv6Networks(
std::vector<const Network*>& all_ipv6_networks, int max_ipv6_networks);
// Starts the process of getting the port configurations.
virtual void GetPortConfigurations();
// Adds a port configuration that is now ready. Once we have one for each // network (or a timeout occurs), we will start allocating ports. void ConfigReady(std::unique_ptr<PortConfiguration> config); // TODO(bugs.webrtc.org/12840) Remove once unused in downstream projects.
ABSL_DEPRECATED( "Use ConfigReady(std::unique_ptr<PortConfiguration>) instead!") void ConfigReady(PortConfiguration* config);
private: class PortData {
public: enum State {
STATE_INPROGRESS, // Still gathering candidates.
STATE_COMPLETE, // All candidates allocated and ready for process.
STATE_ERROR, // Error in gathering candidates.
STATE_PRUNED // Pruned by higher priority ports on the same network // interface. Only TURN ports may be pruned.
};
std::vector<PortData*> GetUnprunedPorts( const std::vector<const Network*>& networks); // Prunes ports and signal the remote side to remove the candidates that // were previously signaled from these ports. void PrunePortsAndRemoveCandidates( const std::vector<PortData*>& port_data_list); // Gets filtered and sanitized candidates generated from a port and // append to `candidates`. void GetCandidatesFromPort(const PortData& data,
std::vector<Candidate>* candidates) const;
Port* GetBestTurnPortForNetwork(absl::string_view network_name) const; // Returns true if at least one TURN port is pruned. bool PruneTurnPorts(Port* newly_pairable_turn_port); bool PruneNewlyPairableTurnPort(PortData* newly_pairable_turn_port);
BasicPortAllocator* allocator_;
Thread* network_thread_;
PacketSocketFactory* socket_factory_; bool allocation_started_; bool network_manager_started_; bool allocation_sequences_created_;
std::vector<std::unique_ptr<PortConfiguration>> configs_;
std::vector<AllocationSequence*> sequences_;
std::vector<PortData> ports_;
std::vector<IceCandidateErrorEvent> candidate_error_events_;
uint32_t candidate_filter_ = CF_ALL; // Policy on how to prune turn ports, taken from the port allocator.
PortPrunePolicy turn_port_prune_policy_;
SessionState state_ = SessionState::CLEARED; int allocation_epoch_ RTC_GUARDED_BY(network_thread_) = 0;
ScopedTaskSafety network_safety_;
friendclass AllocationSequence;
};
// Records configuration information useful in creating ports. // TODO(deadbeef): Rename "relay" to "turn_server" in this struct. struct RTC_EXPORT PortConfiguration { // TODO(jiayl): remove `stun_address` when Chrome is updated.
SocketAddress stun_address;
ServerAddresses stun_servers;
std::string username;
std::string password; bool use_turn_server_as_stun_server_disabled = false;
// Returns addresses of both the explicitly configured STUN servers, // and TURN servers that should be used as STUN servers.
ServerAddresses StunServers();
// Adds another relay server, with the given ports and modifier, to the list. void AddRelay(const RelayServerConfig& config);
// Determines whether the given relay server supports the given protocol. bool SupportsProtocol(const RelayServerConfig& relay,
ProtocolType type) const; bool SupportsProtocol(ProtocolType type) const; // Helper method returns the server addresses for the matching RelayType and // Protocol type.
ServerAddresses GetRelayServerAddresses(ProtocolType type) const;
// Insert into stun_servers extra TURN servers that could be used as STUN // servers void InsertStunServersForProtocol(ProtocolType type);
};
// Performs the allocation of ports, in a sequenced (timed) manner, for a given // network and IP address. // This class is thread-compatible. class AllocationSequence {
public: enum State {
kInit, // Initial state.
kRunning, // Started allocating ports.
kStopped, // Stopped from running.
kCompleted, // All ports are allocated.
// kInit --> kRunning --> {kCompleted|kStopped}
}; // `port_allocation_complete_callback` is called when AllocationSequence is // done with allocating ports. This signal is useful when port allocation // fails which doesn't result in any candidates. Using this signal // BasicPortAllocatorSession can send its candidate discovery conclusion // signal. Without this signal, BasicPortAllocatorSession doesn't have any // event to trigger signal. This can also be achieved by starting a timer in // BPAS, but this is less deterministic.
AllocationSequence(BasicPortAllocatorSession* session, const Network* network,
PortConfiguration* config,
uint32_t flags,
std::function<void()> port_allocation_complete_callback); void Init(); void Clear(); void OnNetworkFailed();
// Disables the phases for a new sequence that this one already covers for an // equivalent network setup. void DisableEquivalentPhases(const Network* network,
PortConfiguration* config,
uint32_t* flags);
// Starts and stops the sequence. When started, it will continue allocating // new ports on its own timed schedule. void Start(); void Stop();
private: void CreateTurnPort(const RelayServerConfig& config, int relative_priority);
BasicPortAllocatorSession* session_; bool network_failed_ = false; const Network* network_; // Compared with the new best IP in DisableEquivalentPhases.
IPAddress previous_best_ip_;
PortConfiguration* config_;
State state_;
uint32_t flags_;
ProtocolList protocols_;
std::unique_ptr<AsyncPacketSocket> udp_socket_; // There will be only one udp port per AllocationSequence.
UDPPort* udp_port_;
std::vector<Port*> relay_ports_; int phase_;
std::function<void()> port_allocation_complete_callback_; // This counter is sampled and passed together with tasks when tasks are // posted. If the sampled counter doesn't match `epoch_` on reception, the // posted task is ignored. int epoch_ = 0;
ScopedTaskSafety safety_;
};
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.