Embedded C project:18/12/2014

Dependencies:   DS1307 TextLCD mbed

Committer:
ninoderkinderen
Date:
Thu Dec 18 09:35:49 2014 +0000
Revision:
0:8d87bc453349
Programma embedded C

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ninoderkinderen 0:8d87bc453349 1 /**
ninoderkinderen 0:8d87bc453349 2 * @file
ninoderkinderen 0:8d87bc453349 3 * Ethernet Interface Skeleton
ninoderkinderen 0:8d87bc453349 4 *
ninoderkinderen 0:8d87bc453349 5 */
ninoderkinderen 0:8d87bc453349 6
ninoderkinderen 0:8d87bc453349 7 /*
ninoderkinderen 0:8d87bc453349 8 * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
ninoderkinderen 0:8d87bc453349 9 * All rights reserved.
ninoderkinderen 0:8d87bc453349 10 *
ninoderkinderen 0:8d87bc453349 11 * Redistribution and use in source and binary forms, with or without modification,
ninoderkinderen 0:8d87bc453349 12 * are permitted provided that the following conditions are met:
ninoderkinderen 0:8d87bc453349 13 *
ninoderkinderen 0:8d87bc453349 14 * 1. Redistributions of source code must retain the above copyright notice,
ninoderkinderen 0:8d87bc453349 15 * this list of conditions and the following disclaimer.
ninoderkinderen 0:8d87bc453349 16 * 2. Redistributions in binary form must reproduce the above copyright notice,
ninoderkinderen 0:8d87bc453349 17 * this list of conditions and the following disclaimer in the documentation
ninoderkinderen 0:8d87bc453349 18 * and/or other materials provided with the distribution.
ninoderkinderen 0:8d87bc453349 19 * 3. The name of the author may not be used to endorse or promote products
ninoderkinderen 0:8d87bc453349 20 * derived from this software without specific prior written permission.
ninoderkinderen 0:8d87bc453349 21 *
ninoderkinderen 0:8d87bc453349 22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
ninoderkinderen 0:8d87bc453349 23 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
ninoderkinderen 0:8d87bc453349 24 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
ninoderkinderen 0:8d87bc453349 25 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
ninoderkinderen 0:8d87bc453349 26 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
ninoderkinderen 0:8d87bc453349 27 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
ninoderkinderen 0:8d87bc453349 28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
ninoderkinderen 0:8d87bc453349 29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
ninoderkinderen 0:8d87bc453349 30 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
ninoderkinderen 0:8d87bc453349 31 * OF SUCH DAMAGE.
ninoderkinderen 0:8d87bc453349 32 *
ninoderkinderen 0:8d87bc453349 33 * This file is part of the lwIP TCP/IP stack.
ninoderkinderen 0:8d87bc453349 34 *
ninoderkinderen 0:8d87bc453349 35 * Author: Adam Dunkels <adam@sics.se>
ninoderkinderen 0:8d87bc453349 36 *
ninoderkinderen 0:8d87bc453349 37 */
ninoderkinderen 0:8d87bc453349 38
ninoderkinderen 0:8d87bc453349 39 /*
ninoderkinderen 0:8d87bc453349 40 * This file is a skeleton for developing Ethernet network interface
ninoderkinderen 0:8d87bc453349 41 * drivers for lwIP. Add code to the low_level functions and do a
ninoderkinderen 0:8d87bc453349 42 * search-and-replace for the word "ethernetif" to replace it with
ninoderkinderen 0:8d87bc453349 43 * something that better describes your network interface.
ninoderkinderen 0:8d87bc453349 44 */
ninoderkinderen 0:8d87bc453349 45
ninoderkinderen 0:8d87bc453349 46 #include "lwip/opt.h"
ninoderkinderen 0:8d87bc453349 47
ninoderkinderen 0:8d87bc453349 48 #if 0 /* don't build, this is only a skeleton, see previous comment */
ninoderkinderen 0:8d87bc453349 49
ninoderkinderen 0:8d87bc453349 50 #include "lwip/def.h"
ninoderkinderen 0:8d87bc453349 51 #include "lwip/mem.h"
ninoderkinderen 0:8d87bc453349 52 #include "lwip/pbuf.h"
ninoderkinderen 0:8d87bc453349 53 #include "lwip/sys.h"
ninoderkinderen 0:8d87bc453349 54 #include <lwip/stats.h>
ninoderkinderen 0:8d87bc453349 55 #include <lwip/snmp.h>
ninoderkinderen 0:8d87bc453349 56 #include "netif/etharp.h"
ninoderkinderen 0:8d87bc453349 57 #include "netif/ppp_oe.h"
ninoderkinderen 0:8d87bc453349 58
ninoderkinderen 0:8d87bc453349 59 /* Define those to better describe your network interface. */
ninoderkinderen 0:8d87bc453349 60 #define IFNAME0 'e'
ninoderkinderen 0:8d87bc453349 61 #define IFNAME1 'n'
ninoderkinderen 0:8d87bc453349 62
ninoderkinderen 0:8d87bc453349 63 /**
ninoderkinderen 0:8d87bc453349 64 * Helper struct to hold private data used to operate your ethernet interface.
ninoderkinderen 0:8d87bc453349 65 * Keeping the ethernet address of the MAC in this struct is not necessary
ninoderkinderen 0:8d87bc453349 66 * as it is already kept in the struct netif.
ninoderkinderen 0:8d87bc453349 67 * But this is only an example, anyway...
ninoderkinderen 0:8d87bc453349 68 */
ninoderkinderen 0:8d87bc453349 69 struct ethernetif {
ninoderkinderen 0:8d87bc453349 70 struct eth_addr *ethaddr;
ninoderkinderen 0:8d87bc453349 71 /* Add whatever per-interface state that is needed here. */
ninoderkinderen 0:8d87bc453349 72 };
ninoderkinderen 0:8d87bc453349 73
ninoderkinderen 0:8d87bc453349 74 /* Forward declarations. */
ninoderkinderen 0:8d87bc453349 75 static void ethernetif_input(struct netif *netif);
ninoderkinderen 0:8d87bc453349 76
ninoderkinderen 0:8d87bc453349 77 /**
ninoderkinderen 0:8d87bc453349 78 * In this function, the hardware should be initialized.
ninoderkinderen 0:8d87bc453349 79 * Called from ethernetif_init().
ninoderkinderen 0:8d87bc453349 80 *
ninoderkinderen 0:8d87bc453349 81 * @param netif the already initialized lwip network interface structure
ninoderkinderen 0:8d87bc453349 82 * for this ethernetif
ninoderkinderen 0:8d87bc453349 83 */
ninoderkinderen 0:8d87bc453349 84 static void
ninoderkinderen 0:8d87bc453349 85 low_level_init(struct netif *netif)
ninoderkinderen 0:8d87bc453349 86 {
ninoderkinderen 0:8d87bc453349 87 struct ethernetif *ethernetif = netif->state;
ninoderkinderen 0:8d87bc453349 88
ninoderkinderen 0:8d87bc453349 89 /* set MAC hardware address length */
ninoderkinderen 0:8d87bc453349 90 netif->hwaddr_len = ETHARP_HWADDR_LEN;
ninoderkinderen 0:8d87bc453349 91
ninoderkinderen 0:8d87bc453349 92 /* set MAC hardware address */
ninoderkinderen 0:8d87bc453349 93 netif->hwaddr[0] = ;
ninoderkinderen 0:8d87bc453349 94 ...
ninoderkinderen 0:8d87bc453349 95 netif->hwaddr[5] = ;
ninoderkinderen 0:8d87bc453349 96
ninoderkinderen 0:8d87bc453349 97 /* maximum transfer unit */
ninoderkinderen 0:8d87bc453349 98 netif->mtu = 1500;
ninoderkinderen 0:8d87bc453349 99
ninoderkinderen 0:8d87bc453349 100 /* device capabilities */
ninoderkinderen 0:8d87bc453349 101 /* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */
ninoderkinderen 0:8d87bc453349 102 netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP;
ninoderkinderen 0:8d87bc453349 103
ninoderkinderen 0:8d87bc453349 104 /* Do whatever else is needed to initialize interface. */
ninoderkinderen 0:8d87bc453349 105 }
ninoderkinderen 0:8d87bc453349 106
ninoderkinderen 0:8d87bc453349 107 /**
ninoderkinderen 0:8d87bc453349 108 * This function should do the actual transmission of the packet. The packet is
ninoderkinderen 0:8d87bc453349 109 * contained in the pbuf that is passed to the function. This pbuf
ninoderkinderen 0:8d87bc453349 110 * might be chained.
ninoderkinderen 0:8d87bc453349 111 *
ninoderkinderen 0:8d87bc453349 112 * @param netif the lwip network interface structure for this ethernetif
ninoderkinderen 0:8d87bc453349 113 * @param p the MAC packet to send (e.g. IP packet including MAC addresses and type)
ninoderkinderen 0:8d87bc453349 114 * @return ERR_OK if the packet could be sent
ninoderkinderen 0:8d87bc453349 115 * an err_t value if the packet couldn't be sent
ninoderkinderen 0:8d87bc453349 116 *
ninoderkinderen 0:8d87bc453349 117 * @note Returning ERR_MEM here if a DMA queue of your MAC is full can lead to
ninoderkinderen 0:8d87bc453349 118 * strange results. You might consider waiting for space in the DMA queue
ninoderkinderen 0:8d87bc453349 119 * to become availale since the stack doesn't retry to send a packet
ninoderkinderen 0:8d87bc453349 120 * dropped because of memory failure (except for the TCP timers).
ninoderkinderen 0:8d87bc453349 121 */
ninoderkinderen 0:8d87bc453349 122
ninoderkinderen 0:8d87bc453349 123 static err_t
ninoderkinderen 0:8d87bc453349 124 low_level_output(struct netif *netif, struct pbuf *p)
ninoderkinderen 0:8d87bc453349 125 {
ninoderkinderen 0:8d87bc453349 126 struct ethernetif *ethernetif = netif->state;
ninoderkinderen 0:8d87bc453349 127 struct pbuf *q;
ninoderkinderen 0:8d87bc453349 128
ninoderkinderen 0:8d87bc453349 129 initiate transfer();
ninoderkinderen 0:8d87bc453349 130
ninoderkinderen 0:8d87bc453349 131 #if ETH_PAD_SIZE
ninoderkinderen 0:8d87bc453349 132 pbuf_header(p, -ETH_PAD_SIZE); /* drop the padding word */
ninoderkinderen 0:8d87bc453349 133 #endif
ninoderkinderen 0:8d87bc453349 134
ninoderkinderen 0:8d87bc453349 135 for(q = p; q != NULL; q = q->next) {
ninoderkinderen 0:8d87bc453349 136 /* Send the data from the pbuf to the interface, one pbuf at a
ninoderkinderen 0:8d87bc453349 137 time. The size of the data in each pbuf is kept in the ->len
ninoderkinderen 0:8d87bc453349 138 variable. */
ninoderkinderen 0:8d87bc453349 139 send data from(q->payload, q->len);
ninoderkinderen 0:8d87bc453349 140 }
ninoderkinderen 0:8d87bc453349 141
ninoderkinderen 0:8d87bc453349 142 signal that packet should be sent();
ninoderkinderen 0:8d87bc453349 143
ninoderkinderen 0:8d87bc453349 144 #if ETH_PAD_SIZE
ninoderkinderen 0:8d87bc453349 145 pbuf_header(p, ETH_PAD_SIZE); /* reclaim the padding word */
ninoderkinderen 0:8d87bc453349 146 #endif
ninoderkinderen 0:8d87bc453349 147
ninoderkinderen 0:8d87bc453349 148 LINK_STATS_INC(link.xmit);
ninoderkinderen 0:8d87bc453349 149
ninoderkinderen 0:8d87bc453349 150 return ERR_OK;
ninoderkinderen 0:8d87bc453349 151 }
ninoderkinderen 0:8d87bc453349 152
ninoderkinderen 0:8d87bc453349 153 /**
ninoderkinderen 0:8d87bc453349 154 * Should allocate a pbuf and transfer the bytes of the incoming
ninoderkinderen 0:8d87bc453349 155 * packet from the interface into the pbuf.
ninoderkinderen 0:8d87bc453349 156 *
ninoderkinderen 0:8d87bc453349 157 * @param netif the lwip network interface structure for this ethernetif
ninoderkinderen 0:8d87bc453349 158 * @return a pbuf filled with the received packet (including MAC header)
ninoderkinderen 0:8d87bc453349 159 * NULL on memory error
ninoderkinderen 0:8d87bc453349 160 */
ninoderkinderen 0:8d87bc453349 161 static struct pbuf *
ninoderkinderen 0:8d87bc453349 162 low_level_input(struct netif *netif)
ninoderkinderen 0:8d87bc453349 163 {
ninoderkinderen 0:8d87bc453349 164 struct ethernetif *ethernetif = netif->state;
ninoderkinderen 0:8d87bc453349 165 struct pbuf *p, *q;
ninoderkinderen 0:8d87bc453349 166 u16_t len;
ninoderkinderen 0:8d87bc453349 167
ninoderkinderen 0:8d87bc453349 168 /* Obtain the size of the packet and put it into the "len"
ninoderkinderen 0:8d87bc453349 169 variable. */
ninoderkinderen 0:8d87bc453349 170 len = ;
ninoderkinderen 0:8d87bc453349 171
ninoderkinderen 0:8d87bc453349 172 #if ETH_PAD_SIZE
ninoderkinderen 0:8d87bc453349 173 len += ETH_PAD_SIZE; /* allow room for Ethernet padding */
ninoderkinderen 0:8d87bc453349 174 #endif
ninoderkinderen 0:8d87bc453349 175
ninoderkinderen 0:8d87bc453349 176 /* We allocate a pbuf chain of pbufs from the pool. */
ninoderkinderen 0:8d87bc453349 177 p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
ninoderkinderen 0:8d87bc453349 178
ninoderkinderen 0:8d87bc453349 179 if (p != NULL) {
ninoderkinderen 0:8d87bc453349 180
ninoderkinderen 0:8d87bc453349 181 #if ETH_PAD_SIZE
ninoderkinderen 0:8d87bc453349 182 pbuf_header(p, -ETH_PAD_SIZE); /* drop the padding word */
ninoderkinderen 0:8d87bc453349 183 #endif
ninoderkinderen 0:8d87bc453349 184
ninoderkinderen 0:8d87bc453349 185 /* We iterate over the pbuf chain until we have read the entire
ninoderkinderen 0:8d87bc453349 186 * packet into the pbuf. */
ninoderkinderen 0:8d87bc453349 187 for(q = p; q != NULL; q = q->next) {
ninoderkinderen 0:8d87bc453349 188 /* Read enough bytes to fill this pbuf in the chain. The
ninoderkinderen 0:8d87bc453349 189 * available data in the pbuf is given by the q->len
ninoderkinderen 0:8d87bc453349 190 * variable.
ninoderkinderen 0:8d87bc453349 191 * This does not necessarily have to be a memcpy, you can also preallocate
ninoderkinderen 0:8d87bc453349 192 * pbufs for a DMA-enabled MAC and after receiving truncate it to the
ninoderkinderen 0:8d87bc453349 193 * actually received size. In this case, ensure the tot_len member of the
ninoderkinderen 0:8d87bc453349 194 * pbuf is the sum of the chained pbuf len members.
ninoderkinderen 0:8d87bc453349 195 */
ninoderkinderen 0:8d87bc453349 196 read data into(q->payload, q->len);
ninoderkinderen 0:8d87bc453349 197 }
ninoderkinderen 0:8d87bc453349 198 acknowledge that packet has been read();
ninoderkinderen 0:8d87bc453349 199
ninoderkinderen 0:8d87bc453349 200 #if ETH_PAD_SIZE
ninoderkinderen 0:8d87bc453349 201 pbuf_header(p, ETH_PAD_SIZE); /* reclaim the padding word */
ninoderkinderen 0:8d87bc453349 202 #endif
ninoderkinderen 0:8d87bc453349 203
ninoderkinderen 0:8d87bc453349 204 LINK_STATS_INC(link.recv);
ninoderkinderen 0:8d87bc453349 205 } else {
ninoderkinderen 0:8d87bc453349 206 drop packet();
ninoderkinderen 0:8d87bc453349 207 LINK_STATS_INC(link.memerr);
ninoderkinderen 0:8d87bc453349 208 LINK_STATS_INC(link.drop);
ninoderkinderen 0:8d87bc453349 209 }
ninoderkinderen 0:8d87bc453349 210
ninoderkinderen 0:8d87bc453349 211 return p;
ninoderkinderen 0:8d87bc453349 212 }
ninoderkinderen 0:8d87bc453349 213
ninoderkinderen 0:8d87bc453349 214 /**
ninoderkinderen 0:8d87bc453349 215 * This function should be called when a packet is ready to be read
ninoderkinderen 0:8d87bc453349 216 * from the interface. It uses the function low_level_input() that
ninoderkinderen 0:8d87bc453349 217 * should handle the actual reception of bytes from the network
ninoderkinderen 0:8d87bc453349 218 * interface. Then the type of the received packet is determined and
ninoderkinderen 0:8d87bc453349 219 * the appropriate input function is called.
ninoderkinderen 0:8d87bc453349 220 *
ninoderkinderen 0:8d87bc453349 221 * @param netif the lwip network interface structure for this ethernetif
ninoderkinderen 0:8d87bc453349 222 */
ninoderkinderen 0:8d87bc453349 223 static void
ninoderkinderen 0:8d87bc453349 224 ethernetif_input(struct netif *netif)
ninoderkinderen 0:8d87bc453349 225 {
ninoderkinderen 0:8d87bc453349 226 struct ethernetif *ethernetif;
ninoderkinderen 0:8d87bc453349 227 struct eth_hdr *ethhdr;
ninoderkinderen 0:8d87bc453349 228 struct pbuf *p;
ninoderkinderen 0:8d87bc453349 229
ninoderkinderen 0:8d87bc453349 230 ethernetif = netif->state;
ninoderkinderen 0:8d87bc453349 231
ninoderkinderen 0:8d87bc453349 232 /* move received packet into a new pbuf */
ninoderkinderen 0:8d87bc453349 233 p = low_level_input(netif);
ninoderkinderen 0:8d87bc453349 234 /* no packet could be read, silently ignore this */
ninoderkinderen 0:8d87bc453349 235 if (p == NULL) return;
ninoderkinderen 0:8d87bc453349 236 /* points to packet payload, which starts with an Ethernet header */
ninoderkinderen 0:8d87bc453349 237 ethhdr = p->payload;
ninoderkinderen 0:8d87bc453349 238
ninoderkinderen 0:8d87bc453349 239 switch (htons(ethhdr->type)) {
ninoderkinderen 0:8d87bc453349 240 /* IP or ARP packet? */
ninoderkinderen 0:8d87bc453349 241 case ETHTYPE_IP:
ninoderkinderen 0:8d87bc453349 242 case ETHTYPE_ARP:
ninoderkinderen 0:8d87bc453349 243 #if PPPOE_SUPPORT
ninoderkinderen 0:8d87bc453349 244 /* PPPoE packet? */
ninoderkinderen 0:8d87bc453349 245 case ETHTYPE_PPPOEDISC:
ninoderkinderen 0:8d87bc453349 246 case ETHTYPE_PPPOE:
ninoderkinderen 0:8d87bc453349 247 #endif /* PPPOE_SUPPORT */
ninoderkinderen 0:8d87bc453349 248 /* full packet send to tcpip_thread to process */
ninoderkinderen 0:8d87bc453349 249 if (netif->input(p, netif)!=ERR_OK)
ninoderkinderen 0:8d87bc453349 250 { LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
ninoderkinderen 0:8d87bc453349 251 pbuf_free(p);
ninoderkinderen 0:8d87bc453349 252 p = NULL;
ninoderkinderen 0:8d87bc453349 253 }
ninoderkinderen 0:8d87bc453349 254 break;
ninoderkinderen 0:8d87bc453349 255
ninoderkinderen 0:8d87bc453349 256 default:
ninoderkinderen 0:8d87bc453349 257 pbuf_free(p);
ninoderkinderen 0:8d87bc453349 258 p = NULL;
ninoderkinderen 0:8d87bc453349 259 break;
ninoderkinderen 0:8d87bc453349 260 }
ninoderkinderen 0:8d87bc453349 261 }
ninoderkinderen 0:8d87bc453349 262
ninoderkinderen 0:8d87bc453349 263 /**
ninoderkinderen 0:8d87bc453349 264 * Should be called at the beginning of the program to set up the
ninoderkinderen 0:8d87bc453349 265 * network interface. It calls the function low_level_init() to do the
ninoderkinderen 0:8d87bc453349 266 * actual setup of the hardware.
ninoderkinderen 0:8d87bc453349 267 *
ninoderkinderen 0:8d87bc453349 268 * This function should be passed as a parameter to netif_add().
ninoderkinderen 0:8d87bc453349 269 *
ninoderkinderen 0:8d87bc453349 270 * @param netif the lwip network interface structure for this ethernetif
ninoderkinderen 0:8d87bc453349 271 * @return ERR_OK if the loopif is initialized
ninoderkinderen 0:8d87bc453349 272 * ERR_MEM if private data couldn't be allocated
ninoderkinderen 0:8d87bc453349 273 * any other err_t on error
ninoderkinderen 0:8d87bc453349 274 */
ninoderkinderen 0:8d87bc453349 275 err_t
ninoderkinderen 0:8d87bc453349 276 ethernetif_init(struct netif *netif)
ninoderkinderen 0:8d87bc453349 277 {
ninoderkinderen 0:8d87bc453349 278 struct ethernetif *ethernetif;
ninoderkinderen 0:8d87bc453349 279
ninoderkinderen 0:8d87bc453349 280 LWIP_ASSERT("netif != NULL", (netif != NULL));
ninoderkinderen 0:8d87bc453349 281
ninoderkinderen 0:8d87bc453349 282 ethernetif = mem_malloc(sizeof(struct ethernetif));
ninoderkinderen 0:8d87bc453349 283 if (ethernetif == NULL) {
ninoderkinderen 0:8d87bc453349 284 LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_init: out of memory\n"));
ninoderkinderen 0:8d87bc453349 285 return ERR_MEM;
ninoderkinderen 0:8d87bc453349 286 }
ninoderkinderen 0:8d87bc453349 287
ninoderkinderen 0:8d87bc453349 288 #if LWIP_NETIF_HOSTNAME
ninoderkinderen 0:8d87bc453349 289 /* Initialize interface hostname */
ninoderkinderen 0:8d87bc453349 290 netif->hostname = "lwip";
ninoderkinderen 0:8d87bc453349 291 #endif /* LWIP_NETIF_HOSTNAME */
ninoderkinderen 0:8d87bc453349 292
ninoderkinderen 0:8d87bc453349 293 /*
ninoderkinderen 0:8d87bc453349 294 * Initialize the snmp variables and counters inside the struct netif.
ninoderkinderen 0:8d87bc453349 295 * The last argument should be replaced with your link speed, in units
ninoderkinderen 0:8d87bc453349 296 * of bits per second.
ninoderkinderen 0:8d87bc453349 297 */
ninoderkinderen 0:8d87bc453349 298 NETIF_INIT_SNMP(netif, snmp_ifType_ethernet_csmacd, LINK_SPEED_OF_YOUR_NETIF_IN_BPS);
ninoderkinderen 0:8d87bc453349 299
ninoderkinderen 0:8d87bc453349 300 netif->state = ethernetif;
ninoderkinderen 0:8d87bc453349 301 netif->name[0] = IFNAME0;
ninoderkinderen 0:8d87bc453349 302 netif->name[1] = IFNAME1;
ninoderkinderen 0:8d87bc453349 303 /* We directly use etharp_output() here to save a function call.
ninoderkinderen 0:8d87bc453349 304 * You can instead declare your own function an call etharp_output()
ninoderkinderen 0:8d87bc453349 305 * from it if you have to do some checks before sending (e.g. if link
ninoderkinderen 0:8d87bc453349 306 * is available...) */
ninoderkinderen 0:8d87bc453349 307 netif->output = etharp_output;
ninoderkinderen 0:8d87bc453349 308 netif->linkoutput = low_level_output;
ninoderkinderen 0:8d87bc453349 309
ninoderkinderen 0:8d87bc453349 310 ethernetif->ethaddr = (struct eth_addr *)&(netif->hwaddr[0]);
ninoderkinderen 0:8d87bc453349 311
ninoderkinderen 0:8d87bc453349 312 /* initialize the hardware */
ninoderkinderen 0:8d87bc453349 313 low_level_init(netif);
ninoderkinderen 0:8d87bc453349 314
ninoderkinderen 0:8d87bc453349 315 return ERR_OK;
ninoderkinderen 0:8d87bc453349 316 }
ninoderkinderen 0:8d87bc453349 317
ninoderkinderen 0:8d87bc453349 318 #endif /* 0 */