Index: /branches/rel_apv_10_7/usr/src/sys/click/app/cm/sf_fasttcp_tcp.c
===================================================================
--- /branches/rel_apv_10_7/usr/src/sys/click/app/cm/sf_fasttcp_tcp.c	(revision 39264)
+++ /branches/rel_apv_10_7/usr/src/sys/click/app/cm/sf_fasttcp_tcp.c	(working copy)
@@ -383,6 +383,7 @@
 	if(!is_fasttcp_nat){
 		vs_p->num_open_conns++;
 		rs_p->num_open_conns++;
+		UPDATE_BANDWIDTH_IN_CONNS(rs_p);
 		client_pcb->fp_vsinstance_id = vs_p->vsinstance_id;
 		server_pcb->fp_vsinstance_id = vs_p->vsinstance_id;
 		server_pcb->fp_rsinstance_id = rs_p->instance_id;
Index: /branches/rel_apv_10_7/usr/src/sys/click/app/fastslb/fastslb.c
===================================================================
--- /branches/rel_apv_10_7/usr/src/sys/click/app/fastslb/fastslb.c	(revision 39264)
+++ /branches/rel_apv_10_7/usr/src/sys/click/app/fastslb/fastslb.c	(working copy)
@@ -1988,6 +1988,7 @@
 		INCREASE_VS_CONNECTION_RATE_COUNTER(vs_p->vs_id);
 	    vs_p->num_open_conns++;
 	    rs_p->num_open_conns++;
+		UPDATE_BANDWIDTH_IN_CONNS(rs_p);
 	    slb_real_record_req_open(rs_p);
 	    deltaconnections++;
 	    vsconnections++;
Index: /branches/rel_apv_10_7/usr/src/sys/click/app/rtsp/rtsp_proxy.c
===================================================================
--- /branches/rel_apv_10_7/usr/src/sys/click/app/rtsp/rtsp_proxy.c	(revision 39264)
+++ /branches/rel_apv_10_7/usr/src/sys/click/app/rtsp/rtsp_proxy.c	(working copy)
@@ -2000,6 +2000,7 @@
 	newdata->slb_rs_p = rs_p;
 	newdata->rs_instance = rs_p->instance_id;
 	newdata->slb_rs_p->num_open_conns++;
+	UPDATE_BANDWIDTH_IN_CONNS(newdata->slb_rs_p);
 	newdata->udp_conn_num = 0;
 	newdata->udp_timeout = rs_p->timeout;
 
Index: /branches/rel_apv_10_7/usr/src/sys/click/app/sip/sip_id.c
===================================================================
--- /branches/rel_apv_10_7/usr/src/sys/click/app/sip/sip_id.c	(revision 39264)
+++ /branches/rel_apv_10_7/usr/src/sys/click/app/sip/sip_id.c	(working copy)
@@ -2405,6 +2405,7 @@
 		new_data->rs = rs;
 		new_data->rs_instance_id = rs->instance_id;
 		rs->num_open_conns++;
+		UPDATE_BANDWIDTH_IN_CONNS(rs);
 		slb_real_record_req_open(rs);
 	} else {
 		new_data->rs = NULL;
@@ -2599,6 +2600,7 @@
 		new_data->rs = rs;
 		new_data->rs_instance_id = rs->instance_id;
 		rs->num_open_conns++;
+		UPDATE_BANDWIDTH_IN_CONNS(rs);
 		slb_real_record_req_open(rs);
 	} else {
 		new_data->rs = NULL;
Index: /branches/rel_apv_10_7/usr/src/sys/click/app/slb/slb.h
===================================================================
--- /branches/rel_apv_10_7/usr/src/sys/click/app/slb/slb.h	(revision 39264)
+++ /branches/rel_apv_10_7/usr/src/sys/click/app/slb/slb.h	(working copy)
@@ -713,6 +713,7 @@
 #define out_bandwidth_packet thread_misc[slb_idx].srv_stat.srv_out_bandwidth_packet[slb_setting_p->slb_bandwidth_cur_index]
 
 #define num_open_conns	thread_misc[slb_idx].srv_stat.srv_num_open_conns
+#define bandwidth_conn thread_misc[slb_idx].srv_stat.srv_bandwidth_conn[slb_setting_p->slb_bandwidth_cur_index]
 #define total_hits thread_misc[slb_idx].srv_stat.srv_total_hits
 #define outstanding_req_count thread_misc[slb_idx].srv_stat.srv_outstanding_req_count 
 #define successful_response_cnt thread_misc[slb_idx].srv_stat.srv_successful_response_cnt
@@ -1021,8 +1022,10 @@
 	/* bug 22580, change the total hits to uint64_t, 2009/06/17 */
 	uint64_t srv_total_hits;
 	/* Total number of requests sent to this service */
-	
-	/* traffic statistics */
+	uint64_t srv_bandwidth_conn[SLB_MAX_BANDWIDTH_STAT_THRESHOLD];
+
+	/* Total number of requests sent to this service
+	* traffic statistics */
 	uint64_t srv_in_bytes;
 	uint64_t srv_out_bytes;
 	uint64_t srv_in_packets;
@@ -3328,6 +3331,10 @@
 
 extern slb_setting_t * slb_setting_p;
 
+#define UPDATE_BANDWIDTH_IN_CONNS(rs) do{ \
+	rs->bandwidth_conn++; \
+}while(0) \
+
 #define UPDATE_BANDWIDTH_IN_PACKET(vrs)do{ \
 		vrs->in_bandwidth_packet++; \
 }while(0) \
