/**
 *@file    sr_netdev.c
 *@brief   网卡设备管理接口
 *@details 提供网卡设备注册、查找、默认设置/获取等功能的具体实现
 *@copyright Copyright (c) 2024 lierda. All rights reserved.
 *@author  Lierda-RDC
 *@date    2024-04-01
 *@example ZhaoyangSDK\example\pal\hal\netdev_mng_example.c
 */


#include "sr_netdev.h"
#include "sr_osal.h"
#include "string.h"
#include "sr_log.h"


static os_list_node_t gs_netdevList = OS_LIST_INIT(gs_netdevList);


static SR_NETDEV_T * gs_netdevDefault = SR_NULL;


SR_NETDEV_T *SR_NetdevFind(const char *name)
{
	SR_NETDEV_T *dev = SR_NULL;

    SR_OsEnterCritical();

    os_list_for_each_entry(dev, &gs_netdevList, SR_NETDEV_T, list)
    {
        if (0 == strncmp(dev->name, name, 16))
        {
            SR_OsExitCritical();
					
			return dev;  
            
        }
    }

    SR_OsExitCritical();
    return SR_NULL;
}


SR_NETDEV_T *SR_NetdevGetDefault(void)
{
    if (SR_NULL == gs_netdevDefault)
    {
        SR_LOG(ERR,"There are no default module in the system now");
    }

    return gs_netdevDefault;
}

int SR_NetdevSetDefault(SR_NETDEV_T *dev)
{
	if(dev == SR_NULL) return SR_INVALID;

	SR_OsEnterCritical();

    gs_netdevDefault = dev;
	
	SR_OsExitCritical();
	

	return SR_OK;
}


int SR_NetdevRegister(SR_NETDEV_T *dev)
{

    if (dev == SR_NULL)
    {
        return SR_INVALID;
    }

    if ((SR_NULL == dev->name) || (SR_NULL != SR_NetdevFind(dev->name)))
    {
        return SR_INVALID;
    }

    SR_OsEnterCritical();

    os_list_add(&gs_netdevList, &dev->list);
   
    SR_OsExitCritical();

    return SR_OK;
}

