Example of HTTPServer with additional features: * SNTPClient, DST rules * Link status indication * Local or SDCard-based WebServer * RPC-able class * Static and Dynamic HTML page

Dependencies:   mbed

Committer:
iva2k
Date:
Tue Jan 12 07:41:55 2010 +0000
Revision:
2:360fda42fefd
Parent:
0:886e4b3119ad

        

Who changed what in which revision?

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