mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 18:43:33 +02:00
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:
parent
46ee16462f
commit
80bcf05e54
|
|
@ -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))
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user