Skip to content

Commit 120926c

Browse files
author
Paulo Morgado
committed
WIP
1 parent e959eaf commit 120926c

11 files changed

+961
-514
lines changed

src/SIPSorcery.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
<ItemGroup Condition="'$(TargetFramework)' == 'net462' OR '$(TargetFramework)' == 'netstandard2.0'">
4141
<PackageReference Include="System.Memory" Version="4.6.3" />
4242
<PackageReference Include="Microsoft.Bcl.HashCode" Version="6.0.0" />
43+
<PackageReference Include="Microsoft.Bcl.Memory" Version="9.0.5" />
4344
</ItemGroup>
4445

4546
<ItemGroup Condition="'$(TargetFramework)' == 'net462'">

src/net/ICE/RTCIceCandidate.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
using System;
2222
using System.Net;
23+
using System.Net.Sockets;
2324
using SIPSorcery.Sys;
2425

2526
namespace SIPSorcery.Net

src/net/SDP/SDP.cs

Lines changed: 695 additions & 459 deletions
Large diffs are not rendered by default.

src/net/SDP/SDPConnectionInformation.cs

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// BSD 3-Clause "New" or "Revised" License, see included LICENSE.md file.
1414
//-----------------------------------------------------------------------------
1515

16+
using System;
1617
using System.Net;
1718
using System.Net.Sockets;
1819
using SIPSorcery.Sys;
@@ -52,11 +53,26 @@ public SDPConnectionInformation(IPAddress connectionAddress)
5253

5354
public static SDPConnectionInformation ParseConnectionInformation(string connectionLine)
5455
{
55-
SDPConnectionInformation connectionInfo = new SDPConnectionInformation();
56-
string[] connectionFields = connectionLine.Substring(2).Trim().Split(' ');
57-
connectionInfo.ConnectionNetworkType = connectionFields[0].Trim();
58-
connectionInfo.ConnectionAddressType = connectionFields[1].Trim();
59-
connectionInfo.ConnectionAddress = connectionFields[2].Trim();
56+
return ParseConnectionInformation(connectionLine.AsSpan());
57+
}
58+
59+
public static SDPConnectionInformation ParseConnectionInformation(ReadOnlySpan<char> connectionLine)
60+
{
61+
var connectionInfo = new SDPConnectionInformation();
62+
63+
connectionLine = connectionLine.Slice(2).Trim();
64+
65+
var firstSpace = connectionLine.IndexOf(' ');
66+
var secondSpace = connectionLine.Slice(firstSpace + 1).IndexOf(' ') + firstSpace + 1;
67+
68+
var networkType = connectionLine.Slice(0, firstSpace).Trim();
69+
var addressType = connectionLine.Slice(firstSpace + 1, secondSpace - firstSpace - 1).Trim();
70+
var address = connectionLine.Slice(secondSpace + 1).Trim();
71+
72+
connectionInfo.ConnectionNetworkType = networkType.ToString();
73+
connectionInfo.ConnectionAddressType = addressType.ToString();
74+
connectionInfo.ConnectionAddress = address.ToString();
75+
6076
return connectionInfo;
6177
}
6278

src/net/SDP/SDPMediaAnnouncement.cs

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -69,18 +69,30 @@ public SDPSsrcAttribute(uint ssrc, string cname, string groupID)
6969

