DAL

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using JYK;

namespace Database
{
    public class DAL
    {
        #region 运行查询语句返回记录(DataSet、DataTable、DataRow、String[]、String)

        public static DataSet RunSqlDataSet(string sql)
        {
            string msg = "";
            return RunSqlDataSet(sql, out msg);
        }

        /// <summary>
        /// 运行SQL查询语句 返回DataSet。可以传入多条查询语句,返回的DataSet里会有多个DataTable
        /// </summary>
        /// <param name="SQL">查询语句。比如select * from tableName</param>
        #region 函数实现 — — RunSqlDataSet
        public static DataSet RunSqlDataSet(string sql, out string ErrorMsg)
        {
            ErrorMsg = "";
            //设置DataAdapter
            DbDataAdapter da = Factory.CreateDataAdapter(sql);
            try
            {
                DataSet DS = new DataSet();
                da.Fill(DS);
                return DS;
            }
            catch (Exception ex)
            {
                WriteLog.SetErrorMsg("RunSqlDataSet", sql, ex.Message);    //处理错误
                ErrorMsg = ex.Message + "<BR>RunSqlDataSet_SQL:" + sql;
                return null;
            }
            finally
            {
                //关闭数据库,销毁实例
                Factory.DbDataAdapterDispose(da);

            }
        }
        #endregion


        public static DataTable RunSqlDataTable(string sql)
        {
            string msg = "";
            return RunSqlDataTable(sql, out msg);

        }

        /// <summary>
        /// 运行SQL查询语句 返回DataTable。
        /// </summary>
        /// <param name="SQL">查询语句。比如select * from tableName</param>
        ///
        #region 函数实现 — — RunSqlDataTable
        public static DataTable RunSqlDataTable(string sql, out string ErrorMsg)
        {
            ErrorMsg = "";
            //设置DataAdapter
            DbDataAdapter da = Factory.CreateDataAdapter(sql);
            try
            {
                DataTable DT = new DataTable();
                da.Fill(DT);
                return DT;
            }
            catch (Exception ex)
            {
                WriteLog.SetErrorMsg("RunSqlDataTable", sql, ex.Message);    //处理错误
                ErrorMsg = ex.Message + "<BR>RunSqlDataSet_SQL:" + sql;
                return null;
            }
            finally
            {
                //关闭数据库,销毁实例
                Factory.DbDataAdapterDispose(da);
            }
        }
        #endregion


        /// <summary>
        /// 运行SQl语句返回第一条记录。返回DataRow
        /// </summary>
        /// <param name="SQL">查询语句。比如select * from tableName</param>
        ///
        #region 函数实现 — — RunSqlDataRow
        public static DataRow RunSqlDataRow(string sql)
        {
            //设置DataAdapter
            DbDataAdapter da = Factory.CreateDataAdapter(sql);
            try
            {
                DataTable DT = new DataTable();
                da.Fill(DT);
                if (DT.Rows.Count > 0)
                    return DT.Rows[0];
                else
                    return null;
            }
            catch (Exception ex)
            {
                WriteLog.SetErrorMsg("RunSqlDataRow", sql, ex.Message);    //处理错误
                return null;
            }
            finally
            {
                //关闭数据库,销毁实例
                Factory.DbDataAdapterDispose(da);
            }

        }
        #endregion


        /// <summary>
        /// 运行SQl语句返回第一条记录的数组。返回字符串数组
        /// </summary>
        /// <param name="SQL">查询语句。比如select top 1 * from tableName</param>
        ///
        #region 函数实现 — — RunSqlStrings
        public static string[] RunSqlStrings(string sql)
        {
            //传入查询语句,返回第一条记录的字符串数组
            //设置command
            DbCommand cm = Factory.CreateCommand(sql);

            try
            {
                cm.Connection.Open();

                DbDataReader r = cm.ExecuteReader(CommandBehavior.SingleRow);
                if (r.Read())
                {
                    int ArrLength = r.FieldCount;

                    string[] strValue = new string[ArrLength];
                    for (int i = 0; i < ArrLength; i++)
                        strValue[i] = r.GetValue(i).ToString();
                    return strValue;
                }
                else
                {
                    r.Close();
                    return null;
                }
            }
            catch (Exception ex)
            {
                WriteLog.SetErrorMsg("RunSqlStrings", sql, ex.Message);    //处理错误
                return null;
            }
            finally
            {
                cm.Connection.Close();
                cm.Connection.Dispose();
                cm.Dispose();

            }
        }
        #endregion

