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