openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

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 */