diff --git a/DataTableStorages/skyscraper5.Data.PostgreSql/InteractionChannel.cs b/DataTableStorages/skyscraper5.Data.PostgreSql/InteractionChannel.cs index 23f5cc0..144ad79 100644 --- a/DataTableStorages/skyscraper5.Data.PostgreSql/InteractionChannel.cs +++ b/DataTableStorages/skyscraper5.Data.PostgreSql/InteractionChannel.cs @@ -1017,6 +1017,46 @@ namespace skyscraper5.Data.PostgreSql throw new NotImplementedException(); } + public bool TestForLowerLayerService(PhysicalAddress macAddress) + { + throw new NotImplementedException(); + } + + public void InsertTimLowerLayerService(PhysicalAddress macAddress, _0xbb_LowerLayerServiceDescriptor descriptor) + { + throw new NotImplementedException(); + } + + public bool TestForHigherLayerServiceInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor.Layer2Interface layer2Interface) + { + throw new NotImplementedException(); + } + + public void InsertHigherLayerServiceInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor.Layer2Interface layer2Interface) + { + throw new NotImplementedException(); + } + + public bool TestForTimLogonResponse(PhysicalAddress macAddress) + { + throw new NotImplementedException(); + } + + public void InsertTimLogonResponse(PhysicalAddress macAddress, _0xb9_LogonResponseDescriptor descriptor) + { + throw new NotImplementedException(); + } + + public bool TestForTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath) + { + throw new NotImplementedException(); + } + + public void InsertTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath) + { + throw new NotImplementedException(); + } + private bool AreArraysEqual(byte[] l, byte[] r) { if (l.Length != r.Length) diff --git a/skyscraper8/InteractionChannel/InteractionChannelHandler.cs b/skyscraper8/InteractionChannel/InteractionChannelHandler.cs index 8cf3502..7fa0d7d 100644 --- a/skyscraper8/InteractionChannel/InteractionChannelHandler.cs +++ b/skyscraper8/InteractionChannel/InteractionChannelHandler.cs @@ -43,5 +43,9 @@ namespace skyscraper5.src.InteractionChannel void OnCorrectionMessageExtension(PhysicalAddress macAddress, _0xb1_CorrectionMessageExtensionDescriptor descriptor); void OnControlAssignment(PhysicalAddress macAddress, _0xa4_SyncAssignDescriptor descriptor); void OnSatelliteReturnLink(PhysicalAddress macAddress, _0xa9_SatelliteReturnLinkDescriptor descriptor); + void OnLowerLayerService(PhysicalAddress macAddress, _0xbb_LowerLayerServiceDescriptor descriptor); + void OnHigherLayerInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor descriptor); + void LogonResponseDescriptor(PhysicalAddress macAddress, _0xb9_LogonResponseDescriptor descriptor); + void OnForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor descriptor); } } diff --git a/skyscraper8/InteractionChannel/Model/Descriptors/0xad_ForwardInteractionPathDescriptor.cs b/skyscraper8/InteractionChannel/Model/Descriptors/0xad_ForwardInteractionPathDescriptor.cs index 827f771..f8a4347 100644 --- a/skyscraper8/InteractionChannel/Model/Descriptors/0xad_ForwardInteractionPathDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model/Descriptors/0xad_ForwardInteractionPathDescriptor.cs @@ -12,7 +12,7 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors { [SkyscraperPlugin] [TsDescriptor(0xad,"TIM")] - internal class _0xad_ForwardInteractionPathDescriptor : TsDescriptor + public class _0xad_ForwardInteractionPathDescriptor : TsDescriptor { public _0xad_ForwardInteractionPathDescriptor(byte[] buffer) { @@ -48,6 +48,59 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors public ushort OriginalNetworkId { get; internal set; } public ushort TransportStreamId { get; internal set; } public ushort[] Pids { get; internal set; } + + public string PidsAsString + { + get + { + StringBuilder sb = new StringBuilder(); + foreach (var p in Pids) + { + sb.Append(p); + sb.Append(";"); + } + + return sb.ToString(); + } + } + + protected bool Equals(ForwardInteractionPath other) + { + return PidsAsString.Equals(other.PidsAsString) && OriginalNetworkId == other.OriginalNetworkId && TransportStreamId == other.TransportStreamId; + } + + public override bool Equals(object? obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != this.GetType()) return false; + return Equals((ForwardInteractionPath)obj); + } + + public override int GetHashCode() + { + return HashCode.Combine(OriginalNetworkId, TransportStreamId); + } + + public override string ToString() + { + bool suspect = false; + StringBuilder sb = new StringBuilder(); + sb.AppendFormat("ONID: {0}, TSID: {1}, PIDs: ", OriginalNetworkId, TransportStreamId); + foreach (var p in Pids) + { + sb.Append(p); + sb.Append(";"); + if (p > 8192) + suspect = true; + } + + if (suspect) + { + sb.AppendFormat(" (suspected GS)"); + } + return sb.ToString(); + } } public List Paths { get; } diff --git a/skyscraper8/InteractionChannel/Model/Tim.cs b/skyscraper8/InteractionChannel/Model/Tim.cs index caba33c..e53e470 100644 --- a/skyscraper8/InteractionChannel/Model/Tim.cs +++ b/skyscraper8/InteractionChannel/Model/Tim.cs @@ -316,6 +316,9 @@ namespace skyscraper5.src.InteractionChannel.Model case 0xac: handler.OnCorrectionControl(macAddress, (_0xac_CorrectionControlDescriptor)descriptor); break; + case 0xad: + handler.OnForwardInteractionPath(macAddress, (_0xad_ForwardInteractionPathDescriptor)descriptor); + break; case 0xaf: handler.OnConnectionControl(macAddress, (_0xaf_ConnectionControlDescriptor)descriptor); break; @@ -328,6 +331,15 @@ namespace skyscraper5.src.InteractionChannel.Model case 0xb7: handler.OnFramePayloadFormatAnnouncement(networkId.Value, (_0xb7_FramePayloadFormatDescriptor)descriptor); break; + case 0xb9: + handler.LogonResponseDescriptor(macAddress, (_0xb9_LogonResponseDescriptor)descriptor); + break; + case 0xbb: + handler.OnLowerLayerService(macAddress, (_0xbb_LowerLayerServiceDescriptor)descriptor); + break; + case 0xc4: + handler.OnHigherLayerInitalization(macAddress, (_0xc4_HigherLayersInitializeDescriptor)descriptor); + break; default: if (id >= 0xe0 && id <= 0xfe) break; diff --git a/skyscraper8/InteractionChannel/Model2/Descriptors/_0xb9_LogonResponseDescriptor.cs b/skyscraper8/InteractionChannel/Model2/Descriptors/_0xb9_LogonResponseDescriptor.cs index 44fa3bc..c5c5a4b 100644 --- a/skyscraper8/InteractionChannel/Model2/Descriptors/_0xb9_LogonResponseDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model2/Descriptors/_0xb9_LogonResponseDescriptor.cs @@ -11,7 +11,7 @@ namespace skyscraper8.InteractionChannel.Model2.Descriptors { [SkyscraperPlugin] [TsDescriptor(0xb9,"TIM")] - internal class _0xb9_LogonResponseDescriptor : TsDescriptor + public class _0xb9_LogonResponseDescriptor : TsDescriptor { public _0xb9_LogonResponseDescriptor(byte[] buffer) { @@ -76,5 +76,10 @@ namespace skyscraper8.InteractionChannel.Model2.Descriptors AutonomousEirp = 1, ConstantPowerSpectrum = 2, } + + public override string ToString() + { + return $"{nameof(GroupId)}: {GroupId}, {nameof(LogonId)}: {LogonId}"; + } } } diff --git a/skyscraper8/InteractionChannel/Model2/Descriptors/_0xbb_LowerLayerServiceDescriptor.cs b/skyscraper8/InteractionChannel/Model2/Descriptors/_0xbb_LowerLayerServiceDescriptor.cs index 29c42ec..4b68e8c 100644 --- a/skyscraper8/InteractionChannel/Model2/Descriptors/_0xbb_LowerLayerServiceDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model2/Descriptors/_0xbb_LowerLayerServiceDescriptor.cs @@ -12,7 +12,7 @@ namespace skyscraper8.InteractionChannel.Model2.Descriptors { [SkyscraperPlugin] [TsDescriptor(0xbb,"TIM")] - internal class _0xbb_LowerLayerServiceDescriptor : TsDescriptor + public class _0xbb_LowerLayerServiceDescriptor : TsDescriptor { public _0xbb_LowerLayerServiceDescriptor(byte[] buffer) { diff --git a/skyscraper8/InteractionChannel/Model2/Descriptors/_0xc4_HigherLayersInitializeDescriptor.cs b/skyscraper8/InteractionChannel/Model2/Descriptors/_0xc4_HigherLayersInitializeDescriptor.cs index 8f6649e..5bc99a9 100644 --- a/skyscraper8/InteractionChannel/Model2/Descriptors/_0xc4_HigherLayersInitializeDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model2/Descriptors/_0xc4_HigherLayersInitializeDescriptor.cs @@ -13,7 +13,7 @@ namespace skyscraper8.InteractionChannel.Model2.Descriptors { [SkyscraperPlugin] [TsDescriptor(0xc4,"TIM")] - internal class _0xc4_HigherLayersInitializeDescriptor : TsDescriptor + public class _0xc4_HigherLayersInitializeDescriptor : TsDescriptor { public _0xc4_HigherLayersInitializeDescriptor(byte[] buffer) { @@ -43,6 +43,26 @@ namespace skyscraper8.InteractionChannel.Model2.Descriptors public IPAddress OfferStreamIpv4Adress { get; set; } public ushort OfferStreamPort { get; set; } public bool HigherLayerPepSwitchOff { get; set; } + + public string Mac24AsString => BitConverter.ToString(Mac24); + + protected bool Equals(Layer2Interface other) + { + return Mac24AsString.Equals(other.Mac24AsString) && Ipv4McAddress.Equals(other.Ipv4McAddress) && OfferStreamIpv4Adress.Equals(other.OfferStreamIpv4Adress) && OfferStreamPort == other.OfferStreamPort && HigherLayerPepSwitchOff == other.HigherLayerPepSwitchOff; + } + + public override bool Equals(object? obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != this.GetType()) return false; + return Equals((Layer2Interface)obj); + } + + public override int GetHashCode() + { + return HashCode.Combine(Mac24AsString, Ipv4McAddress, OfferStreamIpv4Adress, OfferStreamPort, HigherLayerPepSwitchOff); + } } } } diff --git a/skyscraper8/InteractionChannel/NullInteractionChannelHandler.cs b/skyscraper8/InteractionChannel/NullInteractionChannelHandler.cs index 43ce138..c43640b 100644 --- a/skyscraper8/InteractionChannel/NullInteractionChannelHandler.cs +++ b/skyscraper8/InteractionChannel/NullInteractionChannelHandler.cs @@ -74,6 +74,26 @@ namespace skyscraper5.src.InteractionChannel } + public void OnLowerLayerService(PhysicalAddress macAddress, _0xbb_LowerLayerServiceDescriptor descriptor) + { + + } + + public void OnHigherLayerInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor descriptor) + { + + } + + public void LogonResponseDescriptor(PhysicalAddress macAddress, _0xb9_LogonResponseDescriptor descriptor) + { + + } + + public void OnForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor descriptor) + { + + } + public void OnFrameComposition2(ushort? networkId, Fct2 fct2) { diff --git a/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs b/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs index 2f67ea7..d0a6d11 100644 --- a/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs +++ b/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs @@ -2562,6 +2562,48 @@ namespace skyscraper5.Skyscraper.Scraper } } + public void OnLowerLayerService(PhysicalAddress macAddress, _0xbb_LowerLayerServiceDescriptor descriptor) + { + if (!DataStorage.TestForLowerLayerService(macAddress)) + { + LogEvent(SkyscraperContextEvent.TimLowerLayerService, String.Format("For participant {0}", macAddress)); + DataStorage.InsertTimLowerLayerService(macAddress, descriptor); + } + } + + public void OnHigherLayerInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor descriptor) + { + foreach (_0xc4_HigherLayersInitializeDescriptor.Layer2Interface layer2Interface in descriptor.Layer2Interfaces) + { + if (!DataStorage.TestForHigherLayerServiceInitalization(macAddress, layer2Interface)) + { + LogEvent(SkyscraperContextEvent.TimHigherLayerInitalization, String.Format("For participant {0} -> {1}", macAddress, layer2Interface.Ipv4McAddress)); + DataStorage.InsertHigherLayerServiceInitalization(macAddress, layer2Interface); + } + } + } + + public void LogonResponseDescriptor(PhysicalAddress macAddress, _0xb9_LogonResponseDescriptor descriptor) + { + if (!DataStorage.TestForTimLogonResponse(macAddress)) + { + LogEvent(SkyscraperContextEvent.TimLogonResponse, String.Format("For participant {0}: {1}", macAddress, descriptor.ToString())); + DataStorage.InsertTimLogonResponse(macAddress, descriptor); + } + } + + public void OnForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor descriptor) + { + foreach (_0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath in descriptor.Paths) + { + if (!DataStorage.TestForTimForwardInteractionPath(macAddress, forwardInteractionPath)) + { + LogEvent(SkyscraperContextEvent.TimForwardInteractionPath, String.Format("For participant {0}: {1}", macAddress, forwardInteractionPath.ToString())); + DataStorage.InsertTimForwardInteractionPath(macAddress, forwardInteractionPath); + } + } + } + public void OnCorrectionMessage(PhysicalAddress mac, _0xa1_CorrectionMessageDescriptor cmd) { if (!DataStorage.TestForTim(mac)) diff --git a/skyscraper8/Skyscraper/Scraper/SkyscraperContextEvent.cs b/skyscraper8/Skyscraper/Scraper/SkyscraperContextEvent.cs index 088bb8f..bec8dc7 100644 --- a/skyscraper8/Skyscraper/Scraper/SkyscraperContextEvent.cs +++ b/skyscraper8/Skyscraper/Scraper/SkyscraperContextEvent.cs @@ -96,6 +96,10 @@ TimFramePayloadFormat, TimCorrectionExtension, TimControlAssignment, - TimSatelliteReturnLink + TimSatelliteReturnLink, + TimLowerLayerService, + TimHigherLayerInitalization, + TimLogonResponse, + TimForwardInteractionPath } } diff --git a/skyscraper8/Skyscraper/Scraper/Storage/DataStorage.cs b/skyscraper8/Skyscraper/Scraper/Storage/DataStorage.cs index 9b165d4..f1be71b 100644 --- a/skyscraper8/Skyscraper/Scraper/Storage/DataStorage.cs +++ b/skyscraper8/Skyscraper/Scraper/Storage/DataStorage.cs @@ -216,5 +216,13 @@ namespace skyscraper8.Skyscraper.Scraper.Storage void InsertTimControlAssignment(PhysicalAddress macAddress, _0xa4_SyncAssignDescriptor descriptor); bool TestForTimSatelliteReturnLink(PhysicalAddress macAddress); void InsertTimSatelliteReturnLink(PhysicalAddress macAddress, _0xa9_SatelliteReturnLinkDescriptor descriptor); + bool TestForLowerLayerService(PhysicalAddress macAddress); + void InsertTimLowerLayerService(PhysicalAddress macAddress, _0xbb_LowerLayerServiceDescriptor descriptor); + bool TestForHigherLayerServiceInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor.Layer2Interface layer2Interface); + void InsertHigherLayerServiceInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor.Layer2Interface layer2Interface); + bool TestForTimLogonResponse(PhysicalAddress macAddress); + void InsertTimLogonResponse(PhysicalAddress macAddress, _0xb9_LogonResponseDescriptor descriptor); + bool TestForTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath); + void InsertTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath); } } diff --git a/skyscraper8/Skyscraper/Scraper/Storage/Filesystem/FilesystemStorage.cs b/skyscraper8/Skyscraper/Scraper/Storage/Filesystem/FilesystemStorage.cs index e305e7b..40b327c 100644 --- a/skyscraper8/Skyscraper/Scraper/Storage/Filesystem/FilesystemStorage.cs +++ b/skyscraper8/Skyscraper/Scraper/Storage/Filesystem/FilesystemStorage.cs @@ -1255,6 +1255,46 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.Filesystem throw new NotImplementedException(); } + public bool TestForLowerLayerService(PhysicalAddress macAddress) + { + throw new NotImplementedException(); + } + + public void InsertTimLowerLayerService(PhysicalAddress macAddress, _0xbb_LowerLayerServiceDescriptor descriptor) + { + throw new NotImplementedException(); + } + + public bool TestForHigherLayerServiceInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor.Layer2Interface layer2Interface) + { + throw new NotImplementedException(); + } + + public void InsertHigherLayerServiceInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor.Layer2Interface layer2Interface) + { + throw new NotImplementedException(); + } + + public bool TestForTimLogonResponse(PhysicalAddress macAddress) + { + throw new NotImplementedException(); + } + + public void InsertTimLogonResponse(PhysicalAddress macAddress, _0xb9_LogonResponseDescriptor descriptor) + { + throw new NotImplementedException(); + } + + public bool TestForTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath) + { + throw new NotImplementedException(); + } + + public void InsertTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath) + { + throw new NotImplementedException(); + } + public IEnumerable> SelectAllPmt() { throw new NotImplementedException(); diff --git a/skyscraper8/Skyscraper/Scraper/Storage/InMemory/InMemoryScraperStorage.cs b/skyscraper8/Skyscraper/Scraper/Storage/InMemory/InMemoryScraperStorage.cs index e9e79c0..9fa0d43 100644 --- a/skyscraper8/Skyscraper/Scraper/Storage/InMemory/InMemoryScraperStorage.cs +++ b/skyscraper8/Skyscraper/Scraper/Storage/InMemory/InMemoryScraperStorage.cs @@ -1149,6 +1149,71 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.InMemory _timSatelliteReturnLinks.Add(macAddress, descriptor); } + private Dictionary _timLowerLayerServiceDescriptors; + public bool TestForLowerLayerService(PhysicalAddress macAddress) + { + if (_timLowerLayerServiceDescriptors == null) + return false; + + return _timLowerLayerServiceDescriptors.ContainsKey(macAddress); + } + + public void InsertTimLowerLayerService(PhysicalAddress macAddress, _0xbb_LowerLayerServiceDescriptor descriptor) + { + if (_timLowerLayerServiceDescriptors == null) + _timLowerLayerServiceDescriptors = new Dictionary(); + + _timLowerLayerServiceDescriptors.Add(macAddress, descriptor); + } + + private HashSet> layer2interfaces; + public bool TestForHigherLayerServiceInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor.Layer2Interface layer2Interface) + { + if (layer2interfaces == null) + return false; + + return layer2interfaces.Contains(new Tuple(macAddress, layer2Interface)); + } + + public void InsertHigherLayerServiceInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor.Layer2Interface layer2Interface) + { + layer2interfaces.Add(new Tuple(macAddress, layer2Interface)); + } + + private Dictionary _logonResponseDescriptors; + public bool TestForTimLogonResponse(PhysicalAddress macAddress) + { + if (_logonResponseDescriptors == null) + return false; + + return _logonResponseDescriptors.ContainsKey(macAddress); + } + + public void InsertTimLogonResponse(PhysicalAddress macAddress, _0xb9_LogonResponseDescriptor descriptor) + { + if (_logonResponseDescriptors == null) + _logonResponseDescriptors = new Dictionary(); + + _logonResponseDescriptors.Add(macAddress, descriptor); + } + + private HashSet> _forwardInteractionPaths; + public bool TestForTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath) + { + if (_forwardInteractionPaths == null) + return false; + + return _forwardInteractionPaths.Contains(new Tuple(macAddress, forwardInteractionPath)); + } + + public void InsertTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath) + { + if (_forwardInteractionPaths == null) + _forwardInteractionPaths = new HashSet>(); + + _forwardInteractionPaths.Add(new Tuple(macAddress, forwardInteractionPath)); + } + public IEnumerable> SelectAllPmt() { for (int x = 0; x < pmtEntries.Length; x++) diff --git a/skyscraper8/Skyscraper/Scraper/StreamAutodetection/Contestants/InteractionChannelContestant.cs b/skyscraper8/Skyscraper/Scraper/StreamAutodetection/Contestants/InteractionChannelContestant.cs index baff2eb..ddff843 100644 --- a/skyscraper8/Skyscraper/Scraper/StreamAutodetection/Contestants/InteractionChannelContestant.cs +++ b/skyscraper8/Skyscraper/Scraper/StreamAutodetection/Contestants/InteractionChannelContestant.cs @@ -251,6 +251,35 @@ namespace skyscraper5.src.Skyscraper.Scraper.StreamAutodetection.Contestants //TODO: put some sensible validation logic in here } + public void OnLowerLayerService(PhysicalAddress macAddress, _0xbb_LowerLayerServiceDescriptor descriptor) + { + if (descriptor.LowerLayerServices.Length > 0) + { + Score++; + } + } + + public void OnHigherLayerInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor descriptor) + { + if (descriptor.Layer2Interfaces.Length > 0) + { + Score++; + } + } + + public void LogonResponseDescriptor(PhysicalAddress macAddress, _0xb9_LogonResponseDescriptor descriptor) + { + //TODO: put some sensible validation logic in here. + } + + public void OnForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor descriptor) + { + if (descriptor.Paths.Count > 0) + { + Score++; + } + } + public void OnFrameComposition2(ushort? networkId, Fct2 fct2) { if (fct2.FrameTypes.Length > 0)