linklayerprotocols/ethernetnif/IRLAN/IRFRAME.CPP
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/linklayerprotocols/ethernetnif/IRLAN/IRFRAME.CPP	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,748 @@
+// Copyright (c) 2004-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:
+// Started by Mal, September 1997
+// Irlan control frame construction and parsing 
+// 
+//
+
+/**
+ @file 
+*/
+
+#include <nifman.h>
+#include <nifvar.h>
+#include <nifutl.h>
+#include <es_mbuf.h>
+#include <ir_sock.h>
+#include "PKTDRV.H"
+#include "ETHINTER.H"
+#include "IRLAN.H"
+#include "IRLANUTL.H"
+#include "INTSOCK.H"
+#include "IRLANBUF.H"
+#include "IRLANDAT.H"
+
+#ifdef __TRACEWIN__
+  #include <log.h>
+#else
+  #define LOG(a)
+#endif
+
+#define IRLAN_GETPROVDINFO_NAME _L8("GetProviderInformation")
+#define IRLAN_MEDIA_PARAMETERNAME _L8("MEDIA")
+#define IRLAN_VERSION_PARAMETERNAME _L8("IRLAN_VER")
+#define IRLAN_FILTERTYPE_PARAMETERNAME _L8("FILTER_TYPE")
+#define IRLAN_FILTERMODE_PARAMETERNAME _L8("FILTER_MODE")
+#define IRLAN_FILTEROPERATION_PARAMETERNAME _L8("FILTER_OPERATION")
+#define IRLAN_FILTERENTRY_PARAMETERNAME _L8("FILTER_ENTRY")
+#define IRLAN_MAXFRAME_PARAMETERNAME _L8("MAX_FRAME")
+#define IRLAN_ACCESSTYPE_PARAMETERNAME _L8("ACCESS_TYPE")
+#define IRLAN_DATACHANNEL_PARAMETERNAME _L8("DATA_CHAN")
+#define IRLAN_CONARB_PARAMETERNAME _L8("CON_ARB")
+#define IRLAN_RECONNKEY_PARAMETERNAME _L8("RECONNECT_KEY")
+
+/** 
+Send a GetProviderInformation to remote machine.
+IRLAN COMMAND REQUEST FORMAT:     
+				1		  1		 +   up to 1020 
+			   Code	 ParamCount	      ParamList
+
+  ParamEntry :  1 	+	up to 255  +   2	 +  up to 1016
+		    NameLen	      Name		 ValLen		  Value
+@return KErrNone if Success otherwise any failure code.
+*/
+TInt CIrlanControlEngine::GetInfoCmd()
+{
+#ifdef __TRACEWIN__
+	LOG(Log::Printf(_L("IRLAN:	SEND GetInfoCmd\r\n")));
+#endif
+	RIrlanControlMBufChain cmd;
+	TRAPD(err,cmd.AllocL(KCommandFrameMinSize));
+	if (err!=KErrNone)
+		return err;
+	cmd.SetCommandCode(0);		// GetInfoCmd has code of 0.
+	TUint8 paramCount=0;		// Cannot have >256
+	cmd.SetParameterCount(paramCount);	// MEDIA and IRLAN_VER
+	SendIrlanControlFrame(cmd);
+	return KErrNone;
+}
+
+//class TIrlanReplyFields
+//	{
+//public:
+//	TBuf8<256> iParamName;
+//	TUint8 iParamNameLen;
+//	TBuf8<256> iParamValue;
+//	TInt16 iParamValueLen;
+//	};
+
+/**
+Send a GetProviderInfoReply to remote machine.
+IRLAN PARAMETER RESPONSE FORMAT:     
+				1		  1		 +   up to 1020 
+			   Code	 ParamCount	      ParamList
+
+  ParamEntry :  1 	+	up to 255  +   2	 +  up to 1016
+		    NameLen	      Name		 ValLen		  Value
+@return KErrNone if Success otherwise any failure code.
+*/
+TInt CIrlanControlEngine::GetInfoReply()
+{
+#ifdef __TRACEWIN__
+	LOG(Log::Printf(_L("IRLAN:	SEND GetInfoReply\r\n")));
+#endif
+	TPtrC8 name;
+	TPtrC8 value;
+	RIrlanControlMBufChain cmd;
+	TRAPD(err,cmd.AllocL(KCommandFrameMinSize+1+5+2+5+1+9+2+2));
+	if (err!=KErrNone)
+		return err;
+	cmd.SetCommandCode(0);		// GetInfoReply has code of 0.
+	TUint8 paramCount=2;		// Cannot have >256
+	cmd.SetParameterCount(paramCount);	// MEDIA and IRLAN_VER
+	TInt offset=0;
+
+	name.Set(IRLAN_MEDIA_PARAMETERNAME);
+	TUint8 namelen=TUint8(name.Length());
+	value.Set(_L8("802.3"));
+	TUint8 valuelen=TUint8(value.Length());
+	cmd.SetParameterNameLength(offset,namelen);
+	cmd.SetParameterName(offset+1,name);
+	offset+=namelen+1;
+	cmd.SetParameterValueLength(offset,valuelen);
+	cmd.SetParameterValue(offset+2,value);
+	offset+=valuelen+2;
+
+	name.Set(_L8("IRLAN_VERSION_PARAMETERNAME"));
+	namelen=TUint8(name.Length());
+	cmd.SetParameterNameLength(offset,namelen);
+	cmd.SetParameterName(offset+1,name);
+	offset+=namelen+1;
+	cmd.SetParameterValueLength(offset,2);
+	TBuf8<4> version;
+	version.SetLength(2);
+	version[0]=0x01;
+	version[1]=0x01;
+	cmd.SetParameterValue(offset+2,version);
+
+	//CIrlanParameter *param=NULL;
+	//TRAP(err,param=CIrlanParameter::NewL(name,0));
+	//iIrlanParameterList.AddLast(*param);
+	//offset+=nameLen+1;
+	//TInt16 valueLen=LittleEndian::Get16(&iRecvBufPtr[offset]);
+	//TPtr8 value(&iRecvBufPtr[offset+2],valueLen,valueLen);
+	//TRAP(err,param->AddParameterValueL(value,EIrlanParameterString));
+	//offset+=valueLen+2;
+	
+	SendIrlanResponseFrame(cmd);
+	return KErrNone;
+}
+
+/**
+Parse response from a GetProviderInformation to remote machine.
+IRLAN PARAMETER RESPONSE FORMAT:     
+				1		  1		 +   up to 1020 
+			   Code	 ParamCount	      ParamList
+
+  ParamEntry :  1 	+	up to 255  +   2	 +  up to 1016
+		    NameLen	      Name		 ValLen		  Value
+*/
+void CIrlanControlEngine::ParseInfoReply()
+{
+	TInt err;
+#ifdef __TRACEWIN__
+	LOG(Log::Printf(_L("IRLAN:	PARSE GetInfoReply\r\n")));
+	LOG(Log::HexDump(_S("IRLAN	"),_S("IRLAN	"),
+	  (TUint8 *)&iRecvBufPtr[0],iRecvBufPtr.Length()));
+#endif
+	TIrlanQueryResult result=TIrlanQueryResult(iRecvBufPtr[0]);
+	// Need to check this command code.
+	PrintResultCode(result);
+	TInt paramCount=iRecvBufPtr[1];
+	__ASSERT_DEBUG(paramCount==2,IrlanUtil::Fault(EIrlanInvalidParameterCount));
+	TInt offset=2;
+	for (TInt i=0;i<paramCount;i++)
+		{// Go through parsing for each parameter in turn.
+		TUint8 nameLen=iRecvBufPtr[offset];
+		TPtr8 name(&iRecvBufPtr[offset+1],nameLen,nameLen);
+//		__ASSERT_DEBUG(!name.MatchF(IRLAN_MEDIA_PARAMETERNAME),IrlanUtil::Fault(EIrlanInvalidParameter));
+		CIrlanParameter *param=NULL;
+		TRAP(err,param=CIrlanParameter::NewL(name,0));
+		iIrlanParameterList.AddLast(*param);
+		offset+=nameLen+1;
+		TInt16 valueLen=LittleEndian::Get16(&iRecvBufPtr[offset]);
+		TPtr8 value(&iRecvBufPtr[offset+2],valueLen,valueLen);
+		TRAP(err,param->AddParameterValueL(value,EIrlanParameterString));
+		offset+=valueLen+2;
+		}
+	iAwaitingResponse=EFalse;
+}
+
+/**
+Send a GetMediaCharacteristics to remote machine.
+IRLAN COMMAND REQUEST FORMAT:     
+				1		  1		 +   up to 1020 
+			   Code	 ParamCount	      ParamList
+
+  ParamEntry :  1 	+	up to 255  +   2	 +  up to 1016
+		    NameLen	      Name		 ValLen		  Value
+@return KErrNone if Success otherwise any failure code.
+*/
+TInt CIrlanControlEngine::GetMediaCmd()
+{
+#ifdef __TRACEWIN__
+	LOG(Log::Printf(_L("IRLAN:	SEND GetMediaCmd\r\n")));
+#endif
+	RIrlanControlMBufChain cmd;
+	TRAPD(err,cmd.AllocL(KMediaCommandFrameSize));
+	if (err!=KErrNone)
+		return err;
+	cmd.SetCommandCode(1);		// GetMediaCharacteristics has code of 1.
+	TUint8 paramCount=1;		// Cannot have >256
+	cmd.SetParameterCount(paramCount);	// MEDIA only
+	TInt offset=0;
+	// we want the "MEDIA" parameter.
+#ifdef __DEBUG__
+	CIrlanParameter* param=LookUpParameter(IRLAN_MEDIA_PARAMETERNAME);
+	__ASSERT_DEBUG(param,IrlanUtil::Fault(EIrlanInvalidParameter));
+	__ASSERT_DEBUG(param->LookUpParameterValue(_L("802.3"))!=NULL,
+	  IrlanUtil::Fault(EIrlanInvalidParameterValue));
+#endif
+	cmd.SetParameterNameLength(offset,5);
+	cmd.SetParameterName(offset+1,IRLAN_MEDIA_PARAMETERNAME);
+	offset+=5+1;
+//	TUint16 valueLen=iProviderInfoParam[0].iValueLength;
+	cmd.SetParameterValueLength(offset,5);
+	cmd.SetParameterValue(offset+2,_L8("802.3"));
+	SendIrlanControlFrame(cmd);
+	return KErrNone;
+}
+
+/**
+Send a GetProviderMediaReply to remote machine.
+IRLAN PARAMETER RESPONSE FORMAT:     
+				1		  1		 +   up to 1020 
+			   Code	 ParamCount	      ParamList
+
+  ParamEntry :  1 	+	up to 255  +   2	 +  up to 1016
+		    NameLen	      Name		 ValLen		  Value
+@return KErrNone if Success otherwise any failure code.
+*/
+TInt CIrlanControlEngine::GetMediaReply()
+{
+#ifdef __TRACEWIN__
+	LOG(Log::Printf(_L("IRLAN:	SEND GetMediaReply\r\n")));
+#endif
+	TPtrC8 name;
+	TPtrC8 value;
+	RIrlanControlMBufChain cmd;
+	TRAPD(err,cmd.AllocL(KCommandFrameMinSize+1+5+2+5+1+9+2+2));
+	if (err!=KErrNone)
+		return err;
+	cmd.SetCommandCode(0);		// GetInfoReply has code of 0.
+	TUint8 paramCount=2;		// Cannot have >256
+	cmd.SetParameterCount(paramCount);	// MEDIA and IRLAN_VER
+	TInt offset=0;
+
+	name.Set(IRLAN_MEDIA_PARAMETERNAME);
+	TUint8 namelen=TUint8(name.Length());
+	value.Set(_L8("802.3"));
+	TUint8 valuelen=TUint8(value.Length());
+	cmd.SetParameterNameLength(offset,namelen);
+	cmd.SetParameterName(offset+1,name);
+	offset+=namelen+1;
+	cmd.SetParameterValueLength(offset,valuelen);
+	cmd.SetParameterValue(offset+2,value);
+	offset+=valuelen+2;
+
+	name.Set(IRLAN_VERSION_PARAMETERNAME);
+	namelen=TUint8(name.Length());
+	cmd.SetParameterNameLength(offset,namelen);
+	cmd.SetParameterName(offset+1,name);
+	offset+=namelen+1;
+	cmd.SetParameterValueLength(offset,2);
+	TBuf8<4> version;
+	version.SetLength(2);
+	version[0]=0x01;
+	version[1]=0x01;
+	cmd.SetParameterValue(offset+2,version);
+
+	//CIrlanParameter *param=NULL;
+	//TRAP(err,param=CIrlanParameter::NewL(name,0));
+	//iIrlanParameterList.AddLast(*param);
+	//offset+=nameLen+1;
+	//TInt16 valueLen=LittleEndian::Get16(&iRecvBufPtr[offset]);
+	//TPtr8 value(&iRecvBufPtr[offset+2],valueLen,valueLen);
+	//TRAP(err,param->AddParameterValueL(value,EIrlanParameterString));
+	//offset+=valueLen+2;
+	
+	SendIrlanResponseFrame(cmd);
+	return KErrNone;
+}
+
+/**
+Parse a GetMediaCharacteristicsReply to Remote Machine.
+IRLAN INFO CMD FORMAT:     
+				1		  1		 +   up to 1020 
+			   Code	 ParamCount	      ParamList
+*/
+TInt CIrlanControlEngine::ParseMediaReply()
+{
+	TInt err;
+#ifdef __TRACEWIN__
+	LOG(Log::Printf(_L("IRLAN:	PARSE GetMediaCharacteristicsReply\r\n")));
+	LOG(Log::HexDump(_S("IRLAN	"),_S("IRLAN	"),
+	  (TUint8 *)&iRecvBufPtr[0],iRecvBufPtr.Length()));
+#endif
+	TIrlanQueryResult result=TIrlanQueryResult(iRecvBufPtr[0]);
+	// Need to check this command code.
+	PrintResultCode(result);
+	TInt paramCount=iRecvBufPtr[1];
+	if (paramCount<2 || paramCount>9)
+		return EIrlanInvalidParameterCount;
+	TInt offset=2;
+	CIrlanParameter *param=NULL;
+	for (TInt i=0;i<paramCount;i++)
+		{// Go through parsing for each parameter in turn.
+		TUint8 nameLen=iRecvBufPtr[offset];
+		TPtr8 name(&iRecvBufPtr[offset+1],nameLen,nameLen);
+//		__ASSERT_DEBUG(!name.MatchF(IRLAN_MEDIA_PARAMETERNAME),IrlanUtil::Fault(EIrlanInvalidParameter));
+		TRAP(err,param=CIrlanParameter::NewL(name,1));
+		if (param)
+			iIrlanParameterList.AddLast(*param);  // New Parameter.
+		else
+			param=LookUpParameter(name);
+		offset+=nameLen+1;
+		TInt16 valueLen=LittleEndian::Get16(&iRecvBufPtr[offset]);
+		TPtr8 value(&iRecvBufPtr[offset+2],valueLen,valueLen);
+		TRAP(err,param->AddParameterValueL(value,EIrlanParameterString));
+		offset+=valueLen+2;
+		}
+	param=LookUpParameter(IRLAN_ACCESSTYPE_PARAMETERNAME);
+	if (param == NULL) 
+		return EIrlanInvalidParameter;
+	CIrlanParameterValue *value=param->LookUpParameterValue();
+	if (value == NULL) 
+		return EIrlanInvalidParameterValue;
+	if (value->Match(_L8("DIRECT")))	// We have a simple Access Point IrLAN node
+		iAccessType=EAccessPoint;
+	else if (value->Match(_L8("PEER")))	// We are connecting to a Peer IrLAN device.
+		iAccessType=EPeerToPeer;
+	else if (value->Match(_L8("HOSTED")))	// We are connecting via IrLAN to a hosted computer.
+		iAccessType=EHosted;
+	else
+		return EIrlanInvalidIrlanMode;
+	iAwaitingResponse=EFalse;
+	return KErrNone;
+}
+
+/**
+Send a OpenDataCmd to remote machine.
+IRLAN COMMAND REQUEST FORMAT:     
+				1		  1		 +   up to 1020 
+			   Code	 ParamCount	      ParamList
+
+  ParamEntry :  1 	+	up to 255  +   2	 +  up to 1016
+		    NameLen	      Name		 ValLen		  Value
+
+@return KErrNone if Success otherwise any failure code.
+*/
+TInt CIrlanControlEngine::OpenDataCmd()
+{
+#ifdef __TRACEWIN__
+	LOG(Log::Printf(_L("IRLAN:	SEND OpenDataCmd\r\n")));
+#endif
+	RIrlanControlMBufChain cmd;
+	TRAPD(err,cmd.AllocL(KOpenDataCommandFrameSize));
+	if (err!=KErrNone)
+		return err;
+	cmd.SetCommandCode(2);		// OpenDataChannel has code of 1.
+	TUint8 paramCount=2;		// Cannot have >256
+	cmd.SetParameterCount(paramCount);	// MEDIA and ACCESS_TYPE
+	TInt offset=0;
+	// we want the "MEDIA" parameter.
+	CIrlanParameter* param=LookUpParameter(IRLAN_MEDIA_PARAMETERNAME);
+	__ASSERT_DEBUG(param,IrlanUtil::Fault(EIrlanInvalidParameter));
+	CIrlanParameterValue* value=param->LookUpParameterValue();
+	__ASSERT_DEBUG(value,IrlanUtil::Fault(EIrlanInvalidParameterValue));
+	cmd.SetParameterNameLength(offset,5);
+	cmd.SetParameterName(offset+1,IRLAN_MEDIA_PARAMETERNAME);
+	offset+=5+1;
+	TPtr8 ptr(NULL,0);
+	value->GetValue(ptr);
+	__ASSERT_DEBUG(TUint16(ptr.Length())==value->GetValueLength(),IrlanUtil::Fault(EIrlanInvalidParameter));
+	cmd.SetParameterValueLength(offset,value->GetValueLength());
+	cmd.SetParameterValue(offset+2,ptr);
+	offset+=ptr.Length()+2;
+	// now we want "ACCESS_TYPE" parameter.
+	param=LookUpParameter(IRLAN_ACCESSTYPE_PARAMETERNAME);
+	__ASSERT_DEBUG(param,IrlanUtil::Fault(EIrlanInvalidParameter));
+	value=param->LookUpParameterValue();
+	__ASSERT_DEBUG(value,IrlanUtil::Fault(EIrlanInvalidParameterValue));
+	cmd.SetParameterNameLength(offset,11);
+	cmd.SetParameterName(offset+1,IRLAN_ACCESSTYPE_PARAMETERNAME);
+	offset+=11+1;
+	value->GetValue(ptr);
+	cmd.SetParameterValueLength(offset,value->GetValueLength());
+	cmd.SetParameterValue(offset+2,ptr);
+
+	SendIrlanControlFrame(cmd);
+	return KErrNone;
+}
+
+/**
+Parse a OpenDataReply to Remote machine.
+IRLAN INFO CMD FORMAT:     
+				1		  1		 +   up to 1020 
+			   Code	 ParamCount	      ParamList
+*/
+void CIrlanControlEngine::ParseOpenDataReply()
+{
+	TInt err;
+#ifdef __TRACEWIN__
+	LOG(Log::Printf(_L("IRLAN:	PARSE OpenDataReply\r\n")));
+	LOG(Log::HexDump(_S("IRLAN	"),_S("IRLAN	"),
+	  (TUint8 *)&iRecvBufPtr[0],iRecvBufPtr.Length()));
+#endif
+	TIrlanQueryResult result=TIrlanQueryResult(iRecvBufPtr[0]);
+	// Need to check this command code.
+	PrintResultCode(result);
+	TInt paramCount=iRecvBufPtr[1];
+	__ASSERT_DEBUG(paramCount>=2 && paramCount<=3,IrlanUtil::Fault(EIrlanInvalidParameterCount));
+	TInt offset=2;
+	for (TInt i=0;i<paramCount;i++)
+		{// Go through parsing for each parameter in turn.
+		TUint8 nameLen=iRecvBufPtr[offset];
+		TPtr8 name(&iRecvBufPtr[offset+1],nameLen,nameLen);
+		CIrlanParameter *param=NULL;
+		TRAP(err,param=CIrlanParameter::NewL(name,2));
+		iIrlanParameterList.AddLast(*param);  // New Parameter.
+		offset+=nameLen+1;
+		TInt16 valueLen=LittleEndian::Get16(&iRecvBufPtr[offset]);
+		TPtr8 value(&iRecvBufPtr[offset+2],valueLen,valueLen);
+		if (param->Match(IRLAN_DATACHANNEL_PARAMETERNAME))
+			{
+			TRAP(err,param->AddParameterValueL(value,EIrlanParameterByte));
+			iIrlanDataPortNum=iRecvBufPtr[offset+2];
+			}
+		else if (param->Match(IRLAN_CONARB_PARAMETERNAME))
+			{
+			TRAP(err,param->AddParameterValueL(value,EIrlanParameterInteger));
+			}
+		else
+			{
+			__ASSERT_DEBUG(param->Match(IRLAN_RECONNKEY_PARAMETERNAME),
+			  IrlanUtil::Fault(EIrlanInvalidParameter));
+			TRAP(err,param->AddParameterValueL(value,EIrlanParameterString));
+			}
+		offset+=valueLen+2;
+		}
+	iAwaitingResponse=EFalse;
+}
+
+/**
+Send a GetFilterConfig to remote machine.
+IRLAN COMMAND REQUEST FORMAT:     
+				1		  1		 +   up to 1020 
+			   Code	 ParamCount	      ParamList
+
+  ParamEntry :  1 	+	up to 255  +   2	 +  up to 1016
+		    NameLen	      Name		 ValLen		  Value
+
+@return KErrNone if Success otherwise any failure code.
+*/
+TInt CIrlanControlEngine::GetDirectedFilterConfigCmd()
+{
+#ifdef __TRACEWIN__
+	LOG(Log::Printf(_L("IRLAN:	SEND GetDirectedFilterConfigCmd\r\n")));
+#endif
+	RIrlanControlMBufChain cmd;
+	TRAPD(err,cmd.AllocL(KFilterCommandMinFrameSize+26));
+	if (err!=KErrNone)
+		return err;
+	cmd.SetCommandCode(5);		// GetFilterConfig has code of 5
+	TUint8 paramCount=3;		// Cannot have >256
+	cmd.SetParameterCount(paramCount);	// DATA_CHAN,FILTER_TYPE and FILTER_OPERATION
+	TInt offset=0;
+	// we want the "DATA_CHAN" parameter.
+	CIrlanParameter* param=LookUpParameter(IRLAN_DATACHANNEL_PARAMETERNAME);
+	__ASSERT_DEBUG(param,IrlanUtil::Fault(EIrlanInvalidParameter));
+	CIrlanParameterValue* value=param->LookUpParameterValue();
+	__ASSERT_DEBUG(value,IrlanUtil::Fault(EIrlanInvalidParameterValue));
+	cmd.SetParameterNameLength(offset,9);
+	cmd.SetParameterName(offset+1,IRLAN_DATACHANNEL_PARAMETERNAME);
+	offset+=9+1;
+	TPtr8 ptr(NULL,0);
+	value->GetValue(ptr);
+	__ASSERT_DEBUG(TUint16(ptr.Length())==value->GetValueLength(),IrlanUtil::Fault(EIrlanInvalidParameter));
+	cmd.SetParameterValueLength(offset,value->GetValueLength());
+	cmd.SetParameterValue(offset+2,ptr);
+	offset+=ptr.Length()+2;
+	// now add the "FILTER_TYPE" parameter.
+	param=LookUpParameter(IRLAN_FILTERTYPE_PARAMETERNAME);
+	__ASSERT_DEBUG(param,IrlanUtil::Fault(EIrlanInvalidParameter));
+	value=param->LookUpParameterValue(_L8("DIRECTED"));
+	__ASSERT_DEBUG(value,IrlanUtil::Fault(EIrlanInvalidParameterValue));
+	cmd.SetParameterNameLength(offset,11);
+	cmd.SetParameterName(offset+1,IRLAN_FILTERTYPE_PARAMETERNAME);
+	offset+=11+1;
+	cmd.SetParameterValueLength(offset,8);
+	cmd.SetParameterValue(offset+2,_L8("DIRECTED"));
+	offset+=8+2;
+	// finally add the "FILTER_OPERATION" parameter
+	cmd.SetParameterNameLength(offset,16);
+	cmd.SetParameterName(offset+1,IRLAN_FILTEROPERATION_PARAMETERNAME);
+	offset+=16+1;
+	cmd.SetParameterValueLength(offset,7);
+	cmd.SetParameterValue(offset+2,_L8("DYNAMIC"));
+//	offset+=ptr.Length()+2;
+	SendIrlanControlFrame(cmd);
+	return KErrNone;
+}
+
+/**
+Parse a ParseDirectedFilterConfigReply to remote machine.
+IRLAN INFO CMD FORMAT:     
+				1		  1		 +   up to 1020 
+			   Code	 ParamCount	      ParamList
+*/
+void CIrlanControlEngine::ParseDirectedFilterConfigReply()
+{
+	TInt err;
+#ifdef __TRACEWIN__
+	LOG(Log::Printf(_L("IRLAN:	PARSE ParseDirectedFilterConfigReply\r\n")));
+	LOG(Log::HexDump(_S("IRLAN	"),_S("IRLAN	"),
+	  (TUint8 *)&iRecvBufPtr[0],iRecvBufPtr.Length()));
+#endif
+	TIrlanQueryResult result=TIrlanQueryResult(iRecvBufPtr[0]);
+	// Need to check this command code.
+	PrintResultCode(result);
+	TInt paramCount=iRecvBufPtr[1];
+	__ASSERT_DEBUG(paramCount>=0 && paramCount<=9,IrlanUtil::Fault(EIrlanInvalidParameterCount));
+	TInt offset=2;
+	for (TInt i=0;i<paramCount;i++)
+		{// Go through parsing for each parameter in turn.
+		TUint8 nameLen=iRecvBufPtr[offset];
+		TPtr8 name(&iRecvBufPtr[offset+1],nameLen,nameLen);
+		CIrlanParameter *param=NULL;
+		TRAP(err,param=CIrlanParameter::NewL(name,2));
+		iIrlanParameterList.AddLast(*param);  // New Parameter.
+		offset+=nameLen+1;
+		TInt16 valueLen=LittleEndian::Get16(&iRecvBufPtr[offset]);
+		TPtr8 value(&iRecvBufPtr[offset+2],valueLen,valueLen);
+		if (param->Match(IRLAN_FILTERENTRY_PARAMETERNAME))
+			{
+			TRAP(err,param->AddParameterValueL(value,EIrlanParameterOctetSeq));
+			TPtr8 dest(&iHWAddr[0],6,6);//ethint removes the first three bytes of 
+										//the mac address so add 3 bytes of padding	
+			dest.Copy(value);
+            iNotify->FoundMACAddr();
+			}
+		offset+=valueLen+2;
+		}
+	iAwaitingResponse=EFalse;
+}
+
+/**
+Send a GetFilterConfig to remote machine.
+IRLAN COMMAND REQUEST FORMAT:     
+				1		  1		 +   up to 1020 
+			   Code	 ParamCount	      ParamList
+
+  ParamEntry :  1 	+	up to 255  +   2	 +  up to 1016
+		    NameLen	      Name		 ValLen		  Value
+@return KErrNone if Success otherwise any failure code.
+*/
+TInt CIrlanControlEngine::SetDirectedFilterOperationCmd()
+{
+#ifdef __TRACEWIN__
+	LOG(Log::Printf(_L("IRLAN:	SEND SetDirectedFilterOperationCmd\r\n")));
+#endif
+	RIrlanControlMBufChain cmd;
+	TRAPD(err,cmd.AllocL(KFilterCommandMinFrameSize+20));
+	if (err!=KErrNone)
+		return err;
+	cmd.SetCommandCode(5);		// GetFilterConfig has code of 5
+	TUint8 paramCount=3;		// Cannot have >256
+	cmd.SetParameterCount(paramCount);	// DATA_CHAN,FILTER_TYPE and FILTER_MODE
+	TInt offset=0;
+	// we want the "DATA_CHAN" parameter.
+	CIrlanParameter* param=LookUpParameter(IRLAN_DATACHANNEL_PARAMETERNAME);
+	__ASSERT_DEBUG(param,IrlanUtil::Fault(EIrlanInvalidParameter));
+	CIrlanParameterValue* value=param->LookUpParameterValue();
+	__ASSERT_DEBUG(value,IrlanUtil::Fault(EIrlanInvalidParameterValue));
+	cmd.SetParameterNameLength(offset,9);
+	cmd.SetParameterName(offset+1,IRLAN_DATACHANNEL_PARAMETERNAME);
+	offset+=9+1;
+	TPtr8 ptr(NULL,0);
+	value->GetValue(ptr);
+	__ASSERT_DEBUG(TUint16(ptr.Length())==value->GetValueLength(),IrlanUtil::Fault(EIrlanInvalidParameter));
+	cmd.SetParameterValueLength(offset,value->GetValueLength());
+	cmd.SetParameterValue(offset+2,ptr);
+	offset+=ptr.Length()+2;
+	// now add the "FILTER_TYPE" parameter.
+	param=LookUpParameter(IRLAN_FILTERTYPE_PARAMETERNAME);
+	__ASSERT_DEBUG(param,IrlanUtil::Fault(EIrlanInvalidParameter));
+	value=param->LookUpParameterValue(_L8("DIRECTED"));
+	__ASSERT_DEBUG(value,IrlanUtil::Fault(EIrlanInvalidParameterValue));
+	cmd.SetParameterNameLength(offset,11);
+	cmd.SetParameterName(offset+1,IRLAN_FILTERTYPE_PARAMETERNAME);
+	offset+=11+1;
+	cmd.SetParameterValueLength(offset,8);
+	cmd.SetParameterValue(offset+2,_L8("DIRECTED"));
+	offset+=8+2;
+	// finally add the "FILTER_MODE" parameter
+	cmd.SetParameterNameLength(offset,11);
+	cmd.SetParameterName(offset+1,IRLAN_FILTERMODE_PARAMETERNAME);
+	offset+=11+1;
+	cmd.SetParameterValueLength(offset,6);
+	cmd.SetParameterValue(offset+2,_L8("FILTER"));
+//	offset+=ptr.Length()+2;
+	SendIrlanControlFrame(cmd);
+	return KErrNone;
+}
+
+/**
+Parse a ParseDirectedFilterOperationReply to remote machine.
+IRLAN INFO CMD FORMAT:     
+				1		  1		 +   up to 1020 
+			   Code	 ParamCount	      ParamList
+*/
+void CIrlanControlEngine::ParseDirectedFilterOperationReply()
+{
+#ifdef __TRACEWIN__
+	LOG(Log::Printf(_L("IRLAN:	PARSE ParseDirectedFilterOperationReply\r\n")));
+	LOG(Log::HexDump(_S("IRLAN	"),_S("IRLAN	"),
+	  (TUint8 *)&iRecvBufPtr[0],iRecvBufPtr.Length()));
+#endif
+	TIrlanQueryResult result=TIrlanQueryResult(iRecvBufPtr[0]);
+	// Need to check this command code.
+	PrintResultCode(result);
+	__ASSERT_DEBUG(!iRecvBufPtr[1],IrlanUtil::Fault(EIrlanInvalidParameterCount));
+	iAwaitingResponse=EFalse;
+
+}
+
+/**
+Send a GetFilterConfig to remote machine.
+IRLAN COMMAND REQUEST FORMAT:     
+				1		  1		 +   up to 1020 
+			   Code	 ParamCount	      ParamList
+
+  ParamEntry :  1 	+	up to 255  +   2	 +  up to 1016
+		    NameLen	      Name		 ValLen		  Value
+@return KErrNone if Success otherwise any failure code.
+*/
+TInt CIrlanControlEngine::SetBroadcastFilterOperationCmd()
+{
+#ifdef __TRACEWIN__
+	LOG(Log::Printf(_L("IRLAN:	SEND SetBroadcastFilterOperationCmd\r\n")));
+#endif
+	RIrlanControlMBufChain cmd;
+	TRAPD(err,cmd.AllocL(KFilterCommandMinFrameSize+21));
+	if (err!=KErrNone)
+		return err;
+	cmd.SetCommandCode(5);		// GetFilterConfig has code of 5
+	TUint8 paramCount=3;		// Cannot have >256
+	cmd.SetParameterCount(paramCount);	// DATA_CHAN,FILTER_TYPE and FILTER_MODE
+	TInt offset=0;
+	// we want the "DATA_CHAN" parameter.
+	CIrlanParameter* param=LookUpParameter(IRLAN_DATACHANNEL_PARAMETERNAME);
+	__ASSERT_DEBUG(param,IrlanUtil::Fault(EIrlanInvalidParameter));
+	CIrlanParameterValue* value=param->LookUpParameterValue();
+	__ASSERT_DEBUG(value,IrlanUtil::Fault(EIrlanInvalidParameterValue));
+	cmd.SetParameterNameLength(offset,9);
+	cmd.SetParameterName(offset+1,IRLAN_DATACHANNEL_PARAMETERNAME);
+	offset+=9+1;
+	TPtr8 ptr(NULL,0);
+	value->GetValue(ptr);
+	__ASSERT_DEBUG(TUint16(ptr.Length())==value->GetValueLength(),IrlanUtil::Fault(EIrlanInvalidParameter));
+	cmd.SetParameterValueLength(offset,value->GetValueLength());
+	cmd.SetParameterValue(offset+2,ptr);
+	offset+=ptr.Length()+2;
+	// now add the "FILTER_TYPE" parameter.
+	param=LookUpParameter(IRLAN_FILTERTYPE_PARAMETERNAME);
+	__ASSERT_DEBUG(param,IrlanUtil::Fault(EIrlanInvalidParameter));
+	value=param->LookUpParameterValue(_L8("DIRECTED"));
+	__ASSERT_DEBUG(value,IrlanUtil::Fault(EIrlanInvalidParameterValue));
+	cmd.SetParameterNameLength(offset,11);
+	cmd.SetParameterName(offset+1,IRLAN_FILTERTYPE_PARAMETERNAME);
+	offset+=11+1;
+	cmd.SetParameterValueLength(offset,9);
+	cmd.SetParameterValue(offset+2,_L8("BROADCAST"));
+	offset+=9+2;
+	// finally add the "FILTER_MODE" parameter
+	cmd.SetParameterNameLength(offset,11);
+	cmd.SetParameterName(offset+1,IRLAN_FILTERMODE_PARAMETERNAME);
+	offset+=11+1;
+	cmd.SetParameterValueLength(offset,6);
+	cmd.SetParameterValue(offset+2,_L8("FILTER"));
+//	offset+=ptr.Length()+2;
+	SendIrlanControlFrame(cmd);
+	return KErrNone;
+}
+
+/**
+Parse a ParseBroadcastFilterOperationReply to remote machine.
+IRLAN INFO CMD FORMAT:     
+				1		  1		 +   up to 1020 
+			   Code	 ParamCount	      ParamList
+*/
+void CIrlanControlEngine::ParseBroadcastFilterOperationReply()
+{
+#ifdef __TRACEWIN__
+	LOG(Log::Printf(_L("IRLAN:	PARSE ParseBroadcastFilterOperationReply\r\n")));
+	LOG(Log::HexDump(_S("IRLAN	"),_S("IRLAN	"),
+	  (TUint8 *)&iRecvBufPtr[0],iRecvBufPtr.Length()));
+#endif
+	TIrlanQueryResult result=TIrlanQueryResult(iRecvBufPtr[0]);
+	// Need to check this command code.
+	PrintResultCode(result);
+	__ASSERT_DEBUG(!iRecvBufPtr[1],IrlanUtil::Fault(EIrlanInvalidParameterCount));
+	iAwaitingResponse=EFalse;
+}
+
+/**
+Parse a GetInfoCmd.
+@internalComponent
+IRLAN INFO CMD FORMAT:     
+				1		  1		 +   up to 1020 
+			   Code	 ParamCount	      ParamList
+*/
+void CIrlanControlEngine::ParseControlCommand()
+{
+#ifdef __TRACEWIN__
+	LOG(Log::Printf(_L("IRLAN:	PARSE GetInfoCmd\r\n")));
+	LOG(Log::HexDump(_S("IRLAN	"),_S("IRLAN	"),
+	  (TUint8 *)&iRecvBufPtr[0],iRecvBufPtr.Length()));
+#endif
+	TIrlanCmdNumber cmd=TIrlanCmdNumber(iRecvBufPtr[0]);
+	// Need to check this command code.
+	switch (cmd)
+		{
+	case EGetProviderInfo:
+		GetInfoReply();
+		break;
+	case EGetMediaCharacteristics:
+		// first should be parsing the frame to check "MEDIA" field is "802.3"
+		GetMediaReply();
+		break;
+	case EOpenDataChannel:
+		//OpenDataReply();
+		iState=E_Open;
+		break;
+	default:
+		break;
+		}
+}