--- /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 <e32test.h>
+#include <f32file.h>
+#include <s32file.h>
+#include <c32comm.h>
+#include <bacline.h>
+
+#include <EtherCardApi.h>
+#include <EtherCardIoc.h>
+
+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;
+ }