7070
public class SDPMediaAnnouncement
7171
{
72-
public const string MEDIA_EXTENSION_MAP_ATTRIBUE_PREFIX = "a=extmap:";
73-
public const string MEDIA_FORMAT_ATTRIBUTE_PREFIX = "a=rtpmap:";
72+
public const string MEDIA_EXTENSION_MAP_ATTRIBUE_NAME = "extmap";
73+
public const string MEDIA_EXTENSION_MAP_ATTRIBUE_PREFIX = "a=" + MEDIA_EXTENSION_MAP_ATTRIBUE_NAME + ":";
74+
public const string MEDIA_FORMAT_ATTRIBUTE_NAME = "rtpmap";
75+
public const string MEDIA_FORMAT_ATTRIBUTE_PREFIX = "a=" + MEDIA_FORMAT_ATTRIBUTE_NAME + ":";
7476
public const string MEDIA_FORMAT_FEEDBACK_PREFIX = "a=rtcp-fb:";
75-
public const string MEDIA_FORMAT_PARAMETERS_ATTRIBUE_PREFIX = "a=fmtp:";
76-
public const string MEDIA_FORMAT_SSRC_ATTRIBUE_PREFIX = "a=ssrc:";
77-
public const string MEDIA_FORMAT_SSRC_GROUP_ATTRIBUE_PREFIX = "a=ssrc-group:";
78-
public const string MEDIA_FORMAT_SCTP_MAP_ATTRIBUE_PREFIX = "a=sctpmap:";
79-
public const string MEDIA_FORMAT_SCTP_PORT_ATTRIBUE_PREFIX = "a=sctp-port:";
80-
public const string MEDIA_FORMAT_MAX_MESSAGE_SIZE_ATTRIBUE_PREFIX = "a=max-message-size:";
81-
public const string MEDIA_FORMAT_PATH_MSRP_PREFIX = "a=path:msrp:";
82-
public const string MEDIA_FORMAT_PATH_ACCEPT_TYPES_PREFIX = "a=accept-types:";
83-
public const string TIAS_BANDWIDTH_ATTRIBUE_PREFIX = "b=TIAS:";
77+
public const string MEDIA_FORMAT_PARAMETERS_ATTRIBUE_NAME = "fmtp";
78+
public const string MEDIA_FORMAT_PARAMETERS_ATTRIBUE_PREFIX = "a=" + MEDIA_FORMAT_PARAMETERS_ATTRIBUE_NAME + ":";
79+
public const string MEDIA_FORMAT_SSRC_ATTRIBUE_NAME = "ssrc";
80+
public const string MEDIA_FORMAT_SSRC_ATTRIBUE_PREFIX = "a=" + MEDIA_FORMAT_SSRC_ATTRIBUE_NAME + ":";
81+
public const string MEDIA_FORMAT_SSRC_GROUP_ATTRIBUE_NAME = "ssrc-group";
82+
public const string MEDIA_FORMAT_SSRC_GROUP_ATTRIBUE_PREFIX = "a=" + MEDIA_FORMAT_SSRC_GROUP_ATTRIBUE_NAME + ":";
83+
public const string MEDIA_FORMAT_SCTP_MAP_ATTRIBUE_NAME = "sctpmap";
84+
public const string MEDIA_FORMAT_SCTP_MAP_ATTRIBUE_PREFIX = "a=" + MEDIA_FORMAT_SCTP_MAP_ATTRIBUE_NAME + ":";
85+
public const string MEDIA_FORMAT_SCTP_PORT_ATTRIBUE_NAME = "sctp-port";
86+
public const string MEDIA_FORMAT_SCTP_PORT_ATTRIBUE_PREFIX = "a=" + MEDIA_FORMAT_SCTP_PORT_ATTRIBUE_NAME + ":";
87+
public const string MEDIA_FORMAT_MAX_MESSAGE_SIZE_ATTRIBUE_NAME = "max-message-size";
88+
public const string MEDIA_FORMAT_MAX_MESSAGE_SIZE_ATTRIBUE_PREFIX = "a=" + MEDIA_FORMAT_MAX_MESSAGE_SIZE_ATTRIBUE_NAME + ":";
89+
public const string MEDIA_FORMAT_PATH_MSRP_NAME = "path";
90+
public const string MEDIA_FORMAT_PATH_MSRP_SCHEME = "msrp";
91+
public const string MEDIA_FORMAT_PATH_MSRP_PREFIX = "a="+ MEDIA_FORMAT_PATH_MSRP_NAME + ":"+"msrp:"+":";
92+
public const string MEDIA_FORMAT_PATH_ACCEPT_TYPES_NAME = "accept-types";
93+
public const string MEDIA_FORMAT_PATH_ACCEPT_TYPES_PREFIX = "a=" + MEDIA_FORMAT_PATH_ACCEPT_TYPES_NAME + ":";
94+
public const string TIAS_BANDWIDTH_ATTRIBUE_NAME = "TIAS";
95+
public const string TIAS_BANDWIDTH_ATTRIBUE_PREFIX = "b=" + TIAS_BANDWIDTH_ATTRIBUE_NAME + ":";
8496

8597
public const MediaStreamStatusEnum DEFAULT_STREAM_STATUS = MediaStreamStatusEnum.SendRecv;
8698

src/net/SDP/SDPSecurityDescription.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ namespace SIPSorcery.Net
4141
/// </summary>
4242
public class SDPSecurityDescription
4343
{
44-
public const string CRYPTO_ATTRIBUE_PREFIX = "a=crypto:";
44+
public const string CRYPTO_ATTRIBUTE_NAME = "crypto";
45+
public const string CRYPTO_ATTRIBUE_PREFIX = "a="+"crypto"+":";
4546
private readonly char[] WHITE_SPACES = new char[] { ' ', '\t' };
4647
private const char SEMI_COLON = ';';
4748
private const string COLON = ":";

src/sys/EnumExtensions.cs

Lines changed: 27 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,33 @@
1-
using System.Net.Sockets;
1+
using System;
22

3-
[assembly: global::NetEscapades.EnumGenerators.EnumExtensions<SIPSorcery.Net.STUNMessageTypesEnum>()]
4-
[assembly: global::NetEscapades.EnumGenerators.EnumExtensions<SIPSorcery.Net.STUNAttributeTypesEnum>()]
3+
[assembly: global::NetEscapades.EnumGenerators.EnumExtensions<global::SIPSorcery.Net.STUNMessageTypesEnum>()]
4+
[assembly: global::NetEscapades.EnumGenerators.EnumExtensions<global::SIPSorcery.Net.STUNAttributeTypesEnum>()]
5+
[assembly: global::NetEscapades.EnumGenerators.EnumExtensions<global::SIPSorcery.Net.SctpErrorCauseCode>()]
6+
[assembly: global::NetEscapades.EnumGenerators.EnumExtensions<global::SIPSorcery.Net.SDPMediaTypesEnum>()]
7+
[assembly: global::NetEscapades.EnumGenerators.EnumExtensions<global::SIPSorcery.Net.SDPSecurityDescription.SessionParameter.SrtpSessionParams>()]
8+
[assembly: global::NetEscapades.EnumGenerators.EnumExtensions<global::SIPSorcery.Net.AlertLevelsEnum>()]
9+
[assembly: global::NetEscapades.EnumGenerators.EnumExtensions<global::SIPSorcery.Net.AlertTypesEnum>()]
10+
[assembly: global::NetEscapades.EnumGenerators.EnumExtensions<global::SIPSorcery.Net.SctpChunkType>()]
11+
[assembly: global::NetEscapades.EnumGenerators.EnumExtensions<global::SIPSorcery.Net.DataChannelTypes>()]
12+
[assembly: global::NetEscapades.EnumGenerators.EnumExtensions<global::SIPSorcery.Net.DataChannelPayloadProtocols>()]
13+
[assembly: global::NetEscapades.EnumGenerators.EnumExtensions<global::SIPSorcery.Net.STUNSchemesEnum>()]
14+
[assembly: global::NetEscapades.EnumGenerators.EnumExtensions<global::SIPSorcery.Net.IceRolesEnum>()]
15+
[assembly: global::NetEscapades.EnumGenerators.EnumExtensions<global::SIPSorcery.Net.SDPSecurityDescription.SessionParameter.FecTypes>()]
16+
[assembly: global::NetEscapades.EnumGenerators.EnumExtensions<global::SIPSorcery.Net.SDPSecurityDescription.CryptoSuites>()]
17+
[assembly: global::NetEscapades.EnumGenerators.EnumExtensions<global::Org.BouncyCastle.Bcpg.HashAlgorithmTag>()]
18+
//[assembly: global::NetEscapades.EnumGenerators.EnumExtensions<global::System.Net.Sockets.AddressFamily>()]
19+
[assembly: global::NetEscapades.EnumGenerators.EnumExtensions<global::System.Net.Sockets.SocketError>()]
520

6-
namespace SIPSorcery.Sys;
7-
8-
internal static class EnumExtensions
21+
#if NETFRAMEWORK || NETSTANDARD
22+
namespace SIPSorcery.Net
923
{
10-
public static string ToLowerString(this ProtocolType protocolType)
24+
static partial class IceRolesEnumExtensions
1125
{
12-
return protocolType switch
13-
{
14-
ProtocolType.IP => "ip",
15-
16-
ProtocolType.Icmp => "icmp",
17-
ProtocolType.Igmp => "igmp",
18-
ProtocolType.Ggp => "ggp",
19-
20-
ProtocolType.IPv4 => "ipv4",
21-
ProtocolType.Tcp => "tcp",
22-
ProtocolType.Pup => "pup",
23-
ProtocolType.Udp => "udp",
24-
ProtocolType.Idp => "idp",
25-
ProtocolType.IPv6 => "ipv6",
26-
ProtocolType.IPv6RoutingHeader => "routing",
27-
ProtocolType.IPv6FragmentHeader => "fragment",
28-
ProtocolType.IPSecEncapsulatingSecurityPayload => "ipsecencapsulatingsecuritypayload",
29-
ProtocolType.IPSecAuthenticationHeader => "ipsecauthenticationheader",
30-
ProtocolType.IcmpV6 => "icmpv6",
31-
ProtocolType.IPv6NoNextHeader => "nonext",
32-
ProtocolType.IPv6DestinationOptions => "dstopts",
33-
ProtocolType.ND => "nd",
34-
ProtocolType.Raw => "raw",
35-
36-
ProtocolType.Ipx => "ipx",
37-
ProtocolType.Spx => "spx",
38-
ProtocolType.SpxII => "spx2",
39-
ProtocolType.Unknown => "unknown",
40-
41-
_ => protocolType.ToString().ToLowerInvariant()
42-
};
26+
public static bool TryParse(
27+
ReadOnlySpan<char> name,
28+
out IceRolesEnum value,
29+
bool ignoreCase)
30+
=> System.Enum.TryParse<IceRolesEnum>(name.ToString(), ignoreCase, out value);
4331
}
4432
}
33+
#endif

src/sys/MemoryOperations.cs

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Buffers;
33
using System.Buffers.Binary;
4+
using System.Collections.Generic;
45
using System.Runtime.CompilerServices;
56
using System.Runtime.InteropServices;
67

@@ -66,4 +67,82 @@ public static byte[] ToBigEndianBytes(this ReadOnlySpan<short> shorts)
6667

6768
return bytes;
6869
}
70+
71+
public static List<string> SplitToList(this ReadOnlySpan<char> value, char separator)
72+
{
73+
var result = new List<string>();
74+
75+
while (!value.IsEmpty)
76+
{
77+
var index = value.IndexOf(separator);
78+
79+
if (index == -1)
80+
{
81+
result.Add(value.ToString());
82+
break;
83+
}
84+
85+
result.Add(value.Slice(0, index).ToString());
86+
value = value.Slice(index + 1);
87+
}
88+
89+
return result;
90+
}
91+
92+
#if!NET8_0_OR_GREATER
93+
    public static int Split(this ReadOnlySpan<char> source, Span<Range> destination, char separator, StringSplitOptions options = StringSplitOptions.None)
94+
{
95+
var count = 0;
96+
var start = 0;
97+
98+
while (start <= source.Length)
99+
{
100+
var index = source.Slice(start).IndexOf(separator);
101+
var end = index != -1 ? start + index : source.Length;
102+
103+
var isEmpty = end == start;
104+
if (options == StringSplitOptions.RemoveEmptyEntries && isEmpty)
105+
{
106+
start = end + 1;
107+
continue;
108+
}
109+
110+
if (count >= destination.Length)
111+
{
112+
break;
113+
}
114+
115+
destination[count++] = new Range(start, end);
116+
start = end + 1;
117+
}
118+
119+
destination.Slice(count).Clear(); // Clear unused entries
120+
        return count;
121+
}
122+
123+
public static int IndexOfAnyExcept(this ReadOnlySpan<char> span, ReadOnlySpan<char> excludedChars)
124+
{
125+
for (var i = 0; i < span.Length; i++)
126+
{
127+
var current = span[i];
128+
var isExcluded = false;
129+
130+
for (var j = 0; j < excludedChars.Length; j++)
131+
{
132+
if (current == excludedChars[j])
133+
{
134+
isExcluded = true;
135+
break;
136+
}
137+
}
138+
139+
if (!isExcluded)
140+
{
141+
return i;
142+
}
143+
}
144+
145+
return -1; // All characters are in the excluded set
146+
    }
147+
#endif
69148
}

