Example #1
0
        //gets a packet.rv :true success
        public override bool Recv(ref NetPacket pkt)
        {
            lock (recvSentry)
            {
                //return false;
                Log_Verb("Reciving NetPacket");
                bool result = false;

                if (!vRecBuffer.TryDequeue(out pkt))
                {
                    pkt = null;
                    ConnectionKey[] keys = connections.Keys.ToArray();
                    foreach (ConnectionKey key in keys)
                    {
                        IPPayload pl;

                        if (!connections.TryGetValue(key, out Session session))
                        {
                            continue;
                        }
                        pl = session.Recv();
                        if (!(pl == null))
                        {
                            IPPacket ipPkt = new IPPacket(pl)
                            {
                                DestinationIP = session.SourceIP,
                                SourceIP      = session.DestIP
                            };
                            EthernetFrame ef = new EthernetFrame(ipPkt)
                            {
                                SourceMAC      = virturalDHCPMAC,
                                DestinationMAC = ps2MAC,
                                Protocol       = (UInt16)EtherFrameType.IPv4
                            };
                            pkt    = ef.CreatePacket();
                            result = true;
                            break;
                        }
                    }
                }
                else
                {
                    result = true;
                }

                if (result)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
        }
Example #2
0
        public override bool Recv(ref NetPacket pkt)
        {
            if (dhcpActive)
            {
                IPPayload retDHCP = dhcp.Recv();
                if (retDHCP != null)
                {
                    IPPacket retIP = new IPPacket(retDHCP);
                    retIP.DestinationIP = new byte[] { 255, 255, 255, 255 };
                    retIP.SourceIP      = DefaultDHCPConfig.DHCP_IP;

                    EthernetFrame ef = new EthernetFrame(retIP);
                    ef.SourceMAC      = virturalDHCPMAC;
                    ef.DestinationMAC = ps2MAC;
                    ef.Protocol       = (UInt16)EtherFrameType.IPv4;
                    pkt = ef.CreatePacket();
                    return(true);
                }
            }
            return(false);
        }
Example #3
0
        //sends the packet and deletes it when done (if successful).rv :true success
        public override bool Send(NetPacket pkt)
        {
            lock (sendSentry)
            {
                Log_Verb("Sending NetPacket");
                bool result = false;

                EthernetFrame ef = new EthernetFrame(pkt);

                switch (ef.Protocol)
                {
                case (int)EtherFrameType.NULL:
                    //Adapter Reset

                    //lock (sentry)
                    //{
                    Log_Verb("Reset " + connections.Count + " Connections");
                    ConnectionKey[] keys = connections.Keys.ToArray();
                    foreach (ConnectionKey key in keys)
                    {
                        if (!connections.TryGetValue(key, out Session session))
                        {
                            continue;
                        }
                        session.Reset();
                    }
                    //}
                    break;

                case (int)EtherFrameType.IPv4:
                    result = SendIP((IPPacket)ef.Payload);
                    break;

                    #region "ARP"
                case (int)EtherFrameType.ARP:
                    Log_Verb("ARP");
                    ARPPacket arpPkt = ((ARPPacket)ef.Payload);

                    if (arpPkt.Protocol == (UInt16)EtherFrameType.IPv4)
                    {
                        if (arpPkt.OP == 1)     //ARP request
                        {
                            byte[] gateway;
                            //lock (sentry)
                            //{
                            gateway = dhcpServer.Gateway;
                            //}
                            //if (Utils.memcmp(arpPkt.TargetProtocolAddress, 0, gateway, 0, 4))
                            if (!Utils.memcmp(arpPkt.TargetProtocolAddress, 0, dhcpServer.PS2IP, 0, 4))
                            //it's trying to resolve the virtual gateway's mac addr
                            {
                                ARPPacket arpRet = new ARPPacket
                                {
                                    TargetHardwareAddress = arpPkt.SenderHardwareAddress,
                                    SenderHardwareAddress = virturalDHCPMAC,
                                    TargetProtocolAddress = arpPkt.SenderProtocolAddress,
                                    SenderProtocolAddress = arpPkt.TargetProtocolAddress,
                                    OP       = 2,
                                    Protocol = arpPkt.Protocol
                                };

                                EthernetFrame retARP = new EthernetFrame(arpRet)
                                {
                                    DestinationMAC = ps2MAC,
                                    SourceMAC      = virturalDHCPMAC,
                                    Protocol       = (UInt16)EtherFrameType.ARP
                                };
                                vRecBuffer.Enqueue(retARP.CreatePacket());
                                break;
                            }
                        }
                    }

                    result = true;
                    break;

                    #endregion
                case 0x0081:
                    Log_Error("VLAN-tagged frame (IEEE 802.1Q)");
                    throw new NotImplementedException();

                //break;
                default:
                    Log_Error("Unkown EtherframeType " + ef.Protocol.ToString("X4"));
                    break;
                }

                return(result);
            }
        }
Example #4
0
        //gets a packet.rv :true success
        public override bool recv(ref netHeader.NetPacket pkt)
        {
            //return false;
            bool result = false;


            if (ps2_mac == null)
            {
                ps2_mac = new byte[6];
                byte[] eeprombytes = new byte[6];
                for (int i = 0; i < 3; i++)
                {
                    byte[] tmp = BitConverter.GetBytes(DEV9Header.dev9.eeprom[i]);
                    Utils.memcpy(ref eeprombytes, i * 2, tmp, 0, 2);
                }
                Utils.memcpy(ref ps2_mac, 0, eeprombytes, 0, 6);
            }

            if (vRecBuffer.Count == 0)
            {
                List <string> DeadConnections = new List <string>();
                lock (sentry)
                {
                    foreach (string key in Connections.Keys) //ToDo better multi-connection stuff
                    {
                        IPPayload PL;
                        PL = Connections[key].recv();
                        if (!(PL == null))
                        {
                            IPPacket ippkt = new IPPacket(PL);
                            ippkt.DestinationIP = Connections[key].SourceIP;
                            ippkt.SourceIP      = Connections[key].DestIP;
                            EthernetFrame eF = new EthernetFrame(ippkt);
                            eF.SourceMAC      = gateway_mac;
                            eF.DestinationMAC = ps2_mac;
                            eF.Protocol       = (Int16)EtherFrameType.IPv4;
                            pkt    = eF.CreatePacket();
                            result = true;
                            break;
                        }
                        if (Connections[key].isOpen() == false)
                        {
                            Console.Error.WriteLine("Removing Closed Connection : " + key);
                            DeadConnections.Add(key);
                        }
                    }
                    foreach (string key in DeadConnections)
                    {
                        Connections.Remove(key);
                    }
                }
            }
            else
            {
                pkt = vRecBuffer[0];
                vRecBuffer.RemoveAt(0);
                result = true;
            }

            if (result)
            {
                byte[] eeprombytes = new byte[6];
                for (int i = 0; i < 3; i++)
                {
                    byte[] tmp = BitConverter.GetBytes(DEV9Header.dev9.eeprom[i]);
                    Utils.memcpy(ref eeprombytes, i * 2, tmp, 0, 2);
                }
                //original memcmp returns 0 on perfect match
                //the if statment check if !=0
                if ((Utils.memcmp(pkt.buffer, 0, eeprombytes, 0, 6) == false) & (Utils.memcmp(pkt.buffer, 0, broadcast_adddrrrr, 0, 6) == false))
                {
                    //ignore strange packets
                    Console.Error.WriteLine("Dropping Strange Packet");
                    return(false);
                }
                return(true);
            }
            else
            {
                return(false);
            }
        }