My fork of the HTTPServer (working)

Dependents:   DGWWebServer LAN2

Committer:
screamer
Date:
Mon Aug 06 09:23:14 2012 +0000
Revision:
0:7a64fbb4069d
[mbed] converted /DGWWebServer/HTTPServer

Who changed what in which revision?

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