Embedded WebSockets Experiment

Dependencies:   mbed MD5

Committer:
nandgate
Date:
Tue Jul 26 05:30:53 2011 +0000
Revision:
0:6dee052a3fa4

        

Who changed what in which revision?

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