Previously if we recevied a big chunk (near UINT16_MAX), we would hit the following assert in iofd_msgb_alloc2(), because our msgb implementation can only handle sizes up to 16 bit length, counting headroom + data length: "OSMO_ASSERT(size + headroom <= 0xffff);".
This new improved logic allows handling segments of up to ~UINT16_MAX which may come in in multiple read calls. It also adds logic to catch received segments greater than UINT16_MAX (or buggy segment_cb or buggy peer transmitting to us) and notifies the user of a broken stream through read_cb() in that case.
test_segmentation_uint16_max() is added to osmo_io_test, which would abort without this patch applied.
osmo_io: Propagate segment_cb errors to the read_cb
Previous logic was to drop an entire msgb in the stream and pretend it can continue working that way, which clearly makes no sense. Instead, if segment_cb detects some problem (eg. buggy peer sending corrupted data according to protocol), propagate the issue through read_cb() so that the app can act on it, ie. most likely close the connection.