1 | // SPDX-License-Identifier: GPL-2.0 |
---|---|
2 | |
3 | #include <linux/netdevice.h> |
4 | #include <linux/mctp.h> |
5 | #include <linux/if_arp.h> |
6 | |
7 | #include <net/mctp.h> |
8 | #include <net/mctpdevice.h> |
9 | #include <net/pkt_sched.h> |
10 | |
11 | #include "utils.h" |
12 | |
13 | static netdev_tx_t mctp_test_dev_tx(struct sk_buff *skb, |
14 | struct net_device *ndev) |
15 | { |
16 | kfree_skb(skb); |
17 | return NETDEV_TX_OK; |
18 | } |
19 | |
20 | static const struct net_device_ops mctp_test_netdev_ops = { |
21 | .ndo_start_xmit = mctp_test_dev_tx, |
22 | }; |
23 | |
24 | static void mctp_test_dev_setup(struct net_device *ndev) |
25 | { |
26 | ndev->type = ARPHRD_MCTP; |
27 | ndev->mtu = MCTP_DEV_TEST_MTU; |
28 | ndev->hard_header_len = 0; |
29 | ndev->addr_len = 0; |
30 | ndev->tx_queue_len = DEFAULT_TX_QUEUE_LEN; |
31 | ndev->flags = IFF_NOARP; |
32 | ndev->netdev_ops = &mctp_test_netdev_ops; |
33 | ndev->needs_free_netdev = true; |
34 | } |
35 | |
36 | struct mctp_test_dev *mctp_test_create_dev(void) |
37 | { |
38 | struct mctp_test_dev *dev; |
39 | struct net_device *ndev; |
40 | int rc; |
41 | |
42 | ndev = alloc_netdev(sizeof(*dev), "mctptest%d", NET_NAME_ENUM, |
43 | mctp_test_dev_setup); |
44 | if (!ndev) |
45 | return NULL; |
46 | |
47 | dev = netdev_priv(dev: ndev); |
48 | dev->ndev = ndev; |
49 | |
50 | rc = register_netdev(dev: ndev); |
51 | if (rc) { |
52 | free_netdev(dev: ndev); |
53 | return NULL; |
54 | } |
55 | |
56 | rcu_read_lock(); |
57 | dev->mdev = __mctp_dev_get(dev: ndev); |
58 | dev->mdev->net = mctp_default_net(net: dev_net(dev: ndev)); |
59 | rcu_read_unlock(); |
60 | |
61 | return dev; |
62 | } |
63 | |
64 | void mctp_test_destroy_dev(struct mctp_test_dev *dev) |
65 | { |
66 | mctp_dev_put(mdev: dev->mdev); |
67 | unregister_netdev(dev: dev->ndev); |
68 | } |
69 |