33 #include "contiki-net.h"
37 #include "tcp-socket.h"
42 #define MIN(a, b) ((a) < (b) ? (a) : (b))
46 PROCESS(tcp_socket_process,
"TCP socket process");
49 call_event(
struct tcp_socket *s, tcp_socket_event_t event)
51 if(s !=
NULL && s->event_callback !=
NULL) {
52 s->event_callback(s, s->ptr, event);
57 senddata(
struct tcp_socket *s)
61 if(s->output_data_len > 0) {
62 len = MIN(s->output_data_len,
uip_mss());
63 s->output_data_send_nxt = len;
69 acked(
struct tcp_socket *s)
71 if(s->output_data_len > 0) {
75 if(s->output_data_send_nxt > 0) {
76 memcpy(&s->output_data_ptr[0],
77 &s->output_data_ptr[s->output_data_send_nxt],
78 s->output_data_maxlen - s->output_data_send_nxt);
80 if(s->output_data_len < s->output_data_send_nxt) {
81 printf(
"tcp: acked assertion failed s->output_data_len (%d) < s->output_data_send_nxt (%d)\n",
83 s->output_data_send_nxt);
85 s->output_data_len -= s->output_data_send_nxt;
86 s->output_data_send_nxt = 0;
88 call_event(s, TCP_SOCKET_DATA_SENT);
93 newdata(
struct tcp_socket *s)
95 uint16_t len, copylen, bytesleft;
107 copylen = MIN(len, s->input_data_maxlen);
108 memcpy(s->input_data_ptr, dataptr, copylen);
109 if(s->input_callback) {
110 bytesleft = s->input_callback(s, s->ptr,
111 s->input_data_ptr, copylen);
116 printf(
"tcp: newdata, bytesleft > 0 (%d) not implemented\n", bytesleft);
125 relisten(
struct tcp_socket *s)
127 if(s !=
NULL && s->listen_port != 0) {
128 s->flags |= TCP_SOCKET_FLAGS_LISTENING;
135 struct tcp_socket *s = state;
147 if((s->flags & TCP_SOCKET_FLAGS_LISTENING) != 0 &&
148 s->listen_port != 0 &&
150 s->flags &= ~TCP_SOCKET_FLAGS_LISTENING;
152 call_event(s, TCP_SOCKET_CONNECTED);
157 call_event(s, TCP_SOCKET_CONNECTED);
172 call_event(s, TCP_SOCKET_TIMEDOUT);
177 call_event(s, TCP_SOCKET_ABORTED);
201 if(s->output_data_len == 0 && s->flags & TCP_SOCKET_FLAGS_CLOSING) {
202 s->flags &= ~TCP_SOCKET_FLAGS_CLOSING;
205 call_event(s, TCP_SOCKET_CLOSED);
211 call_event(s, TCP_SOCKET_CLOSED);
232 static uint8_t inited = 0;
241 tcp_socket_register(
struct tcp_socket *s,
void *ptr,
242 uint8_t *input_databuf,
int input_databuf_len,
243 uint8_t *output_databuf,
int output_databuf_len,
244 tcp_socket_data_callback_t input_callback,
245 tcp_socket_event_callback_t event_callback)
254 s->input_data_ptr = input_databuf;
255 s->input_data_maxlen = input_databuf_len;
256 s->output_data_ptr = output_databuf;
257 s->output_data_maxlen = output_databuf_len;
258 s->input_callback = input_callback;
259 s->event_callback = event_callback;
263 s->flags = TCP_SOCKET_FLAGS_NONE;
268 tcp_socket_connect(
struct tcp_socket *s,
269 uip_ipaddr_t *ipaddr,
286 tcp_socket_listen(
struct tcp_socket *s,
293 s->listen_port = port;
297 s->flags |= TCP_SOCKET_FLAGS_LISTENING;
302 tcp_socket_unlisten(
struct tcp_socket *s)
312 s->flags &= ~TCP_SOCKET_FLAGS_LISTENING;
317 tcp_socket_send(
struct tcp_socket *s,
318 const uint8_t *data,
int datalen)
326 len = MIN(datalen, s->output_data_maxlen - s->output_data_len);
328 memcpy(&s->output_data_ptr[s->output_data_len], data, len);
329 s->output_data_len += len;
334 tcp_socket_send_str(
struct tcp_socket *s,
337 return tcp_socket_send(s, (
const uint8_t *)str, strlen(str));
341 tcp_socket_close(
struct tcp_socket *s)
347 s->flags |= TCP_SOCKET_FLAGS_CLOSING;
352 tcp_socket_unregister(
struct tcp_socket *s)
358 tcp_socket_unlisten(s);