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 #ifndef NETSERVER_H
nandgate 0:6dee052a3fa4 2 #define NETSERVER_H
nandgate 0:6dee052a3fa4 3
nandgate 0:6dee052a3fa4 4 #include "ipv4/lwip/ip_addr.h"
nandgate 0:6dee052a3fa4 5 #include "lwip/netif.h"
nandgate 0:6dee052a3fa4 6 #include "netif/etharp.h"
nandgate 0:6dee052a3fa4 7 #include "iputil.h"
nandgate 0:6dee052a3fa4 8 #include "dns.h"
nandgate 0:6dee052a3fa4 9 #include "mbed.h"
nandgate 0:6dee052a3fa4 10
nandgate 0:6dee052a3fa4 11 #include <list>
nandgate 0:6dee052a3fa4 12
nandgate 0:6dee052a3fa4 13 namespace mbed {
nandgate 0:6dee052a3fa4 14 class TCPItem;
nandgate 0:6dee052a3fa4 15 class TCPListener;
nandgate 0:6dee052a3fa4 16 class TCPCallbackListener;
nandgate 0:6dee052a3fa4 17 class TCPConnection;
nandgate 0:6dee052a3fa4 18
nandgate 0:6dee052a3fa4 19 /**
nandgate 0:6dee052a3fa4 20 * Network main class
nandgate 0:6dee052a3fa4 21 * provides the basic network features.
nandgate 0:6dee052a3fa4 22 */
nandgate 0:6dee052a3fa4 23 class NetServer {
nandgate 0:6dee052a3fa4 24 public:
nandgate 0:6dee052a3fa4 25 /**
nandgate 0:6dee052a3fa4 26 * Returns you the NetServer instance.
nandgate 0:6dee052a3fa4 27 * If there is no object it will create a new one.
nandgate 0:6dee052a3fa4 28 * But it will not initialise it.
nandgate 0:6dee052a3fa4 29 * Configure the object for DHCP.
nandgate 0:6dee052a3fa4 30 */
nandgate 0:6dee052a3fa4 31 static NetServer *create() {
nandgate 0:6dee052a3fa4 32 if(!NetServer::singleton) {
nandgate 0:6dee052a3fa4 33 NetServer::singleton = new NetServer();
nandgate 0:6dee052a3fa4 34 }
nandgate 0:6dee052a3fa4 35 return NetServer::singleton;
nandgate 0:6dee052a3fa4 36 }
nandgate 0:6dee052a3fa4 37
nandgate 0:6dee052a3fa4 38 /**
nandgate 0:6dee052a3fa4 39 * Returns you the NetServer instance.
nandgate 0:6dee052a3fa4 40 * If there is no object it will create a new one.
nandgate 0:6dee052a3fa4 41 * But it will not initialise it.
nandgate 0:6dee052a3fa4 42 * You have to insert ipaddres, netmask and gateway.
nandgate 0:6dee052a3fa4 43 */
nandgate 0:6dee052a3fa4 44 inline static NetServer *create(const struct ip_addr &ip, const struct ip_addr &netmask, const struct ip_addr &gateway) {
nandgate 0:6dee052a3fa4 45 if(!NetServer::singleton) {
nandgate 0:6dee052a3fa4 46 NetServer::singleton = new NetServer(ip, netmask, gateway);
nandgate 0:6dee052a3fa4 47 }
nandgate 0:6dee052a3fa4 48 return NetServer::singleton;
nandgate 0:6dee052a3fa4 49 }
nandgate 0:6dee052a3fa4 50
nandgate 0:6dee052a3fa4 51 /**
nandgate 0:6dee052a3fa4 52 * Returns you the NetServer instance.
nandgate 0:6dee052a3fa4 53 * If there is no object it will create a new one
nandgate 0:6dee052a3fa4 54 * and it will initialise it.
nandgate 0:6dee052a3fa4 55 * A new created object will ever use DHCP and the default MAC address
nandgate 0:6dee052a3fa4 56 * and default hostname.
nandgate 0:6dee052a3fa4 57 */
nandgate 0:6dee052a3fa4 58 inline static NetServer *ready() {
nandgate 0:6dee052a3fa4 59 if(!NetServer::singleton) {
nandgate 0:6dee052a3fa4 60 NetServer::singleton = new NetServer();
nandgate 0:6dee052a3fa4 61 }
nandgate 0:6dee052a3fa4 62 if(!NetServer::singleton->netif->hwaddr_len) {
nandgate 0:6dee052a3fa4 63 NetServer::singleton->init();
nandgate 0:6dee052a3fa4 64 NetServer::singleton->waitUntilReady();
nandgate 0:6dee052a3fa4 65 }
nandgate 0:6dee052a3fa4 66 return NetServer::singleton;
nandgate 0:6dee052a3fa4 67 }
nandgate 0:6dee052a3fa4 68
nandgate 0:6dee052a3fa4 69 /**
nandgate 0:6dee052a3fa4 70 * Returns you the NetServer instance.
nandgate 0:6dee052a3fa4 71 * Even if there is no one created.
nandgate 0:6dee052a3fa4 72 * That means use with care and in combination with NetServer::ready().
nandgate 0:6dee052a3fa4 73 * It is mutch quicker than NetServer::ready().
nandgate 0:6dee052a3fa4 74 * First call one time NetServer::ready() and then NetServer::get()
nandgate 0:6dee052a3fa4 75 * and you are save.
nandgate 0:6dee052a3fa4 76 */
nandgate 0:6dee052a3fa4 77 inline static NetServer *get() {
nandgate 0:6dee052a3fa4 78 return NetServer::singleton;
nandgate 0:6dee052a3fa4 79 }
nandgate 0:6dee052a3fa4 80
nandgate 0:6dee052a3fa4 81 /**
nandgate 0:6dee052a3fa4 82 * Polls one time on the NetServer and all registert Interfaces.
nandgate 0:6dee052a3fa4 83 * Even if there is no one created.
nandgate 0:6dee052a3fa4 84 * That means use with care and in combination with NetServer::ready().
nandgate 0:6dee052a3fa4 85 * It is mutch faster than NetServer::ready()->_poll().
nandgate 0:6dee052a3fa4 86 * First call one time NetServer::ready() and then NetServer::poll()
nandgate 0:6dee052a3fa4 87 * and you are save.
nandgate 0:6dee052a3fa4 88 */
nandgate 0:6dee052a3fa4 89 inline static void poll() {
nandgate 0:6dee052a3fa4 90 singleton->_poll();
nandgate 0:6dee052a3fa4 91 }
nandgate 0:6dee052a3fa4 92
nandgate 0:6dee052a3fa4 93 /**
nandgate 0:6dee052a3fa4 94 * Default destructor.
nandgate 0:6dee052a3fa4 95 */
nandgate 0:6dee052a3fa4 96 ~NetServer();
nandgate 0:6dee052a3fa4 97
nandgate 0:6dee052a3fa4 98 /**
nandgate 0:6dee052a3fa4 99 * Set MBed IP Address
nandgate 0:6dee052a3fa4 100 */
nandgate 0:6dee052a3fa4 101 void setIPAddr(const struct ip_addr &value) { netif->ip_addr = ipaddr = value; }
nandgate 0:6dee052a3fa4 102 /**
nandgate 0:6dee052a3fa4 103 * Get MBed IP Address
nandgate 0:6dee052a3fa4 104 */
nandgate 0:6dee052a3fa4 105 const struct ip_addr &getIPAddr() { return ipaddr = netif->ip_addr; }
nandgate 0:6dee052a3fa4 106
nandgate 0:6dee052a3fa4 107 /**
nandgate 0:6dee052a3fa4 108 * Set Netmask
nandgate 0:6dee052a3fa4 109 */
nandgate 0:6dee052a3fa4 110 void setNetmask(const struct ip_addr &value) { netif->netmask = netmask = value; }
nandgate 0:6dee052a3fa4 111
nandgate 0:6dee052a3fa4 112 /**
nandgate 0:6dee052a3fa4 113 * Get Netmask
nandgate 0:6dee052a3fa4 114 */
nandgate 0:6dee052a3fa4 115 const struct ip_addr &getNetmask() { return netmask = netif->netmask; }
nandgate 0:6dee052a3fa4 116
nandgate 0:6dee052a3fa4 117 /**
nandgate 0:6dee052a3fa4 118 * Set default Gateway
nandgate 0:6dee052a3fa4 119 */
nandgate 0:6dee052a3fa4 120 void setGateway(const struct ip_addr &value) { netif->gw = gateway = value; }
nandgate 0:6dee052a3fa4 121
nandgate 0:6dee052a3fa4 122 /**
nandgate 0:6dee052a3fa4 123 * Get default Gateway
nandgate 0:6dee052a3fa4 124 */
nandgate 0:6dee052a3fa4 125 const struct ip_addr &getGateway() { return gateway = netif->gw; }
nandgate 0:6dee052a3fa4 126
nandgate 0:6dee052a3fa4 127 /**
nandgate 0:6dee052a3fa4 128 * Set first Domain Name Server
nandgate 0:6dee052a3fa4 129 */
nandgate 0:6dee052a3fa4 130 void setDNS1(const struct ip_addr &value) { firstdns = value; dns_setserver(0, &firstdns); }
nandgate 0:6dee052a3fa4 131
nandgate 0:6dee052a3fa4 132 /**
nandgate 0:6dee052a3fa4 133 * Get first Domain Name Server
nandgate 0:6dee052a3fa4 134 */
nandgate 0:6dee052a3fa4 135 const struct ip_addr &getDNS1() { return firstdns = dns_getserver(0); }
nandgate 0:6dee052a3fa4 136
nandgate 0:6dee052a3fa4 137 /**
nandgate 0:6dee052a3fa4 138 * Set second Domain Name Server
nandgate 0:6dee052a3fa4 139 */
nandgate 0:6dee052a3fa4 140 void setDNS2(const struct ip_addr &value) { seconddns = value; dns_setserver(1, &firstdns); }
nandgate 0:6dee052a3fa4 141
nandgate 0:6dee052a3fa4 142 /**
nandgate 0:6dee052a3fa4 143 * Get second Domain Name Server
nandgate 0:6dee052a3fa4 144 */
nandgate 0:6dee052a3fa4 145 const struct ip_addr &getDNS2() { return seconddns = dns_getserver(1); }
nandgate 0:6dee052a3fa4 146
nandgate 0:6dee052a3fa4 147 /**
nandgate 0:6dee052a3fa4 148 * Set MBed Hostname
nandgate 0:6dee052a3fa4 149 */
nandgate 0:6dee052a3fa4 150 void setHostname(const char *value) { hostname = value; }
nandgate 0:6dee052a3fa4 151
nandgate 0:6dee052a3fa4 152 /**
nandgate 0:6dee052a3fa4 153 * Get MBed Hostname
nandgate 0:6dee052a3fa4 154 */
nandgate 0:6dee052a3fa4 155 const char *getHostname() const { return hostname; }
nandgate 0:6dee052a3fa4 156
nandgate 0:6dee052a3fa4 157 /**
nandgate 0:6dee052a3fa4 158 * Define if DHCP sould be used.
nandgate 0:6dee052a3fa4 159 * @param value Bool if true dhcp is used else a static ip setting is assumed.
nandgate 0:6dee052a3fa4 160 */
nandgate 0:6dee052a3fa4 161 void setUseDHCP(const bool &value) { dhcp = value; }
nandgate 0:6dee052a3fa4 162
nandgate 0:6dee052a3fa4 163 /**
nandgate 0:6dee052a3fa4 164 * Is the mbed board trying to use DHCP?
nandgate 0:6dee052a3fa4 165 */
nandgate 0:6dee052a3fa4 166 const bool &getUseDHCP() const { return dhcp; }
nandgate 0:6dee052a3fa4 167
nandgate 0:6dee052a3fa4 168 /**
nandgate 0:6dee052a3fa4 169 * Initialise the network environment. Set up all services.
nandgate 0:6dee052a3fa4 170 * Please call after configuration.
nandgate 0:6dee052a3fa4 171 */
nandgate 0:6dee052a3fa4 172 void init();
nandgate 0:6dee052a3fa4 173
nandgate 0:6dee052a3fa4 174 /**
nandgate 0:6dee052a3fa4 175 * Set the network interface up.
nandgate 0:6dee052a3fa4 176 * To enable the network interface after calling setDown()
nandgate 0:6dee052a3fa4 177 * Automaticly called from init().
nandgate 0:6dee052a3fa4 178 */
nandgate 0:6dee052a3fa4 179 void setUp() const;
nandgate 0:6dee052a3fa4 180
nandgate 0:6dee052a3fa4 181 /**
nandgate 0:6dee052a3fa4 182 * Set the network interface down.
nandgate 0:6dee052a3fa4 183 * To disable the network interface temporary.
nandgate 0:6dee052a3fa4 184 * To make the interface avalible again use setUp().
nandgate 0:6dee052a3fa4 185 */
nandgate 0:6dee052a3fa4 186 void setDown() const;
nandgate 0:6dee052a3fa4 187
nandgate 0:6dee052a3fa4 188 /**
nandgate 0:6dee052a3fa4 189 * Returns 1 if the network is up otherwise 0.
nandgate 0:6dee052a3fa4 190 */
nandgate 0:6dee052a3fa4 191 int isUp() const;
nandgate 0:6dee052a3fa4 192
nandgate 0:6dee052a3fa4 193 /**
nandgate 0:6dee052a3fa4 194 * This function waits until the network interface is Up.
nandgate 0:6dee052a3fa4 195 * To use to wait after init with DHCP. Helps continue work
nandgate 0:6dee052a3fa4 196 * after the network interface is completly up.
nandgate 0:6dee052a3fa4 197 */
nandgate 0:6dee052a3fa4 198 void waitUntilReady();
nandgate 0:6dee052a3fa4 199
nandgate 0:6dee052a3fa4 200 /**
nandgate 0:6dee052a3fa4 201 * Bind Callbackfunctions to a TCPPort.
nandgate 0:6dee052a3fa4 202 * It provides a clean lowlevel Interface to the TCPLayer.
nandgate 0:6dee052a3fa4 203 */
nandgate 0:6dee052a3fa4 204 TCPCallbackListener *bindTCPPort(u16_t, err_t (*)(TCPCallbackListener *, struct tcp_pcb *, err_t)) const;
nandgate 0:6dee052a3fa4 205
nandgate 0:6dee052a3fa4 206 /**
nandgate 0:6dee052a3fa4 207 * Frees TCPItems because they cant do it directly.
nandgate 0:6dee052a3fa4 208 */
nandgate 0:6dee052a3fa4 209 void free(TCPItem *item) const;
nandgate 0:6dee052a3fa4 210
nandgate 0:6dee052a3fa4 211 static int time();
nandgate 0:6dee052a3fa4 212
nandgate 0:6dee052a3fa4 213 protected:
nandgate 0:6dee052a3fa4 214 void _poll() const;
nandgate 0:6dee052a3fa4 215
nandgate 0:6dee052a3fa4 216 /**
nandgate 0:6dee052a3fa4 217 * Default constructor tryes to bring the network interface up with dhcp.
nandgate 0:6dee052a3fa4 218 */
nandgate 0:6dee052a3fa4 219 NetServer();
nandgate 0:6dee052a3fa4 220
nandgate 0:6dee052a3fa4 221 /**
nandgate 0:6dee052a3fa4 222 * Constructor for fix ip setting
nandgate 0:6dee052a3fa4 223 */
nandgate 0:6dee052a3fa4 224 NetServer(struct ip_addr me_ip, struct ip_addr netmask, struct ip_addr gateway);
nandgate 0:6dee052a3fa4 225
nandgate 0:6dee052a3fa4 226 private:
nandgate 0:6dee052a3fa4 227 /**
nandgate 0:6dee052a3fa4 228 * This is a singleton class.
nandgate 0:6dee052a3fa4 229 * So we should not have a public copy constructor.
nandgate 0:6dee052a3fa4 230 */
nandgate 0:6dee052a3fa4 231 NetServer(NetServer const&) {}
nandgate 0:6dee052a3fa4 232 // NetServer &operator=(NetServer const&) {}
nandgate 0:6dee052a3fa4 233
nandgate 0:6dee052a3fa4 234 struct netif *netif;
nandgate 0:6dee052a3fa4 235 struct netif netif_data;
nandgate 0:6dee052a3fa4 236
nandgate 0:6dee052a3fa4 237 struct ip_addr ipaddr;
nandgate 0:6dee052a3fa4 238 struct ip_addr netmask;
nandgate 0:6dee052a3fa4 239 struct ip_addr gateway;
nandgate 0:6dee052a3fa4 240
nandgate 0:6dee052a3fa4 241 struct ip_addr firstdns;
nandgate 0:6dee052a3fa4 242 struct ip_addr seconddns;
nandgate 0:6dee052a3fa4 243
nandgate 0:6dee052a3fa4 244 bool dhcp;
nandgate 0:6dee052a3fa4 245
nandgate 0:6dee052a3fa4 246 list<TCPItem *> *del;
nandgate 0:6dee052a3fa4 247
nandgate 0:6dee052a3fa4 248 Ticker tickARP, /*eth_tick,*/ dns_tick, dhcp_coarse, dhcp_fine;
nandgate 0:6dee052a3fa4 249 const char *hostname;
nandgate 0:6dee052a3fa4 250 static NetServer *singleton;
nandgate 0:6dee052a3fa4 251 Timer _time;
nandgate 0:6dee052a3fa4 252 };
nandgate 0:6dee052a3fa4 253
nandgate 0:6dee052a3fa4 254 };
nandgate 0:6dee052a3fa4 255 #endif /* NETSERVER_H */