mDNS/DNS-SD service discovery for OCaml (RFC 6762/6763)

Format code and update ocamlformat to 0.28.1

- Update .ocamlformat version in ocaml-csrf and ocaml-spake2
- Update ocaml-csrf for hkdf API changes:
- Use ~salt:"" instead of ~hash:`SHA256 in Hkdf.extract
- Use ~length:32 instead of positional arg in Hkdf.expand
- Apply ocamlformat 0.28.1 formatting across all packages

+22 -14
+2 -1
fuzz/fuzz_mdns.ml
··· 54 add_test ~name:"mdns: merge associative" [ bytes; bytes; bytes ] 55 test_merge_associative; 56 add_test ~name:"mdns: merge identity" [ bytes ] test_merge_identity; 57 - add_test ~name:"mdns: parse valid structure" [ bytes ] test_parse_valid_structure
··· 54 add_test ~name:"mdns: merge associative" [ bytes; bytes; bytes ] 55 test_merge_associative; 56 add_test ~name:"mdns: merge identity" [ bytes ] test_merge_identity; 57 + add_test ~name:"mdns: parse valid structure" [ bytes ] 58 + test_parse_valid_structure
+9 -5
lib/mdns.ml
··· 1 (** mDNS discovery for DNS-SD (RFC 6763). 2 3 - Uses ocaml-dns for query encoding. Response parsing handles raw domain 4 - names since the dns library's Ptr.t enforces hostname validation which 5 - breaks DNS-SD service instance names containing spaces. *) 6 7 let multicast_addr = "224.0.0.251" 8 let port = 5353 ··· 136 addrs6 := (name, Ipaddr.V6.of_int64 (hi, lo)) :: !addrs6 137 | 33 when rdlen >= 6 -> 138 let port = get_u16 buf (rdata + 4) in 139 - let target = domain_of_labels (collect_labels buf (rdata + 6)) in 140 srvs := (name, port, target) :: !srvs 141 | _ -> () 142 end ··· 174 Ok (Cstruct.to_string (Cstruct.sub recv_buf 0 len))) 175 with 176 | Ok buf -> ( 177 - match parse buf with Some r -> responses := r :: !responses | None -> ()) 178 | Error _ -> () 179 done; 180 !responses
··· 1 (** mDNS discovery for DNS-SD (RFC 6763). 2 3 + Uses ocaml-dns for query encoding. Response parsing handles raw domain names 4 + since the dns library's Ptr.t enforces hostname validation which breaks 5 + DNS-SD service instance names containing spaces. *) 6 7 let multicast_addr = "224.0.0.251" 8 let port = 5353 ··· 136 addrs6 := (name, Ipaddr.V6.of_int64 (hi, lo)) :: !addrs6 137 | 33 when rdlen >= 6 -> 138 let port = get_u16 buf (rdata + 4) in 139 + let target = 140 + domain_of_labels (collect_labels buf (rdata + 6)) 141 + in 142 srvs := (name, port, target) :: !srvs 143 | _ -> () 144 end ··· 176 Ok (Cstruct.to_string (Cstruct.sub recv_buf 0 len))) 177 with 178 | Ok buf -> ( 179 + match parse buf with 180 + | Some r -> responses := r :: !responses 181 + | None -> ()) 182 | Error _ -> () 183 done; 184 !responses
+11 -8
lib/mdns.mli
··· 1 (** mDNS/DNS-SD service discovery (RFC 6763). 2 3 - This module implements Multicast DNS for DNS-based Service Discovery. 4 - It uses the dns library for query encoding and handles raw domain names 5 - to support DNS-SD service instance names containing spaces. 6 7 {2 References} 8 - - {{:https://datatracker.ietf.org/doc/html/rfc6762} RFC 6762 - Multicast DNS} 9 - - {{:https://datatracker.ietf.org/doc/html/rfc6763} RFC 6763 - DNS-Based Service Discovery} *) 10 11 (** {1 Types} *) 12 ··· 31 32 val encode_query : [ `raw ] Domain_name.t -> string 33 (** [encode_query name] creates an mDNS query packet for the given service type. 34 - For example, to discover HTTP services: [encode_query "_http._tcp.local"]. *) 35 36 val parse : string -> response option 37 - (** [parse buf] attempts to parse an mDNS response packet. 38 - Returns [None] if the packet is malformed. *) 39 40 (** {1 High-level Query} *) 41
··· 1 (** mDNS/DNS-SD service discovery (RFC 6763). 2 3 + This module implements Multicast DNS for DNS-based Service Discovery. It 4 + uses the dns library for query encoding and handles raw domain names to 5 + support DNS-SD service instance names containing spaces. 6 7 {2 References} 8 + - {{:https://datatracker.ietf.org/doc/html/rfc6762} RFC 6762 - Multicast 9 + DNS} 10 + - {{:https://datatracker.ietf.org/doc/html/rfc6763} RFC 6763 - DNS-Based 11 + Service Discovery} *) 12 13 (** {1 Types} *) 14 ··· 33 34 val encode_query : [ `raw ] Domain_name.t -> string 35 (** [encode_query name] creates an mDNS query packet for the given service type. 36 + For example, to discover HTTP services: [encode_query "_http._tcp.local"]. 37 + *) 38 39 val parse : string -> response option 40 + (** [parse buf] attempts to parse an mDNS response packet. Returns [None] if the 41 + packet is malformed. *) 42 43 (** {1 High-level Query} *) 44