diff --git a/simple-udp-service.rkt b/simple-udp-service.rkt index f1a9619..aae6676 100644 --- a/simple-udp-service.rkt +++ b/simple-udp-service.rkt @@ -2,6 +2,7 @@ ;; Simple imperative UDP server harness. +(require racket/match) (require racket/udp) (require "dump-bytes.rkt") @@ -21,8 +22,9 @@ (define (start-udp-service port-number ;; Uint16 packet-classifier ;; UdpPacket -> Maybe - bad-packet-handler ;; UdpPacket ServerState -> ListOf ServerState - good-packet-handler ;; ClassifiedPacket ServerState -> ListOf ServerState + bad-packet-handler ;; UdpPacket ServerState -> ListOf ServerState + good-packet-handler ;; ClassifiedPacket ServerState -> ListOf ServerState + packet-encoder ;; ClassifiedPacket -> UdpPacket initial-state ;; ServerState #:packet-size-limit [packet-size-limit 65536]) @@ -48,7 +50,8 @@ (else (good-packet-handler classified-packet old-state)))) (for-each (lambda (p) - (udp-send-to s (udp-packet-host p) (udp-packet-port p) (udp-packet-body p))) + (match-define (udp-packet body host port) (packet-encoder p)) + (udp-send-to s host port body)) reply-packets) new-state) diff --git a/simplified-driver.rkt b/simplified-driver.rkt index 4451299..d8c9b31 100644 --- a/simplified-driver.rkt +++ b/simplified-driver.rkt @@ -71,6 +71,7 @@ classify-dns-packet (lambda (packet old-state) (values (log-error packet) old-state)) (lambda (message old-state) (values (handle-request soa-rr zone message) old-state)) + encode-dns-packet #f #:packet-size-limit 512)) @@ -79,6 +80,10 @@ (with-handlers ((exn? (lambda (e) #f))) (list (packet->dns-message body) host port))) +(define (encode-dns-packet data) + (match-define (list message host port) data) + (udp-packet (dns-message->packet message) host port)) + ;; UdpPacket -> ListOf (define (log-error packet) (pretty-print `(bad-packet-received ,packet)) @@ -159,9 +164,7 @@ ;; TODO: check opcode and direction in request ;; TODO: think again about multiple questions in one packet (map (lambda (q) - (udp-packet (dns-message->packet (answer-question q make-reply)) - request-host - request-port)) + (list (answer-question q make-reply) request-host request-port)) (dns-message-questions request-message))) (start-server 5555