John Lowe
/
WebSockets2
Embedded WebSockets Experiment
Core/NetServer.cpp@0:6dee052a3fa4, 2011-07-26 (annotated)
- Committer:
- nandgate
- Date:
- Tue Jul 26 05:30:53 2011 +0000
- Revision:
- 0:6dee052a3fa4
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nandgate | 0:6dee052a3fa4 | 1 | #include "lwip/opt.h" |
nandgate | 0:6dee052a3fa4 | 2 | #include "lwip/stats.h" |
nandgate | 0:6dee052a3fa4 | 3 | #include "lwip/sys.h" |
nandgate | 0:6dee052a3fa4 | 4 | #include "lwip/pbuf.h" |
nandgate | 0:6dee052a3fa4 | 5 | #include "lwip/udp.h" |
nandgate | 0:6dee052a3fa4 | 6 | #include "lwip/tcp.h" |
nandgate | 0:6dee052a3fa4 | 7 | #include "lwip/dns.h" |
nandgate | 0:6dee052a3fa4 | 8 | #include "lwip/dhcp.h" |
nandgate | 0:6dee052a3fa4 | 9 | #include "lwip/init.h" |
nandgate | 0:6dee052a3fa4 | 10 | #include "lwip/netif.h" |
nandgate | 0:6dee052a3fa4 | 11 | #include "netif/etharp.h" |
nandgate | 0:6dee052a3fa4 | 12 | #include "netif/loopif.h" |
nandgate | 0:6dee052a3fa4 | 13 | #include "device.h" |
nandgate | 0:6dee052a3fa4 | 14 | #include "Ethernet.h" |
nandgate | 0:6dee052a3fa4 | 15 | |
nandgate | 0:6dee052a3fa4 | 16 | #include "NetServer.h" |
nandgate | 0:6dee052a3fa4 | 17 | #include "TCPListener.h" |
nandgate | 0:6dee052a3fa4 | 18 | #include "TCPCallbackListener.h" |
nandgate | 0:6dee052a3fa4 | 19 | #include "TCPConnection.h" |
nandgate | 0:6dee052a3fa4 | 20 | |
nandgate | 0:6dee052a3fa4 | 21 | using namespace std; |
nandgate | 0:6dee052a3fa4 | 22 | using namespace mbed; |
nandgate | 0:6dee052a3fa4 | 23 | |
nandgate | 0:6dee052a3fa4 | 24 | NetServer *NetServer::singleton = NULL; |
nandgate | 0:6dee052a3fa4 | 25 | |
nandgate | 0:6dee052a3fa4 | 26 | NetServer::NetServer() : netif(&netif_data), dhcp(true), hostname(HOSTNAME) { |
nandgate | 0:6dee052a3fa4 | 27 | _time.start(); |
nandgate | 0:6dee052a3fa4 | 28 | IP4_ADDR(&netmask, 255,255,255,255); |
nandgate | 0:6dee052a3fa4 | 29 | IP4_ADDR(&gateway, 0,0,0,0); |
nandgate | 0:6dee052a3fa4 | 30 | IP4_ADDR(&ipaddr, 0,0,0,0); |
nandgate | 0:6dee052a3fa4 | 31 | netif->hwaddr_len = 0; |
nandgate | 0:6dee052a3fa4 | 32 | del = new list<TCPItem *>(); |
nandgate | 0:6dee052a3fa4 | 33 | } |
nandgate | 0:6dee052a3fa4 | 34 | |
nandgate | 0:6dee052a3fa4 | 35 | NetServer::NetServer(struct ip_addr ip, struct ip_addr nm, struct ip_addr gw) |
nandgate | 0:6dee052a3fa4 | 36 | : netif(&netif_data), ipaddr(ip), netmask(nm), gateway(gw), dhcp(false), hostname(HOSTNAME) { |
nandgate | 0:6dee052a3fa4 | 37 | _time.start(); |
nandgate | 0:6dee052a3fa4 | 38 | netif->hwaddr_len = 0; |
nandgate | 0:6dee052a3fa4 | 39 | del = new list<TCPItem *>(); |
nandgate | 0:6dee052a3fa4 | 40 | } |
nandgate | 0:6dee052a3fa4 | 41 | |
nandgate | 0:6dee052a3fa4 | 42 | NetServer::~NetServer() { |
nandgate | 0:6dee052a3fa4 | 43 | |
nandgate | 0:6dee052a3fa4 | 44 | } |
nandgate | 0:6dee052a3fa4 | 45 | |
nandgate | 0:6dee052a3fa4 | 46 | void NetServer::_poll() const { |
nandgate | 0:6dee052a3fa4 | 47 | while(!del->empty()) { |
nandgate | 0:6dee052a3fa4 | 48 | TCPItem *item = del->front(); |
nandgate | 0:6dee052a3fa4 | 49 | del->pop_front(); |
nandgate | 0:6dee052a3fa4 | 50 | delete item; |
nandgate | 0:6dee052a3fa4 | 51 | } |
nandgate | 0:6dee052a3fa4 | 52 | device_poll(); |
nandgate | 0:6dee052a3fa4 | 53 | tcp_tmr(); |
nandgate | 0:6dee052a3fa4 | 54 | } |
nandgate | 0:6dee052a3fa4 | 55 | |
nandgate | 0:6dee052a3fa4 | 56 | void NetServer::init() { |
nandgate | 0:6dee052a3fa4 | 57 | lwip_init(); |
nandgate | 0:6dee052a3fa4 | 58 | |
nandgate | 0:6dee052a3fa4 | 59 | netif->hwaddr_len = ETHARP_HWADDR_LEN; |
nandgate | 0:6dee052a3fa4 | 60 | device_address((char *)netif->hwaddr); |
nandgate | 0:6dee052a3fa4 | 61 | |
nandgate | 0:6dee052a3fa4 | 62 | netif = netif_add(netif, &ipaddr, &netmask, &gateway, NULL, device_init, ip_input); |
nandgate | 0:6dee052a3fa4 | 63 | netif->hostname = (char *)this->hostname; |
nandgate | 0:6dee052a3fa4 | 64 | netif_set_default(netif); |
nandgate | 0:6dee052a3fa4 | 65 | if(!dhcp) { |
nandgate | 0:6dee052a3fa4 | 66 | netif_set_up(netif); |
nandgate | 0:6dee052a3fa4 | 67 | } else { |
nandgate | 0:6dee052a3fa4 | 68 | dhcp_start(netif); |
nandgate | 0:6dee052a3fa4 | 69 | } |
nandgate | 0:6dee052a3fa4 | 70 | |
nandgate | 0:6dee052a3fa4 | 71 | tickARP.attach_us( ðarp_tmr, ARP_TMR_INTERVAL * 1000); |
nandgate | 0:6dee052a3fa4 | 72 | //eth_tick.attach_us<NetServer>(this,&emac_tmr, TCP_FAST_INTERVAL * 1000); |
nandgate | 0:6dee052a3fa4 | 73 | dns_tick.attach_us(&dns_tmr, DNS_TMR_INTERVAL * 1000); |
nandgate | 0:6dee052a3fa4 | 74 | if(dhcp) { |
nandgate | 0:6dee052a3fa4 | 75 | dhcp_coarse.attach_us(&dhcp_coarse_tmr, DHCP_COARSE_TIMER_MSECS * 1000); |
nandgate | 0:6dee052a3fa4 | 76 | dhcp_fine.attach_us(&dhcp_fine_tmr, DHCP_FINE_TIMER_MSECS * 1000); |
nandgate | 0:6dee052a3fa4 | 77 | } |
nandgate | 0:6dee052a3fa4 | 78 | } |
nandgate | 0:6dee052a3fa4 | 79 | |
nandgate | 0:6dee052a3fa4 | 80 | void NetServer::setUp() const { |
nandgate | 0:6dee052a3fa4 | 81 | netif_set_up(netif); |
nandgate | 0:6dee052a3fa4 | 82 | } |
nandgate | 0:6dee052a3fa4 | 83 | |
nandgate | 0:6dee052a3fa4 | 84 | void NetServer::setDown() const { |
nandgate | 0:6dee052a3fa4 | 85 | netif_set_down(netif); |
nandgate | 0:6dee052a3fa4 | 86 | } |
nandgate | 0:6dee052a3fa4 | 87 | |
nandgate | 0:6dee052a3fa4 | 88 | int NetServer::isUp() const { |
nandgate | 0:6dee052a3fa4 | 89 | return netif_is_up(netif); |
nandgate | 0:6dee052a3fa4 | 90 | } |
nandgate | 0:6dee052a3fa4 | 91 | |
nandgate | 0:6dee052a3fa4 | 92 | void NetServer::waitUntilReady() { |
nandgate | 0:6dee052a3fa4 | 93 | while(!netif_is_up(netif)) { |
nandgate | 0:6dee052a3fa4 | 94 | _poll(); |
nandgate | 0:6dee052a3fa4 | 95 | wait_ms(1); |
nandgate | 0:6dee052a3fa4 | 96 | } |
nandgate | 0:6dee052a3fa4 | 97 | ipaddr = netif->ip_addr; |
nandgate | 0:6dee052a3fa4 | 98 | printf("IP: %hhu.%hhu.%hhu.%hhu\n", (ipaddr.addr)&0xFF, (ipaddr.addr>>8)&0xFF, (ipaddr.addr>>16)&0xFF, (ipaddr.addr>>24)&0xFF); |
nandgate | 0:6dee052a3fa4 | 99 | } |
nandgate | 0:6dee052a3fa4 | 100 | |
nandgate | 0:6dee052a3fa4 | 101 | TCPCallbackListener *NetServer::bindTCPPort(u16_t port, err_t (*accept)(TCPCallbackListener *, struct tcp_pcb *, err_t)) const { |
nandgate | 0:6dee052a3fa4 | 102 | TCPCallbackListener *listener = new TCPCallbackListener(port, accept); |
nandgate | 0:6dee052a3fa4 | 103 | listener->bind(); |
nandgate | 0:6dee052a3fa4 | 104 | return listener; |
nandgate | 0:6dee052a3fa4 | 105 | } |
nandgate | 0:6dee052a3fa4 | 106 | |
nandgate | 0:6dee052a3fa4 | 107 | void NetServer::free(TCPItem *item) const { |
nandgate | 0:6dee052a3fa4 | 108 | del->push_back(item); |
nandgate | 0:6dee052a3fa4 | 109 | } |
nandgate | 0:6dee052a3fa4 | 110 | |
nandgate | 0:6dee052a3fa4 | 111 | int NetServer::time() { |
nandgate | 0:6dee052a3fa4 | 112 | return NetServer::get()->_time.read_ms(); |
nandgate | 0:6dee052a3fa4 | 113 | } |