net: mctp: test: move functions into utils.[ch]

A future change will add another mctp test .c file, so move some of the
common test setup from route.c into the utils object.

Signed-off-by: Jeremy Kerr <jk@codeconstruct.com.au>
Link: https://patch.msgid.link/20250702-dev-forwarding-v5-7-1468191da8a4@codeconstruct.com.au
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
Jeremy Kerr 2025-07-02 14:20:07 +08:00 committed by Paolo Abeni
parent 46ee16462f
commit 80bcf05e54
3 changed files with 182 additions and 163 deletions

View File

@ -8,169 +8,6 @@
#include "utils.h"
struct mctp_test_route {
struct mctp_route rt;
};
static const unsigned int test_pktqueue_magic = 0x5f713aef;
struct mctp_test_pktqueue {
unsigned int magic;
struct sk_buff_head pkts;
};
static void mctp_test_pktqueue_init(struct mctp_test_pktqueue *tpq)
{
tpq->magic = test_pktqueue_magic;
skb_queue_head_init(&tpq->pkts);
}
static int mctp_test_dst_output(struct mctp_dst *dst, struct sk_buff *skb)
{
struct kunit *test = current->kunit_test;
struct mctp_test_pktqueue *tpq = test->priv;
KUNIT_ASSERT_EQ(test, tpq->magic, test_pktqueue_magic);
skb_queue_tail(&tpq->pkts, skb);
return 0;
}
/* local version of mctp_route_alloc() */
static struct mctp_test_route *mctp_route_test_alloc(void)
{
struct mctp_test_route *rt;
rt = kzalloc(sizeof(*rt), GFP_KERNEL);
if (!rt)
return NULL;
INIT_LIST_HEAD(&rt->rt.list);
refcount_set(&rt->rt.refs, 1);
rt->rt.output = mctp_test_dst_output;
return rt;
}
static struct mctp_test_route *mctp_test_create_route(struct net *net,
struct mctp_dev *dev,
mctp_eid_t eid,
unsigned int mtu)
{
struct mctp_test_route *rt;
rt = mctp_route_test_alloc();
if (!rt)
return NULL;
rt->rt.min = eid;
rt->rt.max = eid;
rt->rt.mtu = mtu;
rt->rt.type = RTN_UNSPEC;
if (dev)
mctp_dev_hold(dev);
rt->rt.dev = dev;
list_add_rcu(&rt->rt.list, &net->mctp.routes);
return rt;
}
/* Convenience function for our test dst; release with mctp_test_dst_release()
*/
static void mctp_test_dst_setup(struct kunit *test, struct mctp_dst *dst,
struct mctp_test_dev *dev,
struct mctp_test_pktqueue *tpq,
unsigned int mtu)
{
KUNIT_EXPECT_NOT_ERR_OR_NULL(test, dev);
memset(dst, 0, sizeof(*dst));
dst->dev = dev->mdev;
__mctp_dev_get(dst->dev->dev);
dst->mtu = mtu;
dst->output = mctp_test_dst_output;
mctp_test_pktqueue_init(tpq);
test->priv = tpq;
}
static void mctp_test_dst_release(struct mctp_dst *dst,
struct mctp_test_pktqueue *tpq)
{
mctp_dst_release(dst);
skb_queue_purge(&tpq->pkts);
}
static void mctp_test_route_destroy(struct kunit *test,
struct mctp_test_route *rt)
{
unsigned int refs;
rtnl_lock();
list_del_rcu(&rt->rt.list);
rtnl_unlock();
if (rt->rt.dev)
mctp_dev_put(rt->rt.dev);
refs = refcount_read(&rt->rt.refs);
KUNIT_ASSERT_EQ_MSG(test, refs, 1, "route ref imbalance");
kfree_rcu(&rt->rt, rcu);
}
static void mctp_test_skb_set_dev(struct sk_buff *skb,
struct mctp_test_dev *dev)
{
struct mctp_skb_cb *cb;
cb = mctp_cb(skb);
cb->net = READ_ONCE(dev->mdev->net);
skb->dev = dev->ndev;
}
static struct sk_buff *mctp_test_create_skb(const struct mctp_hdr *hdr,
unsigned int data_len)
{
size_t hdr_len = sizeof(*hdr);
struct sk_buff *skb;
unsigned int i;
u8 *buf;
skb = alloc_skb(hdr_len + data_len, GFP_KERNEL);
if (!skb)
return NULL;
__mctp_cb(skb);
memcpy(skb_put(skb, hdr_len), hdr, hdr_len);
buf = skb_put(skb, data_len);
for (i = 0; i < data_len; i++)
buf[i] = i & 0xff;
return skb;
}
static struct sk_buff *__mctp_test_create_skb_data(const struct mctp_hdr *hdr,
const void *data,
size_t data_len)
{
size_t hdr_len = sizeof(*hdr);
struct sk_buff *skb;
skb = alloc_skb(hdr_len + data_len, GFP_KERNEL);
if (!skb)
return NULL;
__mctp_cb(skb);
memcpy(skb_put(skb, hdr_len), hdr, hdr_len);
memcpy(skb_put(skb, data_len), data, data_len);
return skb;
}
#define mctp_test_create_skb_data(h, d) \
__mctp_test_create_skb_data(h, d, sizeof(*d))

