Port of LwIP performed by Ralf in 2010. Not recommended for use with recent mbed libraries, but good demos of raw LwIP possible
Dependents: LwIP_raw_API_serverExample tiny-dtls
Diff: Core/NetServer.h
- Revision:
- 0:0791c1fece8e
diff -r 000000000000 -r 0791c1fece8e Core/NetServer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Core/NetServer.h Tue Sep 18 14:41:24 2012 +0000 @@ -0,0 +1,255 @@ +#ifndef NETSERVER_H +#define NETSERVER_H + +#include "ipv4/lwip/ip_addr.h" +#include "lwip/netif.h" +#include "netif/etharp.h" +#include "iputil.h" +#include "dns.h" +#include "mbed.h" + +#include <list> + +namespace mbed { + class TCPItem; + class TCPListener; + class TCPCallbackListener; + class TCPConnection; + + /** + * Network main class + * provides the basic network features. + */ + class NetServer { + public: + /** + * Returns you the NetServer instance. + * If there is no object it will create a new one. + * But it will not initialise it. + * Configure the object for DHCP. + */ + static NetServer *create() { + if(!NetServer::singleton) { + NetServer::singleton = new NetServer(); + } + return NetServer::singleton; + } + + /** + * Returns you the NetServer instance. + * If there is no object it will create a new one. + * But it will not initialise it. + * You have to insert ipaddres, netmask and gateway. + */ + inline static NetServer *create(const struct ip_addr &ip, const struct ip_addr &netmask, const struct ip_addr &gateway) { + if(!NetServer::singleton) { + NetServer::singleton = new NetServer(ip, netmask, gateway); + } + return NetServer::singleton; + } + + /** + * Returns you the NetServer instance. + * If there is no object it will create a new one + * and it will initialise it. + * A new created object will ever use DHCP and the default MAC address + * and default hostname. + */ + inline static NetServer *ready() { + if(!NetServer::singleton) { + NetServer::singleton = new NetServer(); + } + if(!NetServer::singleton->netif->hwaddr_len) { + NetServer::singleton->init(); + NetServer::singleton->waitUntilReady(); + } + return NetServer::singleton; + } + + /** + * Returns you the NetServer instance. + * Even if there is no one created. + * That means use with care and in combination with NetServer::ready(). + * It is mutch quicker than NetServer::ready(). + * First call one time NetServer::ready() and then NetServer::get() + * and you are save. + */ + inline static NetServer *get() { + return NetServer::singleton; + } + + /** + * Polls one time on the NetServer and all registert Interfaces. + * Even if there is no one created. + * That means use with care and in combination with NetServer::ready(). + * It is mutch faster than NetServer::ready()->_poll(). + * First call one time NetServer::ready() and then NetServer::poll() + * and you are save. + */ + inline static void poll() { + singleton->_poll(); + } + + /** + * Default destructor. + */ + ~NetServer(); + + /** + * Set MBed IP Address + */ + void setIPAddr(const struct ip_addr &value) { netif->ip_addr = ipaddr = value; } + /** + * Get MBed IP Address + */ + const struct ip_addr &getIPAddr() { return ipaddr = netif->ip_addr; } + + /** + * Set Netmask + */ + void setNetmask(const struct ip_addr &value) { netif->netmask = netmask = value; } + + /** + * Get Netmask + */ + const struct ip_addr &getNetmask() { return netmask = netif->netmask; } + + /** + * Set default Gateway + */ + void setGateway(const struct ip_addr &value) { netif->gw = gateway = value; } + + /** + * Get default Gateway + */ + const struct ip_addr &getGateway() { return gateway = netif->gw; } + + /** + * Set first Domain Name Server + */ + void setDNS1(const struct ip_addr &value) { firstdns = value; dns_setserver(0, &firstdns); } + + /** + * Get first Domain Name Server + */ + const struct ip_addr &getDNS1() { return firstdns = dns_getserver(0); } + + /** + * Set second Domain Name Server + */ + void setDNS2(const struct ip_addr &value) { seconddns = value; dns_setserver(1, &firstdns); } + + /** + * Get second Domain Name Server + */ + const struct ip_addr &getDNS2() { return seconddns = dns_getserver(1); } + + /** + * Set MBed Hostname + */ + void setHostname(const char *value) { hostname = value; } + + /** + * Get MBed Hostname + */ + const char *getHostname() const { return hostname; } + + /** + * Define if DHCP sould be used. + * @param value Bool if true dhcp is used else a static ip setting is assumed. + */ + void setUseDHCP(const bool &value) { dhcp = value; } + + /** + * Is the mbed board trying to use DHCP? + */ + const bool &getUseDHCP() const { return dhcp; } + + /** + * Initialise the network environment. Set up all services. + * Please call after configuration. + */ + void init(); + + /** + * Set the network interface up. + * To enable the network interface after calling setDown() + * Automaticly called from init(). + */ + void setUp() const; + + /** + * Set the network interface down. + * To disable the network interface temporary. + * To make the interface avalible again use setUp(). + */ + void setDown() const; + + /** + * Returns 1 if the network is up otherwise 0. + */ + int isUp() const; + + /** + * This function waits until the network interface is Up. + * To use to wait after init with DHCP. Helps continue work + * after the network interface is completly up. + */ + void waitUntilReady(); + + /** + * Bind Callbackfunctions to a TCPPort. + * It provides a clean lowlevel Interface to the TCPLayer. + */ + TCPCallbackListener *bindTCPPort(u16_t, err_t (*)(TCPCallbackListener *, struct tcp_pcb *, err_t)) const; + + /** + * Frees TCPItems because they cant do it directly. + */ + void free(TCPItem *item) const; + + static int time(); + + protected: + void _poll() const; + + /** + * Default constructor tryes to bring the network interface up with dhcp. + */ + NetServer(); + + /** + * Constructor for fix ip setting + */ + NetServer(struct ip_addr me_ip, struct ip_addr netmask, struct ip_addr gateway); + + private: + /** + * This is a singleton class. + * So we should not have a public copy constructor. + */ + NetServer(NetServer const&) {} +// NetServer &operator=(NetServer const&) {} + + struct netif *netif; + struct netif netif_data; + + struct ip_addr ipaddr; + struct ip_addr netmask; + struct ip_addr gateway; + + struct ip_addr firstdns; + struct ip_addr seconddns; + + bool dhcp; + + list<TCPItem *> *del; + + Ticker tickARP, /*eth_tick,*/ dns_tick, dhcp_coarse, dhcp_fine; + const char *hostname; + static NetServer *singleton; + Timer _time; + }; + +}; +#endif /* NETSERVER_H */