43#if LWIP_ARP || LWIP_ETHERNET
59#ifdef LWIP_HOOK_FILENAME
60#include LWIP_HOOK_FILENAME
63const struct eth_addr ethbroadcast = {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}};
64const struct eth_addr ethzero = {{0, 0, 0, 0, 0, 0}};
85#if LWIP_ARP || ETHARP_SUPPORT_VLAN || LWIP_IPV6
86 u16_t next_hdr_offset = SIZEOF_ETH_HDR;
91 if (p->len <= SIZEOF_ETH_HDR) {
93 ETHARP_STATS_INC(etharp.proterr);
94 ETHARP_STATS_INC(etharp.drop);
95 MIB2_STATS_NETIF_INC(
netif, ifinerrors);
100 ethhdr = (
struct eth_hdr *)p->payload;
102 (
"ethernet_input: dest:%"X8_F
":%"X8_F
":%"X8_F
":%"X8_F
":%"X8_F
":%"X8_F
", src:%"X8_F
":%"X8_F
":%"X8_F
":%"X8_F
":%"X8_F
":%"X8_F
", type:%"X16_F
"\n",
103 (
unsigned char)ethhdr->dest.addr[0], (
unsigned char)ethhdr->dest.addr[1], (
unsigned char)ethhdr->dest.addr[2],
104 (
unsigned char)ethhdr->dest.addr[3], (
unsigned char)ethhdr->dest.addr[4], (
unsigned char)ethhdr->dest.addr[5],
105 (
unsigned char)ethhdr->src.addr[0], (
unsigned char)ethhdr->src.addr[1], (
unsigned char)ethhdr->src.addr[2],
106 (
unsigned char)ethhdr->src.addr[3], (
unsigned char)ethhdr->src.addr[4], (
unsigned char)ethhdr->src.addr[5],
107 lwip_htons(ethhdr->type)));
110#if ETHARP_SUPPORT_VLAN
113 next_hdr_offset = SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR;
114 if (p->len <= SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR) {
116 ETHARP_STATS_INC(etharp.proterr);
117 ETHARP_STATS_INC(etharp.drop);
118 MIB2_STATS_NETIF_INC(
netif, ifinerrors);
119 goto free_and_return;
121#if defined(LWIP_HOOK_VLAN_CHECK) || defined(ETHARP_VLAN_CHECK) || defined(ETHARP_VLAN_CHECK_FN)
122#ifdef LWIP_HOOK_VLAN_CHECK
123 if (!LWIP_HOOK_VLAN_CHECK(
netif, ethhdr, vlan)) {
124#elif defined(ETHARP_VLAN_CHECK_FN)
125 if (!ETHARP_VLAN_CHECK_FN(ethhdr, vlan)) {
126#elif defined(ETHARP_VLAN_CHECK)
127 if (VLAN_ID(vlan) != ETHARP_VLAN_CHECK) {
138#if LWIP_ARP_FILTER_NETIF
139 netif = LWIP_ARP_FILTER_NETIF_FN(p,
netif, lwip_htons(type));
142 if (p->if_idx == NETIF_NO_INDEX) {
143 p->if_idx = netif_get_index(
netif);
146 if (ethhdr->dest.addr[0] & 1) {
150 if ((ethhdr->dest.addr[1] == LL_IP4_MULTICAST_ADDR_1) &&
151 (ethhdr->dest.addr[2] == LL_IP4_MULTICAST_ADDR_2)) {
159 (ethhdr->dest.addr[1] == LL_IP6_MULTICAST_ADDR_1)) {
164 else if (eth_addr_cmp(ðhdr->dest, ðbroadcast)) {
171#if LWIP_IPV4 && LWIP_ARP
175 goto free_and_return;
180 (
"ethernet_input: IPv4 packet dropped, too short (%"U16_F
"/%"U16_F
")\n",
181 p->tot_len, next_hdr_offset));
183 goto free_and_return;
192 goto free_and_return;
197 (
"ethernet_input: ARP response packet dropped, too short (%"U16_F
"/%"U16_F
")\n",
198 p->tot_len, next_hdr_offset));
200 ETHARP_STATS_INC(etharp.lenerr);
201 ETHARP_STATS_INC(etharp.drop);
202 goto free_and_return;
205 etharp_input(p,
netif);
211 pppoe_disc_input(
netif, p);
215 pppoe_data_input(
netif, p);
224 (
"ethernet_input: IPv6 packet dropped, too short (%"U16_F
"/%"U16_F
")\n",
225 p->tot_len, next_hdr_offset));
226 goto free_and_return;
235#ifdef LWIP_HOOK_UNKNOWN_ETH_PROTOCOL
236 if (LWIP_HOOK_UNKNOWN_ETH_PROTOCOL(p,
netif) ==
ERR_OK) {
240 ETHARP_STATS_INC(etharp.proterr);
241 ETHARP_STATS_INC(etharp.drop);
242 MIB2_STATS_NETIF_INC(
netif, ifinunknownprotos);
243 goto free_and_return;
274 u16_t eth_type_be = lwip_htons(eth_type);
276#if ETHARP_SUPPORT_VLAN && (defined(LWIP_HOOK_VLAN_SET) || LWIP_VLAN_PCP)
278#ifdef LWIP_HOOK_VLAN_SET
279 vlan_prio_vid = LWIP_HOOK_VLAN_SET(
netif, p, src, dst, eth_type);
282 if (
netif->hints && (
netif->hints->tci >= 0)) {
283 vlan_prio_vid = (u16_t)
netif->hints->tci;
286 if (vlan_prio_vid >= 0) {
289 LWIP_ASSERT(
"prio_vid must be <= 0xFFFF", vlan_prio_vid <= 0xFFFF);
292 goto pbuf_header_failed;
294 vlanhdr = (
struct eth_vlan_hdr *)(((u8_t *)p->payload) + SIZEOF_ETH_HDR);
295 vlanhdr->tpid = eth_type_be;
296 vlanhdr->prio_vid = lwip_htons((u16_t)vlan_prio_vid);
303 goto pbuf_header_failed;
309 ethhdr = (
struct eth_hdr *)p->payload;
310 ethhdr->type = eth_type_be;
311 SMEMCPY(ðhdr->dest, dst, ETH_HWADDR_LEN);
312 SMEMCPY(ðhdr->src, src, ETH_HWADDR_LEN);
314 LWIP_ASSERT(
"netif->hwaddr_len must be 6 for ethernet_output!",
317 (
"ethernet_output: sending packet %p\n", (
void *)p));
324 (
"ethernet_output: could not allocate room for header.\n"));
325 LINK_STATS_INC(link.lenerr);
#define LWIP_DBG_LEVEL_SERIOUS
#define LWIP_DBG_LEVEL_WARNING
#define LWIP_ASSERT_CORE_LOCKED()
#define SMEMCPY(dst, src, len)
#define NETIF_FLAG_ETHARP
u8 pbuf_free(struct pbuf *p)
#define LL_IP6_MULTICAST_ADDR_0
#define LL_IP4_MULTICAST_ADDR_0
u8_t pbuf_add_header(struct pbuf *p, size_t header_size_increment)
#define PBUF_FLAG_LLBCAST
u8_t pbuf_remove_header(struct pbuf *p, size_t header_size)
#define PBUF_FLAG_LLMCAST
netif_linkoutput_fn linkoutput