LRSD stephane / Mbed 2 deprecated WEBserverv1

Dependencies:   mbed

Committer:
geiineuville
Date:
Sat Sep 03 09:42:32 2011 +0000
Revision:
0:4570f87afab6
v1

Who changed what in which revision?

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