LRSD stephane / Mbed 2 deprecated WEBserverv3

Dependencies:   mbed

Committer:
geiineuville
Date:
Thu Sep 08 08:57:21 2011 +0000
Revision:
0:9cf1d79ebe04
v0 v1 v2   \"v3\"

Who changed what in which revision?

UserRevisionLine numberNew contents of line
geiineuville 0:9cf1d79ebe04 1 #include "mbed.h"
geiineuville 0:9cf1d79ebe04 2
geiineuville 0:9cf1d79ebe04 3 using namespace mbed;
geiineuville 0:9cf1d79ebe04 4
geiineuville 0:9cf1d79ebe04 5 Ethernet *eth;
geiineuville 0:9cf1d79ebe04 6 #ifdef __cplusplus
geiineuville 0:9cf1d79ebe04 7 extern "C" {
geiineuville 0:9cf1d79ebe04 8 #endif
geiineuville 0:9cf1d79ebe04 9
geiineuville 0:9cf1d79ebe04 10 #include "lwip/opt.h"
geiineuville 0:9cf1d79ebe04 11
geiineuville 0:9cf1d79ebe04 12 #include "lwip/def.h"
geiineuville 0:9cf1d79ebe04 13 #include "lwip/pbuf.h"
geiineuville 0:9cf1d79ebe04 14 #include "lwip/sys.h"
geiineuville 0:9cf1d79ebe04 15 #include "lwip/stats.h"
geiineuville 0:9cf1d79ebe04 16 #include "netif/etharp.h"
geiineuville 0:9cf1d79ebe04 17 #include "string.h"
geiineuville 0:9cf1d79ebe04 18
geiineuville 0:9cf1d79ebe04 19 #define IFNAME0 'E'
geiineuville 0:9cf1d79ebe04 20 #define IFNAME1 'X'
geiineuville 0:9cf1d79ebe04 21
geiineuville 0:9cf1d79ebe04 22 #define min(x,y) (((x)<(y))?(x):(y))
geiineuville 0:9cf1d79ebe04 23
geiineuville 0:9cf1d79ebe04 24 struct netif *gnetif;
geiineuville 0:9cf1d79ebe04 25
geiineuville 0:9cf1d79ebe04 26 static err_t device_output(struct netif *netif, struct pbuf *p) {
geiineuville 0:9cf1d79ebe04 27 #if ETH_PAD_SIZE
geiineuville 0:9cf1d79ebe04 28 pbuf_header(p, -ETH_PAD_SIZE); /* drop the padding word */
geiineuville 0:9cf1d79ebe04 29 #endif
geiineuville 0:9cf1d79ebe04 30
geiineuville 0:9cf1d79ebe04 31 do {
geiineuville 0:9cf1d79ebe04 32 eth->write((const char *)p->payload, p->len);
geiineuville 0:9cf1d79ebe04 33 } while((p = p->next)!=NULL);
geiineuville 0:9cf1d79ebe04 34
geiineuville 0:9cf1d79ebe04 35 eth->send();
geiineuville 0:9cf1d79ebe04 36
geiineuville 0:9cf1d79ebe04 37 #if ETH_PAD_SIZE
geiineuville 0:9cf1d79ebe04 38 pbuf_header(p, ETH_PAD_SIZE); /* reclaim the padding word */
geiineuville 0:9cf1d79ebe04 39 #endif
geiineuville 0:9cf1d79ebe04 40
geiineuville 0:9cf1d79ebe04 41 LINK_STATS_INC(link.xmit);
geiineuville 0:9cf1d79ebe04 42 return ERR_OK;
geiineuville 0:9cf1d79ebe04 43 }
geiineuville 0:9cf1d79ebe04 44
geiineuville 0:9cf1d79ebe04 45 void device_poll() {
geiineuville 0:9cf1d79ebe04 46 struct eth_hdr *ethhdr;
geiineuville 0:9cf1d79ebe04 47 struct pbuf *frame, *p;
geiineuville 0:9cf1d79ebe04 48 int len, read;
geiineuville 0:9cf1d79ebe04 49
geiineuville 0:9cf1d79ebe04 50 while((len = eth->receive()) != 0) {
geiineuville 0:9cf1d79ebe04 51 frame = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
geiineuville 0:9cf1d79ebe04 52 if(frame == NULL) {
geiineuville 0:9cf1d79ebe04 53 return;
geiineuville 0:9cf1d79ebe04 54 }
geiineuville 0:9cf1d79ebe04 55 p = frame;
geiineuville 0:9cf1d79ebe04 56 do {
geiineuville 0:9cf1d79ebe04 57 read = eth->read((char *)p->payload, p->len);
geiineuville 0:9cf1d79ebe04 58 p = p->next;
geiineuville 0:9cf1d79ebe04 59 } while(p != NULL && read != 0);
geiineuville 0:9cf1d79ebe04 60
geiineuville 0:9cf1d79ebe04 61 #if ETH_PAD_SIZE
geiineuville 0:9cf1d79ebe04 62 pbuf_header(p, ETH_PAD_SIZE);
geiineuville 0:9cf1d79ebe04 63 #endif
geiineuville 0:9cf1d79ebe04 64
geiineuville 0:9cf1d79ebe04 65 ethhdr = (struct eth_hdr *)(frame->payload);
geiineuville 0:9cf1d79ebe04 66
geiineuville 0:9cf1d79ebe04 67 switch(htons(ethhdr->type)) {
geiineuville 0:9cf1d79ebe04 68
geiineuville 0:9cf1d79ebe04 69 case ETHTYPE_IP:
geiineuville 0:9cf1d79ebe04 70 etharp_ip_input(gnetif, frame);
geiineuville 0:9cf1d79ebe04 71 pbuf_header(frame, -((s16_t) sizeof(struct eth_hdr)));
geiineuville 0:9cf1d79ebe04 72 gnetif->input(frame, gnetif);
geiineuville 0:9cf1d79ebe04 73 break;
geiineuville 0:9cf1d79ebe04 74
geiineuville 0:9cf1d79ebe04 75 case ETHTYPE_ARP:
geiineuville 0:9cf1d79ebe04 76 etharp_arp_input(gnetif, (struct eth_addr *)(gnetif->hwaddr), frame);
geiineuville 0:9cf1d79ebe04 77 break;
geiineuville 0:9cf1d79ebe04 78
geiineuville 0:9cf1d79ebe04 79 default:
geiineuville 0:9cf1d79ebe04 80 break;
geiineuville 0:9cf1d79ebe04 81 }
geiineuville 0:9cf1d79ebe04 82 pbuf_free(frame);
geiineuville 0:9cf1d79ebe04 83 }
geiineuville 0:9cf1d79ebe04 84 }
geiineuville 0:9cf1d79ebe04 85
geiineuville 0:9cf1d79ebe04 86 err_t device_init(struct netif *netif) {
geiineuville 0:9cf1d79ebe04 87 LWIP_ASSERT("netif != NULL", (netif != NULL));
geiineuville 0:9cf1d79ebe04 88
geiineuville 0:9cf1d79ebe04 89 NETIF_INIT_SNMP(netif, snmp_ifType_ethernet_csmacd, 0x2EA);
geiineuville 0:9cf1d79ebe04 90
geiineuville 0:9cf1d79ebe04 91 /* maximum transfer unit */
geiineuville 0:9cf1d79ebe04 92 netif->mtu = 0x2EA;
geiineuville 0:9cf1d79ebe04 93
geiineuville 0:9cf1d79ebe04 94 /* device capabilities */
geiineuville 0:9cf1d79ebe04 95 /* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */
geiineuville 0:9cf1d79ebe04 96 netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP;
geiineuville 0:9cf1d79ebe04 97
geiineuville 0:9cf1d79ebe04 98 netif->state = NULL;
geiineuville 0:9cf1d79ebe04 99 gnetif = netif;
geiineuville 0:9cf1d79ebe04 100
geiineuville 0:9cf1d79ebe04 101 netif->name[0] = IFNAME0;
geiineuville 0:9cf1d79ebe04 102 netif->name[1] = IFNAME1;
geiineuville 0:9cf1d79ebe04 103
geiineuville 0:9cf1d79ebe04 104 /* We directly use etharp_output() here to save a function call.
geiineuville 0:9cf1d79ebe04 105 * You can instead declare your own function an call etharp_output()
geiineuville 0:9cf1d79ebe04 106 * from it if you have to do some checks before sending (e.g. if link
geiineuville 0:9cf1d79ebe04 107 * is available...) */
geiineuville 0:9cf1d79ebe04 108 netif->output = etharp_output;
geiineuville 0:9cf1d79ebe04 109 netif->linkoutput = device_output;
geiineuville 0:9cf1d79ebe04 110
geiineuville 0:9cf1d79ebe04 111 eth = new Ethernet();
geiineuville 0:9cf1d79ebe04 112
geiineuville 0:9cf1d79ebe04 113 return ERR_OK;
geiineuville 0:9cf1d79ebe04 114 }
geiineuville 0:9cf1d79ebe04 115
geiineuville 0:9cf1d79ebe04 116 void device_address(char *mac) {
geiineuville 0:9cf1d79ebe04 117 eth->address(mac);
geiineuville 0:9cf1d79ebe04 118 }
geiineuville 0:9cf1d79ebe04 119
geiineuville 0:9cf1d79ebe04 120 #ifdef __cplusplus
geiineuville 0:9cf1d79ebe04 121 };
geiineuville 0:9cf1d79ebe04 122 #endif