        /// <summary>
        /// 运行SQl语句返回每一条记录的第一个字段的数组。返回字符串数组
        /// </summary>
        /// <param name="SQL">查询语句。比如select myName from tableName</param>
        ///
        #region 函数实现 — — RunSqlStringsByRow
        public static string[] RunSqlStringsByRow(string sql)
        {

            //传入查询语句,每一条记录的第一个字段的数组。返回字符串数组
            //设置command
            DbCommand cm = Factory.CreateCommand(sql);

            try
            {
                cm.Connection.Open();

                DbDataReader r = cm.ExecuteReader();

                System.Collections.Generic.List<string> list = new List<string>();
                while (r.Read())
                    list.Add(r[0].ToString());

                return list.ToArray();

            }
            catch (Exception ex)
            {
                WriteLog.SetErrorMsg("RunSqlStringsByRow", sql, ex.Message);    //处理错误
                return null;
            }
            finally
            {
                cm.Connection.Close();
                cm.Connection.Dispose();
                cm.Dispose();

            }
        }
        #endregion

        /// <summary>
        /// 运行SQl语句返回第一条记录的第一列的值。
        /// </summary>
        /// <param name="SQL">查询语句。比如select top 1 ID from tableName where userName='aa'。会返回ID的内容</param>
        ///
        #region 函数实现 — — RunSqlGetID
        public static string RunSqlGetID(string sql)
        {
            //设置command
            DbCommand cm = Factory.CreateCommand(sql);

            try
            {
                cm.Connection.Open();

                DbDataReader r = cm.ExecuteReader(CommandBehavior.SingleRow);
                if (r.Read())
                    return r.GetValue(0).ToString();
                else
                    return null;
            }
            catch (Exception ex)
            {
                WriteLog.SetErrorMsg("RunSqlGetID", sql, ex.Message);    //处理错误
                return null;
            }
            finally
            {
                cm.Connection.Close();
                cm.Connection.Dispose();
                cm.Dispose();
            }
        }
        #endregion

        #endregion
        #region 运行查询语句不返回记录集(无返回记录、检查持否存在指定的记录)
        /// <summary>
        /// 运行SQL查询语句,不返回记录集。用于添加、修改、删除等操作
        /// </summary>
        /// <param name="SQL">查询语句。比如insert into tableName 、update tableName</param>
        ///
        #region 函数实现 — — RunSql
        public static void RunSql(string sql)
        {
            //设置command
            DbCommand cm = Factory.CreateCommand(sql);

            try
            {
                cm.Connection.Open();
                cm.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                WriteLog.SetErrorMsg("RunSql", sql, ex.Message);    //处理错误
            }
            finally
            {
                cm.Connection.Close();
                cm.Connection.Dispose();
                cm.Dispose();
            }
        }
        #endregion

        /// <summary>
        /// 执行一条SQL语句,看是否能查到记录 有:返回true;没有返回false,用于判断是否重名
        /// </summary>
        /// <param name="SQL">查询语句。比如select ID from tableName where userName='aa'</param>
        ///
        #region 函数实现 — — RunSqlExists
        public static bool RunSqlExists(string sql)
        {
            //设置command
            DbCommand cm = Factory.CreateCommand(sql);

            try
            {
                if (cm.Connection.State == ConnectionState.Broken || cm.Connection.State == ConnectionState.Closed)
                    cm.Connection.Open();

                DbDataReader r = cm.ExecuteReader(CommandBehavior.CloseConnection);
                if (r.HasRows)
                    return true;
                else
                    return false;
            }
            catch (Exception ex)
            {
                WriteLog.SetErrorMsg("RunSqlDataSet", sql, ex.Message);    //处理错误
                return true;
            }
            finally
            {
                cm.Connection.Close();
                cm.Connection.Dispose();
                cm.Dispose();
            }
        }
        #endregion

        #endregion
        #region 查询语句的方式添加、修改数据

        /// <summary>
        /// 添加记录。传入表名,字段数组,值数组,返回新生成记录的ID
        /// </summary>
        /// <param name="TableName">要添加记录的表的名称</param>
        /// <param name="ziduan">字段名数组</param>
        /// <param name="msg">字段对应的值的数组</param>
        /// <returns></returns>
        public static string InsertDataStr(string TableName, string[] columns, string[] msg)
        {
            //添加数据    返回新添加的ID
            System.Text.StringBuilder SQL = new System.Text.StringBuilder(300);
            SQL.Append("insert into ");                    //insert into
            SQL.Append(TableName);
            SQL.Append(" (");
            int i;
            for (i = 0; i < columns.Length - 1; i++)        //字段
            {
                SQL.Append(columns[i]);
                SQL.Append(",");
            }
            SQL.Append(columns[i]);
            SQL.Append(")  values ('");

            for (i = 0; i < columns.Length - 1; i++)
            {
                SQL.Append(msg[i]);
                SQL.Append("','");
            }
            SQL.Append(msg[i]);
            if (WebConfig.DataBaseType() == 1)
                SQL.Append("')  select scope_identity() as a1");
            else
                SQL.Append("')");

            string re = RunSqlGetID(SQL.ToString());
            SQL.Length = 1;
            if (re == null)
                return "-1";
            else
                return re;
        }

