/*
** 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_

#include "asfvolt16_driver.h"
#include "bal_flow_hdlr.h"


/********************************************************************\
 * Function    : bal_fill_queue_cfg                                 *
 * Description : copy queue information from proto structure to     *
 *               BAL structure                                      *
 ********************************************************************/
static uint32_t bal_fill_queue_cfg(BalTmQueueRef       *tmp_que,
                                   bcmbal_tm_queue_ref *que_val)
{
   if(tmp_que->has_sched_id)
   {
      que_val->sched_id = tmp_que->sched_id;
      ASFVOLT_LOG(ASFVOLT_DEBUG, "que_val->sched_id = %d", que_val->sched_id);
   }

   if(tmp_que->has_queue_id)
   {
      que_val->queue_id = tmp_que->queue_id;
      ASFVOLT_LOG(ASFVOLT_DEBUG, "que_val->queue_id = %d", que_val->queue_id);
   }

   return BAL_ERRNO__BAL_ERR_OK;
}


/********************************************************************\
 * Function    : bal_fill_action_cfg                                *
 * Description : copy action information from proto structure to    *
 *               BAL structure                                      *
 ********************************************************************/
static uint32_t bal_fill_action_cfg(BalAction     *tmp_action,
                                    bcmbal_action *action_val)
{

   if(tmp_action->has_presence_mask)
   {
      action_val->presence_mask = tmp_action->presence_mask;
      if (action_val->presence_mask & BCMBAL_ACTION_ID_CMDS_BITMASK)
      {
         action_val->cmds_bitmask = tmp_action->cmds_bitmask;
         ASFVOLT_LOG(ASFVOLT_DEBUG, "action_val->cmds_bitmask = %x", action_val->cmds_bitmask);
      }

      if (action_val->presence_mask & BCMBAL_ACTION_ID_O_VID)
      {
         action_val->o_vid = tmp_action->o_vid;
         ASFVOLT_LOG(ASFVOLT_DEBUG, "action_val->o_vid = %d",  action_val->o_vid);
      }

      if (action_val->presence_mask & BCMBAL_ACTION_ID_O_PBITS)
      {
         action_val->o_pbits = tmp_action->o_pbits;
         ASFVOLT_LOG(ASFVOLT_DEBUG, "action_val->o_pbits = %d",  action_val->o_pbits);
      }

      if (action_val->presence_mask & BCMBAL_ACTION_ID_O_TPID)
      {
         action_val->o_tpid = tmp_action->o_tpid;
         ASFVOLT_LOG(ASFVOLT_DEBUG, "action_val->o_tpid = %d",  action_val->o_tpid);
      }

      if (action_val->presence_mask & BCMBAL_ACTION_ID_I_VID)
      {
         action_val->i_vid = tmp_action->i_vid;
         ASFVOLT_LOG(ASFVOLT_DEBUG, "action_val->i_vid = %d",  action_val->i_vid);
      }

      if (action_val->presence_mask & BCMBAL_ACTION_ID_I_PBITS)
      {
         action_val->i_pbits = tmp_action->i_pbits;
         ASFVOLT_LOG(ASFVOLT_DEBUG, "action_val->i_pbits = %d",  action_val->i_pbits);
      }

      if (action_val->presence_mask & BCMBAL_ACTION_ID_I_TPID)
      {
         action_val->i_tpid = tmp_action->i_tpid;
         ASFVOLT_LOG(ASFVOLT_DEBUG, "action_val->i_tpid = %d",  action_val->i_tpid);
      }
      ASFVOLT_LOG(ASFVOLT_DEBUG, "action_val->presence_mask = %x",  action_val->presence_mask);
   }
   else
   {
      ASFVOLT_LOG(ASFVOLT_ERROR, "Action is not present in the flow");
      return BAL_ERRNO__BAL_ERR_PARM;
   }

   return BAL_ERRNO__BAL_ERR_OK;
}


