diff --git a/skyscraper8.Tests/DocsisTests.cs b/skyscraper8.Tests/DocsisTests.cs
index 68689a6..45a8b70 100644
--- a/skyscraper8.Tests/DocsisTests.cs
+++ b/skyscraper8.Tests/DocsisTests.cs
@@ -1,5 +1,6 @@
using skyscraper5;
using skyscraper5.Docsis.AnnexC;
+using skyscraper5.Docsis.MacManagement;
using skyscraper5.Mpeg2;
using skyscraper5.Skyscraper.Scraper;
using skyscraper5.Skyscraper.Scraper.Storage;
@@ -11,6 +12,7 @@ using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
+using System.Net.NetworkInformation;
using System.Text;
using System.Threading.Tasks;
using Xunit.Sdk;
@@ -66,5 +68,25 @@ namespace skyscraper8.Tests
ModemCapabilitiesEncoding modemCapabilitiesEncoding = new ModemCapabilitiesEncoding(buffer);
Assert.True(modemCapabilitiesEncoding.Valid);
}
+
+ [Fact]
+ public void AAB_MultipartRegistrationResponseTest()
+ {
+ Random rng = new Random();
+
+ byte[] sourceBuffer = new byte[6];
+ rng.NextBytes(sourceBuffer);
+ PhysicalAddress source = new PhysicalAddress(sourceBuffer);
+
+ byte[] targetBuffer = new byte[6];
+ rng.NextBytes(targetBuffer);
+ PhysicalAddress target = new PhysicalAddress(targetBuffer);
+
+ byte[] buffer = Properties.Resources.MultipartRegistrationResponseTest;
+
+
+ T45_V4_MultipartRegistrationResponse test = new T45_V4_MultipartRegistrationResponse(source, target, buffer);
+ Assert.True(test.Valid);
+ }
}
}
diff --git a/skyscraper8.Tests/Properties/Resources.Designer.cs b/skyscraper8.Tests/Properties/Resources.Designer.cs
index db5952e..c63e692 100644
--- a/skyscraper8.Tests/Properties/Resources.Designer.cs
+++ b/skyscraper8.Tests/Properties/Resources.Designer.cs
@@ -70,6 +70,16 @@ namespace skyscraper8.Tests.Properties {
}
}
+ ///
+ /// Sucht eine lokalisierte Ressource vom Typ System.Byte[].
+ ///
+ internal static byte[] MultipartRegistrationResponseTest {
+ get {
+ object obj = ResourceManager.GetObject("MultipartRegistrationResponseTest", resourceCulture);
+ return ((byte[])(obj));
+ }
+ }
+
///
/// Sucht eine lokalisierte Ressource vom Typ System.Byte[].
///
diff --git a/skyscraper8.Tests/Properties/Resources.resx b/skyscraper8.Tests/Properties/Resources.resx
index 6b04fd9..cef920a 100644
--- a/skyscraper8.Tests/Properties/Resources.resx
+++ b/skyscraper8.Tests/Properties/Resources.resx
@@ -121,6 +121,9 @@
..\Resources\ModemCapabilitiesEncodingTest.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ ..\Resources\T45_V4_MultipartRegistrationResponseTest.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
..\Resources\ranging_response_test.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
diff --git a/skyscraper8.Tests/Resources/T45_V4_MultipartRegistrationResponseTest.bin b/skyscraper8.Tests/Resources/T45_V4_MultipartRegistrationResponseTest.bin
new file mode 100644
index 0000000..e7868ad
Binary files /dev/null and b/skyscraper8.Tests/Resources/T45_V4_MultipartRegistrationResponseTest.bin differ
diff --git a/skyscraper8/Docsis/AnnexC/CommonTlvEncodings.cs b/skyscraper8/Docsis/AnnexC/CommonTlvEncodings.cs
index 51aab93..84c7373 100644
--- a/skyscraper8/Docsis/AnnexC/CommonTlvEncodings.cs
+++ b/skyscraper8/Docsis/AnnexC/CommonTlvEncodings.cs
@@ -1,4 +1,6 @@
-using skyscraper5.Skyscraper.IO;
+using skyscraper5.Docsis.MacManagement;
+using skyscraper5.Skyscraper.IO;
+using skyscraper8.Docsis.AnnexC;
using skyscraper8.Docsis.DQoS;
using System;
using System.Collections.Generic;
@@ -10,7 +12,7 @@ using System.Threading.Tasks;
namespace skyscraper5.Docsis.AnnexC
{
- class CommonTlvEncodingObject
+ public class CommonTlvEncodingObject
{
public CommonTlvEncodingObject(MemoryStream ms)
{
@@ -25,10 +27,14 @@ namespace skyscraper5.Docsis.AnnexC
ModemCapabilitiesEncoding = new ModemCapabilitiesEncoding(v);
break;
case 22:
- UpstreamDropPacketClassificationEncoding = new GeneralPacketClassifierEncoding(v);
+ if (UpstreamDropPacketClassificationEncoding == null)
+ UpstreamDropPacketClassificationEncoding = new List();
+ UpstreamDropPacketClassificationEncoding.Add(new GeneralPacketClassifierEncoding(v));
break;
case 23:
- DownstreamPacketClassificationEncoding = new GeneralPacketClassifierEncoding(v);
+ if (DownstreamPacketClassificationEncoding == null)
+ DownstreamPacketClassificationEncoding = new List();
+ DownstreamPacketClassificationEncoding.Add(new GeneralPacketClassifierEncoding(v));
break;
case 24:
if (UpstreamServiceFlows == null)
@@ -50,7 +56,9 @@ namespace skyscraper5.Docsis.AnnexC
KeySequenceNumber = v[0];
break;
case 46:
- TransmitChannelConfiguration = new TransmitChannelConfigurationObject(v);
+ if (TransmitChannelConfiguration == null)
+ TransmitChannelConfiguration = new List();
+ TransmitChannelConfiguration.Add(new TransmitChannelConfigurationObject(v));
break;
case 47:
ServiceFlowSidClusterAssignment = new ServiceFlowSidClusterAssignmentObject(v);
@@ -58,6 +66,11 @@ namespace skyscraper5.Docsis.AnnexC
case 49:
RcpId = new RcpIdEncoding(v);
break;
+ case 50:
+ if (DsidEncodings == null)
+ DsidEncodings = new List();
+ DsidEncodings.Add(new DsidEncoding(v));
+ break;
default:
//CM-SP-MULPIv4.0-I01-190815.pdf page 652
throw new NotImplementedException(string.Format("Common TLV Encodings Type {0}", type));
@@ -67,11 +80,11 @@ namespace skyscraper5.Docsis.AnnexC
public ModemCapabilitiesEncoding ModemCapabilitiesEncoding { get; private set; }
public ServiceFlowSidClusterAssignmentObject ServiceFlowSidClusterAssignment { get; private set; }
- public GeneralPacketClassifierEncoding DownstreamPacketClassificationEncoding { get; set; }
+ public List DownstreamPacketClassificationEncoding { get; set; }
- public GeneralPacketClassifierEncoding UpstreamDropPacketClassificationEncoding { get; set; }
+ public List UpstreamDropPacketClassificationEncoding { get; set; }
- public TransmitChannelConfigurationObject TransmitChannelConfiguration { get; set; }
+ public List TransmitChannelConfiguration { get; set; }
public class TransmitChannelConfigurationObject
{
public TransmitChannelConfigurationObject(byte[] buffer)
@@ -93,10 +106,16 @@ namespace skyscraper5.Docsis.AnnexC
case 3:
UpstreamChannelId = v[0];
break;
+ case 5:
+ this.UpstreamChannelDescriptor = new UpstreamChannelDescriptor(null, null, v);
+ break;
case 6:
(v[0], v[1]) = (v[1], v[0]);
RangingSid = BitConverter.ToUInt16(v, 0);
break;
+ case 7:
+ InitializationTechnique = (InitalizationTechniqueEnum?)v[0];
+ break;
case 11:
ListOfIucs = v;
break;
@@ -125,7 +144,9 @@ namespace skyscraper5.Docsis.AnnexC
}
public byte? TccReferenceId { get; set; }
- }
+ public InitalizationTechniqueEnum? InitializationTechnique { get; }
+ public UpstreamChannelDescriptor UpstreamChannelDescriptor { get; }
+ }
public byte KeySequenceNumber { get; set; }
@@ -136,5 +157,6 @@ namespace skyscraper5.Docsis.AnnexC
public List UpstreamServiceFlows { get; }
public RcpIdEncoding RcpId { get; private set; }
public AuthorizationBlock AuthorizationHint { get; }
+ public List DsidEncodings { get; private set; }
}
}
diff --git a/skyscraper8/Docsis/AnnexC/DsidEncoding.cs b/skyscraper8/Docsis/AnnexC/DsidEncoding.cs
new file mode 100644
index 0000000..1cb905d
--- /dev/null
+++ b/skyscraper8/Docsis/AnnexC/DsidEncoding.cs
@@ -0,0 +1,92 @@
+using skyscraper5.Skyscraper.IO;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Channels;
+using System.Threading.Tasks;
+
+namespace skyscraper8.Docsis.AnnexC
+{
+ public class DsidEncoding
+ {
+ public DsidEncoding(byte[] buffer)
+ {
+ MemoryStream ms = new MemoryStream(buffer, false);
+
+ while (ms.GetAvailableBytes() > 2)
+ {
+ byte type = ms.ReadUInt8();
+ byte length = ms.ReadUInt8();
+ byte[] v = ms.ReadBytes(length);
+ switch (type)
+ {
+ case 1:
+ byte[] uintBuffer = new byte[] { v[2], v[1], v[0], 0 };
+ DSID = BitConverter.ToUInt32(uintBuffer);
+ break;
+ case 2:
+ DownstreamServiceIdentifierAction = (DownstreamServiceIdentifierActionEnum)v[0];
+ break;
+ case 3:
+ DownstreamResequencingEncodings = new EncodedResequencingAttributes(v);
+ break;
+ case 4:
+ MulticastEncodings = new EncodedMulticastAttributes(v);
+ break;
+ default:
+ //CM-SP-MULPIv4.0-I01-190815.pdf, page 731
+ throw new NotImplementedException(String.Format("DSID Encoding 50.{0}", type));
+ }
+ }
+ }
+
+ public uint? DSID { get; }
+
+ public DownstreamServiceIdentifierActionEnum? DownstreamServiceIdentifierAction { get; }
+
+ public enum DownstreamServiceIdentifierActionEnum
+ {
+ Add = 0,
+ Change = 1,
+ Delete = 2
+ }
+
+ public EncodedResequencingAttributes DownstreamResequencingEncodings { get; }
+ internal EncodedMulticastAttributes MulticastEncodings { get; }
+
+ public class EncodedResequencingAttributes
+ {
+ public EncodedResequencingAttributes(byte[] buffer)
+ {
+ MemoryStream ms = new MemoryStream(buffer, false);
+
+ while (ms.GetAvailableBytes() > 2)
+ {
+ byte type = ms.ReadUInt8();
+ byte length = ms.ReadUInt8();
+ byte[] v = ms.ReadBytes(length);
+ switch (type)
+ {
+ case 1:
+ IsResequencing = v[0] == 1;
+ break;
+ case 2:
+ DownstreamResequencingChannelList = v;
+ break;
+ case 3:
+ DsidResequencingWaitTime = v[0];
+ break;
+ default:
+ //CM-SP-MULPIv4.0-I01-190815.pdf, page 731
+ throw new NotImplementedException(String.Format("EncodedResequencingAttributes 50.3.{0}", type));
+ }
+ }
+ }
+
+ public bool? IsResequencing { get; }
+ public byte[] DownstreamResequencingChannelList { get; }
+ public byte DsidResequencingWaitTime { get; }
+ }
+ }
+}
diff --git a/skyscraper8/Docsis/AnnexC/EncodedMulticastAttributes.cs b/skyscraper8/Docsis/AnnexC/EncodedMulticastAttributes.cs
new file mode 100644
index 0000000..51ccff0
--- /dev/null
+++ b/skyscraper8/Docsis/AnnexC/EncodedMulticastAttributes.cs
@@ -0,0 +1,31 @@
+using skyscraper5.Skyscraper.IO;
+using static skyscraper8.Docsis.AnnexC.DsidEncoding;
+
+namespace skyscraper8.Docsis.AnnexC
+{
+ internal class EncodedMulticastAttributes
+ {
+ public EncodedMulticastAttributes(byte[] buffer)
+ {
+ MemoryStream ms = new MemoryStream(buffer, false);
+
+ while (ms.GetAvailableBytes() > 2)
+ {
+ byte type = ms.ReadUInt8();
+ byte length = ms.ReadUInt8();
+ byte[] v = ms.ReadBytes(length);
+ switch (type)
+ {
+ case 2:
+ this.MulticastCmInterfaceMask = new MulticastCmInterfaceMask(v);
+ break;
+ default:
+ //CM-SP-MULPIv4.0-I01-190815.pdf, page 732
+ throw new NotImplementedException(String.Format("DSID Encoding 50.4.{0}", type));
+ }
+ }
+ }
+
+ public MulticastCmInterfaceMask MulticastCmInterfaceMask { get; }
+ }
+}
\ No newline at end of file
diff --git a/skyscraper8/Docsis/AnnexC/EthernetLlcPacketClassificationEncoding.cs b/skyscraper8/Docsis/AnnexC/EthernetLlcPacketClassificationEncoding.cs
new file mode 100644
index 0000000..317cc33
--- /dev/null
+++ b/skyscraper8/Docsis/AnnexC/EthernetLlcPacketClassificationEncoding.cs
@@ -0,0 +1,36 @@
+using skyscraper5.Skyscraper.IO;
+using skyscraper8.Docsis.DQoS;
+using System;
+using static System.Runtime.InteropServices.JavaScript.JSType;
+
+namespace skyscraper5.Docsis.AnnexC
+{
+ public class EthernetLlcPacketClassificationEncoding
+ {
+
+ public EthernetLlcPacketClassificationEncoding(byte[] buffer)
+ {
+ MemoryStream ms = new MemoryStream(buffer, false);
+ while (ms.GetAvailableBytes() > 3)
+ {
+ byte type = ms.ReadUInt8();
+ ushort length = ms.ReadUInt8();
+ byte[] v = ms.ReadBytes(length);
+ switch (type)
+ {
+ case 3:
+ (v[1], v[2]) = (v[2], v[1]);
+ this.Type = v[0];
+ this.EProt = BitConverter.ToUInt16(v, 1);
+ break;
+ default:
+ //CM-SP-MULPIv4.0-I01-190815.pdf, page 747
+ throw new NotImplementedException(string.Format("EthernetLlcPacketClassificationEncoding [22/23/60].10.{0}", type));
+ }
+ }
+ }
+
+ public byte Type { get; }
+ public ushort EProt { get; }
+ }
+}
\ No newline at end of file
diff --git a/skyscraper8/Docsis/AnnexC/GeneralPacketClassifierEncoding.cs b/skyscraper8/Docsis/AnnexC/GeneralPacketClassifierEncoding.cs
index 81f28e9..c5b0cc1 100644
--- a/skyscraper8/Docsis/AnnexC/GeneralPacketClassifierEncoding.cs
+++ b/skyscraper8/Docsis/AnnexC/GeneralPacketClassifierEncoding.cs
@@ -9,7 +9,7 @@ using skyscraper5.Skyscraper.IO;
namespace skyscraper5.Docsis.AnnexC
{
- internal class GeneralPacketClassifierEncoding
+ public class GeneralPacketClassifierEncoding
{
public GeneralPacketClassifierEncoding(byte[] buffer)
{
@@ -49,7 +49,13 @@ namespace skyscraper5.Docsis.AnnexC
case 9:
Ipv4PacketClassification = new Ipv4PacketClassificationEncodings(v);
break;
- default:
+ case 10:
+ EthernetLlcPacketClassificationEncodings = new EthernetLlcPacketClassificationEncoding(v);
+ break;
+ case 12:
+ Ipv6PacketClassification = new Ipv6PacketClassificationEncoding(v);
+ break;
+ default:
//see CM-SP-MULPIv4.0-I01-190815.pdf page 742->743
throw new NotImplementedException(string.Format("{0} TLV Type {1}", nameof(GeneralPacketClassifierEncoding), type));
}
@@ -87,10 +93,16 @@ namespace skyscraper5.Docsis.AnnexC
case 3:
Ipv4SourceAddress = new IPAddress(v);
break;
+ case 4:
+ Ipv4SourceMask = new IPAddress(v);
+ break;
case 5:
Ipv4DestinationAddress = new IPAddress(v);
break;
- case 7:
+ case 6:
+ Ipv4DestinationMask = new IPAddress(v);
+ break;
+ case 7:
(v[0], v[1]) = (v[1], v[0]);
SourcePortStart = BitConverter.ToUInt16(v, 0);
break;
@@ -126,7 +138,9 @@ namespace skyscraper5.Docsis.AnnexC
public ushort? SourcePortStart { get; set; }
public ushort? SourcePortEnd { get; set; }
- }
+ public IPAddress Ipv4SourceMask { get; private set; }
+ public IPAddress Ipv4DestinationMask { get; private set; }
+ }
public ushort? ServiceFlowReference { get; set; }
public byte? ClassifierReference { get; set; }
@@ -134,5 +148,7 @@ namespace skyscraper5.Docsis.AnnexC
public ushort? ClassifierIdentifier { get; set; }
public uint? ServiceFlowIdentifier { get; set; }
- }
+ public EthernetLlcPacketClassificationEncoding EthernetLlcPacketClassificationEncodings { get; }
+ internal Ipv6PacketClassificationEncoding Ipv6PacketClassification { get; }
+ }
}
diff --git a/skyscraper8/Docsis/AnnexC/GeneralServiceFlowEncoding.cs b/skyscraper8/Docsis/AnnexC/GeneralServiceFlowEncoding.cs
index 255899e..13bcf6f 100644
--- a/skyscraper8/Docsis/AnnexC/GeneralServiceFlowEncoding.cs
+++ b/skyscraper8/Docsis/AnnexC/GeneralServiceFlowEncoding.cs
@@ -5,10 +5,11 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using skyscraper5.Skyscraper.IO;
+using static skyscraper5.Dvb.Descriptors.ServiceListDescriptor;
namespace skyscraper5.Docsis.AnnexC
{
- internal class GeneralServiceFlowEncoding
+ public class GeneralServiceFlowEncoding
{
public GeneralServiceFlowEncoding(byte[] buffer)
{
@@ -56,7 +57,11 @@ namespace skyscraper5.Docsis.AnnexC
(v[0], v[1]) = (v[1], v[0]);
TimeoutForActiveQosParameters = BitConverter.ToUInt16(v, 0);
break;
- case 15:
+ case 14:
+ (v[0], v[1]) = (v[1], v[0]);
+ MaximumConcatenatedBurst = BitConverter.ToUInt16(v, 0);
+ break;
+ case 15:
ServiceFlowSchedulingType = (ServiceFlowSchedulingTypeEnum)v[0];
break;
case 16:
@@ -98,11 +103,22 @@ namespace skyscraper5.Docsis.AnnexC
case 22:
GrantsPerInterval = v[0];
break;
+ case 23:
+ IpTypeOfServiceOverwrite = v;
+ break;
case 24:
(v[0], v[1], v[2], v[3]) = (v[3], v[2], v[1], v[0]);
CmtsTimestamp = BitConverter.ToUInt32(v, 0);
break;
- default:
+ case 26:
+ MultiplierToNumberOfBytesRequested = v[0];
+ break;
+ case 32:
+ (v[0], v[1], v[2], v[3]) = (v[3], v[2], v[1], v[0]);
+ ServiceFlowForbiddenAttributeMask = BitConverter.ToUInt32(v);
+ break;
+
+ default:
//CM-SP-MULPIv4.0-I01-190815.pdf page 758
throw new NotImplementedException(string.Format("General Service Flow Encodings Type {0}", type));
}
@@ -177,8 +193,12 @@ namespace skyscraper5.Docsis.AnnexC
public bool? AdmittedSet { get; set; }
public bool? ProvisionedSet { get; set; }
+ public byte[] IpTypeOfServiceOverwrite { get; }
+ public ushort MaximumConcatenatedBurst { get; }
+ public byte MultiplierToNumberOfBytesRequested { get; }
+ public uint ServiceFlowForbiddenAttributeMask { get; }
- public override string ToString()
+ public override string ToString()
{
return $"{nameof(ServiceFlowIdentifier)}: {ServiceFlowIdentifier}";
}
diff --git a/skyscraper8/Docsis/AnnexC/InitalizationTechniqueEnum.cs b/skyscraper8/Docsis/AnnexC/InitalizationTechniqueEnum.cs
new file mode 100644
index 0000000..9a0f0b0
--- /dev/null
+++ b/skyscraper8/Docsis/AnnexC/InitalizationTechniqueEnum.cs
@@ -0,0 +1,14 @@
+namespace skyscraper5.Docsis.AnnexC
+{
+ public enum InitalizationTechniqueEnum : byte
+ {
+ BroadcastInitialRanging = 1,
+ UnicastInitialRanging = 2,
+ EitherBroadcastOrUnicast = 3,
+ NewChannel = 4,
+ ProbeNewChannel = 5,
+ UnicastInitialRangingOnNewChannel = 6,
+ StationRanging = 7,
+ AssumeSucessful = 8
+ }
+}
\ No newline at end of file
diff --git a/skyscraper8/Docsis/AnnexC/Ipv6PacketClassificationEncoding.cs b/skyscraper8/Docsis/AnnexC/Ipv6PacketClassificationEncoding.cs
new file mode 100644
index 0000000..fcf5268
--- /dev/null
+++ b/skyscraper8/Docsis/AnnexC/Ipv6PacketClassificationEncoding.cs
@@ -0,0 +1,39 @@
+using skyscraper5.Skyscraper.IO;
+using System.Net;
+
+namespace skyscraper5.Docsis.AnnexC
+{
+ internal class Ipv6PacketClassificationEncoding
+ {
+ public Ipv6PacketClassificationEncoding(byte[] buffer)
+ {
+ MemoryStream ms = new MemoryStream(buffer, false);
+ while (ms.GetAvailableBytes() > 3)
+ {
+ byte type = ms.ReadUInt8();
+ ushort length = ms.ReadUInt8();
+ byte[] v = ms.ReadBytes(length);
+ switch (type)
+ {
+ case 3:
+ (v[0], v[1]) = (v[1], v[0]);
+ NextHeaderType = BitConverter.ToUInt16(v, 0);
+ break;
+ case 4:
+ Ipv6SourceAddress = new IPAddress(v);
+ break;
+ case 6:
+ Ipv6DestinationAddress = new IPAddress(v);
+ break;
+ default:
+ //CM-SP-MULPIv4.0-I01-190815.pdf, page 749
+ throw new NotImplementedException(string.Format("Ipv6PacketClassificationEncoding [22/23/60].12.{0}", type));
+ }
+ }
+ }
+
+ public ushort NextHeaderType { get; }
+ public IPAddress Ipv6DestinationAddress { get; }
+ public IPAddress Ipv6SourceAddress { get; }
+ }
+}
\ No newline at end of file
diff --git a/skyscraper8/Docsis/AnnexC/MulticastCmInterfaceMask.cs b/skyscraper8/Docsis/AnnexC/MulticastCmInterfaceMask.cs
new file mode 100644
index 0000000..8147308
--- /dev/null
+++ b/skyscraper8/Docsis/AnnexC/MulticastCmInterfaceMask.cs
@@ -0,0 +1,30 @@
+using skyscraper5.Mpeg2.Descriptors;
+
+namespace skyscraper8.Docsis.AnnexC
+{
+ internal class MulticastCmInterfaceMask
+ {
+
+ public MulticastCmInterfaceMask(byte[] v)
+ {
+ uint buffered = BitConverter.ToUInt32(v, 0);
+ CmIpStack = (buffered & 0x00000001) != 0;
+ PrimaryCpeInterfae = (buffered & 0x00000002) != 0;
+ RfInterface = (buffered & 0x00000004) != 0;
+ //Reserved = (buffered & 0x00000018) != 0;
+ OtherCpeInterfaces = (buffered & 0x0000ffe0) != 0;
+ PacketCableEmta = (buffered & 0x00010000) != 0;
+ EstbIp = (buffered & 0x00020000) != 0;
+ //Reserved = (buffered & 0x00040000) != 0;
+ OtherESafeInterfaces = (buffered & 0xfff80000) != 0;
+ }
+
+ public bool CmIpStack { get; }
+ public bool PrimaryCpeInterfae { get; }
+ public bool RfInterface { get; }
+ public bool OtherCpeInterfaces { get; }
+ public bool PacketCableEmta { get; }
+ public bool EstbIp { get; }
+ public bool OtherESafeInterfaces { get; }
+ }
+}
\ No newline at end of file
diff --git a/skyscraper8/Docsis/AnnexC/RcpIdEncoding.cs b/skyscraper8/Docsis/AnnexC/RcpIdEncoding.cs
index 4921e1c..b398329 100644
--- a/skyscraper8/Docsis/AnnexC/RcpIdEncoding.cs
+++ b/skyscraper8/Docsis/AnnexC/RcpIdEncoding.cs
@@ -10,7 +10,7 @@ using static skyscraper5.src.InteractionChannel.Model2.Tbtp2;
namespace skyscraper5.Docsis.AnnexC
{
- internal class RcpIdEncoding
+ public class RcpIdEncoding
{
public RcpIdEncoding(byte[] buffer)
{
@@ -35,7 +35,7 @@ namespace skyscraper5.Docsis.AnnexC
public SimplifiedReceiveChannelAssignmentEncoding SimplifiedReceiveChannelConfiguration { get; private set; }
}
- class SimplifiedReceiveChannelAssignmentEncoding
+ public class SimplifiedReceiveChannelAssignmentEncoding
{
public SimplifiedReceiveChannelAssignmentEncoding(byte[] buffer)
{
diff --git a/skyscraper8/Docsis/AnnexC/ServiceFlowSidClusterAssignmentObject.cs b/skyscraper8/Docsis/AnnexC/ServiceFlowSidClusterAssignmentObject.cs
index 872da1c..d330680 100644
--- a/skyscraper8/Docsis/AnnexC/ServiceFlowSidClusterAssignmentObject.cs
+++ b/skyscraper8/Docsis/AnnexC/ServiceFlowSidClusterAssignmentObject.cs
@@ -8,7 +8,7 @@ using skyscraper5.Skyscraper.IO;
namespace skyscraper5.Docsis.AnnexC
{
- internal class ServiceFlowSidClusterAssignmentObject
+ public class ServiceFlowSidClusterAssignmentObject
{
public ServiceFlowSidClusterAssignmentObject(byte[] buffer)
{
diff --git a/skyscraper8/Docsis/DQoS/AuthorizationBlock.cs b/skyscraper8/Docsis/DQoS/AuthorizationBlock.cs
index 97c54e0..6d7a01f 100644
--- a/skyscraper8/Docsis/DQoS/AuthorizationBlock.cs
+++ b/skyscraper8/Docsis/DQoS/AuthorizationBlock.cs
@@ -8,7 +8,7 @@ using System.Threading.Tasks;
namespace skyscraper8.Docsis.DQoS
{
- internal class AuthorizationBlock : Validatable
+ public class AuthorizationBlock : Validatable
{
public AuthorizationBlock(byte[] buffer)
{
diff --git a/skyscraper8/Docsis/DQoS/PacketCableAuthorizationBlockEncoding.cs b/skyscraper8/Docsis/DQoS/PacketCableAuthorizationBlockEncoding.cs
index 2edade3..38af942 100644
--- a/skyscraper8/Docsis/DQoS/PacketCableAuthorizationBlockEncoding.cs
+++ b/skyscraper8/Docsis/DQoS/PacketCableAuthorizationBlockEncoding.cs
@@ -8,7 +8,7 @@ using System.Threading.Tasks;
namespace skyscraper8.Docsis.DQoS
{
- internal class PacketCableAuthorizationBlockEncoding : Validatable
+ public class PacketCableAuthorizationBlockEncoding : Validatable
{
public PacketCableAuthorizationBlockEncoding(byte[] buffer)
{
diff --git a/skyscraper8/Docsis/MacManagement/T29_V3_UpstreamChannelDescriptor.cs b/skyscraper8/Docsis/MacManagement/T29_V3_UpstreamChannelDescriptor.cs
index 2bd6f71..c7943a2 100644
--- a/skyscraper8/Docsis/MacManagement/T29_V3_UpstreamChannelDescriptor.cs
+++ b/skyscraper8/Docsis/MacManagement/T29_V3_UpstreamChannelDescriptor.cs
@@ -28,6 +28,11 @@ namespace skyscraper5.Docsis.MacManagement
{
byte type = ms.ReadUInt8();
byte length = ms.ReadUInt8();
+ if (ms.GetAvailableBytes() < length)
+ {
+ Valid = false;
+ return;
+ }
byte[] v = ms.ReadBytes(length);
switch (type)
{
diff --git a/skyscraper8/Docsis/MacManagement/T45_V4_MultipartRegistrationResponse.cs b/skyscraper8/Docsis/MacManagement/T45_V4_MultipartRegistrationResponse.cs
index 17db4a8..11a6c11 100644
--- a/skyscraper8/Docsis/MacManagement/T45_V4_MultipartRegistrationResponse.cs
+++ b/skyscraper8/Docsis/MacManagement/T45_V4_MultipartRegistrationResponse.cs
@@ -8,7 +8,7 @@ namespace skyscraper5.Docsis.MacManagement
{
[SkyscraperPlugin]
[MacManagementMessageType(4,45)]
- internal class T45_V4_MultipartRegistrationResponse : MacManagementMessage
+ public class T45_V4_MultipartRegistrationResponse : MacManagementMessage
{
public T45_V4_MultipartRegistrationResponse(PhysicalAddress source, PhysicalAddress destination, byte[] buffer) : base(source, destination, buffer)
{
@@ -18,6 +18,7 @@ namespace skyscraper5.Docsis.MacManagement
NumberOfFragments = ms.ReadUInt8();
FragmentSequenceNumber = ms.ReadUInt8();
TlvEncodedInformation = new CommonTlvEncodingObject(ms);
+ Valid = true;
}
public CommonTlvEncodingObject TlvEncodedInformation { get; set; }
diff --git a/skyscraper8/Skyscraper/IO/M3U8Stream.cs b/skyscraper8/Skyscraper/IO/M3U8Stream.cs
index d72b71e..938bf01 100644
--- a/skyscraper8/Skyscraper/IO/M3U8Stream.cs
+++ b/skyscraper8/Skyscraper/IO/M3U8Stream.cs
@@ -150,19 +150,20 @@ namespace skyscraper8.Skyscraper.IO
public override bool CanRead => throw new NotImplementedException();
- public override bool CanSeek => throw new NotImplementedException();
+ public override bool CanSeek => false;
- public override bool CanWrite => throw new NotImplementedException();
+ public override bool CanWrite => false;
- public override long Length => throw new NotImplementedException();
+ public override long Length => throw new NotSupportedException();
- public override long Position { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
+ public override long Position { get => actuallyRead; set => throw new NotSupportedException(); }
public override void Flush()
{
throw new NotImplementedException();
}
+ private long actuallyRead;
public override int Read(byte[] buffer, int offset, int count)
{
int result = 0;
@@ -173,6 +174,7 @@ namespace skyscraper8.Skyscraper.IO
{
if (!GetNextSegment())
{
+ actuallyRead += result;
return result;
}
continue;
@@ -181,6 +183,7 @@ namespace skyscraper8.Skyscraper.IO
count -= readResult;
result += readResult;
}
+ actuallyRead += result;
return result;
}