A version of LWIP, provided for backwards compatibility.
Dependents: AA_DemoBoard DemoBoard HelloServerDemo DemoBoard_RangeIndicator ... more
tcpcallbackconnection.h
00001 #ifndef TCPCALLBACKCONNECTION_H 00002 #define TCPCALLBACKCONNECTION_H 00003 00004 #include "tcpconnection.h" 00005 00006 namespace mbed { 00007 00008 #define NO_SENT_FNC ((err_t (*)(TCPCallbackConnection *, u16_t))NULL) 00009 #define NO_RECV_FNC ((err_t (*)(TCPCallbackConnection *, struct pbuf *, err_t))NULL) 00010 #define NO_POLL_FNC ((err_t (*)(TCPCallbackConnection *))NULL) 00011 #define NO_ACCEPT_FNC ((err_t (*)(TCPCallbackConnection *, struct tcp_pcb *, err_t))NULL) 00012 #define NO_CONNECT_FNC ((err_t (*)(TCPCallbackConnection *, err_t))NULL) 00013 #define NO_ERR_FNC ((void (*)(TCPCallbackConnection *, err_t))NULL) 00014 00015 00016 class TCPCallbackConnection : public TCPConnection { 00017 public: 00018 TCPCallbackConnection(struct ip_addr ip_addr, u16_t port, 00019 err_t (*psent)(TCPCallbackConnection *, u16_t), 00020 err_t (*precv)(TCPCallbackConnection *, struct pbuf *, err_t), 00021 err_t (*ppoll)(TCPCallbackConnection *), 00022 err_t (*pconnected)(TCPCallbackConnection *, err_t), 00023 void (*perr )(TCPCallbackConnection *, err_t)) 00024 : TCPConnection(ip_addr, port) { 00025 _sent = psent; 00026 _recv = precv; 00027 _poll = ppoll; 00028 _connected = pconnected; 00029 _err = perr; 00030 _membercaller_sent = NULL; 00031 _membercaller_recv = NULL; 00032 _membercaller_poll = NULL; 00033 _membercaller_connected = NULL; 00034 _membercaller_err = NULL; 00035 } 00036 00037 TCPCallbackConnection(TCPListener *parent, struct tcp_pcb *npcb, 00038 err_t (*psent)(TCPCallbackConnection *, u16_t), 00039 err_t (*precv)(TCPCallbackConnection *, struct pbuf *, err_t), 00040 err_t (*ppoll)(TCPCallbackConnection *), 00041 err_t (*pconnected)(TCPCallbackConnection *, err_t), 00042 void (*perr )(TCPCallbackConnection *, err_t)) 00043 : TCPConnection(parent, npcb) { 00044 _sent = psent; 00045 _recv = precv; 00046 _poll = ppoll; 00047 _connected = pconnected; 00048 _err = perr; 00049 _membercaller_sent = NULL; 00050 _membercaller_recv = NULL; 00051 _membercaller_poll = NULL; 00052 _membercaller_connected = NULL; 00053 _membercaller_err = NULL; 00054 } 00055 00056 /* 00057 template<typename T> 00058 TCPCallbackConnection(NetServer *nnet, const struct ip_addr &ip_addr, const u16_t &port, 00059 T *o, 00060 err_t (T::*psent)(TCPCallbackConnection *, u16_t), 00061 err_t (T::*precv)(TCPCallbackConnection *, struct pbuf *p, err_t err), 00062 err_t (T::*ppoll)(TCPCallbackConnection *), 00063 err_t (T::*pconnected)(TCPCallbackConnection *, err_t), 00064 void (T::*perr )(TCPCallbackConnection *, err_t)) 00065 : TCPConnection(nnet, ip_addr, port) { 00066 _sent = NULL; _recv = NULL; _poll = NULL; _connected = NULL; _err = NULL; 00067 _object_sent = _object_recv = _object_poll = 00068 _object_connected = _object_err = static_cast<void *>(o); 00069 00070 memcpy(_member_sent, (char *)&psent, sizeof(psent)); 00071 memcpy(_member_recv, (char *)&precv, sizeof(precv)); 00072 memcpy(_member_poll, (char *)&ppoll, sizeof(ppoll)); 00073 memcpy(_member_connected, (char *)&pconnected, sizeof(pconnected)); 00074 memcpy(_member_err, (char *)&perr, sizeof(perr)); 00075 00076 _membercaller_sent = &TCPCallbackConnection::_fsent<T>; 00077 _membercaller_recv = &TCPCallbackConnection::_frecv<T>; 00078 _membercaller_poll = &TCPCallbackConnection::_fpoll<T>; 00079 _membercaller_connected = &TCPCallbackConnection::_fconnected<T>; 00080 _membercaller_err = &TCPCallbackConnection::_ferr<T>; 00081 } 00082 00083 template<typename T_sent, typename T_recv, typename T_poll, typename T_accept, typename T_connected, typename T_err> 00084 TCPCallbackConnection(NetServer *nnet, const struct ip_addr &ip_addr, const u16_t &port, 00085 T_sent *osent, 00086 err_t (T_sent::*psent)(TCPCallbackConnection *, u16_t), 00087 T_recv *orecv, 00088 err_t (T_recv::*precv)(TCPCallbackConnection *, struct pbuf *p, err_t err), 00089 T_poll *opoll, 00090 err_t (T_poll::*ppoll)(TCPCallbackConnection *), 00091 T_connected *oconnected, 00092 err_t (T_connected::*pconnected)(TCPCallbackConnection *, err_t), 00093 T_err *oerr, 00094 void (T_err::*perr )(TCPCallbackConnection *, err_t)) 00095 : TCPConnection(nnet, ip_addr, port) { 00096 _sent = NULL; _recv = NULL; _poll = NULL; _connected = NULL; _err = NULL; 00097 00098 _object_sent = static_cast<void *>(osent); 00099 _object_recv = static_cast<void *>(orecv); 00100 _object_poll = static_cast<void *>(opoll); 00101 _object_connected = static_cast<void *>(oconnected); 00102 _object_err = static_cast<void *>(oerr); 00103 00104 memcpy(_member_sent, (char *)&psent, sizeof(psent)); 00105 memcpy(_member_recv, (char *)&precv, sizeof(precv)); 00106 memcpy(_member_poll, (char *)&ppoll, sizeof(ppoll)); 00107 memcpy(_member_connected, (char *)&paccept, sizeof(paccept)); 00108 memcpy(_member_err, (char *)&perr, sizeof(perr)); 00109 00110 _membercaller_sent = &TCPCallbackConnection::_fsent<T_sent>; 00111 _membercaller_recv = &TCPCallbackConnection::_frecv<T_recv>; 00112 _membercaller_poll = &TCPCallbackConnection::_fpoll<T_poll>; 00113 _membercaller_connected = &TCPCallbackConnection::_fconnected<T_connected>; 00114 _membercaller_err = &TCPCallbackConnection::_ferr<T_err>; 00115 } 00116 */ 00117 /* 00118 * Function to be called when more send buffer space is available. 00119 * @param space the amount of bytes available 00120 * @return ERR_OK: try to send some data by calling tcp_output 00121 */ 00122 virtual err_t sent(u16_t space) { 00123 if(_sent) { 00124 return (_sent)(this, space); 00125 } else if(_membercaller_sent) { 00126 return (_membercaller_sent)(this, space); 00127 } else { 00128 return ERR_OK; 00129 } 00130 } 00131 00132 /* 00133 * Function to be called when (in-sequence) data has arrived. 00134 * @param p the packet buffer which arrived 00135 * @param err an error argument (TODO: that is current always ERR_OK?) 00136 * @return ERR_OK: try to send some data by calling tcp_output 00137 */ 00138 virtual err_t recv(struct pbuf *p, err_t err) { 00139 if(_recv) { 00140 return (_recv)(this, p, err); 00141 } else if(_membercaller_recv) { 00142 return (_membercaller_recv)(this, p, err); 00143 } else { 00144 return ERR_OK; 00145 } 00146 } 00147 00148 /* 00149 * Function which is called periodically. 00150 * The period can be adjusted in multiples of the TCP slow timer interval 00151 * by changing tcp_pcb.polltmr. 00152 * @return ERR_OK: try to send some data by calling tcp_output 00153 */ 00154 virtual err_t poll() { 00155 if(_poll) { 00156 return (_poll)(this); 00157 } else if(_membercaller_poll) { 00158 return (_membercaller_poll)(this); 00159 } else { 00160 return ERR_OK; 00161 } 00162 } 00163 00164 virtual err_t connected(err_t err) { 00165 err = TCPConnection::connected(err); 00166 if(_connected) { 00167 return (_connected)(this, err); 00168 } else if(_membercaller_connected) { 00169 return (_membercaller_connected)(this, err); 00170 } else { 00171 return ERR_OK; 00172 } 00173 } 00174 00175 /* 00176 * Function to be called whenever a fatal error occurs. 00177 * There is no pcb parameter since most of the times, the pcb is 00178 * already deallocated (or there is no pcb) when this function is called. 00179 * @param err an indication why the error callback is called: 00180 * ERR_ABRT: aborted through tcp_abort or by a TCP timer 00181 * ERR_RST: the connection was reset by the remote host 00182 */ 00183 virtual void err(err_t err) { 00184 if(_err) { 00185 (_err)(this, err); 00186 } else if(_membercaller_err) { 00187 (_membercaller_err)(this, err); 00188 } 00189 } 00190 00191 private: 00192 template<typename T> static err_t _fsent(TCPCallbackConnection *me, u16_t space) { 00193 T* o = static_cast<T *>(me->_object_sent); 00194 err_t (T::*m)(TCPCallbackConnection *, u16_t); 00195 memcpy((char *)&m, me->_member_sent, sizeof(m)); 00196 return (o->*m)(me, space); 00197 } 00198 00199 template<typename T> static err_t _frecv(TCPCallbackConnection *me, struct pbuf *p, err_t err) { 00200 T* o = static_cast<T *>(me->_object_recv); 00201 err_t (T::*m)(TCPCallbackConnection *, struct pbuf *p, err_t err); 00202 memcpy((char *)&m, me->_member_recv, sizeof(m)); 00203 return (o->*m)(me, p, err); 00204 } 00205 00206 template<typename T> static err_t _fpoll(TCPCallbackConnection *me) { 00207 T* o = static_cast<T *>(me->_object_poll); 00208 err_t (T::*m)(TCPCallbackConnection *); 00209 memcpy((char *)&m, me->_member_poll, sizeof(m)); 00210 return (o->*m)(me); 00211 } 00212 00213 template<typename T> static err_t _faccept(TCPCallbackConnection *me, struct tcp_pcb *newpcb, err_t err) { 00214 T* o = static_cast<T *>(me->_object_accept); 00215 err_t (T::*m)(TCPCallbackConnection *, struct tcp_pcb *, err_t); 00216 memcpy((char *)&m, me->_member_accept, sizeof(m)); 00217 return (o->*m)(me, newpcb, err); 00218 } 00219 00220 template<typename T> static err_t _fconnected(TCPCallbackConnection *me, err_t err) { 00221 T* o = static_cast<T *>(me->_object_connected); 00222 err_t (T::*m)(TCPCallbackConnection *, err_t); 00223 memcpy((char *)&m, me->_member_connected, sizeof(m)); 00224 return (o->*m)(me, err); 00225 } 00226 00227 template<typename T> static void _ferr(TCPCallbackConnection *me, err_t) { 00228 T* o = static_cast<T *>(me->_object_err); 00229 err_t (T::*m)(TCPCallbackConnection *, err_t); 00230 memcpy((char *)&m, me->_member_err, sizeof(m)); 00231 (o->*m)(me, err); 00232 } 00233 00234 err_t (*_sent)(TCPCallbackConnection *, u16_t); 00235 err_t (*_recv)(TCPCallbackConnection *, struct pbuf *p, err_t err); 00236 err_t (*_poll)(TCPCallbackConnection *); 00237 err_t (*_accept)(TCPCallbackConnection *, struct tcp_pcb *newpcb, err_t err); 00238 err_t (*_connected)(TCPCallbackConnection *, err_t err); 00239 void (*_err )(TCPCallbackConnection *, err_t); 00240 void *_object_sent; 00241 void *_object_recv; 00242 void *_object_poll; 00243 void *_object_accept; 00244 void *_object_connected; 00245 void *_object_err; 00246 char _member_sent[16]; 00247 char _member_recv[16]; 00248 char _member_poll[16]; 00249 char _member_accept[16]; 00250 char _member_connected[16]; 00251 char _member_err[16]; 00252 err_t (*_membercaller_sent)(TCPCallbackConnection *, u16_t); 00253 err_t (*_membercaller_recv)(TCPCallbackConnection *, struct pbuf *p, err_t err); 00254 err_t (*_membercaller_poll)(TCPCallbackConnection *); 00255 err_t (*_membercaller_accept)(TCPCallbackConnection *, struct tcp_pcb *newpcb, err_t err); 00256 err_t (*_membercaller_connected)(TCPCallbackConnection *, err_t err); 00257 void (*_membercaller_err) (TCPCallbackConnection *, err_t err); 00258 }; 00259 00260 }; 00261 00262 #endif /* TCPCALLBACKCONNECTION_H */
Generated on Tue Jul 12 2022 16:06:26 by 1.7.2