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;
+}
+
+