sitara_depot/components/free_rtos/ethernet/eth_vlan.c
algin ae3cac8a7d feat: First commit
Adds sitara_depot/free_rtos

Original one is on server_gorbunov/SmartForce4.0/sitara_depot
2023-05-03 14:01:32 +03:00

301 lines
9.1 KiB
C

/*
* eth_vlan.c
*
* Created on: 9 ìàð. 2023 ã.
* Author: sychev
*/
#include "ethernet/eth_vlan.h"
#include <networking/enet/utils/include/enet_apputils.h>
#include <networking/enet/core/include/core/enet_ioctl.h>
//using namespace free_rtos;
/* Bit#0 Indicates host ownership (indicates Host egress) */
#define FDB_ENTRY_HOST_BIT (0)
/* Bit#1 Indicates that MAC ID is connected to Physical Port 1 */
#define FDB_ENTRY_PORT1_BIT (1)
/* Bit#2 Indicates that MAC ID is connected to Physical Port 2 */
#define FDB_ENTRY_PORT2_BIT (2)
/* Bit#3 This is set to 1 for all learnt entries. 0 for static entries. */
#define FDB_ENTRY_LEARNT_ENTRY_BIT (3)
/* Bit#4 If set for SA then packet is dropped (can be used to implement a blacklist).
* If set for DA then packet is determined to be a special packet */
#define FDB_ENTRY_BLOCK_BIT (4)
/* Bit#5 If set for DA then the SA from the packet is not learnt */
/* Bit#6 if set, it means packet has been seen recently with source address +
* FID matching MAC address/FID of entry. */
#define FDB_ENTRY_TOUCH_BIT (6)
/* Bit#7 set if entry is valid */
#define FDB_ENTRY_VALID_BIT (7)
int32_t eth_vlan_setPriorityRegMapping(Enet_Handle handle,
uint32_t core_id,
Enet_MacPort macPort,
uint32_t *prioRegenMap)
{
EnetMacPort_SetPriorityRegenMapInArgs regenMap;
Enet_IoctlPrms prms;
int32_t status = ENET_SOK;
int32_t i;
regenMap.macPort = macPort;
for (i = 0; i < ENET_PRI_NUM; i++)
{
regenMap.priorityRegenMap.priorityMap[i] = prioRegenMap[i];
}
ENET_IOCTL_SET_IN_ARGS(&prms, &regenMap);
ENET_IOCTL(handle, core_id, ENET_MACPORT_IOCTL_SET_PRI_REGEN_MAP, &prms, status);
if (status != ENET_SOK)
{
EnetAppUtils_print("ERROR: IOCTL command for priority regeneration for PORT = %u\r\n", macPort);
status = ENET_EFAIL;
}
return status;
}
int32_t eth_vlan_setPriorityMapping(Enet_Handle handle,
uint32_t core_id,
Enet_MacPort macPort,
uint32_t *prioMap)
{
EnetMacPort_SetEgressPriorityMapInArgs priMap;
Enet_IoctlPrms prms;
int32_t status = ENET_SOK;
int32_t i;
priMap.macPort = macPort;
for (i = 0; i < ENET_PRI_NUM; i++)
{
priMap.priorityMap.priorityMap[i] = prioMap[i];
}
ENET_IOCTL_SET_IN_ARGS(&prms, &priMap);
ENET_IOCTL(handle, core_id, ENET_MACPORT_IOCTL_SET_EGRESS_QOS_PRI_MAP, &prms, status);
if (status != ENET_SOK)
{
EnetAppUtils_print("ERROR: IOCTL command for priority mapping for PORT = %u\r\n", macPort);
status = ENET_EFAIL;
}
return status;
}
int32_t eth_vlan_addDefaultHostVid(Enet_Handle handle,
uint32_t core_id,
uint8_t pcp,
uint16_t vlan_id)
{
Enet_IoctlPrms prms;
EnetPort_VlanCfg vlanDefaultEntry;
int32_t status = ENET_SOK;
vlanDefaultEntry.portVID = vlan_id;
vlanDefaultEntry.portPri = pcp;
ENET_IOCTL_SET_IN_ARGS(&prms, &vlanDefaultEntry);
ENET_IOCTL(handle, core_id, ICSSG_PER_IOCTL_VLAN_SET_HOSTPORT_DFLT_VID, &prms, status);
if (status != ENET_SOK)
{
EnetAppUtils_print("Failed to set default VID");
}
return status;
}
int32_t eth_vlan_addDefaultPortVid(Enet_Handle handle,
uint32_t core_id,
Enet_MacPort macPort,
uint8_t pcp,
uint16_t vlanId)
{
int32_t status = ENET_SOK;
Enet_IoctlPrms prms;
Icssg_MacPortDfltVlanCfgInArgs vlanDefaultEntry;
vlanDefaultEntry.macPort = macPort;
vlanDefaultEntry.vlanCfg.portVID = vlanId;
vlanDefaultEntry.vlanCfg.portPri = pcp;
ENET_IOCTL_SET_IN_ARGS(&prms, &vlanDefaultEntry);
ENET_IOCTL(handle, core_id, ICSSG_PER_IOCTL_VLAN_SET_MACPORT_DFLT_VID, &prms, status);
if (status != ENET_SOK)
{
EnetAppUtils_print("Failed to set default VID");
}
return status;
}
int32_t eth_vlan_init(Enet_Handle handle,
uint32_t core_id,
uint16_t vlanId,
Enet_Type enetType)
{
int32_t status = ENET_SOK;
Enet_IoctlPrms prms;
uint32_t i;
uint32_t prioRegenMap[ENET_PRI_NUM];
uint32_t prioMap[ENET_PRI_NUM];
Icssg_VlanFidEntry vlanEntry;
Icssg_VlanFidParams vlanParams = {
.fid = 0,
.hostMember = 1,
.p1Member = 1,
.p2Member = 1,
.hostTagged = 0,
.p1Tagged = 0,
.p2Tagged = 0,
.streamVid = 0,
.floodToHost = 0
};
Icssg_VlanFidParams vlanParamsForPrioTag = {
.fid = 0,
.hostMember = 1,
.p1Member = 1,
.p2Member = 1,
.hostTagged = 0,
.p1Tagged = 1,
.p2Tagged = 1,
.streamVid = 0,
.floodToHost = 0
};
vlanParams.fid = vlanId;
for (i = 0; i < ENET_PRI_NUM; i++)
{
prioRegenMap[i] = (uint32_t)(ENET_PRI_NUM-1-i);
prioMap[i] = 0U;
}
/* Óñòàíîâèòå êîìàíäó IOCTL, ÷òîáû ñäåëàòü PORT1 ãðàíè÷íûì ïîðòîì, à PORT2 ïðèíèìàòü âñå òèïû ïàêåòîâ. */
eth_vlan_setPriorityRegMapping(handle, core_id, ENET_MAC_PORT_1, prioRegenMap);
eth_vlan_setPriorityMapping(handle, core_id, ENET_MAC_PORT_1, prioMap);
if (enetType == ENET_ICSSG_SWITCH)
{
eth_vlan_setPriorityRegMapping(handle, core_id, ENET_MAC_PORT_2, prioRegenMap);
eth_vlan_setPriorityMapping(handle, core_id, ENET_MAC_PORT_2, prioMap);
}
/* Make an entry for common vlan id
* Update table for default entry */
vlanEntry.vlanFidParams = vlanParams;
vlanEntry.vlanId = (uint16_t)vlanId;
ENET_IOCTL_SET_IN_ARGS(&prms, &vlanEntry);
ENET_IOCTL(handle, core_id, ICSSG_PER_IOCTL_VLAN_SET_ENTRY, &prms, status);
if (status != ENET_SOK)
{
EnetAppUtils_print("FID VLAN entry for HOST is FAILED = %u : FAILED\r\n", status);
return status;
}
/* -----------------Make an entry for Priority tag----------------- */
vlanEntry.vlanFidParams = vlanParamsForPrioTag;
vlanEntry.vlanId = (uint16_t)0;
ENET_IOCTL_SET_IN_ARGS(&prms, &vlanEntry);
ENET_IOCTL(handle, core_id, ICSSG_PER_IOCTL_VLAN_SET_ENTRY, &prms, status);
if (status != ENET_SOK)
{
EnetAppUtils_print("FID VLAN entry for VID = 0: FAILED = %u : FAILED\r\n", status);
return status;
}
/* -----------------Make a default entry for Host port----------------- */
status = eth_vlan_addDefaultHostVid(handle, core_id, 0, vlanId);
if (status != ENET_SOK)
{
EnetAppUtils_print("\n ERROR: In updating default VLAN for Host : %d\r\n", status);
}
/* -----------------Make a default entry for P1 port----------------- */
status = eth_vlan_addDefaultPortVid(handle, core_id, ENET_MAC_PORT_1, 1, vlanId);
if (status != ENET_SOK)
{
EnetAppUtils_print("\n ERROR: In updating default VLAN for P1 \r\n\r");
return status;
}
if (enetType == ENET_ICSSG_SWITCH)
{
/* -----------------Make a default entry for P2 port----------------- */
status = eth_vlan_addDefaultPortVid(handle, core_id, ENET_MAC_PORT_2, 2, vlanId);
if (status != ENET_SOK)
{
EnetAppUtils_print("\n ERROR: In updating default VLAN for P2 \r\n\r");
return status;
}
}
return status;
}
/*int32_t eth_vlan_addMacFdbEntry(Enet_Handle handle,
uint32_t core_id,
Semaphore& ioctl_sem,
Icssg_MacAddr mac,
int16_t vlanId,
uint8_t fdbEntryPort)
{
int32_t status = ENET_EFAIL;
int32_t semStatus;
Enet_IoctlPrms prms;
Icssg_FdbEntry fdbEntry;
int i = 0;
// Now make an entry in FDB for the HOST MAC address using Asynchronous IOCTL
for (i = 0; i < ENET_MAC_ADDR_LEN; i++)
{
fdbEntry.macAddr[i] = mac.macAddr[i];
}
fdbEntry.vlanId = vlanId;
fdbEntry.fdbEntry[0] = fdbEntryPort;
fdbEntry.fdbEntry[1] = fdbEntryPort;
ENET_IOCTL_SET_IN_ARGS(&prms, &fdbEntry);
ENET_IOCTL(handle, core_id, ICSSG_FDB_IOCTL_ADD_ENTRY, &prms, status);
if (status == ENET_SINPROGRESS)
{
EnetAppUtils_print("Success: IOCTL command sent for making MAC entry in FDB \r\n");
// Wait for asyc ioctl to complete
do
{
Enet_poll(handle, ENET_EVT_ASYNC_CMD_RESP, NULL, 0U);
semStatus = ioctl_sem.pend(1U);
} while (semStatus != SystemP_SUCCESS);
status = ENET_SOK;
}
else
{
EnetAppUtils_print("ERROR: IOCTL command sent for making MAC entry in FDB failed as vlanId out of range \r\n");
EnetAppUtils_print("ERROR: IOCTL command sent for making MAC entry in FDB \r\n");
}
return status;
}*/