manawyrm has uploaded this change for review.
octoi: rework frame_rifo logic to decompress frames on the output side
The previous code tried to decompress frames against the last received frame
regardless of the ordering (even when the frames got re-ordered by the network)
and also when a frame didn't even arrive yet (rendering the jitter buffer almost
useless).
This commit stores the compressed frame and the timeslot mask in the RIFO
and only tries to decompress the frames in the RIFO pop logic (when we had time
to receive the other frames before it).
The rifo->last_in_fn logic would also reset the counter back to an older frame
even when a frame with a higher number was already received (fixed now).
Change-Id: I66af4f01ebb38ca1bdd8ffbc8135776322941230
---
M src/octoi/e1oip.c
M src/octoi/e1oip.h
M src/octoi/frame_rifo.c
M src/octoi/frame_rifo.h
M src/octoi/octoi.c
M tests/rifo/rifo_test.c
M tests/rifo/rifo_test.ok
7 files changed, 195 insertions(+), 39 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-e1d refs/changes/43/43643/1
diff --git a/src/octoi/e1oip.c b/src/octoi/e1oip.c
index e2aad34..345d76b 100644
--- a/src/octoi/e1oip.c
+++ b/src/octoi/e1oip.c
@@ -194,7 +194,7 @@
uint32_t ts_mask;
uint8_t idx2ts[BYTES_PER_FRAME];
unsigned int n_frames;
- uint8_t frame_buf[BYTES_PER_FRAME];
+ uint8_t frame_buf[BYTES_PER_FRAME] = { 0 };
unsigned int num_ts;
uint16_t exp_next_seq = iline->e1t.next_fn32 & 0xffff;
struct timespec ts;
@@ -260,7 +260,6 @@
n_frames = msg->l3h[0];
}
- memcpy(frame_buf, iline->e1t.last_frame, BYTES_PER_FRAME);
for (unsigned int i = 0; i < n_frames; i++) {
int rc;
for (unsigned int j = 0; j < num_ts; j++) {
@@ -268,7 +267,7 @@
frame_buf[ts_nr] = e1th->data[i*num_ts + j];
}
/* FIXME: what to do about TS0? */
- rc = frame_rifo_in(&iline->e1t.rifo, frame_buf, fn32+i);
+ rc = frame_rifo_in(&iline->e1t.rifo, frame_buf, ts_mask, fn32+i);
if (rc < 0)
iline_ctr_add(iline, LINE_CTR_E1oIP_E1T_OVERFLOW, 1);
/* Continue the for loop, if buffer reset is not configured. */
@@ -292,7 +291,6 @@
}
/* update local state */
- memcpy(iline->e1t.last_frame, frame_buf, BYTES_PER_FRAME);
if (update_next)
iline->e1t.next_fn32 = fn32 + n_frames;
@@ -352,7 +350,6 @@
iline->e1o.next_seq = 0;
frame_rifo_init(&iline->e1t.rifo, 0);
- memset(&iline->e1t.last_frame, 0xff, sizeof(iline->e1t.last_frame));
iline->e1t.next_fn32 = 0;
iline->e1t.primed_rx_tdm = false;
iline->e1t.delay = 0;
diff --git a/src/octoi/e1oip.h b/src/octoi/e1oip.h
index 8aaa420..f21cfbf 100644
--- a/src/octoi/e1oip.h
+++ b/src/octoi/e1oip.h
@@ -70,7 +70,6 @@
/* E1 terminated side (E1<-IP) */
struct {
struct frame_rifo rifo;
- uint8_t last_frame[BYTES_PER_FRAME]; /* last frame on the E1 side */
uint32_t next_fn32; /* next expected frame number */
bool primed_rx_tdm; /* Was RX RIFO primed */
int32_t delay, delay_cnt; /* Delay counter to calculate average delay */
diff --git a/src/octoi/frame_rifo.c b/src/octoi/frame_rifo.c
index 00fb6a5..cffd0e1 100644
--- a/src/octoi/frame_rifo.c
+++ b/src/octoi/frame_rifo.c
@@ -89,6 +89,8 @@
void frame_rifo_init(struct frame_rifo *rifo, uint32_t fn)
{
memset(rifo->buf, 0xff, sizeof(rifo->buf));
+ memset(rifo->rx_mask, 0, sizeof(rifo->rx_mask));
+ memset(rifo->last_out, 0xff, sizeof(rifo->last_out));
rifo->next_out = rifo->buf;
rifo->next_out_fn = fn;
rifo->last_in_fn = fn - 1;
@@ -99,10 +101,11 @@
/*! put one received frame into the RIFO at a given specified frame number.
* \param rifo The RIFO to which we want to put (append) multiple frames
- * \param frame Pointer to memory containing the frame data
+ * \param frame Pointer to memory containing partial/compressed frame data
+ * \param ts_mask Bit-mask of timeslots that carry data
* \param fn Absolute frame number at which to insert the frame.
* \returns 0 on success; -1 on error (overflow) */
-int frame_rifo_in(struct frame_rifo *rifo, const uint8_t *frame, uint32_t fn)
+int frame_rifo_in(struct frame_rifo *rifo, const uint8_t *frame, uint32_t ts_mask, uint32_t fn)
{
uint32_t bucket;
uint8_t *dst;
@@ -116,14 +119,18 @@
dst = rifo->buf + bucket * BYTES_PER_FRAME;
OSMO_ASSERT(dst + BYTES_PER_FRAME <= RIFO_BUF_END(rifo));
memcpy(dst, frame, BYTES_PER_FRAME);
+ rifo->rx_mask[bucket] = ts_mask;
bucket_bit_set(rifo, bucket);
- rifo->last_in_fn = fn;
+
+ if ((int32_t)(fn - rifo->last_in_fn) > 0)
+ rifo->last_in_fn = fn;
return 0;
}
-/*! pull one frames out of the RIFO.
+/*! pull one frame out of the RIFO.
+ *
* \param rifo The RIFO from which we want to pull frames
* \param out Caller-allocated output buffer
* \returns 0 on success; -1 if no frame available; -2 if RIFO depth == 0 */
@@ -137,12 +144,25 @@
/* if we don't have any RIFO depth at all, our jitter buffer has
* run empty and most likely there is some fundamental clock sync problem
* somewhere. */
+ memcpy(out, rifo->last_out, BYTES_PER_FRAME);
rc = -2;
} else if (!bucket_bit) {
- /* caller is supposed to copy/duplicate previous frame */
+ /* frame was lost / has not arrived: repeat the last full frame */
rc = -1;
+ memcpy(out, rifo->last_out, BYTES_PER_FRAME);
} else {
- memcpy(out, rifo->next_out, BYTES_PER_FRAME);
+ /* unpack, take the new timeslots from this frame,
+ * keep all others from the last_out frame. */
+ const uint8_t *raw = rifo->next_out;
+ uint32_t ts_mask = rifo->rx_mask[next_out_bucket];
+ unsigned int ts;
+
+ for (ts = 0; ts < BYTES_PER_FRAME; ts++) {
+ if (ts_mask & (1U << ts)) {
+ rifo->last_out[ts] = raw[ts];
+ }
+ }
+ memcpy(out, rifo->last_out, BYTES_PER_FRAME);
bucket_bit_clear(rifo, next_out_bucket);
}
diff --git a/src/octoi/frame_rifo.h b/src/octoi/frame_rifo.h
index 19a9acb..3f1fc38 100644
--- a/src/octoi/frame_rifo.h
+++ b/src/octoi/frame_rifo.h
@@ -6,6 +6,15 @@
uint8_t *next_out; /* where to read next output from FIFO */
uint8_t buf[BYTES_PER_FRAME * FRAMES_PER_FIFO];
+ /* compressed timeslot values per frame. Only the
+ timeslots in rx_mask[] carry data. */
+
+ uint32_t rx_mask[FRAMES_PER_FIFO];
+ /* bit-mask of timeslots for this frame. Timeslots not
+ set here are unchanged from the last frame. */
+
+ uint8_t last_out[BYTES_PER_FRAME];
+ /* last full output frame. serves as the base for the next frame. */
uint32_t last_in_fn; /* frame number of most recently inserted frame */
uint32_t next_out_fn; /* frame number of next output frame */
@@ -45,7 +54,7 @@
}
/* put a received frame into the FIFO */
-int frame_rifo_in(struct frame_rifo *rifo, const uint8_t *frame, uint32_t fn);
+int frame_rifo_in(struct frame_rifo *rifo, const uint8_t *frame, uint32_t ts_mask, uint32_t fn);
/* pull one frame out of the FIFO */
int frame_rifo_out(struct frame_rifo *rifo, uint8_t *out);
diff --git a/src/octoi/octoi.c b/src/octoi/octoi.c
index 1c0a6e7..aaf3018 100644
--- a/src/octoi/octoi.c
+++ b/src/octoi/octoi.c
@@ -137,9 +137,8 @@
uint8_t *cur = buf + BYTES_PER_FRAME*i;
rc = frame_rifo_out(&iline->e1t.rifo, cur);
if (rc == -1) {
- iline_ctr_add(iline, LINE_CTR_E1oIP_SUBSTITUTED, 1);
/* substitute with last received frame */
- memcpy(cur, iline->e1t.last_frame, BYTES_PER_FRAME);
+ iline_ctr_add(iline, LINE_CTR_E1oIP_SUBSTITUTED, 1);
} else if (rc == -2) {
iline_ctr_add(iline, LINE_CTR_E1oIP_UNDERRUN, 1);
/* substitute with all-FF frame */
diff --git a/tests/rifo/rifo_test.c b/tests/rifo/rifo_test.c
index 381ca49..e0b685a 100644
--- a/tests/rifo/rifo_test.c
+++ b/tests/rifo/rifo_test.c
@@ -28,9 +28,18 @@
rifo->last_in_fn = init_next_out_fn - 1;
}
+static void rifo_in_mask(struct frame_rifo *rifo, uint8_t *frame, uint32_t ts_mask, uint32_t fn)
+{
+ int rc = frame_rifo_in(rifo, frame, ts_mask, fn);
+ unsigned int depth = frame_rifo_depth(rifo);
+ printf("RIFO_IN(%s, mask=0x%08x, start fn + %s%d)=%d [depth=%s%d, frames=%u]\n",
+ osmo_hexdump_nospc(frame, BYTES_PER_FRAME), ts_mask, FN_PRINT(fn), rc,
+ ABS_DEPTH_PRINT(depth), frame_rifo_frames(rifo));
+}
+
static void rifo_in(struct frame_rifo *rifo, uint8_t *frame, uint32_t fn)
{
- int rc = frame_rifo_in(rifo, frame, fn);
+ int rc = frame_rifo_in(rifo, frame, 0xffffffff, fn);
unsigned int depth = frame_rifo_depth(rifo);
printf("RIFO_IN(%s, start fn + %s%d)=%d [depth=%s%d, frames=%u]\n",
osmo_hexdump_nospc(frame, BYTES_PER_FRAME), FN_PRINT(fn), rc,
@@ -91,6 +100,59 @@
}
}
+static void tail_reordered_in(void)
+{
+ struct frame_rifo rifo;
+ rifo_init(&rifo);
+
+ printf("\nTEST: %s, starting at FN: %u\n", __func__, init_next_out_fn);
+
+ const uint8_t in[] = { 0, 1, 2, 3, 4, 5, 6, 7, 9, 8 };
+ for (int i = 0; i < sizeof(in); i++) {
+ uint8_t frame[32];
+ memset(frame, in[i], sizeof(frame));
+ rifo_in(&rifo, frame, init_next_out_fn + in[i]);
+ }
+
+ for (int i = 0; i < 10; i++) {
+ uint8_t frame[32];
+ memset(frame, 0xff, sizeof(frame));
+ rifo_out(&rifo, frame);
+ }
+}
+
+static void reordered_delta_in(void)
+{
+ struct frame_rifo rifo;
+ uint8_t frame[32];
+ rifo_init(&rifo);
+
+ printf("\nTEST: %s, starting at FN: %u\n", __func__, init_next_out_fn);
+
+ /* Packet A: frame 0, all timeslots */
+ memset(frame, 0, sizeof(frame));
+ frame[1] = 0x11;
+ frame[2] = 0x22;
+ rifo_in_mask(&rifo, frame, 0xffffffff, init_next_out_fn + 0);
+
+ /* Packet C (frame 3 and 4): only ts2 present -- delivered early */
+ memset(frame, 0, sizeof(frame));
+ frame[2] = 0x44;
+ rifo_in_mask(&rifo, frame, 1U << 2, init_next_out_fn + 3);
+ rifo_in_mask(&rifo, frame, 1U << 2, init_next_out_fn + 4);
+
+ /* Packet B (frame 1 and 2): only ts1 present -- delivered late */
+ memset(frame, 0, sizeof(frame));
+ frame[1] = 0x33;
+ rifo_in_mask(&rifo, frame, 1U << 1, init_next_out_fn + 1);
+ rifo_in_mask(&rifo, frame, 1U << 1, init_next_out_fn + 2);
+
+ for (int i = 0; i < 5; i++) {
+ memset(frame, 0xff, sizeof(frame));
+ rifo_out(&rifo, frame);
+ }
+}
+
static void correct_order(void)
{
struct frame_rifo rifo;
@@ -156,7 +218,7 @@
// Put 1 frame and get it
memset(frame, 0xa5, sizeof(frame));
- frame_rifo_in(&rifo, frame, init_next_out_fn);
+ frame_rifo_in(&rifo, frame, 0xffffffff, init_next_out_fn);
frame_rifo_out(&rifo, frame);
// Put 11 frames at absolute frame numbers FRAMES_PER_FIFO -
@@ -191,6 +253,8 @@
missing_frames(0);
missing_frames(1);
reordered_in();
+ tail_reordered_in();
+ reordered_delta_in();
correct_order();
too_old_frames();
bound_check();
diff --git a/tests/rifo/rifo_test.ok b/tests/rifo/rifo_test.ok
index 564acf3..1b11f3c 100644
--- a/tests/rifo/rifo_test.ok
+++ b/tests/rifo/rifo_test.ok
@@ -6,15 +6,15 @@
RIFO_IN(0606060606060606060606060606060606060606060606060606060606060606, start fn + 6)=0 [depth=7, frames=4]
RIFO_IN(0808080808080808080808080808080808080808080808080808080808080808, start fn + 8)=0 [depth=9, frames=5]
RIFO_OUT(0000000000000000000000000000000000000000000000000000000000000000)=0 [depth=8, frames=4]
-RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 [depth=7, frames=4]
+RIFO_OUT(0000000000000000000000000000000000000000000000000000000000000000)=-1 [depth=7, frames=4]
RIFO_OUT(0202020202020202020202020202020202020202020202020202020202020202)=0 [depth=6, frames=3]
-RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 [depth=5, frames=3]
+RIFO_OUT(0202020202020202020202020202020202020202020202020202020202020202)=-1 [depth=5, frames=3]
RIFO_OUT(0404040404040404040404040404040404040404040404040404040404040404)=0 [depth=4, frames=2]
-RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 [depth=3, frames=2]
+RIFO_OUT(0404040404040404040404040404040404040404040404040404040404040404)=-1 [depth=3, frames=2]
RIFO_OUT(0606060606060606060606060606060606060606060606060606060606060606)=0 [depth=2, frames=1]
-RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 [depth=1, frames=1]
+RIFO_OUT(0606060606060606060606060606060606060606060606060606060606060606)=-1 [depth=1, frames=1]
RIFO_OUT(0808080808080808080808080808080808080808080808080808080808080808)=0 [depth=0, frames=0]
-RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-2 [depth=0, frames=0]
+RIFO_OUT(0808080808080808080808080808080808080808080808080808080808080808)=-2 [depth=0, frames=0]
TEST: missing_frames, starting at FN: 0
RIFO_IN(0101010101010101010101010101010101010101010101010101010101010101, start fn + 1)=0 [depth=2, frames=1]
@@ -24,22 +24,22 @@
RIFO_IN(0909090909090909090909090909090909090909090909090909090909090909, start fn + 9)=0 [depth=10, frames=5]
RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 [depth=9, frames=5]
RIFO_OUT(0101010101010101010101010101010101010101010101010101010101010101)=0 [depth=8, frames=4]
-RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 [depth=7, frames=4]
+RIFO_OUT(0101010101010101010101010101010101010101010101010101010101010101)=-1 [depth=7, frames=4]
RIFO_OUT(0303030303030303030303030303030303030303030303030303030303030303)=0 [depth=6, frames=3]
-RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 [depth=5, frames=3]
+RIFO_OUT(0303030303030303030303030303030303030303030303030303030303030303)=-1 [depth=5, frames=3]
RIFO_OUT(0505050505050505050505050505050505050505050505050505050505050505)=0 [depth=4, frames=2]
-RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 [depth=3, frames=2]
+RIFO_OUT(0505050505050505050505050505050505050505050505050505050505050505)=-1 [depth=3, frames=2]
RIFO_OUT(0707070707070707070707070707070707070707070707070707070707070707)=0 [depth=2, frames=1]
-RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 [depth=1, frames=1]
+RIFO_OUT(0707070707070707070707070707070707070707070707070707070707070707)=-1 [depth=1, frames=1]
RIFO_OUT(0909090909090909090909090909090909090909090909090909090909090909)=0 [depth=0, frames=0]
TEST: reordered_in, starting at FN: 0
RIFO_IN(0000000000000000000000000000000000000000000000000000000000000000, start fn + 0)=0 [depth=1, frames=1]
RIFO_IN(0101010101010101010101010101010101010101010101010101010101010101, start fn + 1)=0 [depth=2, frames=2]
RIFO_IN(0404040404040404040404040404040404040404040404040404040404040404, start fn + 4)=0 [depth=5, frames=3]
-RIFO_IN(0303030303030303030303030303030303030303030303030303030303030303, start fn + 3)=0 [depth=4, frames=4]
+RIFO_IN(0303030303030303030303030303030303030303030303030303030303030303, start fn + 3)=0 [depth=5, frames=4]
RIFO_IN(0505050505050505050505050505050505050505050505050505050505050505, start fn + 5)=0 [depth=6, frames=5]
-RIFO_IN(0202020202020202020202020202020202020202020202020202020202020202, start fn + 2)=0 [depth=3, frames=6]
+RIFO_IN(0202020202020202020202020202020202020202020202020202020202020202, start fn + 2)=0 [depth=6, frames=6]
RIFO_IN(0606060606060606060606060606060606060606060606060606060606060606, start fn + 6)=0 [depth=7, frames=7]
RIFO_IN(0707070707070707070707070707070707070707070707070707070707070707, start fn + 7)=0 [depth=8, frames=8]
RIFO_IN(0808080808080808080808080808080808080808080808080808080808080808, start fn + 8)=0 [depth=9, frames=9]
@@ -55,6 +55,40 @@
RIFO_OUT(0808080808080808080808080808080808080808080808080808080808080808)=0 [depth=1, frames=1]
RIFO_OUT(0909090909090909090909090909090909090909090909090909090909090909)=0 [depth=0, frames=0]
+TEST: tail_reordered_in, starting at FN: 0
+RIFO_IN(0000000000000000000000000000000000000000000000000000000000000000, start fn + 0)=0 [depth=1, frames=1]
+RIFO_IN(0101010101010101010101010101010101010101010101010101010101010101, start fn + 1)=0 [depth=2, frames=2]
+RIFO_IN(0202020202020202020202020202020202020202020202020202020202020202, start fn + 2)=0 [depth=3, frames=3]
+RIFO_IN(0303030303030303030303030303030303030303030303030303030303030303, start fn + 3)=0 [depth=4, frames=4]
+RIFO_IN(0404040404040404040404040404040404040404040404040404040404040404, start fn + 4)=0 [depth=5, frames=5]
+RIFO_IN(0505050505050505050505050505050505050505050505050505050505050505, start fn + 5)=0 [depth=6, frames=6]
+RIFO_IN(0606060606060606060606060606060606060606060606060606060606060606, start fn + 6)=0 [depth=7, frames=7]
+RIFO_IN(0707070707070707070707070707070707070707070707070707070707070707, start fn + 7)=0 [depth=8, frames=8]
+RIFO_IN(0909090909090909090909090909090909090909090909090909090909090909, start fn + 9)=0 [depth=10, frames=9]
+RIFO_IN(0808080808080808080808080808080808080808080808080808080808080808, start fn + 8)=0 [depth=10, frames=10]
+RIFO_OUT(0000000000000000000000000000000000000000000000000000000000000000)=0 [depth=9, frames=9]
+RIFO_OUT(0101010101010101010101010101010101010101010101010101010101010101)=0 [depth=8, frames=8]
+RIFO_OUT(0202020202020202020202020202020202020202020202020202020202020202)=0 [depth=7, frames=7]
+RIFO_OUT(0303030303030303030303030303030303030303030303030303030303030303)=0 [depth=6, frames=6]
+RIFO_OUT(0404040404040404040404040404040404040404040404040404040404040404)=0 [depth=5, frames=5]
+RIFO_OUT(0505050505050505050505050505050505050505050505050505050505050505)=0 [depth=4, frames=4]
+RIFO_OUT(0606060606060606060606060606060606060606060606060606060606060606)=0 [depth=3, frames=3]
+RIFO_OUT(0707070707070707070707070707070707070707070707070707070707070707)=0 [depth=2, frames=2]
+RIFO_OUT(0808080808080808080808080808080808080808080808080808080808080808)=0 [depth=1, frames=1]
+RIFO_OUT(0909090909090909090909090909090909090909090909090909090909090909)=0 [depth=0, frames=0]
+
+TEST: reordered_delta_in, starting at FN: 0
+RIFO_IN(0011220000000000000000000000000000000000000000000000000000000000, mask=0xffffffff, start fn + 0)=0 [depth=1, frames=1]
+RIFO_IN(0000440000000000000000000000000000000000000000000000000000000000, mask=0x00000004, start fn + 3)=0 [depth=4, frames=2]
+RIFO_IN(0000440000000000000000000000000000000000000000000000000000000000, mask=0x00000004, start fn + 4)=0 [depth=5, frames=3]
+RIFO_IN(0033000000000000000000000000000000000000000000000000000000000000, mask=0x00000002, start fn + 1)=0 [depth=5, frames=4]
+RIFO_IN(0033000000000000000000000000000000000000000000000000000000000000, mask=0x00000002, start fn + 2)=0 [depth=5, frames=5]
+RIFO_OUT(0011220000000000000000000000000000000000000000000000000000000000)=0 [depth=4, frames=4]
+RIFO_OUT(0033220000000000000000000000000000000000000000000000000000000000)=0 [depth=3, frames=3]
+RIFO_OUT(0033220000000000000000000000000000000000000000000000000000000000)=0 [depth=2, frames=2]
+RIFO_OUT(0033440000000000000000000000000000000000000000000000000000000000)=0 [depth=1, frames=1]
+RIFO_OUT(0033440000000000000000000000000000000000000000000000000000000000)=0 [depth=0, frames=0]
+
TEST: correct_order, starting at FN: 0
RIFO_IN(0000000000000000000000000000000000000000000000000000000000000000, start fn + 0)=0 [depth=1, frames=1]
RIFO_IN(0101010101010101010101010101010101010101010101010101010101010101, start fn + 1)=0 [depth=2, frames=2]
@@ -130,15 +164,15 @@
RIFO_IN(0606060606060606060606060606060606060606060606060606060606060606, start fn + 6)=0 [depth=7, frames=4]
RIFO_IN(0808080808080808080808080808080808080808080808080808080808080808, start fn + 8)=0 [depth=9, frames=5]
RIFO_OUT(0000000000000000000000000000000000000000000000000000000000000000)=0 [depth=8, frames=4]
-RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 [depth=7, frames=4]
+RIFO_OUT(0000000000000000000000000000000000000000000000000000000000000000)=-1 [depth=7, frames=4]
RIFO_OUT(0202020202020202020202020202020202020202020202020202020202020202)=0 [depth=6, frames=3]
-RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 [depth=5, frames=3]
+RIFO_OUT(0202020202020202020202020202020202020202020202020202020202020202)=-1 [depth=5, frames=3]
RIFO_OUT(0404040404040404040404040404040404040404040404040404040404040404)=0 [depth=4, frames=2]
-RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 [depth=3, frames=2]
+RIFO_OUT(0404040404040404040404040404040404040404040404040404040404040404)=-1 [depth=3, frames=2]
RIFO_OUT(0606060606060606060606060606060606060606060606060606060606060606)=0 [depth=2, frames=1]
-RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 [depth=1, frames=1]
+RIFO_OUT(0606060606060606060606060606060606060606060606060606060606060606)=-1 [depth=1, frames=1]
RIFO_OUT(0808080808080808080808080808080808080808080808080808080808080808)=0 [depth=0, frames=0]
-RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-2 [depth=0, frames=0]
+RIFO_OUT(0808080808080808080808080808080808080808080808080808080808080808)=-2 [depth=0, frames=0]
TEST: missing_frames, starting at FN: 4294967290
RIFO_IN(0101010101010101010101010101010101010101010101010101010101010101, start fn + 1)=0 [depth=2, frames=1]
@@ -148,22 +182,22 @@
RIFO_IN(0909090909090909090909090909090909090909090909090909090909090909, start fn + 9)=0 [depth=10, frames=5]
RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 [depth=9, frames=5]
RIFO_OUT(0101010101010101010101010101010101010101010101010101010101010101)=0 [depth=8, frames=4]
-RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 [depth=7, frames=4]
+RIFO_OUT(0101010101010101010101010101010101010101010101010101010101010101)=-1 [depth=7, frames=4]
RIFO_OUT(0303030303030303030303030303030303030303030303030303030303030303)=0 [depth=6, frames=3]
-RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 [depth=5, frames=3]
+RIFO_OUT(0303030303030303030303030303030303030303030303030303030303030303)=-1 [depth=5, frames=3]
RIFO_OUT(0505050505050505050505050505050505050505050505050505050505050505)=0 [depth=4, frames=2]
-RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 [depth=3, frames=2]
+RIFO_OUT(0505050505050505050505050505050505050505050505050505050505050505)=-1 [depth=3, frames=2]
RIFO_OUT(0707070707070707070707070707070707070707070707070707070707070707)=0 [depth=2, frames=1]
-RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 [depth=1, frames=1]
+RIFO_OUT(0707070707070707070707070707070707070707070707070707070707070707)=-1 [depth=1, frames=1]
RIFO_OUT(0909090909090909090909090909090909090909090909090909090909090909)=0 [depth=0, frames=0]
TEST: reordered_in, starting at FN: 4294967290
RIFO_IN(0000000000000000000000000000000000000000000000000000000000000000, start fn + 0)=0 [depth=1, frames=1]
RIFO_IN(0101010101010101010101010101010101010101010101010101010101010101, start fn + 1)=0 [depth=2, frames=2]
RIFO_IN(0404040404040404040404040404040404040404040404040404040404040404, start fn + 4)=0 [depth=5, frames=3]
-RIFO_IN(0303030303030303030303030303030303030303030303030303030303030303, start fn + 3)=0 [depth=4, frames=4]
+RIFO_IN(0303030303030303030303030303030303030303030303030303030303030303, start fn + 3)=0 [depth=5, frames=4]
RIFO_IN(0505050505050505050505050505050505050505050505050505050505050505, start fn + 5)=0 [depth=6, frames=5]
-RIFO_IN(0202020202020202020202020202020202020202020202020202020202020202, start fn + 2)=0 [depth=3, frames=6]
+RIFO_IN(0202020202020202020202020202020202020202020202020202020202020202, start fn + 2)=0 [depth=6, frames=6]
RIFO_IN(0606060606060606060606060606060606060606060606060606060606060606, start fn + 6)=0 [depth=7, frames=7]
RIFO_IN(0707070707070707070707070707070707070707070707070707070707070707, start fn + 7)=0 [depth=8, frames=8]
RIFO_IN(0808080808080808080808080808080808080808080808080808080808080808, start fn + 8)=0 [depth=9, frames=9]
@@ -179,6 +213,40 @@
RIFO_OUT(0808080808080808080808080808080808080808080808080808080808080808)=0 [depth=1, frames=1]
RIFO_OUT(0909090909090909090909090909090909090909090909090909090909090909)=0 [depth=0, frames=0]
+TEST: tail_reordered_in, starting at FN: 4294967290
+RIFO_IN(0000000000000000000000000000000000000000000000000000000000000000, start fn + 0)=0 [depth=1, frames=1]
+RIFO_IN(0101010101010101010101010101010101010101010101010101010101010101, start fn + 1)=0 [depth=2, frames=2]
+RIFO_IN(0202020202020202020202020202020202020202020202020202020202020202, start fn + 2)=0 [depth=3, frames=3]
+RIFO_IN(0303030303030303030303030303030303030303030303030303030303030303, start fn + 3)=0 [depth=4, frames=4]
+RIFO_IN(0404040404040404040404040404040404040404040404040404040404040404, start fn + 4)=0 [depth=5, frames=5]
+RIFO_IN(0505050505050505050505050505050505050505050505050505050505050505, start fn + 5)=0 [depth=6, frames=6]
+RIFO_IN(0606060606060606060606060606060606060606060606060606060606060606, start fn + 6)=0 [depth=7, frames=7]
+RIFO_IN(0707070707070707070707070707070707070707070707070707070707070707, start fn + 7)=0 [depth=8, frames=8]
+RIFO_IN(0909090909090909090909090909090909090909090909090909090909090909, start fn + 9)=0 [depth=10, frames=9]
+RIFO_IN(0808080808080808080808080808080808080808080808080808080808080808, start fn + 8)=0 [depth=10, frames=10]
+RIFO_OUT(0000000000000000000000000000000000000000000000000000000000000000)=0 [depth=9, frames=9]
+RIFO_OUT(0101010101010101010101010101010101010101010101010101010101010101)=0 [depth=8, frames=8]
+RIFO_OUT(0202020202020202020202020202020202020202020202020202020202020202)=0 [depth=7, frames=7]
+RIFO_OUT(0303030303030303030303030303030303030303030303030303030303030303)=0 [depth=6, frames=6]
+RIFO_OUT(0404040404040404040404040404040404040404040404040404040404040404)=0 [depth=5, frames=5]
+RIFO_OUT(0505050505050505050505050505050505050505050505050505050505050505)=0 [depth=4, frames=4]
+RIFO_OUT(0606060606060606060606060606060606060606060606060606060606060606)=0 [depth=3, frames=3]
+RIFO_OUT(0707070707070707070707070707070707070707070707070707070707070707)=0 [depth=2, frames=2]
+RIFO_OUT(0808080808080808080808080808080808080808080808080808080808080808)=0 [depth=1, frames=1]
+RIFO_OUT(0909090909090909090909090909090909090909090909090909090909090909)=0 [depth=0, frames=0]
+
+TEST: reordered_delta_in, starting at FN: 4294967290
+RIFO_IN(0011220000000000000000000000000000000000000000000000000000000000, mask=0xffffffff, start fn + 0)=0 [depth=1, frames=1]
+RIFO_IN(0000440000000000000000000000000000000000000000000000000000000000, mask=0x00000004, start fn + 3)=0 [depth=4, frames=2]
+RIFO_IN(0000440000000000000000000000000000000000000000000000000000000000, mask=0x00000004, start fn + 4)=0 [depth=5, frames=3]
+RIFO_IN(0033000000000000000000000000000000000000000000000000000000000000, mask=0x00000002, start fn + 1)=0 [depth=5, frames=4]
+RIFO_IN(0033000000000000000000000000000000000000000000000000000000000000, mask=0x00000002, start fn + 2)=0 [depth=5, frames=5]
+RIFO_OUT(0011220000000000000000000000000000000000000000000000000000000000)=0 [depth=4, frames=4]
+RIFO_OUT(0033220000000000000000000000000000000000000000000000000000000000)=0 [depth=3, frames=3]
+RIFO_OUT(0033220000000000000000000000000000000000000000000000000000000000)=0 [depth=2, frames=2]
+RIFO_OUT(0033440000000000000000000000000000000000000000000000000000000000)=0 [depth=1, frames=1]
+RIFO_OUT(0033440000000000000000000000000000000000000000000000000000000000)=0 [depth=0, frames=0]
+
TEST: correct_order, starting at FN: 4294967290
RIFO_IN(0000000000000000000000000000000000000000000000000000000000000000, start fn + 0)=0 [depth=1, frames=1]
RIFO_IN(0101010101010101010101010101010101010101010101010101010101010101, start fn + 1)=0 [depth=2, frames=2]
To view, visit change 43643. To unsubscribe, or for help writing mail filters, visit settings.