diff -r 000000000000 -r af10295192d8 linklayerprotocols/ethernetpacketdriver/MacSet/MacSet.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/linklayerprotocols/ethernetpacketdriver/MacSet/MacSet.cpp Tue Jan 26 15:23:49 2010 +0200 @@ -0,0 +1,253 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include +#include +#include +#include +#include + +#include +#include + +GLDEF_D RTest gTest(_L("macset utility")); +GLDEF_D RFs gFs; +GLDEF_D RPcmNetCardIf card; + + +#define PDD_NAME _L("EtherSMC") +#define LDD_NAME _L("EtherCard") + +LOCAL_C void ReadMac() +// +// Dump narrow text file to console, comms & debug (WINS) +// + { + TBuf8<32> config; + + // MAC Address starts at the 4th byte + config.SetMax(); + card.GetConfig(config); + + gTest.Printf(_L("Ethernet Status :")); + if (config[0] == KEthCardReady) + gTest.Printf(_L(" Ready\n")); + else + gTest.Printf(_L(" NOT Ready\n")); + + gTest.Printf(_L("Ethernet Speed :")); + switch (config[1]) + { + case KEthSpeedUnknown: + gTest.Printf(_L(" Unknown\n")); + break; + case KEthSpeedAuto: + gTest.Printf(_L(" Auto\n")); + break; + case KEthSpeed10BaseT: + gTest.Printf(_L(" 10 MBit\n")); + break; + case KEthSpeed100BaseTX: + gTest.Printf(_L(" 100 MBit\n")); + break; + default: + gTest.Printf(_L(" ERROR\n")); + } + + gTest.Printf(_L("Duplex Setting :")); + switch (config[2]) + { + case KEthDuplexUnknown: + gTest.Printf(_L(" Unknown\n")); + break; + case KEthDuplexAuto: + gTest.Printf(_L(" Auto\n")); + break; + case KEthDuplexFull: + gTest.Printf(_L(" Full\n")); + break; + case KEthDuplexHalf: + gTest.Printf(_L(" Half\n")); + break; + default: + gTest.Printf(_L(" ERROR\n")); + } + + gTest.Printf(_L("MAC :")); + gTest.Printf(_L(" %2x:%2x:%2x:%2x:%2x:%2x\n\n"), + config[3], config[4], + config[5], config[6], + config[7], config[8]); + } + +LOCAL_C void WriteMac() +// +// Write the new mac address to the card +// + { + TBuf8<8> ioctlBuf; + TRequestStatus status; + TBuf<20> validChars(_L("0123456789abcdef")); + TUint8 value; + TUint8 upper=0; + TChar c; + TInt pos; + + // Obtain command line parameters + TPtrC option; + + CCommandLineArguments* args = CCommandLineArguments::NewLC(); + + if (args->Count() > 2) + { + option.Set(args->Arg(1)); + + if(!option.CompareF(_L("-S"))) + { + ioctlBuf.SetLength(7); + ioctlBuf[0] = KIoControlSetMACAddress; + + for(int i = 0; i<6; i++) + { + c = args->Arg(2)[2*i]; + c.LowerCase(); + if((pos = validChars.Locate(c))==KErrNotFound) + { + pos = upper; + break; + } + upper = (TUint8)pos; + c = args->Arg(2)[(2*i)+1]; + c.LowerCase(); + if((pos = validChars.Locate(c))==KErrNotFound) + { + User::Leave(KErrNotFound); + } + value = (TUint8)pos; + value = (TUint8)((upper<<4) | value); + + ioctlBuf[i+1] = value; + } + + gTest.Printf(_L("\nSetting MAC to %2x:%2x:%2x:%2x:%2x:%2x\n"), + ioctlBuf[1], ioctlBuf[2], + ioctlBuf[3], ioctlBuf[4], + ioctlBuf[5], ioctlBuf[6]); + + card.IOControl(status,ioctlBuf); + gTest.Printf(_L("Done\n")); + } + else + { + gTest.Printf(_L("Invalid option")); + } + } + else + { + gTest.Printf(_L("Call with -s to set new MAC\n")); + gTest.Printf(_L(" eg. macset -s 102030405060\n")); + } + + CleanupStack::PopAndDestroy( /* args */ ); + } + + +LOCAL_C TInt InitGlobals() +// +// Initialise global variables. +// + { + TInt err; + TBuf8<8> ioctlBuf; + TRequestStatus status; + + err=User::LoadPhysicalDevice(PDD_NAME); + if (err!=KErrNone && err!=KErrAlreadyExists) + return(err); + err=User::LoadLogicalDevice(LDD_NAME ); + if (err!=KErrNone && err!=KErrAlreadyExists) + return(err); + + User::LeaveIfError(card.Open(card.VersionRequired(),0,NULL)); + ioctlBuf.SetLength(1); + ioctlBuf[0] = KIoControlGetStatus; + + card.IOControl(status,ioctlBuf); + if(ioctlBuf[0] != KEventPCCardReady) + { + card.Close(); + User::Leave(KErrNotReady); + } + + err=gFs.Connect(); + gTest(err==KErrNone); + + // Force console creation + gTest.Printf(_L("")); + + return KErrNone; + } + +LOCAL_C void DestroyGlobals() +// +// Free global variables +// + { + User::FreeLogicalDevice(_L("EtherCard")); + User::FreePhysicalDevice(_L("EtherCard.Smc")); + + gFs.Close(); + } + +LOCAL_C void RunMacSetL() +// +// Run all the tests +// + { + + TInt ret = InitGlobals(); + if(ret != KErrNone) + return; + + ReadMac(); + WriteMac(); + DestroyGlobals(); + } + +EXPORT_C TInt E32Main() +// +// Main +// + { + CTrapCleanup* cleanup = CTrapCleanup::New(); + CActiveScheduler* theActiveScheduler = new CActiveScheduler(); + CActiveScheduler::Install(theActiveScheduler); + + __UHEAP_MARK; + + TRAPD(err,RunMacSetL()); + if (err!=KErrNone) + gTest.Printf(_L("ERROR: Leave %d\n"),err); + + gTest.Printf(_L("Press any key ...\n")); + gTest.Getch(); + gTest.Close(); + + __UHEAP_MARKEND; + + delete cleanup; + delete theActiveScheduler; + return KErrNone; + }