package rawlink
Portable library to read and write raw packets
Install
Dune Dependency
Authors
Maintainers
Sources
rawlink-v1.0.tbz
sha256=f3a8ffb78bc3363905de59d260c72991ea188d46aea274368f4d93acfdd5ec28
md5=90a85604ed73955f9fefedfd6b624598
doc/src/rawlink.lwt/lwt_rawlink.ml.html
Source file lwt_rawlink.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
(* * Copyright (c) 2015 Christiano F. Haesbaert <haesbaert@haesbaert.org> * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *) [@@@warning "-32-37"] open Lwt.Infix type t = { fd : Lwt_unix.file_descr; packets : Cstruct.t list ref; buffer : Cstruct.t; } type driver = | AF_PACKET | BPF external opensock: ?filter:string -> string -> Unix.file_descr = "caml_rawlink_open" external dhcp_server_filter: unit -> string = "caml_dhcp_server_filter" external dhcp_client_filter: unit -> string = "caml_dhcp_client_filter" external driver: unit -> driver = "caml_driver" external bpf_align: int -> int -> int = "caml_bpf_align" let open_link ?filter ifname = let fd = Lwt_unix.of_unix_file_descr (opensock ?filter:filter ifname) in let () = Lwt_unix.set_blocking fd false in { fd; packets = ref []; buffer = (Cstruct.create 65536) } let close_link t = Lwt_unix.close t.fd let rec read_packet t = match !(t.packets) with | hd :: tl -> t.packets := tl; Lwt.return hd | [] -> match driver () with | BPF -> Lwt_bytes.read t.fd t.buffer.Cstruct.buffer 0 t.buffer.Cstruct.len >>= (fun n -> if n = 0 then failwith "Link socket closed"; t.packets := Rawlink.bpf_split_buffer t.buffer n; read_packet t) | AF_PACKET -> Lwt_bytes.read t.fd t.buffer.Cstruct.buffer 0 t.buffer.Cstruct.len >>= (fun n -> if n = 0 then failwith "Link socket closed"; let buf = Cstruct.create n in Cstruct.blit t.buffer 0 buf 0 n; Lwt.return buf) let send_packet t buf = let len = Cstruct.len buf in Lwt_bytes.write t.fd buf.Cstruct.buffer 0 len >>= (fun n -> if n = 0 then Lwt.fail (Unix.Unix_error(Unix.EPIPE, "send_packet: socket closed", "")) else if n <> len then Lwt.fail (Unix.Unix_error(Unix.ENOBUFS, "send_packet: short write", "")) else Lwt.return_unit)
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>