]> git.meshlink.io Git - utcp/blob - utcp.c
Various small fixes, clarifications.
[utcp] / utcp.c
1 /*
2     utcp.c -- Userspace TCP
3     Copyright (C) 2014 Guus Sliepen <guus@tinc-vpn.org>
4
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14
15     You should have received a copy of the GNU General Public License along
16     with this program; if not, write to the Free Software Foundation, Inc.,
17     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20 #define _GNU_SOURCE
21
22 #include <assert.h>
23 #include <errno.h>
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <stdint.h>
27 #include <stdbool.h>
28 #include <string.h>
29 #include <unistd.h>
30 #include <sys/time.h>
31 #include <sys/socket.h>
32
33 #include "utcp_priv.h"
34
35 #ifdef UTCP_DEBUG
36 #include <stdarg.h>
37
38 static void debug(const char *format, ...) {
39         va_list ap;
40         va_start(ap, format);
41         vfprintf(stderr, format, ap);
42         va_end(ap);
43 }
44
45 static void print_packet(struct utcp *utcp, const char *dir, const void *pkt, size_t len) {
46         struct hdr hdr;
47         if(len < sizeof hdr) {
48                 debug("%p %s: short packet (%zu bytes)\n", utcp, dir, len);
49                 return;
50         }
51
52         memcpy(&hdr, pkt, sizeof hdr);
53         fprintf (stderr, "%p %s: len=%zu, src=%u dst=%u seq=%u ack=%u wnd=%u ctl=", utcp, dir, len, hdr.src, hdr.dst, hdr.seq, hdr.ack, hdr.wnd);
54         if(hdr.ctl & SYN)
55                 debug("SYN");
56         if(hdr.ctl & RST)
57                 debug("RST");
58         if(hdr.ctl & FIN)
59                 debug("FIN");
60         if(hdr.ctl & ACK)
61                 debug("ACK");
62
63         if(len > sizeof hdr) {
64                 debug(" data=");
65                 for(int i = sizeof hdr; i < len; i++) {
66                         const char *data = pkt;
67                         debug("%c", data[i] >= 32 ? data[i] : '.');
68                 }
69         }
70
71         debug("\n");
72 }
73 #else
74 #define debug(...)
75 #define print_packet(...)
76 #endif
77
78 static void set_state(struct utcp_connection *c, enum state state) {
79         c->state = state;
80         if(state == ESTABLISHED)
81                 timerclear(&c->conn_timeout);
82         debug("%p new state: %s\n", c->utcp, strstate[state]);
83 }
84
85 static inline void list_connections(struct utcp *utcp) {
86         debug("%p has %d connections:\n", utcp, utcp->nconnections);
87         for(int i = 0; i < utcp->nconnections; i++)
88                 debug("  %u -> %u state %s\n", utcp->connections[i]->src, utcp->connections[i]->dst, strstate[utcp->connections[i]->state]);
89 }
90
91 static int32_t seqdiff(uint32_t a, uint32_t b) {
92         return a - b;
93 }
94
95 // Connections are stored in a sorted list.
96 // This gives O(log(N)) lookup time, O(N log(N)) insertion time and O(N) deletion time.
97
98 static int compare(const void *va, const void *vb) {
99         const struct utcp_connection *a = *(struct utcp_connection **)va;
100         const struct utcp_connection *b = *(struct utcp_connection **)vb;
101
102         assert(a->src && b->src);
103
104         int c = (int)a->src - (int)b->src;
105         if(c)
106                 return c;
107         c = (int)a->dst - (int)b->dst;
108         return c;
109 }
110
111 static struct utcp_connection *find_connection(const struct utcp *utcp, uint16_t src, uint16_t dst) {
112         if(!utcp->nconnections)
113                 return NULL;
114         struct utcp_connection key = {
115                 .src = src,
116                 .dst = dst,
117         }, *keyp = &key;
118         struct utcp_connection **match = bsearch(&keyp, utcp->connections, utcp->nconnections, sizeof *utcp->connections, compare);
119         return match ? *match : NULL;
120 }
121
122 static void free_connection(struct utcp_connection *c) {
123         struct utcp *utcp = c->utcp;
124         struct utcp_connection **cp = bsearch(&c, utcp->connections, utcp->nconnections, sizeof *utcp->connections, compare);
125
126         assert(cp);
127
128         int i = cp - utcp->connections;
129         memmove(cp + i, cp + i + 1, (utcp->nconnections - i - 1) * sizeof *cp);
130         utcp->nconnections--;
131
132         free(c->sndbuf);
133         free(c);
134 }
135
136 static struct utcp_connection *allocate_connection(struct utcp *utcp, uint16_t src, uint16_t dst) {
137         // Check whether this combination of src and dst is free
138
139         if(src) {
140                 if(find_connection(utcp, src, dst)) {
141                         errno = EADDRINUSE;
142                         return NULL;
143                 }
144         } else { // If src == 0, generate a random port number with the high bit set
145                 if(utcp->nconnections >= 32767) {
146                         errno = ENOMEM;
147                         return NULL;
148                 }
149                 src = rand() | 0x8000;
150                 while(find_connection(utcp, src, dst))
151                         src++;
152         }
153
154         // Allocate memory for the new connection
155
156         if(utcp->nconnections >= utcp->nallocated) {
157                 if(!utcp->nallocated)
158                         utcp->nallocated = 4;
159                 else
160                         utcp->nallocated *= 2;
161                 struct utcp_connection **new_array = realloc(utcp->connections, utcp->nallocated * sizeof *utcp->connections);
162                 if(!new_array)
163                         return NULL;
164                 utcp->connections = new_array;
165         }
166
167         struct utcp_connection *c = calloc(1, sizeof *c);
168         if(!c)
169                 return NULL;
170
171         c->sndbufsize = DEFAULT_SNDBUFSIZE;
172         c->maxsndbufsize = DEFAULT_MAXSNDBUFSIZE;
173         c->sndbuf = malloc(c->sndbufsize);
174         if(!c->sndbuf) {
175                 free(c);
176                 return NULL;
177         }
178
179         // Fill in the details
180
181         c->src = src;
182         c->dst = dst;
183         c->snd.iss = rand();
184         c->snd.una = c->snd.iss;
185         c->snd.nxt = c->snd.iss + 1;
186         c->rcv.wnd = utcp->mtu;
187         c->snd.last = c->snd.nxt;
188         c->snd.cwnd = utcp->mtu;
189         c->utcp = utcp;
190
191         // Add it to the sorted list of connections
192
193         utcp->connections[utcp->nconnections++] = c;
194         qsort(utcp->connections, utcp->nconnections, sizeof *utcp->connections, compare);
195
196         return c;
197 }
198
199 struct utcp_connection *utcp_connect(struct utcp *utcp, uint16_t dst, utcp_recv_t recv, void *priv) {
200         struct utcp_connection *c = allocate_connection(utcp, 0, dst);
201         if(!c)
202                 return NULL;
203
204         c->recv = recv;
205
206         struct hdr hdr;
207
208         hdr.src = c->src;
209         hdr.dst = c->dst;
210         hdr.seq = c->snd.iss;
211         hdr.ack = 0;
212         hdr.wnd = c->rcv.wnd;
213         hdr.ctl = SYN;
214         hdr.aux = 0;
215
216         set_state(c, SYN_SENT);
217
218         print_packet(utcp, "send", &hdr, sizeof hdr);
219         utcp->send(utcp, &hdr, sizeof hdr);
220
221         gettimeofday(&c->conn_timeout, NULL);
222         c->conn_timeout.tv_sec += utcp->timeout;
223
224         return c;
225 }
226
227 void utcp_accept(struct utcp_connection *c, utcp_recv_t recv, void *priv) {
228         if(c->reapable || c->state != SYN_RECEIVED) {
229                 debug("Error: accept() called on invalid connection %p in state %s\n", c, strstate[c->state]);
230                 return;
231         }
232
233         debug("%p accepted, %p %p\n", c, recv, priv);
234         c->recv = recv;
235         c->priv = priv;
236         set_state(c, ESTABLISHED);
237 }
238
239 static void ack(struct utcp_connection *c, bool sendatleastone) {
240         int32_t left = seqdiff(c->snd.last, c->snd.nxt);
241         int32_t cwndleft = c->snd.cwnd - seqdiff(c->snd.nxt, c->snd.una);
242         char *data = c->sndbuf + seqdiff(c->snd.nxt, c->snd.una);
243
244         assert(left >= 0);
245
246         if(cwndleft <= 0)
247                 cwndleft = 0;
248
249         if(cwndleft < left)
250                 left = cwndleft;
251
252         if(!left && !sendatleastone)
253                 return;
254
255         struct {
256                 struct hdr hdr;
257                 char data[c->utcp->mtu];
258         } pkt;
259
260         pkt.hdr.src = c->src;
261         pkt.hdr.dst = c->dst;
262         pkt.hdr.ack = c->rcv.nxt;
263         pkt.hdr.wnd = c->snd.wnd;
264         pkt.hdr.ctl = ACK;
265         pkt.hdr.aux = 0;
266
267         do {
268                 uint32_t seglen = left > c->utcp->mtu ? c->utcp->mtu : left;
269                 pkt.hdr.seq = c->snd.nxt;
270
271                 memcpy(pkt.data, data, seglen);
272
273                 c->snd.nxt += seglen;
274                 data += seglen;
275                 left -= seglen;
276
277                 if(c->state != ESTABLISHED && !left && seglen) {
278                         switch(c->state) {
279                         case FIN_WAIT_1:
280                         case CLOSING:
281                                 seglen--;
282                                 pkt.hdr.ctl |= FIN;
283                                 break;
284                         default:
285                                 break;
286                         }
287                 }
288
289                 print_packet(c->utcp, "send", &pkt, sizeof pkt.hdr + seglen);
290                 c->utcp->send(c->utcp, &pkt, sizeof pkt.hdr + seglen);
291         } while(left);
292 }
293
294 ssize_t utcp_send(struct utcp_connection *c, const void *data, size_t len) {
295         if(c->reapable) {
296                 debug("Error: send() called on closed connection %p\n", c);
297                 errno = EBADF;
298                 return -1;
299         }
300
301         switch(c->state) {
302         case CLOSED:
303         case LISTEN:
304         case SYN_SENT:
305         case SYN_RECEIVED:
306                 debug("Error: send() called on unconnected connection %p\n", c);
307                 errno = ENOTCONN;
308                 return -1;
309         case ESTABLISHED:
310         case CLOSE_WAIT:
311                 break;
312         case FIN_WAIT_1:
313         case FIN_WAIT_2:
314         case CLOSING:
315         case LAST_ACK:
316         case TIME_WAIT:
317                 debug("Error: send() called on closing connection %p\n", c);
318                 errno = EPIPE;
319                 return -1;
320         }
321
322         // Add data to send buffer
323
324         if(!len)
325                 return 0;
326
327         if(!data) {
328                 errno = EFAULT;
329                 return -1;
330         }
331
332         uint32_t bufused = seqdiff(c->snd.nxt, c->snd.una);
333
334         /* Check our send buffer.
335          * - If it's big enough, just put the data in there.
336          * - If not, decide whether to enlarge if possible.
337          * - Cap len so it doesn't overflow our buffer.
338          */
339
340         if(len > c->sndbufsize - bufused && c->sndbufsize < c->maxsndbufsize) {
341                 uint32_t newbufsize;
342                 if(c->sndbufsize > c->maxsndbufsize / 2)
343                         newbufsize = c->maxsndbufsize;
344                 else
345                         newbufsize = c->sndbufsize * 2;
346                 if(bufused + len > newbufsize) {
347                         if(bufused + len > c->maxsndbufsize)
348                                 newbufsize = c->maxsndbufsize;
349                         else
350                                 newbufsize = bufused + len;
351                 }
352                 char *newbuf = realloc(c->sndbuf, newbufsize);
353                 if(newbuf) {
354                         c->sndbuf = newbuf;
355                         c->sndbufsize = newbufsize;
356                 }
357         }
358
359         if(len > c->sndbufsize - bufused)
360                 len = c->sndbufsize - bufused;
361
362         if(!len) {
363                 errno == EWOULDBLOCK;
364                 return 0;
365         }
366
367         memcpy(c->sndbuf + bufused, data, len);
368         c->snd.last += len;
369
370         ack(c, false);
371         return len;
372 }
373
374 static void swap_ports(struct hdr *hdr) {
375         uint16_t tmp = hdr->src;
376         hdr->src = hdr->dst;
377         hdr->dst = tmp;
378 }
379
380 ssize_t utcp_recv(struct utcp *utcp, const void *data, size_t len) {
381         if(!utcp) {
382                 errno = EFAULT;
383                 return -1;
384         }
385
386         if(!len)
387                 return 0;
388
389         if(!data) {
390                 errno = EFAULT;
391                 return -1;
392         }
393
394         print_packet(utcp, "recv", data, len);
395
396         // Drop packets smaller than the header
397
398         struct hdr hdr;
399         if(len < sizeof hdr) {
400                 errno = EBADMSG;
401                 return -1;
402         }
403
404         // Make a copy from the potentially unaligned data to a struct hdr
405
406         memcpy(&hdr, data, sizeof hdr);
407         data += sizeof hdr;
408         len -= sizeof hdr;
409
410         // Drop packets with an unknown CTL flag
411
412         if(hdr.ctl & ~(SYN | ACK | RST | FIN)) {
413                 errno = EBADMSG;
414                 return -1;
415         }
416
417         // Try to match the packet to an existing connection
418
419         struct utcp_connection *c = find_connection(utcp, hdr.dst, hdr.src);
420
421         // Is it for a new connection?
422
423         if(!c) {
424                 // Ignore RST packets
425
426                 if(hdr.ctl & RST)
427                         return 0;
428
429                 // Is it a SYN packet and are we LISTENing?
430
431                 if(hdr.ctl & SYN && !(hdr.ctl & ACK) && utcp->accept) {
432                         // If we don't want to accept it, send a RST back
433                         if((utcp->pre_accept && !utcp->pre_accept(utcp, hdr.dst))) {
434                                 len = 1;
435                                 goto reset;
436                         }
437
438                         // Try to allocate memory, otherwise send a RST back
439                         c = allocate_connection(utcp, hdr.dst, hdr.src);
440                         if(!c) {
441                                 len = 1;
442                                 goto reset;
443                         }
444
445                         // Return SYN+ACK, go to SYN_RECEIVED state
446                         c->snd.wnd = hdr.wnd;
447                         c->rcv.irs = hdr.seq;
448                         c->rcv.nxt = c->rcv.irs + 1;
449                         set_state(c, SYN_RECEIVED);
450
451                         hdr.dst = c->dst;
452                         hdr.src = c->src;
453                         hdr.ack = c->rcv.irs + 1;
454                         hdr.seq = c->snd.iss;
455                         hdr.ctl = SYN | ACK;
456                         print_packet(c->utcp, "send", &hdr, sizeof hdr);
457                         utcp->send(utcp, &hdr, sizeof hdr);
458                 } else {
459                         // No, we don't want your packets, send a RST back
460                         len = 1;
461                         goto reset;
462                 }
463
464                 return 0;
465         }
466
467         debug("%p state %s\n", c->utcp, strstate[c->state]);
468
469         // In case this is for a CLOSED connection, ignore the packet.
470         // TODO: make it so incoming packets can never match a CLOSED connection.
471
472         if(c->state == CLOSED)
473                 return 0;
474
475         // It is for an existing connection.
476
477         // 1. Drop invalid packets.
478
479         // 1a. Drop packets that should not happen in our current state.
480
481         switch(c->state) {
482         case SYN_SENT:
483         case SYN_RECEIVED:
484         case ESTABLISHED:
485         case FIN_WAIT_1:
486         case FIN_WAIT_2:
487         case CLOSE_WAIT:
488         case CLOSING:
489         case LAST_ACK:
490         case TIME_WAIT:
491                 break;
492         default:
493                 abort();
494         }
495
496         // 1b. Drop packets with a sequence number not in our receive window.
497
498         bool acceptable;
499
500         if(c->state == SYN_SENT)
501                 acceptable = true;
502
503         // TODO: handle packets overlapping c->rcv.nxt.
504 #if 0
505         // Only use this when accepting out-of-order packets.
506         else if(len == 0)
507                 if(c->rcv.wnd == 0)
508                         acceptable = hdr.seq == c->rcv.nxt;
509                 else
510                         acceptable = (seqdiff(hdr.seq, c->rcv.nxt) >= 0 && seqdiff(hdr.seq, c->rcv.nxt + c->rcv.wnd) < 0);
511         else
512                 if(c->rcv.wnd == 0)
513                         // We don't accept data when the receive window is zero.
514                         acceptable = false;
515                 else
516                         // Both start and end of packet must be within the receive window
517                         acceptable = (seqdiff(hdr.seq, c->rcv.nxt) >= 0 && seqdiff(hdr.seq, c->rcv.nxt + c->rcv.wnd) < 0)
518                                 || (seqdiff(hdr.seq + len + 1, c->rcv.nxt) >= 0 && seqdiff(hdr.seq + len - 1, c->rcv.nxt + c->rcv.wnd) < 0);
519 #else
520         if(c->state != SYN_SENT)
521                 acceptable = hdr.seq == c->rcv.nxt;
522 #endif
523
524         if(!acceptable) {
525                 debug("Packet not acceptable, %u  <= %u + %zu < %u\n", c->rcv.nxt, hdr.seq, len, c->rcv.nxt + c->rcv.wnd);
526                 // Ignore unacceptable RST packets.
527                 if(hdr.ctl & RST)
528                         return 0;
529                 // Otherwise, send an ACK back in the hope things improve.
530                 goto ack;
531         }
532
533         c->snd.wnd = hdr.wnd; // TODO: move below
534
535         // 1c. Drop packets with an invalid ACK.
536         // ackno should not roll back, and it should also not be bigger than snd.nxt.
537
538         if(hdr.ctl & ACK && (seqdiff(hdr.ack, c->snd.nxt) > 0 || seqdiff(hdr.ack, c->snd.una) < 0)) {
539                 debug("Packet ack seqno out of range, %u %u %u\n", hdr.ack, c->snd.una, c->snd.nxt);
540                 // Ignore unacceptable RST packets.
541                 if(hdr.ctl & RST)
542                         return 0;
543                 goto reset;
544         }
545
546         // 2. Handle RST packets
547
548         if(hdr.ctl & RST) {
549                 switch(c->state) {
550                 case SYN_SENT:
551                         if(!(hdr.ctl & ACK))
552                                 return 0;
553                         // The peer has refused our connection.
554                         set_state(c, CLOSED);
555                         errno = ECONNREFUSED;
556                         if(c->recv)
557                                 c->recv(c, NULL, 0);
558                         return 0;
559                 case SYN_RECEIVED:
560                         if(hdr.ctl & ACK)
561                                 return 0;
562                         // We haven't told the application about this connection yet. Silently delete.
563                         free_connection(c);
564                         return 0;
565                 case ESTABLISHED:
566                 case FIN_WAIT_1:
567                 case FIN_WAIT_2:
568                 case CLOSE_WAIT:
569                         if(hdr.ctl & ACK)
570                                 return 0;
571                         // The peer has aborted our connection.
572                         set_state(c, CLOSED);
573                         errno = ECONNRESET;
574                         if(c->recv)
575                                 c->recv(c, NULL, 0);
576                         return 0;
577                 case CLOSING:
578                 case LAST_ACK:
579                 case TIME_WAIT:
580                         if(hdr.ctl & ACK)
581                                 return 0;
582                         // As far as the application is concerned, the connection has already been closed.
583                         // If it has called utcp_close() already, we can immediately free this connection.
584                         if(c->reapable) {
585                                 free_connection(c);
586                                 return 0;
587                         }
588                         // Otherwise, immediately move to the CLOSED state.
589                         set_state(c, CLOSED);
590                         return 0;
591                 default:
592                         abort();
593                 }
594         }
595
596         // 3. Advance snd.una
597
598         uint32_t advanced = seqdiff(hdr.ack, c->snd.una);
599         c->snd.una = hdr.ack;
600
601         if(advanced) {
602                 debug("%p advanced %u\n", utcp, advanced);
603                 // Make room in the send buffer.
604                 // TODO: try to avoid memmoving too much. Circular buffer?
605                 uint32_t left = seqdiff(c->snd.nxt, hdr.ack);
606                 if(left)
607                         memmove(c->sndbuf, c->sndbuf + advanced, left);
608                 c->dupack = 0;
609                 c->snd.cwnd += utcp->mtu;
610                 if(c->snd.cwnd > c->maxsndbufsize)
611                         c->snd.cwnd = c->maxsndbufsize;
612                 debug("%p increasing cwnd to %u\n", utcp, c->snd.cwnd);
613
614                 // Check if we have sent a FIN that is now ACKed.
615                 switch(c->state) {
616                 case FIN_WAIT_1:
617                         if(c->snd.una == c->snd.last)
618                                 set_state(c, FIN_WAIT_2);
619                         break;
620                 case CLOSING:
621                         if(c->snd.una == c->snd.last) {
622                                 gettimeofday(&c->conn_timeout, NULL);
623                                 c->conn_timeout.tv_sec += 60;
624                                 set_state(c, TIME_WAIT);
625                         }
626                         break;
627                 default:
628                         break;
629                 }
630         } else {
631                 if(!len) {
632                         c->dupack++;
633                         if(c->dupack >= 3) {
634                                 debug("Triplicate ACK\n");
635                                 //TODO: Resend one packet and go to fast recovery mode. See RFC 6582.
636                                 //abort();
637                         }
638                 }
639         }
640
641         // 4. Update timers
642
643         if(advanced) {
644                 timerclear(&c->conn_timeout); // It will be set anew in utcp_timeout() if c->snd.una != c->snd.nxt.
645                 if(c->snd.una == c->snd.nxt)
646                         timerclear(&c->rtrx_timeout);
647         }
648
649         // 5. Process SYN stuff
650
651         if(hdr.ctl & SYN) {
652                 switch(c->state) {
653                 case SYN_SENT:
654                         // This is a SYNACK. It should always have ACKed the SYN.
655                         if(!advanced)
656                                 goto reset;
657                         c->rcv.irs = hdr.seq;
658                         c->rcv.nxt = hdr.seq;
659                         set_state(c, ESTABLISHED);
660                         // TODO: notify application of this somehow.
661                         break;
662                 case SYN_RECEIVED:
663                 case ESTABLISHED:
664                 case FIN_WAIT_1:
665                 case FIN_WAIT_2:
666                 case CLOSE_WAIT:
667                 case CLOSING:
668                 case LAST_ACK:
669                 case TIME_WAIT:
670                         // Ehm, no. We should never receive a second SYN.
671                         goto reset;
672                 default:
673                         abort();
674                 }
675
676                 // SYN counts as one sequence number
677                 c->rcv.nxt++;
678         }
679
680         // 6. Process new data
681
682         if(c->state == SYN_RECEIVED) {
683                 // This is the ACK after the SYNACK. It should always have ACKed the SYNACK.
684                 if(!advanced)
685                         goto reset;
686
687                 // Are we still LISTENing?
688                 if(utcp->accept)
689                         utcp->accept(c, c->src);
690
691                 if(c->state != ESTABLISHED) {
692                         set_state(c, CLOSED);
693                         c->reapable = true;
694                         goto reset;
695                 }
696         }
697
698         if(len) {
699                 switch(c->state) {
700                 case SYN_SENT:
701                 case SYN_RECEIVED:
702                         // This should never happen.
703                         abort();
704                 case ESTABLISHED:
705                 case FIN_WAIT_1:
706                 case FIN_WAIT_2:
707                         break;
708                 case CLOSE_WAIT:
709                 case CLOSING:
710                 case LAST_ACK:
711                 case TIME_WAIT:
712                         // Ehm no, We should never receive more data after a FIN.
713                         goto reset;
714                 default:
715                         abort();
716                 }
717
718                 ssize_t rxd;
719
720                 if(c->recv) {
721                         rxd = c->recv(c, data, len);
722                         if(rxd != len) {
723                                 // TODO: once we have a receive buffer, handle the application not accepting all data.
724                                 fprintf(stderr, "c->recv(%p, %p, %zu) returned %zd\n", c, data, len, rxd);
725                                 abort();
726                         }
727                         if(rxd < 0)
728                                 rxd = 0;
729                         else if(rxd > len)
730                                 rxd = len; // Bad application, bad!
731                 } else {
732                         rxd = len;
733                 }
734
735                 c->rcv.nxt += len;
736         }
737
738         // 7. Process FIN stuff
739
740         if(hdr.ctl & FIN) {
741                 switch(c->state) {
742                 case SYN_SENT:
743                 case SYN_RECEIVED:
744                         // This should never happen.
745                         abort();
746                 case ESTABLISHED:
747                         set_state(c, CLOSE_WAIT);
748                         break;
749                 case FIN_WAIT_1:
750                         set_state(c, CLOSING);
751                         break;
752                 case FIN_WAIT_2:
753                         gettimeofday(&c->conn_timeout, NULL);
754                         c->conn_timeout.tv_sec += 60;
755                         set_state(c, TIME_WAIT);
756                         break;
757                 case CLOSE_WAIT:
758                 case CLOSING:
759                 case LAST_ACK:
760                 case TIME_WAIT:
761                         // Ehm, no. We should never receive a second FIN.
762                         goto reset;
763                 default:
764                         abort();
765                 }
766
767                 // FIN counts as one sequence number
768                 c->rcv.nxt++;
769                 len++;
770
771                 // Inform the application that the peer closed the connection.
772                 if(c->recv) {
773                         errno = 0;
774                         c->recv(c, NULL, 0);
775                 }
776         }
777
778         if(!len && !advanced)
779                 return 0;
780
781         if(!len && !(hdr.ctl & SYN) && !(hdr.ctl & FIN))
782                 return 0;
783
784 ack:
785         ack(c, true);
786         return 0;
787
788 reset:
789         swap_ports(&hdr);
790         hdr.wnd = 0;
791         if(hdr.ctl & ACK) {
792                 hdr.seq = hdr.ack;
793                 hdr.ctl = RST;
794         } else {
795                 hdr.ack = hdr.seq + len;
796                 hdr.seq = 0;
797                 hdr.ctl = RST | ACK;
798         }
799         print_packet(utcp, "send", &hdr, sizeof hdr);
800         utcp->send(utcp, &hdr, sizeof hdr);
801         return 0;
802
803 }
804
805 int utcp_shutdown(struct utcp_connection *c, int dir) {
806         debug("%p shutdown %d\n", c ? c->utcp : NULL, dir);
807         if(!c) {
808                 errno = EFAULT;
809                 return -1;
810         }
811
812         if(c->reapable) {
813                 debug("Error: shutdown() called on closed connection %p\n", c);
814                 errno = EBADF;
815                 return -1;
816         }
817
818         // TODO: handle dir
819
820         switch(c->state) {
821         case CLOSED:
822                 return 0;
823         case LISTEN:
824         case SYN_SENT:
825                 set_state(c, CLOSED);
826                 return 0;
827
828         case SYN_RECEIVED:
829         case ESTABLISHED:
830                 set_state(c, FIN_WAIT_1);
831                 break;
832         case FIN_WAIT_1:
833         case FIN_WAIT_2:
834                 return 0;
835         case CLOSE_WAIT:
836                 set_state(c, CLOSING);
837                 break;
838
839         case CLOSING:
840         case LAST_ACK:
841         case TIME_WAIT:
842                 return 0;
843         }
844
845         c->snd.last++;
846
847         ack(c, false);
848         return 0;
849 }
850
851 int utcp_close(struct utcp_connection *c) {
852         if(utcp_shutdown(c, SHUT_RDWR))
853                 return -1;
854         c->reapable = true;
855         return 0;
856 }
857
858 int utcp_abort(struct utcp_connection *c) {
859         if(!c) {
860                 errno = EFAULT;
861                 return -1;
862         }
863
864         if(c->reapable) {
865                 debug("Error: abort() called on closed connection %p\n", c);
866                 errno = EBADF;
867                 return -1;
868         }
869
870         c->reapable = true;
871
872         switch(c->state) {
873         case CLOSED:
874                 return 0;
875         case LISTEN:
876         case SYN_SENT:
877         case CLOSING:
878         case LAST_ACK:
879         case TIME_WAIT:
880                 set_state(c, CLOSED);
881                 return 0;
882
883         case SYN_RECEIVED:
884         case ESTABLISHED:
885         case FIN_WAIT_1:
886         case FIN_WAIT_2:
887         case CLOSE_WAIT:
888                 set_state(c, CLOSED);
889                 break;
890         }
891
892         // Send RST
893
894         struct hdr hdr;
895
896         hdr.src = c->src;
897         hdr.dst = c->dst;
898         hdr.seq = c->snd.nxt;
899         hdr.ack = 0;
900         hdr.wnd = 0;
901         hdr.ctl = RST;
902
903         print_packet(c->utcp, "send", &hdr, sizeof hdr);
904         c->utcp->send(c->utcp, &hdr, sizeof hdr);
905         return 0;
906 }
907
908 static void retransmit(struct utcp_connection *c) {
909         if(c->state == CLOSED || c->snd.nxt == c->snd.una)
910                 return;
911
912         struct utcp *utcp = c->utcp;
913
914         struct {
915                 struct hdr hdr;
916                 char data[c->utcp->mtu];
917         } pkt;
918
919         pkt.hdr.src = c->src;
920         pkt.hdr.dst = c->dst;
921
922         switch(c->state) {
923                 case LISTEN:
924                         // TODO: this should not happen
925                         break;
926
927                 case SYN_SENT:
928                         pkt.hdr.seq = c->snd.iss;
929                         pkt.hdr.ack = 0;
930                         pkt.hdr.wnd = c->rcv.wnd;
931                         pkt.hdr.ctl = SYN;
932                         print_packet(c->utcp, "rtrx", &pkt, sizeof pkt.hdr);
933                         utcp->send(utcp, &pkt, sizeof pkt.hdr);
934                         break;
935
936                 case SYN_RECEIVED:
937                         pkt.hdr.seq = c->snd.nxt;
938                         pkt.hdr.ack = c->rcv.nxt;
939                         pkt.hdr.ctl = SYN | ACK;
940                         print_packet(c->utcp, "rtrx", &pkt, sizeof pkt.hdr);
941                         utcp->send(utcp, &pkt, sizeof pkt.hdr);
942                         break;
943
944                 case ESTABLISHED:
945                 case FIN_WAIT_1:
946                         pkt.hdr.seq = c->snd.una;
947                         pkt.hdr.ack = c->rcv.nxt;
948                         pkt.hdr.ctl = ACK;
949                         uint32_t len = seqdiff(c->snd.nxt, c->snd.una);
950                         if(c->state == FIN_WAIT_1)
951                                 len--;
952                         if(len > utcp->mtu)
953                                 len = utcp->mtu;
954                         else {
955                                 if(c->state == FIN_WAIT_1)
956                                         pkt.hdr.ctl |= FIN;
957                         }
958                         memcpy(pkt.data, c->sndbuf, len);
959                         print_packet(c->utcp, "rtrx", &pkt, sizeof pkt.hdr + len);
960                         utcp->send(utcp, &pkt, sizeof pkt.hdr + len);
961                         break;
962
963                 default:
964                         // TODO: implement
965                         abort();
966         }
967 }
968
969 /* Handle timeouts.
970  * One call to this function will loop through all connections,
971  * checking if something needs to be resent or not.
972  * The return value is the time to the next timeout in milliseconds,
973  * or maybe a negative value if the timeout is infinite.
974  */
975 int utcp_timeout(struct utcp *utcp) {
976         struct timeval now;
977         gettimeofday(&now, NULL);
978         struct timeval next = {now.tv_sec + 3600, now.tv_usec};
979
980         for(int i = 0; i < utcp->nconnections; i++) {
981                 struct utcp_connection *c = utcp->connections[i];
982                 if(!c)
983                         continue;
984
985                 if(c->state == CLOSED) {
986                         if(c->reapable) {
987                                 debug("Reaping %p\n", c);
988                                 free_connection(c);
989                                 i--;
990                         }
991                         continue;
992                 }
993
994                 if(timerisset(&c->conn_timeout) && timercmp(&c->conn_timeout, &now, <)) {
995                         errno = ETIMEDOUT;
996                         c->state = CLOSED;
997                         if(c->recv)
998                                 c->recv(c, NULL, 0);
999                         continue;
1000                 }
1001
1002                 if(timerisset(&c->rtrx_timeout) && timercmp(&c->rtrx_timeout, &now, <)) {
1003                         retransmit(c);
1004                 }
1005
1006                 if(timerisset(&c->conn_timeout) && timercmp(&c->conn_timeout, &next, <))
1007                         next = c->conn_timeout;
1008
1009                 if(c->snd.nxt != c->snd.una) {
1010                         c->rtrx_timeout = now;
1011                         c->rtrx_timeout.tv_sec++;
1012                 } else {
1013                         timerclear(&c->rtrx_timeout);
1014                 }
1015
1016                 if(timerisset(&c->rtrx_timeout) && timercmp(&c->rtrx_timeout, &next, <))
1017                         next = c->rtrx_timeout;
1018         }
1019
1020         struct timeval diff;
1021         timersub(&next, &now, &diff);
1022         if(diff.tv_sec < 0)
1023                 return 0;
1024         return diff.tv_sec * 1000 + diff.tv_usec / 1000;
1025 }
1026
1027 struct utcp *utcp_init(utcp_accept_t accept, utcp_pre_accept_t pre_accept, utcp_send_t send, void *priv) {
1028         struct utcp *utcp = calloc(1, sizeof *utcp);
1029         if(!utcp)
1030                 return NULL;
1031
1032         if(!send) {
1033                 errno = EFAULT;
1034                 return NULL;
1035         }
1036
1037         utcp->accept = accept;
1038         utcp->pre_accept = pre_accept;
1039         utcp->send = send;
1040         utcp->priv = priv;
1041         utcp->mtu = 1000;
1042         utcp->timeout = 60;
1043
1044         return utcp;
1045 }
1046
1047 void utcp_exit(struct utcp *utcp) {
1048         if(!utcp)
1049                 return;
1050         for(int i = 0; i < utcp->nconnections; i++) {
1051                 if(!utcp->connections[i]->reapable)
1052                         debug("Warning, freeing unclosed connection %p\n", utcp->connections[i]);
1053                 free(utcp->connections[i]->sndbuf);
1054                 free(utcp->connections[i]);
1055         }
1056         free(utcp->connections);
1057         free(utcp);
1058 }
1059
1060 uint16_t utcp_get_mtu(struct utcp *utcp) {
1061         return utcp->mtu;
1062 }
1063
1064 void utcp_set_mtu(struct utcp *utcp, uint16_t mtu) {
1065         // TODO: handle overhead of the header
1066         utcp->mtu = mtu;
1067 }
1068
1069 int utcp_get_user_timeout(struct utcp *u) {
1070         return u->timeout;
1071 }
1072
1073 void utcp_set_user_timeout(struct utcp *u, int timeout) {
1074         u->timeout = timeout;
1075 }
1076
1077 size_t utcp_get_sndbuf(struct utcp_connection *c) {
1078         return c->maxsndbufsize;
1079 }
1080
1081 void utcp_set_sndbuf(struct utcp_connection *c, size_t size) {
1082         c->maxsndbufsize = size;
1083         if(c->maxsndbufsize != size)
1084                 c->maxsndbufsize = -1;
1085 }
1086
1087 bool utcp_get_nodelay(struct utcp_connection *c) {
1088         return c->nodelay;
1089 }
1090
1091 void utcp_set_nodelay(struct utcp_connection *c, bool nodelay) {
1092         c->nodelay = nodelay;
1093 }
1094
1095 bool utcp_get_keepalive(struct utcp_connection *c) {
1096         return c->keepalive;
1097 }
1098
1099 void utcp_set_keepalive(struct utcp_connection *c, bool keepalive) {
1100         c->keepalive = keepalive;
1101 }
1102
1103 size_t utcp_get_outq(struct utcp_connection *c) {
1104         return seqdiff(c->snd.nxt, c->snd.una);
1105 }