diff -r 000000000000 -r af10295192d8 networkcontrol/pfqoslib/src/pfqos_stream.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/networkcontrol/pfqoslib/src/pfqos_stream.cpp Tue Jan 26 15:23:49 2010 +0200 @@ -0,0 +1,320 @@ +// 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: +// + + +#include + +#include "pfqos_stream.h" + +EXPORT_C CPfqosStream::CPfqosStream() : iSendBuf(0,0) + { + iBuf=NULL; + } + +EXPORT_C void CPfqosStream::ConstructL(TUint aBufSize) + { + iBuf = HBufC8::NewL(aBufSize); + TPtr8 tmp(iBuf->Des()); + iSendBuf.Set(tmp); + } + +EXPORT_C CPfqosStream* CPfqosStream::NewL(TUint aBufSize) + { + CPfqosStream* msg = new (ELeave) CPfqosStream(); + CleanupStack::PushL(msg); + msg->ConstructL(aBufSize); + CleanupStack::Pop(); + return msg; + } + +EXPORT_C CPfqosStream::~CPfqosStream() + { + delete iBuf; + } + + +EXPORT_C void CPfqosStream::Init(TUint8 aMsgType, TUint32 aSeq) + { + struct pfqos_msg msg; + msg.pfqos_msg_version = KPfqosMsgV1; + msg.pfqos_msg_type = aMsgType; + msg.pfqos_msg_errno = 0; + msg.pfqos_msg_reserved = 0; + msg.pfqos_msg_seq = aSeq; + msg.pfqos_msg_pid = 0; + // All policies added by QoS API are dynamic! + msg.pfqos_msg_options = KPfqosOptionDynamic; + + iSendBuf.Zero(); + iSendBuf.SetLength(0); + iLength = msg.pfqos_msg_len = sizeof(struct pfqos_msg) / 8; + iSendBuf.Copy((TUint8 *)&msg, sizeof(struct pfqos_msg)); + } + + +EXPORT_C void CPfqosStream::AddSelector(TUint8 aProtocol, + const TUidType& aUid, TUint32 aPolicyType, TUint32 aIapId, + TUint32 aPriority, const TDesC& aName) + { + struct pfqos_selector ext; + const int byte_len = sizeof(struct pfqos_selector); + ext.pfqos_selector_len = (byte_len + 7) / 8; + ext.pfqos_ext_type = EPfqosExtSelector; + ext.protocol = aProtocol; + ext.uid1 = aUid[0].iUid; + ext.uid2 = aUid[1].iUid; + ext.uid3 = aUid[2].iUid; + ext.iap_id = aIapId; + ext.policy_type = aPolicyType; + ext.priority = aPriority; + ext.reserved = 0; + + TPtr8 namePtr((TUint8*)ext.name, 0, KMaxName); + if (namePtr.MaxLength() >= aName.Length()) + { + namePtr.Copy(aName); + } + namePtr.ZeroTerminate(); + + iSendBuf.Append((TUint8*)&ext, sizeof(ext)); + iSendBuf.AppendFill(0, ext.pfqos_selector_len * 8 - byte_len); + iLength = (TUint16)(iLength + ext.pfqos_selector_len); + } + + +EXPORT_C void CPfqosStream::AddChannel(TUint32 aChannelId) + { + struct pfqos_channel ext; + const int byte_len = sizeof(pfqos_channel); + ext.pfqos_channel_len = (byte_len + 7) / 8; + ext.pfqos_ext_type = EPfqosExtChannel; + ext.channel_id = aChannelId; + + iSendBuf.Append((TUint8*)&ext, sizeof(ext)); + iSendBuf.AppendFill(0, ext.pfqos_channel_len * 8 - byte_len); + iLength = (TUint16)(iLength + ext.pfqos_channel_len); + } + + +EXPORT_C void CPfqosStream::AddConfigFile(const TDesC& aName) + { + struct pfqos_config_file ext; + + const int byte_len = sizeof(pfqos_config_file); + ext.pfqos_config_file_len = (byte_len + 7) / 8; + ext.pfqos_ext_type = EPfqosExtConfigFile; + TPtr8 nameptr((TUint8*)ext.filename, 0, KMaxFileName); + if (nameptr.MaxLength() >= aName.Length()) + { + nameptr.Copy(aName); + } + nameptr.ZeroTerminate(); + ext.reserved = 0; + + iSendBuf.Append((TUint8*)&ext, sizeof(ext)); + iSendBuf.AppendFill(0, ext.pfqos_config_file_len * 8 - byte_len); + iLength = (TUint16)(iLength + ext.pfqos_config_file_len); + } + + +EXPORT_C void CPfqosStream::AddQoSParameters(const TQoSParameters& + aParameters) + { + struct pfqos_flowspec ext; + const int byte_len = sizeof(pfqos_flowspec); + + ext.pfqos_flowspec_len = (byte_len + 7) / 8; + ext.pfqos_ext_type = EPfqosExtFlowspec; + + // Uplink parameters + ext.uplink_bandwidth = aParameters.GetUplinkBandwidth(); + ext.uplink_maximum_burst_size = aParameters.GetUpLinkMaximumBurstSize(); + ext.uplink_maximum_packet_size = aParameters.GetUpLinkMaximumPacketSize(); + ext.uplink_average_packet_size = aParameters.GetUpLinkAveragePacketSize(); + ext.uplink_delay = aParameters.GetUpLinkDelay(); + ext.uplink_priority = static_cast< TUint16 >( + aParameters.GetUpLinkPriority()); + + // Downlink parameters + ext.downlink_bandwidth = aParameters.GetDownlinkBandwidth(); + ext.downlink_maximum_burst_size = + aParameters.GetDownLinkMaximumBurstSize(); + ext.downlink_maximum_packet_size = + aParameters.GetDownLinkMaximumPacketSize(); + ext.downlink_average_packet_size = + aParameters.GetDownLinkAveragePacketSize(); + ext.downlink_delay = aParameters.GetDownLinkDelay(); + ext.downlink_priority = static_cast< TUint16 >( + aParameters.GetDownLinkPriority()); + + ext.flags = aParameters.Flags(); + ext.reserved = 0; + + // name + ext.name.Copy(aParameters.GetName()); + + iSendBuf.Append((TUint8*)&ext, sizeof(ext)); + iSendBuf.AppendFill(0, ext.pfqos_flowspec_len * 8 - byte_len); + iLength = (TUint16)(iLength + ext.pfqos_flowspec_len); + } + + +EXPORT_C void CPfqosStream::AddModulespec(TUint32 aProtocolId, TUint32 aFlags, + const TDesC& aModuleName, const TDesC& aFileName, + const TDesC8& aConfigData) + { + struct pfqos_modulespec ext; + const int byte_len = sizeof(pfqos_modulespec)+aConfigData.Length(); + + ext.pfqos_modulespec_len = (TUint16)((byte_len + 7) / 8); + ext.pfqos_ext_type = EPfqosExtModulespec; + ext.protocol_id = aProtocolId; + ext.flags = aFlags; + ext.reserved = 0; + TPtr8 namePtr((TUint8*)ext.name, 0, KMaxName); + if (namePtr.MaxLength() >= aModuleName.Length()) + { + namePtr.Copy(aModuleName); + } + + namePtr.ZeroTerminate(); + TPtr8 fileNamePtr((TUint8*)ext.path, 0, KMaxFileName); + if (fileNamePtr.MaxLength() >= aFileName.Length()) + { + fileNamePtr.Copy(aFileName); + } + fileNamePtr.ZeroTerminate(); + + iSendBuf.Append((TUint8*)&ext, sizeof(ext)); + iSendBuf.AppendFill(0, ext.pfqos_modulespec_len * 8 - byte_len); + iSendBuf.Append(aConfigData); + + iLength = (TUint16)(iLength + ext.pfqos_modulespec_len); + } + + +EXPORT_C void CPfqosStream::AddExtensionPolicy(TDesC8 &aData) + { + TInt len = (aData.Length() + 7) / 8; + + iSendBuf.Append(aData); + iLength = (TUint16)(iLength + len); + } + + +EXPORT_C void CPfqosStream::AddExtensionHeader(TUint16 aExtension) + { + struct pfqos_configure header; + struct pfqos_extension extension; + const int byte_len = sizeof(pfqos_extension) + sizeof(pfqos_configure); + + header.pfqos_configure_len = (byte_len + 7) / 8; + header.pfqos_ext_type = EPfqosExtExtension; + header.protocol_id = 0; + header.reserved = 0; + extension.pfqos_ext_len = (byte_len + 7) / 8; + extension.pfqos_ext_type = EPfqosExtExtension; + extension.pfqos_extension_type = aExtension; + + iSendBuf.Append((TUint8*)&header, sizeof(header)); + iSendBuf.Append((TUint8*)&extension, sizeof(extension)); + iSendBuf.AppendFill(0, header.pfqos_configure_len * 8 - byte_len); + iLength = (TUint16)(iLength + header.pfqos_configure_len); + } + + +EXPORT_C void CPfqosStream::AddSrcAddress(const TInetAddr &anAddr, + const TInetAddr &aMask, TUint16 aPortMax) + { + AddAddress(anAddr, aMask, EPfqosExtSrcAddress, aPortMax); + _LIT(KText1, "ADDRESS_SRC"); + __ASSERT_ALWAYS(iLength * 8 == iSendBuf.Length(), User::Panic(KText1, 0)); + } + + +EXPORT_C void CPfqosStream::AddDstAddress(const TInetAddr &anAddr, + const TInetAddr &aMask, TUint16 aPortMax) + { + AddAddress(anAddr, aMask, EPfqosExtDstAddress, aPortMax); + _LIT(KText2, "ADDRESS_SRC"); + __ASSERT_ALWAYS(iLength * 8 == iSendBuf.Length(), User::Panic(KText2, 0)); + } + + +EXPORT_C TInt CPfqosStream::Send(RSocket &aSocket) + { + TRequestStatus status; + TPtrC8 len = TPtrC8((TUint8 *)&iLength, sizeof(iLength)); + iSendBuf.Replace(_FOFF(struct pfqos_msg, pfqos_msg_len), + sizeof(((struct pfqos_msg *)0)->pfqos_msg_len), len); + aSocket.Write(iSendBuf, status); + User::WaitForRequest(status); + return status.Int(); + } + + +EXPORT_C void CPfqosStream::Send(RSocket &aSocket, TRequestStatus& aStatus) + { + TPtrC8 len = TPtrC8((TUint8 *)&iLength, sizeof(iLength)); + iSendBuf.Replace(_FOFF(struct pfqos_msg, pfqos_msg_len), + sizeof(((struct pfqos_msg *)0)->pfqos_msg_len), len); + aSocket.Write(iSendBuf, aStatus); + } + + + +EXPORT_C TInt CPfqosStream::Send(RInternalSocket &aSocket) + { + TRequestStatus status; + TPtrC8 len = TPtrC8((TUint8 *)&iLength, sizeof(iLength)); + iSendBuf.Replace(_FOFF(struct pfqos_msg, pfqos_msg_len), + sizeof(((struct pfqos_msg *)0)->pfqos_msg_len), len); + aSocket.Write(iSendBuf, status); + User::WaitForRequest(status); + return status.Int(); + } + + +EXPORT_C void CPfqosStream::Send(RInternalSocket &aSocket, TRequestStatus& + aStatus) + { + TPtrC8 len = TPtrC8((TUint8 *)&iLength, sizeof(iLength)); + iSendBuf.Replace(_FOFF(struct pfqos_msg, pfqos_msg_len), + sizeof(((struct pfqos_msg *)0)->pfqos_msg_len), len); + aSocket.Write(iSendBuf, aStatus); + } + + + +EXPORT_C void CPfqosStream::AddAddress(const TInetAddr &anAddr, + const TInetAddr &aMask, TUint8 aType, TUint16 aPortMax) + { + struct pfqos_address address; + const int byte_len = sizeof(struct pfqos_address) + sizeof(TInetAddr) + + sizeof(TInetAddr); + + address.pfqos_address_len = (byte_len + 7) / 8; + address.pfqos_ext_type = aType; + address.reserved = 0; + address.pfqos_port_max = aPortMax; + iSendBuf.Append((TUint8*)&address, sizeof(address)); + iSendBuf.Append((TUint8*)&anAddr, sizeof(TInetAddr)); + iSendBuf.Append((TUint8*)&aMask, sizeof(TInetAddr)); + iSendBuf.AppendFill(0, address.pfqos_address_len * 8 - byte_len); + + iLength = (TUint16)(iLength + address.pfqos_address_len); + } + +