View File

@ -82,3 +82,153 @@ void mctp_test_destroy_dev(struct mctp_test_dev *dev)
mctp_dev_put(dev->mdev);
unregister_netdev(dev->ndev);
}
static const unsigned int test_pktqueue_magic = 0x5f713aef;
void mctp_test_pktqueue_init(struct mctp_test_pktqueue *tpq)
{
tpq->magic = test_pktqueue_magic;
skb_queue_head_init(&tpq->pkts);
}
static int mctp_test_dst_output(struct mctp_dst *dst, struct sk_buff *skb)
{
struct kunit *test = current->kunit_test;
struct mctp_test_pktqueue *tpq = test->priv;
KUNIT_ASSERT_EQ(test, tpq->magic, test_pktqueue_magic);
skb_queue_tail(&tpq->pkts, skb);
return 0;
}
/* local version of mctp_route_alloc() */
static struct mctp_test_route *mctp_route_test_alloc(void)
{
struct mctp_test_route *rt;
rt = kzalloc(sizeof(*rt), GFP_KERNEL);
if (!rt)
return NULL;
INIT_LIST_HEAD(&rt->rt.list);
refcount_set(&rt->rt.refs, 1);
rt->rt.output = mctp_test_dst_output;
return rt;
}
struct mctp_test_route *mctp_test_create_route(struct net *net,
struct mctp_dev *dev,
mctp_eid_t eid,
unsigned int mtu)
{
struct mctp_test_route *rt;
rt = mctp_route_test_alloc();
if (!rt)
return NULL;
rt->rt.min = eid;
rt->rt.max = eid;
rt->rt.mtu = mtu;
rt->rt.type = RTN_UNSPEC;
if (dev)
mctp_dev_hold(dev);
rt->rt.dev = dev;
list_add_rcu(&rt->rt.list, &net->mctp.routes);
return rt;
}
/* Convenience function for our test dst; release with mctp_test_dst_release()
*/
void mctp_test_dst_setup(struct kunit *test, struct mctp_dst *dst,
struct mctp_test_dev *dev,
struct mctp_test_pktqueue *tpq, unsigned int mtu)
{
KUNIT_EXPECT_NOT_ERR_OR_NULL(test, dev);
memset(dst, 0, sizeof(*dst));
dst->dev = dev->mdev;
__mctp_dev_get(dst->dev->dev);
dst->mtu = mtu;
dst->output = mctp_test_dst_output;
mctp_test_pktqueue_init(tpq);
test->priv = tpq;
}
void mctp_test_dst_release(struct mctp_dst *dst,
struct mctp_test_pktqueue *tpq)
{
mctp_dst_release(dst);
skb_queue_purge(&tpq->pkts);
}
void mctp_test_route_destroy(struct kunit *test, struct mctp_test_route *rt)
{
unsigned int refs;
rtnl_lock();
list_del_rcu(&rt->rt.list);
rtnl_unlock();
if (rt->rt.dev)
mctp_dev_put(rt->rt.dev);
refs = refcount_read(&rt->rt.refs);
KUNIT_ASSERT_EQ_MSG(test, refs, 1, "route ref imbalance");
kfree_rcu(&rt->rt, rcu);
}
void mctp_test_skb_set_dev(struct sk_buff *skb, struct mctp_test_dev *dev)
{
struct mctp_skb_cb *cb;
cb = mctp_cb(skb);
cb->net = READ_ONCE(dev->mdev->net);
skb->dev = dev->ndev;
}
struct sk_buff *mctp_test_create_skb(const struct mctp_hdr *hdr,
unsigned int data_len)
{
size_t hdr_len = sizeof(*hdr);
struct sk_buff *skb;
unsigned int i;
u8 *buf;
skb = alloc_skb(hdr_len + data_len, GFP_KERNEL);
if (!skb)
return NULL;
__mctp_cb(skb);
memcpy(skb_put(skb, hdr_len), hdr, hdr_len);
buf = skb_put(skb, data_len);
for (i = 0; i < data_len; i++)
buf[i] = i & 0xff;
return skb;
}
struct sk_buff *__mctp_test_create_skb_data(const struct mctp_hdr *hdr,
const void *data, size_t data_len)
{
size_t hdr_len = sizeof(*hdr);
struct sk_buff *skb;
skb = alloc_skb(hdr_len + data_len, GFP_KERNEL);
if (!skb)
return NULL;
__mctp_cb(skb);
memcpy(skb_put(skb, hdr_len), hdr, hdr_len);
memcpy(skb_put(skb, data_len), data, data_len);
return skb;
}

