792c6ea4a6f52f96e5ca7a283b5465146994da21
[akaros.git] / kern / include / net / tcp.h
1 #ifndef ROS_KERN_TCP_H
2 #define ROS_KERN_TCP_H
3 #include <net/pbuf.h>
4 #include <net/ip.h>
5 #include <net.h>
6 #include <error.h>
7 #include <bits/netinet.h>
8 #include <socket.h>
9
10 #ifdef __cplusplus
11 extern "C" {
12 #endif
13
14 #ifndef TCP_LOCAL_PORT_RANGE_START
15 #define TCP_LOCAL_PORT_RANGE_START 4096
16 #define TCP_LOCAL_PORT_RANGE_END   0x7fff
17 #endif
18
19 #ifndef LWIP_CALLBACK_API
20 #define LWIP_CALLBACK_API 1
21 #endif 
22
23
24 /**
25  * LWIP_TCP_KEEPALIVE==1: Enable TCP_KEEPIDLE, TCP_KEEPINTVL and TCP_KEEPCNT
26  * options processing. Note that TCP_KEEPIDLE and TCP_KEEPINTVL have to be set
27  * in seconds. (does not require sockets.c, and will affect tcp.c)
28  */
29 #ifndef LWIP_TCP_KEEPALIVE
30 #define LWIP_TCP_KEEPALIVE              0
31 #endif
32
33 /**
34  * TCP_TTL: Default Time-To-Live value.
35  */
36 #ifndef TCP_TTL
37 #define TCP_TTL                         (255)
38 #endif
39
40 /**
41  * TCP_MSS: TCP Maximum segment size. (default is 536, a conservative default,
42  * you might want to increase this.)
43  * For the receive side, this MSS is advertised to the remote side
44  * when opening a connection. For the transmit size, this MSS sets
45  * an upper limit on the MSS advertised by the remote host.
46  */
47 #ifndef TCP_MSS
48 #define TCP_MSS                         (536)
49 #endif
50
51 /**
52  * TCP_WND: The size of a TCP window.  This must be at least 
53  * (2 * TCP_MSS) for things to work well
54  */
55 #ifndef TCP_WND
56 #define TCP_WND                         (4 * TCP_MSS)
57 #endif 
58
59 /**
60  * TCP_MAXRTX: Maximum number of retransmissions of data segments.
61  */
62 #ifndef TCP_MAXRTX
63 #define TCP_MAXRTX                      12
64 #endif
65
66 /**
67  * TCP_SYNMAXRTX: Maximum number of retransmissions of SYN segments.
68  */
69 #ifndef TCP_SYNMAXRTX
70 #define TCP_SYNMAXRTX                   6
71 #endif
72
73 /**
74  * TCP_QUEUE_OOSEQ==1: TCP will queue segments that arrive out of order.
75  * Define to 0 if your device is low on memory.
76  */
77 #ifndef TCP_QUEUE_OOSEQ
78 #define TCP_QUEUE_OOSEQ                 0
79 #endif
80
81
82 /**
83  * TCP_CALCULATE_EFF_SEND_MSS: "The maximum size of a segment that TCP really
84  * sends, the 'effective send MSS,' MUST be the smaller of the send MSS (which
85  * reflects the available reassembly buffer size at the remote host) and the
86  * largest size permitted by the IP layer" (RFC 1122)
87  * Setting this to 1 enables code that checks TCP_MSS against the MTU of the
88  * netif used for a connection and limits the MSS if it would be too big otherwise.
89  */
90 #ifndef TCP_CALCULATE_EFF_SEND_MSS
91 #define TCP_CALCULATE_EFF_SEND_MSS      1
92 #endif
93
94
95 /**
96  * TCP_SND_BUF: TCP sender buffer space (bytes). 
97  */
98 #ifndef TCP_SND_BUF
99 #define TCP_SND_BUF                     256
100 #endif
101
102 /**
103  * TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least
104  * as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work.
105  */
106 #ifndef TCP_SND_QUEUELEN
107 #define TCP_SND_QUEUELEN                ((4 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS))
108 #endif
109
110 /**
111  * TCP_SNDLOWAT: TCP writable space (bytes). This must be less than
112  * TCP_SND_BUF. It is the amount of space which must be available in the
113  * TCP snd_buf for select to return writable (combined with TCP_SNDQUEUELOWAT).
114  */
115 #ifndef TCP_SNDLOWAT
116 #define TCP_SNDLOWAT                    ((TCP_SND_BUF)/2)
117 #endif
118
119 /**
120  * TCP_SNDQUEUELOWAT: TCP writable bufs (pbuf count). This must be grater
121  * than TCP_SND_QUEUELEN. If the number of pbufs queued on a pcb drops below
122  * this number, select returns writable (combined with TCP_SNDLOWAT).
123  */
124 #ifndef TCP_SNDQUEUELOWAT
125 #define TCP_SNDQUEUELOWAT               ((TCP_SND_QUEUELEN)/2)
126 #endif
127
128 /**
129  * TCP_LISTEN_BACKLOG: Enable the backlog option for tcp listen pcb.
130  */
131 #ifndef TCP_LISTEN_BACKLOG
132 #define TCP_LISTEN_BACKLOG              0
133 #endif
134
135 /**
136  * The maximum allowed backlog for TCP listen netconns.
137  * This backlog is used unless another is explicitly specified.
138  * 0xff is the maximum (u8_t).
139  */
140 #ifndef TCP_DEFAULT_LISTEN_BACKLOG
141 #define TCP_DEFAULT_LISTEN_BACKLOG      0xff
142 #endif
143
144 /**
145  * TCP_OVERSIZE: The maximum number of bytes that tcp_write may
146  * allocate ahead of time in an attempt to create shorter pbuf chains
147  * for transmission. The meaningful range is 0 to TCP_MSS. Some
148  * suggested values are:
149  *
150  * 0:         Disable oversized allocation. Each tcp_write() allocates a new
151               pbuf (old behaviour).
152  * 1:         Allocate size-aligned pbufs with minimal excess. Use this if your
153  *            scatter-gather DMA requires aligned fragments.
154  * 128:       Limit the pbuf/memory overhead to 20%.
155  * TCP_MSS:   Try to create unfragmented TCP packets.
156  * TCP_MSS/4: Try to create 4 fragments or less per TCP packet.
157  */
158 #ifndef TCP_OVERSIZE
159 #define TCP_OVERSIZE                    TCP_MSS
160 #endif
161
162 /**
163  * LWIP_TCP_TIMESTAMPS==1: support the TCP timestamp option.
164  */
165 #ifndef LWIP_TCP_TIMESTAMPS
166 #define LWIP_TCP_TIMESTAMPS             0
167 #endif
168
169 /**
170  * TCP_WND_UPDATE_THRESHOLD: difference in window to trigger an
171  * explicit window update
172  */
173 #ifndef TCP_WND_UPDATE_THRESHOLD
174 #define TCP_WND_UPDATE_THRESHOLD   (TCP_WND / 4)
175 #endif
176
177 struct tcp_pcb;
178
179 #define TCP_PRIO_MIN    1
180 #define TCP_PRIO_NORMAL 64
181 #define TCP_PRIO_MAX    127
182
183 /** Function prototype for tcp accept callback functions. Called when a new
184  * connection can be accepted on a listening pcb.
185  *
186  * @param arg Additional argument to pass to the callback function (@see tcp_arg())
187  * @param newpcb The new connection pcb
188  * @param err An error code if there has been an error accepting.
189  *            Only return ERR_ABRT if you have called tcp_abort from within the
190  *            callback function!
191  */
192 typedef error_t (*tcp_accept_fn)(void *arg, struct tcp_pcb *newpcb, error_t err);
193
194 /** Function prototype for tcp receive callback functions. Called when data has
195  * been received.
196  *
197  * @param arg Additional argument to pass to the callback function (@see tcp_arg())
198  * @param tpcb The connection pcb which received data
199  * @param p The received data (or NULL when the connection has been closed!)
200  * @param err An error code if there has been an error receiving
201  *            Only return ERR_ABRT if you have called tcp_abort from within the
202  *            callback function!
203  */
204 typedef error_t (*tcp_recv_fn)(void *arg, struct tcp_pcb *tpcb,
205                              struct pbuf *p, error_t err);
206
207 /** Function prototype for tcp sent callback functions. Called when sent data has
208  * been acknowledged by the remote side. Use it to free corresponding resources.
209  * This also means that the pcb has now space available to send new data.
210  *
211  * @param arg Additional argument to pass to the callback function (@see tcp_arg())
212  * @param tpcb The connection pcb for which data has been acknowledged
213  * @param len The amount of bytes acknowledged
214  * @return ERR_OK: try to send some data by calling tcp_output
215  *            Only return ERR_ABRT if you have called tcp_abort from within the
216  *            callback function!
217  */
218 typedef error_t (*tcp_sent_fn)(void *arg, struct tcp_pcb *tpcb,
219                               uint16_t len);
220
221 /** Function prototype for tcp poll callback functions. Called periodically as
222  * specified by @see tcp_poll.
223  *
224  * @param arg Additional argument to pass to the callback function (@see tcp_arg())
225  * @param tpcb tcp pcb
226  * @return ERR_OK: try to send some data by calling tcp_output
227  *            Only return ERR_ABRT if you have called tcp_abort from within the
228  *            callback function!
229  */
230 typedef error_t (*tcp_poll_fn)(void *arg, struct tcp_pcb *tpcb);
231
232 /** Function prototype for tcp error callback functions. Called when the pcb
233  * receives a RST or is unexpectedly closed for any other reason.
234  *
235  * @note The corresponding pcb is already freed when this callback is called!
236  *
237  * @param arg Additional argument to pass to the callback function (@see tcp_arg())
238  * @param err Error code to indicate why the pcb has been closed
239  *            ERR_ABRT: aborted through tcp_abort or by a TCP timer
240  *            ERR_RST: the connection was reset by the remote host
241  */
242 typedef void  (*tcp_err_fn)(void *arg, error_t err);
243
244 /** Function prototype for tcp connected callback functions. Called when a pcb
245  * is connected to the remote side after initiating a connection attempt by
246  * calling tcp_connect().
247  *
248  * @param arg Additional argument to pass to the callback function (@see tcp_arg())
249  * @param tpcb The connection pcb which is connected
250  * @param err An unused error code, always ERR_OK currently ;-) TODO!
251  *            Only return ERR_ABRT if you have called tcp_abort from within the
252  *            callback function!
253  *
254  * @note When a connection attempt fails, the error callback is currently called!
255  */
256 typedef error_t (*tcp_connected_fn)(void *arg, struct tcp_pcb *tpcb, error_t err);
257
258 enum tcp_state {
259   CLOSED      = 0,
260   LISTEN      = 1,
261   SYN_SENT    = 2,
262   SYN_RCVD    = 3,
263   ESTABLISHED = 4,
264   FIN_WAIT_1  = 5,
265   FIN_WAIT_2  = 6,
266   CLOSE_WAIT  = 7,
267   CLOSING     = 8,
268   LAST_ACK    = 9,
269   TIME_WAIT   = 10
270 };
271
272 /**
273  * members common to struct tcp_pcb and struct tcp_listen_pcb
274  */
275 #define TCP_PCB_COMMON(type) \
276   type *next; /* for the linked list */ \
277   enum tcp_state state; /* TCP state */ \
278   uint8_t prio; \
279   void *callback_arg; \
280         tcp_accept_fn accept; \
281   /* ports are in host byte order */ \
282   uint16_t local_port
283
284
285 /* the TCP protocol control block */
286 struct tcp_pcb {
287         IP_PCB;
288
289 /** protocol specific PCB members */
290   TCP_PCB_COMMON(struct tcp_pcb);
291         struct socket *pcbsock;
292
293   /* ports are in host byte order */
294   uint16_t remote_port;
295   
296   uint8_t flags;
297 #define TF_ACK_DELAY   ((uint8_t)0x01U)   /* Delayed ACK. */
298 #define TF_ACK_NOW     ((uint8_t)0x02U)   /* Immediate ACK. */
299 #define TF_INFR        ((uint8_t)0x04U)   /* In fast recovery. */
300 #define TF_TIMESTAMP   ((uint8_t)0x08U)   /* Timestamp option enabled */
301 #define TF_RXCLOSED    ((uint8_t)0x10U)   /* rx closed by tcp_shutdown */
302 #define TF_FIN         ((uint8_t)0x20U)   /* Connection was closed locally (FIN segment enqueued). */
303 #define TF_NODELAY     ((uint8_t)0x40U)   /* Disable Nagle algorithm */
304 #define TF_NAGLEMEMERR ((uint8_t)0x80U)   /* nagle enabled, memerr, try to output to prevent delayed ACK to happen */
305
306   /* the rest of the fields are in host byte order
307      as we have to do some math with them */
308   /* receiver variables */
309   uint32_t rcv_nxt;   /* next seqno expected */
310   uint16_t rcv_wnd;   /* receiver window available */
311   uint16_t rcv_ann_wnd; /* receiver window to announce */
312   uint32_t rcv_ann_right_edge; /* announced right edge of window */
313
314   /* Timers */
315   uint32_t tmr;
316   uint8_t polltmr, pollinterval;
317   
318   /* Retransmission timer. */
319   int16_t rtime;
320   
321   uint16_t mss;   /* maximum segment size */
322   
323   /* RTT (round trip time) estimation variables */
324   uint32_t rttest; /* RTT estimate in 500ms ticks */
325   uint32_t rtseq;  /* sequence number being timed */
326   int16_t sa, sv; /* @todo document this */
327
328   int16_t rto;    /* retransmission time-out */
329   uint8_t nrtx;    /* number of retransmissions */
330
331   /* fast retransmit/recovery */
332   uint32_t lastack; /* Highest acknowledged seqno. */
333   uint8_t dupacks;
334   
335   /* congestion avoidance/control variables */
336   uint16_t cwnd;  
337   uint16_t ssthresh;
338
339   /* sender variables */
340   uint32_t snd_nxt;   /* next new seqno to be sent */
341   uint16_t snd_wnd;   /* sender window */
342   uint32_t snd_wl1, snd_wl2; /* Sequence and acknowledgement numbers of last
343                              window update. */
344   uint32_t snd_lbb;       /* Sequence number of next byte to be buffered. */
345
346   uint16_t acked;
347   
348   uint16_t snd_buf;   /* Available buffer space for sending (in bytes). */
349 #define TCP_SNDQUEUELEN_OVERFLOW (0xffff-3)
350   uint16_t snd_queuelen; /* Available buffer space for sending (in tcp_segs). */
351
352 #if TCP_OVERSIZE
353   /* Extra bytes available at the end of the last pbuf in unsent. */
354   uint16_t unsent_oversize;
355 #endif /* TCP_OVERSIZE */ 
356
357   /* These are ordered by sequence number: */
358   struct tcp_seg *unsent;   /* Unsent (queued) segments. */
359   struct tcp_seg *unacked;  /* Sent but unacknowledged segments. */
360 #if TCP_QUEUE_OOSEQ  
361   struct tcp_seg *ooseq;    /* Received out of sequence segments. */
362 #endif /* TCP_QUEUE_OOSEQ */
363
364   struct pbuf *refused_data; /* Data previously received but not yet taken by upper layer */
365
366   /* Function to be called when more send buffer space is available. */
367   tcp_sent_fn sent;
368   /* Function to be called when (in-sequence) data has arrived. */
369   tcp_recv_fn recv;
370   /* Function to be called when a connection has been set up. */
371   tcp_connected_fn connected;
372   /* Function which is called periodically. */
373   tcp_poll_fn poll;
374   /* Function to be called whenever a fatal error occurs. */
375   tcp_err_fn errf;
376
377 #if LWIP_TCP_TIMESTAMPS
378   uint32_t ts_lastacksent;
379   uint32_t ts_recent;
380 #endif /* LWIP_TCP_TIMESTAMPS */
381
382   /* idle time before KEEPALIVE is sent */
383   uint32_t keep_idle;
384 #if LWIP_TCP_KEEPALIVE
385   uint32_t keep_intvl;
386   uint32_t keep_cnt;
387 #endif /* LWIP_TCP_KEEPALIVE */
388   
389   /* Persist timer counter */
390   uint32_t persist_cnt;
391   /* Persist timer back-off */
392   uint8_t persist_backoff;
393
394   /* KEEPALIVE counter */
395   uint8_t keep_cnt_sent;
396 };
397
398 struct tcp_pcb_listen {  
399         IP_PCB;
400 /* Protocol specific PCB members */
401   TCP_PCB_COMMON(struct tcp_pcb_listen);
402
403 #if TCP_LISTEN_BACKLOG
404   uint8_t backlog;
405   uint8_t accepts_pending;
406 #endif /* TCP_LISTEN_BACKLOG */
407 };
408
409 #if 0 //LWIP_EVENT_API
410
411 enum lwip_event {
412   LWIP_EVENT_ACCEPT,
413   LWIP_EVENT_SENT,
414   LWIP_EVENT_RECV,
415   LWIP_EVENT_CONNECTED,
416   LWIP_EVENT_POLL,
417   LWIP_EVENT_ERR
418 };
419
420 error_t lwip_tcp_event(void *arg, struct tcp_pcb *pcb,
421          enum lwip_event,
422          struct pbuf *p,
423          uint16_t size,
424          error_t err);
425
426 #endif /* LWIP_EVENT_API */
427
428 /* Application program's interface: */
429 struct tcp_pcb * tcp_new (void);
430 error_t tcp_bind(struct tcp_pcb *pcb, const struct in_addr *ipaddr, uint16_t port);
431 void             tcp_abort (struct tcp_pcb *pcb);
432
433 void             tcp_arg     (struct tcp_pcb *pcb, void *arg);
434 void             tcp_accept  (struct tcp_pcb *pcb, tcp_accept_fn accept);
435 void             tcp_recv    (struct tcp_pcb *pcb, tcp_recv_fn recv);
436 void             tcp_sent    (struct tcp_pcb *pcb, tcp_sent_fn sent);
437 void             tcp_poll    (struct tcp_pcb *pcb, tcp_poll_fn poll, uint8_t interval);
438 void             tcp_err     (struct tcp_pcb *pcb, tcp_err_fn err);
439
440 #define          tcp_mss(pcb)             (((pcb)->flags & TF_TIMESTAMP) ? ((pcb)->mss - 12)  : (pcb)->mss)
441 #define          tcp_sndbuf(pcb)          ((pcb)->snd_buf)
442 #define          tcp_sndqueuelen(pcb)     ((pcb)->snd_queuelen)
443 #define          tcp_nagle_disable(pcb)   ((pcb)->flags |= TF_NODELAY)
444 #define          tcp_nagle_enable(pcb)    ((pcb)->flags &= ~TF_NODELAY)
445 #define          tcp_nagle_disabled(pcb)  (((pcb)->flags & TF_NODELAY) != 0)
446
447 #if TCP_LISTEN_BACKLOG
448 #define          tcp_accepted(pcb) do { \
449   LWIP_ASSERT("pcb->state == LISTEN (called for wrong pcb?)", pcb->state == LISTEN); \
450   (((struct tcp_pcb_listen *)(pcb))->accepts_pending--); } while(0)
451 #else  /* TCP_LISTEN_BACKLOG */
452 #define          tcp_accepted(pcb) LWIP_ASSERT("pcb->state == LISTEN (called for wrong pcb?)", \
453                                                pcb->state == LISTEN)
454 #endif /* TCP_LISTEN_BACKLOG */
455
456 void             tcp_recved  (struct tcp_pcb *pcb, uint16_t len);
457 error_t            tcp_connect (struct tcp_pcb *pcb, ip_addr_t *ipaddr,
458                               uint16_t port, tcp_connected_fn connected);
459
460 struct tcp_pcb * tcp_listen_with_backlog(struct tcp_pcb *pcb, uint8_t backlog);
461 #define          tcp_listen(pcb) tcp_listen_with_backlog(pcb, TCP_DEFAULT_LISTEN_BACKLOG)
462
463 error_t            tcp_close   (struct tcp_pcb *pcb);
464 error_t            tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx);
465
466 /* Flags for "apiflags" parameter in tcp_write */
467 #define TCP_WRITE_FLAG_COPY 0x01
468 #define TCP_WRITE_FLAG_MORE 0x02
469
470 error_t            tcp_write   (struct tcp_pcb *pcb, const void *dataptr, uint16_t len,
471                               uint8_t apiflags);
472
473 void             tcp_setprio (struct tcp_pcb *pcb, uint8_t prio);
474
475 #define TCP_PRIO_MIN    1
476 #define TCP_PRIO_NORMAL 64
477 #define TCP_PRIO_MAX    127
478
479 error_t            tcp_output  (struct tcp_pcb *pcb);
480
481
482 const char* tcp_debug_state_str(enum tcp_state s);
483
484 #ifdef __cplusplus
485 }
486 #endif
487
488 #endif
489
490