Exemple #1
0
        /// <summary>
        /// Create a new SCTP association instance where the INIT will be generated
        /// from this end of the connection.
        /// </summary>
        /// <param name="sctpTransport">The transport layer doing the actual sending and receiving of
        /// packets, e.g. UDP, DTLS, raw sockets etc.</param>
        /// <param name="destination">Optional. The remote destination end point for this association.
        /// Some transports, such as DTLS, are already established and do not use this parameter.</param>
        /// <param name="sctpSourcePort">The source port for the SCTP packet header.</param>
        /// <param name="sctpDestinationPort">The destination port for the SCTP packet header.</param>
        /// <param name="defaultMTU">The default Maximum Transmission Unit (MTU) for the underlying
        /// transport. This determines the maximum size of an SCTP packet that will be used with
        /// the transport.</param>
        /// <param name="localTransportPort">Optional. The local transport (e.g. UDP or DTLS) port being
        /// used for the underlying SCTP transport. This be set on the SCTP association's ID to aid in
        /// diagnostics.</param>
        public SctpAssociation(
            SctpTransport sctpTransport,
            IPEndPoint destination,
            ushort sctpSourcePort,
            ushort sctpDestinationPort,
            ushort defaultMTU,
            int localTransportPort,
            ushort numberOutboundStreams = DEFAULT_NUMBER_OUTBOUND_STREAMS,
            ushort numberInboundStreams  = DEFAULT_NUMBER_INBOUND_STREAMS)
        {
            _sctpTransport         = sctpTransport;
            Destination            = destination;
            _sctpSourcePort        = sctpSourcePort;
            _sctpDestinationPort   = sctpDestinationPort;
            _defaultMTU            = defaultMTU;
            _numberOutboundStreams = numberOutboundStreams;
            _numberInboundStreams  = numberInboundStreams;
            VerificationTag        = Crypto.GetRandomUInt(true);

            ID    = $"{sctpSourcePort}:{sctpDestinationPort}:{localTransportPort}";
            ARwnd = DEFAULT_ADVERTISED_RECEIVE_WINDOW;

            _dataReceiver = new SctpDataReceiver(ARwnd, _defaultMTU, 0);
            _dataSender   = new SctpDataSender(ID, this.SendChunk, defaultMTU, Crypto.GetRandomUInt(true), DEFAULT_ADVERTISED_RECEIVE_WINDOW);

            State = SctpAssociationState.Closed;
        }
Exemple #2
0
        /// <summary>
        /// Create a new SCTP association instance from the cookie that was previously
        /// sent to the remote party in an INIT ACK chunk.
        /// </summary>
        public SctpAssociation(
            SctpTransport sctpTransport,
            SctpTransportCookie cookie,
            int localTransportPort)
        {
            _sctpTransport = sctpTransport;
            ID             = $"{cookie.SourcePort}:{cookie.DestinationPort}:{localTransportPort}";
            State          = SctpAssociationState.Closed;

            GotCookie(cookie);
        }
 /// <summary>
 /// Event handler to coordinate changes to the SCTP association state with the overall
 /// SCTP transport state.
 /// </summary>
 /// <param name="associationState">The state of the SCTP association.</param>
 private void OnAssociationStateChanged(SctpAssociationState associationState)
 {
     if (associationState == SctpAssociationState.Established)
     {
         SetState(RTCSctpTransportState.Connected);
     }
     else if (associationState == SctpAssociationState.Closed)
     {
         SetState(RTCSctpTransportState.Closed);
     }
 }
Exemple #4
0
 /// <summary>
 /// Updates the state of the association.
 /// </summary>
 /// <param name="state">The new association state.</param>
 internal void SetState(SctpAssociationState state)
 {
     logger.LogTrace($"SCTP state for association {ID} changed to {state}.");
     State = state;
     OnAssociationStateChanged?.Invoke(state);
 }