From 3130b307b52bb59ce2deffbaa1effadf1b8838ec Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Tue, 17 Jun 2014 19:56:52 -0400 Subject: [PATCH] Don't advertise a statevector's existence to upper layers until it is somewhat established --- tcp.rkt | 47 +++++++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/tcp.rkt b/tcp.rkt index e897ea4..c234d24 100644 --- a/tcp.rkt +++ b/tcp.rkt @@ -375,14 +375,20 @@ ;; ConnState -> Gestalt (define (compute-gestalt s) + (define worldward-facing-gestalt + (gestalt-union (sub (tcp-packet #t src-ip src-port dst-ip dst-port ? ? ? ? ? ?)) + (pub (tcp-packet #f dst-ip dst-port src-ip src-port ? ? ? ? ? ?)))) + (define appward-facing-gestalt + (if (conn-state-syn-acked? s) + (gestalt-union (if (not (buffer-finished? (conn-state-inbound s))) + (pub (tcp-channel src dst ?)) + (gestalt-empty)) + (sub (tcp-channel dst src ?)) + (pub (tcp-channel src dst ?) #:level 1)) + (gestalt-empty))) (gestalt-union (sub (timer-expired (timer-name ?) ?)) - (sub (tcp-packet #t src-ip src-port dst-ip dst-port ? ? ? ? ? ?)) - (pub (tcp-packet #f dst-ip dst-port src-ip src-port ? ? ? ? ? ?)) - (sub (tcp-channel dst src ?)) - (if (not (buffer-finished? (conn-state-inbound s))) - (pub (tcp-channel src dst ?)) - (gestalt-empty)) - (pub (tcp-channel src dst ?) #:level 1))) + worldward-facing-gestalt + appward-facing-gestalt)) ;; ConnState -> Transition (define (deliver-inbound-locally s) @@ -411,19 +417,20 @@ ;; Boolean SeqNum -> ConnState -> Transition (define ((discard-acknowledged-outbound ack? ackn) s) - (transition - (if (not ack?) - s - (let* ((b (conn-state-outbound s)) - (limit (seq+ (buffer-seqn b) (bit-string-byte-count (buffer-data b)))) - (ackn (if (seq> ackn limit) limit ackn)) - (dist (seq- ackn (buffer-seqn b)))) - (define remaining-data (bit-string-drop (buffer-data b) (* dist 8))) ;; bit offset! - (struct-copy conn-state s - [outbound (struct-copy buffer b [data remaining-data] [seqn ackn])] - [syn-acked? (or (conn-state-syn-acked? s) - (positive? dist))]))) - '())) + (if (not ack?) + (transition s '()) + (let* ((b (conn-state-outbound s)) + (limit (seq+ (buffer-seqn b) (bit-string-byte-count (buffer-data b)))) + (ackn (if (seq> ackn limit) limit ackn)) + (dist (seq- ackn (buffer-seqn b)))) + (define remaining-data (bit-string-drop (buffer-data b) (* dist 8))) ;; bit offset! + (define new-s (struct-copy conn-state s + [outbound (struct-copy buffer b [data remaining-data] [seqn ackn])] + [syn-acked? (or (conn-state-syn-acked? s) + (positive? dist))])) + (transition new-s + (when (and (not (conn-state-syn-acked? s)) (positive? dist)) + (routing-update (compute-gestalt new-s))))))) ;; Nat -> ConnState -> Transition (define ((update-outbound-window peer-window) s)