void RoutePacket(UnpackedFrame frame) { Console.WriteLine($"{(UInt32)frame.srcid:X8}=>{(UInt32)frame.dstid:X8} {frame.signals.Length} Signals"); if (frame.dstid == 0xffffffffu) { // broadcast frame... var socks = sockets.Concat <FrameSocket>(trunks).ToArray(); foreach (var socket in socks) { // but not back where it came in, lest we loop forever... if (frame.origin != socket) { socket.EnqueueSend(frame); } } } else if (frame.dstid == 0 || frame.srcid == 0) { // discard improperly addressed packet... } else { var outsock = sockets.Concat <FrameSocket>(trunks).FirstOrDefault(fs => fs.CanRoute(frame.dstid)); if (outsock != null) { // found a match, send it on! outsock.EnqueueSend(frame); } else { // unroutable frames? default route somewhere? } } }
public void EnqueueSend(UnpackedFrame packet) { if (rconAlive) { var pframe = packet.Pack(Map); // don't bother sending an empty frame (usually no map, or no map overlap)... if (pframe.payload.Length == 2) { return; } sendbuf.Enqueue(pframe); } }
public void EnqueueSend(UnpackedFrame frame) { // format and hand to gre... UInt16 type = 0; var size = frame.signals.Count() * 4; var sigwhite = frame.signals.FirstOrDefault(cfv => cfv.name == "signal-white").count; var sig0 = frame.signals.FirstOrDefault(cfv => cfv.name == "signal-0").count; var sig1 = frame.signals.FirstOrDefault(cfv => cfv.name == "signal-1").count; switch ((UInt32)sigwhite) { case 1: switch (sig0 >> 28) { case 6: size = ((UInt16)(sig1 >> 16)) + 40; type = 0x86dd; break; case 4: size = ((UInt16)(sig0 & 0xffff)); type = 0x0800; break; default: break; } break; case 2: switch ((UInt32)sig0) { case 1: Console.WriteLine($"FCP Sol {sig1:x8} {frame.srcid:x8}=>{frame.dstid:x8}"); type = 0x88B5; size = 8; break; case 2: Console.WriteLine($"FCP Adv {sig1:x8} {frame.srcid:x8}=>{frame.dstid:x8}"); type = 0x88B5; size = 8; break; default: Console.WriteLine($"Unknown FCP Message {sig0:x8} {sig1:x8} {frame.srcid:x8}=>{frame.dstid:x8}"); break; } break; } if (type != 0) { var pframe = frame.PackWithZeros(Feathernet_0_16); if (size % 4 != 0) { size += 4 - (size % 4); } var bytes = new byte[size]; if (size <= 4 * (pframe.payload.Length - 4)) { for (int i = 0; i < size; i += 4) { UInt32 signal = pframe.payload[(i / 4) + 4]; bytes[i + 3] = (byte)(signal >> 0); bytes[i + 2] = (byte)(signal >> 8); bytes[i + 1] = (byte)(signal >> 16); bytes[i + 0] = (byte)(signal >> 24); } gre.EnqueueSend(new TypeAndPacket { Type = type, Data = bytes }); } else { Console.WriteLine($"GRE Size Mismatch type=0x{type:x4} size={size}, signals={pframe.payload.Length}"); } } else { Console.WriteLine($"Unrecognized GRE packet type=0x{type:x4} size={size}, signals={frame.signals.Count()}"); } }