eth.h

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