|
| 1 | +# Linux-specific networking tests |
| 2 | + |
| 3 | +```ocaml |
| 4 | +# #require "eio_linux";; |
| 5 | +# #require "eio.unix";; |
| 6 | +# open Eio.Std;; |
| 7 | +# let addr = `Tcp (Eio.Net.Ipaddr.V4.loopback, 0);; |
| 8 | +val addr : [> `Tcp of [> `V4 ] Eio.Net.Ipaddr.t * int ] = |
| 9 | + `Tcp ("\127\000\000\001", 0) |
| 10 | +``` |
| 11 | + |
| 12 | +## Linux-specific TCP socket options |
| 13 | + |
| 14 | +Test Linux-specific TCP socket options: |
| 15 | + |
| 16 | +```ocaml |
| 17 | +# Eio_linux.run @@ fun env -> |
| 18 | + Switch.run @@ fun sw -> |
| 19 | + let net = env#net in |
| 20 | + let listen_sock = Eio.Net.listen net ~sw ~reuse_addr:true ~backlog:5 addr in |
| 21 | + let listen_fd = Eio_unix.Net.fd listen_sock in |
| 22 | + let listening_addr = Eio.Net.listening_addr listen_sock in |
| 23 | + let module ELS = Eio_linux.Low_level.Sockopt in |
| 24 | + (* Test TCP_DEFER_ACCEPT on listening socket *) |
| 25 | + ELS.set listen_fd ELS.TCP_DEFER_ACCEPT 5; |
| 26 | + let defer = ELS.get listen_fd ELS.TCP_DEFER_ACCEPT in |
| 27 | + traceln "TCP_DEFER_ACCEPT on listening socket: %s" (if defer > 0 then "enabled" else "disabled"); |
| 28 | +
|
| 29 | + (* Create a TCP connection for other tests *) |
| 30 | + Eio.Fiber.both |
| 31 | + (fun () -> |
| 32 | + let client = Eio.Net.connect ~sw net listening_addr in |
| 33 | + let fd = Eio_unix.Net.fd client in |
| 34 | +
|
| 35 | + (* Test TCP_CORK *) |
| 36 | + ELS.set fd ELS.TCP_CORK true; |
| 37 | + let cork = ELS.get fd ELS.TCP_CORK in |
| 38 | + traceln "TCP_CORK enabled: %b" cork; |
| 39 | + ELS.set fd ELS.TCP_CORK false; |
| 40 | + let cork = ELS.get fd ELS.TCP_CORK in |
| 41 | + traceln "TCP_CORK disabled: %b" cork; |
| 42 | +
|
| 43 | + (* Test TCP_KEEPIDLE, TCP_KEEPINTVL, TCP_KEEPCNT *) |
| 44 | + ELS.set fd ELS.TCP_KEEPIDLE 60; |
| 45 | + let keepidle = ELS.get fd ELS.TCP_KEEPIDLE in |
| 46 | + traceln "TCP_KEEPIDLE: %d seconds" keepidle; |
| 47 | +
|
| 48 | + ELS.set fd ELS.TCP_KEEPINTVL 10; |
| 49 | + let keepintvl = ELS.get fd ELS.TCP_KEEPINTVL in |
| 50 | + traceln "TCP_KEEPINTVL: %d seconds" keepintvl; |
| 51 | +
|
| 52 | + ELS.set fd ELS.TCP_KEEPCNT 5; |
| 53 | + let keepcnt = ELS.get fd ELS.TCP_KEEPCNT in |
| 54 | + traceln "TCP_KEEPCNT: %d probes" keepcnt; |
| 55 | +
|
| 56 | + (* Test TCP_LINGER2 *) |
| 57 | + ELS.set fd ELS.TCP_LINGER2 110; |
| 58 | + let linger2 = ELS.get fd ELS.TCP_LINGER2 in |
| 59 | + traceln "TCP_LINGER2: %d seconds" linger2; |
| 60 | +
|
| 61 | + (* Test TCP_CONGESTION *) |
| 62 | + let congestion = ELS.get fd ELS.TCP_CONGESTION in |
| 63 | + traceln "Current TCP_CONGESTION algorithm: %s" congestion; |
| 64 | +
|
| 65 | + (* Try to set cubic if available - may fail based on system config *) |
| 66 | + (try |
| 67 | + ELS.set fd ELS.TCP_CONGESTION "cubic"; |
| 68 | + let new_congestion = ELS.get fd ELS.TCP_CONGESTION in |
| 69 | + traceln "Successfully set TCP_CONGESTION to: %s" new_congestion |
| 70 | + with _ -> |
| 71 | + traceln "Could not change TCP_CONGESTION (normal for unprivileged)"); |
| 72 | +
|
| 73 | + Eio.Flow.close client) |
| 74 | + (fun () -> |
| 75 | + let conn, _addr = Eio.Net.accept ~sw listen_sock in |
| 76 | + Eio.Flow.close conn);; |
| 77 | ++TCP_DEFER_ACCEPT on listening socket: enabled |
| 78 | ++TCP_CORK enabled: true |
| 79 | ++TCP_CORK disabled: false |
| 80 | ++TCP_KEEPIDLE: 60 seconds |
| 81 | ++TCP_KEEPINTVL: 10 seconds |
| 82 | ++TCP_KEEPCNT: 5 probes |
| 83 | ++TCP_LINGER2: 110 seconds |
| 84 | ++Current TCP_CONGESTION algorithm: cubic |
| 85 | ++Successfully set TCP_CONGESTION to: cubic |
| 86 | +- : unit = () |
| 87 | +``` |
0 commit comments