Some quick code to use UDP-only (no TCP) with mBed. Echos received packets and sends packets when a button is pressed

Dependencies:   mbed

Committer:
pehrhovey
Date:
Sun Mar 14 00:54:12 2010 +0000
Revision:
0:a548a085de55

        

Who changed what in which revision?

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