1 /**************************************************************************** 2 **+-----------------------------------------------------------------------+** 3 **| |** 4 **| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved. |** 5 **| All rights reserved. |** 6 **| |** 7 **| Redistribution and use in source and binary forms, with or without |** 8 **| modification, are permitted provided that the following conditions |** 9 **| are met: |** 10 **| |** 11 **| * Redistributions of source code must retain the above copyright |** 12 **| notice, this list of conditions and the following disclaimer. |** 13 **| * Redistributions in binary form must reproduce the above copyright |** 14 **| notice, this list of conditions and the following disclaimer in |** 15 **| the documentation and/or other materials provided with the |** 16 **| distribution. |** 17 **| * Neither the name Texas Instruments nor the names of its |** 18 **| contributors may be used to endorse or promote products derived |** 19 **| from this software without specific prior written permission. |** 20 **| |** 21 **| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |** 22 **| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |** 23 **| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |** 24 **| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |** 25 **| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |** 26 **| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |** 27 **| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |** 28 **| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |** 29 **| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |** 30 **| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |** 31 **| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |** 32 **| |** 33 **+-----------------------------------------------------------------------+** 34 ****************************************************************************/ 35 36 /***************************************************************************/ 37 /* */ 38 /* MODULE: Ethernet.h */ 39 /* PURPOSE: */ 40 /* */ 41 /***************************************************************************/ 42 #ifndef _ETHERNET_H_ 43 #define _ETHERNET_H_ 44 45 #pragma pack(1) 46 typedef struct 47 { 48 macAddress_t DstAddr; 49 macAddress_t SrcAddr; 50 UINT16 TypeLength; 51 } EthernetHeader_t; 52 #pragma pack() 53 54 #define ETHERTYPE_802_1D 0x8100 55 56 typedef struct 57 { 58 macAddress_t DstAddr; 59 macAddress_t SrcAddr; 60 UINT16 Length; 61 UINT8 DSAP; 62 UINT8 SSAP; 63 UINT8 Control; 64 UINT8 OUI[3]; 65 UINT16 Type; 66 } LlcSnapHeader_t; 67 #pragma pack() 68 69 #define MAC_ADDRESS_GROUP_BIT ( 0x01 ) /* in byte [ 0 ] of the MAC Address*/ 70 71 72 #define ETHERNET_HDR_LEN 14 73 #define IEEE802_3_HDR_LEN 14 74 #define LLC_SNAP_HDR_LEN 20 75 76 #define SNAP_CHANNEL_ID 0xAA 77 #define LLC_CONTROL_UNNUMBERED_INFORMATION 0x03 78 #define ETHERNET_MAX_PAYLOAD_SIZE 1500 79 80 #define SNAP_OUI_802_1H_BYTE0 0x00 81 #define SNAP_OUI_802_1H_BYTE1 0x00 82 #define SNAP_OUI_802_1H_BYTE2 0xf8 83 #define SNAP_OUI_802_1H_BYTES { SNAP_OUI_802_1H_BYTE0, SNAP_OUI_802_1H_BYTE1, SNAP_OUI_802_1H_BYTE2 } 84 85 #define SNAP_OUI_RFC1042_BYTE0 0x00 86 #define SNAP_OUI_RFC1042_BYTE1 0x00 87 #define SNAP_OUI_RFC1042_BYTE2 0x00 88 #define SNAP_OUI_RFC1042_LEN 3 89 #define SNAP_OUI_RFC1042_BYTES { SNAP_OUI_RFC1042_BYTE0, SNAP_OUI_RFC1042_BYTE1, SNAP_OUI_RFC1042_BYTE2 } 90 91 92 typedef enum tETHERTYPES 93 { 94 ETHERTYPE_APPLE_AARP = 0x80f3, 95 ETHERTYPE_DIX_II_IPX = 0x8137 96 97 } ETHERTYPES, *PETHERTYPES; 98 99 100 static __inline BOOL IsMacAddressZero( macAddress_t *pMacAddr ) 101 { 102 return( (BOOL)( ( 0 == * (unsigned long *)pMacAddr ) && 103 ( 0 == *(unsigned short *)( ( (unsigned long *)pMacAddr ) + 1 ) ) ) ); 104 105 } 106 107 108 static __inline void ClearMacAddress( macAddress_t *pMacAddr ) 109 { 110 * (unsigned long *)pMacAddr = 0; 111 *(unsigned short *)( ( (unsigned long *)pMacAddr ) + 1 ) = 0; 112 } 113 114 115 static __inline BOOL IsMacAddressEqual( macAddress_t *pMacAddr1, macAddress_t *pMacAddr2 ) 116 { 117 return( (BOOL)( 118 ( * (unsigned long *)pMacAddr1 == 119 * (unsigned long *)pMacAddr2 ) && 120 121 ( *( (unsigned short *)( ( (unsigned long *)pMacAddr1 ) + 1 ) ) == 122 *( (unsigned short *)( ( (unsigned long *)pMacAddr2 ) + 1 ) ) ) ) ); 123 } 124 125 static __inline void SetMacAddressBroadcast( macAddress_t *pMacAddr ) 126 { 127 * (unsigned long *)pMacAddr = 0xffffffff; 128 *(unsigned short *)( ( (unsigned long *)pMacAddr ) + 1 ) = 0xffff; 129 130 } 131 132 133 static __inline BOOL IsMacAddressGroup( macAddress_t *pMACAddr ) 134 { 135 return( pMACAddr->addr[ 0 ] & MAC_ADDRESS_GROUP_BIT ); 136 } 137 138 139 static __inline BOOL IsMacAddressDirected( macAddress_t *pMACAddr ) 140 { 141 return( !IsMacAddressGroup( pMACAddr ) ); 142 } 143 144 145 146 static __inline BOOL IsMacAddressBroadcast( macAddress_t *pMacAddr ) 147 { 148 /* In WinCE an adrress that is not divided by 4 causes exception here */ 149 return( (BOOL)( ( 0xffff == *(unsigned short *)pMacAddr ) && 150 ( 0xffff == *(((unsigned short *)pMacAddr) + 1 ) ) && 151 ( 0xffff == *(((unsigned short *)pMacAddr) + 2 ) ))); 152 /* return( (BOOL)( ( 0xffffffff == * (unsigned long *)pMacAddr ) && 153 ( 0xffff == *(unsigned short *)( ( (unsigned long *)pMacAddr ) + 1 ) ) ) );*/ 154 155 } 156 157 158 static __inline BOOL IsMacAddressMulticast( macAddress_t *pMACAddr ) 159 { 160 return( IsMacAddressGroup( pMACAddr ) && !IsMacAddressBroadcast( pMACAddr ) ); 161 } 162 163 164 165 #endif 166