eapol/eapol_framework/eapol_symbian/am/core/symbian/eapol_am_core_symbian.cpp
branchRCL_3
changeset 46 c74b3d9f6b9e
equal deleted inserted replaced
45:bad0cc58d154 46:c74b3d9f6b9e
       
     1 /*
       
     2 * Copyright (c) 2001-2006 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of the License "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  EAP and WLAN authentication protocols.
       
    15 *
       
    16 */
       
    17 
       
    18 /*
       
    19 * %version: 17.1.2.1.1 %
       
    20 */
       
    21 
       
    22 // This is enumeration of EAPOL source code.
       
    23 #if defined(USE_EAP_MINIMUM_RELEASE_TRACES)
       
    24 	#undef EAP_FILE_NUMBER_ENUM
       
    25 	#define EAP_FILE_NUMBER_ENUM 148 
       
    26 	#undef EAP_FILE_NUMBER_DATE 
       
    27 	#define EAP_FILE_NUMBER_DATE 1127594498 
       
    28 #endif //#if defined(USE_EAP_MINIMUM_RELEASE_TRACES)
       
    29 
       
    30 
       
    31 // INCLUDE FILES
       
    32 
       
    33 #include "eap_am_memory.h"
       
    34 
       
    35 #include "eap_variable_data.h"
       
    36 #include "eap_tools.h"
       
    37 #include "eap_type_all.h"
       
    38 
       
    39 #include "eapol_am_core_symbian.h"
       
    40 #include "eapol_ethernet_header.h"
       
    41 #include "ethernet_core.h"
       
    42 #include "eap_am_tools_symbian.h"
       
    43 #include <EapolToWlmIf.h>
       
    44 #include "EapolDbDefaults.h"
       
    45 #include "EapolDbParameterNames.h"
       
    46 #include "eap_crypto_api.h"
       
    47 #include "eap_header_string.h"
       
    48 #include "eap_am_file_input_symbian.h"
       
    49 #include "eap_rogue_ap_entry.h"
       
    50 #include "abs_eap_state_notification.h"
       
    51 #include "eapol_session_key.h"
       
    52 #include "eap_buffer.h"
       
    53 #include "eap_config.h"
       
    54 
       
    55 #if defined(USE_EAP_FILECONFIG)
       
    56 	#include "eap_file_config.h"
       
    57 #endif //#if defined(USE_EAP_FILECONFIG)
       
    58 
       
    59 #if defined (USE_EAPOL_KEY_STATE) 
       
    60 	#include "eapol_key_state.h"	
       
    61 #endif
       
    62 
       
    63 // LOCAL CONSTANTS
       
    64 const TUint KMaxSqlQueryLength = 2048;
       
    65 const TUint KMaxConfigStringLength = 256;
       
    66 const u32_t KMTU = 1500u;
       
    67 const u32_t KTrailerLength = 0;
       
    68 const u32_t KHeaderOffset = 0;
       
    69 const TUint KMaxEapCueLength = 3;
       
    70 
       
    71 enum eapol_am_core_timer_id_e
       
    72 {
       
    73 	EAPOL_AM_CORE_TIMER_RESTART_AUTHENTICATION_ID,
       
    74 	EAPOL_AM_CORE_TIMER_DELETE_STACK_ID,
       
    75 	EAPOL_AM_CORE_TIMER_FAILED_COMPLETELY_ID,
       
    76 };
       
    77 
       
    78 
       
    79 const TUint8 TEST_RSN_IE[] =
       
    80 {
       
    81 	0xdd, // information element id, 221 expressed as Hex value
       
    82 	0x14, // length in octets, 20 expressed as Hex value
       
    83 	0x01, 0x00, // Version 1
       
    84 	0x00, 0x0f, 0xac, 0x04, // CCMP as group key cipher suite
       
    85 	0x01, 0x00, // pairwise key cipher suite count
       
    86 	0x00, 0x0f, 0xac, 0x04, // CCMP as pairwise key cipher suite
       
    87 	0x01, 0x00, // authentication count
       
    88 	0x00, 0x0f, 0xac, 0x01, // 802.1X authentication
       
    89 	0x01, 0x00, // Pre-authentication capabilities
       
    90 };
       
    91 
       
    92 // ================= MEMBER FUNCTIONS =======================
       
    93 
       
    94 eapol_am_core_symbian_c::eapol_am_core_symbian_c(MEapolToWlmIf * const aPartner,
       
    95 												 const bool is_client_when_true,
       
    96 												 const TUint aServerIndex)
       
    97 : CActive(CActive::EPriorityStandard)
       
    98 , m_partner(aPartner)
       
    99 , m_ethernet_core(0)
       
   100 , m_am_tools(0)
       
   101 , m_enable_random_errors(false)
       
   102 , m_error_probability(0u)
       
   103 , m_generate_multiple_error_packets(0u)
       
   104 , m_authentication_counter(0u)
       
   105 , m_successful_authentications(0u)
       
   106 , m_failed_authentications(0u)
       
   107 , m_is_valid(false)
       
   108 , m_is_client(is_client_when_true)
       
   109 , m_eap_index(0u)
       
   110 , m_index_type(ELan)
       
   111 , m_index(aServerIndex)
       
   112 //, m_timer(0)
       
   113 , m_packet_index(0)
       
   114 , m_manipulate_ethernet_header(false)
       
   115 , m_send_original_packet_first(false)
       
   116 , m_authentication_indication_sent(false)
       
   117 , m_unicast_wep_key_received(false)
       
   118 , m_broadcast_wep_key_received(false)
       
   119 , m_block_packet_sends_and_notifications(false)
       
   120 , m_success_indication_sent(false)
       
   121 , m_first_authentication(true)
       
   122 , m_self_disassociated(false)
       
   123 , m_802_11_authentication_mode(EAuthModeOpen)
       
   124 , m_receive_network_id(0)
       
   125 , m_wpa_override_enabled(false)
       
   126 , m_wpa_psk_mode_allowed(false)
       
   127 , m_wpa_psk_mode_active(false)
       
   128 , m_stack_marked_to_be_deleted(false)
       
   129 , m_active_type_is_leap(false)
       
   130 , m_fileconfig(0)
       
   131 {
       
   132 }	
       
   133 
       
   134 //--------------------------------------------------
       
   135 
       
   136 void eapol_am_core_symbian_c::ConstructL()
       
   137 {
       
   138 	if (m_partner == 0)
       
   139 	{
       
   140 		User::Leave(KErrGeneral);
       
   141 	}
       
   142 
       
   143 	// Create tools class
       
   144 	m_am_tools = new(ELeave) eap_am_tools_symbian_c(EAP_DEFAULT_TRACE_FILE);
       
   145 	if (m_am_tools->get_is_valid() != true)
       
   146 	{
       
   147 		// The real reason most likely is KErrNoMemory but since that is not sure we'll use KErrGeneral
       
   148 		User::Leave(KErrGeneral);
       
   149 	}
       
   150 	if (m_am_tools->configure() != eap_status_ok)
       
   151 	{
       
   152 		User::Leave(KErrGeneral);
       
   153 	}
       
   154 
       
   155 
       
   156 	EAP_TRACE_DEBUG(
       
   157 		m_am_tools,
       
   158 		TRACE_FLAGS_DEFAULT,
       
   159 		(EAPL("EAPOL INITIALISATION\n")));	
       
   160 	EAP_TRACE_DEBUG(
       
   161 		m_am_tools,
       
   162 		TRACE_FLAGS_DEFAULT,
       
   163 		(EAPL("====================\n")));	
       
   164 
       
   165 	m_wpa_preshared_key = new (ELeave) eap_variable_data_c(m_am_tools);
       
   166 
       
   167 	m_ssid = new (ELeave) eap_variable_data_c(m_am_tools);
       
   168 
       
   169 	m_wpa_psk_password_override = new (ELeave) eap_variable_data_c(m_am_tools);
       
   170 
       
   171 	// Create/initialise the database
       
   172 	OpenDatabaseL(m_database, m_session);
       
   173 
       
   174 	EAP_TRACE_DEBUG(
       
   175 		m_am_tools,
       
   176 		TRACE_FLAGS_DEFAULT,
       
   177 		(EAPL("Database initialized...\n")));
       
   178 	
       
   179 #if defined(USE_EAP_FILECONFIG)
       
   180 
       
   181 	{
       
   182 		EAP_TRACE_DEBUG(
       
   183 			m_am_tools,
       
   184 			TRACE_FLAGS_DEFAULT,
       
   185 			(EAPL("Initialize file configuration.\n")));
       
   186 			eap_am_file_input_symbian_c fileio(m_am_tools);
       
   187 
       
   188 		eap_variable_data_c file_name_c_data(m_am_tools);
       
   189 
       
   190 		eap_status_e status(eap_status_process_general_error);
       
   191 
       
   192 		{
       
   193 			eap_const_string const FILECONFIG_FILENAME_C
       
   194 				= "c:\\system\\data\\eap.conf";
       
   195 
       
   196 			status = file_name_c_data.set_copy_of_buffer(
       
   197 				FILECONFIG_FILENAME_C,
       
   198 				m_am_tools->strlen(FILECONFIG_FILENAME_C));
       
   199 			if (status != eap_status_ok)
       
   200 			{
       
   201 				EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
   202 				User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
       
   203 			}
       
   204 
       
   205 			status = file_name_c_data.add_end_null();
       
   206 			if (status != eap_status_ok)
       
   207 			{
       
   208 				EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
   209 				User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
       
   210 			}
       
   211 		}
       
   212 
       
   213 		eap_variable_data_c file_name_z_data(m_am_tools);
       
   214 
       
   215 		{
       
   216 			eap_const_string const FILECONFIG_FILENAME_Z
       
   217 				= "z:\\private\\101F8EC5\\eap.conf";
       
   218 
       
   219 			status = file_name_z_data.set_copy_of_buffer(
       
   220 				FILECONFIG_FILENAME_Z,
       
   221 				m_am_tools->strlen(FILECONFIG_FILENAME_Z));
       
   222 			if (status != eap_status_ok)
       
   223 			{
       
   224 				EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
   225 				User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
       
   226 			}
       
   227 
       
   228 			status = file_name_z_data.add_end_null();
       
   229 			if (status != eap_status_ok)
       
   230 			{
       
   231 				EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
   232 				User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
       
   233 			}
       
   234 		}
       
   235 
       
   236 		if (status == eap_status_ok)
       
   237 		{
       
   238 			// First try open from C: disk.
       
   239 			status = fileio.file_open(
       
   240 				&file_name_c_data,
       
   241 				eap_file_io_direction_read);
       
   242 			if (status == eap_status_ok)
       
   243 			{
       
   244 				EAP_TRACE_DEBUG(
       
   245 					m_am_tools,
       
   246 					TRACE_FLAGS_DEFAULT,
       
   247 					(EAPL("Opens configure file %s\n"),
       
   248 					file_name_c_data.get_data(file_name_c_data.get_data_length())));
       
   249 			}
       
   250 			else if (status != eap_status_ok)
       
   251 			{
       
   252 				// Second try open from Z: disk.
       
   253 				status = fileio.file_open(
       
   254 					&file_name_z_data,
       
   255 					eap_file_io_direction_read);
       
   256 				if (status == eap_status_ok)
       
   257 				{
       
   258 					EAP_TRACE_DEBUG(
       
   259 						m_am_tools,
       
   260 						TRACE_FLAGS_DEFAULT,
       
   261 						(EAPL("Opens configure file %s\n"),
       
   262 						 file_name_z_data.get_data(file_name_z_data.get_data_length())));
       
   263 				}
       
   264 			}
       
   265 
       
   266 			if (status == eap_status_ok)
       
   267 			{
       
   268 				// Some of the files were opened.
       
   269 
       
   270 				m_fileconfig = new eap_file_config_c(m_am_tools);
       
   271 				if (m_fileconfig != 0
       
   272 					&& m_fileconfig->get_is_valid() == true)
       
   273 				{
       
   274 					status = m_fileconfig->configure(&fileio);
       
   275 					if (status != eap_status_ok)
       
   276 					{
       
   277 						EAP_TRACE_DEBUG(
       
   278 							m_am_tools,
       
   279 							TRACE_FLAGS_DEFAULT,
       
   280 							(EAPL("ERROR: Configure read from %s failed.\n"),
       
   281 							file_name_c_data.get_data(file_name_c_data.get_data_length())));
       
   282 					}
       
   283 					else
       
   284 					{
       
   285 						EAP_TRACE_DEBUG(
       
   286 							m_am_tools,
       
   287 							TRACE_FLAGS_DEFAULT,
       
   288 							(EAPL("Configure read from %s\n"),
       
   289 							file_name_c_data.get_data(file_name_c_data.get_data_length())));
       
   290 					}
       
   291 				}
       
   292 				else
       
   293 				{
       
   294 					// No file configuration.
       
   295 					delete m_fileconfig;
       
   296 					m_fileconfig = 0;
       
   297 
       
   298 					EAP_TRACE_DEBUG(
       
   299 						m_am_tools,
       
   300 						TRACE_FLAGS_DEFAULT,
       
   301 						(EAPL("ERROR: Cannot create configure object for file %s\n"),
       
   302 						file_name_c_data.get_data(file_name_c_data.get_data_length())));
       
   303 				}
       
   304 			}
       
   305 			else
       
   306 			{
       
   307 				EAP_TRACE_DEBUG(
       
   308 					m_am_tools,
       
   309 					TRACE_FLAGS_DEFAULT,
       
   310 					(EAPL("ERROR: Cannot open configure file neither %s nor %s\n"),
       
   311 					file_name_c_data.get_data(file_name_c_data.get_data_length()),
       
   312 					file_name_z_data.get_data(file_name_z_data.get_data_length())));
       
   313 			}
       
   314 		}
       
   315 	}
       
   316 
       
   317 #endif //#if defined(USE_EAP_FILECONFIG)
       
   318 
       
   319 #if !defined(USE_EAP_HARDWARE_TRACE)
       
   320 	{
       
   321 		// Disable traces.
       
   322 		m_am_tools->set_trace_mask(eap_am_tools_c::eap_trace_mask_none);
       
   323 
       
   324 		eap_variable_data_c trace_output_file(m_am_tools);
       
   325 
       
   326 		eap_status_e status = read_configure(
       
   327 			cf_str_EAP_TRACE_output_file_name.get_field(),
       
   328 			&trace_output_file);
       
   329 		if (status == eap_status_ok
       
   330 			&& trace_output_file.get_is_valid_data() == true)
       
   331 		{
       
   332 			status = m_am_tools->set_trace_file_name(&trace_output_file);
       
   333 			if (status == eap_status_ok)
       
   334 			{
       
   335 				// OK, set the default trace mask.
       
   336 				m_am_tools->set_trace_mask(
       
   337 					eap_am_tools_c::eap_trace_mask_debug
       
   338 					| eap_am_tools_c::eap_trace_mask_always
       
   339 					| eap_am_tools_c::eap_trace_mask_error);
       
   340 			}
       
   341 		}
       
   342 	}
       
   343 #endif //#if defined(USE_EAP_HARDWARE_TRACE)
       
   344 
       
   345 
       
   346 	{
       
   347 		eap_status_e status = configure();
       
   348 		if (status != eap_status_ok)
       
   349 		{
       
   350 			User::Leave(KErrGeneral);
       
   351 			User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
       
   352 		}
       
   353 	}
       
   354 	
       
   355 	EAP_TRACE_DEBUG(
       
   356 		m_am_tools,
       
   357 		TRACE_FLAGS_DEFAULT,
       
   358 		(EAPL("Configured EAPOL AM...\n")));
       
   359 
       
   360 	EAP_TRACE_DEBUG(
       
   361 		m_am_tools,
       
   362 		TRACE_FLAGS_DEFAULT,
       
   363 		(EAPL("Created timer...\n")));
       
   364 
       
   365 	// SERVER TEST CODE
       
   366 	if (m_is_client == false)
       
   367 	{
       
   368 		TRAPD(err, ReadEAPSettingsL());
       
   369 		if (err != KErrNone)
       
   370 		{
       
   371 			// Setting reading from CommDB failed. Use default values instead (only EAP-SIM).
       
   372 			
       
   373 			// SIM
       
   374 			_LIT(KSIM, "18");
       
   375 			TEap* sim = new(ELeave) TEap;
       
   376 			CleanupStack::PushL(sim);
       
   377 			sim->Enabled = ETrue;
       
   378 			sim->UID.Copy(KSIM);		
       
   379 			User::LeaveIfError(m_iap_eap_array.Append(sim));
       
   380 			CleanupStack::Pop(sim);
       
   381 		}
       
   382 
       
   383 	}
       
   384 
       
   385 	EAP_TRACE_DEBUG(
       
   386 		m_am_tools,
       
   387 		TRACE_FLAGS_DEFAULT,
       
   388 		(EAPL("========================\n")));
       
   389 
       
   390 	set_is_valid();
       
   391 
       
   392 }
       
   393 
       
   394 
       
   395 //--------------------------------------------------
       
   396 
       
   397 eapol_am_core_symbian_c* eapol_am_core_symbian_c::NewL(MEapolToWlmIf * const aPartner,
       
   398 												  const bool aIsClient,
       
   399 												  const TUint aServerIndex)
       
   400 {
       
   401 	eapol_am_core_symbian_c* self = new(ELeave) eapol_am_core_symbian_c(aPartner, aIsClient, aServerIndex);
       
   402 	CleanupStack::PushL(self);
       
   403 	self->ConstructL();
       
   404 
       
   405 	if (self->get_is_valid() != true)
       
   406 	{
       
   407 		User::Leave(KErrGeneral);
       
   408 	}
       
   409 
       
   410 	CleanupStack::Pop();
       
   411 	return self;
       
   412 }
       
   413 
       
   414 //--------------------------------------------------
       
   415 
       
   416 eapol_am_core_symbian_c::~eapol_am_core_symbian_c()
       
   417 {
       
   418 
       
   419 #if defined(USE_EAP_FILECONFIG)
       
   420 	delete m_fileconfig;
       
   421 	m_fileconfig = 0;
       
   422 #endif //#if defined(USE_EAP_FILECONFIG)
       
   423 
       
   424 	shutdown();
       
   425 }
       
   426 
       
   427 //--------------------------------------------------
       
   428 
       
   429 //
       
   430 eap_status_e eapol_am_core_symbian_c::shutdown()
       
   431 {
       
   432 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
   433 	
       
   434 	EAP_TRACE_DEBUG(
       
   435 		m_am_tools,
       
   436 		TRACE_FLAGS_DEFAULT,
       
   437 		(EAPL("eapol_am_core_symbian_c::shutdown()\n")));
       
   438 
       
   439 	// Cancel timer	
       
   440 	cancel_all_timers();
       
   441 
       
   442 	// Delete upper stack if it still exists
       
   443 	if (m_ethernet_core != 0)
       
   444 	{
       
   445 		m_ethernet_core->shutdown();
       
   446 		delete m_ethernet_core;
       
   447 	}
       
   448 	
       
   449 	delete m_wpa_preshared_key;
       
   450 	
       
   451 	delete m_ssid;
       
   452 
       
   453 	delete m_wpa_psk_password_override;
       
   454 
       
   455 	delete m_receive_network_id;
       
   456 
       
   457 	m_database.Close();
       
   458 	m_session.Close();
       
   459 
       
   460 	// Print some statistics
       
   461 	if (m_is_client)
       
   462 	{
       
   463 		EAP_TRACE_ALWAYS(
       
   464 			m_am_tools,
       
   465 			TRACE_FLAGS_ALWAYS|TRACE_TEST_VECTORS,
       
   466 			(EAPL("client authentication SUCCESS %d, FAILED %d, count %d\n"),
       
   467 			m_successful_authentications,
       
   468 			m_failed_authentications,
       
   469 			m_authentication_counter));	
       
   470 	}
       
   471 	else
       
   472 	{
       
   473 		EAP_TRACE_ALWAYS(
       
   474 			m_am_tools,
       
   475 			TRACE_FLAGS_ALWAYS|TRACE_TEST_VECTORS,
       
   476 			(EAPL("server authentication SUCCESS %d, FAILED %d, count %d\n"),
       
   477 			m_successful_authentications,
       
   478 			m_failed_authentications,
       
   479 			m_authentication_counter));
       
   480 	}	
       
   481 	
       
   482 	EAP_TRACE_DEBUG(
       
   483 		m_am_tools,
       
   484 		TRACE_FLAGS_DEFAULT,
       
   485 		(EAPL("EAPOL EXITING.\n")));
       
   486 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
   487 
       
   488 	// Finally delete tools. No logging is allowed after this.
       
   489 	if (m_am_tools != 0)
       
   490 	{
       
   491 		m_am_tools->shutdown();
       
   492 		delete m_am_tools;
       
   493 	}
       
   494 
       
   495 
       
   496 	// Unload all loaded plugins
       
   497 	// NOTE this must be after the m_am_tools->shutdown() call.
       
   498 	// m_am_tools->shutdown() will run virtual functions of some plugins.
       
   499 	for(int i = 0; i < m_plugin_if_array.Count(); i++)
       
   500 	{
       
   501 		delete m_plugin_if_array[i];
       
   502 	}
       
   503 
       
   504 	m_plugin_if_array.Close();
       
   505 	m_eap_type_array.Close();
       
   506 
       
   507 	// Delete the IAP EAP type info array
       
   508 	m_iap_eap_array.ResetAndDestroy();
       
   509 	
       
   510 
       
   511 	return eap_status_ok;
       
   512 }
       
   513 
       
   514 //--------------------------------------------------
       
   515 
       
   516 //
       
   517 void eapol_am_core_symbian_c::RunL()
       
   518 {
       
   519 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
   520 	EAP_TRACE_DEBUG(
       
   521 		m_am_tools,
       
   522 		TRACE_FLAGS_DEFAULT,
       
   523 		(EAPL("eapol_am_core_symbian_c::RunL(): iStatus.Int() = %d\n"),
       
   524 		iStatus.Int()));
       
   525 
       
   526 	if (iStatus.Int() != KErrNone)
       
   527 	{
       
   528 		return;
       
   529 	}
       
   530 
       
   531 	// Authentication cancelled.
       
   532 	EAP_TRACE_ALWAYS(
       
   533 		m_am_tools,
       
   534 		TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
       
   535 		(EAPL("Authentication cancelled.\n")));
       
   536 
       
   537 	// Set block on.
       
   538 	m_block_packet_sends_and_notifications = true;
       
   539 
       
   540 	// Reset flags
       
   541 	m_success_indication_sent = false;
       
   542 	m_unicast_wep_key_received = false;
       
   543 	m_broadcast_wep_key_received = false;
       
   544 	m_authentication_indication_sent = false;
       
   545 
       
   546 	m_stack_marked_to_be_deleted = true;
       
   547 	set_timer(this, EAPOL_AM_CORE_TIMER_DELETE_STACK_ID, 0, 0);
       
   548 	
       
   549 	// reset index
       
   550 	m_eap_index = 0;
       
   551 
       
   552 	EAP_TRACE_ALWAYS(
       
   553 		m_am_tools,
       
   554 		TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
       
   555 		(EAPL("Indication sent to WLM: EFailedCompletely.\n")));
       
   556 
       
   557 	m_partner->EapIndication(EFailedCompletely);
       
   558 
       
   559 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
   560 }
       
   561 
       
   562 //--------------------------------------------------
       
   563 
       
   564 //
       
   565 void eapol_am_core_symbian_c::DoCancel()
       
   566 {	
       
   567 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
   568 
       
   569 	EAP_TRACE_DEBUG(
       
   570 		m_am_tools,
       
   571 		TRACE_FLAGS_DEFAULT,
       
   572 		(EAPL("eapol_am_core_symbian_c::DoCancel()\n")));
       
   573 
       
   574 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
   575 }
       
   576 
       
   577 //--------------------------------------------------
       
   578 
       
   579 //
       
   580 TInt eapol_am_core_symbian_c::Start(const TIndexType aIndexType, 
       
   581 									const TUint aIndex, 
       
   582 									const TSSID& aSSID, 
       
   583 									const TBool aWPAOverrideEnabled,
       
   584 									const TUint8* aWPAPSK,
       
   585 									const TUint aWPAPSKLength)
       
   586 {
       
   587 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
   588 
       
   589 	EAP_TRACE_DEBUG(
       
   590 		m_am_tools,
       
   591 		TRACE_FLAGS_DEFAULT,
       
   592 		(EAPL("eapol_am_core_symbian_c::Start()\n")));
       
   593 
       
   594 	EAP_TRACE_DEBUG(
       
   595 		m_am_tools,
       
   596 		TRACE_FLAGS_DEFAULT,
       
   597 		(EAPL("STARTING AUTHENTICATION.\n")));
       
   598 
       
   599 	eap_status_e status(eap_status_ok);
       
   600 
       
   601 	if (m_ethernet_core != 0)
       
   602 	{
       
   603 		EAP_TRACE_DEBUG(
       
   604 			m_am_tools,
       
   605 			TRACE_FLAGS_DEFAULT,
       
   606 			(EAPL("Deleting previously used stack.\n")));
       
   607 
       
   608 		// It is an error to call start without calling disassociated
       
   609 		if (m_stack_marked_to_be_deleted == false)
       
   610 		{	
       
   611 			EAP_TRACE_ERROR(
       
   612 				m_am_tools,
       
   613 				TRACE_FLAGS_DEFAULT,
       
   614 				(EAPL("eapol_am_core_symbian_c::Start called twice!\n")));
       
   615 			return KErrAlreadyExists;
       
   616 		}
       
   617 
       
   618 		// The previously used stack is perhaps still waiting for deletion.
       
   619 		cancel_timer(this, EAPOL_AM_CORE_TIMER_DELETE_STACK_ID);
       
   620 	
       
   621 		// Delete stack
       
   622 		m_ethernet_core->shutdown();
       
   623 		delete m_ethernet_core;
       
   624 		m_ethernet_core = 0;				
       
   625 		
       
   626 		m_stack_marked_to_be_deleted = false;
       
   627 	}
       
   628 
       
   629 	// Clear packet send and notification blocking.
       
   630 	m_block_packet_sends_and_notifications = false;
       
   631 
       
   632 	// Store SSID. This is needed for WPA PSK calculation.
       
   633 	if (aSSID.ssidLength > 0)
       
   634 	{		
       
   635 		status = m_ssid->set_copy_of_buffer(aSSID.ssid, aSSID.ssidLength);
       
   636 		if (status != eap_status_ok)
       
   637 		{
       
   638 			return m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status));
       
   639 		}
       
   640 	}
       
   641 	
       
   642 	// Store WPAPSK. This is needed for WPA PSK mode in Easy WLAN.
       
   643 	if (aWPAPSKLength > 0
       
   644 		&& aWPAPSK != 0)
       
   645 	{		
       
   646 		status = m_wpa_psk_password_override->set_copy_of_buffer(aWPAPSK, aWPAPSKLength);
       
   647 		if (status != eap_status_ok)
       
   648 		{
       
   649 			return m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status));
       
   650 		}
       
   651 	}		
       
   652 
       
   653 	if (aWPAOverrideEnabled)
       
   654 	{
       
   655 		m_wpa_override_enabled = true;
       
   656 	}
       
   657 	else
       
   658 	{
       
   659 		m_wpa_override_enabled = false;
       
   660 	}
       
   661 	
       
   662 	///////////////////////////////////
       
   663 	// Get EAP parameters from CommDbIf
       
   664 	///////////////////////////////////
       
   665 	m_index_type = aIndexType;
       
   666 	m_index = aIndex;
       
   667 
       
   668 	TRAPD(err, ReadEAPSettingsL());
       
   669 	if (err != KErrNone)
       
   670 	{
       
   671 		EAP_TRACE_ERROR(
       
   672 			m_am_tools,
       
   673 			TRACE_FLAGS_DEFAULT,
       
   674 			(EAPL("EAP settings reading from CommDb failed or cancelled(err %d).\n"), err));
       
   675 		m_partner->EapIndication(EFailedCompletely);
       
   676 		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
   677 		return err;
       
   678 	}
       
   679 
       
   680 	// Start new authentication from scratch.
       
   681 	m_unicast_wep_key_received = false;
       
   682 	m_broadcast_wep_key_received = false;
       
   683 	m_wpa_psk_mode_active = false;
       
   684 	
       
   685 	if (m_wpa_psk_mode_allowed == false
       
   686 		|| m_wpa_preshared_key->get_data_length() == 0)
       
   687 	{
       
   688 		// Check the first enabled type
       
   689 		TEap* eapType = 0;
       
   690 		TInt i(0);
       
   691 		for (i = 0; i < m_iap_eap_array.Count(); i++)
       
   692 		{
       
   693 			// Check if type is enabled
       
   694 			eapType = m_iap_eap_array[i];
       
   695 			if (eapType->Enabled == 1)
       
   696 			{	
       
   697 				break;
       
   698 			}
       
   699 		}
       
   700 		if (i >= m_iap_eap_array.Count())
       
   701 		{
       
   702 			// No enabled EAP types.
       
   703 			EAP_TRACE_ALWAYS(
       
   704 				m_am_tools,
       
   705 				TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
       
   706 				(EAPL("No enabled EAP types.\n")));
       
   707 			EAP_TRACE_ALWAYS(
       
   708 				m_am_tools,
       
   709 				TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
       
   710 				(EAPL("Indication sent to WLM: EFailedCompletely.\n")));
       
   711 
       
   712 			m_partner->EapIndication(EFailedCompletely);
       
   713 			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
   714 			return KErrNone; 
       
   715 		}	
       
   716 
       
   717 		// reset index (start from the first enabled EAP type)
       
   718 		m_eap_index = i;
       
   719 
       
   720 		// Check if the first enabled type is LEAP.
       
   721 		TLex8 tmp(eapType->UID);
       
   722 		TInt type(0);
       
   723 		tmp.Val(type);
       
   724 		
       
   725 		switch (type)
       
   726 		{
       
   727 		case eap_type_leap:
       
   728 			if (m_security_mode != Wpa
       
   729 				&& m_security_mode != Wpa2Only)
       
   730 			{
       
   731 				m_802_11_authentication_mode = EAuthModeLeap;
       
   732 
       
   733 				EAP_TRACE_ALWAYS(
       
   734 					m_am_tools,
       
   735 					TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT, 
       
   736 					(EAPL("Start: Trying auth mode LEAP.\n")));
       
   737 			}
       
   738 			else
       
   739 			{
       
   740 				// If security mode is WPA or WPA2 then even LEAP uses open authentication!
       
   741 				m_802_11_authentication_mode = EAuthModeOpen;
       
   742 
       
   743 				EAP_TRACE_ALWAYS(
       
   744 					m_am_tools,
       
   745 					TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT, 
       
   746 					(EAPL("Start: Trying auth mode OPEN (LEAP in WPA mode).\n")));
       
   747 			}
       
   748 
       
   749 			m_active_type_is_leap = true;
       
   750 			break;
       
   751 		default:
       
   752 			m_802_11_authentication_mode = EAuthModeOpen;
       
   753 
       
   754 			EAP_TRACE_ALWAYS(
       
   755 				m_am_tools,
       
   756 				TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT, 
       
   757 				(EAPL("Start: Trying auth mode OPEN.\n")));
       
   758 
       
   759 			m_active_type_is_leap = false;
       
   760 			break;
       
   761 		}
       
   762 	}
       
   763 	else
       
   764 	{
       
   765 		// WPA Pre-shared key mode
       
   766 		m_active_type_is_leap = false;
       
   767 		m_wpa_psk_mode_active = true;
       
   768 		m_802_11_authentication_mode = EAuthModeOpen;
       
   769 
       
   770 		EAP_TRACE_ALWAYS(
       
   771 			m_am_tools,
       
   772 			TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT, 
       
   773 			(EAPL("Start: Trying auth mode OPEN.\n")));
       
   774 	}
       
   775 		
       
   776 	// Ignore return value. Result comes with CompleteAssociation call.
       
   777 	m_partner->Associate(m_802_11_authentication_mode);
       
   778 
       
   779 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
   780 	return m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status));
       
   781 }
       
   782 
       
   783 //--------------------------------------------------
       
   784 
       
   785 //
       
   786 TInt eapol_am_core_symbian_c::CompleteAssociation(
       
   787 		const TInt aResult,
       
   788 		const TMacAddress& aLocalAddress, 
       
   789 		const TMacAddress& aRemoteAddress,
       
   790 		const TUint8* const aReceivedWPAIE, // WLM must give only the WPA IE to EAPOL									        
       
   791 		const TUint aReceivedWPAIELength,
       
   792 		const TUint8* const aSentWPAIE,
       
   793 		const TUint aSentWPAIELength,
       
   794 		const TWPACipherSuite aGroupKeyCipherSuite,
       
   795 		const TWPACipherSuite aPairwiseKeyCipherSuite
       
   796 		)
       
   797 {
       
   798 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
   799 
       
   800 	EAP_TRACE_ALWAYS(
       
   801 		m_am_tools,
       
   802 		TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
       
   803 		(EAPL("eapol_am_core_symbian_c::CompleteAssociation(): aResult %d\n"),
       
   804 		aResult));
       
   805 
       
   806 	eap_status_e status(eap_status_ok);
       
   807 
       
   808 	// ASSOCIATION UNSUCCESSFUL
       
   809 	if (aResult != KErrNone)
       
   810 	{
       
   811 		EAP_TRACE_DEBUG(
       
   812 			m_am_tools,
       
   813 			TRACE_FLAGS_DEFAULT,
       
   814 			(EAPL("CompleteAssociation: Unsuccessful.\n")));
       
   815 
       
   816 		EAP_TRACE_DATA_DEBUG(
       
   817 			m_am_tools, 
       
   818 			TRACE_FLAGS_DEFAULT, 
       
   819 			(EAPL("Got AP MAC address"),
       
   820 			aRemoteAddress.iMacAddress,
       
   821 			KMacAddressLength));
       
   822 
       
   823 		// Report rogue AP if we tried LEAP and it failed
       
   824 		if (m_802_11_authentication_mode == EAuthModeLeap)
       
   825 		{
       
   826 			// Only add rogue AP if the error code is correct
       
   827 			if (aResult == E802Dot11StatusAuthAlgorithmNotSupported)
       
   828 			{
       
   829 				eap_rogue_ap_entry_c rogue_entry(m_am_tools);
       
   830 			
       
   831 				rogue_entry.set_mac_address(static_cast<const u8_t *>(aRemoteAddress.iMacAddress));
       
   832 				rogue_entry.set_rogue_reason(rogue_ap_association_failed);
       
   833 
       
   834 				eap_array_c<eap_rogue_ap_entry_c> rogue_list(m_am_tools);
       
   835 				status = rogue_list.add_object(&rogue_entry, false);
       
   836 				if (status == eap_status_ok)
       
   837 				{	
       
   838 					status = add_rogue_ap(rogue_list);
       
   839 					// Ignore return value on purpose - it's not fatal if this fails
       
   840 				}
       
   841 			}			
       
   842 		}
       
   843 
       
   844 		if (m_wpa_psk_mode_active == false)
       
   845 		{
       
   846 			if (aResult == E802Dot11StatusAuthAlgorithmNotSupported
       
   847 				&& m_security_mode != Wpa
       
   848 				&& m_security_mode != Wpa2Only) // If security mode is WPA or WPA2 then only OPEN auth should be used
       
   849 			{
       
   850 				// Association failed because we had wrong authentication type. 
       
   851 				// Try to find next allowed type that uses different authentication type
       
   852 				m_eap_index++;
       
   853 
       
   854 				TEap* eapType;
       
   855 				TBool found(EFalse);
       
   856 				TInt i(0);
       
   857 				for (i = m_eap_index; i < m_iap_eap_array.Count(); i++)
       
   858 				{
       
   859 					// Check if type is enabled
       
   860 					eapType = m_iap_eap_array[i];
       
   861 					if (eapType->Enabled == 1)
       
   862 					{	
       
   863 						TLex8 tmp(eapType->UID);
       
   864 						TInt type(0);
       
   865 						tmp.Val(type);
       
   866 						
       
   867 						switch (type)
       
   868 						{
       
   869 						case eap_type_leap:
       
   870 							if (m_802_11_authentication_mode != EAuthModeLeap)
       
   871 							{
       
   872 								// This type will do; it uses different authentication mode.
       
   873 								EAP_TRACE_ALWAYS(
       
   874 									m_am_tools,
       
   875 									TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT, 
       
   876 									(EAPL("CompleteAssociation: Changed auth mode to LEAP.\n")));
       
   877 
       
   878 								m_802_11_authentication_mode = EAuthModeLeap;
       
   879 								m_active_type_is_leap = true;
       
   880 								found = ETrue;
       
   881 							}					
       
   882 							break;
       
   883 						default:
       
   884 							if (m_802_11_authentication_mode != EAuthModeOpen)
       
   885 							{
       
   886 								// This type will do; it uses different authentication mode.
       
   887 								EAP_TRACE_ALWAYS(
       
   888 									m_am_tools,
       
   889 									TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT, 
       
   890 									(EAPL("CompleteAssociation: Changed auth mode to OPEN.\n")));
       
   891 
       
   892 								m_802_11_authentication_mode = EAuthModeOpen;	
       
   893 								m_active_type_is_leap = false;
       
   894 								found = ETrue;
       
   895 							}
       
   896 							break;
       
   897 						}				
       
   898 						if (found)
       
   899 						{
       
   900 							break;
       
   901 						}
       
   902 					}
       
   903 				}
       
   904 
       
   905 				m_eap_index = i;
       
   906 
       
   907 				if (i >= m_iap_eap_array.Count())
       
   908 				{
       
   909 					// All the remaining allowed types had the same authentication mode.
       
   910 					// Give up this AP.
       
   911 					EAP_TRACE_ALWAYS(
       
   912 						m_am_tools,
       
   913 						TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT, 
       
   914 						(EAPL("Could not associate to the AP. Tried all types.\n")));
       
   915 
       
   916 					EAP_TRACE_ALWAYS(
       
   917 						m_am_tools,
       
   918 						TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
       
   919 						(EAPL("Indication sent to WLM: EThisAPFailed.\n")));
       
   920 
       
   921 					m_partner->EapIndication(EThisAPFailed);
       
   922 					return KErrNone;
       
   923 
       
   924 				}
       
   925 
       
   926 				// We found a type with different authentication mode. Try it.			
       
   927 			
       
   928 				// Ignore return value. Result comes with CompleteAssociation call.
       
   929 				m_partner->Associate(m_802_11_authentication_mode);
       
   930 				EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
   931 				return KErrNone;
       
   932 			}
       
   933 			else
       
   934 			{
       
   935 				EAP_TRACE_ALWAYS(
       
   936 					m_am_tools,
       
   937 					TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT, 
       
   938 					(EAPL("Could not associate to the AP (error %d).\n"), aResult));
       
   939 
       
   940 				EAP_TRACE_ALWAYS(
       
   941 					m_am_tools,
       
   942 					TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
       
   943 					(EAPL("Indication sent to WLM: EThisAPFailed.\n")));
       
   944 
       
   945 				m_partner->EapIndication(EThisAPFailed);
       
   946 				EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
   947 				return KErrNone;
       
   948 			}
       
   949 		}
       
   950 		else
       
   951 		{
       
   952 			EAP_TRACE_ALWAYS(
       
   953 				m_am_tools,
       
   954 				TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT, 
       
   955 				(EAPL("Could not associate to the AP with WPA pre-shared-key.\n")));
       
   956 
       
   957 			EAP_TRACE_ALWAYS(
       
   958 				m_am_tools,
       
   959 				TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
       
   960 				(EAPL("Indication sent to WLM: EThisAPFailed.\n")));
       
   961 
       
   962 			m_partner->EapIndication(EThisAPFailed);
       
   963 			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
   964 			return KErrNone;
       
   965 		}					
       
   966 	}
       
   967 	
       
   968 	// ASSOCIATION SUCCESSFUL
       
   969 	EAP_TRACE_ALWAYS(
       
   970 		m_am_tools,
       
   971 		TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
       
   972 		(EAPL("CompleteAssociation: Successful.\n")));
       
   973 
       
   974 	// Store parameters
       
   975 	m_local_address = aLocalAddress;
       
   976 
       
   977 	m_remote_address = aRemoteAddress;
       
   978 
       
   979 	m_received_wpa_ie = aReceivedWPAIE;
       
   980 
       
   981 	m_received_wpa_ie_length = aReceivedWPAIELength;
       
   982 
       
   983 	m_sent_wpa_ie = aSentWPAIE;
       
   984 
       
   985 	m_sent_wpa_ie_length = aSentWPAIELength;
       
   986 
       
   987 	m_group_key_cipher_suite = aGroupKeyCipherSuite;
       
   988 
       
   989 	m_pairwise_key_cipher_suite = aPairwiseKeyCipherSuite;
       
   990 
       
   991 	// Create stack if it does not already exist. 
       
   992 	status = create_upper_stack();
       
   993 	if (status != eap_status_ok
       
   994 		&& status != eap_status_already_exists)
       
   995 	{
       
   996 		EAP_TRACE_ALWAYS(
       
   997 			m_am_tools,
       
   998 			TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
       
   999 			(EAPL("Indication sent to WLM: EFailedCompletely.\n")));
       
  1000 
       
  1001 		m_partner->EapIndication(EFailedCompletely);
       
  1002 		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
  1003 		return KErrNone; 
       
  1004 	}
       
  1005 
       
  1006 	// First create stack object and then copy it to heap object. This is because 
       
  1007 	// eap_am_network_id_c does not have a constructor that copies the buffers.
       
  1008 	eap_am_network_id_c receive_network_id(
       
  1009 			m_am_tools,
       
  1010 			&aRemoteAddress,
       
  1011 			sizeof(TMacAddress),
       
  1012 			&aLocalAddress,
       
  1013 			sizeof(TMacAddress),
       
  1014 			eapol_ethernet_type_pae,
       
  1015 			false,
       
  1016 			false);
       
  1017 	
       
  1018 	delete m_receive_network_id;
       
  1019 	m_receive_network_id = new eap_am_network_id_c(
       
  1020 		m_am_tools);
       
  1021 
       
  1022 	if (m_receive_network_id == 0)
       
  1023 	{
       
  1024 		EAP_TRACE_ALWAYS(
       
  1025 			m_am_tools,
       
  1026 			TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
       
  1027 			(EAPL("Indication sent to WLM: EFailedCompletely.\n")));
       
  1028 
       
  1029 		m_partner->EapIndication(EFailedCompletely);
       
  1030 		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
  1031 		return KErrNone; 
       
  1032 	}
       
  1033 	
       
  1034 	status = m_receive_network_id->set_copy_of_network_id(&receive_network_id);
       
  1035 	if (status != eap_status_ok)
       
  1036 	{
       
  1037 		EAP_TRACE_ALWAYS(
       
  1038 			m_am_tools,
       
  1039 			TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
       
  1040 			(EAPL("Indication sent to WLM: EFailedCompletely.\n")));
       
  1041 
       
  1042 		m_partner->EapIndication(EFailedCompletely);
       
  1043 		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
  1044 		return KErrNone; 
       
  1045 	}
       
  1046 
       
  1047 	
       
  1048 #if defined (USE_EAPOL_KEY_STATE) 
       
  1049 
       
  1050 	// Initialise EAPOL key state
       
  1051 
       
  1052 	eapol_key_authentication_type_e authentication_type(eapol_key_authentication_type_dynamic_WEP);
       
  1053 	
       
  1054 	if (aReceivedWPAIE !=0 
       
  1055 		&& aSentWPAIE != 0)
       
  1056 	{
       
  1057 		// WPA (in wpa or 802.1x security mode)
       
  1058 		if (m_wpa_psk_mode_allowed == false)
       
  1059 		{
       
  1060 			authentication_type = eapol_key_authentication_type_WPA_EAP;
       
  1061 		}
       
  1062 		else
       
  1063 		{
       
  1064 			m_wpa_psk_mode_active = true;
       
  1065 			authentication_type = eapol_key_authentication_type_WPA_PSK;
       
  1066 		}
       
  1067 
       
  1068 	}
       
  1069 	else
       
  1070 	{
       
  1071 		// Non-wpa mode
       
  1072 		authentication_type = eapol_key_authentication_type_dynamic_WEP;
       
  1073 	}	
       
  1074 
       
  1075 	eap_variable_data_c	authenticator_RSNA_IE(m_am_tools);
       
  1076 	eap_variable_data_c	supplicant_RSNA_IE(m_am_tools);
       
  1077 
       
  1078 	// Note: the default values here are only for 802.1x mode. In that mode
       
  1079 	// we don't know the WEP key length beforehand so we will have to guess.
       
  1080 	// It does not matter in this case if we guess wrong - only thing that matters
       
  1081 	// is that it is WEP.
       
  1082 	eapol_RSNA_key_header_c::eapol_RSNA_cipher_e 
       
  1083 		eapol_pairwise_cipher(eapol_RSNA_key_header_c::eapol_RSNA_cipher_WEP_40);
       
  1084 	eapol_RSNA_key_header_c::eapol_RSNA_cipher_e 
       
  1085 		eapol_group_cipher(eapol_RSNA_key_header_c::eapol_RSNA_cipher_WEP_40);	
       
  1086 	
       
  1087 	// WPA mode is active if information elements are valid
       
  1088 	if (aReceivedWPAIE != 0
       
  1089 		&& aSentWPAIE != 0)
       
  1090 	{
       
  1091 		status = authenticator_RSNA_IE.set_copy_of_buffer(aReceivedWPAIE, aReceivedWPAIELength);
       
  1092 		if (status != eap_status_ok)
       
  1093 		{
       
  1094 			EAP_TRACE_ALWAYS(
       
  1095 				m_am_tools,
       
  1096 				TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
       
  1097 				(EAPL("Indication sent to WLM: EFailedCompletely.\n")));
       
  1098 
       
  1099 			m_partner->EapIndication(EFailedCompletely);
       
  1100 			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
  1101 			return KErrNoMemory;
       
  1102 		}
       
  1103 		status = supplicant_RSNA_IE.set_copy_of_buffer(aSentWPAIE, aSentWPAIELength);
       
  1104 		if (status != eap_status_ok)
       
  1105 		{
       
  1106 			EAP_TRACE_ALWAYS(
       
  1107 				m_am_tools,
       
  1108 				TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
       
  1109 				(EAPL("Indication sent to WLM: EFailedCompletely.\n")));
       
  1110 
       
  1111 			m_partner->EapIndication(EFailedCompletely);
       
  1112 			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
  1113 			return KErrNoMemory;
       
  1114 		}
       
  1115 		
       
  1116 		switch (aGroupKeyCipherSuite)
       
  1117 		{
       
  1118 		case ENoCipherSuite:
       
  1119 			eapol_group_cipher = eapol_RSNA_key_header_c::eapol_RSNA_cipher_none;
       
  1120 			break;
       
  1121 		case EWEP40:
       
  1122 			eapol_group_cipher = eapol_RSNA_key_header_c::eapol_RSNA_cipher_WEP_40;							 
       
  1123 			break;
       
  1124 		case EWEP104:
       
  1125 			eapol_group_cipher = eapol_RSNA_key_header_c::eapol_RSNA_cipher_WEP_104;
       
  1126 			break;
       
  1127 		case ETKIP:
       
  1128 			eapol_group_cipher = eapol_RSNA_key_header_c::eapol_RSNA_cipher_TKIP;
       
  1129 			break;
       
  1130 		case ECCMP:
       
  1131 			eapol_group_cipher = eapol_RSNA_key_header_c::eapol_RSNA_cipher_CCMP;
       
  1132 			break;
       
  1133 		case EWRAP:
       
  1134 		default:
       
  1135 			User::Panic(_L("EAPOL"), KErrNotSupported);							
       
  1136 		}
       
  1137 
       
  1138 		switch (aPairwiseKeyCipherSuite)
       
  1139 		{
       
  1140 		case ENoCipherSuite:
       
  1141 			eapol_pairwise_cipher = eapol_RSNA_key_header_c::eapol_RSNA_cipher_none;
       
  1142 			break;
       
  1143 		case EWEP40:
       
  1144 			eapol_pairwise_cipher = eapol_RSNA_key_header_c::eapol_RSNA_cipher_WEP_40;							 
       
  1145 			break;
       
  1146 		case EWEP104:
       
  1147 			eapol_pairwise_cipher = eapol_RSNA_key_header_c::eapol_RSNA_cipher_WEP_104;
       
  1148 			break;
       
  1149 		case ETKIP:
       
  1150 			eapol_pairwise_cipher = eapol_RSNA_key_header_c::eapol_RSNA_cipher_TKIP;
       
  1151 			break;
       
  1152 		case ECCMP:
       
  1153 			eapol_pairwise_cipher = eapol_RSNA_key_header_c::eapol_RSNA_cipher_CCMP;
       
  1154 			break;
       
  1155 		case EWRAP:
       
  1156 		default:
       
  1157 			User::Panic(_L("EAPOL"), KErrNotSupported);							
       
  1158 		}
       
  1159 	} 
       
  1160 
       
  1161 	if (authentication_type == eapol_key_authentication_type_WPA_PSK)
       
  1162 	{
       
  1163 		status = m_ethernet_core->association(
       
  1164 			m_receive_network_id,
       
  1165 			authentication_type,
       
  1166 			&authenticator_RSNA_IE,
       
  1167 			&supplicant_RSNA_IE,
       
  1168 			eapol_pairwise_cipher,
       
  1169 			eapol_group_cipher,
       
  1170 			m_wpa_preshared_key);
       
  1171 	}
       
  1172 	else
       
  1173 	{
       
  1174 		status = m_ethernet_core->association(
       
  1175 			m_receive_network_id,
       
  1176 			authentication_type,
       
  1177 			&authenticator_RSNA_IE,
       
  1178 			&supplicant_RSNA_IE,
       
  1179 			eapol_pairwise_cipher,
       
  1180 			eapol_group_cipher,
       
  1181 			0);
       
  1182 	}
       
  1183 	if (status != eap_status_ok)
       
  1184 	{
       
  1185 
       
  1186 		EAP_TRACE_ALWAYS(
       
  1187 			m_am_tools,
       
  1188 			TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
       
  1189 			(EAPL("m_ethernet_core->association call failed.\n")));
       
  1190 
       
  1191 		EAP_TRACE_ALWAYS(
       
  1192 			m_am_tools,
       
  1193 			TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
       
  1194 			(EAPL("Indication sent to WLM: EFailedCompletely.\n")));
       
  1195 
       
  1196 		m_partner->EapIndication(EFailedCompletely);
       
  1197 		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
  1198 		return KErrGeneral;
       
  1199 	}
       
  1200 
       
  1201 #endif // USE_EAPOL_KEY_STATE
       
  1202 
       
  1203 	if (m_wpa_psk_mode_active == false)
       
  1204 	{
       
  1205 		// Start authentication if mode is not pre-shared key. If mode is pre-shared key then
       
  1206 		// just wait for EAPOL-Key frames.
       
  1207 		status = m_ethernet_core->start_authentication(m_receive_network_id, m_is_client);		
       
  1208 	}
       
  1209 	
       
  1210 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
  1211 	return m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status));
       
  1212 }
       
  1213 
       
  1214 //--------------------------------------------------
       
  1215 
       
  1216 //
       
  1217 TInt eapol_am_core_symbian_c::ReceivePacket(const TUint aLength, const TUint8* const aPacket)
       
  1218 {
       
  1219 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
  1220 		
       
  1221 	EAP_TRACE_DEBUG(
       
  1222 		m_am_tools,
       
  1223 		TRACE_FLAGS_DEFAULT,
       
  1224 		(EAPL("eapol_am_core_symbian_c::ReceivePacket()\n")));
       
  1225 
       
  1226 	if (aLength < eapol_ethernet_header_wr_c::get_header_length())
       
  1227 	{
       
  1228 		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  1229 		return m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, eap_status_too_short_message));
       
  1230 	}
       
  1231 
       
  1232 	eapol_ethernet_header_wr_c eth_header(m_am_tools, aPacket, aLength);
       
  1233 	eap_am_network_id_c receive_network_id(
       
  1234 			m_am_tools,
       
  1235 			eth_header.get_source(),
       
  1236 			eth_header.get_source_length(),
       
  1237 			eth_header.get_destination(),
       
  1238 			eth_header.get_destination_length(),
       
  1239 			eth_header.get_type(),
       
  1240 			false,
       
  1241 			false);
       
  1242 	eap_status_e status(eap_status_process_general_error);
       
  1243 	if (eth_header.get_type() == eapol_ethernet_type_pae)
       
  1244 	{
       
  1245 		status = create_upper_stack();
       
  1246 		if (status != eap_status_ok 
       
  1247 			&& status != eap_status_already_exists)
       
  1248 		{
       
  1249 			EAP_TRACE_DEBUG(
       
  1250 				m_am_tools,
       
  1251 				TRACE_FLAGS_DEFAULT,
       
  1252 				(EAPL("Indication sent to WLM: EFailedCompletely.\n")));
       
  1253 			m_partner->EapIndication(EFailedCompletely);
       
  1254 			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
  1255 			return KErrNone; 
       
  1256 		} 
       
  1257 
       
  1258 #if defined (USE_EAPOL_KEY_STATE) 
       
  1259 		if (m_is_client == false
       
  1260 			&& status != eap_status_already_exists)
       
  1261 		{
       
  1262 			// If we are server we need to do associate here.
       
  1263 			eapol_key_authentication_type_e authentication_type(
       
  1264 				eapol_key_authentication_type_WPA_EAP);
       
  1265 
       
  1266 			eap_variable_data_c authenticator_RSNA_IE(m_am_tools);
       
  1267 			eap_variable_data_c supplicant_RSNA_IE(m_am_tools);
       
  1268 
       
  1269 			status = authenticator_RSNA_IE.set_buffer(TEST_RSN_IE, sizeof(TEST_RSN_IE), false, false);
       
  1270 			if (status != eap_status_ok)
       
  1271 			{
       
  1272 				EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  1273 				User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
       
  1274 			}
       
  1275 
       
  1276 			status = supplicant_RSNA_IE.set_buffer(TEST_RSN_IE, sizeof(TEST_RSN_IE), false, false);
       
  1277 			if (status != eap_status_ok)
       
  1278 			{
       
  1279 				EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  1280 				User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
       
  1281 			}
       
  1282 						
       
  1283 			eapol_RSNA_key_header_c::eapol_RSNA_cipher_e 
       
  1284 				eapol_pairwise_cipher(eapol_RSNA_key_header_c::eapol_RSNA_cipher_TKIP);	
       
  1285 			eapol_RSNA_key_header_c::eapol_RSNA_cipher_e 
       
  1286 				eapol_group_cipher(eapol_RSNA_key_header_c::eapol_RSNA_cipher_TKIP);	
       
  1287 			
       
  1288 				
       
  1289 			if (authentication_type == eapol_key_authentication_type_WPA_PSK)
       
  1290 			{
       
  1291 				status = m_ethernet_core->association(
       
  1292 					&receive_network_id,
       
  1293 					authentication_type,
       
  1294 					&authenticator_RSNA_IE,
       
  1295 					&supplicant_RSNA_IE,
       
  1296 					eapol_pairwise_cipher,
       
  1297 					eapol_group_cipher,
       
  1298 					m_wpa_preshared_key);
       
  1299 			}
       
  1300 			else
       
  1301 			{
       
  1302 				status = m_ethernet_core->association(
       
  1303 					&receive_network_id,
       
  1304 					authentication_type,
       
  1305 					&authenticator_RSNA_IE,
       
  1306 					&supplicant_RSNA_IE,
       
  1307 					eapol_pairwise_cipher,
       
  1308 					eapol_group_cipher,
       
  1309 					0);
       
  1310 			}
       
  1311 
       
  1312 		}
       
  1313 #endif // USE_EAPOL_KEY_STATE
       
  1314 
       
  1315 		// Forward the packet to the Ethernet layer of the EAPOL stack. Ignore return value. Failure is signalled using state_notification.
       
  1316 		status = m_ethernet_core->packet_process(
       
  1317 			&receive_network_id,
       
  1318 			&eth_header,
       
  1319 			aLength);
       
  1320 		
       
  1321 	} 
       
  1322 	else
       
  1323 	{
       
  1324 		EAP_TRACE_DEBUG(
       
  1325 			m_am_tools,
       
  1326 			TRACE_FLAGS_DEFAULT,
       
  1327 			(EAPL("Not supported ethernet type 0x%04x\n"), eth_header.get_type()));
       
  1328 		status = eap_status_ethernet_type_not_supported;
       
  1329 	}
       
  1330 	
       
  1331 	status = eap_status_ok;
       
  1332 
       
  1333 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  1334 	return m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status));
       
  1335 }
       
  1336 
       
  1337 //--------------------------------------------------
       
  1338 
       
  1339 void eapol_am_core_symbian_c::set_is_valid()
       
  1340 {
       
  1341 	m_is_valid = true;
       
  1342 }
       
  1343 
       
  1344 bool eapol_am_core_symbian_c::get_is_valid()
       
  1345 {
       
  1346 	return m_is_valid;
       
  1347 }
       
  1348 
       
  1349 void eapol_am_core_symbian_c::increment_authentication_counter()
       
  1350 {
       
  1351 	++m_authentication_counter;
       
  1352 }
       
  1353 
       
  1354 u32_t eapol_am_core_symbian_c::get_authentication_counter()
       
  1355 {
       
  1356 	return m_authentication_counter;
       
  1357 }
       
  1358 
       
  1359 bool eapol_am_core_symbian_c::get_is_client()
       
  1360 {
       
  1361 	return m_is_client;
       
  1362 }
       
  1363 	
       
  1364 
       
  1365 //--------------------------------------------------
       
  1366 
       
  1367 //
       
  1368 eap_status_e eapol_am_core_symbian_c::packet_data_crypto_keys(
       
  1369 	const eap_am_network_id_c * const /*send_network_id*/,
       
  1370 	const eap_variable_data_c * const /*master_session_key*/)
       
  1371 {
       
  1372 	// Not needed in Symbian version
       
  1373 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  1374 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  1375 	return eap_status_ok;
       
  1376 }
       
  1377 
       
  1378 //--------------------------------------------------
       
  1379 
       
  1380 eap_status_e eapol_am_core_symbian_c::packet_data_session_key(
       
  1381 	const eap_am_network_id_c * const /*send_network_id*/,
       
  1382 	const eapol_session_key_c * const key)
       
  1383 {
       
  1384 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  1385 	TInt status(KErrNone);
       
  1386 
       
  1387 	const eap_variable_data_c * const key_data = key->get_key();
       
  1388 	if (key_data == 0)
       
  1389 	{
       
  1390 		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  1391 		return eap_status_key_error;
       
  1392 	}
       
  1393 
       
  1394 	EAP_TRACE_DEBUG(m_am_tools,
       
  1395 		TRACE_FLAGS_DEFAULT, 
       
  1396 		(EAPL("packet_data_session_key: index: %d, type %d\n"),
       
  1397 		key->get_key_index(),
       
  1398 		key->get_key_type()));
       
  1399 	
       
  1400 	EAP_TRACE_DATA_DEBUG(m_am_tools,
       
  1401 		TRACE_FLAGS_DEFAULT,
       
  1402 		(EAPL("packet_data_session_key:"),
       
  1403 		key_data->get_data(key_data->get_data_length()),
       
  1404 		key_data->get_data_length()));
       
  1405 	
       
  1406 	switch (key->get_key_type())
       
  1407 	{
       
  1408 	case eapol_key_type_broadcast:
       
  1409 		EAP_TRACE_DEBUG(
       
  1410 			m_am_tools,
       
  1411 			TRACE_FLAGS_DEFAULT, 
       
  1412 			(EAPL("eapol_am_core_symbian_c::packet_data_session_key: Got rc4_broadcast key.\n")));
       
  1413 
       
  1414 		status = m_partner->SetCipherKey(
       
  1415 			ERC4Broadcast,
       
  1416 			static_cast<TUint8> (key->get_key_index()),
       
  1417 			key_data->get_data(key_data->get_data_length()),
       
  1418 			key_data->get_data_length());
       
  1419 		m_broadcast_wep_key_received = true;
       
  1420 		break;
       
  1421 	case eapol_key_type_unicast:
       
  1422 		EAP_TRACE_DEBUG(
       
  1423 			m_am_tools,
       
  1424 			TRACE_FLAGS_DEFAULT, 
       
  1425 			(EAPL("eapol_am_core_symbian_c::packet_data_session_key: Got rc4_unicast key.\n")));
       
  1426 
       
  1427 		status = m_partner->SetCipherKey(
       
  1428 			ERC4Unicast,
       
  1429 			static_cast<TUint8> (key->get_key_index()),
       
  1430 			key_data->get_data(key_data->get_data_length()),
       
  1431 			key_data->get_data_length());
       
  1432 		m_unicast_wep_key_received = true;
       
  1433 		break;
       
  1434 	default:
       
  1435 		EAP_TRACE_ERROR(
       
  1436 			m_am_tools,
       
  1437 			TRACE_FLAGS_DEFAULT, 
       
  1438 			(EAPL("eapol_am_core_symbian_c::packet_data_session_key: Got unsupported key, type %d.\n"),
       
  1439 			key->get_key_type()));
       
  1440 		status = KErrNotSupported;
       
  1441 		break;
       
  1442 	}
       
  1443 
       
  1444 	if (m_unicast_wep_key_received == true 
       
  1445 		&& m_broadcast_wep_key_received == true
       
  1446 		&& m_success_indication_sent == false)
       
  1447 	{
       
  1448 		// Signal success because we have received one unicast (pairwise) key and one broadcast (group) key.
       
  1449 		// If there are more keys coming later they are saved also.
       
  1450 		if (m_active_type_is_leap == true)
       
  1451 		{
       
  1452 			// Leap was successful
       
  1453 			EAP_TRACE_DEBUG(
       
  1454 				m_am_tools,
       
  1455 				TRACE_FLAGS_DEFAULT,
       
  1456 				(EAPL("Indication sent to WLM: ELeapSuccess.\n")));
       
  1457 			m_partner->EapIndication(ELeapSuccess);
       
  1458 		}
       
  1459 		else
       
  1460 		{
       
  1461 			// some other type was successful
       
  1462 			EAP_TRACE_DEBUG(
       
  1463 				m_am_tools,
       
  1464 				TRACE_FLAGS_DEFAULT,
       
  1465 				(EAPL("Indication sent to WLM: ESuccess.\n")));
       
  1466 			m_partner->EapIndication(ESuccess);
       
  1467 		}
       
  1468 		
       
  1469 		m_success_indication_sent = true;
       
  1470 		m_first_authentication = false;
       
  1471 	}
       
  1472 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  1473 	return EAP_STATUS_RETURN(m_am_tools, m_am_tools->convert_am_error_to_eapol_error(status));
       
  1474 }
       
  1475 
       
  1476 //--------------------------------------------------
       
  1477 
       
  1478 //
       
  1479 
       
  1480 eap_status_e eapol_am_core_symbian_c::packet_send(
       
  1481 	const eap_am_network_id_c * const /*send_network_id*/,
       
  1482 	eap_buf_chain_wr_c * const sent_packet,
       
  1483 	const u32_t header_offset,
       
  1484 	const u32_t data_length,
       
  1485 	const u32_t /*buffer_length*/)
       
  1486 {
       
  1487 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  1488 
       
  1489 	EAP_TRACE_DEBUG(
       
  1490 		m_am_tools,
       
  1491 		TRACE_FLAGS_DEFAULT,
       
  1492 		(EAPL("eapol_am_core_symbian_c::packet_send(data_length=%d).\n"),
       
  1493 		data_length));
       
  1494 
       
  1495 	if (header_offset != 0u)
       
  1496 	{
       
  1497 		EAP_TRACE_DEBUG(
       
  1498 			m_am_tools,
       
  1499 			TRACE_FLAGS_DEFAULT,
       
  1500 			(EAPL("packet_send: packet buffer corrupted.\n")));
       
  1501 		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  1502 		return eap_status_process_general_error;
       
  1503 	}
       
  1504 	else if (header_offset+data_length != sent_packet->get_data_length())
       
  1505 	{
       
  1506 		EAP_TRACE_DEBUG(
       
  1507 			m_am_tools,
       
  1508 			TRACE_FLAGS_DEFAULT,
       
  1509 			(EAPL("ERROR: packet_send: packet buffer corrupted (data_length != sent_packet->get_data_length()).\n")));
       
  1510 		EAP_ASSERT(data_length == sent_packet->get_buffer_length());
       
  1511 		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  1512 		return eap_status_process_general_error;
       
  1513 	}	
       
  1514 
       
  1515 	if (m_block_packet_sends_and_notifications == true)
       
  1516 	{
       
  1517 		// Packet sending block is active. This happens when disassociated has been called.  
       
  1518 		// start_authentication clears the block.
       
  1519 		EAP_TRACE_DEBUG(
       
  1520 			m_am_tools,
       
  1521 			TRACE_FLAGS_DEFAULT,
       
  1522 			(EAPL("packet_send: packet ignored because Disassociated() was called.\n")));
       
  1523 		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  1524 		return eap_status_ok;
       
  1525 	}
       
  1526 
       
  1527 	TInt status(KErrNone);
       
  1528 	if (m_send_original_packet_first == true)
       
  1529 	{
       
  1530 		if (m_enable_random_errors == true)
       
  1531 		{
       
  1532 			EAP_TRACE_DEBUG(
       
  1533 				m_am_tools,
       
  1534 				TRACE_FLAGS_DEFAULT,
       
  1535 				(EAPL("TEST: random_error(): packet_index 0x%08x:%lu, Send original packet\n"),
       
  1536 				this,
       
  1537 				m_packet_index));
       
  1538 		}
       
  1539 
       
  1540 		u8_t * const packet_data = sent_packet->get_data_offset(header_offset, data_length);
       
  1541 		if (packet_data == 0)
       
  1542 		{
       
  1543 			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  1544 			return eap_status_buffer_too_short;
       
  1545 		}
       
  1546 
       
  1547 		// Here we send the original packet.
       
  1548 		status = m_partner->EapPacketSend(
       
  1549 			data_length, 
       
  1550 			static_cast<TUint8*>(packet_data));
       
  1551 		++m_packet_index;
       
  1552 	}
       
  1553 
       
  1554 	if (m_enable_random_errors == true
       
  1555 		&& status == KErrNone)
       
  1556 	{
       
  1557 		if (m_generate_multiple_error_packets > 0ul)
       
  1558 		{
       
  1559 			// First create a copy of sent packet. Original correct packet will will be sent last.
       
  1560 			for (u32_t ind = 0ul; ind < m_generate_multiple_error_packets; ind++)
       
  1561 			{
       
  1562 				eap_buf_chain_wr_c *copy_packet = sent_packet->copy();
       
  1563 
       
  1564 				if (copy_packet != 0
       
  1565 					&& copy_packet->get_is_valid_data() == true)
       
  1566 				{
       
  1567 					// Make a random error to the copy message.
       
  1568 					random_error(copy_packet, true, m_packet_index);
       
  1569 
       
  1570 					EAP_TRACE_DEBUG(
       
  1571 						m_am_tools,
       
  1572 						TRACE_FLAGS_DEFAULT,
       
  1573 						(EAPL("TEST: random_error(): packet_index 0x%08x:%lu, Send error packet\n"),
       
  1574 						this,
       
  1575 						m_packet_index));
       
  1576 					
       
  1577 					u8_t * const packet_data = copy_packet->get_data_offset(header_offset, data_length);
       
  1578 					if (packet_data == 0)
       
  1579 					{
       
  1580 						EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  1581 						return eap_status_buffer_too_short;
       
  1582 					}
       
  1583 
       
  1584 					// Here we send the copied and manipulated packet.
       
  1585 					status = m_partner->EapPacketSend(
       
  1586 						data_length, 
       
  1587 						static_cast<TUint8*>(packet_data));
       
  1588 					
       
  1589 					++m_packet_index;
       
  1590 				}
       
  1591 				delete copy_packet;
       
  1592 			}
       
  1593 		}
       
  1594 		else
       
  1595 		{
       
  1596 			// Make a random error to the original message.
       
  1597 			random_error(sent_packet, false, m_packet_index);
       
  1598 
       
  1599 			if (sent_packet->get_is_manipulated() == true)
       
  1600 			{
       
  1601 				EAP_TRACE_DEBUG(
       
  1602 					m_am_tools,
       
  1603 					TRACE_FLAGS_DEFAULT,
       
  1604 					(EAPL("TEST: random_error(): packet_index 0x%08x:%lu, Send error packet\n"),
       
  1605 					this,
       
  1606 					m_packet_index));
       
  1607 			}
       
  1608 		}
       
  1609 	}
       
  1610 
       
  1611 
       
  1612 	if (m_send_original_packet_first == false
       
  1613 		&& status == KErrNone)
       
  1614 	{
       
  1615 		if (m_enable_random_errors == true)
       
  1616 		{
       
  1617 			EAP_TRACE_DEBUG(
       
  1618 				m_am_tools,
       
  1619 				TRACE_FLAGS_DEFAULT,
       
  1620 				(EAPL("TEST: random_error(): packet_index 0x%08x:%lu, Send original packet\n"),
       
  1621 				this,
       
  1622 				m_packet_index));
       
  1623 		}
       
  1624 
       
  1625 		u8_t * const packet_data = sent_packet->get_data_offset(header_offset, data_length);
       
  1626 		if (packet_data == 0)
       
  1627 		{
       
  1628 			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  1629 			return eap_status_buffer_too_short;
       
  1630 		}
       
  1631 
       
  1632 		// Here we send the original packet.
       
  1633 		status = m_partner->EapPacketSend(
       
  1634 			data_length,
       
  1635 			static_cast<TUint8*>(packet_data));
       
  1636 		++m_packet_index;
       
  1637 	}
       
  1638 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  1639 
       
  1640 	return EAP_STATUS_RETURN(m_am_tools, m_am_tools->convert_am_error_to_eapol_error(status));
       
  1641 }
       
  1642 
       
  1643 //--------------------------------------------------
       
  1644 
       
  1645 //
       
  1646 eap_status_e eapol_am_core_symbian_c::reassociate(
       
  1647 		const eap_am_network_id_c * const /* send_network_id */,
       
  1648 		const eapol_key_authentication_type_e /* authentication_type */,
       
  1649 		const eap_variable_data_c * const /* PMKID */,
       
  1650 		const eap_variable_data_c * const /* WPXM_WPXK1 */,
       
  1651 		const eap_variable_data_c * const /* WPXM_WPXK2 */)
       
  1652 {
       
  1653 	return EAP_STATUS_RETURN(m_am_tools, eap_status_not_supported);
       
  1654 }
       
  1655 
       
  1656 //--------------------------------------------------
       
  1657 
       
  1658 //
       
  1659 void eapol_am_core_symbian_c::state_notification(const abs_eap_state_notification_c * const state)
       
  1660 {
       
  1661 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  1662 
       
  1663 	if(state->get_protocol_layer() == eap_protocol_layer_general)
       
  1664 	{
       
  1665 		if (state->get_current_state() == eap_general_state_authentication_cancelled)
       
  1666 		{
       
  1667 			// Authentication was cancelled. Cannot continue.
       
  1668 			EAP_TRACE_DEBUG(
       
  1669 				m_am_tools,
       
  1670 				TRACE_FLAGS_DEFAULT,
       
  1671 				(EAPL("Authentication was cancelled. Sets timer EAPOL_AM_CORE_TIMER_FAILED_COMPLETELY_ID.\n")));
       
  1672 
       
  1673 			set_timer(this, EAPOL_AM_CORE_TIMER_FAILED_COMPLETELY_ID, 0, 0);
       
  1674 		}
       
  1675 		else if (state->get_current_state() == eap_general_state_configuration_error)
       
  1676 		{
       
  1677 			// Configuration error. Cannot continue.
       
  1678 			EAP_TRACE_DEBUG(
       
  1679 				m_am_tools,
       
  1680 				TRACE_FLAGS_DEFAULT,
       
  1681 				(EAPL("Configuration error. Sets timer EAPOL_AM_CORE_TIMER_FAILED_COMPLETELY_ID.\n")));
       
  1682 
       
  1683 			set_timer(this, EAPOL_AM_CORE_TIMER_FAILED_COMPLETELY_ID, 0, 0);
       
  1684 		}
       
  1685 	}
       
  1686 
       
  1687 
       
  1688 	if (m_block_packet_sends_and_notifications == true)
       
  1689 	{
       
  1690 		// Notification block is active.		
       
  1691 		EAP_TRACE_DEBUG(
       
  1692 			m_am_tools,
       
  1693 			TRACE_FLAGS_DEFAULT,
       
  1694 			(EAPL("state_notification: notification ignored because Disassociated() was called.\n")));
       
  1695 		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  1696 		return;
       
  1697 	}
       
  1698 
       
  1699 
       
  1700 	// Check if this is EAP layer notification
       
  1701 	if(state->get_protocol_layer() == eap_protocol_layer_eap)
       
  1702 	{
       
  1703 		switch (state->get_current_state())
       
  1704 		{
       
  1705 		case eap_state_none:
       
  1706 			break;
       
  1707 		case eap_state_identity_request_sent:
       
  1708 			// This is for server only so no need to notify WLM.
       
  1709 			break;
       
  1710 		case eap_state_identity_request_received:
       
  1711 			if (m_authentication_indication_sent == false) 
       
  1712 			{
       
  1713 				EAP_TRACE_DEBUG(
       
  1714 					m_am_tools,
       
  1715 					TRACE_FLAGS_DEFAULT,
       
  1716 					(EAPL("Indication sent to WLM: EAuthenticating.\n")));
       
  1717 				m_partner->EapIndication(EAuthenticating);
       
  1718 				m_authentication_indication_sent = true;
       
  1719 			}
       
  1720 			break;
       
  1721 		case eap_state_identity_response_received:
       
  1722 			// This is for server only so no need to notify WLM.
       
  1723 			break;
       
  1724 		case eap_state_authentication_finished_successfully:
       
  1725 			{
       
  1726 
       
  1727 			increment_authentication_counter();
       
  1728 			m_successful_authentications++;	
       
  1729 			
       
  1730 			if (m_wpa_psk_mode_active == false)
       
  1731 			{				
       
  1732 				TEap eap;
       
  1733 				eap.Enabled = ETrue;
       
  1734 				eap.UID.Num(static_cast<TInt>(state->get_eap_type()));
       
  1735 				
       
  1736 				// This moves the successful type to be the top priority type in IAP settings.
       
  1737 				TRAPD(err, SetToTopPriorityL(&eap));
       
  1738 				if (err != KErrNone)
       
  1739 				{
       
  1740 					// Just log the error. 
       
  1741 					EAP_TRACE_DEBUG(
       
  1742 						m_am_tools,
       
  1743 						TRACE_FLAGS_DEFAULT, 
       
  1744 						(EAPL("state_notification: SetToTopPriorityL leaved!\n")));
       
  1745 				}
       
  1746 
       
  1747 				// Move the active eap type index to the first type
       
  1748 				m_eap_index = 0; 
       
  1749 			}
       
  1750 						
       
  1751 
       
  1752 			}
       
  1753 			break;
       
  1754 		case eap_state_authentication_terminated_unsuccessfully:
       
  1755 			{
       
  1756 				if (m_wpa_psk_mode_active == false)
       
  1757 				{
       
  1758 					// Set index to next type.
       
  1759 					m_eap_index++;
       
  1760 				}
       
  1761 		
       
  1762 				increment_authentication_counter();
       
  1763 				m_failed_authentications++;
       
  1764 
       
  1765 				// Restart authentication
       
  1766 				eap_am_network_id_c* send_network_id = new eap_am_network_id_c(m_am_tools, state->get_send_network_id());
       
  1767 				if (send_network_id == 0 
       
  1768 					|| send_network_id->get_is_valid_data() == false)
       
  1769 				{
       
  1770 					delete send_network_id;
       
  1771 					EAP_TRACE_DEBUG(
       
  1772 						m_am_tools,
       
  1773 						TRACE_FLAGS_DEFAULT,
       
  1774 						(EAPL("Indication sent to WLM: EFailedCompletely.\n")));
       
  1775 					m_partner->EapIndication(EFailedCompletely);
       
  1776 					break;
       
  1777 				}
       
  1778 				set_timer(this, EAPOL_AM_CORE_TIMER_RESTART_AUTHENTICATION_ID, send_network_id, 0);
       
  1779 
       
  1780 			}
       
  1781 			break;
       
  1782 		default:
       
  1783 			break;
       
  1784 		}
       
  1785 	}
       
  1786 	else 
       
  1787 	{
       
  1788 		if(state->get_protocol_layer() == eap_protocol_layer_eapol)
       
  1789 		{
       
  1790 			switch (state->get_current_state())
       
  1791 			{
       
  1792 			case eapol_state_no_start_response:
       
  1793 				EAP_TRACE_DEBUG(
       
  1794 					m_am_tools,
       
  1795 					TRACE_FLAGS_DEFAULT,
       
  1796 					(EAPL("Indication sent to WLM: ENoResponse.\n")));
       
  1797 				m_partner->EapIndication(ENoResponse);
       
  1798 				break;
       
  1799 			default:
       
  1800 				break;
       
  1801 			}
       
  1802 		}
       
  1803 		else if(state->get_protocol_layer() == eap_protocol_layer_eapol_key)
       
  1804 		{
       
  1805 			switch (state->get_current_state())
       
  1806 			{
       
  1807 			case eapol_key_state_802_11i_authentication_terminated_unsuccessfull:
       
  1808 				{					
       
  1809 					increment_authentication_counter();
       
  1810 					m_failed_authentications++;
       
  1811 
       
  1812 					// Consider EAPOL layer failures fatal.
       
  1813 					EAP_TRACE_ERROR(
       
  1814 						m_am_tools,
       
  1815 						TRACE_FLAGS_DEFAULT,
       
  1816 						(EAPL("ERROR: Unsuccessful authentication on EAPOL level.\n")));
       
  1817 					EAP_TRACE_DEBUG(
       
  1818 						m_am_tools,
       
  1819 						TRACE_FLAGS_DEFAULT,
       
  1820 						(EAPL("Indication sent to WLM: EThisAPFailed.\n")));
       
  1821 					m_partner->EapIndication(EThisAPFailed);
       
  1822 				}
       
  1823 				break;
       
  1824 			case eapol_key_state_802_11i_authentication_finished_successfull:
       
  1825 				{					
       
  1826 					EAP_TRACE_ALWAYS(
       
  1827 						m_am_tools,
       
  1828 						TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
       
  1829 						(EAPL("EAPOL_KEY: %s: Authentication SUCCESS\n"),
       
  1830 						(m_is_client == true ? "client": "server")));
       
  1831 				}
       
  1832 				break;
       
  1833 			default:
       
  1834 				break;
       
  1835 			}
       
  1836 		}	
       
  1837 	}
       
  1838 
       
  1839 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  1840 }
       
  1841 
       
  1842 //--------------------------------------------------
       
  1843 
       
  1844 //
       
  1845 
       
  1846 eap_status_e eapol_am_core_symbian_c::timer_expired(
       
  1847 	const u32_t id, void * /* data */)
       
  1848 {
       
  1849 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  1850 	EAP_TRACE_DEBUG(
       
  1851 		m_am_tools,
       
  1852 		TRACE_FLAGS_DEFAULT,
       
  1853 		(EAPL("eapol_am_core_symbian_c::TimerExpired id = %d.\n"),
       
  1854 		id));
       
  1855 
       
  1856 	switch (id)
       
  1857 	{
       
  1858 	case EAPOL_AM_CORE_TIMER_RESTART_AUTHENTICATION_ID:
       
  1859 		{			
       
  1860 			EAP_TRACE_DEBUG(
       
  1861 				m_am_tools,
       
  1862 				TRACE_FLAGS_DEFAULT,
       
  1863 				(EAPL("EAPOL_AM_CORE_TIMER_RESTART_AUTHENTICATION_ID elapsed: Stopping stack.\n")));
       
  1864 			
       
  1865 			// Stop stack. Do this only if Ethernet core still exists.
       
  1866 			if (m_ethernet_core != 0)
       
  1867 			{
       
  1868 				m_ethernet_core->shutdown();
       
  1869 				delete m_ethernet_core;
       
  1870 				m_ethernet_core = 0;
       
  1871 			}
       
  1872 			if (m_wpa_psk_mode_active == true)
       
  1873 			{
       
  1874 				// PSK mode active - cannot restart. Just fail.
       
  1875 				EAP_TRACE_DEBUG(
       
  1876 					m_am_tools,
       
  1877 					TRACE_FLAGS_DEFAULT,
       
  1878 					(EAPL("WPA PSK mode failed.\n")));
       
  1879 				EAP_TRACE_DEBUG(
       
  1880 					m_am_tools,
       
  1881 					TRACE_FLAGS_DEFAULT,
       
  1882 					(EAPL("Indication sent to WLM: EThisAPFailed.\n")));
       
  1883 				m_partner->EapIndication(EThisAPFailed);			
       
  1884 				break;
       
  1885 
       
  1886 			}
       
  1887 
       
  1888 			EAP_TRACE_DEBUG(
       
  1889 				m_am_tools,
       
  1890 				TRACE_FLAGS_DEFAULT,
       
  1891 				(EAPL("Checking if more types.\n")));
       
  1892 
       
  1893 			TInt i;
       
  1894 			TEap *eapType = 0;  
       
  1895 			// Search for more EAP types to try
       
  1896 			for (i = m_eap_index; i < m_iap_eap_array.Count(); i++)
       
  1897 			{
       
  1898 				// Find the next enabled EAP type (highest priority)
       
  1899 				eapType = m_iap_eap_array[i];			
       
  1900 				if (eapType->Enabled == 1)
       
  1901 				{
       
  1902 					break;
       
  1903 				}
       
  1904 			}
       
  1905 			// Update index to point to next type to be tried
       
  1906 			m_eap_index = i;
       
  1907 
       
  1908 			if (i >= m_iap_eap_array.Count())
       
  1909 			{
       
  1910 				EAP_TRACE_DEBUG(
       
  1911 					m_am_tools,
       
  1912 					TRACE_FLAGS_DEFAULT,
       
  1913 					(EAPL("No more configured EAP types to try.\n")));
       
  1914 
       
  1915 				// No point in trying to restart authentication because there isn't any more
       
  1916 				// EAP types left to try...
       
  1917 				EAP_TRACE_DEBUG(
       
  1918 					m_am_tools,
       
  1919 					TRACE_FLAGS_DEFAULT,
       
  1920 					(EAPL("Indication sent to WLM: EThisAPFailed.\n")));
       
  1921 				m_partner->EapIndication(EThisAPFailed);			
       
  1922 				break;
       
  1923 			}
       
  1924 
       
  1925 			// Check if authentication mode must be changed
       
  1926 			TLex8 tmp(eapType->UID);
       
  1927 			TInt type(0);
       
  1928 			tmp.Val(type);
       
  1929 
       
  1930 			EAP_TRACE_DEBUG(
       
  1931 				m_am_tools,
       
  1932 				TRACE_FLAGS_DEFAULT,
       
  1933 				(EAPL("Found new type to try: %d.\n"), type));
       
  1934 
       
  1935 			switch (type)
       
  1936 			{
       
  1937 			case eap_type_leap:
       
  1938 				m_active_type_is_leap = true;
       
  1939 				if (m_802_11_authentication_mode != EAuthModeLeap
       
  1940 					&& m_security_mode != Wpa
       
  1941 					&& m_security_mode != Wpa2Only) // In WPA or WPA2 even LEAP uses open authentication
       
  1942 				{
       
  1943 					// New type is LEAP and the old was something else:
       
  1944 					// must reassociate with correct authentication mode.					
       
  1945 					m_self_disassociated = true;
       
  1946 					TInt result = m_partner->Disassociate();
       
  1947 					if (result != KErrNone)
       
  1948 					{
       
  1949 						// Probably unrecoverable error
       
  1950 						EAP_TRACE_DEBUG(
       
  1951 							m_am_tools,
       
  1952 							TRACE_FLAGS_DEFAULT,
       
  1953 							(EAPL("Indication sent to WLM: EFailedCompletely.\n")));				
       
  1954 						m_partner->EapIndication(EFailedCompletely);
       
  1955 						EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
  1956 						return eap_status_ok;
       
  1957 					}
       
  1958 					
       
  1959 					EAP_TRACE_DEBUG(
       
  1960 						m_am_tools,
       
  1961 						TRACE_FLAGS_DEFAULT,
       
  1962 						(EAPL("TimerExpired: Changing auth type to LEAP.\n")));
       
  1963 
       
  1964 					m_802_11_authentication_mode = EAuthModeLeap;
       
  1965 					
       
  1966 					m_partner->Associate(EAuthModeLeap);
       
  1967 					EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
  1968 					return eap_status_ok;
       
  1969 				}
       
  1970 				break;
       
  1971 			default:
       
  1972 				m_active_type_is_leap = false;
       
  1973 				if (m_802_11_authentication_mode != EAuthModeOpen
       
  1974 					&& m_security_mode != Wpa
       
  1975 					&& m_security_mode != Wpa2Only) // In WPA or WPA2 even LEAP uses open authentication)
       
  1976 				{
       
  1977 					// New type is non-LEAP and the old was LEAP:
       
  1978 					// must reassociate with correct authentication mode
       
  1979 					m_self_disassociated = true;
       
  1980 					TInt result = m_partner->Disassociate();
       
  1981 					if (result != KErrNone)
       
  1982 					{
       
  1983 						// Probably unrecoverable error	
       
  1984 						EAP_TRACE_DEBUG(
       
  1985 							m_am_tools,
       
  1986 							TRACE_FLAGS_DEFAULT,
       
  1987 							(EAPL("Indication sent to WLM: EFailedCompletely.\n")));
       
  1988 
       
  1989 						m_partner->EapIndication(EFailedCompletely);
       
  1990 						EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
  1991 						return eap_status_ok;
       
  1992 					}
       
  1993 
       
  1994 					EAP_TRACE_DEBUG(
       
  1995 						m_am_tools,
       
  1996 						TRACE_FLAGS_DEFAULT,
       
  1997 						(EAPL("TimerExpired: Changing auth type to OPEN.\n")));				
       
  1998 
       
  1999 					m_802_11_authentication_mode = EAuthModeOpen;
       
  2000 					
       
  2001 					m_partner->Associate(EAuthModeOpen);
       
  2002 					
       
  2003 					EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
  2004 					return eap_status_ok;
       
  2005 				}
       
  2006 				break;
       
  2007 			}
       
  2008 
       
  2009 			EAP_TRACE_DEBUG(
       
  2010 				m_am_tools,
       
  2011 				TRACE_FLAGS_DEFAULT,
       
  2012 				(EAPL("TimerExpired: No need to change auth type.\n")));				
       
  2013 
       
  2014 			if (CompleteAssociation(
       
  2015 					KErrNone,
       
  2016 					m_local_address, 
       
  2017 					m_remote_address,
       
  2018 					m_received_wpa_ie, 
       
  2019 					m_received_wpa_ie_length,
       
  2020 					m_sent_wpa_ie,
       
  2021 					m_sent_wpa_ie_length,
       
  2022 					m_group_key_cipher_suite,
       
  2023 					m_pairwise_key_cipher_suite) != KErrNone)
       
  2024 			{
       
  2025 				// Probably unrecoverable error	
       
  2026 				EAP_TRACE_DEBUG(
       
  2027 					m_am_tools,
       
  2028 					TRACE_FLAGS_DEFAULT,
       
  2029 					(EAPL("Indication sent to WLM: EFailedCompletely.\n")));				
       
  2030 				m_partner->EapIndication(EFailedCompletely);
       
  2031 				EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
  2032 				return eap_status_ok;
       
  2033 			}			
       
  2034 		}
       
  2035 		break;
       
  2036 				
       
  2037 	case EAPOL_AM_CORE_TIMER_DELETE_STACK_ID:
       
  2038 		{
       
  2039 			EAP_TRACE_DEBUG(
       
  2040 				m_am_tools,
       
  2041 				TRACE_FLAGS_DEFAULT,
       
  2042 				(EAPL("EAPOL_AM_CORE_TIMER_DELETE_STACK_ID elapsed: Delete stack.\n")));
       
  2043 
       
  2044 			cancel_all_timers();
       
  2045 
       
  2046 			// Delete stack
       
  2047 			if (m_ethernet_core != 0)
       
  2048 			{
       
  2049 				m_ethernet_core->shutdown();
       
  2050 				delete m_ethernet_core;
       
  2051 				m_ethernet_core = 0;				
       
  2052 			}
       
  2053 			m_stack_marked_to_be_deleted = false;
       
  2054 
       
  2055 			// Re-activates timer queue.
       
  2056 			eap_status_e status = m_am_tools->re_activate_timer_queue();
       
  2057 			if (status != eap_status_ok)
       
  2058 			{
       
  2059 				EAP_TRACE_DEBUG(
       
  2060 					m_am_tools,
       
  2061 					TRACE_FLAGS_DEFAULT,
       
  2062 					(EAPL("ERROR: re_activate_timer_queue() failed, status = %d\n")));
       
  2063 			}
       
  2064 		}
       
  2065 		break;
       
  2066 	
       
  2067 	case EAPOL_AM_CORE_TIMER_FAILED_COMPLETELY_ID:
       
  2068 		{
       
  2069 			EAP_TRACE_DEBUG(
       
  2070 				m_am_tools,
       
  2071 				TRACE_FLAGS_DEFAULT,
       
  2072 				(EAPL("EAPOL_AM_CORE_TIMER_FAILED_COMPLETELY_ID elapsed: Indication sent to WLM: EFailedCompletely.\n")));
       
  2073 
       
  2074 			m_partner->EapIndication(EFailedCompletely);
       
  2075 		}
       
  2076 		break;
       
  2077 	
       
  2078 	default:
       
  2079 		break;
       
  2080 	}
       
  2081 	return eap_status_ok;
       
  2082 }
       
  2083 
       
  2084 eap_status_e eapol_am_core_symbian_c::timer_delete_data(
       
  2085 	const u32_t id, void *data)
       
  2086 {
       
  2087 	switch (id)
       
  2088 	{
       
  2089 	case EAPOL_AM_CORE_TIMER_RESTART_AUTHENTICATION_ID:
       
  2090 		{
       
  2091 			eap_am_network_id_c* tmp = static_cast<eap_am_network_id_c*>(data);
       
  2092 			delete tmp;
       
  2093 		}
       
  2094 		break;
       
  2095 	case EAPOL_AM_CORE_TIMER_DELETE_STACK_ID:
       
  2096 		break;
       
  2097 	case EAPOL_AM_CORE_TIMER_FAILED_COMPLETELY_ID:
       
  2098 		break;
       
  2099 
       
  2100 	default:
       
  2101 		{
       
  2102 			EAP_TRACE_ERROR(
       
  2103 				m_am_tools,
       
  2104 				TRACE_FLAGS_DEFAULT,
       
  2105 				(EAPL("eapol_am_core_symbian_c::timer_delete_data: deleted unknown timer.\n")));
       
  2106 			(void)EAP_STATUS_RETURN(m_am_tools, eap_status_not_supported);
       
  2107 		}
       
  2108 	}	
       
  2109 	return eap_status_ok;
       
  2110 }
       
  2111 //--------------------------------------------------
       
  2112 
       
  2113 //
       
  2114 u32_t eapol_am_core_symbian_c::get_header_offset(
       
  2115 	u32_t * const MTU,
       
  2116 	u32_t * const trailer_length)
       
  2117 {
       
  2118 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2119 	*MTU = KMTU;
       
  2120 	*trailer_length = KTrailerLength;
       
  2121 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2122 	return KHeaderOffset;
       
  2123 }
       
  2124 
       
  2125 //--------------------------------------------------
       
  2126 
       
  2127 //
       
  2128 eap_status_e eapol_am_core_symbian_c::unload_module(const eap_type_value_e type)
       
  2129 {
       
  2130 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2131 	eap_status_e status(eap_status_type_does_not_exists_error);
       
  2132 	TInt index = m_eap_type_array.Find(type);
       
  2133 	if (index != KErrNotFound)
       
  2134 	{
       
  2135 		delete m_plugin_if_array[index];
       
  2136 		m_plugin_if_array.Remove(index);
       
  2137 		m_eap_type_array.Remove(index);
       
  2138 		status = eap_status_ok;			
       
  2139 	}
       
  2140 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2141 	return EAP_STATUS_RETURN(m_am_tools, status);
       
  2142 }
       
  2143 
       
  2144 //--------------------------------------------------
       
  2145 
       
  2146 //
       
  2147 eap_status_e eapol_am_core_symbian_c::eap_acknowledge(const eap_am_network_id_c * const receive_network_id)
       
  2148 {
       
  2149 	// Any Network Protocol packet is accepted as a success indication.
       
  2150 	// This is described in RFC 2284 "PPP Extensible Authentication Protocol (EAP)".
       
  2151 
       
  2152 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2153 
       
  2154 	eap_status_e status = m_ethernet_core->eap_acknowledge(receive_network_id);
       
  2155 
       
  2156 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2157 	return EAP_STATUS_RETURN(m_am_tools, status);
       
  2158 }
       
  2159 
       
  2160 //--------------------------------------------------
       
  2161 
       
  2162 //
       
  2163 eap_status_e eapol_am_core_symbian_c::load_module(
       
  2164 		const eap_type_value_e type,
       
  2165 		const eap_type_value_e tunneling_type,
       
  2166 		abs_eap_base_type_c * const partner,
       
  2167 		eap_base_type_c ** const eap_type_if,
       
  2168 		const bool is_client_when_true,
       
  2169 		const eap_am_network_id_c * const receive_network_id)
       
  2170 {	
       
  2171 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2172 
       
  2173 	EAP_TRACE_DEBUG(
       
  2174 		m_am_tools,
       
  2175 		TRACE_FLAGS_DEFAULT,
       
  2176 		(EAPL("eapol_am_core_symbian_c::load_module(type %d=%s, tunneling_type %d=%s)\n"),
       
  2177 		static_cast<TInt>(type),
       
  2178 		eap_header_string_c::get_eap_type_string(type),
       
  2179 		static_cast<TInt>(tunneling_type),
       
  2180 		eap_header_string_c::get_eap_type_string(tunneling_type)));
       
  2181 
       
  2182 	eap_status_e status = eap_status_process_general_error;
       
  2183 	TBuf8<KMaxEapCueLength> cue;
       
  2184 	cue.Num(static_cast<TInt>(convert_eap_type_to_u32_t(type)));
       
  2185 	CEapType* eapType = 0;
       
  2186 	TInt error(KErrNone);
       
  2187 
       
  2188 	// Check if this EAP type has already been loaded
       
  2189 	TInt eapArrayIndex = m_eap_type_array.Find(type);
       
  2190 	if (eapArrayIndex != KErrNotFound)
       
  2191 	{
       
  2192 		// Yep. It was loaded already.
       
  2193 		eapType = m_plugin_if_array[eapArrayIndex];		
       
  2194 	}
       
  2195 	else 
       
  2196 	{
       
  2197 		// We must have a trap here since the EAPOL core knows nothing about Symbian.
       
  2198 		TRAP(error, (eapType = CEapType::NewL(cue, m_index_type, m_index)));	
       
  2199 		if (error != KErrNone
       
  2200 			|| eapType == 0)
       
  2201 		{
       
  2202 			// Interface not found or implementation creation function failed
       
  2203 			EAP_TRACE_DEBUG(
       
  2204 				m_am_tools,
       
  2205 				TRACE_FLAGS_DEFAULT,
       
  2206 				(EAPL("ECom could not find/initiate implementation.\n")));
       
  2207 			return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
       
  2208 		}
       
  2209 	}
       
  2210 	// Set the tunneling type
       
  2211 	eapType->SetTunnelingType(convert_eap_type_to_u32_t(tunneling_type));
       
  2212 
       
  2213 	// Create the EAP protocol interface implementation.
       
  2214 	TRAP(error, (*eap_type_if = eapType->GetStackInterfaceL(m_am_tools, partner, is_client_when_true, receive_network_id)));
       
  2215 		
       
  2216 	if (error != KErrNone 
       
  2217 		|| *eap_type_if == 0 
       
  2218 		|| (*eap_type_if)->get_is_valid() == false)
       
  2219 	{
       
  2220 		EAP_TRACE_DEBUG(
       
  2221 			m_am_tools,
       
  2222 			TRACE_FLAGS_DEFAULT,
       
  2223 			(EAPL("Could not create EAP type interface instance. Error: %d\n"), error));
       
  2224 
       
  2225 		status = eap_status_allocation_error;
       
  2226 		// Unload DLL (two ways, depending whether this type was already loaded...)
       
  2227 		if  (eapArrayIndex == KErrNotFound)
       
  2228 		{
       
  2229 			// No need to call shutdown here because GetStackInterfaceL has done it.
       
  2230 			delete eapType;
       
  2231 		}
       
  2232 		else
       
  2233 		{
       
  2234 			unload_module(type);
       
  2235 		}
       
  2236 		// Note: even in error cases eap_core_c deletes eap_type_if
       
  2237 	}
       
  2238 	else
       
  2239 	{
       
  2240 		status = eap_status_ok;
       
  2241 		if (eapArrayIndex  == KErrNotFound)
       
  2242 		{
       
  2243 			// Add plugin information to the member arrays. There is no need to store eap_type pointer because
       
  2244 			// the stack takes care of its deletion.
       
  2245 			if (m_plugin_if_array.Append(eapType) != KErrNone)
       
  2246 			{
       
  2247 				delete eapType;
       
  2248 				status = eap_status_allocation_error;
       
  2249 				EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2250 				return EAP_STATUS_RETURN(m_am_tools, status);				
       
  2251 			}
       
  2252 			if (m_eap_type_array.Append(type) != KErrNone)
       
  2253 			{
       
  2254 				// Remove the eap type added just previously
       
  2255 				m_plugin_if_array.Remove(m_plugin_if_array.Count() - 1);
       
  2256 				delete eapType;
       
  2257 				status = eap_status_allocation_error;
       
  2258 				EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2259 				return EAP_STATUS_RETURN(m_am_tools, status);				
       
  2260 			}
       
  2261 		} 
       
  2262 	}
       
  2263 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2264 	return EAP_STATUS_RETURN(m_am_tools, status);
       
  2265 }
       
  2266 
       
  2267 //--------------------------------------------------
       
  2268 
       
  2269 //
       
  2270 TInt eapol_am_core_symbian_c::Disassociated()
       
  2271 {
       
  2272 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2273 
       
  2274 	EAP_TRACE_DEBUG(
       
  2275 		m_am_tools,
       
  2276 		TRACE_FLAGS_DEFAULT,
       
  2277 		(EAPL("eapol_am_core_symbian_c::Disassociated()\n")));
       
  2278 
       
  2279 	if (m_self_disassociated == true)
       
  2280 	{
       
  2281 		// We were expecting this. No need to reset state.
       
  2282 		m_self_disassociated = false;
       
  2283 		return KErrNone;
       
  2284 	}
       
  2285 
       
  2286 	EAP_TRACE_DEBUG(
       
  2287 		m_am_tools,
       
  2288 		TRACE_FLAGS_DEFAULT,
       
  2289 		(EAPL("eapol_am_core_symbian_c::Disassociated.\n")));
       
  2290 
       
  2291 	eap_status_e status(eap_status_ok);
       
  2292 
       
  2293 	// Set block on.
       
  2294 	m_block_packet_sends_and_notifications = true;
       
  2295 
       
  2296 	// Reset flags
       
  2297 	m_success_indication_sent = false;
       
  2298 	m_unicast_wep_key_received = false;
       
  2299 	m_broadcast_wep_key_received = false;
       
  2300 	m_authentication_indication_sent = false;
       
  2301 
       
  2302 	if (m_ethernet_core != 0)
       
  2303 	{
       
  2304 		EAP_TRACE_DEBUG(
       
  2305 			m_am_tools,
       
  2306 			TRACE_FLAGS_DEFAULT,
       
  2307 			(EAPL("Stack exists. Set EAPOL_AM_CORE_TIMER_DELETE_STACK_ID timer.\n")));
       
  2308 
       
  2309 		m_stack_marked_to_be_deleted = true;
       
  2310 		set_timer(this, EAPOL_AM_CORE_TIMER_DELETE_STACK_ID, 0, 0);
       
  2311 	} 
       
  2312 	else
       
  2313 	{
       
  2314 		EAP_TRACE_DEBUG(
       
  2315 			m_am_tools,
       
  2316 			TRACE_FLAGS_DEFAULT,
       
  2317 			(EAPL("Stack did not exists. EAPOL_AM_CORE_TIMER_DELETE_STACK_ID timer not set.\n")));
       
  2318 	}
       
  2319 
       
  2320 	// reset index
       
  2321 	m_eap_index = 0;
       
  2322 
       
  2323 
       
  2324 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2325 	return m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status));	
       
  2326 }
       
  2327 
       
  2328 //--------------------------------------------------
       
  2329 
       
  2330 //
       
  2331 TInt eapol_am_core_symbian_c::SendWPAMICFailureReport(
       
  2332 		TBool aFatalMICFailure,
       
  2333 		const TMICFailureType aMICFailureType)
       
  2334 {
       
  2335 	EAP_TRACE_ALWAYS(
       
  2336 		m_am_tools,
       
  2337 		TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
       
  2338 		(EAPL("eapol_am_core_symbian_c::SendWPAMICFailureReport(%d, %d).\n"),
       
  2339 		aFatalMICFailure,
       
  2340 		aMICFailureType));
       
  2341 
       
  2342 	bool fatal_failure_when_true = true;
       
  2343 
       
  2344 	if (!aFatalMICFailure)
       
  2345 	{
       
  2346 		fatal_failure_when_true = false;
       
  2347 	}
       
  2348 
       
  2349 	eapol_RSNA_key_header_c::eapol_tkip_mic_failure_type_e tkip_mic_failure_type
       
  2350 		= eapol_RSNA_key_header_c::eapol_tkip_mic_failure_type_pairwise_key;
       
  2351 
       
  2352 	if (aMICFailureType == EGroupKey)
       
  2353 	{
       
  2354 		tkip_mic_failure_type
       
  2355 			= eapol_RSNA_key_header_c::eapol_tkip_mic_failure_type_group_key;
       
  2356 	}
       
  2357 
       
  2358 	const eap_status_e status = m_ethernet_core->tkip_mic_failure(
       
  2359 		m_receive_network_id,
       
  2360 		fatal_failure_when_true,
       
  2361 		tkip_mic_failure_type);
       
  2362 
       
  2363 	return m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status));	
       
  2364 }
       
  2365 
       
  2366 
       
  2367 //--------------------------------------------------
       
  2368 
       
  2369 //
       
  2370 void eapol_am_core_symbian_c::ReadEAPSettingsL()
       
  2371 {
       
  2372 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2373 
       
  2374 	EAP_TRACE_DEBUG(
       
  2375 		m_am_tools,
       
  2376 		TRACE_FLAGS_DEFAULT,
       
  2377 		(EAPL("eapol_am_core_symbian_c::ReadEAPSettingsL()\n")));
       
  2378 
       
  2379 	eap_status_e status(eap_status_ok);
       
  2380 
       
  2381 	// Delete old IAP settings
       
  2382 	m_iap_eap_array.ResetAndDestroy();
       
  2383 	if (m_index_type == ELan)
       
  2384 	{
       
  2385 		EAP_TRACE_DEBUG(
       
  2386 			m_am_tools,
       
  2387 			TRACE_FLAGS_DEFAULT,
       
  2388 			(EAPL("Beginning to read IAP settings - Type: %d, Index: %d.\n"), m_index_type, m_index));
       
  2389 
       
  2390 		CWLanSettings* wlan = new(ELeave) CWLanSettings;
       
  2391 		CleanupStack::PushL(wlan);
       
  2392 		SWLANSettings wlanSettings;
       
  2393 		if (wlan->Connect() != KErrNone)
       
  2394 		{
       
  2395 			// Could not connect to CommDB			
       
  2396 			User::Leave(KErrCouldNotConnect);
       
  2397 		}
       
  2398 
       
  2399 		EAP_TRACE_DEBUG(
       
  2400 			m_am_tools,
       
  2401 			TRACE_FLAGS_DEFAULT, (EAPL("Connected to CommDbIf.\n")));
       
  2402 
       
  2403 		if (wlan->GetWlanSettingsForService(m_index, wlanSettings) != KErrNone)
       
  2404 		{
       
  2405 			wlan->Disconnect();
       
  2406 			User::Leave(KErrUnknown);
       
  2407 		}
       
  2408 
       
  2409 		EAP_TRACE_DEBUG(
       
  2410 			m_am_tools,
       
  2411 			TRACE_FLAGS_DEFAULT,
       
  2412 			(EAPL("Got WLAN settings.\n")));
       
  2413 		
       
  2414 		wlan->GetEapDataL(m_iap_eap_array);
       
  2415 		
       
  2416 		EAP_TRACE_DEBUG(
       
  2417 			m_am_tools,
       
  2418 			TRACE_FLAGS_DEFAULT,
       
  2419 			(EAPL("Got EAP data:\n")));
       
  2420 
       
  2421 		for (TInt i = 0; i < m_iap_eap_array.Count(); i++)
       
  2422 		{
       
  2423 			EAP_TRACE_DEBUG(
       
  2424 				m_am_tools,
       
  2425 				TRACE_FLAGS_DEFAULT,
       
  2426 				(EAPL("EAP type %d\n"),
       
  2427 				i));
       
  2428 
       
  2429 			TLex8 tmp(m_iap_eap_array[i]->UID);
       
  2430 			TInt val(0);
       
  2431 			tmp.Val(val);
       
  2432 		
       
  2433 			EAP_TRACE_DEBUG(
       
  2434 				m_am_tools,
       
  2435 				TRACE_FLAGS_DEFAULT,
       
  2436 				(EAPL("  UID: %d\n"), val));
       
  2437 			EAP_TRACE_DEBUG(
       
  2438 				m_am_tools,
       
  2439 				TRACE_FLAGS_DEFAULT,
       
  2440 				(EAPL("  Enabled: %d\n"),
       
  2441 				m_iap_eap_array[i]->Enabled));
       
  2442 		}
       
  2443 
       
  2444 		EAP_TRACE_DEBUG(
       
  2445 			m_am_tools,
       
  2446 			TRACE_FLAGS_DEFAULT,
       
  2447 			(EAPL("End EAP data:\n")));
       
  2448 
       
  2449 		if (m_iap_eap_array.Count() == 0)
       
  2450 		{
       
  2451 			// The EAP field was empty. Allow all types.
       
  2452 
       
  2453 			EAP_TRACE_DEBUG(
       
  2454 				m_am_tools,
       
  2455 				TRACE_FLAGS_DEFAULT,
       
  2456 				(EAPL("Empty EAP field -> enable all types.\n")));
       
  2457 
       
  2458 			RImplInfoPtrArray eapArray;
       
  2459 			
       
  2460 			REComSession::ListImplementationsL(KEapTypeInterfaceUid, eapArray);
       
  2461 		
       
  2462 			TEap *eap;
       
  2463 			for (TInt i = 0; i < eapArray.Count(); i++)
       
  2464 			{
       
  2465 				eap = new(ELeave) TEap;
       
  2466 				eap->UID.Copy(eapArray[i]->DataType());
       
  2467 				eap->Enabled = ETrue;
       
  2468 				m_iap_eap_array.Append(eap);
       
  2469 			}
       
  2470 
       
  2471 			eapArray.ResetAndDestroy();
       
  2472 		}
       
  2473 
       
  2474 		// Get security mode
       
  2475 		if (m_wpa_override_enabled == false)
       
  2476 		{
       
  2477 			m_security_mode = static_cast<EWlanSecurityMode>(wlanSettings.SecurityMode);		
       
  2478 	
       
  2479 			if (wlanSettings.EnableWpaPsk)
       
  2480 			{
       
  2481 				m_wpa_psk_mode_allowed = true;
       
  2482 			}
       
  2483 			else
       
  2484 			{
       
  2485 				m_wpa_psk_mode_allowed = false;
       
  2486 			}
       
  2487 		}
       
  2488 		else
       
  2489 		{
       
  2490 			// WPA override is enabled
       
  2491 			m_security_mode = Wpa;
       
  2492 			if (m_wpa_psk_password_override->get_is_valid_data() == true
       
  2493 				&& m_wpa_psk_password_override->get_data_length() > 0)
       
  2494 			{
       
  2495 				m_wpa_psk_mode_allowed = true;
       
  2496 			}			
       
  2497 			else
       
  2498 			{
       
  2499 				m_wpa_psk_mode_allowed = false;
       
  2500 			}
       
  2501 		}
       
  2502 		
       
  2503 		
       
  2504 		// Get WPA or WPA2 pre shared key & SSID
       
  2505 		if ((m_security_mode == Wlan8021x
       
  2506 			|| m_security_mode == Wpa
       
  2507 			|| m_security_mode == Wpa2Only)
       
  2508 			&& m_wpa_psk_mode_allowed == true
       
  2509 			&& m_is_client == true)
       
  2510 		{
       
  2511 			eap_variable_data_c * password = new eap_variable_data_c(m_am_tools);
       
  2512 			if (password == 0)
       
  2513 			{
       
  2514 				wlan->Disconnect();
       
  2515 				EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2516 				User::Leave(KErrNoMemory);
       
  2517 			}
       
  2518 			eap_variable_data_c * ssid = new eap_variable_data_c(m_am_tools);
       
  2519 			if (ssid == 0)
       
  2520 			{
       
  2521 				delete password;
       
  2522 				wlan->Disconnect();
       
  2523 				EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2524 				User::Leave(KErrNoMemory);
       
  2525 			}
       
  2526 
       
  2527 			// When using easy WLAN there might be WPA PSK override
       
  2528 			if (m_wpa_psk_password_override->get_is_valid_data() == true
       
  2529 				&& m_wpa_psk_password_override->get_data_length() > 0)
       
  2530 			{
       
  2531 				// Use WPA PSK override
       
  2532 				status = password->set_copy_of_buffer(
       
  2533 					m_wpa_psk_password_override->get_data(m_wpa_psk_password_override->get_data_length()), 
       
  2534 					m_wpa_psk_password_override->get_data_length());
       
  2535 				if (status != eap_status_ok)
       
  2536 				{
       
  2537 					delete password;
       
  2538 					delete ssid;
       
  2539 					wlan->Disconnect();
       
  2540 					EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2541 					User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
       
  2542 				}
       
  2543 			}
       
  2544 			else
       
  2545 			{
       
  2546 				status = password->set_copy_of_buffer(wlanSettings.WPAPreSharedKey.Ptr(), wlanSettings.WPAPreSharedKey.Size());
       
  2547 				if (status != eap_status_ok)
       
  2548 				{
       
  2549 					delete password;
       
  2550 					delete ssid;
       
  2551 					wlan->Disconnect();
       
  2552 					EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2553 					User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
       
  2554 				}
       
  2555 			}
       
  2556 
       
  2557 			TBuf8<KMaxSSIDLength> tmp;
       
  2558 			tmp.Copy(wlanSettings.SSID);
       
  2559 			status = ssid->set_copy_of_buffer(tmp.Ptr(), tmp.Size());
       
  2560 			if (status != eap_status_ok)
       
  2561 			{
       
  2562 				delete password;
       
  2563 				delete ssid;
       
  2564 				wlan->Disconnect();
       
  2565 				EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2566 				User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
       
  2567 			}
       
  2568 
       
  2569 			crypto_wpa_psk_password_hash_c password_hash(m_am_tools);
       
  2570 
       
  2571 			if (ssid->get_data_length() == 0)
       
  2572 			{
       
  2573 				status = ssid->set_copy_of_buffer(m_ssid);
       
  2574 				if (status != eap_status_ok)
       
  2575 				{
       
  2576 					delete password;
       
  2577 					delete ssid;
       
  2578 					wlan->Disconnect();
       
  2579 					EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2580 					User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
       
  2581 				}
       
  2582 			}	
       
  2583 
       
  2584 			TPSKEntry pskEntry;
       
  2585 
       
  2586 			pskEntry.indexType = m_index_type;
       
  2587 			pskEntry.index = m_index;
       
  2588 
       
  2589 			TPtr8 ssidPtr(
       
  2590 					ssid->get_data(ssid->get_data_length()),
       
  2591 					ssid->get_data_length(),
       
  2592 					ssid->get_data_length()
       
  2593 				);			
       
  2594 
       
  2595             TInt err(KErrNone);
       
  2596 
       
  2597 			if (m_wpa_psk_password_override->get_is_valid_data() == false
       
  2598 				|| m_wpa_psk_password_override->get_data_length() == 0)
       
  2599 			{
       
  2600 				// Retrieve saved PSK only when override is not in effect
       
  2601 				TRAP(err, RetrievePSKL(pskEntry));
       
  2602 			} 
       
  2603 			
       
  2604 			if (err != KErrNone
       
  2605 				|| pskEntry.ssid.Compare(ssidPtr) != 0
       
  2606 				|| pskEntry.password.Compare(wlanSettings.WPAPreSharedKey) != 0)
       
  2607 			{
       
  2608 				EAP_TRACE_DEBUG(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("No previous PSK found...\n")));
       
  2609 				// No previous PSK or parameters were changed. We need to calculate
       
  2610 				// PSK again
       
  2611 
       
  2612 				status = password_hash.password_hash(
       
  2613 					password,
       
  2614 					ssid,	
       
  2615 					m_wpa_preshared_key,
       
  2616 					0,
       
  2617 					0);
       
  2618 
       
  2619 				if (status != eap_status_ok)
       
  2620 				{			
       
  2621 					delete password;
       
  2622 					delete ssid;
       
  2623 					wlan->Disconnect();							
       
  2624 					EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2625 					User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
       
  2626 				//	return;
       
  2627 				}
       
  2628 				
       
  2629 				if (m_wpa_psk_password_override->get_is_valid_data() == false
       
  2630 					|| m_wpa_psk_password_override->get_data_length() == 0)
       
  2631 				{
       
  2632 					// Save new PSK (only if psk override is not in effect)
       
  2633 					pskEntry.ssid.Copy(ssidPtr);
       
  2634 				
       
  2635 					pskEntry.password.Copy(wlanSettings.WPAPreSharedKey);
       
  2636 					
       
  2637 					pskEntry.psk.Copy(
       
  2638 						m_wpa_preshared_key->get_data(m_wpa_preshared_key->get_data_length()),
       
  2639 						m_wpa_preshared_key->get_data_length()
       
  2640 						);
       
  2641 
       
  2642 					EAP_TRACE_DEBUG(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("Saving PSK.\n")));
       
  2643 					SavePSKL(pskEntry);																
       
  2644 				}
       
  2645 			}			
       
  2646 			else
       
  2647 			{
       
  2648 				// Copy retrieved psk to member variable
       
  2649 				status = m_wpa_preshared_key->set_copy_of_buffer(pskEntry.psk.Ptr(), pskEntry.psk.Size());
       
  2650 				if (status != eap_status_ok)
       
  2651 				{
       
  2652 					delete password;
       
  2653 					delete ssid;
       
  2654 					wlan->Disconnect();
       
  2655 					EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2656 					User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
       
  2657 				}
       
  2658 			}
       
  2659 			delete password;
       
  2660 			delete ssid;
       
  2661 		}
       
  2662 		
       
  2663 		wlan->Disconnect();
       
  2664 		CleanupStack::PopAndDestroy(wlan);		
       
  2665 		if (m_security_mode != Wlan8021x
       
  2666 			&& m_security_mode != Wpa
       
  2667 			&& m_security_mode != Wpa2Only)
       
  2668 		{
       
  2669 			// Unsupported mode
       
  2670 			User::Leave(KErrNotSupported);
       
  2671 		}
       
  2672 	} 
       
  2673 	else
       
  2674 	{
       
  2675 		// At the moment only LAN bearer is supported.
       
  2676 		User::Leave(KErrNotSupported);
       
  2677 	}
       
  2678 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2679 }
       
  2680 
       
  2681 //--------------------------------------------------
       
  2682 
       
  2683 void eapol_am_core_symbian_c::SetToTopPriorityL(const TEap* const aEapType)
       
  2684 {
       
  2685 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2686 
       
  2687 	EAP_TRACE_DEBUG(
       
  2688 		m_am_tools,
       
  2689 		TRACE_FLAGS_DEFAULT,
       
  2690 		(EAPL("eapol_am_core_symbian_c::SetToTopPriorityL()\n")));
       
  2691 
       
  2692 	if (m_index_type == ELan)
       
  2693 	{
       
  2694 		TInt i(0);
       
  2695 		TBuf8<3> uid;
       
  2696 		for (i = 0; i < m_iap_eap_array.Count(); i++)
       
  2697 		{
       
  2698 			TEap* eap = m_iap_eap_array[i];
       
  2699 			if (eap->UID[0] == '0')
       
  2700 			{
       
  2701 				// Cut the leading zero
       
  2702 				uid.Copy(eap->UID.Right(eap->UID.Length()-1));				
       
  2703 			}
       
  2704 			else
       
  2705 			{
       
  2706 				uid.Copy(eap->UID);
       
  2707 			}
       
  2708 			if (eap->Enabled == aEapType->Enabled
       
  2709 				&& uid.Compare(aEapType->UID) == 0)
       
  2710 			{
       
  2711 				// Found
       
  2712 				break;
       
  2713 			}
       
  2714 		}
       
  2715 		if (i >= m_iap_eap_array.Count())
       
  2716 		{
       
  2717 			// This should never happen
       
  2718 			User::Leave(KErrNotFound);					
       
  2719 		}
       
  2720 	
       
  2721 		TLex8 tmp(aEapType->UID);
       
  2722 		TInt val(0);
       
  2723 		tmp.Val(val);
       
  2724 
       
  2725 		EAP_TRACE_DEBUG(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("Setting to top priority:\n")));
       
  2726 		EAP_TRACE_DEBUG(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("Old index: %d\n"), i));
       
  2727 		EAP_TRACE_DEBUG(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("  UID: %d\n"), val));
       
  2728 		EAP_TRACE_DEBUG(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("  Enabled: %d\n"), aEapType->Enabled));
       
  2729 	
       
  2730 		if (i == 0)
       
  2731 		{
       
  2732 			// Already at the highest priority
       
  2733 			return;
       
  2734 		}
       
  2735 
       
  2736 		EAP_TRACE_DEBUG(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("Beginning to write IAP EAP settings - Type: %d, Index: %d.\n"), m_index_type, m_index));
       
  2737 		
       
  2738 		CWLanSettings* wlan = new(ELeave) CWLanSettings;
       
  2739 		CleanupStack::PushL(wlan);
       
  2740 		SWLANSettings wlanSettings;
       
  2741 		if (wlan->Connect() != KErrNone)
       
  2742 		{
       
  2743 			// Could not connect to CommDB			
       
  2744 			User::Leave(KErrCouldNotConnect);
       
  2745 		}
       
  2746 		EAP_TRACE_DEBUG(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("Connected to CommDbIf.\n")));		
       
  2747 		if (wlan->GetWlanSettingsForService(m_index, wlanSettings) != KErrNone)
       
  2748 		{
       
  2749 			wlan->Disconnect();
       
  2750 			User::Leave(KErrUnknown);
       
  2751 		}
       
  2752 		EAP_TRACE_DEBUG(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("Got WLAN settings.\n")));
       
  2753 		
       
  2754 		// Change the order
       
  2755 		TEap* eap = m_iap_eap_array[i];
       
  2756 
       
  2757 		m_iap_eap_array.Remove(i); // This does not delete the object	
       
  2758 				
       
  2759 		m_iap_eap_array.Insert(eap, 0);
       
  2760 
       
  2761 		wlan->SetEapDataL(m_iap_eap_array);
       
  2762 		
       
  2763 		wlan->Disconnect();
       
  2764 
       
  2765 		CleanupStack::PopAndDestroy(wlan);		
       
  2766 	} 
       
  2767 	else
       
  2768 	{
       
  2769 		// At the moment only LAN bearer is supported.
       
  2770 		User::Leave(KErrNotSupported);
       
  2771 	}
       
  2772 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2773 }
       
  2774 
       
  2775 //--------------------------------------------------
       
  2776 
       
  2777 eap_status_e eapol_am_core_symbian_c::configure()
       
  2778 {	
       
  2779 	EAP_TRACE_DEBUG(
       
  2780 		m_am_tools,
       
  2781 		TRACE_FLAGS_DEFAULT,
       
  2782 		(EAPL("eapol_am_core_symbian_c::configure()\n")));
       
  2783 
       
  2784 
       
  2785 	//----------------------------------------------------------
       
  2786 
       
  2787 #if defined(USE_EAP_ERROR_TESTS)
       
  2788 
       
  2789 	{
       
  2790 		eap_variable_data_c EAP_ERROR_TEST_enable_random_errors(m_am_tools);
       
  2791 
       
  2792 		eap_status_e status = read_configure(
       
  2793 			cf_str_EAP_ERROR_TEST_enable_random_errors.get_field(),
       
  2794 			&EAP_ERROR_TEST_enable_random_errors);
       
  2795 		if (status == eap_status_ok
       
  2796 			&& EAP_ERROR_TEST_enable_random_errors.get_is_valid_data() == true)
       
  2797 		{
       
  2798 			u32_t *enable_random_errors = reinterpret_cast<u32_t *>(
       
  2799 				EAP_ERROR_TEST_enable_random_errors.get_data(sizeof(u32_t));
       
  2800 			if (enable_random_errors != 0
       
  2801 				&& *enable_random_errors != 0)
       
  2802 			{
       
  2803 				m_enable_random_errors = true;
       
  2804 			}
       
  2805 		}
       
  2806 	}
       
  2807 
       
  2808 	{
       
  2809 		eap_variable_data_c EAP_ERROR_TEST_send_original_packet_first(m_am_tools);
       
  2810 
       
  2811 		eap_status_e status = read_configure(
       
  2812 			cf_str_EAP_ERROR_TEST_send_original_packet_first.get_field(),
       
  2813 			&EAP_ERROR_TEST_send_original_packet_first);
       
  2814 		if (status == eap_status_ok
       
  2815 			&& EAP_ERROR_TEST_send_original_packet_first.get_is_valid_data() == true)
       
  2816 		{
       
  2817 			u32_t *send_original_packet_first = reinterpret_cast<u32_t *>(
       
  2818 				EAP_ERROR_TEST_send_original_packet_first.get_data(sizeof(u32_t));
       
  2819 			if (send_original_packet_first != 0
       
  2820 				&& *send_original_packet_first != 0)
       
  2821 			{
       
  2822 				m_send_original_packet_first = true;
       
  2823 			}
       
  2824 		}
       
  2825 	}
       
  2826 
       
  2827 	{
       
  2828 		eap_variable_data_c EAP_ERROR_TEST_generate_multiple_error_packets(m_am_tools);
       
  2829 
       
  2830 		eap_status_e status = read_configure(
       
  2831 			cf_str_EAP_ERROR_TEST_generate_multiple_error_packets.get_field(),
       
  2832 			&EAP_ERROR_TEST_generate_multiple_error_packets);
       
  2833 		if (status == eap_status_ok
       
  2834 			&& EAP_ERROR_TEST_generate_multiple_error_packets.get_is_valid_data() == true)
       
  2835 		{
       
  2836 			u32_t *generate_multiple_error_packets = reinterpret_cast<u32_t *>(
       
  2837 				EAP_ERROR_TEST_generate_multiple_error_packets.get_data(sizeof(u32_t));
       
  2838 			if (generate_multiple_error_packets != 0
       
  2839 				&& *generate_multiple_error_packets != 0)
       
  2840 			{
       
  2841 				m_generate_multiple_error_packets = *generate_multiple_error_packets;
       
  2842 			}
       
  2843 		}
       
  2844 	}
       
  2845 
       
  2846 
       
  2847 	{
       
  2848 		eap_variable_data_c EAP_ERROR_TEST_manipulate_ethernet_header(m_am_tools);
       
  2849 
       
  2850 		eap_status_e status = read_configure(
       
  2851 			cf_str_EAP_ERROR_TEST_manipulate_ethernet_header.get_field(),
       
  2852 			&EAP_ERROR_TEST_manipulate_ethernet_header);
       
  2853 		if (status == eap_status_ok
       
  2854 			&& EAP_ERROR_TEST_manipulate_ethernet_header.get_is_valid_data() == true)
       
  2855 		{
       
  2856 			u32_t *manipulate_ethernet_header = reinterpret_cast<u32_t *>(
       
  2857 				EAP_ERROR_TEST_manipulate_ethernet_header.get_data(sizeof(u32_t));
       
  2858 			if (manipulate_ethernet_header != 0
       
  2859 				&& *manipulate_ethernet_header != 0)
       
  2860 			{
       
  2861 				m_manipulate_ethernet_header = true;
       
  2862 			}
       
  2863 		}
       
  2864 	}
       
  2865 
       
  2866 	{
       
  2867 		eap_variable_data_c EAP_ERROR_TEST_error_probability(m_am_tools);
       
  2868 
       
  2869 		eap_status_e status = read_configure(
       
  2870 			cf_str_EAP_ERROR_TEST_error_probability.get_field(),
       
  2871 			&EAP_ERROR_TEST_error_probability);
       
  2872 		if (status == eap_status_ok
       
  2873 			&& EAP_ERROR_TEST_error_probability.get_is_valid_data() == true)
       
  2874 		{
       
  2875 			u32_t *error_probability = reinterpret_cast<u32_t *>(
       
  2876 				EAP_ERROR_TEST_error_probability.get_data(sizeof(u32_t));
       
  2877 			if (error_probability != 0)
       
  2878 			{
       
  2879 				m_error_probability = *error_probability;
       
  2880 			}
       
  2881 		}
       
  2882 	}	
       
  2883 
       
  2884 	{
       
  2885 		eap_variable_data_c EAP_disable_function_traces(m_am_tools);
       
  2886 
       
  2887 		eap_status_e status = read_configure(
       
  2888 			cf_str_EAP_TRACE_enable_function_traces.get_field(),
       
  2889 			&EAP_disable_function_traces);
       
  2890 		if (status == eap_status_ok
       
  2891 			&& EAP_disable_function_traces.get_is_valid_data() == true)
       
  2892 		{
       
  2893 			u32_t *disable_function_traces = reinterpret_cast<u32_t *>(
       
  2894 				EAP_disable_function_traces.get_data(sizeof(u32_t));
       
  2895 			if (disable_function_traces != 0
       
  2896 				&& *disable_function_traces != 0)
       
  2897 			{
       
  2898 				m_am_tools->set_trace_mask(
       
  2899 					m_am_tools->get_trace_mask()
       
  2900 					| eap_am_tools_c::eap_trace_mask_functions
       
  2901 					);
       
  2902 			}
       
  2903 		}
       
  2904 	}
       
  2905 
       
  2906 #endif //#if defined(USE_EAP_ERROR_TESTS)
       
  2907 
       
  2908 
       
  2909 	//----------------------------------------------------------
       
  2910 
       
  2911 	{		
       
  2912 		eap_variable_data_c EAP_TRACE_disable_traces(m_am_tools);
       
  2913 
       
  2914 		eap_status_e status = read_configure(
       
  2915 			cf_str_EAP_TRACE_disable_traces.get_field(),
       
  2916 			&EAP_TRACE_disable_traces);
       
  2917 		if (status == eap_status_ok
       
  2918 			&& EAP_TRACE_disable_traces.get_is_valid_data() == true)
       
  2919 		{
       
  2920 			u32_t *disable_traces = reinterpret_cast<u32_t *>(
       
  2921 				EAP_TRACE_disable_traces.get_data(sizeof(u32_t)));
       
  2922 			if (disable_traces != 0
       
  2923 				&& *disable_traces != 0)
       
  2924 			{
       
  2925 				m_am_tools->set_trace_mask(eap_am_tools_c::eap_trace_mask_none);
       
  2926 			}
       
  2927 			else
       
  2928 			{
       
  2929 				// OK, set the default trace mask.
       
  2930 				m_am_tools->set_trace_mask(
       
  2931 					eap_am_tools_c::eap_trace_mask_debug
       
  2932 					| eap_am_tools_c::eap_trace_mask_always
       
  2933 					| eap_am_tools_c::eap_trace_mask_error);
       
  2934 			}
       
  2935 		}
       
  2936 	}
       
  2937 
       
  2938 	//----------------------------------------------------------
       
  2939 
       
  2940 	{		
       
  2941 		eap_variable_data_c EAP_TRACE_activate_only_trace_masks_always_and_error(m_am_tools);
       
  2942 
       
  2943 		eap_status_e status = read_configure(
       
  2944 			cf_str_EAP_TRACE_activate_only_trace_masks_always_and_error.get_field(),
       
  2945 			&EAP_TRACE_activate_only_trace_masks_always_and_error);
       
  2946 		if (status == eap_status_ok
       
  2947 			&& EAP_TRACE_activate_only_trace_masks_always_and_error.get_is_valid_data() == true)
       
  2948 		{
       
  2949 			u32_t *activate_trace_mask_always
       
  2950 				= reinterpret_cast<u32_t *>(
       
  2951 					EAP_TRACE_activate_only_trace_masks_always_and_error.get_data(
       
  2952 						sizeof(u32_t)));
       
  2953 			if (activate_trace_mask_always != 0
       
  2954 				&& *activate_trace_mask_always != 0)
       
  2955 			{
       
  2956 				m_am_tools->set_trace_mask(
       
  2957 					eap_am_tools_c::eap_trace_mask_always
       
  2958 					| eap_am_tools_c::eap_trace_mask_error
       
  2959 					);
       
  2960 			}
       
  2961 		}
       
  2962 	}
       
  2963 
       
  2964 	//----------------------------------------------------------
       
  2965 
       
  2966 	{		
       
  2967 		eap_variable_data_c EAP_TRACE_activate_trace_on_error(m_am_tools);
       
  2968 
       
  2969 		eap_status_e status = read_configure(
       
  2970 			cf_str_EAP_TRACE_activate_trace_on_error.get_field(),
       
  2971 			&EAP_TRACE_activate_trace_on_error);
       
  2972 		if (status == eap_status_ok
       
  2973 			&& EAP_TRACE_activate_trace_on_error.get_is_valid_data() == true)
       
  2974 		{
       
  2975 			u32_t *activate_trace_on_error = reinterpret_cast<u32_t *>(
       
  2976 				EAP_TRACE_activate_trace_on_error.get_data(sizeof(u32_t)));
       
  2977 			if (activate_trace_on_error != 0
       
  2978 				&& *activate_trace_on_error != 0)
       
  2979 			{
       
  2980 				m_am_tools->set_activate_trace_on_error();
       
  2981 			}
       
  2982 		}
       
  2983 	}
       
  2984 
       
  2985 	//----------------------------------------------------------
       
  2986 
       
  2987 	// All of the configuration options are optional.
       
  2988 	// So we return OK.
       
  2989 	return eap_status_ok;
       
  2990 }
       
  2991 
       
  2992 //--------------------------------------------------
       
  2993 
       
  2994 eap_status_e eapol_am_core_symbian_c::read_configure(
       
  2995 	const eap_configuration_field_c * const field,
       
  2996 	eap_variable_data_c * const data)
       
  2997 {
       
  2998 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  2999 	EAP_ASSERT_ALWAYS(data != NULL);
       
  3000 	
       
  3001 	// To remove compilation warning in UREL due to KMaxConfigStringLength.
       
  3002 	if(field->get_field_length() > KMaxConfigStringLength)
       
  3003 	{
       
  3004 		return eap_status_process_general_error;
       
  3005 	}
       
  3006 	
       
  3007 	// Trap must be set here because the OS independent portion of EAPOL
       
  3008 	// that calls this function does not know anything about Symbian.	
       
  3009 	eap_status_e status(eap_status_ok);
       
  3010 	
       
  3011 	// Check if the wanted parameter is default type
       
  3012 
       
  3013 	eap_variable_data_c wanted_field(m_am_tools);
       
  3014 	eap_variable_data_c type_field(m_am_tools);
       
  3015 	eap_variable_data_c type_field_server(m_am_tools);
       
  3016 	
       
  3017 	status = wanted_field.set_buffer(
       
  3018 		field->get_field(),
       
  3019 		field->get_field_length(),
       
  3020 		false,
       
  3021 		false);
       
  3022 	if (status != eap_status_ok)
       
  3023 	{
       
  3024 		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3025 		return status;
       
  3026 	}
       
  3027 	
       
  3028 	status = type_field.set_buffer(
       
  3029 		cf_str_EAP_default_type_u32_t.get_field()->get_field(),
       
  3030 		cf_str_EAP_default_type_u32_t.get_field()->get_field_length(),
       
  3031 		false,
       
  3032 		false);
       
  3033 	if (status != eap_status_ok)
       
  3034 	{
       
  3035 		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3036 		return status;
       
  3037 	}
       
  3038 	
       
  3039 	status = type_field_server.set_buffer(
       
  3040 		cf_str_EAP_server_default_type_u32_t.get_field()->get_field(),
       
  3041 		cf_str_EAP_server_default_type_u32_t.get_field()->get_field_length(),
       
  3042 		false,
       
  3043 		false);
       
  3044 	if (status != eap_status_ok)
       
  3045 	{
       
  3046 		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3047 		return status;
       
  3048 	}
       
  3049 
       
  3050 	if (!wanted_field.compare(&type_field)
       
  3051 		|| !wanted_field.compare(&type_field_server))
       
  3052 	{
       
  3053 		TInt i; 
       
  3054 		// We need to return here the next EAP type we should try		
       
  3055 		for (i = m_eap_index; i < m_iap_eap_array.Count(); i++)
       
  3056 		{
       
  3057 			// Find the first enabled EAP type (highest priority)
       
  3058 			TEap *eapType = m_iap_eap_array[i];			
       
  3059 			if (eapType->Enabled == 1)
       
  3060 			{
       
  3061 				// Convert the string to integer
       
  3062 				TLex8 tmp(eapType->UID);
       
  3063 				TInt val(0);
       
  3064 				tmp.Val(val);
       
  3065 				status = data->set_copy_of_buffer(reinterpret_cast<u8_t *>(&val), sizeof(TUint));
       
  3066 				if (status != eap_status_ok)
       
  3067 				{
       
  3068 					EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3069 					return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);			
       
  3070 				}
       
  3071 
       
  3072 				EAP_TRACE_DEBUG(
       
  3073 					m_am_tools,
       
  3074 					TRACE_FLAGS_DEFAULT,
       
  3075 					(EAPL("EAPOL: Trying EAP type: %d.\n"), val));
       
  3076 				break;
       
  3077 			}
       
  3078 		}	
       
  3079 		m_eap_index = i;
       
  3080 		if (i >= m_iap_eap_array.Count())
       
  3081 		{
       
  3082 			// Not found
       
  3083 			// Send WLM notification because there is no way that the authentication
       
  3084 			// can be successful if we don't have any EAP types to use...
       
  3085 			if (m_is_client)
       
  3086 			{
       
  3087 				EAP_TRACE_ERROR(
       
  3088 					m_am_tools,
       
  3089 					TRACE_FLAGS_DEFAULT,
       
  3090 					(EAPL("ERROR: No configured EAP types or all tried unsuccessfully.\n")));
       
  3091 			}
       
  3092 
       
  3093 			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3094 			return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_configure_field);
       
  3095 		}
       
  3096 	
       
  3097 		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3098 		return EAP_STATUS_RETURN(m_am_tools, status);		
       
  3099 	}
       
  3100 
       
  3101 	// It was something else than EAP type. Read it from DB.
       
  3102 	TRAPD(err, read_configureL(
       
  3103 		field->get_field(),
       
  3104 		field->get_field_length(),
       
  3105 		data));
       
  3106 	if (err != KErrNone) 
       
  3107 	{
       
  3108 		status = m_am_tools->convert_am_error_to_eapol_error(err);
       
  3109 
       
  3110 #if defined(USE_EAP_FILECONFIG)
       
  3111 		if (m_fileconfig != 0
       
  3112 			&& m_fileconfig->get_is_valid() == true)
       
  3113 		{
       
  3114 			// Here we could try the final configuration option.
       
  3115 			status = m_fileconfig->read_configure(
       
  3116 				field,
       
  3117 				data);
       
  3118 		}
       
  3119 #endif //#if defined(USE_EAP_FILECONFIG)
       
  3120 	}
       
  3121 
       
  3122 	m_am_tools->trace_configuration(
       
  3123 		status,
       
  3124 		field,
       
  3125 		data);
       
  3126 
       
  3127 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3128 	return EAP_STATUS_RETURN(m_am_tools, status);
       
  3129 }
       
  3130 
       
  3131 //--------------------------------------------------
       
  3132 
       
  3133 void eapol_am_core_symbian_c::read_configureL(
       
  3134 	eap_config_string field,
       
  3135 	const u32_t /*field_length*/,
       
  3136 	eap_variable_data_c * const data)
       
  3137 {	
       
  3138 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3139 
       
  3140 	// Create a buffer for the ascii strings - initialised with the argument
       
  3141 	HBufC8* asciibuf = HBufC8::NewLC(128);
       
  3142 	TPtr8 asciiString = asciibuf->Des();
       
  3143 	asciiString.Copy(reinterpret_cast<const unsigned char *>(field));
       
  3144 		
       
  3145 	// Buffer for unicode parameter
       
  3146 	HBufC* unicodebuf = HBufC::NewLC(128);
       
  3147 	TPtr unicodeString = unicodebuf->Des();
       
  3148 	
       
  3149 	// Convert to unicode 
       
  3150 	unicodeString.Copy(asciiString);
       
  3151 
       
  3152 	// Now do the database query
       
  3153 	HBufC* buf = HBufC::NewLC(KMaxSqlQueryLength);
       
  3154 	TPtr sqlStatement = buf->Des();
       
  3155 	_LIT(KSQLQueryRow, "SELECT %S FROM eapol");
       
  3156 	sqlStatement.Format(KSQLQueryRow, &unicodeString);
       
  3157 	
       
  3158 	RDbView view;
       
  3159 	User::LeaveIfError(view.Prepare(m_database, TDbQuery(sqlStatement), TDbWindow::EUnlimited));
       
  3160 	CleanupClosePushL(view);
       
  3161 	User::LeaveIfError(view.EvaluateAll());	
       
  3162 	if (view.FirstL())
       
  3163 	{
       
  3164 		eap_status_e status(eap_status_process_general_error);
       
  3165 		view.GetL();		
       
  3166 		switch (view.ColType(1))
       
  3167 		{
       
  3168 		case EDbColText:				
       
  3169 			{
       
  3170 				unicodeString = view.ColDes(1);
       
  3171 				// Convert to 8-bit
       
  3172 				asciiString.Copy(unicodeString);
       
  3173 				if (asciiString.Size() > 0)
       
  3174 				{
       
  3175 					status = data->set_copy_of_buffer(asciiString.Ptr(), asciiString.Size());
       
  3176 					if (status != eap_status_ok)
       
  3177 					{
       
  3178 						User::Leave(KErrNoMemory);
       
  3179 					}
       
  3180 				} 
       
  3181 				else 
       
  3182 				{
       
  3183 					// Empty field. Do nothing...data remains invalid
       
  3184 					// and the stack knows what to do hopefully.
       
  3185 					break;
       
  3186 				}
       
  3187 			}
       
  3188 			break;
       
  3189 		case EDbColUint32:
       
  3190 			{
       
  3191 				TUint value;
       
  3192 				value = view.ColUint32(1);
       
  3193 				status = data->set_copy_of_buffer((const unsigned char *) &value, sizeof(value));
       
  3194 				if (status != eap_status_ok)
       
  3195 				{
       
  3196 					User::Leave(KErrNoMemory);
       
  3197 				}
       
  3198 			}
       
  3199 			break;
       
  3200 		default:
       
  3201 			EAP_TRACE_DEBUG(
       
  3202 				m_am_tools,
       
  3203 				TRACE_FLAGS_DEFAULT,
       
  3204 				(EAPL("read_configureL: Unexpected column type.\n")));
       
  3205 			User::Panic(_L("EAPOL"), 1);			
       
  3206 		}
       
  3207 	} 
       
  3208 	else 
       
  3209 	{
       
  3210 		// Could not find parameter
       
  3211 		EAP_TRACE_DEBUG(
       
  3212 			m_am_tools,
       
  3213 			TRACE_FLAGS_DEFAULT,
       
  3214 			(EAPL("read_configureL: Could not find configuration parameter.\n")));
       
  3215 		User::Leave(KErrNotFound);
       
  3216 	}		
       
  3217 	
       
  3218 	// Close database
       
  3219 	CleanupStack::PopAndDestroy(4); // session & 3 buffers
       
  3220 
       
  3221 
       
  3222 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3223 }
       
  3224 
       
  3225 //--------------------------------------------------
       
  3226 
       
  3227 eap_status_e eapol_am_core_symbian_c::write_configure(
       
  3228 	const eap_configuration_field_c * const /*field*/,
       
  3229 	eap_variable_data_c * const /*data*/)
       
  3230 {
       
  3231 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3232 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3233 	return eap_status_not_supported;
       
  3234 }
       
  3235 
       
  3236 //--------------------------------------------------
       
  3237 
       
  3238 //
       
  3239 eap_status_e eapol_am_core_symbian_c::set_timer(
       
  3240 	abs_eap_base_timer_c * const p_initializer, 
       
  3241 	const u32_t p_id, 
       
  3242 	void * const p_data,
       
  3243 	const u32_t p_time_ms)
       
  3244 {
       
  3245 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3246 
       
  3247 	const eap_status_e status = m_am_tools->am_set_timer(
       
  3248 		p_initializer, 
       
  3249 		p_id, 
       
  3250 		p_data,
       
  3251 		p_time_ms);
       
  3252 
       
  3253 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3254 	return status;
       
  3255 }
       
  3256 
       
  3257 //--------------------------------------------------
       
  3258 
       
  3259 //
       
  3260 eap_status_e eapol_am_core_symbian_c::cancel_timer(
       
  3261 	abs_eap_base_timer_c * const p_initializer, 
       
  3262 	const u32_t p_id)
       
  3263 {
       
  3264 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3265 	
       
  3266 	const eap_status_e status = m_am_tools->am_cancel_timer(
       
  3267 		p_initializer, 
       
  3268 		p_id);
       
  3269 
       
  3270 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3271 	return status;
       
  3272 }
       
  3273 
       
  3274 //--------------------------------------------------
       
  3275 
       
  3276 //
       
  3277 eap_status_e eapol_am_core_symbian_c::cancel_all_timers()
       
  3278 {
       
  3279 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3280 
       
  3281 	const eap_status_e status = m_am_tools->am_cancel_all_timers();
       
  3282 
       
  3283 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3284 	return status;
       
  3285 }
       
  3286 
       
  3287 //--------------------------------------------------
       
  3288 
       
  3289 eap_status_e eapol_am_core_symbian_c::check_is_valid_eap_type(const eap_type_value_e eap_type)
       
  3290 {
       
  3291 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3292 	
       
  3293 	TEap *eapType = 0; 
       
  3294 	
       
  3295 	eap_status_e status(eap_status_illegal_eap_type);
       
  3296 	
       
  3297 	for (int i = 0; i < m_iap_eap_array.Count(); i++)
       
  3298 	{
       
  3299 		// Try next EAP type
       
  3300 		eapType = m_iap_eap_array[i];
       
  3301 		if (eapType->Enabled == 1)
       
  3302 		{	
       
  3303 			// Convert the string to integer
       
  3304 			TLex8 tmp(eapType->UID);
       
  3305 			TInt val(0);
       
  3306 			tmp.Val(val);
       
  3307 			if (eap_type == static_cast<eap_type_ietf_values_e>(val))
       
  3308 			{
       
  3309 				// Allowed
       
  3310 				status = eap_status_ok;
       
  3311 				break;
       
  3312 			}	
       
  3313 		}
       
  3314 	}
       
  3315 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3316 
       
  3317 	return EAP_STATUS_RETURN(m_am_tools, status);
       
  3318 }
       
  3319 
       
  3320 //--------------------------------------------------
       
  3321 
       
  3322 eap_status_e eapol_am_core_symbian_c::get_eap_type_list(
       
  3323 	eap_array_c<eap_type_value_e> * const eap_type_list)
       
  3324 {
       
  3325 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3326 
       
  3327 	TEap *eapType = 0; 
       
  3328 
       
  3329 	eap_status_e status(eap_status_illegal_eap_type);
       
  3330 
       
  3331 	status = eap_type_list->reset();
       
  3332 	if (status != eap_status_ok)
       
  3333 	{
       
  3334 		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3335 		return EAP_STATUS_RETURN(m_am_tools, status);
       
  3336 	}
       
  3337 
       
  3338 	for (TInt i = 0; i < m_iap_eap_array.Count(); i++)
       
  3339 	{
       
  3340 		// Check if type is enabled
       
  3341 		eapType = m_iap_eap_array[i];
       
  3342 		if (eapType->Enabled == 1)
       
  3343 		{	
       
  3344 			TLex8 tmp(eapType->UID);
       
  3345 			TInt val(0);
       
  3346 			tmp.Val(val);
       
  3347 
       
  3348 			eap_type_value_e * const eap_type = new eap_type_value_e(
       
  3349 				static_cast<eap_type_ietf_values_e>(val));
       
  3350 			if (eap_type == 0)
       
  3351 			{
       
  3352 				EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3353 				return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
       
  3354 			}
       
  3355 
       
  3356 			status = eap_type_list->add_object(eap_type, true);
       
  3357 			if (status != eap_status_ok)
       
  3358 			{
       
  3359 				EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3360 				return EAP_STATUS_RETURN(m_am_tools, status);
       
  3361 			}
       
  3362 		}
       
  3363 	}
       
  3364 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3365 	return eap_status_ok;
       
  3366 }
       
  3367 
       
  3368 //--------------------------------------------------
       
  3369 
       
  3370 void eapol_am_core_symbian_c::TryOpenDatabaseL(RDbNamedDatabase& aDatabase, RDbs& aSession)
       
  3371 {
       
  3372 	EAP_TRACE_DEBUG(
       
  3373 		m_am_tools,
       
  3374 		TRACE_FLAGS_DEFAULT,
       
  3375 		(EAPL("eapol_am_core_symbian_c::TryOpenDatabaseL()\n")));
       
  3376 
       
  3377 	// 1. Open/create a database	
       
  3378 	
       
  3379 	// Connect to the DBMS server.
       
  3380 	User::LeaveIfError(aSession.Connect());		
       
  3381 	CleanupClosePushL(aSession);	
       
  3382 	// aSession and aDatabase are pushed to the cleanup stack even though they may be member
       
  3383 	// variables of the calling class and would be closed in the destructor anyway. This ensures
       
  3384 	// that if they are not member variables they will be closed. Closing the handle twice
       
  3385 	// does no harm.	
       
  3386 	
       
  3387 #ifdef SYMBIAN_SECURE_DBMS
       
  3388 	
       
  3389 	// Create the secure shared database (if necessary) with the specified secure policy.
       
  3390 	// Database will be created in the data caging path for DBMS (C:\private\100012a5).
       
  3391 	
       
  3392 	TInt err = aDatabase.Create(aSession, KDatabaseName, KSecureUIDFormat);
       
  3393 	
       
  3394 	EAP_TRACE_DEBUG(
       
  3395 		m_am_tools,
       
  3396 		TRACE_FLAGS_DEFAULT,
       
  3397 		(EAPL("TryOpenDatabaseL() - Created Secure DB for eapol.dat. err=%d\n"), err ));	
       
  3398 		
       
  3399 	if(err == KErrNone)
       
  3400 	{	
       
  3401 		aDatabase.Close();
       
  3402 		
       
  3403 	} else if (err != KErrAlreadyExists) 
       
  3404 	{
       
  3405 		User::LeaveIfError(err);
       
  3406 	}
       
  3407 	
       
  3408 	User::LeaveIfError(aDatabase.Open(aSession, KDatabaseName, KSecureUIDFormat));
       
  3409 	CleanupClosePushL(aDatabase);		
       
  3410 		
       
  3411 #else
       
  3412 	// For non-secured database. The database will be created in the old location (c:\system\data).
       
  3413 	
       
  3414 	RFs fsSession;		
       
  3415 	User::LeaveIfError(fsSession.Connect());
       
  3416 	CleanupClosePushL(fsSession);
       
  3417 	
       
  3418 	// Create the database (if necessary)		
       
  3419 	TInt err = aDatabase.Create(fsSession, KDatabaseName);
       
  3420 	
       
  3421 	EAP_TRACE_DEBUG(
       
  3422 		m_am_tools,
       
  3423 		TRACE_FLAGS_DEFAULT,
       
  3424 		(EAPL("TryOpenDatabaseL() - Created Non-Secure DB for eapol.dat. err=%d\n"), err ));	
       
  3425 	
       
  3426 	if(err == KErrNone)
       
  3427 	{
       
  3428 		aDatabase.Close();
       
  3429 		
       
  3430 	} else if (err != KErrAlreadyExists) 
       
  3431 	{
       
  3432 		User::LeaveIfError(err);
       
  3433 	}
       
  3434 	CleanupStack::PopAndDestroy(); // close fsSession
       
  3435 	
       
  3436 	User::LeaveIfError(aDatabase.Open(aSession, KDatabaseName));
       
  3437 	CleanupClosePushL(aDatabase);		
       
  3438 	    
       
  3439 #endif // #ifdef SYMBIAN_SECURE_DBMS
       
  3440 
       
  3441 	HBufC* buf = HBufC::NewLC(KMaxSqlQueryLength);
       
  3442 	TPtr sqlStatement = buf->Des();
       
  3443 
       
  3444 	// 2. Create the table for pre-shared keys in database (ignore error if exists)
       
  3445 	
       
  3446 //// NAME /////////////////////////////////////////////////// TYPE ////////////// Constant ///////
       
  3447 //| ServiceType											  | UNSIGNED INTEGER | KServiceType    |//
       
  3448 //| ServiceIndex										  | UNSIGNED INTEGER | KServiceIndex   |//
       
  3449 //| SSID												  | VARBINARY(255)	 | KSSID		   |//	
       
  3450 //| Password											  | VARBINARY(255)	 | KPassword	   |//	
       
  3451 //| PSK												      | VARBINARY(255)   | KPSK			   |//	
       
  3452 //////////////////////////////////////////////////////////////////////////////////////////////////	
       
  3453 
       
  3454 	_LIT(KSQLCreateTable2, "CREATE TABLE %S (%S UNSIGNED INTEGER, \
       
  3455 											 %S UNSIGNED INTEGER, \
       
  3456 											 %S VARBINARY(255), \
       
  3457 											 %S VARBINARY(255), \
       
  3458 											 %S VARBINARY(255))");
       
  3459 											 
       
  3460 	sqlStatement.Format(KSQLCreateTable2, &KEapolPSKTableName, 
       
  3461 		&KServiceType, &KServiceIndex, &KSSID, &KPassword, &KPSK);
       
  3462 		
       
  3463 	err = aDatabase.Execute(sqlStatement);
       
  3464 	if (err != KErrNone && err != KErrAlreadyExists)
       
  3465 	{
       
  3466 		User::Leave(err);
       
  3467 	}
       
  3468 	
       
  3469 	CleanupStack::PopAndDestroy(); // buf
       
  3470 	CleanupStack::Pop(2); // database, session
       
  3471 	
       
  3472 	// If compacting is not done the database will start growing
       
  3473 	aDatabase.Compact();
       
  3474 }
       
  3475 
       
  3476 //--------------------------------------------------
       
  3477 
       
  3478 void eapol_am_core_symbian_c::OpenDatabaseL(RDbNamedDatabase& aDatabase, RDbs& aSession)
       
  3479 {
       
  3480 	EAP_TRACE_DEBUG(
       
  3481 		m_am_tools,
       
  3482 		TRACE_FLAGS_DEFAULT,
       
  3483 		(EAPL("eapol_am_core_symbian_c::OpenDatabaseL()\n")));
       
  3484 
       
  3485 	// Create the database (if necessary)
       
  3486 	TRAPD(err, TryOpenDatabaseL(aDatabase, aSession));
       
  3487 	if (err != KErrNone)
       
  3488 	{
       
  3489 		// Because of error remove the database file.
       
  3490 		RFs fsDataBaseFile;
       
  3491 		User::LeaveIfError(fsDataBaseFile.Connect());
       
  3492 		CleanupClosePushL(fsDataBaseFile);
       
  3493 		err = fsDataBaseFile.Delete(KDatabaseName);
       
  3494 		if(err != KErrNone)
       
  3495 		{
       
  3496 			User::Leave(KErrCorrupt);
       
  3497 		}
       
  3498 		CleanupStack::PopAndDestroy(); // close fsDataBaseFile
       
  3499 
       
  3500 		// Try open database again. This will leave if fails second time.
       
  3501 		TryOpenDatabaseL(aDatabase, aSession);
       
  3502 	}
       
  3503 }
       
  3504 
       
  3505 //--------------------------------------------------
       
  3506 
       
  3507 eap_status_e eapol_am_core_symbian_c::random_error(
       
  3508 	eap_buf_chain_wr_c * const sent_packet,
       
  3509 	const bool forse_error,
       
  3510 	const u32_t packet_index)
       
  3511 {	
       
  3512 	EAP_UNREFERENCED_PARAMETER(packet_index);
       
  3513 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3514 
       
  3515 	EAP_TRACE_DEBUG(
       
  3516 		m_am_tools,
       
  3517 		TRACE_FLAGS_DEFAULT,
       
  3518 		(EAPL("eapol_am_core_symbian_c::random_error()\n")));
       
  3519 
       
  3520 	eap_status_e status(eap_status_ok);
       
  3521 	u8_t *data = sent_packet->get_data(sent_packet->get_data_length());
       
  3522 
       
  3523 	crypto_random_c rand(m_am_tools);
       
  3524 	u32_t random_guard(0);
       
  3525 	bool error_generated(false);
       
  3526 	u32_t minimum_index(0);
       
  3527 
       
  3528 	if (m_manipulate_ethernet_header == false)
       
  3529 	{
       
  3530 		minimum_index = eapol_ethernet_header_wr_c::get_header_length();
       
  3531 	}
       
  3532 
       
  3533 	for (u32_t ind = minimum_index; ind < sent_packet->get_data_length(); ind++)
       
  3534 	{
       
  3535 		status = rand.get_rand_bytes(
       
  3536 			reinterpret_cast<u8_t *>(&random_guard),
       
  3537 			sizeof(random_guard));
       
  3538 		if (status != eap_status_ok)
       
  3539 		{
       
  3540 			return EAP_STATUS_RETURN(m_am_tools, status);
       
  3541 		}
       
  3542 
       
  3543 		// This is simple limiter to the probability of an error.
       
  3544 		// probability = m_error_probability / (2^32)
       
  3545 		if (random_guard < m_error_probability)
       
  3546 		{
       
  3547 			u8_t rnd(0);
       
  3548 			u8_t previous_data(0);
       
  3549 			// Create an error.
       
  3550 			status = rand.get_rand_bytes(
       
  3551 				&rnd,
       
  3552 				sizeof(rnd));
       
  3553 			if (status != eap_status_ok)
       
  3554 			{
       
  3555 				return EAP_STATUS_RETURN(m_am_tools, status);
       
  3556 			}
       
  3557 
       
  3558 			previous_data = data[ind];
       
  3559 			data[ind] ^= rnd;
       
  3560 
       
  3561 			if (previous_data != data[ind])
       
  3562 			{
       
  3563 				error_generated = true;
       
  3564 				sent_packet->set_random_error_type(eap_random_error_type_manipulate_byte);
       
  3565 
       
  3566 				EAP_TRACE_DEBUG(
       
  3567 					m_am_tools,
       
  3568 					TRACE_FLAGS_DEFAULT,
       
  3569 					(EAPL("TEST: random_error(): packet_index 0x%08x:%lu, data[0x%04x] changed from 0x%02x to 0x%02x.\n"),
       
  3570 					this,
       
  3571 					packet_index,
       
  3572 					ind,
       
  3573 					previous_data,
       
  3574 					data[ind]));
       
  3575 			}
       
  3576 		}
       
  3577 	}
       
  3578 
       
  3579 	if (error_generated == false
       
  3580 		&& forse_error == true
       
  3581 		&& sent_packet->get_data_length() > 0ul)
       
  3582 	{
       
  3583 		// Generate one error.
       
  3584 
       
  3585 		// Random error type.
       
  3586 		eap_random_error_type error_type = eap_random_error_type_none_keep_this_last_case;
       
  3587 		status = rand.get_rand_bytes(
       
  3588 			reinterpret_cast<u8_t *>(&error_type),
       
  3589 			sizeof(error_type));
       
  3590 		if (status != eap_status_ok)
       
  3591 		{
       
  3592 			return EAP_STATUS_RETURN(m_am_tools, status);
       
  3593 		}
       
  3594 
       
  3595 		error_type = static_cast<eap_random_error_type>(
       
  3596 			static_cast<u32_t>(error_type % static_cast<u32_t>(
       
  3597 								   eap_random_error_type_none_keep_this_last_case)));
       
  3598 
       
  3599 		sent_packet->set_random_error_type(error_type);
       
  3600 
       
  3601 		switch(error_type)
       
  3602 		{
       
  3603 		case eap_random_error_type_manipulate_byte:
       
  3604 			{
       
  3605 				u32_t rnd_index(0);
       
  3606 				u8_t previous_data(0);
       
  3607 				u32_t index(0);
       
  3608 
       
  3609 				do
       
  3610 				{
       
  3611 					do
       
  3612 					{
       
  3613 						// Create an error index.
       
  3614 						status = rand.get_rand_bytes(
       
  3615 							reinterpret_cast<u8_t *>(&rnd_index),
       
  3616 							sizeof(rnd_index));
       
  3617 						if (status != eap_status_ok)
       
  3618 						{
       
  3619 							return EAP_STATUS_RETURN(m_am_tools, status);
       
  3620 						}
       
  3621 
       
  3622 						index = (rnd_index % (sent_packet->get_data_length() - minimum_index))
       
  3623 							+ minimum_index;
       
  3624 					}
       
  3625 					while(index < minimum_index
       
  3626 						|| index > sent_packet->get_buffer_length());
       
  3627 
       
  3628 					u8_t rnd(0);
       
  3629 					// Create an error.
       
  3630 					status = rand.get_rand_bytes(
       
  3631 						&rnd,
       
  3632 						sizeof(rnd));
       
  3633 					if (status != eap_status_ok)
       
  3634 					{
       
  3635 						return EAP_STATUS_RETURN(m_am_tools, status);
       
  3636 					}
       
  3637 
       
  3638 					previous_data = data[index];
       
  3639 					data[index] ^= rnd;
       
  3640 				}
       
  3641 				while(previous_data == data[index]);
       
  3642 
       
  3643 				EAP_TRACE_DEBUG(
       
  3644 					m_am_tools,
       
  3645 					TRACE_FLAGS_DEFAULT,
       
  3646 					(EAPL("TEST: random_error(): packet_index 0x%08x:%lu, data[0x%04x] changed from 0x%02x to 0x%02x.\n"),
       
  3647 					this,
       
  3648 					packet_index,
       
  3649 					index,
       
  3650 					previous_data,
       
  3651 					data[index]));
       
  3652 
       
  3653 				error_generated = true;
       
  3654 			}
       
  3655 			break;
       
  3656 		case eap_random_error_type_change_packet_length_longer:
       
  3657 			{
       
  3658 				u8_t delta_length(0);
       
  3659 				i32_t new_length(0);
       
  3660 
       
  3661 				do
       
  3662 				{
       
  3663 					status = rand.get_rand_bytes(
       
  3664 						reinterpret_cast<u8_t *>(&delta_length),
       
  3665 						sizeof(delta_length));
       
  3666 					if (status != eap_status_ok)
       
  3667 					{
       
  3668 						return EAP_STATUS_RETURN(m_am_tools, status);
       
  3669 					}
       
  3670 
       
  3671 					new_length = static_cast<i32_t>(sent_packet->get_data_length()
       
  3672 													+ static_cast<i32_t>(delta_length));
       
  3673 				}
       
  3674 				while (new_length < static_cast<i32_t>(
       
  3675 						   eapol_ethernet_header_wr_c::get_header_length())
       
  3676 					|| new_length > static_cast<i32_t>(sent_packet->get_buffer_length()));
       
  3677 
       
  3678 				EAP_TRACE_DEBUG(
       
  3679 					m_am_tools,
       
  3680 					TRACE_FLAGS_DEFAULT,
       
  3681 					(EAPL("TEST: random_error(): packet_index 0x%08x:%lu, packet length changed from %lu to %lu.\n"),
       
  3682 					this,
       
  3683 					packet_index,
       
  3684 					sent_packet->get_data_length(),
       
  3685 					new_length));
       
  3686 
       
  3687 				sent_packet->set_data_length(new_length);
       
  3688 
       
  3689 				error_generated = true;
       
  3690 			}
       
  3691 			break;
       
  3692 		case eap_random_error_type_change_packet_length_shorter:
       
  3693 			{
       
  3694 				u8_t delta_length(0);
       
  3695 				i32_t new_length(0);
       
  3696 
       
  3697 				do
       
  3698 				{
       
  3699 					status = rand.get_rand_bytes(
       
  3700 						reinterpret_cast<u8_t *>(&delta_length),
       
  3701 						sizeof(delta_length));
       
  3702 					if (status != eap_status_ok)
       
  3703 					{
       
  3704 						return EAP_STATUS_RETURN(m_am_tools, status);
       
  3705 					}
       
  3706 
       
  3707 					delta_length %= static_cast<i32_t>(
       
  3708 						sent_packet->get_data_length()
       
  3709 						- static_cast<i32_t>(eapol_ethernet_header_wr_c::get_header_length()));
       
  3710 
       
  3711 					if (delta_length == 0)
       
  3712 					{
       
  3713 						continue;
       
  3714 					}
       
  3715 
       
  3716 					new_length = static_cast<i32_t>(
       
  3717 						sent_packet->get_data_length() - static_cast<i32_t>(delta_length));
       
  3718 				}
       
  3719 				while (new_length < static_cast<i32_t>(
       
  3720 						   eapol_ethernet_header_wr_c::get_header_length())
       
  3721 					|| new_length > static_cast<i32_t>(sent_packet->get_buffer_length()));
       
  3722 
       
  3723 				EAP_TRACE_DEBUG(
       
  3724 					m_am_tools,
       
  3725 					TRACE_FLAGS_DEFAULT,
       
  3726 					(EAPL("TEST: random_error(): packet_index 0x%08x:%lu, packet length changed from %lu to %lu.\n"),
       
  3727 					this,
       
  3728 					packet_index,
       
  3729 					sent_packet->get_data_length(),
       
  3730 					new_length));
       
  3731 
       
  3732 				sent_packet->set_data_length(new_length);
       
  3733 
       
  3734 				error_generated = true;
       
  3735 			}
       
  3736 			break;
       
  3737 		default:
       
  3738 			User::Panic(_L("EAPOL"), 1);
       
  3739 			break;
       
  3740 		}
       
  3741 	}
       
  3742 
       
  3743 	if (error_generated == true)
       
  3744 	{
       
  3745 		sent_packet->set_is_manipulated();
       
  3746 	}
       
  3747 
       
  3748 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3749 	return status;
       
  3750 }
       
  3751 
       
  3752 //--------------------------------------------------
       
  3753 
       
  3754 eap_status_e eapol_am_core_symbian_c::create_upper_stack()
       
  3755 {
       
  3756 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3757 	
       
  3758 	EAP_TRACE_DEBUG(
       
  3759 		m_am_tools,
       
  3760 		TRACE_FLAGS_DEFAULT,
       
  3761 		(EAPL("eapol_am_core_symbian_c::create_upper_stack()\n")));
       
  3762 
       
  3763 	eap_status_e status(eap_status_ok);
       
  3764 
       
  3765 	if (m_ethernet_core == 0)
       
  3766 	{        
       
  3767 		m_ethernet_core = new ethernet_core_c(m_am_tools, this, m_is_client);
       
  3768 		if (m_ethernet_core == 0
       
  3769 			|| m_ethernet_core->get_is_valid() != true)
       
  3770 		{
       
  3771 			if (m_ethernet_core != 0)
       
  3772 			{
       
  3773 				m_ethernet_core->shutdown();
       
  3774 				delete m_ethernet_core;
       
  3775 				m_ethernet_core = 0;							
       
  3776 			}			
       
  3777 			EAP_TRACE_ERROR(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("Stack creation failed.\n")));			
       
  3778 			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
  3779 			return EAP_STATUS_RETURN(m_am_tools, eap_status_process_general_error);	
       
  3780 		}
       
  3781 
       
  3782 		// Initialise upper stack
       
  3783 		status = m_ethernet_core->configure();
       
  3784 		
       
  3785 		if (status != eap_status_ok)
       
  3786 		{
       
  3787 			m_ethernet_core->shutdown();
       
  3788 			delete m_ethernet_core;
       
  3789 			m_ethernet_core = 0;							
       
  3790 
       
  3791 			EAP_TRACE_ERROR(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("Stack creation failed.\n")));			
       
  3792 			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
  3793 			return EAP_STATUS_RETURN(m_am_tools, eap_status_process_general_error);	
       
  3794 		}
       
  3795 	}
       
  3796 	else
       
  3797 	{			
       
  3798 		status = eap_status_already_exists;
       
  3799 	}
       
  3800 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3801 	return status;	
       
  3802 }
       
  3803 
       
  3804 //--------------------------------------------------
       
  3805 
       
  3806 eap_status_e eapol_am_core_symbian_c::add_rogue_ap(
       
  3807 	eap_array_c<eap_rogue_ap_entry_c> & rogue_ap_list)
       
  3808 {
       
  3809 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
  3810 	
       
  3811 	EAP_TRACE_DEBUG(
       
  3812 		m_am_tools,
       
  3813 		TRACE_FLAGS_DEFAULT,
       
  3814 		(EAPL("eapol_am_core_symbian_c::add_rogue_ap()\n")));
       
  3815 
       
  3816 	TInt err(KErrNone);
       
  3817 	eap_rogue_ap_entry_c* entry = 0;
       
  3818 
       
  3819 	TMacAddress mac;
       
  3820 
       
  3821 	TRogueType type;
       
  3822 
       
  3823 	for (u32_t i = 0; i < rogue_ap_list.get_object_count(); i++)
       
  3824 	{
       
  3825 		entry = rogue_ap_list.get_object(i);
       
  3826 
       
  3827 		entry->get_mac_address(mac.iMacAddress);
       
  3828 
       
  3829 		EAP_TRACE_DEBUG(
       
  3830 			m_am_tools,
       
  3831 			TRACE_FLAGS_DEFAULT,
       
  3832 			(EAPL("Adding rogue AP - type: %d\n"),
       
  3833 			entry->get_rogue_reason()));
       
  3834 		EAP_TRACE_DATA_DEBUG(
       
  3835 			m_am_tools, 
       
  3836 			TRACE_FLAGS_DEFAULT, 
       
  3837 			(EAPL("Rogue MAC address"),
       
  3838 			mac.iMacAddress,
       
  3839 			KMacAddressLength));
       
  3840 
       
  3841 		switch (entry->get_rogue_reason())
       
  3842 		{
       
  3843 		case rogue_ap_none:
       
  3844 			// Ignore this
       
  3845 			continue;
       
  3846 		case rogue_ap_association_failed:
       
  3847 			type = EInvalidAuthenticationType;
       
  3848 			break;
       
  3849 		case rogue_ap_timeout:
       
  3850 			type = EAuthenticationTimeout;
       
  3851 			break;
       
  3852 		case rogue_ap_challenge_to_client_failed:
       
  3853 			type = EChallengeFromAPFailed;
       
  3854 			break;
       
  3855 		case rogue_ap_challenge_to_ap_failed:
       
  3856 			type = EChallengeToAPFailed;
       
  3857 			break;
       
  3858 		default:
       
  3859 			// ignore others
       
  3860 			continue;
       
  3861 		}
       
  3862 
       
  3863 		err = m_partner->AddRogueAP(mac, type);
       
  3864 		if (err != KErrNone)
       
  3865 		{
       
  3866 			break;
       
  3867 		}
       
  3868 	}
       
  3869 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);	
       
  3870 	return EAP_STATUS_RETURN(m_am_tools, m_am_tools->convert_am_error_to_eapol_error(err));
       
  3871 }
       
  3872 
       
  3873 //--------------------------------------------------
       
  3874 
       
  3875 void eapol_am_core_symbian_c::RetrievePSKL(TPSKEntry& entry)
       
  3876 {
       
  3877 	HBufC* sqlbuf = HBufC::NewLC(KMaxSqlQueryLength);
       
  3878 	TPtr sqlStatement = sqlbuf->Des();
       
  3879 
       
  3880 	RDbView view;
       
  3881 
       
  3882 	_LIT(KSQL, "SELECT %S, %S, %S, %S, %S FROM %S WHERE %S=%d AND %S=%d");
       
  3883 
       
  3884 	sqlStatement.Format(KSQL, &KServiceType, &KServiceIndex, &KSSID, &KPassword, &KPSK,
       
  3885 		&KEapolPSKTableName, &KServiceType, entry.indexType, &KServiceIndex, entry.index);
       
  3886 		
       
  3887 	User::LeaveIfError(view.Prepare(m_database, TDbQuery(sqlStatement), TDbWindow::EUnlimited));
       
  3888 	CleanupClosePushL(view);
       
  3889 	User::LeaveIfError(view.EvaluateAll());	
       
  3890 
       
  3891 	TInt rows = view.CountL();
       
  3892 	
       
  3893 	if (rows == 0)
       
  3894 	{
       
  3895 		// No saved PSK
       
  3896 		User::Leave(KErrNotFound);
       
  3897 	}
       
  3898 	view.FirstL();
       
  3899 	view.GetL();
       
  3900 
       
  3901 	entry.ssid.Copy(view.ColDes8(3));
       
  3902 	entry.password.Copy(view.ColDes8(4));
       
  3903 	entry.psk.Copy(view.ColDes8(5));
       
  3904 
       
  3905 	CleanupStack::PopAndDestroy(2); // view, buf
       
  3906 }
       
  3907 
       
  3908 //--------------------------------------------------
       
  3909 
       
  3910 void eapol_am_core_symbian_c::SavePSKL(TPSKEntry& entry)
       
  3911 {
       
  3912 	// Connect to CommDBif so that we can delete PSK entries that have no IAP associated anymore.
       
  3913 	CWLanSettings* wlan = new(ELeave) CWLanSettings;
       
  3914 	CleanupStack::PushL(wlan);
       
  3915 	
       
  3916 	SWLANSettings wlanSettings;
       
  3917 
       
  3918 	if (wlan->Connect() != KErrNone)
       
  3919 	{
       
  3920 		// Could not connect to CommDB			
       
  3921 		User::Leave(KErrCouldNotConnect);
       
  3922 	}
       
  3923 
       
  3924 	HBufC* sqlbuf = HBufC::NewLC(KMaxSqlQueryLength);
       
  3925 	TPtr sqlStatement = sqlbuf->Des();
       
  3926 
       
  3927 	RDbView view;
       
  3928 
       
  3929 	_LIT(KSQL, "SELECT %S, %S, %S, %S, %S FROM %S");
       
  3930 	
       
  3931 	sqlStatement.Format(KSQL, &KServiceType, &KServiceIndex, &KSSID, &KPassword, &KPSK,
       
  3932 		&KEapolPSKTableName);
       
  3933 
       
  3934 	User::LeaveIfError(view.Prepare(m_database, TDbQuery(sqlStatement), TDbWindow::EUnlimited));	
       
  3935 	CleanupClosePushL(view);
       
  3936 	User::LeaveIfError(view.EvaluateAll());
       
  3937 
       
  3938 	// Get column set so we get the correct column numbers
       
  3939 	CDbColSet* colSet = view.ColSetL();		
       
  3940 	CleanupStack::PushL(colSet);
       
  3941 
       
  3942 	// Delete old row and also rows that have no associated IAP settings.
       
  3943 	if (view.FirstL())
       
  3944 	{		
       
  3945 		do {
       
  3946 			view.GetL();
       
  3947 
       
  3948 			if ((wlan->GetWlanSettingsForService(view.ColUint32(colSet->ColNo(KServiceIndex)), wlanSettings) != KErrNone)
       
  3949 				|| (view.ColUint32(colSet->ColNo(KServiceType)) == static_cast<TUint>(entry.indexType)
       
  3950 					&& view.ColUint32(colSet->ColNo(KServiceIndex)) == static_cast<TUint>(entry.index)))
       
  3951 			{	
       
  3952 				// Not found or current IAP
       
  3953 				view.DeleteL();	
       
  3954 			}
       
  3955 			
       
  3956 		} while (view.NextL() != EFalse);
       
  3957 	}
       
  3958 
       
  3959 	wlan->Disconnect();
       
  3960 		
       
  3961 	view.InsertL();
       
  3962 	
       
  3963 	view.SetColL(colSet->ColNo(KServiceType), (TUint)entry.indexType);
       
  3964 	view.SetColL(colSet->ColNo(KServiceIndex), (TUint)entry.index);
       
  3965 	view.SetColL(colSet->ColNo(KSSID), entry.ssid);
       
  3966 	view.SetColL(colSet->ColNo(KPassword), entry.password);
       
  3967 	view.SetColL(colSet->ColNo(KPSK), entry.psk);	
       
  3968 		
       
  3969 	view.PutL();
       
  3970 	
       
  3971 	CleanupStack::PopAndDestroy( colSet ); // Delete colSet.	
       
  3972 
       
  3973 	CleanupStack::PopAndDestroy(3); // CWLanSettings, session, database
       
  3974 
       
  3975 }
       
  3976 
       
  3977 														 
       
  3978 //--------------------------------------------------				
       
  3979 
       
  3980 
       
  3981 // End of file