00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef __NETIF_ETHARP_H__
00036 #define __NETIF_ETHARP_H__
00037
00038 #include "lwip/opt.h"
00039
00040 #if LWIP_ARP
00041
00042 #include "lwip/pbuf.h"
00043 #include "lwip/ip_addr.h"
00044 #include "lwip/netif.h"
00045 #include "lwip/ip.h"
00046
00047 #ifdef __cplusplus
00048 extern "C" {
00049 #endif
00050
00051 #ifndef ETH_PAD_SIZE
00052 #define ETH_PAD_SIZE 2
00053 #endif
00054
00055 #ifndef ETHARP_HWADDR_LEN
00056 #define ETHARP_HWADDR_LEN 6
00057 #endif
00058
00059 #ifdef PACK_STRUCT_USE_INCLUDES
00060 # include "arch/bpstruct.h"
00061 #endif
00062 PACK_STRUCT_BEGIN
00063 struct eth_addr {
00064 PACK_STRUCT_FIELD(u8_t addr[ETHARP_HWADDR_LEN]);
00065 } PACK_STRUCT_STRUCT;
00066 PACK_STRUCT_END
00067 #ifdef PACK_STRUCT_USE_INCLUDES
00068 # include "arch/epstruct.h"
00069 #endif
00070
00071 #ifdef PACK_STRUCT_USE_INCLUDES
00072 # include "arch/bpstruct.h"
00073 #endif
00074 PACK_STRUCT_BEGIN
00075 struct eth_hdr {
00076 #if ETH_PAD_SIZE
00077 PACK_STRUCT_FIELD(u8_t padding[ETH_PAD_SIZE]);
00078 #endif
00079 PACK_STRUCT_FIELD(struct eth_addr dest);
00080 PACK_STRUCT_FIELD(struct eth_addr src);
00081 PACK_STRUCT_FIELD(u16_t type);
00082 } PACK_STRUCT_STRUCT;
00083 PACK_STRUCT_END
00084 #ifdef PACK_STRUCT_USE_INCLUDES
00085 # include "arch/epstruct.h"
00086 #endif
00087
00088 #define SIZEOF_ETH_HDR (14 + ETH_PAD_SIZE)
00089
00090 #if ETHARP_SUPPORT_VLAN
00091
00092 #ifdef PACK_STRUCT_USE_INCLUDES
00093 # include "arch/bpstruct.h"
00094 #endif
00095 PACK_STRUCT_BEGIN
00096 struct eth_vlan_hdr {
00097 PACK_STRUCT_FIELD(u16_t tpid);
00098 PACK_STRUCT_FIELD(u16_t prio_vid);
00099 } PACK_STRUCT_STRUCT;
00100 PACK_STRUCT_END
00101 #ifdef PACK_STRUCT_USE_INCLUDES
00102 # include "arch/epstruct.h"
00103 #endif
00104
00105 #define SIZEOF_VLAN_HDR 4
00106 #define VLAN_ID(vlan_hdr) (htons((vlan_hdr)->prio_vid) & 0xFFF)
00107
00108 #endif
00109
00110 #ifdef PACK_STRUCT_USE_INCLUDES
00111 # include "arch/bpstruct.h"
00112 #endif
00113 PACK_STRUCT_BEGIN
00114
00115 struct etharp_hdr {
00116 PACK_STRUCT_FIELD(u16_t hwtype);
00117 PACK_STRUCT_FIELD(u16_t proto);
00118 PACK_STRUCT_FIELD(u16_t _hwlen_protolen);
00119 PACK_STRUCT_FIELD(u16_t opcode);
00120 PACK_STRUCT_FIELD(struct eth_addr shwaddr);
00121 PACK_STRUCT_FIELD(struct ip_addr2 sipaddr);
00122 PACK_STRUCT_FIELD(struct eth_addr dhwaddr);
00123 PACK_STRUCT_FIELD(struct ip_addr2 dipaddr);
00124 } PACK_STRUCT_STRUCT;
00125 PACK_STRUCT_END
00126 #ifdef PACK_STRUCT_USE_INCLUDES
00127 # include "arch/epstruct.h"
00128 #endif
00129
00130 #define SIZEOF_ETHARP_HDR 28
00131 #define SIZEOF_ETHARP_PACKET (SIZEOF_ETH_HDR + SIZEOF_ETHARP_HDR)
00132
00133
00134 #define ARP_TMR_INTERVAL 5000
00135
00136 #define ETHTYPE_ARP 0x0806
00137 #define ETHTYPE_IP 0x0800
00138 #define ETHTYPE_VLAN 0x8100
00139 #define ETHTYPE_PPPOEDISC 0x8863
00140 #define ETHTYPE_PPPOE 0x8864
00141
00142
00143 #define ARP_REQUEST 1
00144 #define ARP_REPLY 2
00145
00146 #if ARP_QUEUEING
00147
00148
00149
00150 struct etharp_q_entry {
00151 struct etharp_q_entry *next;
00152 struct pbuf *p;
00153 };
00154 #endif
00155
00156 #define etharp_init()
00157 void etharp_tmr(void);
00158 s8_t etharp_find_addr(struct netif *netif, struct ip_addr *ipaddr,
00159 struct eth_addr **eth_ret, struct ip_addr **ip_ret);
00160 void etharp_ip_input(struct netif *netif, struct pbuf *p);
00161 void etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr,
00162 struct pbuf *p);
00163 err_t etharp_output(struct netif *netif, struct pbuf *q, struct ip_addr *ipaddr);
00164 err_t etharp_query(struct netif *netif, struct ip_addr *ipaddr, struct pbuf *q);
00165 err_t etharp_request(struct netif *netif, struct ip_addr *ipaddr);
00166
00167
00168
00169
00170 #define etharp_gratuitous(netif) etharp_request((netif), &(netif)->ip_addr)
00171
00172 err_t ethernet_input(struct pbuf *p, struct netif *netif);
00173
00174 #if LWIP_AUTOIP
00175 err_t etharp_raw(struct netif *netif, const struct eth_addr *ethsrc_addr,
00176 const struct eth_addr *ethdst_addr,
00177 const struct eth_addr *hwsrc_addr, const struct ip_addr *ipsrc_addr,
00178 const struct eth_addr *hwdst_addr, const struct ip_addr *ipdst_addr,
00179 const u16_t opcode);
00180 #endif
00181
00182 #define eth_addr_cmp(addr1, addr2) (memcmp((addr1)->addr, (addr2)->addr, ETHARP_HWADDR_LEN) == 0)
00183
00184 extern const struct eth_addr ethbroadcast, ethzero;
00185
00186 #ifdef __cplusplus
00187 }
00188 #endif
00189
00190 #endif
00191
00192 #endif