Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of lwip by
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:07:19 by
1.7.2
