@@ -647,6 +647,14 @@ module Sockopt = struct
647647 let ip_freebind = 15 (* IP_FREEBIND *)
648648 let ip_bind_address_no_port = 24 (* IP_BIND_ADDRESS_NO_PORT *)
649649 let ip_local_port_range = 51 (* IP_LOCAL_PORT_RANGE *)
650+ let ip_ttl = 2 (* IP_TTL *)
651+ let ip_mtu = 14 (* IP_MTU *)
652+ let ip_mtu_discover = 10 (* IP_MTU_DISCOVER *)
653+ (* IP_MTU_DISCOVER values *)
654+ let ip_pmtudisc_want = 1 (* IP_PMTUDISC_WANT *)
655+ let ip_pmtudisc_dont = 0 (* IP_PMTUDISC_DONT *)
656+ let ip_pmtudisc_do = 2 (* IP_PMTUDISC_DO *)
657+ let ip_pmtudisc_probe = 3 (* IP_PMTUDISC_PROBE *)
650658
651659 external setsockopt_int : Unix .file_descr -> int -> int -> int -> unit = " caml_eio_sockopt_int_set"
652660 external getsockopt_int : Unix .file_descr -> int -> int -> int = " caml_eio_sockopt_int_get"
@@ -671,6 +679,9 @@ module Sockopt = struct
671679 | IP_FREEBIND : bool Eio.Net.Sockopt .t
672680 | IP_BIND_ADDRESS_NO_PORT : bool Eio.Net.Sockopt .t
673681 | IP_LOCAL_PORT_RANGE : (int * int ) Eio.Net.Sockopt .t
682+ | IP_TTL : int Eio.Net.Sockopt .t
683+ | IP_MTU : int Eio.Net.Sockopt .t
684+ | IP_MTU_DISCOVER : [`Want | `Dont | `Do | `Probe ] Eio.Net.Sockopt .t
674685
675686 let set : type a. Fd.t -> a Eio.Net.Sockopt.t -> a -> unit = fun fd opt v ->
676687 match opt with
@@ -754,6 +765,22 @@ module Sockopt = struct
754765 let combined = (upper lsl 16 ) lor lower in
755766 Fd. use_exn " setsockopt" fd (fun fd ->
756767 setsockopt_int fd ipproto_ip ip_local_port_range combined)
768+ | IP_TTL ->
769+ if v < 1 || v > 255 then
770+ invalid_arg (Printf. sprintf " IP_TTL must be between 1 and 255, got %d" v);
771+ Fd. use_exn " setsockopt" fd (fun fd ->
772+ setsockopt_int fd ipproto_ip ip_ttl v)
773+ | IP_MTU ->
774+ invalid_arg " IP_MTU is a read-only socket option"
775+ | IP_MTU_DISCOVER ->
776+ let intval = match v with
777+ | `Want -> ip_pmtudisc_want
778+ | `Dont -> ip_pmtudisc_dont
779+ | `Do -> ip_pmtudisc_do
780+ | `Probe -> ip_pmtudisc_probe
781+ in
782+ Fd. use_exn " setsockopt" fd (fun fd ->
783+ setsockopt_int fd ipproto_ip ip_mtu_discover intval)
757784 | _ -> Eio_unix.Net.Sockopt. set fd opt v
758785
759786 let get : type a. Fd.t -> a Eio.Net.Sockopt.t -> a = fun fd opt ->
@@ -811,5 +838,20 @@ module Sockopt = struct
811838 let lower = combined land 0xFFFF in
812839 let upper = (combined lsr 16 ) land 0xFFFF in
813840 (lower, upper))
841+ | IP_TTL ->
842+ Fd. use_exn " getsockopt" fd (fun fd ->
843+ getsockopt_int fd ipproto_ip ip_ttl)
844+ | IP_MTU ->
845+ Fd. use_exn " getsockopt" fd (fun fd ->
846+ getsockopt_int fd ipproto_ip ip_mtu)
847+ | IP_MTU_DISCOVER ->
848+ let intval = Fd. use_exn " getsockopt" fd (fun fd ->
849+ getsockopt_int fd ipproto_ip ip_mtu_discover)
850+ in
851+ if intval = ip_pmtudisc_want then `Want
852+ else if intval = ip_pmtudisc_dont then `Dont
853+ else if intval = ip_pmtudisc_do then `Do
854+ else if intval = ip_pmtudisc_probe then `Probe
855+ else failwith (Printf. sprintf " Unknown IP_MTU_DISCOVER value: %d" intval)
814856 | _ -> Eio_unix.Net.Sockopt. get fd opt
815857end
0 commit comments