/********************************************************************\
 * Function    : bal_fill_classifier_cfg                            *
 * Description : copy classifier information from proto structure to*
 *               BAL structure
 ********************************************************************/
uint32_t bal_fill_classifier_cfg(BalClassifier     *tmp_classifier,
                                        bcmbal_classifier *classifier_val)
{

   if(tmp_classifier->has_presence_mask)
   {
      classifier_val->presence_mask = tmp_classifier->presence_mask;
      if (classifier_val->presence_mask  & BCMBAL_CLASSIFIER_ID_O_TPID)
      {
         classifier_val->o_tpid = tmp_classifier->o_tpid;
         ASFVOLT_LOG(ASFVOLT_DEBUG, "classifier_val->o_tpid = %d",  classifier_val->o_tpid);
      }

      if (classifier_val->presence_mask & BCMBAL_CLASSIFIER_ID_O_VID)
      {
         classifier_val->o_vid = tmp_classifier->o_vid;
         ASFVOLT_LOG(ASFVOLT_DEBUG, "classifier_val->o_vid = %d",  classifier_val->o_vid);
      }

      if (classifier_val->presence_mask & BCMBAL_CLASSIFIER_ID_I_TPID)
      {
         classifier_val->i_tpid = tmp_classifier->i_tpid;
         ASFVOLT_LOG(ASFVOLT_DEBUG, "classifier_val->i_tpid = %d",  classifier_val->i_tpid);
      }

      if (classifier_val->presence_mask & BCMBAL_CLASSIFIER_ID_I_VID)
      {
         classifier_val->i_vid = tmp_classifier->i_vid;
         ASFVOLT_LOG(ASFVOLT_DEBUG, "classifier_val->i_vid = %d",  classifier_val->i_vid);
      }

      if (classifier_val->presence_mask & BCMBAL_CLASSIFIER_ID_O_PBITS)
      {
         classifier_val->o_pbits = tmp_classifier->o_pbits;
         ASFVOLT_LOG(ASFVOLT_DEBUG, "classifier_val->o_pbits = %d",  classifier_val->o_pbits);
      }

      if (classifier_val->presence_mask & BCMBAL_CLASSIFIER_ID_I_PBITS)
      {
         classifier_val->i_pbits = tmp_classifier->i_pbits;
         ASFVOLT_LOG(ASFVOLT_DEBUG, "classifier_val->i_pbits = %d",  classifier_val->i_pbits);
      }

      if (classifier_val->presence_mask & BCMBAL_CLASSIFIER_ID_ETHER_TYPE)
      {
         classifier_val->ether_type = tmp_classifier->ether_type;
         ASFVOLT_LOG(ASFVOLT_DEBUG, "classifier_val->ether_type = %x",  classifier_val->ether_type);
      }

      if (classifier_val->presence_mask & BCMBAL_CLASSIFIER_ID_DST_MAC)
      {
         if(tmp_classifier->dst_mac.len > BCMOS_ETH_ALEN)
         {
            memcpy(classifier_val->dst_mac.u8,
                   tmp_classifier->dst_mac.data, tmp_classifier->dst_mac.len);
            /*ASFVOLT_LOG(ASFVOLT_DEBUG, "classifier_val->dst_mac= %d",  classifier_val->dst_mac);*/
         }
         else
         {
            ASFVOLT_LOG(ASFVOLT_ERROR, "dst_mac should not be more than 6 bytes."
                                        "actual bytes %lu",  tmp_classifier->dst_mac.len);
            return BAL_ERRNO__BAL_ERR_PARM;
         }
      }

      if (classifier_val->presence_mask & BCMBAL_CLASSIFIER_ID_SRC_MAC)
      {
         if(tmp_classifier->src_mac.len > BCMOS_ETH_ALEN)
         {
            memcpy(classifier_val->src_mac.u8,
                   tmp_classifier->src_mac.data, tmp_classifier->src_mac.len);
            /*ASFVOLT_LOG(ASFVOLT_DEBUG, "classifier_val->src_mac= %x",  classifier_val->src_mac);*/
         }
         else
         {
            ASFVOLT_LOG(ASFVOLT_ERROR, "src_mac should not be more than 6 bytes."
                                        "actual bytes %lu",  tmp_classifier->src_mac.len);
            return BAL_ERRNO__BAL_ERR_PARM;
         }

      }

      if (classifier_val->presence_mask & BCMBAL_CLASSIFIER_ID_IP_PROTO)
      {
         classifier_val->ip_proto  = tmp_classifier->ip_proto;
         ASFVOLT_LOG(ASFVOLT_DEBUG, "classifier_val->ip_proto = %x",  classifier_val->ip_proto);
      }

      if (classifier_val->presence_mask & BCMBAL_CLASSIFIER_ID_DST_IP)
      {
         classifier_val->dst_ip.u32 = tmp_classifier->dst_ip;
         ASFVOLT_LOG(ASFVOLT_DEBUG, "classifier_val->dst_ip = %x",  classifier_val->dst_ip.u32);
      }

      if (classifier_val->presence_mask & BCMBAL_CLASSIFIER_ID_SRC_IP)
      {
         classifier_val->src_ip.u32 = tmp_classifier->src_ip;
         ASFVOLT_LOG(ASFVOLT_DEBUG, "classifier_val->src_ip = %x",  classifier_val->src_ip.u32);
      }

      if (classifier_val->presence_mask & BCMBAL_CLASSIFIER_ID_SRC_PORT)
      {
         classifier_val->src_port = tmp_classifier->src_port;
         ASFVOLT_LOG(ASFVOLT_DEBUG, "classifier_val->src_port = %d",  classifier_val->src_port);
      }

      if (classifier_val->presence_mask & BCMBAL_CLASSIFIER_ID_DST_PORT)
      {
         classifier_val->dst_port = tmp_classifier->dst_port;
         ASFVOLT_LOG(ASFVOLT_DEBUG, "classifier_val->dst_port = %d",  classifier_val->dst_port);
      }

      if (classifier_val->presence_mask & BCMBAL_CLASSIFIER_ID_PKT_TAG_TYPE)
      {
         classifier_val->pkt_tag_type = tmp_classifier->pkt_tag_type;
         ASFVOLT_LOG(ASFVOLT_DEBUG, "classifier_val->pkt_tag_type = %x",  classifier_val->pkt_tag_type);
      }

      ASFVOLT_LOG(ASFVOLT_DEBUG, "classifier_val->presence_mask = %x",  classifier_val->presence_mask);
   }
   else
   {
      ASFVOLT_LOG(ASFVOLT_ERROR, "Classifier is not present in the flow");
      return BAL_ERRNO__BAL_ERR_PARM;
   }

   return BAL_ERRNO__BAL_ERR_OK;
}

