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?
         }
     }
 }
Example #2
0
        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);
            }
        }
Example #3
0
        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()}");
            }
        }