networkcontrol/qoslib/src/qosselector.cpp
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkcontrol/qoslib/src/qosselector.cpp	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,452 @@
+// Copyright (c) 2003-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 "qoslib.h"
+
+
+const TUint KMaxPort = 65535;
+
+//
+// TQoSSelector
+//
+
+/**
+Constructor. 
+
+Initialises all variables to specified, but null, values. 
+@publishedPartner
+@released
+@capability NetworkControl Restrict QoS policy operations because they may 
+affect several data flows.
+*/
+//lint -e{1927} would like some of the following to be in initializer list!
+EXPORT_C TQoSSelector::TQoSSelector()
+	{
+	iSrc.SetAddress(KInet6AddrNone);
+	iDst.SetAddress(KInet6AddrNone);
+	iSrcMask.SetAddress(KInet6AddrNone);
+	iDstMask.SetAddress(KInet6AddrNone);
+	iProtocol = 0;
+	iSrcPortMax = 0;
+	iDstPortMax = 0;
+	iIapId = 0;
+	}
+
+/** 
+Compares if the selectors are equal.
+
+@publishedPartner
+@released
+@capability NetworkControl Restrict QoS policy operations because they may 
+affect several data flows.
+@param aSelector TQoSSelector object that is compared with this object.
+@return ETrue, if selectors are equal to this object; otherwise, EFalse. 
+*/
+EXPORT_C TInt TQoSSelector::operator==(const TQoSSelector& aSelector) const
+	{
+	if (iProtocol == aSelector.Protocol() && iSrcPortMax == aSelector.MaxPortSrc() &&
+		iDstPortMax == aSelector.MaxPortDst() && iIapId == (TUint)aSelector.IapId() &&
+		iSrc.CmpAddr(aSelector.GetSrc()) && iDst.CmpAddr(aSelector.GetDst()))
+		return TRUE;
+	else
+		return FALSE;
+	}
+
+/** 
+Compares if the selector matches aSocket. 
+
+@publishedPartner
+@released
+@capability NetworkControl Restrict QoS policy operations because they may 
+affect several data flows.
+@param aSocket RSocket that is compared with this object.
+@return ETrue, if selector created from aSocket is equal to this object; 
+otherwise, EFalse. 
+*/
+EXPORT_C TBool TQoSSelector::Match(RSocket& aSocket) const
+	{
+	TQoSSelector sel;
+	TInt ret = sel.SetAddr(aSocket);
+	if (ret!=KErrNone)
+		return EFalse;
+	return (*this == sel);
+	}
+
+/**
+Sets the addresses for selector.
+
+@publishedPartner
+@released
+@capability NetworkControl Restrict QoS policy operations because they may 
+affect several data flows.
+@param aSrcAddr Source address. Port must have value <= 65535 
+(0 is used as uspecified value for a port).
+@param aSrcAddrMask Source address mask. Port must have value <= 65535 
+(0 is used as uspecified value for a port).
+@param aDstAddr Destination address. Port must have value <= 65535 
+(0 is used as uspecified value for a port).
+@param aDstAddrMask Destination address mask. Port must have value <= 65535
+(0 is used as uspecified value for a port).
+@param aProtocol Protocol ID.
+@param aSrcPortMax Maximum source port. Must have value <= 65535 
+(0 is used as uspecified value for a port).
+@param aDstPortMax Maximum destination port. Must have value <= 65535 
+(0 is used as uspecified value for a port).
+@return KErrNone, if parameters have valid values; otherwise, KErrArgument.
+*/
+EXPORT_C TInt TQoSSelector::SetAddr(const TInetAddr& aSrcAddr, 
+									const TInetAddr& aSrcAddrMask, 
+									const TInetAddr& aDstAddr, 
+									const TInetAddr& aDstAddrMask, 
+									TUint aProtocol, 
+									TUint aSrcPortMax, 
+									TUint aDstPortMax)
+	{
+	if (aSrcAddr.Port() > KMaxPort || aDstAddr.Port() > KMaxPort || 
+		aSrcPortMax > KMaxPort || aDstPortMax > KMaxPort)
+		return KErrArgument;
+
+	iSrc = aSrcAddr;
+	iDst = aDstAddr;
+
+	iSrcMask = aSrcAddrMask;
+	iDstMask = aDstAddrMask;
+	iProtocol = aProtocol;
+	iSrcPortMax = aSrcPortMax;
+	iDstPortMax = aDstPortMax;
+	iIapId = 0;
+	return KErrNone;
+	}
+
+//lint -e{708} does not like union initializers
+const TIp6Addr KInet6AddrMask = {{{0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+								  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}}};
+
+//
+// RSocket must be connected before this!!
+//
+/**
+Sets the addresses for selector. 
+ 
+RSocket is used to fetch addresses and ports for a selector. 
+The resulting selector will match only for one socket. 
+ 
+Note that RSocket::Connect() must be called before calling this function.
+
+@publishedPartner
+@released
+@capability NetworkControl Restrict QoS policy operations because they may 
+affect several data flows.
+@param aSocket RSocket object that is used to set the selector variables. 
+Note: RSocket must be connected
+@return KErrNone, if parameters have valid values; otherwise, KErrArgument.
+*/
+EXPORT_C TInt TQoSSelector::SetAddr(RSocket& aSocket)
+	{
+	TSockAddr aRemoteAddr, aLocalAddr;
+	TProtocolDesc aDesc;
+	aSocket.LocalName(aLocalAddr);
+	aSocket.RemoteName(aRemoteAddr);
+
+	if (aLocalAddr.Port() < 1 || aLocalAddr.Port() > KMaxPort)
+		return KErrArgument;
+	if (aRemoteAddr.Port() < 1 || aRemoteAddr.Port() > KMaxPort)
+		return KErrArgument;
+	if (iDst.Family() == KAFUnspec)
+		return KErrArgument;
+
+	iSrc = TInetAddr(aLocalAddr);
+	iDst = TInetAddr(aRemoteAddr);
+
+	// Srcaddr is not used when a selector is made from RSocket: 
+	// srcaddr might not be set in Connect()
+	iSrc.SetFamily(KAFUnspec);
+	iSrc.SetAddress(KInet6AddrNone);
+
+	if (iDst.Family() == KAfInet)
+		iDst.ConvertToV4Mapped();
+	//
+	// Set prefixes.
+	//
+	iSrcMask.SetAddress(KInet6AddrMask);
+	iDstMask.SetAddress(KInet6AddrMask);
+
+	iSrcPortMax = iSrc.Port();
+	iDstPortMax = iDst.Port();
+	aSocket.Info(aDesc);
+	iProtocol = aDesc.iProtocol;
+	return KErrNone;
+	}
+
+/**
+Sets the source address for selector.
+
+@publishedPartner
+@released
+@capability NetworkControl Restrict QoS policy operations because they may 
+affect several data flows.
+@param aAddr Source address. Port must have value <= 65535 (0 is used as 
+uspecified value for a port).
+@return KErrNone, if parameters have valid values; otherwise, KErrArgument.
+*/
+EXPORT_C TInt TQoSSelector::SetSrc(const TInetAddr& aAddr)
+	{
+	if (aAddr.Port() > KMaxPort)
+		return KErrArgument;
+	iSrc = aAddr;
+	return KErrNone;
+	}
+
+/**
+Sets the destination address for selector.
+
+@publishedPartner
+@released
+@capability NetworkControl Restrict QoS policy operations because they may 
+affect several data flows.
+@param aAddr Destination address. Port must have value <= 65535 (0 is used 
+as uspecified value for a port).
+@return KErrNone, if parameters have valid values; otherwise, KErrArgument.
+*/
+EXPORT_C TInt TQoSSelector::SetDst(const TInetAddr& aAddr)
+	{
+	if (aAddr.Port() > KMaxPort)
+		return KErrArgument;
+	iDst = aAddr;
+	return KErrNone;
+	}
+
+/**
+Gets the current source address.
+
+@publishedPartner
+@released
+@capability NetworkControl Restrict QoS policy operations because they may 
+affect several data flows.
+@return Source address.
+*/
+EXPORT_C TInetAddr TQoSSelector::GetSrc() const
+	{
+	return iSrc;
+	}
+
+/**
+Gets the current destination address.
+
+@publishedPartner
+@released
+@capability NetworkControl Restrict QoS policy operations because they may 
+affect several data flows.
+@return Destination address.
+*/
+EXPORT_C TInetAddr TQoSSelector::GetDst() const
+	{
+	return iDst;
+	}
+
+/**
+Sets the source address mask.
+
+@publishedPartner
+@released
+@capability NetworkControl Restrict QoS policy operations because they may 
+affect several data flows.
+@param aMask Source address mask. Port must have value <= 65535 (0 is used 
+as uspecified value for a port).
+@return KErrNone, if parameters have valid values; otherwise, KErrArgument.
+*/
+EXPORT_C TInt TQoSSelector::SetSrcMask(const TInetAddr& aMask)
+	{
+	if (aMask.Port() > KMaxPort)
+		return KErrArgument;
+	iSrcMask = aMask;
+	return KErrNone;
+	}
+
+/**
+Gets the current source address mask.
+
+@publishedPartner
+@released
+@capability NetworkControl Restrict QoS policy operations because they may 
+affect several data flows.
+@return Source address mask.
+*/
+EXPORT_C TInetAddr TQoSSelector::GetSrcMask() const
+	{
+	return iSrcMask;
+	}
+
+/**
+Sets the destination address mask.
+
+@publishedPartner
+@released
+@capability NetworkControl Restrict QoS policy operations because they may 
+affect several data flows.
+@param aMask Destination address mask. Port must have value <= 65535 (0 is 
+used as uspecified value for a port).
+@return KErrNone, if parameters have valid values; otherwise, KErrArgument.
+*/
+EXPORT_C TInt TQoSSelector::SetDstMask(const TInetAddr& aMask)
+	{
+	if (aMask.Port() > KMaxPort)
+		return KErrArgument;
+	iDstMask = aMask;
+	return KErrNone;
+	}
+
+/**
+Gets the current destination address mask.
+
+@publishedPartner
+@released
+@capability NetworkControl Restrict QoS policy operations because they may 
+affect several data flows.
+@return Destination address mask.
+*/
+EXPORT_C TInetAddr TQoSSelector::GetDstMask() const
+	{
+	return iDstMask;
+	}
+
+/**
+Sets the Internet access point identifier. 
+
+0 is used as unspecified value.
+
+@publishedPartner
+@released
+@capability NetworkControl Restrict QoS policy operations because they may 
+affect several data flows.
+@param aIapId Value to which to set the IapId.
+*/
+EXPORT_C void TQoSSelector::SetIapId(TInt aIapId)
+	{
+	iIapId = aIapId;
+	}
+
+/**
+Gets the current Internet access point identifier.
+
+@publishedPartner
+@released
+@capability NetworkControl Restrict QoS policy operations because they may 
+affect several data flows.
+@return Internet access point identifier.
+*/
+EXPORT_C TInt TQoSSelector::IapId() const
+	{
+	return iIapId;
+	}
+
+/**
+Sets the protocol identifier. 
+
+0 is used as unspecified value.
+
+@publishedPartner
+@released
+@capability NetworkControl Restrict QoS policy operations because they may 
+affect several data flows.
+@param aProtocol Value to which to set the protocol ID.
+*/
+EXPORT_C void TQoSSelector::SetProtocol(TUint aProtocol)
+	{
+	iProtocol = aProtocol;
+	}
+
+/**
+Gets the current protocol identifier.
+
+@publishedPartner
+@released
+@capability NetworkControl Restrict QoS policy operations because they may 
+affect several data flows.
+@return Protocol identifier.
+*/
+EXPORT_C TUint TQoSSelector::Protocol() const
+	{
+	return iProtocol;
+	}
+
+/**
+Sets the maximum source port. 
+
+Port must have value <= 65535 (0 is used as unspecified value).
+
+@publishedPartner
+@released
+@capability NetworkControl Restrict QoS policy operations because they may 
+affect several data flows.
+@param aMaxPort Value to which to set maximum source port.
+@return KErrNone, if aMaxPort has valid values; otherwise, KErrArgument.
+*/
+EXPORT_C TInt TQoSSelector::SetMaxPortSrc(TUint aMaxPort)
+	{
+	if (aMaxPort > KMaxPort)
+		return KErrArgument;
+	iSrcPortMax = aMaxPort;
+	return KErrNone;
+	}
+
+/**
+Sets the maximum destination port. 
+
+Port must have value <= 65535 (0 is used as unspecified value).
+
+@publishedPartner
+@released
+@capability NetworkControl Restrict QoS policy operations because they may 
+affect several data flows.
+@param aMaxPort Value to which to set maximum destination port.
+@return KErrNone, if aMaxPort has valid values; otherwise, KErrArgument.
+*/
+EXPORT_C TInt TQoSSelector::SetMaxPortDst(TUint aMaxPort)
+	{
+	if (aMaxPort > KMaxPort)
+		return KErrArgument;
+	iDstPortMax = aMaxPort;
+	return KErrNone;
+	}
+
+/**
+Gets the maximum source port.
+
+@publishedPartner
+@released
+@capability NetworkControl Restrict QoS policy operations because they may 
+affect several data flows.
+@return Maximum source port.
+*/
+EXPORT_C TUint TQoSSelector::MaxPortSrc() const
+	{
+	return iSrcPortMax;
+	}
+
+/**
+Gets the maximum destination port.
+
+@publishedPartner
+@released
+@capability NetworkControl Restrict QoS policy operations because they may 
+affect several data flows.
+@return Maximum destination port.
+*/
+EXPORT_C TUint TQoSSelector::MaxPortDst() const
+	{
+	return iDstPortMax;
+	}
+