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->tx_queue_len = DEFAULT_TX_QUEUE_LEN; 30 ndev->flags = IFF_NOARP; 31 ndev->netdev_ops = &mctp_test_netdev_ops; 32 ndev->needs_free_netdev = true; 33 } 34 35 static struct mctp_test_dev *__mctp_test_create_dev(unsigned short lladdr_len, 36 const unsigned char *lladdr) 37 { 38 struct mctp_test_dev *dev; 39 struct net_device *ndev; 40 int rc; 41 42 if (WARN_ON(lladdr_len > MAX_ADDR_LEN)) 43 return NULL; 44 45 ndev = alloc_netdev(sizeof(*dev), "mctptest%d", NET_NAME_ENUM, 46 mctp_test_dev_setup); 47 if (!ndev) 48 return NULL; 49 50 dev = netdev_priv(ndev); 51 dev->ndev = ndev; 52 ndev->addr_len = lladdr_len; 53 dev_addr_set(ndev, lladdr); 54 55 rc = register_netdev(ndev); 56 if (rc) { 57 free_netdev(ndev); 58 return NULL; 59 } 60 61 rcu_read_lock(); 62 dev->mdev = __mctp_dev_get(ndev); 63 dev->mdev->net = mctp_default_net(dev_net(ndev)); 64 rcu_read_unlock(); 65 66 return dev; 67 } 68 69 struct mctp_test_dev *mctp_test_create_dev(void) 70 { 71 return __mctp_test_create_dev(0, NULL); 72 } 73 74 struct mctp_test_dev *mctp_test_create_dev_lladdr(unsigned short lladdr_len, 75 const unsigned char *lladdr) 76 { 77 return __mctp_test_create_dev(lladdr_len, lladdr); 78 } 79 80 void mctp_test_destroy_dev(struct mctp_test_dev *dev) 81 { 82 mctp_dev_put(dev->mdev); 83 unregister_netdev(dev->ndev); 84 } 85