blob: 24e8ec2f8ede0ce74c8784948eba445c77da5931 [file] [log] [blame]
#ifndef BAL_OBJ
#define BAL_OBJ
#include <bcmos_system.h>
#include <bcmos_errno.h>
#include "bal_model_ids.h"
#include "bal_buf.h"
#include "bal_msg_type.h"
/*
* The current BAL header version
*/
#define BAL_HDR_VERSION_MAJOR (1)
#define BAL_HDR_VERSION_MINOR (1)
/*
* The BAL common message header
*/
typedef struct bal_comm_msg_hdr
{
bcmos_msg m; /**< bcmos message header */
uint16_t version_major; /**< Header Major version number */
uint16_t version_minor; /**< Header Minor version number */
bcmbal_msg_type msg_type; /**< Request / Response / Ack / Indication */
uint32_t msg_id; /**< Message ID – the ID of the message (subID under the message type) */
uint32_t ex_id; /**< Exchange ID for message tracking between endpoints */
bal_subsystem sender; /**< Sender subsystem - used for additional validation */
uint32_t timestamp; /**< Timestamp when the message was sent */
bcmos_sem sem; /**< Semaphore used for inter-thread communication */
void* scratchpad; /**< Scratchpad used for inter-thread communication */
uint8_t payload[]; /**< Payload follows the header */
} bal_comm_msg_hdr;
/** Version of Object definitions */
#define BCMBAL_OBJ_VERSION 2 /**< The current version number */
typedef uint32_t bcmbal_object_ver; /**< The attribute type in the object info structure */
/** Bitmask of object attributes that are specified in an object (1 = specified, 0 = not specified) */
typedef uint64_t bcmbal_presence_mask;
/** Presence mask indicating all fields present */
#define BCMBAL_PRESENCE_MASK_ALL ((bcmbal_presence_mask)0xFFFFFFFFFFFFFFFF)
/** Helper type to determine what the data format of a message should look like */
typedef enum bcmbal_mgt_group
{
BCMBAL_MGT_GROUP_KEY, /**< Key that uniquely identifies object instance */
BCMBAL_MGT_GROUP_CFG, /**< Configuration (get/set/clear) */
BCMBAL_MGT_GROUP_STAT, /**< Statistics */
BCMBAL_MGT_GROUP_AUTO, /**< Autonomous indications */
BCMBAL_MGT_GROUP_AUTO_CFG, /**< Autonomous indication configuration */
BCMBAL_MGT_GROUP__NUM_OF
} bcmbal_mgt_group;
/** Object message type. Can be a combination of flags. */
typedef enum bcmbal_obj_msg_type
{
BCMBAL_OBJ_MSG_TYPE_GET = 0x01, /**< Get configuration parameters */
BCMBAL_OBJ_MSG_TYPE_SET = 0x02, /**< Set configuration parameters */
BCMBAL_OBJ_MSG_TYPE_CLEAR = 0x04, /**< Clear configuration parameters */
} bcmbal_obj_msg_type;
/** Object message direction - request or response. */
typedef enum bcmbal_obj_msg_dir
{
BCMBAL_OBJ_MSG_DIR_REQUEST,
BCMBAL_OBJ_MSG_DIR_RESPONSE
} bcmbal_obj_msg_dir;
#define BCMBAL_OBJ_INIT_VAL 0xdeadbeef /**< The value of the obj_init_val after macro initialization */
/** Information common to all BAL objects */
typedef struct bcmbal_obj
{
bal_comm_msg_hdr comm_hdr; /**< Communication header */
bcmbal_object_ver version; /**< Version of the Object definition/structure */
bcmbal_obj_id obj_type; /**< An enumerated ID associated with the object being specified */
bcmbal_mgt_group group; /**< Management group */
uint16_t subgroup; /**< Subgroup for indications */
bcmbal_obj_msg_type type; /**< Type (e.g. get / set / clear) */
bcmbal_obj_msg_dir dir; /**< Direction - request / response */
bcmos_errno status; /**< BAL status code (BCM_ERR_OK–success, error code otherwise) */
bcmbal_presence_mask presence_mask; /**< Indicates which attribute parameters are present */
/* The following fields are internal. They are not sent on the line */
bcmos_bool is_inprogress; /**< RO - When set to TRUE: Object is changing state internally */
void *list_buf; /**< Memory buffer in which to store variable-sized lists when unpacking */
uint32_t list_buf_size; /**< Number of bytes in the variable-sized list buffer */
uint32_t obj_init_val; /**< An field that is set on INIT macro call, and checked by the API */
} bcmbal_obj;
/** Information structure for use with BAL configuration API (get/set/clear) */
typedef struct bcmbal_cfg
{
bcmbal_obj hdr;
} bcmbal_cfg;
/** Information structure for BAL statistics API */
typedef struct bcmbal_stat
{
bcmbal_obj hdr;
} bcmbal_stat;
/** Information structure for BAL indications */
typedef struct bcmbal_auto
{
bcmbal_obj hdr;
} bcmbal_auto;
/** Information structure for BAL indication configuration API */
typedef struct bcmbal_auto_cfg
{
bcmbal_obj hdr;
} bcmbal_auto_cfg;
/** Whether we pack the entire structure of a message */
static inline bcmos_bool bcmbal_obj_msg_should_pack_data(const bcmbal_obj *msg)
{
switch (msg->group)
{
case BCMBAL_MGT_GROUP_CFG:
case BCMBAL_MGT_GROUP_STAT:
case BCMBAL_MGT_GROUP_AUTO_CFG:
if ((msg->type & BCMBAL_OBJ_MSG_TYPE_GET))
{
return (msg->dir == BCMBAL_OBJ_MSG_DIR_RESPONSE);
}
else if ((msg->type & BCMBAL_OBJ_MSG_TYPE_SET))
{
return (msg->dir == BCMBAL_OBJ_MSG_DIR_REQUEST);
}
else
{
return BCMOS_FALSE;
}
default:
return BCMOS_TRUE;
}
}
/** Get the packed length of the header portion of an object message */
static inline int32_t bcmbal_obj_msg_hdr_get_packed_length(void)
{
return 24;
}
/** Pack a message header to a byte stream */
static inline bcmos_errno bcmbal_obj_msg_hdr_pack(const bcmbal_obj *msg, bcmbal_buf *buf)
{
bcmos_bool ret;
ret = bcmbal_buf_write_u32(buf, (uint32_t)msg->version);
ret = ret && bcmbal_buf_write_u8(buf, (uint32_t)msg->obj_type);
ret = ret && bcmbal_buf_write_u8(buf, (uint8_t)msg->group);
ret = ret && bcmbal_buf_write_u16(buf, msg->subgroup);
ret = ret && bcmbal_buf_write_u8(buf, (uint8_t)msg->type);
ret = ret && bcmbal_buf_write_u8(buf, (uint8_t)msg->dir);
ret = ret && bcmbal_buf_write_s16(buf, (int16_t)msg->status);
ret = ret && bcmbal_buf_write_u32(buf, (int32_t)msg->is_inprogress);
ret = ret && bcmbal_buf_write_u64(buf, (uint64_t)msg->presence_mask);
return ret ? BCM_ERR_OK : BCM_ERR_OVERFLOW;
}
/** Unpack a message header from a byte stream */
static inline bcmos_errno bcmbal_obj_msg_hdr_unpack(bcmbal_obj *msg, bcmbal_buf *buf)
{
uint32_t version;
uint8_t obj_type;
uint8_t group;
uint16_t subgroup;
uint8_t type;
uint8_t dir;
int16_t status;
uint32_t is_inprogress;
uint64_t presence_mask;
bcmos_bool ret;
ret = bcmbal_buf_read_u32(buf, &version);
ret = ret && bcmbal_buf_read_u8(buf, &obj_type);
ret = ret && bcmbal_buf_read_u8(buf, &group);
ret = ret && bcmbal_buf_read_u16(buf, &subgroup);
ret = ret && bcmbal_buf_read_u8(buf, &type);
ret = ret && bcmbal_buf_read_u8(buf, &dir);
ret = ret && bcmbal_buf_read_s16(buf, &status);
ret = ret && bcmbal_buf_read_u32(buf, &is_inprogress);
ret = ret && bcmbal_buf_read_u64(buf, &presence_mask);
if (ret)
{
msg->version = (bcmbal_object_ver)version;
msg->obj_type = (bcmbal_obj_id)obj_type;
msg->group = (bcmbal_mgt_group)group;
msg->subgroup = subgroup;
msg->type = (bcmbal_obj_msg_type)type;
msg->dir = (bcmbal_obj_msg_dir)dir;
msg->status = (bcmos_errno)status;
msg->is_inprogress = (bcmos_bool)is_inprogress;
msg->presence_mask = (bcmbal_presence_mask)presence_mask;
}
return ret ? BCM_ERR_OK : BCM_ERR_OVERFLOW;
}
#endif /* BAL_OBJ */