- initial import

This commit is contained in:
2018-06-05 11:05:37 +03:00
commit e1a4931375
4673 changed files with 1383093 additions and 0 deletions

367
src/libs/ice/ICEStream.h Normal file
View File

@@ -0,0 +1,367 @@
/* Copyright(C) 2007-2014 VoIP objects (voipobjects.com)
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef __ICE_STREAM_H
#define __ICE_STREAM_H
#include <map>
#include <vector>
#include "ICEBox.h"
#include "ICECandidate.h"
#include "ICEStunConfig.h"
#include "ICEAction.h"
#include "ICEStunTransaction.h"
#include "ICECheckList.h"
#include "ICEBinding.h"
#include "ICETime.h"
#include "ICETransactionList.h"
#include "ICERelaying.h"
namespace ice
{
enum Failover
{
FailoverOn = 1,
FailoverOff = 2
};
// Session state
enum RunningState
{
None = 0,
CandidateGathering,
EliminateRedudand,
ComputingFoundations,
StartingKeepAlives,
PrioritizingCandidates,
ChoosingDefault,
CreatingSDP,
ConnCheck,
Failed,
Success
};
extern const char* RunningStateToString(RunningState state);
// Smart pointer to ICE stream type
typedef SmartPtr<Stream> ICEStreamPtr;
// Map of used channel TURN prefixes as key and corresponding address as value
typedef std::map<TurnPrefix, NetworkAddress> TurnPrefixMap;
struct Component
{
void* mTag;
unsigned short mPort4;
unsigned short mPort6;
unsigned mNominationWaitIntervalStartTime;
Component()
:mTag(NULL), mPort4(0), mPort6(0), mNominationWaitIntervalStartTime(0)
{}
~Component()
{
}
};
typedef std::map<int, Component> ComponentMap;
// Represents single ICE stream with single or multiple components (sockets)
struct Stream
{
// Stream id
int mId;
// Stack ID. Used for debugging purposes.
int mStackId;
// Map of component ID -> user tag
ComponentMap mComponentMap;
// List of local candidates and list of remote candidates
typedef std::vector<Candidate> CandidateVector;
CandidateVector mLocalCandidate, mRemoteCandidate, mRemoteRelayedCandidate;
// Check list
CheckList mCheckList;
// Logger
Logger* mLogger;
// Foundation generator value to provide foundation value for peer reflexive candidates
unsigned int mFoundationGenerator;
// Active STUN transactions. This vector includes connectivity check transactions and gather candidates transactions.
// Keepalive transactions are stored in mKeepAliveList
TransactionList mActiveChecks;
// ICE agent role
AgentRole mAgentRole;
// Map of established relay channels
TurnPrefixMap mTurnPrefixMap;
// Current state of media stream
RunningState mState;
// Used configuration
StackConfig mConfig;
// Helper vector used to prioritize candidates
std::vector<unsigned> mComponentLimit;
// Default candidate list - one per each component
std::map<int, Candidate> mDefaultCandidate;
// Local password/ufrag
std::string mLocalPwd;
std::string mLocalUfrag;
// Remote password/ufrag
std::string mRemotePwd;
std::string mRemoteUfrag;
// Marks if selected during connectivity checks default IP list differs from used to generate offer
bool mDefaultIPChanged;
// Marks if checks was ok for this stream and each component has valid nominated pair
bool mCanTransmit;
std::vector<ByteBuffer*> mResponseQueue;
// Tie breaker
std::string mTieBreaker;
// Timer to schedule connection checks (CC)
ICEScheduleTimer mScheduleTimer;
// Counter of TURN allocations
int mTurnAllocated;
// Last error code during gathering/checks
int mErrorCode;
// Cached realm and nonce for used TURN server
std::string mCachedRealm, mCachedNonce;
// Timestamp of nomination waiting timer. Used to accumulate valid pairs and chose the "best" of them.
unsigned mNominationWaitStartTime;
// Number of finished failover gathering requests
int mFailoverRequestsFinished;
// Failover ID generator. Failover transactions which share the same goal share the same ID.
int mFailoverIdGenerator;
struct BoundChannel
{
int mComponentId;
TurnPrefix mPrefix;
NetworkAddress mPeerAddress;
int mResultCode;
};
typedef std::vector<BoundChannel> BoundChannelList;
BoundChannelList mBoundChannelList;
// Create Allocate transaction and associate with passed action
struct AllocateOptions
{
NetworkAddress mServerAddress;
PAction mActionOnFinish;
int mComponent = 0;
Failover mFailoverOption = FailoverOn;
int mWireFamily = AF_INET;
int mAllocFamily = AF_INET;
int mFailoverId = 0;
};
void allocate(const AllocateOptions& options);
// Create Bind transaction and associate with passed action
void bind(const NetworkAddress& addr, PAction action, bool auth, int component, Failover failover);
// Searches for local candidate with specified address
unsigned findLocalCandidate(const NetworkAddress& addr);
// Cancels found transaction.
void cancelCheck(CandidatePair& p);
// Cancels allocations
void cancelAllocations();
// Searches for remote candidate with specified remote address and corresponding to local port number
unsigned findRemoteCandidate(const NetworkAddress& addr, int componentID);
// Process incoming binding request
void handleBindingRequest(ServerBinding& binding, ByteBuffer& buffer, int component);
// Handles incoming data in gathering candidate stage.
bool handleCgIn(StunMessage& msg, NetworkAddress& address);
// Handle eliminate redudand stage
void Handle_ER();
// Compute foundations
void Handle_CF();
// Starting keep alive timers
void Handle_SKA();
// Prioritize candidates
void Handle_PC();
// Choosing default candidate
void Handle_CD();
// Handles keepalive messages
//bool handleKeepAlivesIn(StunMessage& msg, NetworkAddress& address);
// Handles incoming messages in connectivity checks stage
// This method uses Handle_KA_In to perform keepalive handling
bool handleConnChecksIn(StunMessage& msg, NetworkAddress& address);
// Handle incoming Bind request
void handleIncomingRequest(StunMessage& msg, ByteBuffer& buffer, int component);
// Chooses default candidate for specified component ID
Candidate findDefaultCandidate(int componentID);
//Performs 8.1.2. Updating States
void checkNominated(int componentID);
void checkNominated();
bool handleRoleConflict(ServerBinding& binding);
//Checks active transactions (keepalive and ordinary) for timeouts
void isTimeout();
// Checks for next byte buffer for sending
ByteBuffer* handleConnChecksOut();
// Creates connectivity check request for specified pair.
Transaction* createCheckRequest(PCandidatePair& p);
// Checks for TURN channel prefix by specified peer's address.
// Returns zero prefix if it is not found.
TurnPrefix findTurnPrefixByAddress(NetworkAddress& peerAddress);
// Create candidate pair in check list.
void createCheckList();
// Starts connectivity checks - calls Create_CheckList to create check list + starts retransmission timer
void startChecks();
// Stops connectivity checks and gathering requests
void stopChecks();
// Initiates ChannelBind transaction to TURN server.
TurnPrefix bindChannel(const NetworkAddress& peerAddress, int component, ChannelBoundCallback* cb = NULL);
bool isChannelBindingFailed(int component, TurnPrefix prefix);
void removeBindingResult(int component);
// Attempts to free allocation.
void freeAllocation(int component, DeleteAllocationCallback* cb = NULL);
// Searches for local server reflexive candidate with specified component ID and returns its external address.
NetworkAddress reflexiveAddress(int componentID);
/*! Searches for local server relayed candidate with specified component ID and returns its external address. */
NetworkAddress relayedAddress(int componentID);
// Searches for remote server relayed candidate with specified component
NetworkAddress remoteRelayedAddress(int component);
// Searches for remote server reflexive candidate with specified component
NetworkAddress remoteReflexiveAddress(int component);
Stream();
~Stream();
// Sets config
void setConfig(StackConfig& config);
// Sets ICE agent role - Controlled or Controlling
void setAgentRole(AgentRole role);
// Sets local password
void setLocalPwd(const std::string& pwd);
// Sets local ufrag
void setLocalUfrag(const std::string& ufrag);
// Sets remote password
void setRemotePwd(const std::string& pwd);
// Sets remote ufrag
void setRemoteUfrag(const std::string& ufrag);
// Sets tie breaker
void setTieBreaker(const std::string& tieBreaker);
// Adds new component to stream
int addComponent(void* tag, unsigned short port4, unsigned short port6);
// Gathers candidates for stream
void gatherCandidates();
// Returns reference to check list
CheckList& checkList();
// Check is stream owns specified port number
bool hasPortNumber(int family, unsigned short portNumber, int* component = NULL);
// Processes incoming data
bool processData(StunMessage& msg, ByteBuffer& buffer, int component);
void createOfferSdp(std::vector<std::string>& defaultIP, std::vector<unsigned short>& defaultPort,
std::vector<std::string>& candidateList);
NetworkAddress defaultAddress(int componentID);
void candidateList(int componentID, std::vector<std::string>& candidateList);
PByteBuffer getDataToSend(bool& response, int& component, void*&tag);
// Constructs new keepalive transaction and adds to mKeepAlives
void addKeepAliveCheck(CandidatePair& p);
// Processes SDP offer, adding remote candidates from it
bool processSdpOffer(std::vector<std::string>& candidateList, std::string defaultIP, unsigned short defaultPort, bool deleteRelayed);
// Checks if remote candidate list contains specified address
bool candidateListContains(const std::string& remoteIP, unsigned short remotePort);
// Restarts stream's connectivity checks
void restart();
// Clears the stack; resets state to None. The free allocation requests are left in the queue
void clear();
// Deletes existing connectivity checks and resets turn allocation counters
void clearForRestart(bool localNetworkChanged);
// Returns resolved address of remote party identified by its componmentID
NetworkAddress remoteAddress(int component);
NetworkAddress localAddress(int component);
void installPermissions(int component = -1, const NetworkAddress& addr = NetworkAddress(), InstallPermissionsCallback* cb = NULL);
void dump(std::ostream& output);
bool findConcludePair(Candidate& local, Candidate& remote);
int findComponentIdByPort(unsigned short port, int family);
Transaction* runCheckList(CandidatePair::Role role, CandidatePair::State state);
void deleteTransactionAt(unsigned index);
void clearChecks();
void dumpLocalCandidateList();
void processStateChain();
// Disables (removes) active transactions responsible for gathering candidates - binding & allocating
void removeGatherRequests(int component, int failoverId, Transaction* validOne);
void unfreeze(const char* foundation);
void nominatePair(PCandidatePair& p);
bool ressurectAllocation(int component);
};
}
#endif