net: Add unit tests for new nbuf API's
Tests for net_nbuf_read, net_nbuf_write and net_nbuf_skip API's. Change-Id: I77f702dda8c9df7892120f47ff03a6b256191d31 Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
This commit is contained in:
parent
618879ac6a
commit
913c1f29ca
2 changed files with 177 additions and 1 deletions
|
@ -6,7 +6,7 @@ CONFIG_NET_BUF=y
|
||||||
CONFIG_MAIN_STACK_SIZE=2048
|
CONFIG_MAIN_STACK_SIZE=2048
|
||||||
CONFIG_NET_NBUF_RX_COUNT=4
|
CONFIG_NET_NBUF_RX_COUNT=4
|
||||||
CONFIG_NET_NBUF_TX_COUNT=4
|
CONFIG_NET_NBUF_TX_COUNT=4
|
||||||
CONFIG_NET_NBUF_DATA_COUNT=25
|
CONFIG_NET_NBUF_DATA_COUNT=34
|
||||||
# The data size is calculated to be this, do not change
|
# The data size is calculated to be this, do not change
|
||||||
# it without fixing the tests.
|
# it without fixing the tests.
|
||||||
CONFIG_NET_NBUF_DATA_SIZE=100
|
CONFIG_NET_NBUF_DATA_SIZE=100
|
||||||
|
|
|
@ -584,6 +584,178 @@ static int test_fragment_pull(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char test_rw_short[] = "test-read-write-data";
|
||||||
|
static char test_rw_long[] =
|
||||||
|
"test-read-write-data-test-read-write"
|
||||||
|
"test-read-write-data-test-read-write"
|
||||||
|
"test-read-write-data-test-read-write"
|
||||||
|
"test-read-write-data-test-read-write"
|
||||||
|
"test-read-write-data-test-read-write"
|
||||||
|
"test-read-write-data-test-read-write";
|
||||||
|
|
||||||
|
static int test_nbuf_read_write(void)
|
||||||
|
{
|
||||||
|
struct net_buf *buf, *frag, *tfrag;
|
||||||
|
struct ipv6_hdr *ipv6;
|
||||||
|
struct udp_hdr *udp;
|
||||||
|
uint8_t verify_rw_short[sizeof(test_rw_short)];
|
||||||
|
uint8_t verify_rw_long[sizeof(test_rw_long)];
|
||||||
|
int bytes, remaining = strlen(example_data), pos = 0;
|
||||||
|
uint16_t off, tpos;
|
||||||
|
|
||||||
|
/* Example of multi fragment read, write and skip APS's */
|
||||||
|
buf = net_nbuf_get_reserve_rx(0);
|
||||||
|
frag = net_nbuf_get_reserve_data(LL_RESERVE);
|
||||||
|
|
||||||
|
/* Place the IP + UDP header in the first fragment */
|
||||||
|
if (!net_buf_tailroom(frag)) {
|
||||||
|
ipv6 = (struct ipv6_hdr *)(frag->data);
|
||||||
|
udp = (struct udp_hdr *)((void *)ipv6 + sizeof(*ipv6));
|
||||||
|
if (net_buf_tailroom(frag) < sizeof(ipv6)) {
|
||||||
|
printk("Not enough space for IPv6 header, "
|
||||||
|
"needed %zd bytes, has %zd bytes\n",
|
||||||
|
sizeof(ipv6), net_buf_tailroom(frag));
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
net_buf_add(frag, sizeof(ipv6));
|
||||||
|
|
||||||
|
if (net_buf_tailroom(frag) < sizeof(udp)) {
|
||||||
|
printk("Not enough space for UDP header, "
|
||||||
|
"needed %zd bytes, has %zd bytes\n",
|
||||||
|
sizeof(udp), net_buf_tailroom(frag));
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
net_nbuf_set_appdata(buf, (void *)udp + sizeof(*udp));
|
||||||
|
net_nbuf_set_appdatalen(buf, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
net_buf_frag_add(buf, frag);
|
||||||
|
|
||||||
|
/* Put some data to rest of the fragments */
|
||||||
|
frag = net_nbuf_get_reserve_data(LL_RESERVE);
|
||||||
|
if (net_buf_tailroom(frag) -
|
||||||
|
(CONFIG_NET_NBUF_DATA_SIZE - LL_RESERVE)) {
|
||||||
|
printk("Invalid number of bytes available in the buf, "
|
||||||
|
"should be 0 but was %zd - %d\n",
|
||||||
|
net_buf_tailroom(frag),
|
||||||
|
CONFIG_NET_NBUF_DATA_SIZE - LL_RESERVE);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (((int)net_buf_tailroom(frag) - remaining) > 0) {
|
||||||
|
printk("We should have been out of space now, "
|
||||||
|
"tailroom %zd user data len %zd\n",
|
||||||
|
net_buf_tailroom(frag),
|
||||||
|
strlen(example_data));
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (remaining > 0) {
|
||||||
|
int copy;
|
||||||
|
|
||||||
|
bytes = net_buf_tailroom(frag);
|
||||||
|
copy = remaining > bytes ? bytes : remaining;
|
||||||
|
memcpy(net_buf_add(frag, copy), &example_data[pos], copy);
|
||||||
|
|
||||||
|
printk("Remaining %d left %d copy %d\n", remaining, bytes,
|
||||||
|
copy);
|
||||||
|
|
||||||
|
pos += bytes;
|
||||||
|
remaining -= bytes;
|
||||||
|
if (net_buf_tailroom(frag) - (bytes - copy)) {
|
||||||
|
printk("There should have not been any tailroom left, "
|
||||||
|
"tailroom %zd\n",
|
||||||
|
net_buf_tailroom(frag) - (bytes - copy));
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
net_buf_frag_add(buf, frag);
|
||||||
|
if (remaining > 0) {
|
||||||
|
frag = net_nbuf_get_reserve_data(LL_RESERVE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bytes = net_buf_frags_len(buf->frags);
|
||||||
|
if (bytes != strlen(example_data)) {
|
||||||
|
printk("Invalid number of bytes in message, %zd vs %d\n",
|
||||||
|
strlen(example_data), bytes);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Short data test case */
|
||||||
|
/* Test case scenario:
|
||||||
|
* 1) Cache the current fragment and offset
|
||||||
|
* 2) Write short data
|
||||||
|
* 3) Write short data again
|
||||||
|
* 4) Skip first short data from cached frag or offset
|
||||||
|
* 5) Read short data and compare
|
||||||
|
*/
|
||||||
|
tfrag = net_buf_frag_last(buf->frags);
|
||||||
|
off = tfrag->len;
|
||||||
|
|
||||||
|
if (!net_nbuf_write(buf, sizeof(test_rw_short), test_rw_short)) {
|
||||||
|
printk("net_nbuf_write failed\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!net_nbuf_write(buf, sizeof(test_rw_short), test_rw_short)) {
|
||||||
|
printk("net_nbuf_write failed\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
tfrag = net_nbuf_skip(tfrag, off, &tpos, sizeof(test_rw_short));
|
||||||
|
if (!tfrag) {
|
||||||
|
printk("net_nbuf_skip failed\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
tfrag = net_nbuf_read(tfrag, tpos, &tpos, sizeof(test_rw_short),
|
||||||
|
verify_rw_short);
|
||||||
|
if (memcmp(test_rw_short, verify_rw_short, sizeof(test_rw_short))) {
|
||||||
|
printk("net_nbuf_read failed with mismatch data");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Long data test case */
|
||||||
|
/* Test case scenario:
|
||||||
|
* 1) Cache the current fragment and offset
|
||||||
|
* 2) Write long data
|
||||||
|
* 3) Write long data again
|
||||||
|
* 4) Skip first long data from cached frag or offset
|
||||||
|
* 5) Read long data and compare
|
||||||
|
*/
|
||||||
|
tfrag = net_buf_frag_last(buf->frags);
|
||||||
|
off = tfrag->len;
|
||||||
|
|
||||||
|
if (!net_nbuf_write(buf, sizeof(test_rw_long), test_rw_long)) {
|
||||||
|
printk("net_nbuf_write failed\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!net_nbuf_write(buf, sizeof(test_rw_long), test_rw_long)) {
|
||||||
|
printk("net_nbuf_write failed\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
tfrag = net_nbuf_skip(tfrag, off, &tpos, sizeof(test_rw_long));
|
||||||
|
if (!tfrag) {
|
||||||
|
printk("net_nbuf_skip failed\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
tfrag = net_nbuf_read(tfrag, tpos, &tpos, sizeof(test_rw_long),
|
||||||
|
verify_rw_long);
|
||||||
|
if (memcmp(test_rw_long, verify_rw_long, sizeof(test_rw_long))) {
|
||||||
|
printk("net_nbuf_read failed with mismatch data");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
net_nbuf_unref(buf);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_MICROKERNEL
|
#ifdef CONFIG_MICROKERNEL
|
||||||
void mainloop(void)
|
void mainloop(void)
|
||||||
#else
|
#else
|
||||||
|
@ -606,6 +778,10 @@ void main(void)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (test_nbuf_read_write() < 0) {
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
printk("nbuf tests passed\n");
|
printk("nbuf tests passed\n");
|
||||||
|
|
||||||
TC_END_REPORT(TC_PASS);
|
TC_END_REPORT(TC_PASS);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue