xref: /kernel/linux/linux-6.6/net/mctp/test/utils.c (revision 62306a36)
162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci#include <linux/netdevice.h>
462306a36Sopenharmony_ci#include <linux/mctp.h>
562306a36Sopenharmony_ci#include <linux/if_arp.h>
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <net/mctpdevice.h>
862306a36Sopenharmony_ci#include <net/pkt_sched.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include "utils.h"
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_cistatic netdev_tx_t mctp_test_dev_tx(struct sk_buff *skb,
1362306a36Sopenharmony_ci				    struct net_device *ndev)
1462306a36Sopenharmony_ci{
1562306a36Sopenharmony_ci	kfree_skb(skb);
1662306a36Sopenharmony_ci	return NETDEV_TX_OK;
1762306a36Sopenharmony_ci}
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistatic const struct net_device_ops mctp_test_netdev_ops = {
2062306a36Sopenharmony_ci	.ndo_start_xmit = mctp_test_dev_tx,
2162306a36Sopenharmony_ci};
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistatic void mctp_test_dev_setup(struct net_device *ndev)
2462306a36Sopenharmony_ci{
2562306a36Sopenharmony_ci	ndev->type = ARPHRD_MCTP;
2662306a36Sopenharmony_ci	ndev->mtu = MCTP_DEV_TEST_MTU;
2762306a36Sopenharmony_ci	ndev->hard_header_len = 0;
2862306a36Sopenharmony_ci	ndev->addr_len = 0;
2962306a36Sopenharmony_ci	ndev->tx_queue_len = DEFAULT_TX_QUEUE_LEN;
3062306a36Sopenharmony_ci	ndev->flags = IFF_NOARP;
3162306a36Sopenharmony_ci	ndev->netdev_ops = &mctp_test_netdev_ops;
3262306a36Sopenharmony_ci	ndev->needs_free_netdev = true;
3362306a36Sopenharmony_ci}
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_cistruct mctp_test_dev *mctp_test_create_dev(void)
3662306a36Sopenharmony_ci{
3762306a36Sopenharmony_ci	struct mctp_test_dev *dev;
3862306a36Sopenharmony_ci	struct net_device *ndev;
3962306a36Sopenharmony_ci	int rc;
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci	ndev = alloc_netdev(sizeof(*dev), "mctptest%d", NET_NAME_ENUM,
4262306a36Sopenharmony_ci			    mctp_test_dev_setup);
4362306a36Sopenharmony_ci	if (!ndev)
4462306a36Sopenharmony_ci		return NULL;
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	dev = netdev_priv(ndev);
4762306a36Sopenharmony_ci	dev->ndev = ndev;
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	rc = register_netdev(ndev);
5062306a36Sopenharmony_ci	if (rc) {
5162306a36Sopenharmony_ci		free_netdev(ndev);
5262306a36Sopenharmony_ci		return NULL;
5362306a36Sopenharmony_ci	}
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci	rcu_read_lock();
5662306a36Sopenharmony_ci	dev->mdev = __mctp_dev_get(ndev);
5762306a36Sopenharmony_ci	rcu_read_unlock();
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	return dev;
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_civoid mctp_test_destroy_dev(struct mctp_test_dev *dev)
6362306a36Sopenharmony_ci{
6462306a36Sopenharmony_ci	mctp_dev_put(dev->mdev);
6562306a36Sopenharmony_ci	unregister_netdev(dev->ndev);
6662306a36Sopenharmony_ci}
67