test_streamparse.c revision 6ff1e9b8
106b2a236SDmitri Tikhonov/* Copyright (c) 2017 - 2021 LiteSpeed Technologies Inc.  See LICENSE. */
250aadb33SDmitri Tikhonov#include <assert.h>
350aadb33SDmitri Tikhonov#include <stdio.h>
450aadb33SDmitri Tikhonov#include <stdlib.h>
550aadb33SDmitri Tikhonov#include <string.h>
6461e84d8SAmol Deshpande#ifndef WIN32
750aadb33SDmitri Tikhonov#include <sys/time.h>
8461e84d8SAmol Deshpande#endif
9461e84d8SAmol Deshpande#include <sys/queue.h>
1050aadb33SDmitri Tikhonov
11461e84d8SAmol Deshpande#include "lsquic.h"
1250aadb33SDmitri Tikhonov#include "lsquic_types.h"
1350aadb33SDmitri Tikhonov#include "lsquic_parse.h"
14bfc7bfd8SDmitri Tikhonov#include "lsquic_packet_common.h"
1550aadb33SDmitri Tikhonov#include "lsquic_packet_in.h"
1650aadb33SDmitri Tikhonov
1750aadb33SDmitri Tikhonovstruct test {
1850aadb33SDmitri Tikhonov    const char     *name;
1950aadb33SDmitri Tikhonov    int             lineno;
2050aadb33SDmitri Tikhonov    const struct parse_funcs *
2150aadb33SDmitri Tikhonov                    pf;
2250aadb33SDmitri Tikhonov    const unsigned char
2350aadb33SDmitri Tikhonov                    buf[0x100];    /* Large enough for our needs */
2450aadb33SDmitri Tikhonov    size_t          buf_sz;        /* # of stream frame bytes in `buf' */
2550aadb33SDmitri Tikhonov    size_t          rem_packet_sz; /* # of bytes remaining in the packet,
2650aadb33SDmitri Tikhonov                                    * starting at the beginning of the
2750aadb33SDmitri Tikhonov                                    * stream frame.
2850aadb33SDmitri Tikhonov                                    */
2950aadb33SDmitri Tikhonov    stream_frame_t  frame;         /* Expected values */
3050aadb33SDmitri Tikhonov    int             should_succeed;
3150aadb33SDmitri Tikhonov};
3250aadb33SDmitri Tikhonov
3350aadb33SDmitri Tikhonovstatic void
3450aadb33SDmitri Tikhonovrun_test (const struct test *test)
3550aadb33SDmitri Tikhonov{
3650aadb33SDmitri Tikhonov    stream_frame_t frame;
3750aadb33SDmitri Tikhonov    memset(&frame, 0x7A, sizeof(frame));
3850aadb33SDmitri Tikhonov
3950aadb33SDmitri Tikhonov    int len = test->pf->pf_parse_stream_frame(test->buf, test->rem_packet_sz, &frame);
4050aadb33SDmitri Tikhonov
4150aadb33SDmitri Tikhonov    if (test->should_succeed) {
4250aadb33SDmitri Tikhonov        /* Check parser operation */
4350aadb33SDmitri Tikhonov        assert(("Parsed correct number of bytes", (size_t) len == test->buf_sz + test->frame.data_frame.df_size));
4450aadb33SDmitri Tikhonov        assert(("Stream ID is correct", frame.stream_id == test->frame.stream_id));
4550aadb33SDmitri Tikhonov        assert(("Data length is correct", frame.data_frame.df_size == test->frame.data_frame.df_size));
4650aadb33SDmitri Tikhonov        assert(("Offset is correct", frame.data_frame.df_offset == test->frame.data_frame.df_offset));
4750aadb33SDmitri Tikhonov        assert(("FIN is correct", frame.data_frame.df_fin == test->frame.data_frame.df_fin));
4850aadb33SDmitri Tikhonov
4950aadb33SDmitri Tikhonov        /* Check that initialization of other fields occurred correctly: */
5050aadb33SDmitri Tikhonov        assert(0 == frame.packet_in);
5150aadb33SDmitri Tikhonov        assert(0 == frame.data_frame.df_read_off);
5250aadb33SDmitri Tikhonov    }
5350aadb33SDmitri Tikhonov    else
5450aadb33SDmitri Tikhonov    {
5550aadb33SDmitri Tikhonov        assert(("This test should fail", len < 0));
5650aadb33SDmitri Tikhonov    }
5750aadb33SDmitri Tikhonov}
5850aadb33SDmitri Tikhonov
5950aadb33SDmitri Tikhonov
6050aadb33SDmitri Tikhonovint
6150aadb33SDmitri Tikhonovmain (void)
6250aadb33SDmitri Tikhonov{
63f07b3eaeSTyler Young
646ff1e9b8SGeorge Wang    const struct test tests[] = {
65f07b3eaeSTyler Young
666ff1e9b8SGeorge Wang        /*
676ff1e9b8SGeorge Wang         * Big-endian tests
686ff1e9b8SGeorge Wang         */
696ff1e9b8SGeorge Wang        {   "Balls to the wall: every possible bit is set",
706ff1e9b8SGeorge Wang            __LINE__,
716ff1e9b8SGeorge Wang            select_pf_by_ver(LSQVER_043),
726ff1e9b8SGeorge Wang          /*  1      f      d      ooo    ss            1fdoooss */
736ff1e9b8SGeorge Wang          /*  TYPE   FIN    DLEN   OLEN   SLEN  */
746ff1e9b8SGeorge Wang            { 0x80 | 0x40 | 0x20 | 0x1C | 0x3,
756ff1e9b8SGeorge Wang              0x00, 0x00, 0x02, 0x10,                           /* Stream ID */
766ff1e9b8SGeorge Wang              0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01,   /* Offset */
776ff1e9b8SGeorge Wang              0x01, 0xC4,                                       /* Data length */
786ff1e9b8SGeorge Wang            },
796ff1e9b8SGeorge Wang              1           + 2    + 8    + 4,
806ff1e9b8SGeorge Wang            0x200,
816ff1e9b8SGeorge Wang            {   .data_frame.df_offset      = 0x0807060504030201UL,
826ff1e9b8SGeorge Wang                .stream_id   = 0x210,
836ff1e9b8SGeorge Wang                .data_frame.df_size = 0x1C4,
846ff1e9b8SGeorge Wang                .data_frame.df_fin         = 1,
856ff1e9b8SGeorge Wang            },
866ff1e9b8SGeorge Wang            1,
876ff1e9b8SGeorge Wang        },
88f07b3eaeSTyler Young
896ff1e9b8SGeorge Wang        {   "Balls to the wall #2: every possible bit is set, except FIN",
906ff1e9b8SGeorge Wang            __LINE__,
916ff1e9b8SGeorge Wang            select_pf_by_ver(LSQVER_043),
926ff1e9b8SGeorge Wang          /*  1      f      d      ooo    ss            1fdoooss */
936ff1e9b8SGeorge Wang          /*  TYPE   FIN    DLEN   OLEN   SLEN  */
946ff1e9b8SGeorge Wang            { 0x80 | 0x00 | 0x20 | 0x1C | 0x3,
956ff1e9b8SGeorge Wang              0x00, 0x00, 0x02, 0x10,                           /* Stream ID */
966ff1e9b8SGeorge Wang              0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01,   /* Offset */
976ff1e9b8SGeorge Wang              0x01, 0xC4,                                       /* Data length */
986ff1e9b8SGeorge Wang            },
996ff1e9b8SGeorge Wang              1           + 2    + 8    + 4,
1006ff1e9b8SGeorge Wang            0x200,
1016ff1e9b8SGeorge Wang            {   .data_frame.df_offset      = 0x0807060504030201UL,
1026ff1e9b8SGeorge Wang                .stream_id   = 0x210,
1036ff1e9b8SGeorge Wang                .data_frame.df_size = 0x1C4,
1046ff1e9b8SGeorge Wang                .data_frame.df_fin         = 0,
1056ff1e9b8SGeorge Wang            },
1066ff1e9b8SGeorge Wang            1,
1076ff1e9b8SGeorge Wang        },
108f07b3eaeSTyler Young
1096ff1e9b8SGeorge Wang        {   "Data length is zero",
1106ff1e9b8SGeorge Wang            __LINE__,
1116ff1e9b8SGeorge Wang            select_pf_by_ver(LSQVER_043),
1126ff1e9b8SGeorge Wang          /*  1      f      d      ooo    ss            1fdoooss */
1136ff1e9b8SGeorge Wang          /*  TYPE   FIN    DLEN   OLEN   SLEN  */
1146ff1e9b8SGeorge Wang            { 0x80 | 0x40 | 0x00 | 0x1C | 0x3,
1156ff1e9b8SGeorge Wang              0x00, 0x00, 0x02, 0x10,                           /* Stream ID */
1166ff1e9b8SGeorge Wang              0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01,   /* Offset */
1176ff1e9b8SGeorge Wang              0xC4, 0x01,                                       /* Data length: note this does not matter */
1186ff1e9b8SGeorge Wang            },
1196ff1e9b8SGeorge Wang              1           + 0    + 8    + 4,
1206ff1e9b8SGeorge Wang            0x200,
1216ff1e9b8SGeorge Wang            {   .data_frame.df_offset      = 0x0807060504030201UL,
1226ff1e9b8SGeorge Wang                .stream_id   = 0x210,
1236ff1e9b8SGeorge Wang                .data_frame.df_size = 0x200 - (1 + 8 + 4),
1246ff1e9b8SGeorge Wang                .data_frame.df_fin         = 1,
1256ff1e9b8SGeorge Wang            },
1266ff1e9b8SGeorge Wang            1,
1276ff1e9b8SGeorge Wang        },
128f07b3eaeSTyler Young
1296ff1e9b8SGeorge Wang        {   "Stream ID length is 1",
1306ff1e9b8SGeorge Wang            __LINE__,
1316ff1e9b8SGeorge Wang            select_pf_by_ver(LSQVER_043),
1326ff1e9b8SGeorge Wang          /*  1      f      d      ooo    ss            1fdoooss */
1336ff1e9b8SGeorge Wang          /*  TYPE   FIN    DLEN   OLEN   SLEN  */
1346ff1e9b8SGeorge Wang            { 0x80 | 0x40 | 0x20 | 0x1C | 0x0,
1356ff1e9b8SGeorge Wang              0xF0,                                             /* Stream ID */
1366ff1e9b8SGeorge Wang              0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01,   /* Offset */
1376ff1e9b8SGeorge Wang              0x01, 0xC4,                                       /* Data length */
1386ff1e9b8SGeorge Wang            },
1396ff1e9b8SGeorge Wang              1           + 2    + 8    + 1,
1406ff1e9b8SGeorge Wang            0x200,
1416ff1e9b8SGeorge Wang            {   .data_frame.df_offset      = 0x0807060504030201UL,
1426ff1e9b8SGeorge Wang                .stream_id   = 0xF0,
1436ff1e9b8SGeorge Wang                .data_frame.df_size = 0x1C4,
1446ff1e9b8SGeorge Wang                .data_frame.df_fin         = 1,
1456ff1e9b8SGeorge Wang            },
1466ff1e9b8SGeorge Wang            1,
1476ff1e9b8SGeorge Wang        },
148f07b3eaeSTyler Young
1496ff1e9b8SGeorge Wang        {   "All bits are zero save offset length",
1506ff1e9b8SGeorge Wang            __LINE__,
1516ff1e9b8SGeorge Wang            select_pf_by_ver(LSQVER_043),
1526ff1e9b8SGeorge Wang          /*  1      f      d      ooo    ss            1fdoooss */
1536ff1e9b8SGeorge Wang          /*  TYPE   FIN    DLEN   OLEN   SLEN  */
1546ff1e9b8SGeorge Wang            { 0x80 | 0x00 | 0x00 | 0x04 | 0x0,
1556ff1e9b8SGeorge Wang              0xF0,                                             /* Stream ID */
1566ff1e9b8SGeorge Wang              0x02, 0x55, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,   /* Offset */
1576ff1e9b8SGeorge Wang              0xC4, 0x01,                                       /* Data length */
1586ff1e9b8SGeorge Wang            },
1596ff1e9b8SGeorge Wang              1           + 0    + 2    + 1,
1606ff1e9b8SGeorge Wang            0x200,
1616ff1e9b8SGeorge Wang            {   .data_frame.df_offset      = 0x255,
1626ff1e9b8SGeorge Wang                .stream_id   = 0xF0,
1636ff1e9b8SGeorge Wang                .data_frame.df_size = 0x200 - 4,
1646ff1e9b8SGeorge Wang                .data_frame.df_fin         = 0,
1656ff1e9b8SGeorge Wang            },
1666ff1e9b8SGeorge Wang            1,
1676ff1e9b8SGeorge Wang        },
168f07b3eaeSTyler Young
1696ff1e9b8SGeorge Wang        {   "Sanity check: either FIN must be set or data length is not zero #1",
1706ff1e9b8SGeorge Wang            __LINE__,
1716ff1e9b8SGeorge Wang            select_pf_by_ver(LSQVER_043),
1726ff1e9b8SGeorge Wang          /*  1      f      d      ooo    ss            1fdoooss */
1736ff1e9b8SGeorge Wang          /*  TYPE   FIN    DLEN   OLEN   SLEN  */
1746ff1e9b8SGeorge Wang            { 0x80 | 0x00 | 0x00 | 0x04 | 0x0,
1756ff1e9b8SGeorge Wang              0xF0,                                             /* Stream ID */
1766ff1e9b8SGeorge Wang              0x02, 0x55,                                       /* Offset */
1776ff1e9b8SGeorge Wang            },
1786ff1e9b8SGeorge Wang              1           + 0    + 2    + 1,
1796ff1e9b8SGeorge Wang              4,    /* Same as buffer size: in the absense of explicit data
1806ff1e9b8SGeorge Wang                     * length in the header, this would mean that data
1816ff1e9b8SGeorge Wang                     * length is zero.
1826ff1e9b8SGeorge Wang                     */
1836ff1e9b8SGeorge Wang            {   .data_frame.df_offset      = 0x255,
1846ff1e9b8SGeorge Wang                .stream_id   = 0xF0,
1856ff1e9b8SGeorge Wang                .data_frame.df_size = 0x200 - 4,
1866ff1e9b8SGeorge Wang                .data_frame.df_fin         = 0,
1876ff1e9b8SGeorge Wang            },
1886ff1e9b8SGeorge Wang            0,
1896ff1e9b8SGeorge Wang        },
190f07b3eaeSTyler Young
1916ff1e9b8SGeorge Wang        {   "Sanity check: either FIN must be set or data length is not zero #2",
1926ff1e9b8SGeorge Wang            __LINE__,
1936ff1e9b8SGeorge Wang            select_pf_by_ver(LSQVER_043),
1946ff1e9b8SGeorge Wang          /*  1      f      d      ooo    ss            1fdoooss */
1956ff1e9b8SGeorge Wang          /*  TYPE   FIN    DLEN   OLEN   SLEN  */
1966ff1e9b8SGeorge Wang            { 0x80 | 0x00 | 0x20 | 0x04 | 0x0,
1976ff1e9b8SGeorge Wang              0xF0,                                             /* Stream ID */
1986ff1e9b8SGeorge Wang              0x02, 0x55,                                       /* Offset */
1996ff1e9b8SGeorge Wang              0x00, 0x00,
2006ff1e9b8SGeorge Wang            },
2016ff1e9b8SGeorge Wang              1           + 2    + 2    + 1,
2026ff1e9b8SGeorge Wang              200,
2036ff1e9b8SGeorge Wang            {   .data_frame.df_offset      = 0x255,
2046ff1e9b8SGeorge Wang                .stream_id   = 0xF0,
2056ff1e9b8SGeorge Wang                .data_frame.df_size = 0x200 - 4,
2066ff1e9b8SGeorge Wang                .data_frame.df_fin         = 0,
2076ff1e9b8SGeorge Wang            },
2086ff1e9b8SGeorge Wang            0,
2096ff1e9b8SGeorge Wang        },
210f07b3eaeSTyler Young
2116ff1e9b8SGeorge Wang        {   "Sanity check: either FIN must be set or data length is not zero #3",
2126ff1e9b8SGeorge Wang            __LINE__,
2136ff1e9b8SGeorge Wang            select_pf_by_ver(LSQVER_043),
2146ff1e9b8SGeorge Wang          /*  1      f      d      ooo    ss            1fdoooss */
2156ff1e9b8SGeorge Wang          /*  TYPE   FIN    DLEN   OLEN   SLEN  */
2166ff1e9b8SGeorge Wang            { 0x80 | 0x40 | 0x20 | 0x04 | 0x0,
2176ff1e9b8SGeorge Wang              0xF0,                                             /* Stream ID */
2186ff1e9b8SGeorge Wang              0x02, 0x55,                                       /* Offset */
2196ff1e9b8SGeorge Wang              0x00, 0x00,
2206ff1e9b8SGeorge Wang            },
2216ff1e9b8SGeorge Wang              1           + 2    + 2    + 1,
2226ff1e9b8SGeorge Wang              200,
2236ff1e9b8SGeorge Wang            {   .data_frame.df_offset      = 0x255,
2246ff1e9b8SGeorge Wang                .stream_id   = 0xF0,
2256ff1e9b8SGeorge Wang                .data_frame.df_size = 0x0,
2266ff1e9b8SGeorge Wang                .data_frame.df_fin         = 1,
2276ff1e9b8SGeorge Wang            },
2286ff1e9b8SGeorge Wang            1,
2296ff1e9b8SGeorge Wang        },
230f07b3eaeSTyler Young
2316ff1e9b8SGeorge Wang        {   "Check data bounds #1",
2326ff1e9b8SGeorge Wang            __LINE__,
2336ff1e9b8SGeorge Wang            select_pf_by_ver(LSQVER_043),
2346ff1e9b8SGeorge Wang          /*  1      f      d      ooo    ss            1fdoooss */
2356ff1e9b8SGeorge Wang          /*  TYPE   FIN    DLEN   OLEN   SLEN  */
2366ff1e9b8SGeorge Wang            { 0x80 | 0x00 | 0x20 | 0x04 | 0x0,
2376ff1e9b8SGeorge Wang              0xF0,                                             /* Stream ID */
2386ff1e9b8SGeorge Wang              0x02, 0x55,                                       /* Offset */
2396ff1e9b8SGeorge Wang              0x01, 0xFA,                                       /* Data length */
2406ff1e9b8SGeorge Wang            },
2416ff1e9b8SGeorge Wang              1           + 2    + 2    + 1,
2426ff1e9b8SGeorge Wang              0x200,
2436ff1e9b8SGeorge Wang            {   .data_frame.df_offset      = 0x255,
2446ff1e9b8SGeorge Wang                .stream_id   = 0xF0,
2456ff1e9b8SGeorge Wang                .data_frame.df_size = 0x1FA,
2466ff1e9b8SGeorge Wang                .data_frame.df_fin         = 0,
2476ff1e9b8SGeorge Wang            },
2486ff1e9b8SGeorge Wang            1,
2496ff1e9b8SGeorge Wang        },
250f07b3eaeSTyler Young
2516ff1e9b8SGeorge Wang        {   "Check data bounds #2",
2526ff1e9b8SGeorge Wang            __LINE__,
2536ff1e9b8SGeorge Wang            select_pf_by_ver(LSQVER_043),
2546ff1e9b8SGeorge Wang          /*  1      f      d      ooo    ss            1fdoooss */
2556ff1e9b8SGeorge Wang          /*  TYPE   FIN    DLEN   OLEN   SLEN  */
2566ff1e9b8SGeorge Wang            { 0x80 | 0x00 | 0x20 | 0x04 | 0x0,
2576ff1e9b8SGeorge Wang              0xF0,                                             /* Stream ID */
2586ff1e9b8SGeorge Wang              0x02, 0x55,                                       /* Offset */
2596ff1e9b8SGeorge Wang              0x01, 0xFB,    /* <---   One byte too many */
2606ff1e9b8SGeorge Wang            },
2616ff1e9b8SGeorge Wang              1           + 2    + 2    + 1,
2626ff1e9b8SGeorge Wang              0x200,
2636ff1e9b8SGeorge Wang            {   .data_frame.df_offset      = 0x255,
2646ff1e9b8SGeorge Wang                .stream_id   = 0xF0,
2656ff1e9b8SGeorge Wang                .data_frame.df_size = 0x1FA,
2666ff1e9b8SGeorge Wang                .data_frame.df_fin         = 0,
2676ff1e9b8SGeorge Wang            },
2686ff1e9b8SGeorge Wang            0,
2696ff1e9b8SGeorge Wang        },
270f07b3eaeSTyler Young
2716ff1e9b8SGeorge Wang        /*
2726ff1e9b8SGeorge Wang         * IETF QUIC Internet-Draft 14 Tests.
2736ff1e9b8SGeorge Wang         */
274f07b3eaeSTyler Young
2756ff1e9b8SGeorge Wang        {   "Balls to the wall: every possible bit is set",
2766ff1e9b8SGeorge Wang            __LINE__,
2776ff1e9b8SGeorge Wang            select_pf_by_ver(LSQVER_ID27),
2786ff1e9b8SGeorge Wang          /*  TYPE   OFF    DLEN   FIN   */
2796ff1e9b8SGeorge Wang            { 0x10 | 1<<2 | 1<<1 | 1<<0,
2806ff1e9b8SGeorge Wang              0x41, 0x23,                                       /* Stream ID */
2816ff1e9b8SGeorge Wang              0x08,                                             /* Offset */
2826ff1e9b8SGeorge Wang              0x41, 0xC4,                                       /* Data length */
2836ff1e9b8SGeorge Wang            },
2846ff1e9b8SGeorge Wang              1           + 2    + 1    + 2,
2856ff1e9b8SGeorge Wang            0x200,
2866ff1e9b8SGeorge Wang            {   .data_frame.df_offset       = 0x08,
2876ff1e9b8SGeorge Wang                .stream_id                  = 0x123,
2886ff1e9b8SGeorge Wang                .data_frame.df_size         = 0x1C4,
2896ff1e9b8SGeorge Wang                .data_frame.df_fin          = 1,
2906ff1e9b8SGeorge Wang            },
2916ff1e9b8SGeorge Wang            1,
2926ff1e9b8SGeorge Wang        },
293f07b3eaeSTyler Young
2946ff1e9b8SGeorge Wang        {   "Balls to the wall #2: every possible bit is set except FIN",
2956ff1e9b8SGeorge Wang            __LINE__,
2966ff1e9b8SGeorge Wang            select_pf_by_ver(LSQVER_ID27),
2976ff1e9b8SGeorge Wang          /*  TYPE   OFF    DLEN   FIN   */
2986ff1e9b8SGeorge Wang            { 0x10 | 1<<2 | 1<<1 | 0<<0,
2996ff1e9b8SGeorge Wang              0x81, 0x23, 0x00, 0xE4,                           /* Stream ID */
3006ff1e9b8SGeorge Wang              0xF0, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD,   /* Offset */
3016ff1e9b8SGeorge Wang              0x41, 0xC4,                                       /* Data length */
3026ff1e9b8SGeorge Wang            },
3036ff1e9b8SGeorge Wang              1           + 4    + 8    + 2,
3046ff1e9b8SGeorge Wang            0x200,
3056ff1e9b8SGeorge Wang            {   .data_frame.df_offset       = 0x301234567890ABCDull,
3066ff1e9b8SGeorge Wang                .stream_id                  = 0x12300E4,
3076ff1e9b8SGeorge Wang                .data_frame.df_size         = 0x1C4,
3086ff1e9b8SGeorge Wang                .data_frame.df_fin          = 0,
3096ff1e9b8SGeorge Wang            },
3106ff1e9b8SGeorge Wang            1,
3116ff1e9b8SGeorge Wang        },
312f07b3eaeSTyler Young
3136ff1e9b8SGeorge Wang        {   "Data length is zero",
3146ff1e9b8SGeorge Wang            __LINE__,
3156ff1e9b8SGeorge Wang            select_pf_by_ver(LSQVER_ID27),
3166ff1e9b8SGeorge Wang          /*  TYPE   OFF    DLEN   FIN   */
3176ff1e9b8SGeorge Wang            { 0x10 | 1<<2 | 0<<1 | 0<<0,
3186ff1e9b8SGeorge Wang              0x81, 0x23, 0x00, 0xE4,                           /* Stream ID */
3196ff1e9b8SGeorge Wang              0xF0, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD,   /* Offset */
3206ff1e9b8SGeorge Wang            },
3216ff1e9b8SGeorge Wang              1           + 4    + 8    + 0,
3226ff1e9b8SGeorge Wang            0x200,
3236ff1e9b8SGeorge Wang            {   .data_frame.df_offset       = 0x301234567890ABCDull,
3246ff1e9b8SGeorge Wang                .stream_id                  = 0x12300E4,
3256ff1e9b8SGeorge Wang                .data_frame.df_size         = 0x200 - 1 - 4 - 8,
3266ff1e9b8SGeorge Wang                .data_frame.df_fin          = 0,
3276ff1e9b8SGeorge Wang            },
3286ff1e9b8SGeorge Wang            1,
3296ff1e9b8SGeorge Wang        },
330f07b3eaeSTyler Young
3316ff1e9b8SGeorge Wang        {   "Sanity check: what happens when data length is zero #1",
3326ff1e9b8SGeorge Wang            __LINE__,
3336ff1e9b8SGeorge Wang            select_pf_by_ver(LSQVER_ID27),
3346ff1e9b8SGeorge Wang          /*  TYPE   OFF    DLEN   FIN   */
3356ff1e9b8SGeorge Wang            { 0x10 | 1<<2 | 1<<1 | 0<<0,
3366ff1e9b8SGeorge Wang              0x81, 0x23, 0x00, 0xE4,                           /* Stream ID */
3376ff1e9b8SGeorge Wang              0xF0, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD,   /* Offset */
3386ff1e9b8SGeorge Wang              0x40, 0x00,                                       /* Data length */
3396ff1e9b8SGeorge Wang            },
3406ff1e9b8SGeorge Wang              1           + 4    + 8    + 2,
3416ff1e9b8SGeorge Wang            0x200,
3426ff1e9b8SGeorge Wang            {   .data_frame.df_offset       = 0x301234567890ABCDull,
3436ff1e9b8SGeorge Wang                .stream_id                  = 0x12300E4,
3446ff1e9b8SGeorge Wang                .data_frame.df_size         = 0,
3456ff1e9b8SGeorge Wang                .data_frame.df_fin          = 0,
3466ff1e9b8SGeorge Wang            },
3476ff1e9b8SGeorge Wang            1,
3486ff1e9b8SGeorge Wang        },
349f07b3eaeSTyler Young
3506ff1e9b8SGeorge Wang        {   "Sanity check: what happens when data length is zero #2",
3516ff1e9b8SGeorge Wang            __LINE__,
3526ff1e9b8SGeorge Wang            select_pf_by_ver(LSQVER_ID27),
3536ff1e9b8SGeorge Wang          /*  TYPE   OFF    DLEN   FIN   */
3546ff1e9b8SGeorge Wang            { 0x10 | 1<<2 | 1<<1 | 0<<0,
3556ff1e9b8SGeorge Wang              0x81, 0x23, 0x00, 0xE4,                           /* Stream ID */
3566ff1e9b8SGeorge Wang              0x00,                                             /* Offset */
3576ff1e9b8SGeorge Wang              0x40, 0x00,                                       /* Data length */
3586ff1e9b8SGeorge Wang            },
3596ff1e9b8SGeorge Wang              1           + 4    + 1    + 2,
3606ff1e9b8SGeorge Wang            0x200,
3616ff1e9b8SGeorge Wang            {   .data_frame.df_offset       = 0,
3626ff1e9b8SGeorge Wang                .stream_id                  = 0x12300E4,
3636ff1e9b8SGeorge Wang                .data_frame.df_size         = 0,
3646ff1e9b8SGeorge Wang                .data_frame.df_fin          = 0,
3656ff1e9b8SGeorge Wang            },
3666ff1e9b8SGeorge Wang            1,
3676ff1e9b8SGeorge Wang        },
368f07b3eaeSTyler Young
3696ff1e9b8SGeorge Wang        {   "Sanity check: what happens when data length is zero #3",
3706ff1e9b8SGeorge Wang            __LINE__,
3716ff1e9b8SGeorge Wang            select_pf_by_ver(LSQVER_ID27),
3726ff1e9b8SGeorge Wang          /*  TYPE   OFF    DLEN   FIN   */
3736ff1e9b8SGeorge Wang            { 0x10 | 0<<2 | 1<<1 | 0<<0,
3746ff1e9b8SGeorge Wang              0x81, 0x23, 0x00, 0xE4,                           /* Stream ID */
3756ff1e9b8SGeorge Wang              0x40, 0x00,                                       /* Data length */
3766ff1e9b8SGeorge Wang            },
3776ff1e9b8SGeorge Wang              1           + 4    + 0    + 2,
3786ff1e9b8SGeorge Wang            0x200,
3796ff1e9b8SGeorge Wang            {   .data_frame.df_offset       = 0,
3806ff1e9b8SGeorge Wang                .stream_id                  = 0x12300E4,
3816ff1e9b8SGeorge Wang                .data_frame.df_size         = 0,
3826ff1e9b8SGeorge Wang                .data_frame.df_fin          = 0,
3836ff1e9b8SGeorge Wang            },
3846ff1e9b8SGeorge Wang            1,
3856ff1e9b8SGeorge Wang        },
386f07b3eaeSTyler Young
3876ff1e9b8SGeorge Wang        {   "Sanity check: what happens when data length is zero #3",
3886ff1e9b8SGeorge Wang            __LINE__,
3896ff1e9b8SGeorge Wang            select_pf_by_ver(LSQVER_ID27),
3906ff1e9b8SGeorge Wang          /*  TYPE   OFF    DLEN   FIN   */
3916ff1e9b8SGeorge Wang            { 0x10 | 1<<2 | 1<<1 | 1<<0,
3926ff1e9b8SGeorge Wang              0x81, 0x23, 0x00, 0xE4,                           /* Stream ID */
3936ff1e9b8SGeorge Wang              0x12,                                             /* Offset */
3946ff1e9b8SGeorge Wang              0x00,                                             /* Data length */
3956ff1e9b8SGeorge Wang            },
3966ff1e9b8SGeorge Wang              1           + 4    + 1    + 1,
3976ff1e9b8SGeorge Wang            0x200,
3986ff1e9b8SGeorge Wang            {   .data_frame.df_offset       = 0x12,
3996ff1e9b8SGeorge Wang                .stream_id                  = 0x12300E4,
4006ff1e9b8SGeorge Wang                .data_frame.df_size         = 0,
4016ff1e9b8SGeorge Wang                .data_frame.df_fin          = 1,
4026ff1e9b8SGeorge Wang            },
4036ff1e9b8SGeorge Wang            1,
4046ff1e9b8SGeorge Wang        },
405f07b3eaeSTyler Young
4066ff1e9b8SGeorge Wang        {   "Check data bounds #1",
4076ff1e9b8SGeorge Wang            __LINE__,
4086ff1e9b8SGeorge Wang            select_pf_by_ver(LSQVER_ID27),
4096ff1e9b8SGeorge Wang          /*  TYPE   OFF    DLEN   FIN   */
4106ff1e9b8SGeorge Wang            { 0x10 | 1<<2 | 1<<1 | 1<<0,
4116ff1e9b8SGeorge Wang              0x81, 0x23, 0x00, 0xE4,                           /* Stream ID */
4126ff1e9b8SGeorge Wang              0x12,                                             /* Offset */
4136ff1e9b8SGeorge Wang              0x41, 0xF8,                                       /* Data length */
4146ff1e9b8SGeorge Wang            },
4156ff1e9b8SGeorge Wang              1           + 4    + 1    + 2,
4166ff1e9b8SGeorge Wang            0x200,
4176ff1e9b8SGeorge Wang            {   .data_frame.df_offset       = 0x12,
4186ff1e9b8SGeorge Wang                .stream_id                  = 0x12300E4,
4196ff1e9b8SGeorge Wang                .data_frame.df_size         = 0x200 - 1 - 4 - 1 - 2,
4206ff1e9b8SGeorge Wang                .data_frame.df_fin          = 1,
4216ff1e9b8SGeorge Wang            },
4226ff1e9b8SGeorge Wang            1,
4236ff1e9b8SGeorge Wang        },
424f07b3eaeSTyler Young
4256ff1e9b8SGeorge Wang        {   "Check data bounds #2",
4266ff1e9b8SGeorge Wang            __LINE__,
4276ff1e9b8SGeorge Wang            select_pf_by_ver(LSQVER_ID27),
4286ff1e9b8SGeorge Wang          /*  TYPE   OFF    DLEN   FIN   */
4296ff1e9b8SGeorge Wang            { 0x10 | 1<<2 | 1<<1 | 1<<0,
4306ff1e9b8SGeorge Wang              0x81, 0x23, 0x00, 0xE4,                           /* Stream ID */
4316ff1e9b8SGeorge Wang              0x12,                                             /* Offset */
4326ff1e9b8SGeorge Wang              0x41, 0xF9,                                       /* Data length */
4336ff1e9b8SGeorge Wang            },
4346ff1e9b8SGeorge Wang              1           + 4    + 1    + 2,
4356ff1e9b8SGeorge Wang            0x200,
4366ff1e9b8SGeorge Wang            {   .data_frame.df_offset       = 0x12,
4376ff1e9b8SGeorge Wang                .stream_id                  = 0x12300E4,
4386ff1e9b8SGeorge Wang                .data_frame.df_size         = 0x200 - 1 - 4 - 1 - 2,
4396ff1e9b8SGeorge Wang                .data_frame.df_fin          = 1,
4406ff1e9b8SGeorge Wang            },
4416ff1e9b8SGeorge Wang            0,
4426ff1e9b8SGeorge Wang        },
443f07b3eaeSTyler Young
4446ff1e9b8SGeorge Wang    };
445f07b3eaeSTyler Young
44650aadb33SDmitri Tikhonov    unsigned i;
44750aadb33SDmitri Tikhonov    for (i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i)
44850aadb33SDmitri Tikhonov        run_test(&tests[i]);
44950aadb33SDmitri Tikhonov    return 0;
45050aadb33SDmitri Tikhonov}
451