When there is a Leafref node in a RPC input, the server will pass to the SIL code a value of Leafref type,

where it's fields in val->v are not set.

Thus, all VAL_XXX macros that accessing val->v fields will not return the actual value of the node.


In order to retrieve the actual value for the Leafref node you need to convert Leafref node first to a real value node.


/********************************************************************
* FUNCTION rpc_invoke
* 
* RPC invocation phase
* All constraints have passed at this point.
* Call device instrumentation code in this function.
* 
* INPUTS:
*     see agt/agt_rpc.h for details
* 
* RETURNS:
*     error status
********************************************************************/
rpc_invoke/validate(ses_cb_t *scb,
                             rpc_msg_t *msg,
                             xml_node_t *methnode)

    val_value_t *inputval = msg->rpc_input;
    if (!dlq_empty(&msg->rpc_inputQ)) {
        inputval = (val_value_t *)dlq_firstEntry(&msg->rpc_inputQ);
    }

    val_value_t *child_newval =
        val_find_child(inputval,
                            (const xmlChar*)"module_name",
                            (const xmlChar*)"leafref_node_name");

    if (child_newval && child_newval->res == NO_ERR) {
        val_value_t *realval = NULL;
        val_value_t *useval = NULL;

        /* Convert a value of type NCX_BT_LEAFREF to the value
         * that the final leafref is pointing at.
         */
        if (VAL_BTYPE(child_newval) == NCX_BT_LEAFREF) {
            /* malloced val_value_t that must be freed with val_free_value
             * the val->btyp and val->typdef and val->v fields will be set
             * based on the real type; the val->obj will still point at
             * the original object
             */
            realval = val_convert_leafref(child_newval);
            useval = realval;
        } else {
            useval = child_newval;
        }

        log_debug("\nleafref_node_name='%u'", VAL_UINT32(useval));
        val_free_value(realval);
    }