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; }