mux_demux: In RAW mode, fill with dummy until first TX

Until the remote side sends the first byte, we send fill
data since it can take it some time after the mode change
and the file descriptor is open for data to show up.

Previously due to a bug, the warning about short read was
not printed, but now that it's fixed, you get a bunch of
fairly "useless" warning at the beginning of the timeslot.

This fixes that since reported data by _e1_tx_raw is "faked"
until the pipe is active. (Fill data is actually added upstream)

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
Change-Id: Iaa6268e9b4a7bce5ea3027a29c48c147499373be
This commit is contained in:
Sylvain Munaut 2022-01-09 15:01:33 +01:00
parent e945a897f7
commit 3729f8f90e
2 changed files with 20 additions and 2 deletions

View File

@ -79,6 +79,7 @@ struct e1_ts {
uint8_t *rx_buf; /* actual buffer storage */
unsigned int rx_buf_size; /* size of 'buf' in bytes */
unsigned int rx_buf_used; /* number of bytes used so far */
bool tx_started; /* tx started */
} raw;
/* Remote end */

View File

@ -44,6 +44,24 @@
// data transfer
// ---------------------------------------------------------------------------
static int
_e1_tx_raw(struct e1_ts *ts, uint8_t *buf, int len)
{
int l;
l = read(ts->fd, buf, len);
/* FIXME: handle underflow */
/* If we're not started yet, we 'fake' data until the other side
* send something */
if (l < 0 && errno == EAGAIN && !ts->raw.tx_started)
return len;
ts->raw.tx_started = true;
return l;
}
static int
_e1_tx_hdlcfs(struct e1_ts *ts, uint8_t *buf, int len)
{
@ -105,8 +123,7 @@ _e1_ts_read(struct e1_ts *ts, uint8_t *buf, size_t len)
switch (ts->mode) {
case E1_TS_MODE_RAW:
l = read(ts->fd, buf, len);
/* FIXME: handle underflow */
l = _e1_tx_raw(ts, buf, len);
break;
case E1_TS_MODE_HDLCFCS:
l = _e1_tx_hdlcfs(ts, buf, len);