linklayerprotocols/ethernetpacketdriver/MacSet/MacSet.cpp
changeset 0 af10295192d8
--- /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;
+    }