CEXIETHERNET::CEXIETHERNET() { tx_fifo = new u8[1518]; mBbaMem = new u8[BBA_MEM_SIZE]; mRecvBuffer = new u8[BBA_RECV_SIZE]; mRecvBufferLength = 0; MXHardReset(); // Parse MAC address from config, and generate a new one if it doesn't // exist or can't be parsed. std::string &mac_addr_setting = SConfig::GetInstance().m_bba_mac; u8 mac_addr[MAC_ADDRESS_SIZE] = { 0 }; if (!StringToMacAddress(mac_addr_setting, mac_addr)) { GenerateMacAddress(BBA, mac_addr); mac_addr_setting = MacAddressToString(mac_addr); SConfig::GetInstance().SaveSettings(); } memcpy(&mBbaMem[BBA_NAFR_PAR0], mac_addr, MAC_ADDRESS_SIZE); // HACK: .. fully established 100BASE-T link mBbaMem[BBA_NWAYS] = NWAYS_LS100 | NWAYS_LPNWAY | NWAYS_100TXF | NWAYS_ANCLPT; #if defined(_WIN32) mHAdapter = INVALID_HANDLE_VALUE; mHRecvEvent = INVALID_HANDLE_VALUE; mHReadWait = INVALID_HANDLE_VALUE; #elif defined(__linux__) || defined(__APPLE__) fd = -1; #endif }
CEXIETHERNET::CEXIETHERNET() { tx_fifo = std::make_unique<u8[]>(BBA_TXFIFO_SIZE); mBbaMem = std::make_unique<u8[]>(BBA_MEM_SIZE); mRecvBuffer = std::make_unique<u8[]>(BBA_RECV_SIZE); mRecvBufferLength = 0; MXHardReset(); // Parse MAC address from config, and generate a new one if it doesn't // exist or can't be parsed. std::string& mac_addr_setting = SConfig::GetInstance().m_bba_mac; u8 mac_addr[Common::MAC_ADDRESS_SIZE] = {0}; if (!Common::StringToMacAddress(mac_addr_setting, mac_addr)) { Common::GenerateMacAddress(Common::MACConsumer::BBA, mac_addr); mac_addr_setting = Common::MacAddressToString(mac_addr); SConfig::GetInstance().SaveSettings(); } memcpy(&mBbaMem[BBA_NAFR_PAR0], mac_addr, Common::MAC_ADDRESS_SIZE); // HACK: .. fully established 100BASE-T link mBbaMem[BBA_NWAYS] = NWAYS_LS100 | NWAYS_LPNWAY | NWAYS_100TXF | NWAYS_ANCLPT; #if defined(_WIN32) mHAdapter = INVALID_HANDLE_VALUE; memset(&mReadOverlapped, 0, sizeof(mReadOverlapped)); memset(&mWriteOverlapped, 0, sizeof(mWriteOverlapped)); mWritePending = false; #elif defined(__linux__) || defined(__APPLE__) fd = -1; #endif }
CEXIETHERNET::CEXIETHERNET() { tx_fifo = new u8[1518]; mBbaMem = new u8[BBA_MEM_SIZE]; mRecvBuffer = new u8 [BBA_RECV_SIZE]; mRecvBufferLength = 0; MXHardReset(); // Parse MAC address from config, and generate a new one if it doesn't // exist or can't be parsed. auto &mac_addr_setting = SConfig::GetInstance().m_bba_mac; bool mac_addr_valid = false; u8 mac_addr[6] = { 0 }; if (!mac_addr_setting.empty()) { int x = 0; for (size_t i = 0; i < mac_addr_setting.size() && x < 12; i++) { char c = mac_addr_setting.at(i); if (c >= '0' && c <= '9') { mac_addr[x / 2] |= (c - '0') << ((x & 1) ? 0 : 4); x++; } else if (c >= 'A' && c <= 'F') { mac_addr[x / 2] |= (c - 'A' + 10) << ((x & 1) ? 0 : 4); x++; } else if (c >= 'a' && c <= 'f') { mac_addr[x / 2] |= (c - 'a' + 10) << ((x & 1) ? 0 : 4); x++; } } if (x / 2 == 6) { memcpy(&mBbaMem[BBA_NAFR_PAR0], mac_addr, 6); mac_addr_valid = true; } } if (!mac_addr_valid) { GenerateMAC(BBA, mac_addr); mac_addr_setting = ArrayToString(mac_addr, 6, 10, false); SConfig::GetInstance().SaveSettings(); memcpy(&mBbaMem[BBA_NAFR_PAR0], mac_addr, 6); } // HACK: .. fully established 100BASE-T link mBbaMem[BBA_NWAYS] = NWAYS_LS100 | NWAYS_LPNWAY | NWAYS_100TXF | NWAYS_ANCLPT; #if defined(_WIN32) mHAdapter = INVALID_HANDLE_VALUE; mHRecvEvent = INVALID_HANDLE_VALUE; mHReadWait = INVALID_HANDLE_VALUE; #elif defined(__linux__) fd = -1; #endif }