//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); } } }
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); }
//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); } }
//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); } }