Implemented most relevant features of the ModemCapabilitiesEncoding
This commit is contained in:
parent
76386bad33
commit
0d0268509d
@ -0,0 +1,42 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace skyscraper8.Docsis.AnnexC
|
||||||
|
{
|
||||||
|
public class ChannelSubcarrierQamModulationSupport
|
||||||
|
{
|
||||||
|
public ChannelSubcarrierQamModulationSupport(byte a, byte b)
|
||||||
|
{
|
||||||
|
QPSK = (b & 0x04) != 0;
|
||||||
|
_8QAM = (b & 0x08) != 0;
|
||||||
|
_16QAM = (b & 0x10) != 0;
|
||||||
|
_32QAM = (b & 0x20) != 0;
|
||||||
|
_64QAM = (b & 0x40) != 0;
|
||||||
|
_128QAM = (b & 0x80) != 0;
|
||||||
|
_256QAM = (a & 0x01) != 0;
|
||||||
|
_512QAM = (a & 0x02) != 0;
|
||||||
|
_1024QAM = (a & 0x04) != 0;
|
||||||
|
_2048QAM = (a & 0x08) != 0;
|
||||||
|
_4096QAM = (a & 0x10) != 0;
|
||||||
|
_8192QAM = (a & 0x20) != 0;
|
||||||
|
_16384QAM = (a & 0x40) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool QPSK { get; }
|
||||||
|
public bool _8QAM { get; }
|
||||||
|
public bool _16QAM { get; }
|
||||||
|
public bool _32QAM { get; }
|
||||||
|
public bool _64QAM { get; }
|
||||||
|
public bool _128QAM { get; }
|
||||||
|
public bool _256QAM { get; }
|
||||||
|
public bool _512QAM { get; }
|
||||||
|
public bool _1024QAM { get; }
|
||||||
|
public bool _2048QAM { get; }
|
||||||
|
public bool _4096QAM { get; }
|
||||||
|
public bool _8192QAM { get; }
|
||||||
|
public bool _16384QAM { get; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,12 +1,22 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Runtime.Intrinsics.Arm;
|
||||||
using skyscraper5.Skyscraper;
|
using skyscraper5.Skyscraper;
|
||||||
using skyscraper5.Skyscraper.IO;
|
using skyscraper5.Skyscraper.IO;
|
||||||
|
using skyscraper8.Docsis.AnnexC;
|
||||||
|
using skyscraper8.Docsis.L2VPN;
|
||||||
|
|
||||||
namespace skyscraper5.Docsis.AnnexC
|
namespace skyscraper5.Docsis.AnnexC
|
||||||
{
|
{
|
||||||
public class ModemCapabilitiesEncoding : Validatable
|
public class ModemCapabilitiesEncoding : Validatable
|
||||||
{
|
{
|
||||||
|
private readonly bool? ExpandedUnicastSidSpace;
|
||||||
|
private readonly byte? DpvCapability;
|
||||||
|
private readonly byte EnergyManagementPreference;
|
||||||
|
private byte? UpstreamScQamSymbolRateSupport;
|
||||||
|
private byte? _512MspsUpstreamTransmitScQamChannelSupport;
|
||||||
|
private byte? _256MspsUpstreamTransmitScQamChannelSupport;
|
||||||
|
|
||||||
public ModemCapabilitiesEncoding(byte[] buffer)
|
public ModemCapabilitiesEncoding(byte[] buffer)
|
||||||
{
|
{
|
||||||
MemoryStream ms = new MemoryStream(buffer, true);
|
MemoryStream ms = new MemoryStream(buffer, true);
|
||||||
@ -31,6 +41,197 @@ namespace skyscraper5.Docsis.AnnexC
|
|||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
PrivacySupport = (PrivacySupportValue)v[0];
|
PrivacySupport = (PrivacySupportValue)v[0];
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
DownstreamSaidSupport = (byte?)v[0];
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
UpstreamServiceFlowSupport = (byte?)v[0];
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
TransmitPreEqualizerTapsPerModulationInterval = (byte?)v[0];
|
||||||
|
break;
|
||||||
|
case 11:
|
||||||
|
NumberOfTransmitEqualizerTaps = (byte?)v[0];
|
||||||
|
break;
|
||||||
|
case 12:
|
||||||
|
DccSupport = (bool?)((v[0] & 0x01) == 1);
|
||||||
|
break;
|
||||||
|
case 15:
|
||||||
|
ExpandedUnicastSidSpace = (bool?)((v[0] & 0x01) == 1);
|
||||||
|
break;
|
||||||
|
case 16:
|
||||||
|
this.RangingHoldOffSupport = new RangingHoldOffSupport(v[0], v[1], v[2], v[3]);
|
||||||
|
break;
|
||||||
|
case 17:
|
||||||
|
//This is guesswork, I don't have "CM-SP-L2VPN-I15-150528"
|
||||||
|
L2VPN = (bool?)((v[0] & 0x01) == 1);
|
||||||
|
break;
|
||||||
|
case 18:
|
||||||
|
this.ESafeHostCapability = new ESafeHostCapability(v);
|
||||||
|
break;
|
||||||
|
case 19:
|
||||||
|
this.DownstreamUnencryptedTrafficFiltering = (bool?)((v[0] & 0x01) == 1);
|
||||||
|
break;
|
||||||
|
case 20:
|
||||||
|
UpstreamFrequencyRangeSupport = (UpstreamFrequencyRangeSupportEnum)v[0];
|
||||||
|
break;
|
||||||
|
case 21:
|
||||||
|
UpstreamScQamSymbolRateSupport = v[0];
|
||||||
|
break;
|
||||||
|
case 22:
|
||||||
|
SelectableActiveCodeMode2Support = v[0] == 1;
|
||||||
|
break;
|
||||||
|
case 23:
|
||||||
|
CodeHoppingMode2Support = (bool?)(v[0] == 1);
|
||||||
|
break;
|
||||||
|
case 24:
|
||||||
|
ScQamMultipleTransmitChannelSupport = (byte?)v[0];
|
||||||
|
break;
|
||||||
|
case 25:
|
||||||
|
_512MspsUpstreamTransmitScQamChannelSupport = (byte?)v[0];
|
||||||
|
break;
|
||||||
|
case 26:
|
||||||
|
_256MspsUpstreamTransmitScQamChannelSupport = (byte?)v[0];
|
||||||
|
break;
|
||||||
|
case 27:
|
||||||
|
TotalSidClusterSupport = (byte?)v[0];
|
||||||
|
break;
|
||||||
|
case 28:
|
||||||
|
SidClustersPerServiceFlowSupport = (byte?)v[0];
|
||||||
|
break;
|
||||||
|
case 29:
|
||||||
|
ScQamMultipleReceiveChannelSupport = (byte?)v[0];
|
||||||
|
break;
|
||||||
|
case 30:
|
||||||
|
TotalDsidSupport = (byte?)v[0];
|
||||||
|
break;
|
||||||
|
case 31:
|
||||||
|
ResequencingDsidSupport = (byte?)v[0];
|
||||||
|
break;
|
||||||
|
case 32:
|
||||||
|
MulticastDsidSupport = (byte?)v[0];
|
||||||
|
break;
|
||||||
|
case 33:
|
||||||
|
MulticastDsidForwarding = (MulticastDsidForwardingEnum?)v[0];
|
||||||
|
break;
|
||||||
|
case 34:
|
||||||
|
FrameControlTypeForwardingCapability = (bool?)(v[0] == 1);
|
||||||
|
break;
|
||||||
|
case 35:
|
||||||
|
DpvCapability = (byte?)v[0];
|
||||||
|
break;
|
||||||
|
case 36:
|
||||||
|
UnsolicitedGrantServiceFlowSupport = (byte?)v[0];
|
||||||
|
break;
|
||||||
|
case 37:
|
||||||
|
MapAndUcdReceiptSupport = (bool?)((v[0] & 0x01) != 1);
|
||||||
|
break;
|
||||||
|
case 38:
|
||||||
|
(v[0], v[1]) = (v[1], v[0]);
|
||||||
|
UpstreamDropClassifierSupport = BitConverter.ToUInt16(v, 0);
|
||||||
|
break;
|
||||||
|
case 39:
|
||||||
|
Ipv6Support = (bool?)(v[0] == 1);
|
||||||
|
break;
|
||||||
|
case 40:
|
||||||
|
ExtendedUpstreamTransmitPowerCapability = (byte?)v[0];
|
||||||
|
break;
|
||||||
|
case 44:
|
||||||
|
//Additions and Modifications for Chinese Specification
|
||||||
|
//I don't have this document.
|
||||||
|
break;
|
||||||
|
case 46:
|
||||||
|
CmStatusAck = (bool?)(v[0] == 1);
|
||||||
|
break;
|
||||||
|
case 47:
|
||||||
|
EnergyManagementPreference = v[3];
|
||||||
|
break;
|
||||||
|
case 48:
|
||||||
|
(v[0], v[1]) = (v[1], v[0]);
|
||||||
|
ExtendedPacketLengthSupportCapability = BitConverter.ToUInt16(v, 0);
|
||||||
|
break;
|
||||||
|
case 49:
|
||||||
|
OfdmMultipleReceiveChannelSupport = (byte?)v[0];
|
||||||
|
break;
|
||||||
|
case 50:
|
||||||
|
OfdmaMultipleTransmitChannelSupport = (byte?)v[0];
|
||||||
|
break;
|
||||||
|
case 51:
|
||||||
|
DownstreamOfdmProfileSupport = (byte?)v[0];
|
||||||
|
break;
|
||||||
|
case 52:
|
||||||
|
this.DownstreamOfdmChannelSubcarrierQamModulationSupport = new ChannelSubcarrierQamModulationSupport(v[0], v[1]);
|
||||||
|
break;
|
||||||
|
case 53:
|
||||||
|
this.UpstreamOfdmaChannelSubcarrierQamModulationSupport = new ChannelSubcarrierQamModulationSupport(v[0], v[1]);
|
||||||
|
break;
|
||||||
|
case 54:
|
||||||
|
if (v[0] == 0x01)
|
||||||
|
DownstreamFrequencyRangeStarting = 108;
|
||||||
|
else if (v[0] == 0x02)
|
||||||
|
DownstreamFrequencyRangeStarting = 258;
|
||||||
|
break;
|
||||||
|
case 55:
|
||||||
|
if (v[0] == 0x01)
|
||||||
|
DownstreamFrequencyRangeUpTo = 1218;
|
||||||
|
else if (v[0] == 0x02)
|
||||||
|
DownstreamFrequencyRangeUpTo = 1794;
|
||||||
|
else if (v[0] == 0x04)
|
||||||
|
DownstreamFrequencyRangeUpTo = 1002;
|
||||||
|
break;
|
||||||
|
case 56:
|
||||||
|
if (v[0] == 0)
|
||||||
|
UpstreamFrequencyRangeUpTo = 42;
|
||||||
|
else if (v[0] == 1)
|
||||||
|
UpstreamFrequencyRangeUpTo = 65;
|
||||||
|
else if (v[0] == 2)
|
||||||
|
UpstreamFrequencyRangeUpTo = 85;
|
||||||
|
else if (v[0] == 3)
|
||||||
|
UpstreamFrequencyRangeUpTo = 117;
|
||||||
|
else if (v[0] == 4)
|
||||||
|
UpstreamFrequencyRangeUpTo = 204;
|
||||||
|
break;
|
||||||
|
case 57:
|
||||||
|
DocsisTimeProtocolMode = (DtpMode?)v[0];
|
||||||
|
break;
|
||||||
|
case 58:
|
||||||
|
DocsisTimeProtocolPerformanceSupport = (DtpPerformanceSupport?)v[0];
|
||||||
|
break;
|
||||||
|
case 59:
|
||||||
|
(v[0], v[1]) = (v[1], v[0]);
|
||||||
|
Pmax = BitConverter.ToUInt16(v, 0);
|
||||||
|
break;
|
||||||
|
case 60:
|
||||||
|
if (v[0] == 0x01)
|
||||||
|
DownstreamFrequencyRangeStarting = 108;
|
||||||
|
else if (v[0] == 0x02)
|
||||||
|
DownstreamFrequencyRangeStarting = 258;
|
||||||
|
else if (v[0] == 0x003)
|
||||||
|
DownstreamFullDuplex = true;
|
||||||
|
break;
|
||||||
|
case 61:
|
||||||
|
if (v[0] == 0x01)
|
||||||
|
DownstreamFrequencyRangeUpTo = 1218;
|
||||||
|
else if (v[0] == 0x02)
|
||||||
|
DownstreamFrequencyRangeUpTo = 1794;
|
||||||
|
else if (v[0] == 0x04)
|
||||||
|
DownstreamFrequencyRangeUpTo = 1002;
|
||||||
|
break;
|
||||||
|
case 62:
|
||||||
|
if (v[0] == 0)
|
||||||
|
UpstreamFrequencyRangeUpTo = 42;
|
||||||
|
else if (v[0] == 1)
|
||||||
|
UpstreamFrequencyRangeUpTo = 65;
|
||||||
|
else if (v[0] == 2)
|
||||||
|
UpstreamFrequencyRangeUpTo = 85;
|
||||||
|
else if (v[0] == 3)
|
||||||
|
UpstreamFrequencyRangeUpTo = 117;
|
||||||
|
else if (v[0] == 4)
|
||||||
|
UpstreamFrequencyRangeUpTo = 204;
|
||||||
|
break;
|
||||||
|
case 76:
|
||||||
|
LowLatencySupport = (byte?)v[0];
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
//CM-SP-MULPIv4.0-I01-190815.pdf, page 688
|
//CM-SP-MULPIv4.0-I01-190815.pdf, page 688
|
||||||
@ -62,11 +263,188 @@ namespace skyscraper5.Docsis.AnnexC
|
|||||||
public bool? FragmentationSupport { get; }
|
public bool? FragmentationSupport { get; }
|
||||||
public bool? PayloadHeaderSuppressionSupport { get; }
|
public bool? PayloadHeaderSuppressionSupport { get; }
|
||||||
public PrivacySupportValue? PrivacySupport { get; }
|
public PrivacySupportValue? PrivacySupport { get; }
|
||||||
|
public byte? DownstreamSaidSupport { get; }
|
||||||
|
public byte? UpstreamServiceFlowSupport { get; }
|
||||||
|
public byte? TransmitPreEqualizerTapsPerModulationInterval { get; }
|
||||||
|
public byte? NumberOfTransmitEqualizerTaps { get; }
|
||||||
|
public bool? DccSupport { get; }
|
||||||
|
internal RangingHoldOffSupport RangingHoldOffSupport { get; }
|
||||||
|
public bool? L2VPN { get; }
|
||||||
|
public ESafeHostCapability ESafeHostCapability { get; }
|
||||||
|
public bool? DownstreamUnencryptedTrafficFiltering { get; }
|
||||||
|
public UpstreamFrequencyRangeSupportEnum? UpstreamFrequencyRangeSupport { get; }
|
||||||
|
|
||||||
public enum PrivacySupportValue : byte
|
public enum PrivacySupportValue : byte
|
||||||
{
|
{
|
||||||
BpiSupport = 0,
|
BpiSupport = 0,
|
||||||
BpiPlusSupport = 1
|
BpiPlusSupport = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum UpstreamFrequencyRangeSupportEnum : byte
|
||||||
|
{
|
||||||
|
Standard = 0,
|
||||||
|
Upstream = 1,
|
||||||
|
Extended = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool _160kspsSymbolRateSupport
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (!UpstreamScQamSymbolRateSupport.HasValue)
|
||||||
|
return true;
|
||||||
|
return (UpstreamScQamSymbolRateSupport & 0x01) != 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool _320kspsSymbolRateSupport
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (!UpstreamScQamSymbolRateSupport.HasValue)
|
||||||
|
return true;
|
||||||
|
return (UpstreamScQamSymbolRateSupport & 0x02) != 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool _640kspsSymbolRateSupport
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (!UpstreamScQamSymbolRateSupport.HasValue)
|
||||||
|
return true;
|
||||||
|
return (UpstreamScQamSymbolRateSupport & 0x04) != 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool _1280kspsSymbolRateSupport
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (!UpstreamScQamSymbolRateSupport.HasValue)
|
||||||
|
return true;
|
||||||
|
return (UpstreamScQamSymbolRateSupport & 0x08) != 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool _2560kspsSymbolRateSupport
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (!UpstreamScQamSymbolRateSupport.HasValue)
|
||||||
|
return true;
|
||||||
|
return (UpstreamScQamSymbolRateSupport & 0x10) != 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool _5120kspsSymbolRateSupport
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (!UpstreamScQamSymbolRateSupport.HasValue)
|
||||||
|
return true;
|
||||||
|
return (UpstreamScQamSymbolRateSupport & 0x20) != 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool? SelectableActiveCodeMode2Support { get; }
|
||||||
|
public bool? CodeHoppingMode2Support { get; }
|
||||||
|
public byte? ScQamMultipleTransmitChannelSupport { get; }
|
||||||
|
public byte? TotalSidClusterSupport { get; }
|
||||||
|
public byte? SidClustersPerServiceFlowSupport { get; }
|
||||||
|
public byte? ScQamMultipleReceiveChannelSupport { get; }
|
||||||
|
public byte? TotalDsidSupport { get; }
|
||||||
|
public byte? ResequencingDsidSupport { get; private set; }
|
||||||
|
public byte? MulticastDsidSupport { get; }
|
||||||
|
public MulticastDsidForwardingEnum? MulticastDsidForwarding { get; }
|
||||||
|
public bool? FrameControlTypeForwardingCapability { get; }
|
||||||
|
|
||||||
|
public enum MulticastDsidForwardingEnum : byte
|
||||||
|
{
|
||||||
|
NoSupport,
|
||||||
|
SupportExplicit,
|
||||||
|
SupportPromiscious
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool? DpvPerPathSuppported
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (DpvCapability == null)
|
||||||
|
return null;
|
||||||
|
return (DpvCapability & 0x01) != 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool? DpvPerPacketSuppported
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (DpvCapability == null)
|
||||||
|
return null;
|
||||||
|
return (DpvCapability & 0x02) != 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte? UnsolicitedGrantServiceFlowSupport { get; }
|
||||||
|
public bool? MapAndUcdReceiptSupport { get; }
|
||||||
|
public ushort UpstreamDropClassifierSupport { get; }
|
||||||
|
public bool? Ipv6Support { get; }
|
||||||
|
public byte? ExtendedUpstreamTransmitPowerCapability { get; }
|
||||||
|
public bool? CmStatusAck { get; }
|
||||||
|
|
||||||
|
public bool? EnergyManagement1x1Feature
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (EnergyManagementPreference == null)
|
||||||
|
return null;
|
||||||
|
return (EnergyManagementPreference & 0x01) != 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool? DocsisLightSleepMode
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (EnergyManagementPreference == null)
|
||||||
|
return null;
|
||||||
|
return (EnergyManagementPreference & 0x02) != 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ushort ExtendedPacketLengthSupportCapability { get; }
|
||||||
|
public byte? OfdmMultipleReceiveChannelSupport { get; }
|
||||||
|
public byte? OfdmaMultipleTransmitChannelSupport { get; }
|
||||||
|
public byte? DownstreamOfdmProfileSupport { get; }
|
||||||
|
public ChannelSubcarrierQamModulationSupport DownstreamOfdmChannelSubcarrierQamModulationSupport { get; }
|
||||||
|
public ChannelSubcarrierQamModulationSupport UpstreamOfdmaChannelSubcarrierQamModulationSupport { get; }
|
||||||
|
public int DownstreamFrequencyRangeStarting { get; }
|
||||||
|
public int DownstreamFrequencyRangeUpTo { get; }
|
||||||
|
public int UpstreamFrequencyRangeUpTo { get; }
|
||||||
|
public DtpMode? DocsisTimeProtocolMode { get; }
|
||||||
|
public DtpPerformanceSupport? DocsisTimeProtocolPerformanceSupport { get; }
|
||||||
|
public ushort Pmax { get; }
|
||||||
|
public bool DownstreamFullDuplex { get; }
|
||||||
|
public byte? LowLatencySupport { get; }
|
||||||
|
|
||||||
|
public enum DtpMode : byte
|
||||||
|
{
|
||||||
|
NotSupported = 0,
|
||||||
|
SlaveOnly = 1,
|
||||||
|
MasterOnly = 2,
|
||||||
|
MasterOrSlave = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum DtpPerformanceSupport : byte
|
||||||
|
{
|
||||||
|
NotSupported = 0,
|
||||||
|
Level1 = 1,
|
||||||
|
Level2 = 2,
|
||||||
|
Level3 = 3,
|
||||||
|
Level4 = 4,
|
||||||
|
Level5 = 5,
|
||||||
|
NoSpecifiedPerformance = 6,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
29
skyscraper8/Docsis/AnnexC/RangingHoldOffSupport.cs
Normal file
29
skyscraper8/Docsis/AnnexC/RangingHoldOffSupport.cs
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace skyscraper8.Docsis.AnnexC
|
||||||
|
{
|
||||||
|
internal class RangingHoldOffSupport
|
||||||
|
{
|
||||||
|
public RangingHoldOffSupport(byte a, byte b, byte c, byte d)
|
||||||
|
{
|
||||||
|
CmRangingClassIdExtension = a;
|
||||||
|
CmRangingClassIdExtension <<= 8;
|
||||||
|
CmRangingClassIdExtension += b;
|
||||||
|
|
||||||
|
Cm = ((d & 0x01) != 0);
|
||||||
|
ERouter = ((d & 0x02) != 0);
|
||||||
|
EMtaOrEDva = ((d & 0x04) != 0);
|
||||||
|
DsgEStb = ((d & 0x08) != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ushort CmRangingClassIdExtension { get; private set; }
|
||||||
|
public bool Cm { get; }
|
||||||
|
public bool ERouter { get; }
|
||||||
|
public bool EMtaOrEDva { get; }
|
||||||
|
public bool DsgEStb { get; }
|
||||||
|
}
|
||||||
|
}
|
||||||
32
skyscraper8/Docsis/L2VPN/ESafeHostCapability.cs
Normal file
32
skyscraper8/Docsis/L2VPN/ESafeHostCapability.cs
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net.NetworkInformation;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace skyscraper8.Docsis.L2VPN
|
||||||
|
{
|
||||||
|
public class ESafeHostCapability
|
||||||
|
{
|
||||||
|
public ESafeHostCapability(byte[] buffer)
|
||||||
|
{
|
||||||
|
ESafeIfIndex = (ESafeIfIndex)buffer[0];
|
||||||
|
|
||||||
|
byte[] macBuffer = new byte[6];
|
||||||
|
Array.Copy(buffer, 1, macBuffer, 0, 6);
|
||||||
|
ESafeMacAddress = new PhysicalAddress(macBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ESafeIfIndex ESafeIfIndex { get; private set; }
|
||||||
|
public PhysicalAddress ESafeMacAddress { get; private set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ESafeIfIndex : byte
|
||||||
|
{
|
||||||
|
ERouter = 1,
|
||||||
|
EMta = 16,
|
||||||
|
EStbIp = 17,
|
||||||
|
ETea = 19
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user