First steps to getting the driver running with os2.

This commit is contained in:
Tony Garnock-Jones 2012-05-02 18:46:35 -04:00
parent 0f38c940ad
commit fc829f172f
3 changed files with 88 additions and 92 deletions

View File

@ -10,10 +10,9 @@
(require "codec.rkt")
(require "zonedb.rkt")
(require "resolver.rkt")
(require "../racket-matrix/os.rkt")
(require "../racket-matrix/os-big-bang.rkt")
(require "../racket-matrix/os-udp.rkt")
(require "os-dns.rkt")
(require "../racket-matrix/os2.rkt")
(require "../racket-matrix/os2-udp.rkt")
(require "os2-dns.rkt")
;; Instantiated with a SOA record for the zone it is serving as well
;; as a zone's worth of DNS data which is used to answer queries
@ -36,34 +35,24 @@
(define (start-server port-number soa-rr rrs)
;; Compile the zone hash table
(define zone (compile-zone-db (cons soa-rr rrs)))
(pretty-print zone)
(define local-addr (udp-listener port-number))
(define boot-server
(os-big-bang 'no-state
(send-meta-message `(request create-server-socket (udp new ,port-number 512)))
(subscribe/fresh wait-id
(meta-message-handlers w
[`(reply create-server-socket ,s)
(transition w
(unsubscribe wait-id)
(spawn (dns-read-driver s))
(spawn (dns-write-driver s))
(subscribe 'packet-handler (packet-handler s)))]))))
(display ";; Ready.\n")
(define (packet-handler s)
(message-handlers old-state
[(? bad-dns-packet? p)
(log-error (pretty-format p))
;; TODO: ^ perhaps use metalevel events? perhaps don't bother though
old-state]
[(? dns-request? r)
(transition old-state
(map send-message
(handle-request soa-rr zone r)))]))
(ground-vm (os-big-bang (void)
(spawn udp-driver)
(spawn (nested-vm boot-server)))))
(ground-vm
(transition 'no-state
(spawn udp-driver)
(spawn (nested-vm
(transition 'no-state
(spawn (dns-read-driver local-addr))
(spawn (dns-write-driver local-addr))
(role 'error-logger (topic-subscriber (bad-dns-packet (wild) (wild) (wild) (wild)))
#:state w
[p (begin (log-error (pretty-format p))
w)])
(role 'request-booter (topic-subscriber (dns-request (wild) (wild) (wild)))
#:state w
[r (transition w (map send-message (handle-request soa-rr zone r)))])))))))
(define (handle-request soa-rr zone request)
(match-define (dns-request request-message request-source request-sink) request)

View File

@ -1,62 +0,0 @@
#lang racket/base
;; DNS drivers using os-big-bang.rkt and os-udp.rkt.
(require racket/match)
(require "codec.rkt")
(require "../racket-matrix/os-big-bang.rkt")
(require "../racket-matrix/os-udp.rkt")
(provide (struct-out bad-dns-packet)
(struct-out dns-request)
(struct-out dns-reply)
dns-read-driver
dns-write-driver
dns-spy)
(struct bad-dns-packet (detail source sink reason) #:prefab)
(struct dns-request (message source sink) #:prefab)
(struct dns-reply (message source sink) #:prefab)
(define (dns-read-driver s)
(os-big-bang 'no-state
(subscribe 'packet-reader
(meta-message-handlers w
[(udp-packet source (== s) #"")
(log-info "Debug dump packet received")
(transition w
(send-message `(debug-dump)))]
[(udp-packet source (== s) body)
(transition w
(send-message
(with-handlers ((exn:fail? (lambda (e) (bad-dns-packet body source s 'unparseable))))
(define message (packet->dns-message body))
(case (dns-message-direction message)
((request) (dns-request message source s))
((response) (dns-reply message source s))))))]))))
(define (dns-write-driver s)
(define (translate message sink)
(with-handlers ((exn:fail? (lambda (e)
(send-message (bad-dns-packet message s sink 'unencodable)))))
(send-meta-message (udp-packet s sink (dns-message->packet message)))))
(os-big-bang 'no-state
(subscribe 'packet-writer
(message-handlers w
[(dns-request message (== s) sink) (transition w (translate message sink))]
[(dns-reply message (== s) sink) (transition w (translate message sink))]))))
(define dns-spy
(os-big-bang 'none
(subscribe 'spy
(message-handlers w
[(dns-request message source sink)
(log-info (format "DNS: ~v asks ~v ~v~n : ~v"
source sink (dns-message-id message)
(dns-message-questions message)))]
[(dns-reply message source sink)
(log-info (format "DNS: ~v answers ~v~n : ~v"
source sink
message))]
[x
(log-info (format "DNS: ~v" x))]))))

69
os2-dns.rkt Normal file
View File

@ -0,0 +1,69 @@
#lang racket/base
;; DNS drivers using os2.rkt and os2-udp.rkt.
(require racket/set)
(require racket/match)
(require "codec.rkt")
(require "../racket-matrix/os2.rkt")
(require "../racket-matrix/os2-udp.rkt")
(provide (struct-out bad-dns-packet)
(struct-out dns-request)
(struct-out dns-reply)
dns-read-driver
dns-write-driver
dns-spy)
(struct bad-dns-packet (detail source sink reason) #:prefab)
(struct dns-request (message source sink) #:prefab)
(struct dns-reply (message source sink) #:prefab)
(define (dns-read-driver s)
(transition 'no-state
(at-meta-level
(role 'packet-reader
(topic-subscriber (udp-packet (wild) s (wild)))
#:state w
[(udp-packet source (== s) #"")
(log-info "Debug dump packet received")
(transition w (send-message `(debug-dump)))]
[(udp-packet source (== s) body)
(transition w
(send-message
(with-handlers ((exn:fail? (lambda (e) (bad-dns-packet body source s 'unparseable))))
(define message (packet->dns-message body))
(case (dns-message-direction message)
((request) (dns-request message source s))
((response) (dns-reply message source s))))))]))))
(define (dns-write-driver s)
(define (translate message sink)
(with-handlers ((exn:fail? (lambda (e)
(send-message (bad-dns-packet message s sink 'unencodable)))))
(at-meta-level
(send-message (udp-packet s sink (dns-message->packet message))))))
(transition 'no-state
(role 'packet-writer
(set (topic-subscriber (dns-request (wild) s (wild)))
(topic-subscriber (dns-reply (wild) s (wild))))
#:state w
[(dns-request message (== s) sink) (transition w (translate message sink))]
[(dns-reply message (== s) sink) (transition w (translate message sink))])))
(define dns-spy
(transition 'none
(role 'spy (topic-subscriber (wild) #:virtual? #t)
#:state w
[(dns-request message source sink)
(log-info (format "DNS: ~v asks ~v ~v~n : ~v"
source sink (dns-message-id message)
(dns-message-questions message)))
w]
[(dns-reply message source sink)
(log-info (format "DNS: ~v answers ~v~n : ~v"
source sink
message))
w]
[x
(log-info (format "DNS: ~v" x))
w])))