First version of asfvolt16 device driver code

Change-Id: I806c2eaeebc7f8df7073c8264a7fdc6011b0d103
diff --git a/src/bal_tmqueue_hdlr.c b/src/bal_tmqueue_hdlr.c
new file mode 100755
index 0000000..75f26ce
--- /dev/null
+++ b/src/bal_tmqueue_hdlr.c
@@ -0,0 +1,287 @@
+/*
+** 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_tmqueue_hdlr.h"
+
+
+/********************************************************************\
+ * Function    : bal_tm_queue_cfg_set                           *
+ * Description : Configures the tm queue for OLT device             *
+ ********************************************************************/
+
+uint32_t bal_tm_queue_cfg_set(BalTmQueueCfg *tm_queue_cfg)
+{
+    bcmos_errno err = BCM_ERR_OK;
+    bcmbal_tm_queue_cfg tm_queue_obj;   /**< declare main API struct */
+    bcmbal_tm_queue_key key = { };      /**< declare key */
+
+    if((tm_queue_cfg->key->has_id) && (tm_queue_cfg->key->has_sched_id) && (tm_queue_cfg->key->has_sched_dir))
+    {
+       key.id = tm_queue_cfg->key->id;
+       key.sched_id = tm_queue_cfg->key->sched_id;
+       key.sched_dir = tm_queue_cfg->key->sched_dir;
+    }
+    else
+    {
+       ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to configure the tm queue cfg(OLT): Missing Key values\
+                                   Recevied key values Id(%d), Sched-Dir(%d), Sched-Id(%d) \n", 
+                                   tm_queue_cfg->key->sched_id, tm_queue_cfg->key->sched_dir, tm_queue_cfg->key->id);
+       return BAL_ERRNO__BAL_ERR_NOENT;
+    }
+
+    ASFVOLT_LOG(ASFVOLT_DEBUG, "Configuration of OLT(tm Queue) starts\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&tm_queue_obj, tm_queue, key);
+
+    /* decode API parameters from GRPC */
+    ASFVOLT_CFG_PROP_SET(tm_queue_obj, tm_queue, priority, 
+                         tm_queue_cfg->data->has_priority, 
+                         tm_queue_cfg->data->priority);
+    ASFVOLT_CFG_PROP_SET(tm_queue_obj, tm_queue, weight, 
+                         tm_queue_cfg->data->has_weight, 
+                         tm_queue_cfg->data->weight);
+    ASFVOLT_CFG_PROP_SET(tm_queue_obj, tm_queue, creation_mode, 
+                         tm_queue_cfg->data->has_creation_mode, 
+                         tm_queue_cfg->data->creation_mode);
+    ASFVOLT_CFG_PROP_SET(tm_queue_obj, tm_queue, ref_count, 
+                         tm_queue_cfg->data->has_ref_count, 
+                         tm_queue_cfg->data->ref_count);
+
+    /* rating/shaping */
+    BalTmShaping *balShaping = (BalTmShaping *)tm_queue_cfg->data->rate;
+    bcmbal_tm_shaping val = {};
+    if (balShaping->has_presence_mask)
+    {
+       val.presence_mask = balShaping->presence_mask;
+       if (balShaping->has_cir)
+       {
+          val.cir = balShaping->cir;
+       }
+       if (balShaping->has_pir)
+       {
+          val.pir = balShaping->pir;
+       }
+       if (balShaping->has_burst)
+       {
+          val.burst = balShaping->burst;
+       }
+       ASFVOLT_CFG_PROP_SET(tm_queue_obj, tm_queue, rate, BCMOS_TRUE, val);
+    }
+
+    /* bac - Buffer addmission Control */
+    BalTmBac *balBac = (BalTmBac *)tm_queue_cfg->data->bac;
+    bcmbal_tm_bac valBac = {};
+    if(balBac->has_type)
+    {
+       valBac.type = balBac->type;
+       switch(valBac.type)
+       {
+           case BAL_TM_BAC__U_TAILDROP:
+             if(balBac->taildrop->has_max_size)
+             {
+                valBac.u.taildrop.max_size = balBac->taildrop->max_size;
+             }
+             break;
+           case BAL_TM_BAC__U_RED:
+             if(balBac->red->red->has_min_threshold)
+             {
+                 valBac.u.red.red.min_threshold = balBac->red->red->min_threshold;
+             }
+             if(balBac->red->red->has_max_threshold)
+             {
+                 valBac.u.red.red.max_threshold = balBac->red->red->max_threshold;
+             }
+             if(balBac->red->red->has_max_probability)
+             {
+                 valBac.u.red.red.max_probability = balBac->red->red->max_probability;
+             }
+             break;
+           case BAL_TM_BAC__U_WRED:
+             if(balBac->wred->red->has_min_threshold)
+             {
+                 valBac.u.wred.red.min_threshold = balBac->wred->red->min_threshold;
+             }
+             if(balBac->wred->red->has_max_threshold)
+             {
+                 valBac.u.wred.red.max_threshold = balBac->wred->red->max_threshold;
+             }
+             if(balBac->wred->red->has_max_probability)
+             {
+                 valBac.u.wred.red.max_probability= balBac->wred->red->max_probability;
+             }
+             if(balBac->wred->green->has_min_threshold)
+             {
+                 valBac.u.wred.green.min_threshold = balBac->wred->green->min_threshold;
+             }
+             if(balBac->wred->green->has_max_threshold)
+             {
+                 valBac.u.wred.green.max_threshold = balBac->wred->green->max_threshold;
+             }
+             if(balBac->wred->green->has_max_probability)
+             {
+                 valBac.u.wred.green.max_probability= balBac->wred->green->max_probability;
+             }
+             if(balBac->wred->yellow->has_min_threshold)
+             {
+                 valBac.u.wred.yellow.min_threshold = balBac->wred->yellow->min_threshold;
+             }
+             if(balBac->wred->yellow->has_max_threshold)
+             {
+                 valBac.u.wred.yellow.max_threshold = balBac->wred->yellow->max_threshold;
+             }
+             if(balBac->wred->yellow->has_max_probability)
+             {
+                 valBac.u.wred.yellow.max_probability= balBac->wred->yellow->max_probability;
+             }
+             break;
+           default:
+             break;
+       }
+       ASFVOLT_CFG_PROP_SET(tm_queue_obj, tm_queue, bac, BCMOS_TRUE, valBac);
+    }
+
+    err = bcmbal_cfg_set(DEFAULT_ATERM_ID, &(tm_queue_obj.hdr));
+
+    if(BCM_ERR_OK != err)
+    {
+        ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to configure the tm Queue Cfg(OLT)\n");
+        return err;
+    }
+
+    ASFVOLT_LOG(ASFVOLT_INFO, "\nSet tm Queue configuration sent to OLT. \
+                               Queue ID(%d) Sched ID(%d) Sched Dir(%d)\n", 
+                               key.id, key.sched_id, key.sched_dir );
+    return err;
+}
+
+
+/********************************************************************\
+ * Function    : bal_tm_queue_cfg_clear                         *
+ * Description : clear the OLT device tm queue configuration        *
+ ********************************************************************/
+
+uint32_t bal_tm_queue_cfg_clear(BalTmQueueKey *tm_queue_key)
+{
+    bcmos_errno err = BCM_ERR_OK;
+    bcmbal_tm_queue_cfg tm_queue_obj;   /**< declare main API struct */
+    bcmbal_tm_queue_key key = { };      /**< declare key */
+    
+    if((tm_queue_key->has_id) && (tm_queue_key->has_sched_id) && (tm_queue_key->has_sched_dir))
+    {
+       key.id = tm_queue_key->id;
+       key.sched_id = tm_queue_key->sched_id;
+       key.sched_dir = tm_queue_key->sched_dir;
+    }
+    else
+    {
+       ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to clear the tm queue cfg(OLT): Missing Key values\
+                                   Recevied key values Id(%d), Sched-Dir(%d), Sched-Id(%d) \n", 
+                                   tm_queue_key->sched_id, tm_queue_key->sched_dir, tm_queue_key->id);
+       return BAL_ERRNO__BAL_ERR_NOENT;
+    }
+
+    ASFVOLT_LOG(ASFVOLT_DEBUG, "Clearing of OLT(tm Queue) starts\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&tm_queue_obj, tm_queue, key);
+
+    err = bcmbal_cfg_clear(DEFAULT_ATERM_ID, &tm_queue_obj.hdr);
+
+    if(BCM_ERR_OK != err)
+    {
+        ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to clear the tm Queue Cfg(OLT)\n");
+        return err;
+    }
+
+    ASFVOLT_LOG(ASFVOLT_INFO, "\nClear tm Queue sent to OLT. \
+                               Queue ID(%d) Sched ID(%d) Sched Dir(%d)\n", 
+                               key.id, key.sched_id, key.sched_dir );
+    return err;
+}
+
+
+/********************************************************************\
+ * Function    : bal_tm_queue_cfg_get                               *
+ * Description : Get the OLT device tm queue configuration          *
+ ********************************************************************/
+
+uint32_t bal_tm_queue_cfg_get(BalTmQueueKey *tm_queue_key, BalTmQueueCfg *tm_queue_cfg)
+{
+    bcmos_errno err = BCM_ERR_OK;
+    bcmbal_tm_queue_cfg tm_queue_obj;   /**< declare main API struct */
+    bcmbal_tm_queue_key key = { };      /**< declare key */
+    
+    if((tm_queue_key->has_id) && (tm_queue_key->has_sched_id) && (tm_queue_key->has_sched_dir))
+    {
+       key.id = tm_queue_key->id;
+       key.sched_id = tm_queue_key->sched_id;
+       key.sched_dir = tm_queue_key->sched_dir;
+    }
+    else
+    {
+       ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to get the tm queue cfg(OLT): Missing Key values\
+                                   Recevied key values Id(%d), Sched-Dir(%d), Sched-Id(%d) \n", 
+                                   tm_queue_key->sched_id, tm_queue_key->sched_dir, tm_queue_key->id);
+       return BAL_ERRNO__BAL_ERR_NOENT;
+    }
+
+    ASFVOLT_LOG(ASFVOLT_DEBUG, "Get tm queue cfg(for OLT) starts\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&tm_queue_obj, tm_queue, key);
+
+    /* request all properties, include everything */
+    BCMBAL_CFG_PROP_GET(&tm_queue_obj, tm_queue, all_properties);
+
+    err = bcmbal_cfg_get(DEFAULT_ATERM_ID, &tm_queue_obj.hdr);
+
+    if(BCM_ERR_OK != err)
+    {
+        ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to get the tm Queue Cfg(OLT)\n");
+        return err;
+    }
+
+    ASFVOLT_LOG(ASFVOLT_INFO, "\nGet tm Queue sent to OLT. \
+                               Queue ID(%d) Sched ID(%d) Sched Dir(%d)\n", 
+                               key.id, key.sched_id, key.sched_dir );
+    return err;
+}
+
+
+/********************************************************************\
+ * Function    : bal_tm_queue_indication_cb                         *
+ * Description : Call back function registered with BAL to handle   *
+ *               event related to access terminal                   *
+ ********************************************************************/
+bcmos_errno bal_tm_queue_cfg_indication_cb(bcmbal_obj *obj)
+{
+    bcmos_errno result = BCM_ERR_OK;
+    ASFVOLT_LOG(ASFVOLT_INFO, "Processing API \'%s\' IND callback (status is %s)\n",
+		    bcmbal_objtype_str(obj->obj_type),
+		    bcmos_strerror(obj->status));
+    
+    return result;
+}
+
+