[paging] Only page if we have some free channels right now

Only page if we have a load that is acceptable for paging. This
option is off by default, and can be enabled per bts. The idea
is that when we have no resources right now we will not page as
it will only create more RACHs and increase the load.

By default we are keeping the old behavior to always page and
only by changing a setting one is using the new behavior.
diff --git a/openbsc/src/paging.c b/openbsc/src/paging.c
index a6bc56d..bca97cf 100644
--- a/openbsc/src/paging.c
+++ b/openbsc/src/paging.c
@@ -118,6 +118,45 @@
 	paging_handle_pending_requests(paging_bts);
 }
 
+static int can_send_pag_req(struct gsm_bts *bts, int rsl_type)
+{
+	struct pchan_load pl;
+	int count;
+
+	memset(&pl, 0, sizeof(pl));
+	bts_chan_load(&pl, bts);
+
+	switch (rsl_type) {
+	case RSL_CHANNEED_TCH_F:
+		LOGP(DPAG, LOGL_ERROR, "Not implemented.\n");
+		break;
+	case RSL_CHANNEED_TCH_ForH:
+		LOGP(DPAG, LOGL_ERROR, "Not implemented.\n");
+		break;
+	case RSL_CHANNEED_SDCCH:
+		goto count_sdcch;
+		break;
+	case RSL_CHANNEED_ANY:
+	default:
+		if (bts->network->pag_any_tch)
+			LOGP(DPAG, LOGL_ERROR, "Not implemented.\n");
+		else
+			goto count_sdcch;
+		break;
+	}
+
+	return 0;
+
+	/* could available SDCCH */
+count_sdcch:
+	count = 0;
+	count += pl.pchan[GSM_PCHAN_SDCCH8_SACCH8C].total
+			- pl.pchan[GSM_PCHAN_SDCCH8_SACCH8C].used;
+	count += pl.pchan[GSM_PCHAN_CCCH_SDCCH4].total
+			- pl.pchan[GSM_PCHAN_CCCH_SDCCH4].used;
+	return bts->paging.free_chans_need > count;
+}
+
 /*
  * This is kicked by the periodic PAGING LOAD Indicator
  * coming from abis_rsl.c
@@ -154,6 +193,12 @@
 	request = llist_entry(paging_bts->pending_requests.next,
 			      struct gsm_paging_request, entry);
 
+	/* we need to determine the number of free channels */
+	if (paging_bts->free_chans_need != -1) {
+		if (can_send_pag_req(request->bts, request->chan_type) != 0)
+			goto skip_paging;
+	}
+
 	/* handle the paging request now */
 	page_ms(request);
 	paging_bts->available_slots--;
@@ -162,6 +207,7 @@
 	llist_del(&request->entry);
 	llist_add_tail(&request->entry, &paging_bts->pending_requests);
 
+skip_paging:
 	bsc_schedule_timer(&paging_bts->work_timer, PAGING_TIMER);
 }