Created
January 10, 2017 15:02
-
-
Save haesbaert/4ca8f6a047009147f5caf93f019c8179 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let scan_pkt buf = | |
let open Usane in | |
let len = Cstruct.len buf in | |
let partial () = | |
if len < (1024 * 64) then | |
None | |
else | |
invalid_arg "Buffer is too big" | |
in | |
let wrap () = | |
(* Using pad_len as int32 saves us a lot of conversions. *) | |
let pkt_len = get_pkt_hdr_pkt_len buf in | |
let pad_len = Int32.of_int (get_pkt_hdr_pad_len buf) in | |
if pkt_len = Int32.zero || Uint32.(pkt_len >= max_pkt_len) then | |
invalid_arg "Bad pkt_len" | |
else if Uint32.(pad_len >= pkt_len) then | |
invalid_arg "Bad pad_len"; | |
let buf = Cstruct.shift buf sizeof_pkt_hdr in | |
let len = Cstruct.len buf in | |
(* This is a partial packet, hold onto t *) | |
if Uint32.(pkt_len > (of_int len)) then | |
partial () | |
else | |
let payload_len, u1 = Uint32.(sub pkt_len pad_len) in | |
let payload_len, u2 = Uint32.pred payload_len in | |
if u1 || u2 then | |
invalid_arg "Bad payload_len"; | |
Some (Cstruct.set_len buf (Int32.to_int payload_len)) | |
in | |
if len < 2 then | |
ok None | |
else | |
trap_exn wrap () |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment