diff options
author | Evan Lojewski <github@meklort.com> | 2019-06-01 17:23:17 -0600 |
---|---|---|
committer | Evan Lojewski <github@meklort.com> | 2019-06-01 17:23:17 -0600 |
commit | af93e2cc09288e923ea19bdbc52ba13bc3a2e987 (patch) | |
tree | ce921d2fea951b583aba98df3ae2e1f02328c1f4 /libs | |
parent | 4d3984b6d6e9a8f5d4a7ab24e941290da3addb89 (diff) | |
download | bcm5719-ortega-af93e2cc09288e923ea19bdbc52ba13bc3a2e987.tar.gz bcm5719-ortega-af93e2cc09288e923ea19bdbc52ba13bc3a2e987.zip |
Update filters to be initialized per-port.
Diffstat (limited to 'libs')
-rw-r--r-- | libs/Network/CMakeLists.txt | 5 | ||||
-rw-r--r-- | libs/Network/include/Network.h | 8 | ||||
-rw-r--r-- | libs/Network/init.c | 612 | ||||
-rw-r--r-- | libs/Network/ports.c | 632 |
4 files changed, 637 insertions, 620 deletions
diff --git a/libs/Network/CMakeLists.txt b/libs/Network/CMakeLists.txt index 6381686..3c813dd 100644 --- a/libs/Network/CMakeLists.txt +++ b/libs/Network/CMakeLists.txt @@ -44,15 +44,16 @@ project(Network) +SET(SOURCES init.c ports.c tx.c rx.c generic.c) # Host Simulation library -simulator_add_library(${PROJECT_NAME} STATIC ports.c tx.c rx.c generic.c) +simulator_add_library(${PROJECT_NAME} STATIC ${SOURCES}) target_link_libraries(${PROJECT_NAME} PRIVATE simulator NCSI) target_include_directories(${PROJECT_NAME} PUBLIC ../../include) target_include_directories(${PROJECT_NAME} PUBLIC include) # ARM Library -arm_add_library(${PROJECT_NAME}-arm STATIC init.c ports.c tx.c rx.c generic.c) +arm_add_library(${PROJECT_NAME}-arm STATIC ${SOURCES}) target_link_libraries(${PROJECT_NAME}-arm PRIVATE NCSI-arm) target_include_directories(${PROJECT_NAME}-arm PUBLIC ../../include) target_include_directories(${PROJECT_NAME}-arm PUBLIC include) diff --git a/libs/Network/include/Network.h b/libs/Network/include/Network.h index 82a5a7e..d0da9b5 100644 --- a/libs/Network/include/Network.h +++ b/libs/Network/include/Network.h @@ -48,14 +48,9 @@ #include <APE_APE.h> #include <APE_APE_PERI.h> #include <APE_RX_PORT0.h> -#include <APE_RX_PORT1.h> -#include <APE_RX_PORT2.h> -#include <APE_RX_PORT3.h> #include <APE_TX_PORT0.h> -#include <APE_TX_PORT1.h> -#include <APE_TX_PORT2.h> -#include <APE_TX_PORT3.h> #include <APE_DEVICE.h> +#include <APE_FILTERS.h> #include <types.h> #ifdef CXX_SIMULATOR @@ -80,6 +75,7 @@ typedef struct /* Port Registers */ VOLATILE DEVICE_t *device; + VOLATILE FILTERS_t *filters; } NetworkPort_t; typedef union { diff --git a/libs/Network/init.c b/libs/Network/init.c index c7d2309..82ac007 100644 --- a/libs/Network/init.c +++ b/libs/Network/init.c @@ -44,623 +44,11 @@ #include <APE_FILTERS.h> #include <APE_APE.h> -#include <APE_DEVICE.h> -#include <APE_DEVICE1.h> -#include <APE_DEVICE2.h> -#include <APE_DEVICE3.h> #include <Network.h> -typedef struct { - RegFILTERSElementConfig_t cfg; - RegFILTERSElementPattern_t pat; -} FilterElementInit_t; - -static const FilterElementInit_t gElementInit[32] = { - [0] = {{0}}, - [1] = {{0}}, - [2] = {{0}}, - [3] = {{0}}, - [4] = {{0}}, - [5] = {{0}}, - [6] = {{0}}, - [7] = {{0}}, - [8] = {{0}}, - [9] = {{0}}, - [10] = {{0}}, - [11] = {{0}}, - [12] = {{0}}, - [13] = {{0}}, - [14] = {{0}}, - [15] = {{0}}, - - // 16: Check MAC address multicast bit not set. - [16] = { - .cfg = { .bits = { - .RuleOffset = 0, - .RuleClass = 0, - .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_SOF, - .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_NE, - .reserved_23_18 = 0, - .RuleMap = 0, - .RuleDiscard = 0, - .RuleMask = 1, - .RuleP3 = 0, - .RuleP2 = 0, - .RuleP1 = 0, - .RuleAnd = 0, - .RuleEnable = 1, - }}, - .pat = {.r32 = 0x01000100}, - }, - - [17] = {{0}}, - [18] = {{0}}, - - // 19: Special VLAN match. - [19] = { - .cfg = { .bits = { - .RuleOffset = 0, - .RuleClass = 0, - .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_VLAN, - .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_EQ, - .reserved_23_18 = 0, - .RuleMap = 0, - .RuleDiscard = 0, - .RuleMask = 1, - .RuleP3 = 0, - .RuleP2 = 0, - .RuleP1 = 0, - .RuleAnd = 0, - .RuleEnable = 1, - }}, - .pat = {.r32 = 0}, - }, - - // 20: IPv6 Neighbor Advertisement. - [20] = { - .cfg = { .bits = { - .RuleOffset = 0, - .RuleClass = 0, - .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_ICMPV6, - .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_EQ, - .reserved_23_18 = 0, - .RuleMap = 0, - .RuleDiscard = 0, - .RuleMask = 1, - .RuleP3 = 0, - .RuleP2 = 0, - .RuleP1 = 0, - .RuleAnd = 0, - .RuleEnable = 0, // Disabled - }}, - .pat = {.r32 = 0x8800FF00}, - }, - - // 21: IPv6 Router Advertisement. - [21] = { - .cfg = { .bits = { - .RuleOffset = 0, - .RuleClass = 0, - .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_ICMPV6, - .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_EQ, - .reserved_23_18 = 0, - .RuleMap = 0, - .RuleDiscard = 0, - .RuleMask = 1, - .RuleP3 = 0, - .RuleP2 = 0, - .RuleP1 = 0, - .RuleAnd = 0, - .RuleEnable = 0, // Disabled - }}, - .pat = {.r32 = 0x8600FF00}, - }, - - // 22: DHCPv6 Server. - [22] = { - .cfg = { .bits = { - .RuleOffset = 2, - .RuleClass = 0, - .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_UDP, - .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_EQ, - .reserved_23_18 = 0, - .RuleMap = 0, - .RuleDiscard = 0, - .RuleMask = 1, - .RuleP3 = 0, - .RuleP2 = 0, - .RuleP1 = 0, - .RuleAnd = 0, - .RuleEnable = 0, // Disabled - }}, - .pat = {.r32 = 0x0223FFFF}, - }, - - [23] = {{0}}, - - // 24: ARP match. - [24] = { - .cfg = { .bits = { - .RuleOffset = 12, - .RuleClass = 0, - .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_SOF, - .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_EQ, - .reserved_23_18 = 0, - .RuleMap = 0, - .RuleDiscard = 0, - .RuleMask = 1, - .RuleP3 = 0, - .RuleP2 = 0, - .RuleP1 = 0, - .RuleAnd = 0, - .RuleEnable = 1, - }}, - .pat = {.r32 = 0x0806FFFF}, - }, - - // 25: DHCPv4. - [25] = { - .cfg = { .bits = { - .RuleOffset = 2, - .RuleClass = 0, - .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_UDP, - .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_EQ, - .reserved_23_18 = 0, - .RuleMap = 0, - .RuleDiscard = 0, - .RuleMask = 1, - .RuleP3 = 0, - .RuleP2 = 0, - .RuleP1 = 0, - .RuleAnd = 0, - .RuleEnable = 1, - }}, - .pat = {.r32 = 0x0044FFFF}, - }, - - // 26: DHCPv4. - [26] = { - .cfg = { .bits = { - .RuleOffset = 2, - .RuleClass = 0, - .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_UDP, - .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_EQ, - .reserved_23_18 = 0, - .RuleMap = 0, - .RuleDiscard = 0, - .RuleMask = 1, - .RuleP3 = 0, - .RuleP2 = 0, - .RuleP1 = 0, - .RuleAnd = 0, - .RuleEnable = 1, - }}, - .pat = {.r32 = 0x0043FFFF}, - }, - - // 27: NetBIOS - [27] = { - .cfg = { .bits = { - .RuleOffset = 2, - .RuleClass = 0, - .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_UDP, - .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_EQ, - .reserved_23_18 = 0, - .RuleMap = 0, - .RuleDiscard = 0, - .RuleMask = 1, - .RuleP3 = 0, - .RuleP2 = 0, - .RuleP1 = 0, - .RuleAnd = 0, - .RuleEnable = 1, - }}, - .pat = {.r32 = 0x0088FFFC}, - }, - - // 28: Broadcast address match. - [28] = { - .cfg = { .bits = { - .RuleOffset = 0, - .RuleClass = 0, - .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_SOF, - .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_EQ, - .reserved_23_18 = 0, - .RuleMap = 0, - .RuleDiscard = 0, - .RuleMask = 0, - .RuleP3 = 0, - .RuleP2 = 0, - .RuleP1 = 0, - .RuleAnd = 0, - .RuleEnable = 1, - }}, - .pat = {.r32 = 0xFFFFFFFF}, - }, - - // 29: Broadcast address match. - [29] = { - .cfg = { .bits = { - .RuleOffset = 4, - .RuleClass = 0, - .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_SOF, - .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_EQ, - .reserved_23_18 = 0, - .RuleMap = 0, - .RuleDiscard = 0, - .RuleMask = 1, - .RuleP3 = 0, - .RuleP2 = 0, - .RuleP1 = 0, - .RuleAnd = 0, - .RuleEnable = 1, - }}, - .pat = {.r32 = 0xFFFFFFFF}, - }, - - // 30: IPv6 multicast. - [30] = { - .cfg = { .bits = { - .RuleOffset = 0, - .RuleClass = 0, - .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_SOF, - .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_EQ, - .reserved_23_18 = 0, - .RuleMap = 0, - .RuleDiscard = 0, - .RuleMask = 1, - .RuleP3 = 0, - .RuleP2 = 0, - .RuleP1 = 0, - .RuleAnd = 0, - .RuleEnable = 1, - }}, - .pat = {.r32 = 0x3333FFFF}, - }, - // 31: Check MAC address multicast bit is set. - [31] = { - .cfg = { .bits = { - .RuleOffset = 0, - .RuleClass = 0, - .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_SOF, - .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_EQ, - .reserved_23_18 = 0, - .RuleMap = 0, - .RuleDiscard = 0, - .RuleMask = 1, - .RuleP3 = 0, - .RuleP2 = 0, - .RuleP1 = 0, - .RuleAnd = 0, - .RuleEnable = 1, - }}, - .pat = {.r32 = 0x01000100}, - }, - -}; - -typedef struct { - RegFILTERSRuleSet_t set; - RegFILTERSRuleMask_t mask; -} FilterRuleInit_t; -static const FilterRuleInit_t gRuleInit[32] = { - // S-0. Unused. - [0] = {{0}}, - - // S-1. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=1, MASK=0x0003_0000. - [1] = { - .set = {.bits = { - .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, - .reserved_2_2 = 0, - .Count = 0, - .reserved_30_19 = 0, - .Enable = 1, - }}, - .mask = {.r32 = 0x00030000}, - }, - - // S-2. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=1, MASK=0x0005_0000. - [2] = { - .set = {.bits = { - .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, - .reserved_2_2 = 0, - .Count = 0, - .reserved_30_19 = 0, - .Enable = 1, - }}, - .mask = {.r32 = 0x00050000}, - }, - - // S-3. ACTION=TO_APE_AND_HOST, COUNT=2, ENABLE=recommend 1, MASK=0x0009_0000 - [3] = { - .set = {.bits = { - .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, - .reserved_2_2 = 0, - .Count = 2, - .reserved_30_19 = 0, - .Enable = 1, - }}, - .mask = {.r32 = 0x00090000}, - }, - - // S-4. ACTION=T0_APE_AND_HOST, COUNT=0, ENABLE=1, MASK=0x0001_0000. - [4] = { - .set = {.bits = { - .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, - .reserved_2_2 = 0, - .Count = 0, - .reserved_30_19 = 0, - .Enable = 1, - }}, - .mask = {.r32 = 0x00010000}, - }, - - // S-5. Not used, initialize to zero. - [5] = {{0}}, - // S-6. Not used, initialize to zero. - [6] = {{0}}, - // S-7. Not used, initialize to zero. - [7] = {{0}}, - // S-8. Not used, initialize to zero. - [8] = {{0}}, - - // S-9. ACTION=TO_APE_AND_HOST, COUNT=2, ENABLE=recommend 1, MASK=0x3008_0000. - [9] = { - .set = {.bits = { - .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, - .reserved_2_2 = 0, - .Count = 2, - .reserved_30_19 = 0, - .Enable = 1, - }}, - .mask = {.r32 = 0x30080000}, - }, - - // S-10. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=1 (essential for RX), MASK=0x3100_0000. - [10] = { - .set = {.bits = { - .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, - .reserved_2_2 = 0, - .Count = 0, - .reserved_30_19 = 0, - .Enable = 1, - }}, - .mask = {.r32 = 0x31000000}, - }, - - // S-11. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=1 (essential for RX), MASK=0x3200_0000. - [11] = { - .set = {.bits = { - .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, - .reserved_2_2 = 0, - .Count = 0, - .reserved_30_19 = 0, - .Enable = 1, - }}, - .mask = {.r32 = 0x32000000}, - }, - - // S-12. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=1 (essential for RX), MASK=0x3400_0000. - [12] = { - .set = {.bits = { - .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, - .reserved_2_2 = 0, - .Count = 0, - .reserved_30_19 = 0, - .Enable = 1, - }}, - .mask = {.r32 = 0x34000000}, - }, - - // S-13. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=1 (essential for RX), MASK=0x3800_0000. - [13] = { - .set = {.bits = { - .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, - .reserved_2_2 = 0, - .Count = 0, - .reserved_30_19 = 0, - .Enable = 1, - }}, - .mask = {.r32 = 0x38000000}, - }, - - // S-14. ACTION=TO_APE_AND_HOST, COUNT=2, ENABLE=1 (essential for RX), MASK=0x3000_0000. - [14] = { - .set = {.bits = { - .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, - .reserved_2_2 = 0, - .Count = 2, - .reserved_30_19 = 0, - .Enable = 1, - }}, - .mask = {.r32 = 0x30000000}, - }, - - // S-15. Not used, initialize to zero. - [15] = {{0}}, - // S-16. Not used, initialize to zero. - [16] = {{0}}, - // S-17. Not used, initialize to zero. - [17] = {{0}}, - - // S-18. ACTION=TO_APE_AND_HOST, COUNT=2, ENABLE=recommend 1, MASK=0x8008_0000. - [18] = { - .set = {.bits = { - .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, - .reserved_2_2 = 0, - .Count = 2, - .reserved_30_19 = 0, - .Enable = 1, - }}, - .mask = {.r32 = 0x80080000}, - }, - - // S-19. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=0, MASK=(0b11)<<(2*0). - [19] = { - .set = {.bits = { - .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, - .reserved_2_2 = 0, - .Count = 0, - .reserved_30_19 = 0, - .Enable = 0, - }}, - .mask = {.r32 = (0x3)<<(2*0)}, - }, - - // S-20. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=0, MASK=(0b11)<<(2*1). - [20] = { - .set = {.bits = { - .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, - .reserved_2_2 = 0, - .Count = 0, - .reserved_30_19 = 0, - .Enable = 0, - }}, - .mask = {.r32 = (0x3)<<(2*1)}, - }, - - // S-21. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=0, MASK=(0b11)<<(2*2). - [21] = { - .set = {.bits = { - .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, - .reserved_2_2 = 0, - .Count = 0, - .reserved_30_19 = 0, - .Enable = 0, - }}, - .mask = {.r32 = (0x3)<<(2*2)}, - }, - - // S-22. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=0, MASK=(0b11)<<(2*3). - [22] = { - .set = {.bits = { - .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, - .reserved_2_2 = 0, - .Count = 0, - .reserved_30_19 = 0, - .Enable = 0, - }}, - .mask = {.r32 = (0x3)<<(2*3)}, - }, - - // S-23. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=0, MASK=(0b11)<<(2*4). - [23] = { - .set = {.bits = { - .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, - .reserved_2_2 = 0, - .Count = 0, - .reserved_30_19 = 0, - .Enable = 0, - }}, - .mask = {.r32 = (0x3)<<(2*4)}, - }, - - // S-24. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=0, MASK=(0b11)<<(2*5). - [24] = { - .set = {.bits = { - .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, - .reserved_2_2 = 0, - .Count = 0, - .reserved_30_19 = 0, - .Enable = 0, - }}, - .mask = {.r32 = (0x3)<<(2*5)}, - }, - - // S-25. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=0, MASK=(0b11)<<(2*6). - [25] = { - .set = {.bits = { - .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, - .reserved_2_2 = 0, - .Count = 0, - .reserved_30_19 = 0, - .Enable = 0, - }}, - .mask = {.r32 = (0x3)<<(2*6)}, - }, - - // S-26. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=0, MASK=(0b11)<<(2*7). - [26] = { - .set = {.bits = { - .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, - .reserved_2_2 = 0, - .Count = 0, - .reserved_30_19 = 0, - .Enable = 0, - }}, - .mask = {.r32 = (0x3)<<(2*7)}, - }, - - // S-27. Not used, initialize to zero. - [27] = {{0}}, - - // S-28. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=0, MASK=0x4010_0000. - [28] = { - .set = {.bits = { - .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, - .reserved_2_2 = 0, - .Count = 0, - .reserved_30_19 = 0, - .Enable = 0, - }}, - .mask = {.r32 = 0x40100000}, - }, - - // S-29. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=0, MASK=0x4020_0000. - [29] = { - .set = {.bits = { - .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, - .reserved_2_2 = 0, - .Count = 0, - .reserved_30_19 = 0, - .Enable = 0, - }}, - .mask = {.r32 = 0x40200000}, - }, - - // S-30. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=0, MASK=0x4020_0000. - [30] = { - .set = {.bits = { - .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, - .reserved_2_2 = 0, - .Count = 0, - .reserved_30_19 = 0, - .Enable = 0, - }}, - .mask = {.r32 = 0x40200000}, - }, - - // S-31. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=0, MASK=0x8000_0000. - [31] = { - .set = {.bits = { - .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, - .reserved_2_2 = 0, - .Count = 0, - .reserved_30_19 = 0, - .Enable = 0, - }}, - .mask = {.r32 = 0x80000000}, - }, -}; - void Network_InitTxRx(void) { - for(int i = 0; i < 32; i++) - { - FILTERS.ElementConfig[i] = gElementInit[i].cfg; - FILTERS.ElementPattern[i] = gElementInit[i].pat; - } - - for(int i = 1; i < 32; i++) - { - FILTERS.RuleSet[i-1] = gRuleInit[i].set; - FILTERS.RuleMask[i-1] = gRuleInit[i].mask; - } - - FILTERS.RuleConfiguration.r32 = 0; - - // REG_APE_PERFECT_MATCH1_{HIGH,LOW}. For non-broadcast/multicast traffic, the hardware uses this register to match MACs and pass traffic to the APE. // The first two bytes of a MAC are put in the HIGH register, and the remaining four bytes in the LOW. // Note that this is a device (PCI) register, not an APE register. Set it to the BMC MAC. diff --git a/libs/Network/ports.c b/libs/Network/ports.c index 3c02a7d..9912910 100644 --- a/libs/Network/ports.c +++ b/libs/Network/ports.c @@ -47,9 +47,20 @@ #include <APE_DEVICE1.h> #include <APE_DEVICE2.h> #include <APE_DEVICE3.h> +#include <APE_RX_PORT1.h> +#include <APE_RX_PORT2.h> +#include <APE_RX_PORT3.h> +#include <APE_TX_PORT1.h> +#include <APE_TX_PORT2.h> +#include <APE_TX_PORT3.h> +#include <APE_FILTERS1.h> +#include <APE_FILTERS2.h> +#include <APE_FILTERS3.h> + NetworkPort_t gPort0 = { .device = &DEVICE, + .filters = &FILTERS, .tx_port = &TX_PORT0, .tx_allocator = &APE.TxToNetBufferAllocator0, @@ -64,6 +75,7 @@ NetworkPort_t gPort0 = { NetworkPort_t gPort1 = { .device = &DEVICE1, + .filters = &FILTERS1, .tx_port = &TX_PORT1, .tx_allocator = &APE.TxToNetBufferAllocator1, @@ -78,6 +90,7 @@ NetworkPort_t gPort1 = { NetworkPort_t gPort2 = { .device = &DEVICE2, + .filters = &FILTERS2, .tx_port = &TX_PORT2, .tx_allocator = &APE.TxToNetBufferAllocator2, @@ -92,6 +105,7 @@ NetworkPort_t gPort2 = { NetworkPort_t gPort3 = { .device = &DEVICE3, + .filters = &FILTERS3, .tx_port = &TX_PORT3, .tx_allocator = &APE.TxToNetBufferAllocator3, @@ -104,9 +118,627 @@ NetworkPort_t gPort3 = { .rx_mode = &APE.RxPoolModeStatus3, }; +#ifndef CXX_SIMULATOR +typedef struct { + RegFILTERSElementConfig_t cfg; + RegFILTERSElementPattern_t pat; +} FilterElementInit_t; + +static const FilterElementInit_t gElementInit[32] = { + [0] = {{0}}, + [1] = {{0}}, + [2] = {{0}}, + [3] = {{0}}, + [4] = {{0}}, + [5] = {{0}}, + [6] = {{0}}, + [7] = {{0}}, + [8] = {{0}}, + [9] = {{0}}, + [10] = {{0}}, + [11] = {{0}}, + [12] = {{0}}, + [13] = {{0}}, + [14] = {{0}}, + [15] = {{0}}, + + // 16: Check MAC address multicast bit not set. + [16] = { + .cfg = { .bits = { + .RuleOffset = 0, + .RuleClass = 0, + .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_SOF, + .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_NE, + .reserved_23_18 = 0, + .RuleMap = 0, + .RuleDiscard = 0, + .RuleMask = 1, + .RuleP3 = 0, + .RuleP2 = 0, + .RuleP1 = 0, + .RuleAnd = 0, + .RuleEnable = 1, + }}, + .pat = {.r32 = 0x01000100}, + }, + + [17] = {{0}}, + [18] = {{0}}, + + // 19: Special VLAN match. + [19] = { + .cfg = { .bits = { + .RuleOffset = 0, + .RuleClass = 0, + .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_VLAN, + .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_EQ, + .reserved_23_18 = 0, + .RuleMap = 0, + .RuleDiscard = 0, + .RuleMask = 1, + .RuleP3 = 0, + .RuleP2 = 0, + .RuleP1 = 0, + .RuleAnd = 0, + .RuleEnable = 1, + }}, + .pat = {.r32 = 0}, + }, + + // 20: IPv6 Neighbor Advertisement. + [20] = { + .cfg = { .bits = { + .RuleOffset = 0, + .RuleClass = 0, + .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_ICMPV6, + .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_EQ, + .reserved_23_18 = 0, + .RuleMap = 0, + .RuleDiscard = 0, + .RuleMask = 1, + .RuleP3 = 0, + .RuleP2 = 0, + .RuleP1 = 0, + .RuleAnd = 0, + .RuleEnable = 0, // Disabled + }}, + .pat = {.r32 = 0x8800FF00}, + }, + + // 21: IPv6 Router Advertisement. + [21] = { + .cfg = { .bits = { + .RuleOffset = 0, + .RuleClass = 0, + .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_ICMPV6, + .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_EQ, + .reserved_23_18 = 0, + .RuleMap = 0, + .RuleDiscard = 0, + .RuleMask = 1, + .RuleP3 = 0, + .RuleP2 = 0, + .RuleP1 = 0, + .RuleAnd = 0, + .RuleEnable = 0, // Disabled + }}, + .pat = {.r32 = 0x8600FF00}, + }, + + // 22: DHCPv6 Server. + [22] = { + .cfg = { .bits = { + .RuleOffset = 2, + .RuleClass = 0, + .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_UDP, + .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_EQ, + .reserved_23_18 = 0, + .RuleMap = 0, + .RuleDiscard = 0, + .RuleMask = 1, + .RuleP3 = 0, + .RuleP2 = 0, + .RuleP1 = 0, + .RuleAnd = 0, + .RuleEnable = 0, // Disabled + }}, + .pat = {.r32 = 0x0223FFFF}, + }, + + [23] = {{0}}, + + // 24: ARP match. + [24] = { + .cfg = { .bits = { + .RuleOffset = 12, + .RuleClass = 0, + .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_SOF, + .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_EQ, + .reserved_23_18 = 0, + .RuleMap = 0, + .RuleDiscard = 0, + .RuleMask = 1, + .RuleP3 = 0, + .RuleP2 = 0, + .RuleP1 = 0, + .RuleAnd = 0, + .RuleEnable = 1, + }}, + .pat = {.r32 = 0x0806FFFF}, + }, + + // 25: DHCPv4. + [25] = { + .cfg = { .bits = { + .RuleOffset = 2, + .RuleClass = 0, + .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_UDP, + .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_EQ, + .reserved_23_18 = 0, + .RuleMap = 0, + .RuleDiscard = 0, + .RuleMask = 1, + .RuleP3 = 0, + .RuleP2 = 0, + .RuleP1 = 0, + .RuleAnd = 0, + .RuleEnable = 1, + }}, + .pat = {.r32 = 0x0044FFFF}, + }, + + // 26: DHCPv4. + [26] = { + .cfg = { .bits = { + .RuleOffset = 2, + .RuleClass = 0, + .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_UDP, + .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_EQ, + .reserved_23_18 = 0, + .RuleMap = 0, + .RuleDiscard = 0, + .RuleMask = 1, + .RuleP3 = 0, + .RuleP2 = 0, + .RuleP1 = 0, + .RuleAnd = 0, + .RuleEnable = 1, + }}, + .pat = {.r32 = 0x0043FFFF}, + }, + + // 27: NetBIOS + [27] = { + .cfg = { .bits = { + .RuleOffset = 2, + .RuleClass = 0, + .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_UDP, + .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_EQ, + .reserved_23_18 = 0, + .RuleMap = 0, + .RuleDiscard = 0, + .RuleMask = 1, + .RuleP3 = 0, + .RuleP2 = 0, + .RuleP1 = 0, + .RuleAnd = 0, + .RuleEnable = 1, + }}, + .pat = {.r32 = 0x0088FFFC}, + }, + + // 28: Broadcast address match. + [28] = { + .cfg = { .bits = { + .RuleOffset = 0, + .RuleClass = 0, + .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_SOF, + .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_EQ, + .reserved_23_18 = 0, + .RuleMap = 0, + .RuleDiscard = 0, + .RuleMask = 0, + .RuleP3 = 0, + .RuleP2 = 0, + .RuleP1 = 0, + .RuleAnd = 0, + .RuleEnable = 1, + }}, + .pat = {.r32 = 0xFFFFFFFF}, + }, + + // 29: Broadcast address match. + [29] = { + .cfg = { .bits = { + .RuleOffset = 4, + .RuleClass = 0, + .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_SOF, + .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_EQ, + .reserved_23_18 = 0, + .RuleMap = 0, + .RuleDiscard = 0, + .RuleMask = 1, + .RuleP3 = 0, + .RuleP2 = 0, + .RuleP1 = 0, + .RuleAnd = 0, + .RuleEnable = 1, + }}, + .pat = {.r32 = 0xFFFFFFFF}, + }, + + // 30: IPv6 multicast. + [30] = { + .cfg = { .bits = { + .RuleOffset = 0, + .RuleClass = 0, + .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_SOF, + .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_EQ, + .reserved_23_18 = 0, + .RuleMap = 0, + .RuleDiscard = 0, + .RuleMask = 1, + .RuleP3 = 0, + .RuleP2 = 0, + .RuleP1 = 0, + .RuleAnd = 0, + .RuleEnable = 1, + }}, + .pat = {.r32 = 0x3333FFFF}, + }, + // 31: Check MAC address multicast bit is set. + [31] = { + .cfg = { .bits = { + .RuleOffset = 0, + .RuleClass = 0, + .RuleHeader = FILTERS_ELEMENT_CONFIG_RULE_HEADER_SOF, + .RuleOp = FILTERS_ELEMENT_CONFIG_RULE_OP_EQ, + .reserved_23_18 = 0, + .RuleMap = 0, + .RuleDiscard = 0, + .RuleMask = 1, + .RuleP3 = 0, + .RuleP2 = 0, + .RuleP1 = 0, + .RuleAnd = 0, + .RuleEnable = 1, + }}, + .pat = {.r32 = 0x01000100}, + }, + +}; + +typedef struct { + RegFILTERSRuleSet_t set; + RegFILTERSRuleMask_t mask; +} FilterRuleInit_t; +static const FilterRuleInit_t gRuleInit[32] = { + // S-0. Unused. + [0] = {{0}}, + + // S-1. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=1, MASK=0x0003_0000. + [1] = { + .set = {.bits = { + .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, + .reserved_2_2 = 0, + .Count = 0, + .reserved_30_19 = 0, + .Enable = 1, + }}, + .mask = {.r32 = 0x00030000}, + }, + + // S-2. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=1, MASK=0x0005_0000. + [2] = { + .set = {.bits = { + .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, + .reserved_2_2 = 0, + .Count = 0, + .reserved_30_19 = 0, + .Enable = 1, + }}, + .mask = {.r32 = 0x00050000}, + }, + + // S-3. ACTION=TO_APE_AND_HOST, COUNT=2, ENABLE=recommend 1, MASK=0x0009_0000 + [3] = { + .set = {.bits = { + .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, + .reserved_2_2 = 0, + .Count = 2, + .reserved_30_19 = 0, + .Enable = 1, + }}, + .mask = {.r32 = 0x00090000}, + }, + + // S-4. ACTION=T0_APE_AND_HOST, COUNT=0, ENABLE=1, MASK=0x0001_0000. + [4] = { + .set = {.bits = { + .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, + .reserved_2_2 = 0, + .Count = 0, + .reserved_30_19 = 0, + .Enable = 1, + }}, + .mask = {.r32 = 0x00010000}, + }, + + // S-5. Not used, initialize to zero. + [5] = {{0}}, + // S-6. Not used, initialize to zero. + [6] = {{0}}, + // S-7. Not used, initialize to zero. + [7] = {{0}}, + // S-8. Not used, initialize to zero. + [8] = {{0}}, + + // S-9. ACTION=TO_APE_AND_HOST, COUNT=2, ENABLE=recommend 1, MASK=0x3008_0000. + [9] = { + .set = {.bits = { + .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, + .reserved_2_2 = 0, + .Count = 2, + .reserved_30_19 = 0, + .Enable = 1, + }}, + .mask = {.r32 = 0x30080000}, + }, + + // S-10. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=1 (essential for RX), MASK=0x3100_0000. + [10] = { + .set = {.bits = { + .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, + .reserved_2_2 = 0, + .Count = 0, + .reserved_30_19 = 0, + .Enable = 1, + }}, + .mask = {.r32 = 0x31000000}, + }, + + // S-11. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=1 (essential for RX), MASK=0x3200_0000. + [11] = { + .set = {.bits = { + .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, + .reserved_2_2 = 0, + .Count = 0, + .reserved_30_19 = 0, + .Enable = 1, + }}, + .mask = {.r32 = 0x32000000}, + }, + + // S-12. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=1 (essential for RX), MASK=0x3400_0000. + [12] = { + .set = {.bits = { + .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, + .reserved_2_2 = 0, + .Count = 0, + .reserved_30_19 = 0, + .Enable = 1, + }}, + .mask = {.r32 = 0x34000000}, + }, + + // S-13. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=1 (essential for RX), MASK=0x3800_0000. + [13] = { + .set = {.bits = { + .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, + .reserved_2_2 = 0, + .Count = 0, + .reserved_30_19 = 0, + .Enable = 1, + }}, + .mask = {.r32 = 0x38000000}, + }, + + // S-14. ACTION=TO_APE_AND_HOST, COUNT=2, ENABLE=1 (essential for RX), MASK=0x3000_0000. + [14] = { + .set = {.bits = { + .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, + .reserved_2_2 = 0, + .Count = 2, + .reserved_30_19 = 0, + .Enable = 1, + }}, + .mask = {.r32 = 0x30000000}, + }, + + // S-15. Not used, initialize to zero. + [15] = {{0}}, + // S-16. Not used, initialize to zero. + [16] = {{0}}, + // S-17. Not used, initialize to zero. + [17] = {{0}}, + + // S-18. ACTION=TO_APE_AND_HOST, COUNT=2, ENABLE=recommend 1, MASK=0x8008_0000. + [18] = { + .set = {.bits = { + .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, + .reserved_2_2 = 0, + .Count = 2, + .reserved_30_19 = 0, + .Enable = 1, + }}, + .mask = {.r32 = 0x80080000}, + }, + + // S-19. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=0, MASK=(0b11)<<(2*0). + [19] = { + .set = {.bits = { + .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, + .reserved_2_2 = 0, + .Count = 0, + .reserved_30_19 = 0, + .Enable = 0, + }}, + .mask = {.r32 = (0x3)<<(2*0)}, + }, + + // S-20. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=0, MASK=(0b11)<<(2*1). + [20] = { + .set = {.bits = { + .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, + .reserved_2_2 = 0, + .Count = 0, + .reserved_30_19 = 0, + .Enable = 0, + }}, + .mask = {.r32 = (0x3)<<(2*1)}, + }, + + // S-21. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=0, MASK=(0b11)<<(2*2). + [21] = { + .set = {.bits = { + .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, + .reserved_2_2 = 0, + .Count = 0, + .reserved_30_19 = 0, + .Enable = 0, + }}, + .mask = {.r32 = (0x3)<<(2*2)}, + }, + + // S-22. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=0, MASK=(0b11)<<(2*3). + [22] = { + .set = {.bits = { + .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, + .reserved_2_2 = 0, + .Count = 0, + .reserved_30_19 = 0, + .Enable = 0, + }}, + .mask = {.r32 = (0x3)<<(2*3)}, + }, + + // S-23. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=0, MASK=(0b11)<<(2*4). + [23] = { + .set = {.bits = { + .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, + .reserved_2_2 = 0, + .Count = 0, + .reserved_30_19 = 0, + .Enable = 0, + }}, + .mask = {.r32 = (0x3)<<(2*4)}, + }, + + // S-24. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=0, MASK=(0b11)<<(2*5). + [24] = { + .set = {.bits = { + .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, + .reserved_2_2 = 0, + .Count = 0, + .reserved_30_19 = 0, + .Enable = 0, + }}, + .mask = {.r32 = (0x3)<<(2*5)}, + }, + + // S-25. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=0, MASK=(0b11)<<(2*6). + [25] = { + .set = {.bits = { + .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, + .reserved_2_2 = 0, + .Count = 0, + .reserved_30_19 = 0, + .Enable = 0, + }}, + .mask = {.r32 = (0x3)<<(2*6)}, + }, + + // S-26. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=0, MASK=(0b11)<<(2*7). + [26] = { + .set = {.bits = { + .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, + .reserved_2_2 = 0, + .Count = 0, + .reserved_30_19 = 0, + .Enable = 0, + }}, + .mask = {.r32 = (0x3)<<(2*7)}, + }, + + // S-27. Not used, initialize to zero. + [27] = {{0}}, + + // S-28. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=0, MASK=0x4010_0000. + [28] = { + .set = {.bits = { + .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, + .reserved_2_2 = 0, + .Count = 0, + .reserved_30_19 = 0, + .Enable = 0, + }}, + .mask = {.r32 = 0x40100000}, + }, + + // S-29. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=0, MASK=0x4020_0000. + [29] = { + .set = {.bits = { + .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, + .reserved_2_2 = 0, + .Count = 0, + .reserved_30_19 = 0, + .Enable = 0, + }}, + .mask = {.r32 = 0x40200000}, + }, + + // S-30. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=0, MASK=0x4020_0000. + [30] = { + .set = {.bits = { + .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, + .reserved_2_2 = 0, + .Count = 0, + .reserved_30_19 = 0, + .Enable = 0, + }}, + .mask = {.r32 = 0x40200000}, + }, + + // S-31. ACTION=TO_APE_AND_HOST, COUNT=0, ENABLE=0, MASK=0x8000_0000. + [31] = { + .set = {.bits = { + .Action = FILTERS_RULE_SET_ACTION_TO_APE_AND_HOST, + .reserved_2_2 = 0, + .Count = 0, + .reserved_30_19 = 0, + .Enable = 0, + }}, + .mask = {.r32 = 0x80000000}, + }, +}; +#endif + +void Network_InitFilters(NetworkPort_t *port) +{ +#ifdef CXX_SIMULATOR + (void)port; +#else + for(int i = 0; i < 32; i++) + { + port->filters->ElementConfig[i] = gElementInit[i].cfg; + port->filters->ElementPattern[i] = gElementInit[i].pat; + } + + for(int i = 1; i < 32; i++) + { + port->filters->RuleSet[i-1] = gRuleInit[i].set; + port->filters->RuleMask[i-1] = gRuleInit[i].mask; + } + + port->filters->RuleConfiguration.r32 = 0; +#endif +} + void Network_InitPort(NetworkPort_t *port) { + Network_InitFilters(port); + // Enable RX RegAPERxPoolModeStatus_t rxMode; rxMode.r32 = 0; |