/********************************************************************\
 * Function    : bal_flow_cfg_req                                   *
 * Description : Configure the the OLT DEVICE with flow information *
 *               using BAL Apis                                     *
 ********************************************************************/
uint32_t bal_flow_cfg_set(BalFlowCfg *flow_cfg)
{
   bcmos_errno err = BCM_ERR_OK;
   BalErrno   bal_err = BAL_ERRNO__BAL_ERR_OK;
   bcmbal_flow_cfg cfg;        /**< declare main API struct */
   bcmbal_flow_key key = { 0, 0};  /**< declare key */
   bcmbal_classifier classifier_value = {};
   bcmbal_action action_value = {};
   bcmbal_tm_queue_ref queue_value = {};

   /* build key from CLI parameters */
   if(flow_cfg->key->has_flow_id)
   {
      key.flow_id = (bcmbal_flow_id) flow_cfg->key->flow_id;
   }
   else
   {
      ASFVOLT_LOG(ASFVOLT_ERROR, "Invalid Flow Id (%d)", flow_cfg->key->flow_id);
      return BAL_ERRNO__BAL_ERR_PARM;
   }

   if (flow_cfg->data->admin_state == BAL_STATE__BAL_STATE_UP )
   {
       ASFVOLT_LOG(ASFVOLT_INFO, "Adding the flow to OLT. FlowID(%d)", flow_cfg->key->flow_id);
   }
   else
   {
       ASFVOLT_LOG(ASFVOLT_INFO, "Deleting the flow at OLT. FlowID(%d)", flow_cfg->key->flow_id);
   }

   if (!flow_cfg->key->has_flow_type &&
         ((flow_cfg->key->flow_type < BAL_FLOW_TYPE__BAL_FLOW_TYPE_UPSTREAM) ||
         flow_cfg->key->flow_type > BAL_FLOW_TYPE__BAL_FLOW_TYPE_MULTICAST ))
   {
      ASFVOLT_LOG(ASFVOLT_ERROR, "Flow type is not supported (%d)", flow_cfg->key->flow_type);
      return BAL_ERRNO__BAL_ERR_PARM;
   }
   else
   {
      ASFVOLT_LOG(ASFVOLT_DEBUG, "flow_type = %d",  flow_cfg->key->flow_type);
      key.flow_type = (bcmbal_flow_type) flow_cfg->key->flow_type;
   }

   /* init the API struct */
   BCMBAL_CFG_INIT(&cfg, flow, key);

   /* decode API parameters from grpc-c */
   /* Admin State */
   ASFVOLT_CFG_PROP_SET(cfg, flow, admin_state,
                        BCMOS_TRUE,
                        flow_cfg->data->admin_state);
   ASFVOLT_LOG(ASFVOLT_DEBUG, "admin state = %d",  flow_cfg->data->admin_state);

   /* Operational status */
   ASFVOLT_CFG_PROP_SET(cfg, flow, oper_status,
                        flow_cfg->data->has_oper_status,
                        flow_cfg->data->oper_status);
   ASFVOLT_LOG(ASFVOLT_DEBUG, "Oper.status = %d",  flow_cfg->data->oper_status);

   /* Access Side interface ID */
   ASFVOLT_CFG_PROP_SET(cfg, flow, access_int_id,
                        BCMOS_TRUE,
                        flow_cfg->data->access_int_id);
   ASFVOLT_LOG(ASFVOLT_DEBUG, "access_int_id = %d",  flow_cfg->data->access_int_id);

   /* Network interface ID */
   ASFVOLT_CFG_PROP_SET(cfg, flow, network_int_id,
                        BCMOS_TRUE,
                        flow_cfg->data->network_int_id);
   ASFVOLT_LOG(ASFVOLT_DEBUG, "network_int_id = %d",  flow_cfg->data->network_int_id);

   /* ONU ID */
   if(BAL_FLOW_TYPE__BAL_FLOW_TYPE_MULTICAST != flow_cfg->key->flow_type)
   {
      ASFVOLT_CFG_PROP_SET(cfg, flow, sub_term_id,
                           flow_cfg->data->has_sub_term_id,
                           flow_cfg->data->sub_term_id);
      ASFVOLT_LOG(ASFVOLT_DEBUG, "sub_term_id = %d",  flow_cfg->data->sub_term_id);
   }
   else if (BAL_FLOW_TYPE__BAL_FLOW_TYPE_MULTICAST == flow_cfg->key->flow_type)
   {
      /* In case of Multicast the flow belongs to particular group */
      ASFVOLT_CFG_PROP_SET(cfg, flow, group_id,
                            flow_cfg->data->has_group_id,
                            flow_cfg->data->group_id);
      ASFVOLT_LOG(ASFVOLT_DEBUG, "group_id = %d",  flow_cfg->data->group_id);
   }

   /*Resolve MAC*/
   ASFVOLT_CFG_PROP_SET(cfg, flow, resolve_mac,
                         flow_cfg->data->has_resolve_mac,
                         flow_cfg->data->resolve_mac);
   ASFVOLT_LOG(ASFVOLT_DEBUG, "resolve_mac = %d",  flow_cfg->data->resolve_mac);

   /*Gem port*/
   ASFVOLT_CFG_PROP_SET(cfg, flow, svc_port_id,
                         flow_cfg->data->has_svc_port_id,
                         flow_cfg->data->svc_port_id);
   ASFVOLT_LOG(ASFVOLT_DEBUG, "svc_port_id = %d",  flow_cfg->data->svc_port_id);

   /*priority*/
   ASFVOLT_CFG_PROP_SET(cfg, flow, priority,
                        flow_cfg->data->has_priority,
                        flow_cfg->data->priority);
   ASFVOLT_LOG(ASFVOLT_DEBUG, "priority = %d",flow_cfg->data->priority);

   BalClassifier *tmp_classifier = (BalClassifier*)(flow_cfg->data->classifier);

   if (tmp_classifier != NULL)
   {
      bal_err = bal_fill_classifier_cfg(tmp_classifier, &classifier_value);

      if(bal_err != BAL_ERRNO__BAL_ERR_OK)
      {
         ASFVOLT_LOG(ASFVOLT_ERROR,
               "Addition of flow %d failed while processing classifier",
               flow_cfg->key->flow_id);
         return bal_err;
      }

      ASFVOLT_CFG_PROP_SET(cfg, flow, classifier, BCMOS_TRUE, classifier_value);
   }
   else
   {
      ASFVOLT_LOG(ASFVOLT_DEBUG, "No Classifier for flow");
   }

   BalAction *tmp_action = (BalAction*)(flow_cfg->data->action);

   if (tmp_action != NULL)
   {
      bal_err = bal_fill_action_cfg(tmp_action, &action_value);

      if(bal_err != BAL_ERRNO__BAL_ERR_OK)
      {
         ASFVOLT_LOG(ASFVOLT_ERROR,
               "Addition of flow %d failed while processing action",
               flow_cfg->key->flow_id);
         return bal_err;
      }
      ASFVOLT_CFG_PROP_SET(cfg, flow, action, BCMOS_TRUE, action_value);
   }
   else
   {
      ASFVOLT_LOG(ASFVOLT_DEBUG, "No Action for flow");
   }

   /*cookie*/
   ASFVOLT_CFG_PROP_SET(cfg, flow, cookie,
                        flow_cfg->data->has_cookie,
                        flow_cfg->data->cookie);
   ASFVOLT_LOG(ASFVOLT_DEBUG, "cookie = %lx",flow_cfg->data->cookie);

   /*Egress queue*/
   BalTmQueueRef *tmp_que = (BalTmQueueRef*)(flow_cfg->data->queue);

   if (tmp_que != NULL)
   {
      bal_err = bal_fill_queue_cfg(tmp_que, &queue_value);

      if(bal_err != BAL_ERRNO__BAL_ERR_OK)
      {
         ASFVOLT_LOG(ASFVOLT_ERROR,
               "Addition of flow %d failed while processing queue",
               flow_cfg->key->flow_id);
         return bal_err;
      }
      ASFVOLT_CFG_PROP_SET(cfg, flow, queue, BCMOS_TRUE, queue_value);
   }
   else
   {
      ASFVOLT_LOG(ASFVOLT_DEBUG, "No queue Information for flow");
   }
   /*dba_tm_sched_id*/
   ASFVOLT_CFG_PROP_SET(cfg, flow, dba_tm_sched_id,
                        flow_cfg->data->has_dba_tm_sched_id,
                        flow_cfg->data->dba_tm_sched_id);
   ASFVOLT_LOG(ASFVOLT_DEBUG, "tm_sched used for dba = %d",flow_cfg->data->dba_tm_sched_id);

   err = bcmbal_cfg_set(DEFAULT_ATERM_ID, &cfg.hdr);
   if(err != BCM_ERR_OK)
   {
        ASFVOLT_LOG(ASFVOLT_ERROR,
              "Failed to configure the flow. FlowId(%d)", key.flow_id);
        return BAL_ERRNO__BAL_ERR_INTERNAL;
   }
   return BAL_ERRNO__BAL_ERR_OK;
}


