xref: /aosp_15_r20/external/libwebsockets/READMEs/README.udp.md (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
1*1c60b9acSAndroid Build Coastguard Worker## Using UDP in lws
2*1c60b9acSAndroid Build Coastguard Worker
3*1c60b9acSAndroid Build Coastguard WorkerUDP is supported in lws... the quickest way is to use the api
4*1c60b9acSAndroid Build Coastguard Worker`lws_create_adopt_udp()` which returns a wsi bound to the provided
5*1c60b9acSAndroid Build Coastguard Workervhost, protocol, `lws_retry` struct, dns address and port.
6*1c60b9acSAndroid Build Coastguard Worker
7*1c60b9acSAndroid Build Coastguard WorkerThe wsi can be treated normally and `lws_write()` used to write on
8*1c60b9acSAndroid Build Coastguard Workerit.
9*1c60b9acSAndroid Build Coastguard Worker
10*1c60b9acSAndroid Build Coastguard Worker## Implementing UDP retries
11*1c60b9acSAndroid Build Coastguard Worker
12*1c60b9acSAndroid Build Coastguard WorkerRetries are important in udp but there's no standardized ack method
13*1c60b9acSAndroid Build Coastguard Workerunlike tcp.  Lws allows you to bind an `lws_retry` struct describing
14*1c60b9acSAndroid Build Coastguard Workerthe policy to the udp wsi, but since one UDP socket may have many
15*1c60b9acSAndroid Build Coastguard Workertransactions in flight, the `lws_sul` and `uint16_t` to count the
16*1c60b9acSAndroid Build Coastguard Workerretries must live in the user's transaction object like this
17*1c60b9acSAndroid Build Coastguard Worker
18*1c60b9acSAndroid Build Coastguard Worker```
19*1c60b9acSAndroid Build Coastguard Worker...
20*1c60b9acSAndroid Build Coastguard Worker	lws_sorted_usec_list_t	sul;
21*1c60b9acSAndroid Build Coastguard Worker	uint16_t		retry;
22*1c60b9acSAndroid Build Coastguard Worker...
23*1c60b9acSAndroid Build Coastguard Worker```
24*1c60b9acSAndroid Build Coastguard Worker
25*1c60b9acSAndroid Build Coastguard Workerin the `LWS_CALLBACK_RAW_WRITEABLE` callback, before doing the write,
26*1c60b9acSAndroid Build Coastguard Workerset up the retry like this
27*1c60b9acSAndroid Build Coastguard Worker
28*1c60b9acSAndroid Build Coastguard Worker```
29*1c60b9acSAndroid Build Coastguard Worker	if (lws_dll2_is_detached(&transaction->sul_write.list) &&
30*1c60b9acSAndroid Build Coastguard Worker	    lws_retry_sul_schedule_retry_wsi(wsi, &transaction->sul_write,
31*1c60b9acSAndroid Build Coastguard Worker					     transaction_retry_write_cb,
32*1c60b9acSAndroid Build Coastguard Worker					     &transaction->retry_count_write)) {
33*1c60b9acSAndroid Build Coastguard Worker			/* we have reached the end of our concealed retries */
34*1c60b9acSAndroid Build Coastguard Worker		lwsl_warn("%s: concealed retries done, failing\n", __func__);
35*1c60b9acSAndroid Build Coastguard Worker		goto retry_conn;
36*1c60b9acSAndroid Build Coastguard Worker	}
37*1c60b9acSAndroid Build Coastguard Worker```
38*1c60b9acSAndroid Build Coastguard Worker
39*1c60b9acSAndroid Build Coastguard WorkerThis manages the retry counter in the transaction object, guards against it wrapping,
40*1c60b9acSAndroid Build Coastguard Workerselects the timeout using the policy bound to the wsi, and sets the `lws_sul` in the
41*1c60b9acSAndroid Build Coastguard Workertransaction object to call the given callback if the sul time expires.
42*1c60b9acSAndroid Build Coastguard Worker
43*1c60b9acSAndroid Build Coastguard WorkerIn the callback, it should simply call `lws_callback_on_writable()` for the udp wsi.
44*1c60b9acSAndroid Build Coastguard Worker
45*1c60b9acSAndroid Build Coastguard Worker## Simulating packetloss
46*1c60b9acSAndroid Build Coastguard Worker
47*1c60b9acSAndroid Build Coastguard WorkerYou can simulate udp packetloss at tx and rx by using the Fault Injection apis
48*1c60b9acSAndroid Build Coastguard Workerwith the well-known fault names "udp_tx_loss" and "udp_rx_loss", typically
49*1c60b9acSAndroid Build Coastguard Workerwith the probabilistic setting, in commandline format something like
50*1c60b9acSAndroid Build Coastguard Worker`--fault-injection "wsi/udp_tx_loss(10%)"`
51