Index: /branches/rel_apv_10_7/usr/src/sys/click/app/slb/slb_rs_group.c
===================================================================
--- /branches/rel_apv_10_7/usr/src/sys/click/app/slb/slb_rs_group.c	(revision 39264)
+++ /branches/rel_apv_10_7/usr/src/sys/click/app/slb/slb_rs_group.c	(working copy)
@@ -5335,8 +5335,14 @@
 
 	/*show some tabs*/
 	buff = show_slb_vs_summary_add_tabs_buffer(buff, depth);
-	buff += sprintf(buff, "\tCurrent Connection Count:  %u\n", 
+	buff += sprintf(buff, "\tCurrent Connection Count:  %u\n",
  					slb_get_rs_conncount_kern(rid));
+	
+	/*show some tabs*/
+	buff = show_slb_vs_summary_add_tabs_buffer(buff, depth);
+	buff += sprintf(buff, "\tAverage Connection Count:  %u\n",
+ 					slb_get_avg_rs_conncount_kern(rid));
+
 	if(rs_p->rs_cps){
 		/*show some tabs*/
 		buff = show_slb_vs_summary_add_tabs_buffer(buff, depth);
@@ -25227,6 +25233,7 @@
 			rs_p->thread_misc[j].srv_stat.srv_in_bandwidth_packet[slb_bandwidth_next_index] = 0;
 			rs_p->thread_misc[j].srv_stat.srv_out_bandwidth[slb_bandwidth_next_index] = 0;
 			rs_p->thread_misc[j].srv_stat.srv_out_bandwidth_packet[slb_bandwidth_next_index] = 0;
+			rs_p->thread_misc[j].srv_stat.srv_bandwidth_conn[slb_bandwidth_next_index] = 0;
 		}
 	}
 	for(i=0;i< g_slb_vs_limit;i++){
Index: /branches/rel_apv_10_7/usr/src/sys/click/app/slb/slb_rs_group_shared.c
===================================================================
--- /branches/rel_apv_10_7/usr/src/sys/click/app/slb/slb_rs_group_shared.c	(revision 39264)
+++ /branches/rel_apv_10_7/usr/src/sys/click/app/slb/slb_rs_group_shared.c	(working copy)
@@ -7274,6 +7274,26 @@
 	return total_count;
 }
 
