Handle ethernet short packet padding by applying IPv4 total packet length.

This commit is contained in:
Tony Garnock-Jones 2014-06-18 23:58:25 -04:00
parent 42850e20ef
commit f5ce8cd93f
2 changed files with 10 additions and 7 deletions

View File

@ -109,9 +109,10 @@
(sender-protocol-address0 :: binary bytes plen) (sender-protocol-address0 :: binary bytes plen)
(target-hardware-address0 :: binary bytes hlen) (target-hardware-address0 :: binary bytes hlen)
(target-protocol-address0 :: binary bytes plen) (target-protocol-address0 :: binary bytes plen)
(:: binary) ;; TODO: are the extra zeros coming from the (:: binary) ;; The extra zeros exist because ethernet packets
;; router real, or an artifact of my ;; have a minimum size. This is, in part, why
;; packet-capture implementation? ;; IPv4 headers have a total-length field, so
;; that the zero padding can be removed.
] ]
(let () (let ()
(define sender-protocol-address (bit-string->bytes sender-protocol-address0)) (define sender-protocol-address (bit-string->bytes sender-protocol-address0))

10
ip.rkt
View File

@ -247,14 +247,16 @@
(source-ip0 :: binary bits 32) (source-ip0 :: binary bits 32)
(destination-ip0 :: binary bits 32) (destination-ip0 :: binary bits 32)
(rest :: binary) ] (rest :: binary) ]
(let ((source-ip (bit-string->bytes source-ip0)) (let* ((source-ip (bit-string->bytes source-ip0))
(destination-ip (bit-string->bytes destination-ip0)) (destination-ip (bit-string->bytes destination-ip0))
(options-length (* 4 (- header-length IP-MINIMUM-HEADER-LENGTH)))) (options-length (* 4 (- header-length IP-MINIMUM-HEADER-LENGTH)))
(data-length (- total-length (* 4 header-length))))
(if (and (>= header-length 5) (if (and (>= header-length 5)
(>= (bit-string-byte-count body) (* header-length 4))) (>= (bit-string-byte-count body) (* header-length 4)))
(bit-string-case rest (bit-string-case rest
([ (opts :: binary bytes options-length) ([ (opts :: binary bytes options-length)
(data :: binary) ] (data :: binary bytes data-length)
(:: binary) ] ;; Very short ethernet packets have a trailer of zeros
(ip-packet interface-name (ip-packet interface-name
(bit-string->bytes source-ip) (bit-string->bytes source-ip)
(bit-string->bytes destination-ip) (bit-string->bytes destination-ip)