src/sys/ProtocolTypeExtensions.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
namespace System.Net.Sockets;
2+
3+
internal static class ProtocolTypeExtensions
4+
{
5+
public static string ToLowerString(this ProtocolType protocolType)
6+
{
7+
return protocolType switch
8+
{
9+
ProtocolType.IP => "ip",
10+
11+
ProtocolType.Icmp => "icmp",
12+
ProtocolType.Igmp => "igmp",
13+
ProtocolType.Ggp => "ggp",
14+
15+
ProtocolType.IPv4 => "ipv4",
16+
ProtocolType.Tcp => "tcp",
17+
ProtocolType.Pup => "pup",
18+
ProtocolType.Udp => "udp",
19+
ProtocolType.Idp => "idp",
20+
ProtocolType.IPv6 => "ipv6",
21+
ProtocolType.IPv6RoutingHeader => "routing",
22+
ProtocolType.IPv6FragmentHeader => "fragment",
23+
ProtocolType.IPSecEncapsulatingSecurityPayload => "ipsecencapsulatingsecuritypayload",
24+
ProtocolType.IPSecAuthenticationHeader => "ipsecauthenticationheader",
25+
ProtocolType.IcmpV6 => "icmpv6",
26+
ProtocolType.IPv6NoNextHeader => "nonext",
27+
ProtocolType.IPv6DestinationOptions => "dstopts",
28+
ProtocolType.ND => "nd",
29+
ProtocolType.Raw => "raw",
30+
31+
ProtocolType.Ipx => "ipx",
32+
ProtocolType.Spx => "spx",
33+
ProtocolType.SpxII => "spx2",
34+
ProtocolType.Unknown => "unknown",
35+
36+
_ => protocolType.ToString().ToLowerInvariant()
37+
};
38+
}
39+
}

src/sys/SearchValues.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
5+
namespace SIPSorcery.sys
6+
{
7+
internal static class SearchValuesExtensions
8+
{
9+
public static ReadOnlySpan<char> DigitChars => "0123456789".AsSpan();
10+
public static ReadOnlySpan<char> WhitespaceChars => " \t\r\n\f\v".AsSpan();
11+
}
12+
}

0 commit comments

Comments
 (0)