aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2011-12-20 18:56:42 +0100
committerHarald Welte <laforge@gnumonks.org>2011-12-20 18:56:42 +0100
commitd73c84670b0f74f502d28acbcbbeb672cf8ee4f9 (patch)
tree8fc5ddadcb300be194e475b4f1270420b1af6ab9
parente194cd92a809b0b6ab3513e6742dba3871179c2e (diff)
mISDN input: avoid some strange distortion caused by buffer mgmt
We used to write as many messages as we received from mISDN for b-channels. Now we write as many _bytes_ as we have received, which seems to be the more logical thing to do.
-rw-r--r--src/input/misdn.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/src/input/misdn.c b/src/input/misdn.c
index 10bb47e..2ed152e 100644
--- a/src/input/misdn.c
+++ b/src/input/misdn.c
@@ -313,15 +313,14 @@ static void misdn_write_msg(struct msgb *msg, void *cbdata)
msgb_free(msg);
}
-#define BCHAN_TX_GRAN 160
/* write to a B channel TS */
-static int handle_tsX_write(struct osmo_fd *bfd)
+static int handle_tsX_write(struct osmo_fd *bfd, int len)
{
struct e1inp_line *line = bfd->data;
unsigned int ts_nr = bfd->priv_nr;
struct e1inp_ts *e1i_ts = &line->ts[ts_nr-1];
struct mISDNhead *hh;
- uint8_t tx_buf[BCHAN_TX_GRAN + sizeof(*hh)];
+ uint8_t tx_buf[len + sizeof(*hh)];
struct subch_mux *mx = &e1i_ts->trau.mux;
int ret;
@@ -329,15 +328,15 @@ static int handle_tsX_write(struct osmo_fd *bfd)
hh->prim = PH_DATA_REQ;
hh->id = 0;
- subchan_mux_out(mx, tx_buf+sizeof(*hh), BCHAN_TX_GRAN);
+ subchan_mux_out(mx, tx_buf+sizeof(*hh), len);
DEBUGP(DLMIB, "BCHAN TX: %s\n",
- osmo_hexdump(tx_buf+sizeof(*hh), BCHAN_TX_GRAN));
+ osmo_hexdump(tx_buf+sizeof(*hh), len));
- ret = send(bfd->fd, tx_buf, sizeof(*hh) + BCHAN_TX_GRAN, 0);
- if (ret < sizeof(*hh) + BCHAN_TX_GRAN)
+ ret = send(bfd->fd, tx_buf, sizeof(*hh) + len, 0);
+ if (ret < sizeof(*hh) + len)
DEBUGP(DLMIB, "send returns %d instead of %zu\n", ret,
- sizeof(*hh) + BCHAN_TX_GRAN);
+ sizeof(*hh) + len);
return ret;
}
@@ -376,12 +375,12 @@ static int handle_tsX_read(struct osmo_fd *bfd)
msg->l2h = msg->data + MISDN_HEADER_LEN;
DEBUGP(DLMIB, "BCHAN RX: %s\n",
osmo_hexdump(msgb_l2(msg), ret - MISDN_HEADER_LEN));
+ /* the number of bytes received indicates that data to send */
+ handle_tsX_write(bfd, msgb_l2len(msg));
return e1inp_rx_ts(e1i_ts, msg, 0, 0);
case PH_ACTIVATE_IND:
case PH_DATA_CNF:
- /* physical layer indicates that data has been sent,
- * we thus can send some more data */
- ret = handle_tsX_write(bfd);
+ break;
default:
break;
}