Index: /trunk/src/VBox/GuestHost/OpenGL/include/cr_net.h
===================================================================
--- /trunk/src/VBox/GuestHost/OpenGL/include/cr_net.h	(revision 32908)
+++ /trunk/src/VBox/GuestHost/OpenGL/include/cr_net.h	(revision 32909)
@@ -167,4 +167,5 @@
     int total_bytes_sent;
     int total_bytes_recv;
+    int recv_count;
 
     /* credits for flow control */
Index: /trunk/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c
===================================================================
--- /trunk/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c	(revision 32908)
+++ /trunk/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c	(revision 32909)
@@ -717,4 +717,5 @@
     conn->recv_credits     -= len;
     conn->total_bytes_recv += len;
+    conn->recv_count++;
 
     crNetDispatchMessage( g_crvboxhgcm.recv_list, conn, msg, len );
Index: /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_clear.c
===================================================================
--- /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_clear.c	(revision 32908)
+++ /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_clear.c	(revision 32909)
@@ -23,17 +23,26 @@
     uint32_t mcPeriods;
     uint32_t miPeriod;
+
+    uint64_t mBytesSum;
+    uint32_t *mpaBytes;
+
+    uint64_t mCallsSum;
+    uint32_t *mpaCalls;
 } VBOXCRFPS, *PVBOXCRFPS;
 
 void vboxCrFpsInit(PVBOXCRFPS pFps, uint32_t cPeriods)
 {
-    memset(pFps, 0, sizeof (*pFps));
+    crMemset(pFps, 0, sizeof (*pFps));
     pFps->mcPeriods = cPeriods;
-    pFps->mpaPeriods = malloc(sizeof (pFps->mpaPeriods[0]) * cPeriods);
-    memset(pFps->mpaPeriods, 0, cPeriods * sizeof(pFps->mpaPeriods[0]));
+    pFps->mpaPeriods = crCalloc(sizeof (pFps->mpaPeriods[0]) * cPeriods);
+    pFps->mpaBytes = crCalloc(sizeof (pFps->mpaBytes[0]) * cPeriods);
+    pFps->mpaCalls = crCalloc(sizeof (pFps->mpaCalls[0]) * cPeriods);
 }
 
 void vboxCrFpsTerm(PVBOXCRFPS pFps)
 {
-    free(pFps->mpaPeriods);
+    crFree(pFps->mpaPeriods);
+    crFree(pFps->mpaBytes);
+    crFree(pFps->mpaCalls);
 }
 
@@ -41,9 +50,34 @@
 {
     uint64_t cur = RTTimeNanoTS();
+    uint64_t curBytes, curCalls;
+    int i;
+
+    curBytes = 0;
+    curCalls = 0;
+
+    for (i = 0; i < cr_server.numClients; i++)
+    {
+        if (cr_server.clients[i] && cr_server.clients[i]->conn)
+        {
+            curBytes += cr_server.clients[i]->conn->total_bytes_recv;
+            curCalls += cr_server.clients[i]->conn->recv_count;
+            cr_server.clients[i]->conn->total_bytes_recv = 0;
+            cr_server.clients[i]->conn->recv_count = 0;
+        }
+    }
+
     if(pFps->mPrevTime)
     {
         uint64_t curPeriod = cur - pFps->mPrevTime;
+
         pFps->mPeriodSum += curPeriod - pFps->mpaPeriods[pFps->miPeriod];
         pFps->mpaPeriods[pFps->miPeriod] = curPeriod;
+
+        pFps->mBytesSum += curBytes - pFps->mpaBytes[pFps->miPeriod];
+        pFps->mpaBytes[pFps->miPeriod] = curBytes;
+
+        pFps->mCallsSum += curCalls - pFps->mpaCalls[pFps->miPeriod];
+        pFps->mpaCalls[pFps->miPeriod] = curCalls;
+
         ++pFps->miPeriod;
         pFps->miPeriod %= pFps->mcPeriods;
@@ -61,4 +95,14 @@
 {
     return ((double)1000000000.0) / vboxCrFpsGetEveragePeriod(pFps);
+}
+
+double vboxCrFpsGetBps(PVBOXCRFPS pFps)
+{
+    return vboxCrFpsGetFps(pFps) * pFps->mBytesSum / pFps->mcPeriods;
+}
+
+double vboxCrFpsGetCps(PVBOXCRFPS pFps)
+{
+    return vboxCrFpsGetFps(pFps) * pFps->mCallsSum / pFps->mcPeriods;
 }
 
@@ -119,5 +163,7 @@
   {
       double fps = vboxCrFpsGetFps(&Fps);
-      crDebug("fps: %f\n", fps);
+      double bps = vboxCrFpsGetBps(&Fps);
+      double cps = vboxCrFpsGetCps(&Fps);
+      crDebug("fps: %f, Mbps: %.1f, cps: %.1f", fps, bps/(1024.0*1024.0), cps);
   }
 #endif
