BeRTOS
eth.h
Go to the documentation of this file.
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 */