View File

@ -5,6 +5,9 @@
#include <uapi/linux/netdevice.h>
#include <net/mctp.h>
#include <net/mctpdevice.h>
#include <kunit/test.h>
#define MCTP_DEV_TEST_MTU 68
@ -19,9 +22,38 @@ struct mctp_test_dev {
struct mctp_test_dev;
struct mctp_test_route {
struct mctp_route rt;
};
struct mctp_test_pktqueue {
unsigned int magic;
struct sk_buff_head pkts;
};
struct mctp_test_dev *mctp_test_create_dev(void);
struct mctp_test_dev *mctp_test_create_dev_lladdr(unsigned short lladdr_len,
const unsigned char *lladdr);
void mctp_test_destroy_dev(struct mctp_test_dev *dev);
struct mctp_test_route *mctp_test_create_route(struct net *net,
struct mctp_dev *dev,
mctp_eid_t eid,
unsigned int mtu);
void mctp_test_dst_setup(struct kunit *test, struct mctp_dst *dst,
struct mctp_test_dev *dev,
struct mctp_test_pktqueue *tpq, unsigned int mtu);
void mctp_test_dst_release(struct mctp_dst *dst,
struct mctp_test_pktqueue *tpq);
void mctp_test_pktqueue_init(struct mctp_test_pktqueue *tpq);
void mctp_test_route_destroy(struct kunit *test, struct mctp_test_route *rt);
void mctp_test_skb_set_dev(struct sk_buff *skb, struct mctp_test_dev *dev);
struct sk_buff *mctp_test_create_skb(const struct mctp_hdr *hdr,
unsigned int data_len);
struct sk_buff *__mctp_test_create_skb_data(const struct mctp_hdr *hdr,
const void *data, size_t data_len);
#define mctp_test_create_skb_data(h, d) \
__mctp_test_create_skb_data(h, d, sizeof(*d))
#endif /* __NET_MCTP_TEST_UTILS_H */