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