/*
 *  unpack all xtlv records from the issue a callback
 *  to set function one call per found tlv record
 */
int
bcm_unpack_xtlv_buf(void *ctx, void *tlv_buf, uint16 buflen, bcm_set_var_from_tlv_cbfn_t *cbfn)
{
	uint16 len;
	uint16 type;
	int res = 0;
	bcm_xtlv_t *ptlv = tlv_buf;
	int sbuflen = buflen;

	ASSERT(ptlv);
	ASSERT(cbfn);

	while (sbuflen >= 0) {
		ptlv = tlv_buf;

		/* tlv header is always packed in LE order */
		len = ltoh16(ptlv->len);
		if (len == 0)	/* can't be zero */
			break;
		type = ltoh16(ptlv->id);

		sbuflen -= (BCM_XTLV_HDR_SIZE + len);

		/* check for possible buffer overrun */
		if (sbuflen < 0)
			break;

		if ((res = cbfn(ctx, &tlv_buf, type, len)) != BCME_OK)
			break;
	}
	return res;
}
Exemplo n.º 2
0
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);
	}
}
Exemplo n.º 3
0
void CarveWalkBlocks( carve_t cv, void (*cbfn)(carve_t, void *, void *), void *cookie )
/*************************************************************************************/
{
    blk_t *     block;

    for( block = cv->blk_list; block != NULL; block = block->next ) {
        cbfn( cv, block, cookie );
    }
}
Exemplo n.º 4
0
/*----------------------------------------------------------------------------
 * rumavl_foreach - loop through entire tree, using temporary iterator
 *--------------------------------------------------------------------------*/
extern int rumavl_foreach (RUMAVL *tree, int dir,
	    int (*cbfn)(RUMAVL *, void *, void *), void *udata)
{
    RUMAVL_NODE *node;
    int retv;
    void *record;

    if (cbfn == NULL)
	return RUMAVL_ERR_INVAL;
    
    retv = RUMAVL_ERR_NOENT;
    node = NULL;
    while ((node = rumavl_node_next(tree, node, dir, &record)) != NULL){
	if ((retv = cbfn(tree, record, udata)) != 0)
	    break;
    }

    return retv;
}