void subscr_get_channel(struct gsm_subscriber *subscr, int type, gsm_cbfn *cbfn, void *param) { struct subscr_request *request; request = talloc(tall_sub_req_ctx, struct subscr_request); if (!request) { if (cbfn) cbfn(GSM_HOOK_RR_PAGING, GSM_PAGING_OOM, NULL, NULL, param); return; } memset(request, 0, sizeof(*request)); request->subscr = subscr_get(subscr); request->channel_type = type; request->cbfn = cbfn; request->param = param; /* * FIXME: We might be able to assign more than one * channel, e.g. voice and SMS submit at the same * time. */ if (!subscr->in_callback && llist_empty(&subscr->requests)) { /* add to the list, send a request */ llist_add_tail(&request->entry, &subscr->requests); subscr_send_paging_request(subscr); } else { /* this will be picked up later, from subscr_put_channel */ llist_add_tail(&request->entry, &subscr->requests); } }
void subscr_put_channel(struct gsm_lchan *lchan) { /* * FIXME: Continue with other requests now... by checking * the gsm_subscriber inside the gsm_lchan. Drop the ref count * of the lchan after having asked the next requestee to handle * the channel. */ /* * FIXME: is the lchan is of a different type we could still * issue an immediate assignment for another channel and then * close this one. */ /* * Currently we will drop the last ref of the lchan which * will result in a channel release on RSL and we will start * the paging. This should work most of the time as the MS * will listen to the paging requests before we timeout */ put_lchan(lchan); if (lchan->subscr && !llist_empty(&lchan->subscr->requests)) subscr_send_paging_request(lchan->subscr); }