        /// <summary>
        /// 修改记录。传入表名,字段数组,值数组
        /// </summary>
        /// <param name="TableName">要修改记录的表的名称</param>
        /// <param name="ziduan">字段名数组</param>
        /// <param name="msg">字段对应的值的数组</param>
        /// <param name="tiaojian">条件 ,加在where 后面的语句</param>
        /// <returns></returns>
        public static bool UpdateData(string TableName, string[] cloumns, string[] msg, string myWhere)
        {
            System.Text.StringBuilder SQL = new System.Text.StringBuilder(300);
            SQL.Append("update ");                    //update
            SQL.Append(TableName);
            SQL.Append(" set ");
            int i;
            for (i = 0; i < cloumns.Length - 1; i++)
            {
                SQL.Append(cloumns[i]);                    //update
                SQL.Append("='");
                SQL.Append(msg[i]);
                SQL.Append("',");
            }
            SQL.Append(cloumns[i]);                    //update
            SQL.Append("='");
            SQL.Append(msg[i]);
            SQL.Append("' where ");
            SQL.Append(myWhere);

            RunSql(SQL.ToString());
            return true;
        }
        #endregion
    }
}

static int _dalErpsPortStateSet(int instanceNo, user_port_list *uplist, int state) { return hiMstpPortStateSet(instanceNo, uplist, state); } static int _dalErpsPortConfigHandle(dal_ado_t *adoi, void *handler, char *key) { UINT32 instanceNo = 0; user_port up = {}; user_port_list uplistLocal = {}; int state = 0; DAL_ERPS_KEY_PORT_PARSE(key, up, instanceNo); if (PFM_ERR_C_OK != uplist_init(&uplistLocal)) { return ERR_NO_MEMORY; } if (UP_IS_LOCAL(up) && !UP_IS_STACK(up) /*&& !UP_IS_PLP(up)*/) { UP_LIST_ADD(&uplistLocal, up); DBG("unit:%d index:%d", UP_UNIT(up), UP_PORT(up)); } if (DAL_ADOI_ENTRY_KEY_EMPTY(handler)) { /* do nothing */ } else { DAL_ADOI_ENTRY_FIELD_LOOP(handler, key) { if (DAL_ADOI_ENTRY_FIELD_MATCH(handler, DAL_ERPS_K_PORT_F_STATE)) { dalAdoiGetEntryI32(adoi, DAL_ERPS_K_PORT_PREFIX, &state); } } APPL_IF_ERR_RET(_dalErpsPortStateSet(instanceNo, &uplistLocal, state)); DBG("_dalErpsPortConfigHandle up:%d instance:%d state %d\n",UP_INDEX(up), instanceNo, state); } uplist_free(&uplistLocal); return ERR_NO_ERROR; } static int _dalErpsPortCfmHandle(dal_ado_t *adoi, void *handler, char *key) { UINT32 ring = 0; user_port up = {}; int enable = 0; int cvlan = 0; int send = 0; int flowId = 0; UINT32 packetId = 0; DAL_ERPS_KEY_PORT_CFM_PARSE(key, up, ring); if (!UP_IS_LOCAL(up) || UP_IS_STACK(up)) { DBG("invalid up: unit:%d index:%d", UP_UNIT(up), UP_PORT(up)); return ERR_NO_ERROR; } if (DAL_ADOI_ENTRY_KEY_EMPTY(handler)) { /* do nothing */ } else { DAL_ADOI_ENTRY_FIELD_LOOP(handler, key) { if (DAL_ADOI_ENTRY_FIELD_MATCH(handler, DAL_ERPS_K_PORT_CFM_F_ENABLE)) { dalAdoiGetEntryI32(adoi, DAL_ERPS_K_PORT_CFM_PREFIX, &enable); APPL_IF_ERR_RET(dalErpsPort2FlowId(up, &flowId)); return hiErpsOamEntrySet(flowId, enable); } else if (DAL_ADOI_ENTRY_FIELD_MATCH(handler, DAL_ERPS_K_PORT_CFM_F_CVLAN)) { dalAdoiGetEntryI32(adoi, DAL_ERPS_K_PORT_CFM_PREFIX, &cvlan); } else if (DAL_ADOI_ENTRY_FIELD_MATCH(handler, DAL_ERPS_K_PORT_CFM_F_SEND)) { dalAdoiGetEntryI32(adoi, DAL_ERPS_K_PORT_CFM_PREFIX, &send); } } if (send) { if (!dalErpsCfmPortInUse(up)) { /* send时,hw会分配一个packetId,后续remove时需要使用该id去remove,因此此处的packetId需要记录下来, 同时flowid也一并分配好,将 端口<->packetId<->flowId 对应关系绑定好,方便后续统一管理 */ APPL_IF_ERR_RET(dalErpsFlowIdAllocByPort(up, &flowId)); APPL_IF_ERR_RET(hiErpsOamCcmTxFlowSend(up, cvlan, &packetId)); APPL_IF_ERR_RET(dalErpsPortPacketIdSet(up, packetId)); APPL_IF_ERR_RET(hiErpsTpclEntrySet(up, flowId, TRUE)); } } else { if (dalErpsCfmPortInUse(up)) { APPL_IF_ERR_RET(dalErpsPort2PacketId(up, &packetId)); APPL_IF_ERR_RET(dalErpsPort2FlowId(up, &flowId)); APPL_IF_ERR_RET(hiErpsOamCcmPacketRemove(up, packetId)); APPL_IF_ERR_RET(dalErpsCfmPortReset(up)); APPL_IF_ERR_RET(hiErpsTpclEntrySet(up, flowId, FALSE)); } } } return ERR_NO_ERROR; } /*! *\fn _dalErpsHandler *\brief erps dmp dal handler *\details * *\param[in] * * * *\param[out] * *\return int *\retval ERR_NO_ERROR 成功 * other 失败 * *\note * */ static int _dalErpsHandler(IN dal_ado_t *adoi, IN dal_attr *attr) { int ret = ERR_NO_ERROR; char *key = NULL; void *handler = NULL; UINT8 pkt_trap = 0; APPL_ENSURE_RET_VAL(adoi && attr, ERR_BAD_PARAM); DAL_ADOI_OPTION_LOOP(adoi) { if (NULL == (key = DAL_ADOI_OPTION_KEY(adoi))) { break; } if (STR_EQUAL(key, DAL_ERPS_K_PKT_TRAP_CPU_OPT)) { if (DAL_ADOI_OPTION_FIELD_MATCH(adoi, DAL_ERPS_F_ENABLE)) { dalAdoiGetOptionUI8(adoi, &pkt_trap); APPL_IF_ERR_DONE(ret, hiErpsTrapCpuSet(pkt_trap)); } } } if (NULL != (handler = DAL_ADOI_ENTRY(adoi, DAL_ERPS_K_PORT_PREFIX))) { // DBG_ALZ("lag port cfg"); DAL_ADOI_ENTRY_LOOP(handler) { char *key = NULL; if (NULL == (key = DAL_ADOI_ENTRY_KEY(handler))) { DBG_ERR("key is NULL"); continue; } /* KEY inner field&value loop */ if (DAL_ADOI_ENTRY_KEY_MATCH(handler, DAL_ERPS_K_PORT_ALL)) { _dalErpsPortConfigHandle(adoi, handler, key); } } } if (NULL != (handler = DAL_ADOI_ENTRY(adoi, DAL_ERPS_K_PORT_CFM_PREFIX))) { // DBG_ALZ("lag port cfg"); DAL_ADOI_ENTRY_LOOP(handler) { char *key = NULL; if (NULL == (key = DAL_ADOI_ENTRY_KEY(handler))) { DBG_ERR("key is NULL"); continue; } /* KEY inner field&value loop */ if (DAL_ADOI_ENTRY_KEY_MATCH(handler, DAL_ERPS_K_PORT_CFM_ALL)) { _dalErpsPortCfmHandle(adoi, handler, key); } } } done: if (ERR_NO_ERROR != ret) { DE("ERROR: %d", ret); attr->err.errCode = ret; attr->err.errFlag = DAL_ERR_DISP; attr->err.pubEn = TRUE; } return ret; } /* 获取端口硬件转发配置 */ static int _dalErpsPortStateLoad() { int ret = ERR_NO_ERROR; int rv = PFM_ERR_C_OK; dal_ado_t *asdoi = NULL; user_port_list uplist = {}; user_port up = {}; void *handler = NULL; UINT32 instanceNo = 0; int state = 0; if (PFM_ERR_C_OK != uplist_init(&uplist)) { return ERR_NO_MEMORY; } asdoi = dalAsdoiCreate(DMP_DEV_NAME_SWITCHMAC, DAL_MOD_ERPS, DAL_CFG_TYPE_ENTRY); dalAdoiEntryTableAppend(asdoi, DAL_ERPS_K_PORT_PREFIX); dalAdoiEntryOperAppend(asdoi, DAL_ERPS_K_PORT_PREFIX, DAL_OPER_GET_ALL); /* 获取端口配置 */ rv = dalGet(asdoi); if(PFM_ERR_C_OK != rv) { //ret = ERR_EXEC; goto done; } if (NULL != (handler = DAL_ADOI_ENTRY(asdoi, DAL_ERPS_K_PORT_PREFIX))) { DAL_ADOI_ENTRY_LOOP(handler) { char *key = NULL; if(DAL_ADOI_ENTRY_KEY_EMPTY(handler)) { /* do nothing */ } if(NULL == (key = DAL_ADOI_ENTRY_KEY(handler))) { DBG_ERR("key is NULL"); continue; } else { DAL_ERPS_KEY_PORT_PARSE(key, up, instanceNo); UP_LIST_CLEAR(&uplist); UP_LIST_ADD(&uplist, up); DAL_ADOI_ENTRY_FIELD_LOOP(handler, key) { if (DAL_ADOI_ENTRY_FIELD_MATCH(handler, DAL_ERPS_K_PORT_F_STATE)) { dalAdoiGetEntryI32(asdoi, DAL_ERPS_K_PORT_PREFIX, &state); } } /* 进行硬件配置 */ _dalErpsPortStateSet(instanceNo, &uplist, state); } } } done: uplist_free(&uplist); dalAdoiDestroy(asdoi); return ret; } /* 获取端口硬件cfm配置 */ static int _dalErpsPortCfmLoad() { int ret = ERR_NO_ERROR; int rv = PFM_ERR_C_OK; dal_ado_t *asdoi = NULL; void *handler = NULL; asdoi = dalAsdoiCreate(DMP_DEV_NAME_SWITCHMAC, DAL_MOD_ERPS, DAL_CFG_TYPE_ENTRY); dalAdoiEntryTableAppend(asdoi, DAL_ERPS_K_PORT_CFM_PREFIX); dalAdoiEntryOperAppend(asdoi, DAL_ERPS_K_PORT_CFM_PREFIX, DAL_OPER_GET_ALL); /* 获取端口配置 */ rv = dalGet(asdoi); if(PFM_ERR_C_OK != rv) { //ret = ERR_EXEC; goto done; } if (NULL != (handler = DAL_ADOI_ENTRY(asdoi, DAL_ERPS_K_PORT_CFM_PREFIX))) { DAL_ADOI_ENTRY_LOOP(handler) { char *key = NULL; if(NULL == (key = DAL_ADOI_ENTRY_KEY(handler))) { DBG_ERR("key is NULL"); continue; } if (DAL_ADOI_ENTRY_KEY_MATCH(handler, DAL_ERPS_K_PORT_CFM_ALL)) { _dalErpsPortCfmHandle(asdoi, handler, key); } } } done: dalAdoiDestroy(asdoi); return ret; } /**************************************************************************************************/ /* PUBLIC_FUNCTIONS */ /**************************************************************************************************/ int dalErpsLoad() { APPL_IF_ERR_RET(dalErpsCfmPortResetAll()); APPL_IF_ERR_RET(_dalErpsPortStateLoad()); APPL_IF_ERR_RET(_dalErpsPortCfmLoad()); return ERR_NO_ERROR; } int dalErpsDefcfgInit() { dalErpsLoad(); return ERR_NO_ERROR; } //此处先由ERPS将mstp所有instance下的状态置为forward,后续mstp适配完之后,此处reset可以直接注释掉 int dalErpsReset() { // return hiMstpReset(); return ERR_NO_ERROR; } void dalErpsTpclReload() { dal_ado_t *asdoi = NULL; dal_attr attr = {}; int ret = ERR_NO_ERROR; /* dal中获取数据 */ asdoi = dalAsdoiCreate(DMP_DEV_NAME_SWITCHMAC, DAL_MOD_ERPS, DAL_CFG_TYPE_OPTION); dalAdoiOptionOperAppend(asdoi, DAL_OPER_GET); dalAdoiAddOptionKey(asdoi, DAL_ERPS_K_PKT_TRAP_CPU_OPT); PFM_IF_FAIL_DONE_VOID(dalGet(asdoi)); APPL_IF_ERR_DONE(ret, _dalErpsHandler(asdoi, &attr)); done: dalAdoiDestroy(asdoi); return; } #if 0 //堆叠口生效后需要写硬件将端口转发状态置为forward int dalErpsCascadePortHandle(user_port_list *enableList, user_port_list *disableList) { int ret = ERR_NO_ERROR; int i = 0; for (i = 0; i <= dal_max_erps_inst_cnt; i++) { _dalErpsPortStateSet(i, enableList, STP_FORWARD); } return ret; } #endif //detach 事件无需响应 int dalErpsDetachHandle(char* detachListStr, UINT8 detachFlag) { return ERR_NO_ERROR; } BOOL dalErpsCfmPortInUse(user_port up) { int i = 0; int maxRingNum = 0; maxRingNum = (int)fepCapNumGet(CAP_ERPS_F_MAX_RING, CAP_ERPS_MODE_NAME, FEP_CAP_INVALID_NUM); for (i = 0; i < (maxRingNum*2); i++) { if (dalErpsPortFlowMap[i].port_idx == UP_PORT(up)) { return TRUE; } } return FALSE; } /* 用于给port分配flowID */ int dalErpsFlowIdAllocByPort(user_port up, int *flowId) { int i = 0; int maxRingNum = (int)fepCapNumGet(CAP_ERPS_F_MAX_RING, CAP_ERPS_MODE_NAME, FEP_CAP_INVALID_NUM); int bfdMaxNum = dalBfdMaxSessNum(); for (i = 0; i < (maxRingNum*2); i++) { if (dalErpsPortFlowMap[i].port_idx == 0) { dalErpsPortFlowMap[i].port_idx = UP_PORT(up); *flowId = (i + bfdMaxNum); printf("dalErpsFlowIdAllocByPort flowId = %d dalErpsPortFlowMap[%d].port = %d\n", i+bfdMaxNum, i, dalErpsPortFlowMap[i].port_idx); return ERR_NO_ERROR; } } return ERR_NO_MEMORY; } /* 用于重置port下的flowId和packetId */ int dalErpsCfmPortReset(user_port up) { int i = 0; int maxRingNum = (int)fepCapNumGet(CAP_ERPS_F_MAX_RING, CAP_ERPS_MODE_NAME, FEP_CAP_INVALID_NUM); for (i = 0; i < (maxRingNum*2); i++) { if (dalErpsPortFlowMap[i].port_idx == UP_PORT(up)) { dalErpsPortFlowMap[i].port_idx = 0; dalErpsPortFlowMap[i].packetId = 0; } } return ERR_NO_ERROR; } /* 用于重置所有flowId和packetId */ int dalErpsCfmPortResetAll() { int i = 0; int maxRingNum = (int)fepCapNumGet(CAP_ERPS_F_MAX_RING, CAP_ERPS_MODE_NAME, FEP_CAP_INVALID_NUM); for (i = 0; i < (maxRingNum*2); i++) { dalErpsPortFlowMap[i].port_idx = 0; dalErpsPortFlowMap[i].packetId = 0; } return ERR_NO_ERROR; } /* 用于将port转换成flowID */ int dalErpsPort2FlowId(user_port up, int *flowId) { int i = 0; int maxRingNum = (int)fepCapNumGet(CAP_ERPS_F_MAX_RING, CAP_ERPS_MODE_NAME, FEP_CAP_INVALID_NUM); int bfdMaxNum = dalBfdMaxSessNum(); for (i = 0; i < (maxRingNum*2); i++) { if (dalErpsPortFlowMap[i].port_idx == UP_PORT(up)) { *flowId = (i + bfdMaxNum); return ERR_NO_ERROR; } } return ERR_NOT_FOUND; } /* 用于将flowID转换成port */ int dalErpsFlowId2Port(int flowId, user_port *up) { int bfdMaxNum = dalBfdMaxSessNum(); int index = 0; index = flowId - bfdMaxNum; DBG("dalErpsFlowId2Port index = %d bfdMaxNum = %d flowId = %d\n", index, bfdMaxNum, flowId); if (dalErpsPortFlowMap[index].port_idx == 0) { DBG("dalErpsFlowId2Port index = %d bfdMaxNum = %d flowId = %d error\n", index, bfdMaxNum, flowId); return ERR_BAD_PARAM; } UP_FROM_IDX(*up, dalErpsPortFlowMap[index].port_idx); return ERR_NO_ERROR; } /* 用于将port转换成packetID */ int dalErpsPort2PacketId(user_port up, UINT32 *packetId) { int i = 0; int maxRingNum = (int)fepCapNumGet(CAP_ERPS_F_MAX_RING, CAP_ERPS_MODE_NAME, FEP_CAP_INVALID_NUM); for (i = 0; i < (maxRingNum*2); i++) { if (dalErpsPortFlowMap[i].port_idx == UP_PORT(up)) { *packetId = dalErpsPortFlowMap[i].packetId; return ERR_NO_ERROR; } } return ERR_NOT_FOUND; } /* 用于设置port下的packetId */ int dalErpsPortPacketIdSet(user_port up, UINT32 packetId) { int i = 0; int maxRingNum = (int)fepCapNumGet(CAP_ERPS_F_MAX_RING, CAP_ERPS_MODE_NAME, FEP_CAP_INVALID_NUM); for (i = 0; i < (maxRingNum*2); i++) { if (dalErpsPortFlowMap[i].port_idx == UP_PORT(up)) { dalErpsPortFlowMap[i].packetId = packetId; return ERR_NO_ERROR; } } return ERR_NOT_FOUND; } int dalErpsLinkChangeCallBack(user_port up, int status) { char key[DAL_KEY_MAX_LEN]={}; dal_ado_t *asdoi=NULL; int ret = 0; DBG("dalErpsLinkChangeCallBack up %d status %d \n", UP_INDEX(up), status); if ((asdoi = dalAsdoiCreate(DMP_DEV_NAME_SWITCHMAC, DAL_MOD_ERPS_PORT_LINK, DAL_CFG_TYPE_OPTION)) == NULL) { return ERR_NO_MEMORY; } PFM_IF_FAIL_DONE(ret, dalAdoiOptionOperAppend(asdoi, DAL_OPER_CFG)); snprintf(key, DAL_KEY_MAX_LEN, DAL_ERPS_PORT_LINK_INFO_TBL_IDX, UP_INDEX(up)); PFM_IF_FAIL_DONE(ret, dalAdoiAddOptionKey(asdoi, key)); PFM_IF_FAIL_DONE(ret, dalAdoiAddOptionI32(asdoi, DAL_ERPS_PORT_LINK_FIELD_STATUS, status)); PFM_IF_FAIL_DONE(ret, dalStatChgPub(asdoi, DAL_ERPS_PORT_LINK_INFO_ID)); done: if(asdoi) { dalAdoiDestroy(asdoi); } if(ret != PFM_ERR_C_OK) { return ERR_HW_OP_FAIL; } return ERR_NO_ERROR; } int dalErpsCfmEVCallBack(int flowId) { char key[DAL_KEY_MAX_LEN]={}; user_port up = {}; dal_ado_t *asdoi=NULL; int ret = 0; APPL_IF_ERR_RET(dalErpsFlowId2Port(flowId, &up)); DBG("dalErpsCfmEVCallBack up %d flowId %d \n", UP_INDEX(up), flowId); if ((asdoi = dalAsdoiCreate(DMP_DEV_NAME_SWITCHMAC, DAL_MOD_ERPS_PORT_LINK, DAL_CFG_TYPE_OPTION)) == NULL) { return ERR_NO_MEMORY; } PFM_IF_FAIL_DONE(ret, dalAdoiOptionOperAppend(asdoi, DAL_OPER_CFG)); snprintf(key, DAL_KEY_MAX_LEN, DAL_ERPS_PORT_LINK_INFO_TBL_IDX, UP_INDEX(up)); PFM_IF_FAIL_DONE(ret, dalAdoiAddOptionKey(asdoi, key)); PFM_IF_FAIL_DONE(ret, dalAdoiAddOptionI32(asdoi, DAL_ERPS_PORT_LINK_FIELD_STATUS, 0)); PFM_IF_FAIL_DONE(ret, dalStatChgPub(asdoi, DAL_ERPS_PORT_LINK_INFO_ID)); ret = hiErpsOamEntrySet(flowId, FALSE); done: if(asdoi) { dalAdoiDestroy(asdoi); } if(ret != PFM_ERR_C_OK) { return ERR_HW_OP_FAIL; } return ERR_NO_ERROR; } /*! *\fn dalErpsInit *\brief 初始化 *\details * *\param[in] *\param[out] * *\return int *\retval * *\note */ int dalErpsInit(void) { int maxRingNum = 0; maxRingNum = (int)fepCapNumGet(CAP_ERPS_F_MAX_RING, CAP_ERPS_MODE_NAME, FEP_CAP_INVALID_NUM); if (dalErpsPortFlowMap == NULL) { dalErpsPortFlowMap = pal_alloc(sizeof(DAL_ERPS_CFM_INFO)*maxRingNum*2, "dalErpsCfmMap"); } memset(dalErpsPortFlowMap, 0, sizeof(sizeof(DAL_ERPS_CFM_INFO)*maxRingNum*2)); bfdCfmEventHandlerAddCallback(dalErpsCfmEVCallBack); //APPL_IF_ERR_RET_VAL(hiErpsGpioInit(), ERR_INIT); PFM_IF_FAIL_RET_VAL(dalHandlerReg(DAL_MOD_ERPS, _dalErpsHandler), ERR_INIT); return ERR_NO_ERROR; } 参照以上的绑定packetId的方式,我想通过端口和packetIdx绑定分配的packetId应该怎么做,结合我的代码提出建议,添加和修改的内容static int _dalDmpTrafficTestHandler(dal_ado_t *adoi, dal_attr *attr) { void *handler = NULL; char *key = NULL; int upIdx = 0; int packetIdx = 0; user_port up = {}; UINT16 speed = 0; UINT8 enable = 0; UINT32 packetId = 0; char rawPacket[MAX_PAYLOAD_LEN] = {0}; char srcMac[MAC_LEN] ={0}; char dstMac[MAC_LEN] ={0}; char srcIp[IPv4_LEN] = {0}; char dstIp[IPv4_LEN] = {0}; UINT16 lenType = 0; UINT8 vlan = 0; DAL_ADOI_OPTION_LOOP(adoi) { if (NULL == (key = DAL_ADOI_OPTION_KEY(adoi))) { break; } if (STR_EQUAL(key, DAL_TRAFFIC_TEST_GLOBLE)) { if (DAL_ADOI_OPTION_FIELD_MATCH(adoi, DAL_TRAFFIC_TEST_TX_SPEED)) { dalAdoiGetOptionUI16(adoi, &speed); printf("hiTrafficTestSpeedSet[%d]", speed); APPL_IF_ERR_RET(hiTrafficTestSpeedSet(speed)); } else if(DAL_ADOI_OPTION_FIELD_MATCH(adoi, DAL_TRAFFIC_TEST_ENABLE)) { dalAdoiGetOptionUI8(adoi, &enable); printf("hiTrafficTestEnableSet[%d]", enable); if(0 == enable) { APPL_IF_ERR_RET(hiTrafficTestPacketRemove(packetId)); } } } } if (NULL != (handler = DAL_ADOI_ENTRY(adoi, DAL_TRAFFIC_TEST_PORT_TBL))) { DAL_ADOI_ENTRY_LOOP(handler) { if (NULL== (key = DAL_ADOI_ENTRY_KEY(handler)) || !DAL_ADOI_ENTRY_KEY_MATCH(handler, DAL_TRAFFIC_TEST_PORT_TBL_ALL)) { continue; } if (DAL_ADOI_ENTRY_KEY_EMPTY(handler)) { printf("key with no fields"); } else { sscanf(key, DAL_TRAFFIC_TEST_PORT_TBL_FMT, &upIdx, &packetIdx); UP_FROM_IDX(up, upIdx); if (UNIT_CURRENT != UP_UNIT(up)) { continue; } DAL_ADOI_ENTRY_FIELD_LOOP(handler, key) { if (DAL_ADOI_ENTRY_FIELD_MATCH(handler, DAL_TRAFFIC_TEST_PORT_RAW_PACKET)) { dalAdoiGetEntryStr(adoi, DAL_TRAFFIC_TEST_PORT_TBL, rawPacket, MAX_PAYLOAD_LEN); } else if(DAL_ADOI_ENTRY_FIELD_MATCH(handler, DAL_TRAFFIC_TEST_PORT_SRC_MAC)) { dalAdoiGetEntryStr(adoi, DAL_TRAFFIC_TEST_PORT_TBL, srcMac, MAC_LEN); } else if(DAL_ADOI_ENTRY_FIELD_MATCH(handler, DAL_TRAFFIC_TEST_PORT_DST_MAC)) { dalAdoiGetEntryStr(adoi, DAL_TRAFFIC_TEST_PORT_TBL, dstMac, MAC_LEN); } else if(DAL_ADOI_ENTRY_FIELD_MATCH(handler, DAL_TRAFFIC_TEST_PORT_SRC_IP)) { dalAdoiGetEntryStr(adoi, DAL_TRAFFIC_TEST_PORT_TBL, srcIp, IPv4_LEN); } else if(DAL_ADOI_ENTRY_FIELD_MATCH(handler, DAL_TRAFFIC_TEST_PORT_DST_IP)) { dalAdoiGetEntryStr(adoi, DAL_TRAFFIC_TEST_PORT_TBL, dstIp, IPv4_LEN); } else if(DAL_ADOI_ENTRY_FIELD_MATCH(handler, DAL_TRAFFIC_TEST_PORT_LENTYPE)) { dalAdoiGetEntryUI16(adoi, DAL_TRAFFIC_TEST_PORT_TBL, &lenType); } else if(DAL_ADOI_ENTRY_FIELD_MATCH(handler, DAL_TRAFFIC_TEST_PORT_VLAN)) { dalAdoiGetEntryUI8(adoi, DAL_TRAFFIC_TEST_PORT_TBL, &vlan); } else { printf("Invalid field %s !", DAL_ADOI_ENTRY_FIELD(handler)); } } } } printf("Calling hiTrafficTestPacketSet with:\n"); printf(" rawPacket: %s\n", rawPacket); printf(" srcMac: %s\n", srcMac); printf(" dstMac: %s\n", dstMac); printf(" srcIp: %s\n", srcIp); printf(" dstIp: %s\n", dstIp); printf(" lenType: %d\n", lenType); printf(" vlan: %d\n", vlan); APPL_IF_ERR_RET(hiTrafficTestPacketSet(up, rawPacket, srcMac, dstMac, srcIp, dstIp, lenType, vlan, &packetId)); } return ERR_NO_ERROR; }
10-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值