Ethernet for Nucleo and Disco board STM32F746 works with gcc and arm. IAC is untested

Fork of F7_Ethernet by Dieter Graef

Committer:
TudaPellini
Date:
Sun Aug 20 17:01:43 2017 +0000
Revision:
2:11660e6c9d7a
Parent:
0:d26c1b55cfca
Added support to F767 and LWIP entries to receive raw ethernet data in promiscuous mode for IEC 61850 GOOSE messages

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DieterGraef 0:d26c1b55cfca 1 /*
DieterGraef 0:d26c1b55cfca 2 * Copyright (c) 2001-2003 Swedish Institute of Computer Science.
DieterGraef 0:d26c1b55cfca 3 * Copyright (c) 2003-2004 Leon Woestenberg <leon.woestenberg@axon.tv>
DieterGraef 0:d26c1b55cfca 4 * Copyright (c) 2003-2004 Axon Digital Design B.V., The Netherlands.
DieterGraef 0:d26c1b55cfca 5 * All rights reserved.
DieterGraef 0:d26c1b55cfca 6 *
DieterGraef 0:d26c1b55cfca 7 * Redistribution and use in source and binary forms, with or without modification,
DieterGraef 0:d26c1b55cfca 8 * are permitted provided that the following conditions are met:
DieterGraef 0:d26c1b55cfca 9 *
DieterGraef 0:d26c1b55cfca 10 * 1. Redistributions of source code must retain the above copyright notice,
DieterGraef 0:d26c1b55cfca 11 * this list of conditions and the following disclaimer.
DieterGraef 0:d26c1b55cfca 12 * 2. Redistributions in binary form must reproduce the above copyright notice,
DieterGraef 0:d26c1b55cfca 13 * this list of conditions and the following disclaimer in the documentation
DieterGraef 0:d26c1b55cfca 14 * and/or other materials provided with the distribution.
DieterGraef 0:d26c1b55cfca 15 * 3. The name of the author may not be used to endorse or promote products
DieterGraef 0:d26c1b55cfca 16 * derived from this software without specific prior written permission.
DieterGraef 0:d26c1b55cfca 17 *
DieterGraef 0:d26c1b55cfca 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
DieterGraef 0:d26c1b55cfca 19 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
DieterGraef 0:d26c1b55cfca 20 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
DieterGraef 0:d26c1b55cfca 21 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
DieterGraef 0:d26c1b55cfca 22 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
DieterGraef 0:d26c1b55cfca 23 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
DieterGraef 0:d26c1b55cfca 24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
DieterGraef 0:d26c1b55cfca 25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
DieterGraef 0:d26c1b55cfca 26 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
DieterGraef 0:d26c1b55cfca 27 * OF SUCH DAMAGE.
DieterGraef 0:d26c1b55cfca 28 *
DieterGraef 0:d26c1b55cfca 29 * This file is part of the lwIP TCP/IP stack.
DieterGraef 0:d26c1b55cfca 30 *
DieterGraef 0:d26c1b55cfca 31 * Author: Adam Dunkels <adam@sics.se>
DieterGraef 0:d26c1b55cfca 32 *
DieterGraef 0:d26c1b55cfca 33 */
DieterGraef 0:d26c1b55cfca 34
DieterGraef 0:d26c1b55cfca 35 #ifndef __NETIF_ETHARP_H__
DieterGraef 0:d26c1b55cfca 36 #define __NETIF_ETHARP_H__
DieterGraef 0:d26c1b55cfca 37
DieterGraef 0:d26c1b55cfca 38 #include "lwip/opt.h"
DieterGraef 0:d26c1b55cfca 39
TudaPellini 2:11660e6c9d7a 40 //by Pellini
TudaPellini 2:11660e6c9d7a 41 #if LWIP_ARP || LWIP_ETHERNET || LWIP_GOOSE /* don't build if not configured for use in lwipopts.h */
DieterGraef 0:d26c1b55cfca 42
DieterGraef 0:d26c1b55cfca 43 #include "lwip/pbuf.h"
DieterGraef 0:d26c1b55cfca 44 #include "lwip/ip_addr.h"
DieterGraef 0:d26c1b55cfca 45 #include "lwip/netif.h"
DieterGraef 0:d26c1b55cfca 46 #include "lwip/ip.h"
DieterGraef 0:d26c1b55cfca 47
TudaPellini 2:11660e6c9d7a 48 //by Pellini
TudaPellini 2:11660e6c9d7a 49 #include "gooseRcv.h"
TudaPellini 2:11660e6c9d7a 50 #include "SerialDebug.h"
TudaPellini 2:11660e6c9d7a 51
DieterGraef 0:d26c1b55cfca 52 #ifdef __cplusplus
DieterGraef 0:d26c1b55cfca 53 extern "C" {
DieterGraef 0:d26c1b55cfca 54 #endif
DieterGraef 0:d26c1b55cfca 55
DieterGraef 0:d26c1b55cfca 56 #ifndef ETHARP_HWADDR_LEN
DieterGraef 0:d26c1b55cfca 57 #define ETHARP_HWADDR_LEN 6
DieterGraef 0:d26c1b55cfca 58 #endif
DieterGraef 0:d26c1b55cfca 59
DieterGraef 0:d26c1b55cfca 60 #ifdef PACK_STRUCT_USE_INCLUDES
DieterGraef 0:d26c1b55cfca 61 # include "arch/bpstruct.h"
DieterGraef 0:d26c1b55cfca 62 #endif
DieterGraef 0:d26c1b55cfca 63 PACK_STRUCT_BEGIN
DieterGraef 0:d26c1b55cfca 64 struct eth_addr {
DieterGraef 0:d26c1b55cfca 65 PACK_STRUCT_FIELD(u8_t addr[ETHARP_HWADDR_LEN]);
DieterGraef 0:d26c1b55cfca 66 } PACK_STRUCT_STRUCT;
DieterGraef 0:d26c1b55cfca 67 PACK_STRUCT_END
DieterGraef 0:d26c1b55cfca 68 #ifdef PACK_STRUCT_USE_INCLUDES
DieterGraef 0:d26c1b55cfca 69 # include "arch/epstruct.h"
DieterGraef 0:d26c1b55cfca 70 #endif
DieterGraef 0:d26c1b55cfca 71
DieterGraef 0:d26c1b55cfca 72 #ifdef PACK_STRUCT_USE_INCLUDES
DieterGraef 0:d26c1b55cfca 73 # include "arch/bpstruct.h"
DieterGraef 0:d26c1b55cfca 74 #endif
DieterGraef 0:d26c1b55cfca 75 PACK_STRUCT_BEGIN
DieterGraef 0:d26c1b55cfca 76 /** Ethernet header */
DieterGraef 0:d26c1b55cfca 77 struct eth_hdr {
DieterGraef 0:d26c1b55cfca 78 #if ETH_PAD_SIZE
DieterGraef 0:d26c1b55cfca 79 PACK_STRUCT_FIELD(u8_t padding[ETH_PAD_SIZE]);
DieterGraef 0:d26c1b55cfca 80 #endif
DieterGraef 0:d26c1b55cfca 81 PACK_STRUCT_FIELD(struct eth_addr dest);
DieterGraef 0:d26c1b55cfca 82 PACK_STRUCT_FIELD(struct eth_addr src);
DieterGraef 0:d26c1b55cfca 83 PACK_STRUCT_FIELD(u16_t type);
DieterGraef 0:d26c1b55cfca 84 } PACK_STRUCT_STRUCT;
DieterGraef 0:d26c1b55cfca 85 PACK_STRUCT_END
DieterGraef 0:d26c1b55cfca 86 #ifdef PACK_STRUCT_USE_INCLUDES
DieterGraef 0:d26c1b55cfca 87 # include "arch/epstruct.h"
DieterGraef 0:d26c1b55cfca 88 #endif
DieterGraef 0:d26c1b55cfca 89
DieterGraef 0:d26c1b55cfca 90 #define SIZEOF_ETH_HDR (14 + ETH_PAD_SIZE)
DieterGraef 0:d26c1b55cfca 91
DieterGraef 0:d26c1b55cfca 92 #if ETHARP_SUPPORT_VLAN
DieterGraef 0:d26c1b55cfca 93
DieterGraef 0:d26c1b55cfca 94 #ifdef PACK_STRUCT_USE_INCLUDES
DieterGraef 0:d26c1b55cfca 95 # include "arch/bpstruct.h"
DieterGraef 0:d26c1b55cfca 96 #endif
DieterGraef 0:d26c1b55cfca 97 PACK_STRUCT_BEGIN
DieterGraef 0:d26c1b55cfca 98 /** VLAN header inserted between ethernet header and payload
DieterGraef 0:d26c1b55cfca 99 * if 'type' in ethernet header is ETHTYPE_VLAN.
DieterGraef 0:d26c1b55cfca 100 * See IEEE802.Q */
DieterGraef 0:d26c1b55cfca 101 struct eth_vlan_hdr {
DieterGraef 0:d26c1b55cfca 102 PACK_STRUCT_FIELD(u16_t prio_vid);
DieterGraef 0:d26c1b55cfca 103 PACK_STRUCT_FIELD(u16_t tpid);
DieterGraef 0:d26c1b55cfca 104 } PACK_STRUCT_STRUCT;
DieterGraef 0:d26c1b55cfca 105 PACK_STRUCT_END
DieterGraef 0:d26c1b55cfca 106 #ifdef PACK_STRUCT_USE_INCLUDES
DieterGraef 0:d26c1b55cfca 107 # include "arch/epstruct.h"
DieterGraef 0:d26c1b55cfca 108 #endif
DieterGraef 0:d26c1b55cfca 109
DieterGraef 0:d26c1b55cfca 110 #define SIZEOF_VLAN_HDR 4
DieterGraef 0:d26c1b55cfca 111 #define VLAN_ID(vlan_hdr) (htons((vlan_hdr)->prio_vid) & 0xFFF)
DieterGraef 0:d26c1b55cfca 112
DieterGraef 0:d26c1b55cfca 113 #endif /* ETHARP_SUPPORT_VLAN */
DieterGraef 0:d26c1b55cfca 114
DieterGraef 0:d26c1b55cfca 115 #ifdef PACK_STRUCT_USE_INCLUDES
DieterGraef 0:d26c1b55cfca 116 # include "arch/bpstruct.h"
DieterGraef 0:d26c1b55cfca 117 #endif
DieterGraef 0:d26c1b55cfca 118 PACK_STRUCT_BEGIN
DieterGraef 0:d26c1b55cfca 119 /** the ARP message, see RFC 826 ("Packet format") */
DieterGraef 0:d26c1b55cfca 120 struct etharp_hdr {
DieterGraef 0:d26c1b55cfca 121 PACK_STRUCT_FIELD(u16_t hwtype);
DieterGraef 0:d26c1b55cfca 122 PACK_STRUCT_FIELD(u16_t proto);
DieterGraef 0:d26c1b55cfca 123 PACK_STRUCT_FIELD(u8_t hwlen);
DieterGraef 0:d26c1b55cfca 124 PACK_STRUCT_FIELD(u8_t protolen);
DieterGraef 0:d26c1b55cfca 125 PACK_STRUCT_FIELD(u16_t opcode);
DieterGraef 0:d26c1b55cfca 126 PACK_STRUCT_FIELD(struct eth_addr shwaddr);
DieterGraef 0:d26c1b55cfca 127 PACK_STRUCT_FIELD(struct ip_addr2 sipaddr);
DieterGraef 0:d26c1b55cfca 128 PACK_STRUCT_FIELD(struct eth_addr dhwaddr);
DieterGraef 0:d26c1b55cfca 129 PACK_STRUCT_FIELD(struct ip_addr2 dipaddr);
DieterGraef 0:d26c1b55cfca 130 } PACK_STRUCT_STRUCT;
DieterGraef 0:d26c1b55cfca 131 PACK_STRUCT_END
DieterGraef 0:d26c1b55cfca 132 #ifdef PACK_STRUCT_USE_INCLUDES
DieterGraef 0:d26c1b55cfca 133 # include "arch/epstruct.h"
DieterGraef 0:d26c1b55cfca 134 #endif
DieterGraef 0:d26c1b55cfca 135
DieterGraef 0:d26c1b55cfca 136 #define SIZEOF_ETHARP_HDR 28
DieterGraef 0:d26c1b55cfca 137 #define SIZEOF_ETHARP_PACKET (SIZEOF_ETH_HDR + SIZEOF_ETHARP_HDR)
DieterGraef 0:d26c1b55cfca 138
DieterGraef 0:d26c1b55cfca 139 /** 5 seconds period */
DieterGraef 0:d26c1b55cfca 140 #define ARP_TMR_INTERVAL 5000
DieterGraef 0:d26c1b55cfca 141
DieterGraef 0:d26c1b55cfca 142 #define ETHTYPE_ARP 0x0806U
DieterGraef 0:d26c1b55cfca 143 #define ETHTYPE_IP 0x0800U
DieterGraef 0:d26c1b55cfca 144 #define ETHTYPE_VLAN 0x8100U
DieterGraef 0:d26c1b55cfca 145 #define ETHTYPE_PPPOEDISC 0x8863U /* PPP Over Ethernet Discovery Stage */
DieterGraef 0:d26c1b55cfca 146 #define ETHTYPE_PPPOE 0x8864U /* PPP Over Ethernet Session Stage */
DieterGraef 0:d26c1b55cfca 147
TudaPellini 2:11660e6c9d7a 148 /**** added by Eduardo Pellini elpellini@usp.br ****/
TudaPellini 2:11660e6c9d7a 149 #define ETHTYPE_GOOSE 0x88B8U /* IEC 61850 GOOSE Messages */
TudaPellini 2:11660e6c9d7a 150 #define ETHTYPE_GOOSESV 0x88BAU /* IEC 61850 GOOSE Sampled Value Messages */
TudaPellini 2:11660e6c9d7a 151
DieterGraef 0:d26c1b55cfca 152 /** MEMCPY-like macro to copy to/from struct eth_addr's that are local variables
DieterGraef 0:d26c1b55cfca 153 * or known to be 32-bit aligned within the protocol header. */
DieterGraef 0:d26c1b55cfca 154 #ifndef ETHADDR32_COPY
DieterGraef 0:d26c1b55cfca 155 #define ETHADDR32_COPY(src, dst) SMEMCPY(src, dst, ETHARP_HWADDR_LEN)
DieterGraef 0:d26c1b55cfca 156 #endif
DieterGraef 0:d26c1b55cfca 157
DieterGraef 0:d26c1b55cfca 158 /** MEMCPY-like macro to copy to/from struct eth_addr's that are no local
DieterGraef 0:d26c1b55cfca 159 * variables and known to be 16-bit aligned within the protocol header. */
DieterGraef 0:d26c1b55cfca 160 #ifndef ETHADDR16_COPY
DieterGraef 0:d26c1b55cfca 161 #define ETHADDR16_COPY(src, dst) SMEMCPY(src, dst, ETHARP_HWADDR_LEN)
DieterGraef 0:d26c1b55cfca 162 #endif
DieterGraef 0:d26c1b55cfca 163
DieterGraef 0:d26c1b55cfca 164 #if LWIP_ARP /* don't build if not configured for use in lwipopts.h */
DieterGraef 0:d26c1b55cfca 165
DieterGraef 0:d26c1b55cfca 166 /** ARP message types (opcodes) */
DieterGraef 0:d26c1b55cfca 167 #define ARP_REQUEST 1
DieterGraef 0:d26c1b55cfca 168 #define ARP_REPLY 2
DieterGraef 0:d26c1b55cfca 169
DieterGraef 0:d26c1b55cfca 170 /** Define this to 1 and define LWIP_ARP_FILTER_NETIF_FN(pbuf, netif, type)
DieterGraef 0:d26c1b55cfca 171 * to a filter function that returns the correct netif when using multiple
DieterGraef 0:d26c1b55cfca 172 * netifs on one hardware interface where the netif's low-level receive
DieterGraef 0:d26c1b55cfca 173 * routine cannot decide for the correct netif (e.g. when mapping multiple
DieterGraef 0:d26c1b55cfca 174 * IP addresses to one hardware interface).
DieterGraef 0:d26c1b55cfca 175 */
DieterGraef 0:d26c1b55cfca 176 #ifndef LWIP_ARP_FILTER_NETIF
DieterGraef 0:d26c1b55cfca 177 #define LWIP_ARP_FILTER_NETIF 0
DieterGraef 0:d26c1b55cfca 178 #endif
DieterGraef 0:d26c1b55cfca 179
DieterGraef 0:d26c1b55cfca 180 #if ARP_QUEUEING
DieterGraef 0:d26c1b55cfca 181 /** struct for queueing outgoing packets for unknown address
DieterGraef 0:d26c1b55cfca 182 * defined here to be accessed by memp.h
DieterGraef 0:d26c1b55cfca 183 */
DieterGraef 0:d26c1b55cfca 184 struct etharp_q_entry {
DieterGraef 0:d26c1b55cfca 185 struct etharp_q_entry *next;
DieterGraef 0:d26c1b55cfca 186 struct pbuf *p;
DieterGraef 0:d26c1b55cfca 187 };
DieterGraef 0:d26c1b55cfca 188 #endif /* ARP_QUEUEING */
DieterGraef 0:d26c1b55cfca 189
DieterGraef 0:d26c1b55cfca 190 #define etharp_init() /* Compatibility define, not init needed. */
DieterGraef 0:d26c1b55cfca 191 void etharp_tmr(void);
DieterGraef 0:d26c1b55cfca 192 s8_t etharp_find_addr(struct netif *netif, ip_addr_t *ipaddr,
DieterGraef 0:d26c1b55cfca 193 struct eth_addr **eth_ret, ip_addr_t **ip_ret);
DieterGraef 0:d26c1b55cfca 194 err_t etharp_output(struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr);
DieterGraef 0:d26c1b55cfca 195 err_t etharp_query(struct netif *netif, ip_addr_t *ipaddr, struct pbuf *q);
DieterGraef 0:d26c1b55cfca 196 err_t etharp_request(struct netif *netif, ip_addr_t *ipaddr);
DieterGraef 0:d26c1b55cfca 197 /** For Ethernet network interfaces, we might want to send "gratuitous ARP";
DieterGraef 0:d26c1b55cfca 198 * this is an ARP packet sent by a node in order to spontaneously cause other
DieterGraef 0:d26c1b55cfca 199 * nodes to update an entry in their ARP cache.
DieterGraef 0:d26c1b55cfca 200 * From RFC 3220 "IP Mobility Support for IPv4" section 4.6. */
DieterGraef 0:d26c1b55cfca 201 #define etharp_gratuitous(netif) etharp_request((netif), &(netif)->ip_addr)
DieterGraef 0:d26c1b55cfca 202 void etharp_cleanup_netif(struct netif *netif);
DieterGraef 0:d26c1b55cfca 203
DieterGraef 0:d26c1b55cfca 204 #if ETHARP_SUPPORT_STATIC_ENTRIES
DieterGraef 0:d26c1b55cfca 205 err_t etharp_add_static_entry(ip_addr_t *ipaddr, struct eth_addr *ethaddr);
DieterGraef 0:d26c1b55cfca 206 err_t etharp_remove_static_entry(ip_addr_t *ipaddr);
DieterGraef 0:d26c1b55cfca 207 #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
DieterGraef 0:d26c1b55cfca 208
DieterGraef 0:d26c1b55cfca 209 #if LWIP_AUTOIP
DieterGraef 0:d26c1b55cfca 210 err_t etharp_raw(struct netif *netif, const struct eth_addr *ethsrc_addr,
DieterGraef 0:d26c1b55cfca 211 const struct eth_addr *ethdst_addr,
DieterGraef 0:d26c1b55cfca 212 const struct eth_addr *hwsrc_addr, const ip_addr_t *ipsrc_addr,
DieterGraef 0:d26c1b55cfca 213 const struct eth_addr *hwdst_addr, const ip_addr_t *ipdst_addr,
DieterGraef 0:d26c1b55cfca 214 const u16_t opcode);
DieterGraef 0:d26c1b55cfca 215 #endif /* LWIP_AUTOIP */
DieterGraef 0:d26c1b55cfca 216
DieterGraef 0:d26c1b55cfca 217 #endif /* LWIP_ARP */
DieterGraef 0:d26c1b55cfca 218
DieterGraef 0:d26c1b55cfca 219 err_t ethernet_input(struct pbuf *p, struct netif *netif);
DieterGraef 0:d26c1b55cfca 220
DieterGraef 0:d26c1b55cfca 221 #define eth_addr_cmp(addr1, addr2) (memcmp((addr1)->addr, (addr2)->addr, ETHARP_HWADDR_LEN) == 0)
DieterGraef 0:d26c1b55cfca 222
DieterGraef 0:d26c1b55cfca 223 extern const struct eth_addr ethbroadcast, ethzero;
DieterGraef 0:d26c1b55cfca 224
DieterGraef 0:d26c1b55cfca 225 #endif /* LWIP_ARP || LWIP_ETHERNET */
DieterGraef 0:d26c1b55cfca 226
DieterGraef 0:d26c1b55cfca 227 #ifdef __cplusplus
DieterGraef 0:d26c1b55cfca 228 }
DieterGraef 0:d26c1b55cfca 229 #endif
DieterGraef 0:d26c1b55cfca 230
DieterGraef 0:d26c1b55cfca 231 #endif /* __NETIF_ARP_H__ */