+/* 
+ * Calculate the average number of connections to the real service 
+ */
+uint32_t slb_get_srv_avg_stat_conncount(slb_rs_t *rs_p)
+{
+	uint32_t i, j, total_count = 0;
+
+	if(slb_check_id_valid(NULL, rs_p, 0) == 0) {
+		return 0;
+	}
+
+	for(i = 0; i < atcp_nthreads; ++i) {
+		for(j = 0; j < slb_setting_p -> slb_bandwidth_update_threshold; ++j) {
+			total_count += rs_p -> thread_misc[i].srv_stat.srv_bandwidth_conn[j];
+		}
+	}
+
+	return total_count / (slb_setting_p -> slb_bandwidth_update_threshold);
+}
+
 uint64_t slb_get_rs_curr_conn_total(void)
 {
 	uint64_t total_count = 0;
@@ -8234,6 +8254,10 @@
 	return slb_get_srv_stat_conncount(NULL, &slb_rs_table[rid], 0);
 }
 
+uint32_t slb_get_avg_rs_conncount_kern(uint32_t rid){
+	return slb_get_srv_avg_stat_conncount(&slb_rs_table[rid]);
+}
+
 uint32_t slb_get_rs_reqcount_kern(uint32_t rid){
 	return slb_get_srv_stat_reqcount(NULL, &slb_rs_table[rid], 0);
 }
@@ -8664,6 +8688,8 @@
 {
 	if (SLB_RS_ID_VALID(rs_id)) {
 		slb_rs_table[rs_id].num_open_conns++;
+		// UPDATE_BANDWIDTH_IN_CONNS(slb_rs_table[rs_id]);
+		slb_rs_table[rs_id].thread_misc[slb_idx].srv_stat.srv_bandwidth_conn[slb_setting_p->slb_bandwidth_cur_index]++;
 		INCREASE_RS_CONNECTION_RATE_COUNTER(rs_id); /*add cps statistics counter for uproxy*/
 	}
 }
Index: /branches/rel_apv_10_7/usr/src/sys/click/app/slb/slb_triangle.c
===================================================================
--- /branches/rel_apv_10_7/usr/src/sys/click/app/slb/slb_triangle.c	(revision 39264)
+++ /branches/rel_apv_10_7/usr/src/sys/click/app/slb/slb_triangle.c	(working copy)
@@ -146,6 +146,7 @@
 	vs_p->total_hits++;
 	rs_p->num_open_conns++;
 	rs_p->total_hits++;
+	UPDATE_BANDWIDTH_IN_CONNS(rs_p);
 	/* set the first hit time after rs up */
 	if (rs_p->down_to_up || 0 == rs_p->first_hit_time) {
 		time(&rs_p->first_hit_time);
Index: /branches/rel_apv_10_7/usr/src/sys/click/netinet/click_utils.c
===================================================================
--- /branches/rel_apv_10_7/usr/src/sys/click/netinet/click_utils.c	(revision 39264)
+++ /branches/rel_apv_10_7/usr/src/sys/click/netinet/click_utils.c	(working copy)
@@ -1216,6 +1216,7 @@
 
 	pcb->cp_rs = rs_p;
 	rs_p->num_open_conns++;
+	UPDATE_BANDWIDTH_IN_CONNS(rs_p);
 
 	/* set the first hit time after rs up */
 	if (rs_p->down_to_up || 0 == rs_p->first_hit_time) {
@@ -1246,6 +1247,7 @@
 	rs_p->total_hits++;
 	
 	INCREASE_RS_CONNECTION_RATE_COUNTER(rs_p->rs_id); /*add cps statistics counter*/
+	UPDATE_BANDWIDTH_IN_CONNS(rs_p);
 
 	/* set the first hit time after rs up */
 	if (rs_p->down_to_up || 0 == rs_p->first_hit_time) {
