Brandon Fictorie / Mbed 2 deprecated BF_Websocket

Dependencies:   mbed

Committer:
bfictorie
Date:
Sun Mar 25 17:26:30 2012 +0000
Revision:
0:8cdad1c73e8e

        

Who changed what in which revision?

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