Detect the second BFBS stream.
Some checks failed
🚀 Pack skyscraper8 / make-zip (push) Failing after 1m5s

This commit is contained in:
feyris-tan 2025-11-12 21:34:21 +01:00
parent af8edceca2
commit 4786e9865c

View File

@ -0,0 +1,136 @@
using log4net;
using skyscraper5.Ietf.Rfc971;
using skyscraper5.Skyscraper.Plugins;
using skyscraper8.Skyscraper.Scraper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using skyscraper5.Ietf.Rfc768;
using skyscraper5.Skyscraper;
using skyscraper5.Skyscraper.IO;
using skyscraper8.GS.SiminnRadiomidun;
namespace skyscraper8.Skyscraper
{
[SkyscraperPlugin]
internal class MpeEjectBfbs : ISkyscraperMpePlugin
{
private static readonly ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name);
public void ConnectToStorage(object[] connector)
{
throw new NotImplementedException();
}
private ISubTsHandler subTsHandler;
public void SetContext(DateTime? currentTime, object skyscraperContext)
{
subTsHandler = skyscraperContext as ISubTsHandler;
if (subTsHandler == null)
{
logger.ErrorFormat("Couldn't get a handle for the SubTsHandler. Deencapsulation will not work.");
}
}
class Session
{
public Session(IPEndPoint sourceAddress, IPEndPoint targetAddress, uint sessionCounter)
{
SourceAddress = sourceAddress;
TargetAddress = targetAddress;
SessionCounter = sessionCounter;
}
public IPEndPoint SourceAddress { get; private set; }
public IPEndPoint TargetAddress { get; private set; }
public uint SessionCounter { get; private set; }
public int ContinuityCounter { get; private set; }
public void Touch(uint nextValue)
{
if (nextValue == SessionCounter + 1)
{
ContinuityCounter++;
SessionCounter = nextValue;
}
else
{
ContinuityCounter = 0;
}
}
public override string ToString()
{
return String.Format("{0} -> {1}", SourceAddress, TargetAddress).SanitizeFileName();
}
}
private List<Session> sessions;
public bool CanHandlePacket(InternetHeader internetHeader, byte[] ipv4Packet)
{
if (internetHeader.Protocol != 17)
{
return false;
}
//check length
int length = ipv4Packet.Length;
length -= 14;
if (length == 0)
{
return false;
}
length %= 188;
if (length != 0)
{
return false;
}
//check magic
if (ipv4Packet[12] != 0x00)
{
return false;
}
if (ipv4Packet[13] != 0x10)
{
return false;
}
if (ipv4Packet[14] != 0x47)
{
return false;
}
return true;
}
public void HandlePacket(InternetHeader internetHeader, byte[] ipv4Packet)
{
UserDatagram userDatagram = new UserDatagram(ipv4Packet);
IPEndPoint source = new IPEndPoint(internetHeader.SourceAddress, userDatagram.SourcePort);
IPEndPoint target = new IPEndPoint(internetHeader.DestinationAddress, userDatagram.DestinationPort);
MemoryStream ms = new MemoryStream(userDatagram.Payload, false);
uint sequence = ms.ReadUInt32BE();
if (ms.ReadUInt8() != 0x00)
return;
if (ms.ReadUInt8() != 0x10)
return;
throw new NotImplementedException();
}
public bool StopProcessingAfterThis()
{
throw new NotImplementedException();
}
}
}