networkcontrol/pfqoslib/src/pfqos_stream.cpp
changeset 0 af10295192d8
--- /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 <in_sock.h>
+
+#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);
+    }
+
+