/********************************************************************\
 * Function    : bal_flow_cfg_clear                                 *
 * Description : Deletes/Clears the OLT DEVICE with flow            *
 *               information using BAL Apis                         *
 ********************************************************************/
uint32_t bal_flow_cfg_clear(BalFlowKey *flow_key)
{
   bcmos_errno err = BCM_ERR_OK;
   bcmbal_flow_cfg cfg;        /**< declare main API struct */
   bcmbal_flow_key key = { };  /**< declare key */

   if (flow_key->has_flow_id && flow_key->has_flow_type)
   {
      key.flow_id = flow_key->flow_id;
      key.flow_type = flow_key->flow_type;
   }
   else
   {
      ASFVOLT_LOG(ASFVOLT_DEBUG, "Invalid Flow Parameters to clear FlowId(%d), FlowType(%d)",
                                  key.flow_id, key.flow_type);
      return BAL_ERRNO__BAL_ERR_PARM;
   }

   ASFVOLT_LOG(ASFVOLT_DEBUG, "FlowId(%d), FlowType(%d)", key.flow_id, key.flow_type);

   /* init the API struct */
   BCMBAL_CFG_INIT(&cfg, flow, key);

   /* call API */
   err = bcmbal_cfg_clear(DEFAULT_ATERM_ID, &cfg.hdr);
   if( err != BCM_ERR_OK)
   {
      ASFVOLT_LOG(ASFVOLT_INFO,
          "Failed to clear the Flow. FlowID(%d) FlowType(%d)",
                  key.flow_id, key.flow_type);
      return BAL_ERRNO__BAL_ERR_INTERNAL;
   }
   return BAL_ERRNO__BAL_ERR_OK;
}


