Handle ethernet short packet padding by applying IPv4 total packet length.
This commit is contained in:
parent
42850e20ef
commit
f5ce8cd93f
7
arp.rkt
7
arp.rkt
|
@ -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
10
ip.rkt
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue