BeRTOS
|
00001 00043 #ifndef DRV_ETH_H 00044 #define DRV_ETH_H 00045 00046 #include <cpu/types.h> 00047 00048 #define ETH_ADDR_LEN 6 00049 #define ETH_HEAD_LEN 14 00050 #define ETH_DATA_LEN 1500 00051 #define ETH_FRAME_LEN (ETH_HEAD_LEN + ETH_DATA_LEN) 00052 00053 #define ETH_TYPE_IP 0x0800 00054 00055 typedef union Ethernet 00056 { 00057 struct 00058 { 00059 uint8_t dst[ETH_ADDR_LEN]; 00060 uint8_t src[ETH_ADDR_LEN]; 00061 uint16_t type; 00062 uint8_t data[0]; 00063 }; 00064 uint8_t raw[ETH_FRAME_LEN]; 00065 } PACKED Ethernet; 00066 00070 INLINE int eth_addrIsZero(const uint8_t *addr) 00071 { 00072 return !(addr[0] | addr[1] | addr[2] | 00073 addr[3] | addr[4] | addr[5]); 00074 } 00075 00079 INLINE int eth_addrIsMcast(const uint8_t *addr) 00080 { 00081 return (0x01 & addr[0]); 00082 } 00083 00087 INLINE int eth_addrIsLocal(const uint8_t *addr) 00088 { 00089 return (0x02 & addr[0]); 00090 } 00091 00095 INLINE bool eth_addrIsBcast(const uint8_t *addr) 00096 { 00097 return (addr[0] & addr[1] & addr[2] & 00098 addr[3] & addr[4] & addr[5]) == 0xff; 00099 } 00100 00105 INLINE bool eth_addrIsValid(const uint8_t *addr) 00106 { 00107 return !eth_addrIsMcast(addr) && !eth_addrIsZero(addr); 00108 } 00109 00113 INLINE bool eth_addrCmp(const uint8_t *addr1, const uint8_t *addr2) 00114 { 00115 return !!((addr1[0] ^ addr2[0]) | 00116 (addr1[1] ^ addr2[1]) | 00117 (addr1[2] ^ addr2[2]) | 00118 (addr1[3] ^ addr2[3]) | 00119 (addr1[4] ^ addr2[4]) | 00120 (addr1[5] ^ addr2[5])); 00121 } 00122 00123 ssize_t eth_putFrame(const uint8_t *buf, size_t len); 00124 void eth_sendFrame(void); 00125 00126 size_t eth_getFrameLen(void); 00127 ssize_t eth_getFrame(uint8_t *buf, size_t len); 00128 00129 ssize_t eth_send(const uint8_t *buf, size_t len); 00130 ssize_t eth_recv(uint8_t *buf, size_t len); 00131 00132 int eth_init(void); 00133 00134 extern const uint8_t mac_addr[ETH_ADDR_LEN]; 00135 00136 #endif /* DRV_ETH_H */