/********************************************************************\
 * Function    : bal_flow_cfg_get                                   *
 * Description : Get flow information from BAL.                     *
 ********************************************************************/
uint32_t bal_flow_cfg_get(BalFlowCfg *flow_cfg)
{

   bcmos_errno err = BCM_ERR_OK;
   bcmbal_flow_cfg cfg;        /**< declare main API struct */
   bcmbal_flow_key key = { };  /**< declare key */

   if (flow_cfg->key->has_flow_id && flow_cfg->key->has_flow_type)
   {
      key.flow_id = flow_cfg->key->flow_id;
      key.flow_type = flow_cfg->key->flow_type;
   }
   else
   {
      ASFVOLT_LOG(ASFVOLT_DEBUG, "Invalid Flow Parameters to get cfg FlowId(%d), FlowType(%d)",
                                  key.flow_id, key.flow_type);
      return BAL_ERRNO__BAL_ERR_PARM;
   }

   /* init the API struct */
   BCMBAL_CFG_INIT(&cfg, flow, key);

   BCMBAL_CFG_PROP_GET(&cfg, flow, all_properties);

   /* call API */
   err = bcmbal_cfg_get(DEFAULT_ATERM_ID, &cfg.hdr);
   if( err != BCM_ERR_OK)
   {
      ASFVOLT_LOG(ASFVOLT_INFO,
            "Failed to get Flow Info. FlowID(%d) FlowType(%d)",
            key.flow_id, key.flow_type);
      return BAL_ERRNO__BAL_ERR_INTERNAL;
   }

   ASFVOLT_LOG(ASFVOLT_INFO, "Get Group cfg sent to OLT for Flow Id(%d)",
                               key.flow_id);

   memcpy(flow_cfg->key, &key, sizeof(BalFlowKey));
   memcpy(flow_cfg->data, &cfg, sizeof(BalFlowCfgData));

   return BAL_ERRNO__BAL_ERR_OK;
}
