First version of asfvolt16 device driver code

Change-Id: I806c2eaeebc7f8df7073c8264a7fdc6011b0d103
diff --git a/src/bal_group_hdlr.c b/src/bal_group_hdlr.c
new file mode 100755
index 0000000..5c05425
--- /dev/null
+++ b/src/bal_group_hdlr.c
@@ -0,0 +1,282 @@
+/*
+** Copyright 2017-present Open Networking Foundation
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+#include <stdio.h>
+#include <bal_api.h>
+
+#undef _SYS_QUEUE_H_
+
+/* Includes related to proto buf */
+#include "asfvolt16_driver.h"
+#include "bal_group_hdlr.h"
+
+
+/********************************************************************\
+ * Function    : bal_group_cfg_req                                  *
+ * Description : Configures the OLT device                          *
+ ********************************************************************/
+
+uint32_t bal_group_cfg_set(BalGroupCfg *tm_group_cfg)
+{
+    bcmos_errno err = BCM_ERR_OK;
+    bcmbal_group_cfg grp_cfg_obj;   /**< declare main API struct */
+    bcmbal_group_key key = { };      /**< declare key */
+    int grp_mem_idx;
+
+    if(tm_group_cfg->key->has_group_id)
+    {
+       key.group_id = tm_group_cfg->key->group_id;
+    }
+    else
+    {
+       ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to configure the group cfg(OLT): Group Id was not present \n");
+       return BAL_ERRNO__BAL_ERR_NOENT;
+    }
+
+    ASFVOLT_LOG(ASFVOLT_DEBUG, "Configuration of OLT(group cfg) starts\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&grp_cfg_obj, group, key);
+
+    /* decode API parameters from GRPC */
+    if(tm_group_cfg->data->has_members_cmd)
+    {
+        ASFVOLT_CFG_PROP_SET(grp_cfg_obj, group, members_cmd, 
+                             tm_group_cfg->data->has_members_cmd, 
+                             tm_group_cfg->data->members_cmd);
+    }
+
+    if(tm_group_cfg->data->has_cookie)
+    {
+        ASFVOLT_CFG_PROP_SET(grp_cfg_obj, group, cookie, 
+                             tm_group_cfg->data->has_cookie, 
+                             tm_group_cfg->data->cookie);
+    }
+
+    BalIdList *balFlows = (BalIdList *)tm_group_cfg->data->flows;
+    bcmbal_flow_id_list_u32 valFlows = {};
+
+    valFlows.len = balFlows->n_val;
+    valFlows.val = (bcmbal_flow_id *)malloc((valFlows.len)*sizeof(bcmbal_flow_id));
+    if(!valFlows.val)
+    {
+       ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to configure the group cfg(OLT): Memory Exhausted\n");
+       return BAL_ERRNO__BAL_ERR_NOMEM;
+    }
+    memcpy((void *)valFlows.val, (const void *)balFlows->val, 
+           (balFlows->n_val)*sizeof(bcmbal_flow_id));
+    ASFVOLT_CFG_PROP_SET(grp_cfg_obj, group, flows, BCMOS_TRUE, valFlows); 
+
+    if(tm_group_cfg->data->has_owner)
+    {
+        ASFVOLT_CFG_PROP_SET(grp_cfg_obj, group, owner, 
+                             tm_group_cfg->data->has_owner, 
+                             tm_group_cfg->data->owner);
+    }
+
+    BalGroupMemberInfoList *balMembers = 
+              (BalGroupMemberInfoList *)tm_group_cfg->data->members;
+    bcmbal_group_member_info_list_u16 valMembers = {};
+    /*if(balMembers->has_len)*/
+    {
+       valMembers.len = balMembers->n_val;
+       valMembers.val = 
+        (bcmbal_group_member_info *)malloc((valMembers.len)*sizeof(bcmbal_group_member_info));
+       if(!valMembers.val)
+       {
+          ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to configure the group cfg(OLT): Memory Exhausted\n");
+          return BAL_ERRNO__BAL_ERR_NOMEM;
+       }
+       //check
+       //valMembers.val = &balMembers->val;
+       for(grp_mem_idx = 0; grp_mem_idx < valMembers.len; grp_mem_idx++)
+       {
+          if(balMembers->val[grp_mem_idx]->has_intf_id)
+          {
+             valMembers.val[grp_mem_idx].intf_id 
+                                  = balMembers->val[grp_mem_idx]->intf_id;
+          }
+          if(balMembers->val[grp_mem_idx]->has_svc_port_id)
+          {
+             valMembers.val[grp_mem_idx].svc_port_id 
+                               = balMembers->val[grp_mem_idx]->svc_port_id;
+          }
+          if(balMembers->val[grp_mem_idx]->action->has_presence_mask)
+          {
+             valMembers.val[grp_mem_idx].action.presence_mask 
+                     = balMembers->val[grp_mem_idx]->action->presence_mask;
+          }
+          if(balMembers->val[grp_mem_idx]->action->has_cmds_bitmask)
+          {
+             valMembers.val[grp_mem_idx].action.cmds_bitmask
+                     = balMembers->val[grp_mem_idx]->action->cmds_bitmask;
+          }
+          if(balMembers->val[grp_mem_idx]->action->has_o_vid)
+          {
+             valMembers.val[grp_mem_idx].action.o_vid
+                     = balMembers->val[grp_mem_idx]->action->o_vid;
+          }
+          if(balMembers->val[grp_mem_idx]->action->has_o_pbits)
+          {
+             valMembers.val[grp_mem_idx].action.o_pbits
+                     = balMembers->val[grp_mem_idx]->action->o_pbits;
+          }
+          if(balMembers->val[grp_mem_idx]->action->has_o_tpid)
+          {
+             valMembers.val[grp_mem_idx].action.o_tpid
+                     = balMembers->val[grp_mem_idx]->action->o_tpid;
+          }
+          if(balMembers->val[grp_mem_idx]->action->has_i_vid)
+          {
+             valMembers.val[grp_mem_idx].action.i_vid
+                     = balMembers->val[grp_mem_idx]->action->i_vid;
+          }
+          if(balMembers->val[grp_mem_idx]->action->has_i_pbits)
+          {
+             valMembers.val[grp_mem_idx].action.i_pbits
+                     = balMembers->val[grp_mem_idx]->action->i_pbits;
+          }
+          if(balMembers->val[grp_mem_idx]->action->has_i_tpid)
+          {
+             valMembers.val[grp_mem_idx].action.i_tpid
+                     = balMembers->val[grp_mem_idx]->action->i_tpid;
+          }
+          if(balMembers->val[grp_mem_idx]->queue->has_sched_id)
+          {
+             valMembers.val[grp_mem_idx].queue.sched_id
+                     = balMembers->val[grp_mem_idx]->queue->sched_id;
+          }
+          if(balMembers->val[grp_mem_idx]->queue->has_queue_id)
+          {
+             valMembers.val[grp_mem_idx].queue.queue_id
+                     = balMembers->val[grp_mem_idx]->queue->queue_id;
+          }
+       }
+       ASFVOLT_CFG_PROP_SET(grp_cfg_obj, group, members, BCMOS_TRUE, valMembers); 
+    }
+
+    err = bcmbal_cfg_set(DEFAULT_ATERM_ID, &(grp_cfg_obj.hdr));
+
+    if(BCM_ERR_OK != err)
+    {
+        ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to configure the group cfg(OLT)\n");
+        return err;
+    }
+
+    ASFVOLT_LOG(ASFVOLT_INFO, "\nSet Group configuration sent to OLT for Group Id(%d)\n", 
+                               key.group_id);
+    return err;
+}
+
+
+/********************************************************************\
+ * Function    : bal_group_get_req                              *
+ * Description : get the OLT device group cfg                    *
+ ********************************************************************/
+
+uint32_t bal_group_cfg_get(BalGroupKey *tm_group_cfg_key, 
+                           BalGroupCfg *tm_group_cfg)
+{
+    bcmos_errno err = BCM_ERR_OK;
+    bcmbal_group_cfg grp_cfg_obj;   /**< declare main API struct */
+    bcmbal_group_key key = { };      /**< declare key */
+
+    if(tm_group_cfg_key->has_group_id)
+    {
+       key.group_id = tm_group_cfg_key->group_id;
+    }
+    else
+    {
+       ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to get the group cfg(OLT): Group Id was not present\n");
+       return BAL_ERRNO__BAL_ERR_NOENT;
+    }
+
+    ASFVOLT_LOG(ASFVOLT_DEBUG, "Get group cfg(for OLT) starts\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&grp_cfg_obj, group, key);
+
+    /* request all properties, include everything */
+    BCMBAL_CFG_PROP_GET(&grp_cfg_obj, group, all_properties);
+
+    err = bcmbal_cfg_get(DEFAULT_ATERM_ID, &grp_cfg_obj.hdr);
+
+    if(BCM_ERR_OK != err)
+    {
+        ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to get the group Cfg(OLT)\n");
+        return err;
+    }
+
+    ASFVOLT_LOG(ASFVOLT_INFO, "\nGet Group cfg sent to OLT for Group Id(%d)\n", 
+                               key.group_id);
+    return err;
+}
+
+/********************************************************************\
+ * Function    : bal_group_clear_req                            *
+ * Description : clears the OLT device group cfg                    *
+ ********************************************************************/
+
+uint32_t bal_group_cfg_clear(BalGroupKey *tm_group_cfg_key)
+{
+    bcmos_errno err = BCM_ERR_OK;
+    bcmbal_group_cfg grp_cfg_obj;   /**< declare main API struct */
+    bcmbal_group_key key = { };      /**< declare key */
+
+    if(tm_group_cfg_key->has_group_id)
+    {
+       key.group_id = tm_group_cfg_key->group_id;
+    }
+    else
+    {
+       ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to clear the group cfg(OLT): Group Id was not present\n");
+       return BAL_ERRNO__BAL_ERR_NOENT;
+    }
+
+    ASFVOLT_LOG(ASFVOLT_DEBUG, "Clearing of OLT(group cfg) starts\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&grp_cfg_obj, group, key);
+
+    err = bcmbal_cfg_clear(DEFAULT_ATERM_ID, &grp_cfg_obj.hdr);
+
+    if(BCM_ERR_OK != err)
+    {
+        ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to clear the group Cfg(OLT)\n");
+        return err;
+    }
+
+    ASFVOLT_LOG(ASFVOLT_INFO, "\nClear Group cfg clear sent to OLT for Group Id(%d) \n", 
+                               key.group_id);
+    return err;
+}
+
+/********************************************************************\
+ * Function    : bal_group_cfg_indication_cb                        *
+ * Description : Call back function registered with BAL to handle   *
+ *               event related to access terminal                   *
+ ********************************************************************/
+bcmos_errno bal_group_cfg_indication_cb(bcmbal_obj *obj)
+{
+    bcmos_errno result = BCM_ERR_OK;
+    ASFVOLT_LOG(ASFVOLT_INFO, "Processing API ('%s)\n' IND callback status is (%s)\n",
+		    bcmbal_objtype_str(obj->obj_type),
+		    bcmos_strerror(obj->status));
+    
+    return result;
+}
+
+