enet.h (4426B)
1 /* 2 * 3 * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file. 4 * 5 * Copyright 2007-2019 Broadcom Inc. All rights reserved. 6 * 7 * This header file defines packet formats for Ethernet and Broadcom stacking. 8 */ 9 10 #ifndef _SOC_ENET_H 11 #define _SOC_ENET_H 12 13 #include <sal/core/libc.h> 14 #include <soc/util.h> 15 #include <soc/types.h> 16 #include <soc/macipadr.h> 17 18 /* 19 * Least-common denominator rxbuf start-of-data offset: 20 * Must be >= size of largest rxhdr 21 * Must be 2-mod-4 aligned so IP is 0-mod-4 22 */ 23 #define MAX_HWRXOFF 32 24 #define ETC47XX_HWRXOFF 30 25 #if defined(IPROC_CMICD) 26 #define ETCGMAC_HWRXOFF 30 27 #else 28 /* Keystone */ 29 #define ETCGMAC_HWRXOFF 32 30 #endif 31 32 typedef struct enet_hdr_s { 33 sal_mac_addr_t en_dhost; /* Destination */ 34 sal_mac_addr_t en_shost; /* Source */ 35 union { 36 uint16 _tpid; /* Tag Prot ID */ 37 uint16 _len; /* Length */ 38 } en_f3; /* Field 3 */ 39 # define en_untagged_len en_f3._len 40 # define en_tag_tpid en_f3._tpid 41 42 /* Untagged Format ends here */ 43 44 uint16 en_tag_ctrl; /* Tag control */ 45 uint16 en_tag_len; /* Tagged length */ 46 47 /* SNAP Fields */ 48 49 uint8 en_snap_dsap; 50 uint8 en_snap_ssap; 51 uint8 en_snap_ctrl; 52 uint8 en_snap_org[3]; 53 uint16 en_snap_etype; 54 } enet_hdr_t; 55 56 #define ENET_MAC_SIZE 6 57 #define ENET_FCS_SIZE 4 58 #define ENET_MIN_PKT_SIZE 64 59 60 #define ENET_DEFAULT_BRCMID 0x8874 61 #define ENET_BRCM_TAG_SIZE 6 62 #define ENET_BRCM_SHORT_TAG_SIZE 4 63 64 /* Define the default tagged protocol id */ 65 66 #define ENET_DEFAULT_TPID 0x8100 67 #define ENET_TAG_SIZE 4 68 69 /* 70 * Defines: ENET_XXX_HDR_LEN 71 * Purpose: Defines the length of the various enet headers. 72 */ 73 #define ENET_UNTAGGED_HDR_LEN 14 74 #define ENET_TAGGED_HDR_LEN 18 75 #define ENET_SNAP_HDR_LEN 26 76 #define ENET_CHECKSUM_LEN 4 77 78 /* 79 * Defines: ENET_[TAGGED|SNAP|II] 80 * Purpose: Returned TRUE if the ethernet header is TAGGED or SNAP, 81 * or ethernet II. 82 */ 83 #define ENET_TAGGED(e) \ 84 (soc_ntohs((e)->en_tag_tpid) == (0x8100)) 85 86 #define ENET_SNAP(e) \ 87 (ENET_TAGGED(e) && ((e)->en_snap_dsap == 0xaa) && \ 88 ((e)->en_snap_ssap == 0xaa) && ((e)->en_snap_ctrl == 0x03)) 89 90 #define ENET_II(e) \ 91 (0x800 == (ENET_TAGGED(e) ? \ 92 soc_ntohs((e)->en_tag_len) : soc_ntohs((e)->en_untagged_len))) 93 94 /* 95 * Macro: ENET_HDR_LEN 96 * Purpose: Returns the length of the Ethernet header. 97 */ 98 #define ENET_HDR_LEN(e) \ 99 (ENET_SNAP(e) ? ENET_SNAP_HDR_LEN : \ 100 (ENET_TAGGED(e) ? ENET_TAGGED_HDR_LEN : \ 101 ENET_UNTAGGED_HDR_LEN)) 102 103 /* 104 * Macro: ENET_LEN 105 * Purpose: Check if the ethernet length field is a length 106 * or an ID of some sort. 107 */ 108 #define ENET_LEN(e) \ 109 (0x600 > soc_ntohs(ENET_TAGGED(e) ? \ 110 (e)->en_tag_len : (e)->en_untagged_len)) 111 112 /* 113 * Macro: ENET_SET/GET_MACADDR 114 * Purpose: Set or get the mac address from an ethernet header into 115 * a sal_mac_addr_t. 116 */ 117 #define ENET_SET_MACADDR(e, s) \ 118 sal_memcpy((e), (s), sizeof(sal_mac_addr_t)) 119 #define ENET_GET_MACADDR(e, s) \ 120 sal_memcpy((s), (e), sizeof(sal_mac_addr_t)) 121 #define ENET_COPY_MACADDR(s, d) \ 122 sal_memcpy((d), (s), sizeof(sal_mac_addr_t)) 123 #define ENET_CMP_MACADDR(a, b) \ 124 sal_memcmp((a), (b), sizeof(sal_mac_addr_t)) 125 126 /* 127 * Typedef: ENET_MAX_SIZE 128 * Purpose: Define the maximum size of an ethernet packet (2K) 129 */ 130 #define ENET_MAX_SIZE (2 * 1024) 131 132 133 /* 134 * Macro: ENET_MACADDR_MULTICAST/BROADCAST/UNICAST 135 * Purpose: Determine if a mac address is unicast, multicast, 136 * or broadcast. 137 */ 138 #define ENET_MACADDR_BROADCAST(e) \ 139 MAC_ADDR_EQUAL((e), _soc_mac_all_ones) 140 141 #define ENET_MACADDR_MULTICAST(e) \ 142 (((e)[0] & 0x01) && !ENET_MACADDR_BROADCAST(e)) 143 144 #define ENET_MACADDR_UNICAST(e) (!((e)[0] & 0x01)) 145 146 /** Following macros extract source & dest mac addresses */ 147 /* sal_mac_addr_t m; */ 148 #define ENET_SRCMAC_GET(pkt, m) \ 149 do { /* Look like single 'C' stmt */ \ 150 (m)[5] = (pkt)[11]; \ 151 (m)[4] = (pkt)[10]; \ 152 (m)[3] = (pkt)[9]; \ 153 (m)[2] = (pkt)[8]; \ 154 (m)[1] = (pkt)[7]; \ 155 (m)[0] = (pkt)[6]; \ 156 } while (0) 157 158 /* sal_mac_addr_t m; */ 159 #define ENET_DSTMAC_GET(pkt, m) \ 160 do { /* Look like single 'C' stmt */ \ 161 (m)[5] = (pkt)[5]; \ 162 (m)[4] = (pkt)[4]; \ 163 (m)[3] = (pkt)[3]; \ 164 (m)[2] = (pkt)[2]; \ 165 (m)[1] = (pkt)[1]; \ 166 (m)[0] = (pkt)[0]; \ 167 } while (0) 168 169 #endif /* !_SOC_ENET_H */