This library is stripped down version of NetServices library. HTTP server and client function is NOT supported.

Dependents:   imu-daq-eth

Committer:
idinor
Date:
Wed Jul 20 11:45:39 2011 +0000
Revision:
0:dcf3c92487ca

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
idinor 0:dcf3c92487ca 1
idinor 0:dcf3c92487ca 2 /*
idinor 0:dcf3c92487ca 3 Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
idinor 0:dcf3c92487ca 4
idinor 0:dcf3c92487ca 5 Permission is hereby granted, free of charge, to any person obtaining a copy
idinor 0:dcf3c92487ca 6 of this software and associated documentation files (the "Software"), to deal
idinor 0:dcf3c92487ca 7 in the Software without restriction, including without limitation the rights
idinor 0:dcf3c92487ca 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
idinor 0:dcf3c92487ca 9 copies of the Software, and to permit persons to whom the Software is
idinor 0:dcf3c92487ca 10 furnished to do so, subject to the following conditions:
idinor 0:dcf3c92487ca 11
idinor 0:dcf3c92487ca 12 The above copyright notice and this permission notice shall be included in
idinor 0:dcf3c92487ca 13 all copies or substantial portions of the Software.
idinor 0:dcf3c92487ca 14
idinor 0:dcf3c92487ca 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
idinor 0:dcf3c92487ca 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
idinor 0:dcf3c92487ca 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
idinor 0:dcf3c92487ca 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
idinor 0:dcf3c92487ca 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
idinor 0:dcf3c92487ca 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
idinor 0:dcf3c92487ca 21 THE SOFTWARE.
idinor 0:dcf3c92487ca 22 */
idinor 0:dcf3c92487ca 23
idinor 0:dcf3c92487ca 24 #include "netCfg.h"
idinor 0:dcf3c92487ca 25 #if NET_ETH
idinor 0:dcf3c92487ca 26
idinor 0:dcf3c92487ca 27 #include "mbed.h"
idinor 0:dcf3c92487ca 28
idinor 0:dcf3c92487ca 29 Ethernet *pEth = NULL;
idinor 0:dcf3c92487ca 30 #ifdef __cplusplus
idinor 0:dcf3c92487ca 31 extern "C" {
idinor 0:dcf3c92487ca 32 #endif
idinor 0:dcf3c92487ca 33
idinor 0:dcf3c92487ca 34 #include "lwip/opt.h"
idinor 0:dcf3c92487ca 35
idinor 0:dcf3c92487ca 36 #include "lwip/def.h"
idinor 0:dcf3c92487ca 37 #include "lwip/pbuf.h"
idinor 0:dcf3c92487ca 38 #include "lwip/sys.h"
idinor 0:dcf3c92487ca 39 #include "lwip/stats.h"
idinor 0:dcf3c92487ca 40 #include "netif/etharp.h"
idinor 0:dcf3c92487ca 41 #include "string.h"
idinor 0:dcf3c92487ca 42
idinor 0:dcf3c92487ca 43 //#include "eth_drv.h"
idinor 0:dcf3c92487ca 44
idinor 0:dcf3c92487ca 45 #define IFNAME0 'E'
idinor 0:dcf3c92487ca 46 #define IFNAME1 'X'
idinor 0:dcf3c92487ca 47
idinor 0:dcf3c92487ca 48 #define min(x,y) (((x)<(y))?(x):(y))
idinor 0:dcf3c92487ca 49
idinor 0:dcf3c92487ca 50 struct netif* eth_netif;
idinor 0:dcf3c92487ca 51
idinor 0:dcf3c92487ca 52 static err_t eth_output(struct netif *netif, struct pbuf *p) {
idinor 0:dcf3c92487ca 53 #if ETH_PAD_SIZE
idinor 0:dcf3c92487ca 54 pbuf_header(p, -ETH_PAD_SIZE); /* drop the padding word */
idinor 0:dcf3c92487ca 55 #endif
idinor 0:dcf3c92487ca 56
idinor 0:dcf3c92487ca 57 do {
idinor 0:dcf3c92487ca 58 pEth->write((const char *)p->payload, p->len);
idinor 0:dcf3c92487ca 59 } while((p = p->next)!=NULL);
idinor 0:dcf3c92487ca 60
idinor 0:dcf3c92487ca 61 pEth->send();
idinor 0:dcf3c92487ca 62
idinor 0:dcf3c92487ca 63 #if ETH_PAD_SIZE
idinor 0:dcf3c92487ca 64 pbuf_header(p, ETH_PAD_SIZE); /* reclaim the padding word */
idinor 0:dcf3c92487ca 65 #endif
idinor 0:dcf3c92487ca 66
idinor 0:dcf3c92487ca 67 LINK_STATS_INC(link.xmit);
idinor 0:dcf3c92487ca 68 return ERR_OK;
idinor 0:dcf3c92487ca 69 }
idinor 0:dcf3c92487ca 70
idinor 0:dcf3c92487ca 71 /*
idinor 0:dcf3c92487ca 72 void show(char *buf, int size) {
idinor 0:dcf3c92487ca 73 printf("Destination: %02hx:%02hx:%02hx:%02hx:%02hx:%02hx\n",
idinor 0:dcf3c92487ca 74 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
idinor 0:dcf3c92487ca 75 printf("Source: %02hx:%02hx:%02hx:%02hx:%02hx:%02hx\n",
idinor 0:dcf3c92487ca 76 buf[6], buf[7], buf[8], buf[9], buf[10], buf[11]);
idinor 0:dcf3c92487ca 77
idinor 0:dcf3c92487ca 78 printf("Type %hd\n", htons((short)buf[12]));
idinor 0:dcf3c92487ca 79
idinor 0:dcf3c92487ca 80 // hexview(buf, size);
idinor 0:dcf3c92487ca 81 }
idinor 0:dcf3c92487ca 82 */
idinor 0:dcf3c92487ca 83
idinor 0:dcf3c92487ca 84 void eth_poll() {
idinor 0:dcf3c92487ca 85 struct eth_hdr *ethhdr;
idinor 0:dcf3c92487ca 86 struct pbuf *frame, *p;
idinor 0:dcf3c92487ca 87 int len, read;
idinor 0:dcf3c92487ca 88
idinor 0:dcf3c92487ca 89 while((len = pEth->receive()) != 0) {
idinor 0:dcf3c92487ca 90 frame = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
idinor 0:dcf3c92487ca 91 if(frame == NULL) {
idinor 0:dcf3c92487ca 92 return;
idinor 0:dcf3c92487ca 93 }
idinor 0:dcf3c92487ca 94 p = frame;
idinor 0:dcf3c92487ca 95 /* no packet could be read, silently ignore this */
idinor 0:dcf3c92487ca 96 if (p == NULL) return;
idinor 0:dcf3c92487ca 97 do {
idinor 0:dcf3c92487ca 98 read = pEth->read((char *)p->payload, p->len);
idinor 0:dcf3c92487ca 99 p = p->next;
idinor 0:dcf3c92487ca 100 } while(p != NULL && read != 0);
idinor 0:dcf3c92487ca 101
idinor 0:dcf3c92487ca 102 #if ETH_PAD_SIZE
idinor 0:dcf3c92487ca 103 pbuf_header(p, ETH_PAD_SIZE);
idinor 0:dcf3c92487ca 104 #endif
idinor 0:dcf3c92487ca 105
idinor 0:dcf3c92487ca 106 ethhdr = (struct eth_hdr *)(frame->payload);
idinor 0:dcf3c92487ca 107
idinor 0:dcf3c92487ca 108 // show((char*)ethhdr, 13);
idinor 0:dcf3c92487ca 109
idinor 0:dcf3c92487ca 110 /*
idinor 0:dcf3c92487ca 111 switch(htons(ethhdr->type)) {
idinor 0:dcf3c92487ca 112
idinor 0:dcf3c92487ca 113 case ETHTYPE_IP:
idinor 0:dcf3c92487ca 114 etharp_ip_input(gnetif, frame);
idinor 0:dcf3c92487ca 115 pbuf_header(frame, -((s16_t) sizeof(struct eth_hdr)));
idinor 0:dcf3c92487ca 116 gnetif->input(frame, gnetif);
idinor 0:dcf3c92487ca 117 break;
idinor 0:dcf3c92487ca 118
idinor 0:dcf3c92487ca 119 case ETHTYPE_ARP:
idinor 0:dcf3c92487ca 120 etharp_arp_input(gnetif, (struct eth_addr *)(gnetif->hwaddr), frame);
idinor 0:dcf3c92487ca 121 break;
idinor 0:dcf3c92487ca 122
idinor 0:dcf3c92487ca 123 default:
idinor 0:dcf3c92487ca 124 break;
idinor 0:dcf3c92487ca 125 }*/
idinor 0:dcf3c92487ca 126
idinor 0:dcf3c92487ca 127
idinor 0:dcf3c92487ca 128
idinor 0:dcf3c92487ca 129 //ethernet_input(frame, gnetif);
idinor 0:dcf3c92487ca 130
idinor 0:dcf3c92487ca 131 switch (htons(ethhdr->type)) {
idinor 0:dcf3c92487ca 132 /* IP or ARP packet? */
idinor 0:dcf3c92487ca 133 case ETHTYPE_IP:
idinor 0:dcf3c92487ca 134 case ETHTYPE_ARP:
idinor 0:dcf3c92487ca 135 #if PPPOE_SUPPORT
idinor 0:dcf3c92487ca 136 /* PPPoE packet? */
idinor 0:dcf3c92487ca 137 case ETHTYPE_PPPOEDISC:
idinor 0:dcf3c92487ca 138 case ETHTYPE_PPPOE:
idinor 0:dcf3c92487ca 139 #endif /* PPPOE_SUPPORT */
idinor 0:dcf3c92487ca 140 /* full packet send to tcpip_thread to process */
idinor 0:dcf3c92487ca 141 //if (netif->input(p, gnetif)!=ERR_OK)
idinor 0:dcf3c92487ca 142 if (ethernet_input(frame, eth_netif)!=ERR_OK)
idinor 0:dcf3c92487ca 143 { LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
idinor 0:dcf3c92487ca 144 pbuf_free(frame);
idinor 0:dcf3c92487ca 145 frame = NULL;
idinor 0:dcf3c92487ca 146 }
idinor 0:dcf3c92487ca 147 break;
idinor 0:dcf3c92487ca 148
idinor 0:dcf3c92487ca 149 default:
idinor 0:dcf3c92487ca 150 pbuf_free(frame);
idinor 0:dcf3c92487ca 151 frame = NULL;
idinor 0:dcf3c92487ca 152 break;
idinor 0:dcf3c92487ca 153 }
idinor 0:dcf3c92487ca 154
idinor 0:dcf3c92487ca 155 /* pbuf_free(frame); */
idinor 0:dcf3c92487ca 156 }
idinor 0:dcf3c92487ca 157
idinor 0:dcf3c92487ca 158
idinor 0:dcf3c92487ca 159
idinor 0:dcf3c92487ca 160
idinor 0:dcf3c92487ca 161 }
idinor 0:dcf3c92487ca 162
idinor 0:dcf3c92487ca 163 err_t eth_init(struct netif *netif) {
idinor 0:dcf3c92487ca 164 LWIP_ASSERT("netif != NULL", (netif != NULL));
idinor 0:dcf3c92487ca 165
idinor 0:dcf3c92487ca 166 NETIF_INIT_SNMP(netif, snmp_ifType_ethernet_csmacd, 0x2EA);
idinor 0:dcf3c92487ca 167
idinor 0:dcf3c92487ca 168 /* maximum transfer unit */
idinor 0:dcf3c92487ca 169 netif->mtu = 0x2EA;
idinor 0:dcf3c92487ca 170
idinor 0:dcf3c92487ca 171 /* device capabilities */
idinor 0:dcf3c92487ca 172 /* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */
idinor 0:dcf3c92487ca 173 netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP | NETIF_FLAG_IGMP;
idinor 0:dcf3c92487ca 174
idinor 0:dcf3c92487ca 175 netif->state = NULL;
idinor 0:dcf3c92487ca 176 eth_netif = netif;
idinor 0:dcf3c92487ca 177
idinor 0:dcf3c92487ca 178 netif->name[0] = IFNAME0;
idinor 0:dcf3c92487ca 179 netif->name[1] = IFNAME1;
idinor 0:dcf3c92487ca 180
idinor 0:dcf3c92487ca 181 /* We directly use etharp_output() here to save a function call.
idinor 0:dcf3c92487ca 182 * You can instead declare your own function an call etharp_output()
idinor 0:dcf3c92487ca 183 * from it if you have to do some checks before sending (e.g. if link
idinor 0:dcf3c92487ca 184 * is available...) */
idinor 0:dcf3c92487ca 185 netif->output = etharp_output;
idinor 0:dcf3c92487ca 186 netif->linkoutput = eth_output;
idinor 0:dcf3c92487ca 187
idinor 0:dcf3c92487ca 188 if (!pEth) pEth = new Ethernet(); // only create Ethernet object if required
idinor 0:dcf3c92487ca 189
idinor 0:dcf3c92487ca 190 return ERR_OK;
idinor 0:dcf3c92487ca 191 }
idinor 0:dcf3c92487ca 192
idinor 0:dcf3c92487ca 193 void eth_free()
idinor 0:dcf3c92487ca 194 {
idinor 0:dcf3c92487ca 195 if(pEth)
idinor 0:dcf3c92487ca 196 delete pEth;
idinor 0:dcf3c92487ca 197 pEth = NULL;
idinor 0:dcf3c92487ca 198 }
idinor 0:dcf3c92487ca 199
idinor 0:dcf3c92487ca 200 void eth_address(char* mac) {
idinor 0:dcf3c92487ca 201 pEth->address(mac);
idinor 0:dcf3c92487ca 202 }
idinor 0:dcf3c92487ca 203
idinor 0:dcf3c92487ca 204 Ethernet* eth_interface() {
idinor 0:dcf3c92487ca 205 return pEth;
idinor 0:dcf3c92487ca 206 }
idinor 0:dcf3c92487ca 207
idinor 0:dcf3c92487ca 208 #ifdef __cplusplus
idinor 0:dcf3c92487ca 209 };
idinor 0:dcf3c92487ca 210 #endif
idinor 0:dcf3c92487ca 211
idinor 0:dcf3c92487ca 212 #endif