| 
									
										
										
										
											2015-05-24 06:55:12 +02:00
										 |  |  | // Copyright 2014 Dolphin Emulator Project
 | 
					
						
							| 
									
										
										
										
											2015-05-18 01:08:10 +02:00
										 |  |  | // Licensed under GPLv2+
 | 
					
						
							| 
									
										
										
										
											2014-03-07 07:09:12 +13:00
										 |  |  | // Refer to the license.txt file included.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <cctype>
 | 
					
						
							| 
									
										
										
										
											2015-09-28 10:57:16 -05:00
										 |  |  | #include <cstring>
 | 
					
						
							| 
									
										
										
										
											2014-03-07 07:09:12 +13:00
										 |  |  | #include <ctime>
 | 
					
						
							| 
									
										
										
										
											2016-01-31 23:03:55 +10:00
										 |  |  | #include <random>
 | 
					
						
							| 
									
										
										
										
											2014-03-07 07:09:12 +13:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "Common/Network.h"
 | 
					
						
							|  |  |  | #include "Common/StringUtil.h"
 | 
					
						
							| 
									
										
										
										
											2016-01-31 23:03:55 +10:00
										 |  |  | #include "Common/Timer.h"
 | 
					
						
							| 
									
										
										
										
											2014-03-07 07:09:12 +13:00
										 |  |  | 
 | 
					
						
							|  |  |  | void GenerateMacAddress(const MACConsumer type, u8* mac) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	memset(mac, 0, MAC_ADDRESS_SIZE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	u8 const oui_bba[] = { 0x00, 0x09, 0xbf }; | 
					
						
							|  |  |  | 	u8 const oui_ios[] = { 0x00, 0x17, 0xab }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	switch (type) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	case BBA: | 
					
						
							|  |  |  | 		memcpy(mac, oui_bba, 3); | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case IOS: | 
					
						
							|  |  |  | 		memcpy(mac, oui_ios, 3); | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-31 23:03:55 +10:00
										 |  |  | 	// Generate the 24-bit NIC-specific portion of the MAC address.
 | 
					
						
							|  |  |  | 	std::default_random_engine generator(Common::Timer::GetTimeMs()); | 
					
						
							|  |  |  | 	std::uniform_int_distribution<int> distribution(0x00, 0xFF); | 
					
						
							|  |  |  | 	mac[3] = static_cast<u8>(distribution(generator)); | 
					
						
							|  |  |  | 	mac[4] = static_cast<u8>(distribution(generator)); | 
					
						
							|  |  |  | 	mac[5] = static_cast<u8>(distribution(generator)); | 
					
						
							| 
									
										
										
										
											2014-03-07 07:09:12 +13:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | std::string MacAddressToString(const u8* mac) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return StringFromFormat("%02x:%02x:%02x:%02x:%02x:%02x", | 
					
						
							|  |  |  | 	                        mac[0], mac[1], mac[2], | 
					
						
							|  |  |  | 	                        mac[3], mac[4], mac[5]); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool StringToMacAddress(const std::string& mac_string, u8* mac) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	bool success = false; | 
					
						
							|  |  |  | 	if (!mac_string.empty()) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		int x = 0; | 
					
						
							|  |  |  | 		memset(mac, 0, MAC_ADDRESS_SIZE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		for (size_t i = 0; i < mac_string.size() && x < (MAC_ADDRESS_SIZE*2); ++i) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			char c = tolower(mac_string.at(i)); | 
					
						
							|  |  |  | 			if (c >= '0' && c <= '9') | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				mac[x / 2] |= (c - '0') << ((x & 1) ? 0 : 4); ++x; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			else if (c >= 'a' && c <= 'f') | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				mac[x / 2] |= (c - 'a' + 10) << ((x & 1) ? 0 : 4); ++x; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		success = x / 2 == MAC_ADDRESS_SIZE; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return success; | 
					
						
							|  |  |  | } |