Commit 925c01af authored by Jeremy Kerr's avatar Jeremy Kerr Committed by David S. Miller

mctp: Add packet rx tests

Add a few tests for the initial packet ingress through
mctp_pkttype_receive function; mainly packet header sanity checks. Full
input routing checks will be added as a separate change.
Signed-off-by: default avatarJeremy Kerr <jk@codeconstruct.com.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 077b6d52
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
#include <kunit/test.h> #include <kunit/test.h>
#include "utils.h"
struct mctp_test_route { struct mctp_test_route {
struct mctp_route rt; struct mctp_route rt;
struct sk_buff_head pkts; struct sk_buff_head pkts;
...@@ -35,6 +37,7 @@ static struct mctp_test_route *mctp_route_test_alloc(void) ...@@ -35,6 +37,7 @@ static struct mctp_test_route *mctp_route_test_alloc(void)
} }
static struct mctp_test_route *mctp_test_create_route(struct net *net, static struct mctp_test_route *mctp_test_create_route(struct net *net,
struct mctp_dev *dev,
mctp_eid_t eid, mctp_eid_t eid,
unsigned int mtu) unsigned int mtu)
{ {
...@@ -48,7 +51,9 @@ static struct mctp_test_route *mctp_test_create_route(struct net *net, ...@@ -48,7 +51,9 @@ static struct mctp_test_route *mctp_test_create_route(struct net *net,
rt->rt.max = eid; rt->rt.max = eid;
rt->rt.mtu = mtu; rt->rt.mtu = mtu;
rt->rt.type = RTN_UNSPEC; rt->rt.type = RTN_UNSPEC;
rt->rt.dev = NULL; /* somewhat illegal, but fine for current tests */ if (dev)
mctp_dev_hold(dev);
rt->rt.dev = dev;
list_add_rcu(&rt->rt.list, &net->mctp.routes); list_add_rcu(&rt->rt.list, &net->mctp.routes);
...@@ -62,11 +67,13 @@ static void mctp_test_route_destroy(struct mctp_test_route *rt) ...@@ -62,11 +67,13 @@ static void mctp_test_route_destroy(struct mctp_test_route *rt)
rtnl_unlock(); rtnl_unlock();
skb_queue_purge(&rt->pkts); skb_queue_purge(&rt->pkts);
if (rt->rt.dev)
mctp_dev_put(rt->rt.dev);
kfree_rcu(&rt->rt, rcu); kfree_rcu(&rt->rt, rcu);
} }
static struct sk_buff *mctp_test_create_skb(struct mctp_hdr *hdr, static struct sk_buff *mctp_test_create_skb(const struct mctp_hdr *hdr,
unsigned int data_len) unsigned int data_len)
{ {
size_t hdr_len = sizeof(*hdr); size_t hdr_len = sizeof(*hdr);
...@@ -114,7 +121,7 @@ static void mctp_test_fragment(struct kunit *test) ...@@ -114,7 +121,7 @@ static void mctp_test_fragment(struct kunit *test)
skb = mctp_test_create_skb(&hdr, msgsize); skb = mctp_test_create_skb(&hdr, msgsize);
KUNIT_ASSERT_TRUE(test, skb); KUNIT_ASSERT_TRUE(test, skb);
rt = mctp_test_create_route(&init_net, 10, mtu); rt = mctp_test_create_route(&init_net, NULL, 10, mtu);
KUNIT_ASSERT_TRUE(test, rt); KUNIT_ASSERT_TRUE(test, rt);
rc = mctp_do_fragment_route(&rt->rt, skb, mtu, MCTP_TAG_OWNER); rc = mctp_do_fragment_route(&rt->rt, skb, mtu, MCTP_TAG_OWNER);
...@@ -193,8 +200,62 @@ static void mctp_frag_test_to_desc(const struct mctp_frag_test *t, char *desc) ...@@ -193,8 +200,62 @@ static void mctp_frag_test_to_desc(const struct mctp_frag_test *t, char *desc)
KUNIT_ARRAY_PARAM(mctp_frag, mctp_frag_tests, mctp_frag_test_to_desc); KUNIT_ARRAY_PARAM(mctp_frag, mctp_frag_tests, mctp_frag_test_to_desc);
struct mctp_rx_input_test {
struct mctp_hdr hdr;
bool input;
};
static void mctp_test_rx_input(struct kunit *test)
{
const struct mctp_rx_input_test *params;
struct mctp_test_route *rt;
struct mctp_test_dev *dev;
struct sk_buff *skb;
params = test->param_value;
dev = mctp_test_create_dev();
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
rt = mctp_test_create_route(&init_net, dev->mdev, 8, 68);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, rt);
skb = mctp_test_create_skb(&params->hdr, 1);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, skb);
__mctp_cb(skb);
mctp_pkttype_receive(skb, dev->ndev, &mctp_packet_type, NULL);
KUNIT_EXPECT_EQ(test, !!rt->pkts.qlen, params->input);
mctp_test_route_destroy(rt);
mctp_test_destroy_dev(dev);
}
#define RX_HDR(_ver, _src, _dest, _fst) \
{ .ver = _ver, .src = _src, .dest = _dest, .flags_seq_tag = _fst }
/* we have a route for EID 8 only */
static const struct mctp_rx_input_test mctp_rx_input_tests[] = {
{ .hdr = RX_HDR(1, 10, 8, 0), .input = true },
{ .hdr = RX_HDR(1, 10, 9, 0), .input = false }, /* no input route */
{ .hdr = RX_HDR(2, 10, 8, 0), .input = false }, /* invalid version */
};
static void mctp_rx_input_test_to_desc(const struct mctp_rx_input_test *t,
char *desc)
{
sprintf(desc, "{%x,%x,%x,%x}", t->hdr.ver, t->hdr.src, t->hdr.dest,
t->hdr.flags_seq_tag);
}
KUNIT_ARRAY_PARAM(mctp_rx_input, mctp_rx_input_tests,
mctp_rx_input_test_to_desc);
static struct kunit_case mctp_test_cases[] = { static struct kunit_case mctp_test_cases[] = {
KUNIT_CASE_PARAM(mctp_test_fragment, mctp_frag_gen_params), KUNIT_CASE_PARAM(mctp_test_fragment, mctp_frag_gen_params),
KUNIT_CASE_PARAM(mctp_test_rx_input, mctp_rx_input_gen_params),
{} {}
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment