- c->snd.una = hdr.ack;
- break;
- case ESTABLISHED:
- case CLOSE_WAIT:
- if(seqdiff(hdr.ack, c->snd.una) < 0)
- return 0;
- if(seqdiff(hdr.ack, c->snd.nxt) > 0)
- goto ack_and_drop;
- if(seqdiff(hdr.ack, c->snd.una) > 0 && seqdiff(hdr.ack, c->snd.nxt) <= 0) {
- c->snd.una = hdr.ack;
- if(seqdiff(c->snd.wl1, hdr.seq) < 0 || (c->snd.wl1 == hdr.seq && seqdiff(c->snd.wl2, hdr.ack) <= 0)) {
- c->snd.wnd = hdr.wnd;
- c->snd.wl1 = hdr.seq;
- c->snd.wl2 = hdr.ack;
- }
- }
- break;
- case FIN_WAIT_1:
- if(hdr.ack == c->snd.nxt)
- set_state(c, FIN_WAIT_2);
- break;
- case FIN_WAIT_2:
- // TODO: If nothing left to send, close.
- break;
- case CLOSING:
- if(hdr.ack == c->snd.nxt) {
- set_state(c, TIME_WAIT);
- }
- break;
- case LAST_ACK:
- if(hdr.ack == c->snd.nxt) {
+ // Are we still LISTENing?
+ if(utcp->accept)
+ utcp->accept(c, c->src);
+
+ if(c->state != ESTABLISHED) {