netdev.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862
  1. /*
  2. * Copyright (C) 2017 Netronome Systems, Inc.
  3. *
  4. * This software is licensed under the GNU General License Version 2,
  5. * June 1991 as shown in the file COPYING in the top-level directory of this
  6. * source tree.
  7. *
  8. * THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS"
  9. * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
  10. * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  11. * FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE
  12. * OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME
  13. * THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
  14. */
  15. #include <linux/debugfs.h>
  16. #include <linux/etherdevice.h>
  17. #include <linux/kernel.h>
  18. #include <linux/module.h>
  19. #include <linux/netdevice.h>
  20. #include <linux/slab.h>
  21. #include <net/netdev_queues.h>
  22. #include <net/page_pool/helpers.h>
  23. #include <net/netlink.h>
  24. #include <net/pkt_cls.h>
  25. #include <net/rtnetlink.h>
  26. #include <net/udp_tunnel.h>
  27. #include <net/busy_poll.h>
  28. #include "netdevsim.h"
  29. #define NSIM_RING_SIZE 256
  30. static int nsim_napi_rx(struct nsim_rq *rq, struct sk_buff *skb)
  31. {
  32. if (skb_queue_len(&rq->skb_queue) > NSIM_RING_SIZE) {
  33. dev_kfree_skb_any(skb);
  34. return NET_RX_DROP;
  35. }
  36. skb_queue_tail(&rq->skb_queue, skb);
  37. return NET_RX_SUCCESS;
  38. }
  39. static int nsim_forward_skb(struct net_device *dev, struct sk_buff *skb,
  40. struct nsim_rq *rq)
  41. {
  42. return __dev_forward_skb(dev, skb) ?: nsim_napi_rx(rq, skb);
  43. }
  44. static netdev_tx_t nsim_start_xmit(struct sk_buff *skb, struct net_device *dev)
  45. {
  46. struct netdevsim *ns = netdev_priv(dev);
  47. struct net_device *peer_dev;
  48. unsigned int len = skb->len;
  49. struct netdevsim *peer_ns;
  50. struct nsim_rq *rq;
  51. int rxq;
  52. rcu_read_lock();
  53. if (!nsim_ipsec_tx(ns, skb))
  54. goto out_drop_free;
  55. peer_ns = rcu_dereference(ns->peer);
  56. if (!peer_ns)
  57. goto out_drop_free;
  58. peer_dev = peer_ns->netdev;
  59. rxq = skb_get_queue_mapping(skb);
  60. if (rxq >= peer_dev->num_rx_queues)
  61. rxq = rxq % peer_dev->num_rx_queues;
  62. rq = &peer_ns->rq[rxq];
  63. skb_tx_timestamp(skb);
  64. if (unlikely(nsim_forward_skb(peer_dev, skb, rq) == NET_RX_DROP))
  65. goto out_drop_cnt;
  66. napi_schedule(&rq->napi);
  67. rcu_read_unlock();
  68. u64_stats_update_begin(&ns->syncp);
  69. ns->tx_packets++;
  70. ns->tx_bytes += len;
  71. u64_stats_update_end(&ns->syncp);
  72. return NETDEV_TX_OK;
  73. out_drop_free:
  74. dev_kfree_skb(skb);
  75. out_drop_cnt:
  76. rcu_read_unlock();
  77. u64_stats_update_begin(&ns->syncp);
  78. ns->tx_dropped++;
  79. u64_stats_update_end(&ns->syncp);
  80. return NETDEV_TX_OK;
  81. }
  82. static void nsim_set_rx_mode(struct net_device *dev)
  83. {
  84. }
  85. static int nsim_change_mtu(struct net_device *dev, int new_mtu)
  86. {
  87. struct netdevsim *ns = netdev_priv(dev);
  88. if (ns->xdp.prog && new_mtu > NSIM_XDP_MAX_MTU)
  89. return -EBUSY;
  90. WRITE_ONCE(dev->mtu, new_mtu);
  91. return 0;
  92. }
  93. static void
  94. nsim_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
  95. {
  96. struct netdevsim *ns = netdev_priv(dev);
  97. unsigned int start;
  98. do {
  99. start = u64_stats_fetch_begin(&ns->syncp);
  100. stats->tx_bytes = ns->tx_bytes;
  101. stats->tx_packets = ns->tx_packets;
  102. stats->tx_dropped = ns->tx_dropped;
  103. } while (u64_stats_fetch_retry(&ns->syncp, start));
  104. }
  105. static int
  106. nsim_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_priv)
  107. {
  108. return nsim_bpf_setup_tc_block_cb(type, type_data, cb_priv);
  109. }
  110. static int nsim_set_vf_mac(struct net_device *dev, int vf, u8 *mac)
  111. {
  112. struct netdevsim *ns = netdev_priv(dev);
  113. struct nsim_dev *nsim_dev = ns->nsim_dev;
  114. /* Only refuse multicast addresses, zero address can mean unset/any. */
  115. if (vf >= nsim_dev_get_vfs(nsim_dev) || is_multicast_ether_addr(mac))
  116. return -EINVAL;
  117. memcpy(nsim_dev->vfconfigs[vf].vf_mac, mac, ETH_ALEN);
  118. return 0;
  119. }
  120. static int nsim_set_vf_vlan(struct net_device *dev, int vf,
  121. u16 vlan, u8 qos, __be16 vlan_proto)
  122. {
  123. struct netdevsim *ns = netdev_priv(dev);
  124. struct nsim_dev *nsim_dev = ns->nsim_dev;
  125. if (vf >= nsim_dev_get_vfs(nsim_dev) || vlan > 4095 || qos > 7)
  126. return -EINVAL;
  127. nsim_dev->vfconfigs[vf].vlan = vlan;
  128. nsim_dev->vfconfigs[vf].qos = qos;
  129. nsim_dev->vfconfigs[vf].vlan_proto = vlan_proto;
  130. return 0;
  131. }
  132. static int nsim_set_vf_rate(struct net_device *dev, int vf, int min, int max)
  133. {
  134. struct netdevsim *ns = netdev_priv(dev);
  135. struct nsim_dev *nsim_dev = ns->nsim_dev;
  136. if (nsim_esw_mode_is_switchdev(ns->nsim_dev)) {
  137. pr_err("Not supported in switchdev mode. Please use devlink API.\n");
  138. return -EOPNOTSUPP;
  139. }
  140. if (vf >= nsim_dev_get_vfs(nsim_dev))
  141. return -EINVAL;
  142. nsim_dev->vfconfigs[vf].min_tx_rate = min;
  143. nsim_dev->vfconfigs[vf].max_tx_rate = max;
  144. return 0;
  145. }
  146. static int nsim_set_vf_spoofchk(struct net_device *dev, int vf, bool val)
  147. {
  148. struct netdevsim *ns = netdev_priv(dev);
  149. struct nsim_dev *nsim_dev = ns->nsim_dev;
  150. if (vf >= nsim_dev_get_vfs(nsim_dev))
  151. return -EINVAL;
  152. nsim_dev->vfconfigs[vf].spoofchk_enabled = val;
  153. return 0;
  154. }
  155. static int nsim_set_vf_rss_query_en(struct net_device *dev, int vf, bool val)
  156. {
  157. struct netdevsim *ns = netdev_priv(dev);
  158. struct nsim_dev *nsim_dev = ns->nsim_dev;
  159. if (vf >= nsim_dev_get_vfs(nsim_dev))
  160. return -EINVAL;
  161. nsim_dev->vfconfigs[vf].rss_query_enabled = val;
  162. return 0;
  163. }
  164. static int nsim_set_vf_trust(struct net_device *dev, int vf, bool val)
  165. {
  166. struct netdevsim *ns = netdev_priv(dev);
  167. struct nsim_dev *nsim_dev = ns->nsim_dev;
  168. if (vf >= nsim_dev_get_vfs(nsim_dev))
  169. return -EINVAL;
  170. nsim_dev->vfconfigs[vf].trusted = val;
  171. return 0;
  172. }
  173. static int
  174. nsim_get_vf_config(struct net_device *dev, int vf, struct ifla_vf_info *ivi)
  175. {
  176. struct netdevsim *ns = netdev_priv(dev);
  177. struct nsim_dev *nsim_dev = ns->nsim_dev;
  178. if (vf >= nsim_dev_get_vfs(nsim_dev))
  179. return -EINVAL;
  180. ivi->vf = vf;
  181. ivi->linkstate = nsim_dev->vfconfigs[vf].link_state;
  182. ivi->min_tx_rate = nsim_dev->vfconfigs[vf].min_tx_rate;
  183. ivi->max_tx_rate = nsim_dev->vfconfigs[vf].max_tx_rate;
  184. ivi->vlan = nsim_dev->vfconfigs[vf].vlan;
  185. ivi->vlan_proto = nsim_dev->vfconfigs[vf].vlan_proto;
  186. ivi->qos = nsim_dev->vfconfigs[vf].qos;
  187. memcpy(&ivi->mac, nsim_dev->vfconfigs[vf].vf_mac, ETH_ALEN);
  188. ivi->spoofchk = nsim_dev->vfconfigs[vf].spoofchk_enabled;
  189. ivi->trusted = nsim_dev->vfconfigs[vf].trusted;
  190. ivi->rss_query_en = nsim_dev->vfconfigs[vf].rss_query_enabled;
  191. return 0;
  192. }
  193. static int nsim_set_vf_link_state(struct net_device *dev, int vf, int state)
  194. {
  195. struct netdevsim *ns = netdev_priv(dev);
  196. struct nsim_dev *nsim_dev = ns->nsim_dev;
  197. if (vf >= nsim_dev_get_vfs(nsim_dev))
  198. return -EINVAL;
  199. switch (state) {
  200. case IFLA_VF_LINK_STATE_AUTO:
  201. case IFLA_VF_LINK_STATE_ENABLE:
  202. case IFLA_VF_LINK_STATE_DISABLE:
  203. break;
  204. default:
  205. return -EINVAL;
  206. }
  207. nsim_dev->vfconfigs[vf].link_state = state;
  208. return 0;
  209. }
  210. static void nsim_taprio_stats(struct tc_taprio_qopt_stats *stats)
  211. {
  212. stats->window_drops = 0;
  213. stats->tx_overruns = 0;
  214. }
  215. static int nsim_setup_tc_taprio(struct net_device *dev,
  216. struct tc_taprio_qopt_offload *offload)
  217. {
  218. int err = 0;
  219. switch (offload->cmd) {
  220. case TAPRIO_CMD_REPLACE:
  221. case TAPRIO_CMD_DESTROY:
  222. break;
  223. case TAPRIO_CMD_STATS:
  224. nsim_taprio_stats(&offload->stats);
  225. break;
  226. default:
  227. err = -EOPNOTSUPP;
  228. }
  229. return err;
  230. }
  231. static LIST_HEAD(nsim_block_cb_list);
  232. static int
  233. nsim_setup_tc(struct net_device *dev, enum tc_setup_type type, void *type_data)
  234. {
  235. struct netdevsim *ns = netdev_priv(dev);
  236. switch (type) {
  237. case TC_SETUP_QDISC_TAPRIO:
  238. return nsim_setup_tc_taprio(dev, type_data);
  239. case TC_SETUP_BLOCK:
  240. return flow_block_cb_setup_simple(type_data,
  241. &nsim_block_cb_list,
  242. nsim_setup_tc_block_cb,
  243. ns, ns, true);
  244. default:
  245. return -EOPNOTSUPP;
  246. }
  247. }
  248. static int
  249. nsim_set_features(struct net_device *dev, netdev_features_t features)
  250. {
  251. struct netdevsim *ns = netdev_priv(dev);
  252. if ((dev->features & NETIF_F_HW_TC) > (features & NETIF_F_HW_TC))
  253. return nsim_bpf_disable_tc(ns);
  254. return 0;
  255. }
  256. static int nsim_get_iflink(const struct net_device *dev)
  257. {
  258. struct netdevsim *nsim, *peer;
  259. int iflink;
  260. nsim = netdev_priv(dev);
  261. rcu_read_lock();
  262. peer = rcu_dereference(nsim->peer);
  263. iflink = peer ? READ_ONCE(peer->netdev->ifindex) :
  264. READ_ONCE(dev->ifindex);
  265. rcu_read_unlock();
  266. return iflink;
  267. }
  268. static int nsim_rcv(struct nsim_rq *rq, int budget)
  269. {
  270. struct sk_buff *skb;
  271. int i;
  272. for (i = 0; i < budget; i++) {
  273. if (skb_queue_empty(&rq->skb_queue))
  274. break;
  275. skb = skb_dequeue(&rq->skb_queue);
  276. skb_mark_napi_id(skb, &rq->napi);
  277. netif_receive_skb(skb);
  278. }
  279. return i;
  280. }
  281. static int nsim_poll(struct napi_struct *napi, int budget)
  282. {
  283. struct nsim_rq *rq = container_of(napi, struct nsim_rq, napi);
  284. int done;
  285. done = nsim_rcv(rq, budget);
  286. if (done < budget)
  287. napi_complete_done(napi, done);
  288. return done;
  289. }
  290. static int nsim_create_page_pool(struct nsim_rq *rq)
  291. {
  292. struct page_pool_params p = {
  293. .order = 0,
  294. .pool_size = NSIM_RING_SIZE,
  295. .nid = NUMA_NO_NODE,
  296. .dev = &rq->napi.dev->dev,
  297. .napi = &rq->napi,
  298. .dma_dir = DMA_BIDIRECTIONAL,
  299. .netdev = rq->napi.dev,
  300. };
  301. rq->page_pool = page_pool_create(&p);
  302. if (IS_ERR(rq->page_pool)) {
  303. int err = PTR_ERR(rq->page_pool);
  304. rq->page_pool = NULL;
  305. return err;
  306. }
  307. return 0;
  308. }
  309. static int nsim_init_napi(struct netdevsim *ns)
  310. {
  311. struct net_device *dev = ns->netdev;
  312. struct nsim_rq *rq;
  313. int err, i;
  314. for (i = 0; i < dev->num_rx_queues; i++) {
  315. rq = &ns->rq[i];
  316. netif_napi_add(dev, &rq->napi, nsim_poll);
  317. }
  318. for (i = 0; i < dev->num_rx_queues; i++) {
  319. rq = &ns->rq[i];
  320. err = nsim_create_page_pool(rq);
  321. if (err)
  322. goto err_pp_destroy;
  323. }
  324. return 0;
  325. err_pp_destroy:
  326. while (i--) {
  327. page_pool_destroy(ns->rq[i].page_pool);
  328. ns->rq[i].page_pool = NULL;
  329. }
  330. for (i = 0; i < dev->num_rx_queues; i++)
  331. __netif_napi_del(&ns->rq[i].napi);
  332. return err;
  333. }
  334. static void nsim_enable_napi(struct netdevsim *ns)
  335. {
  336. struct net_device *dev = ns->netdev;
  337. int i;
  338. for (i = 0; i < dev->num_rx_queues; i++) {
  339. struct nsim_rq *rq = &ns->rq[i];
  340. netif_queue_set_napi(dev, i, NETDEV_QUEUE_TYPE_RX, &rq->napi);
  341. napi_enable(&rq->napi);
  342. }
  343. }
  344. static int nsim_open(struct net_device *dev)
  345. {
  346. struct netdevsim *ns = netdev_priv(dev);
  347. struct netdevsim *peer;
  348. int err;
  349. err = nsim_init_napi(ns);
  350. if (err)
  351. return err;
  352. nsim_enable_napi(ns);
  353. peer = rtnl_dereference(ns->peer);
  354. if (peer && netif_running(peer->netdev)) {
  355. netif_carrier_on(dev);
  356. netif_carrier_on(peer->netdev);
  357. }
  358. return 0;
  359. }
  360. static void nsim_del_napi(struct netdevsim *ns)
  361. {
  362. struct net_device *dev = ns->netdev;
  363. int i;
  364. for (i = 0; i < dev->num_rx_queues; i++) {
  365. struct nsim_rq *rq = &ns->rq[i];
  366. napi_disable(&rq->napi);
  367. __netif_napi_del(&rq->napi);
  368. }
  369. synchronize_net();
  370. for (i = 0; i < dev->num_rx_queues; i++) {
  371. page_pool_destroy(ns->rq[i].page_pool);
  372. ns->rq[i].page_pool = NULL;
  373. }
  374. }
  375. static int nsim_stop(struct net_device *dev)
  376. {
  377. struct netdevsim *ns = netdev_priv(dev);
  378. struct netdevsim *peer;
  379. netif_carrier_off(dev);
  380. peer = rtnl_dereference(ns->peer);
  381. if (peer)
  382. netif_carrier_off(peer->netdev);
  383. nsim_del_napi(ns);
  384. return 0;
  385. }
  386. static const struct net_device_ops nsim_netdev_ops = {
  387. .ndo_start_xmit = nsim_start_xmit,
  388. .ndo_set_rx_mode = nsim_set_rx_mode,
  389. .ndo_set_mac_address = eth_mac_addr,
  390. .ndo_validate_addr = eth_validate_addr,
  391. .ndo_change_mtu = nsim_change_mtu,
  392. .ndo_get_stats64 = nsim_get_stats64,
  393. .ndo_set_vf_mac = nsim_set_vf_mac,
  394. .ndo_set_vf_vlan = nsim_set_vf_vlan,
  395. .ndo_set_vf_rate = nsim_set_vf_rate,
  396. .ndo_set_vf_spoofchk = nsim_set_vf_spoofchk,
  397. .ndo_set_vf_trust = nsim_set_vf_trust,
  398. .ndo_get_vf_config = nsim_get_vf_config,
  399. .ndo_set_vf_link_state = nsim_set_vf_link_state,
  400. .ndo_set_vf_rss_query_en = nsim_set_vf_rss_query_en,
  401. .ndo_setup_tc = nsim_setup_tc,
  402. .ndo_set_features = nsim_set_features,
  403. .ndo_get_iflink = nsim_get_iflink,
  404. .ndo_bpf = nsim_bpf,
  405. .ndo_open = nsim_open,
  406. .ndo_stop = nsim_stop,
  407. };
  408. static const struct net_device_ops nsim_vf_netdev_ops = {
  409. .ndo_start_xmit = nsim_start_xmit,
  410. .ndo_set_rx_mode = nsim_set_rx_mode,
  411. .ndo_set_mac_address = eth_mac_addr,
  412. .ndo_validate_addr = eth_validate_addr,
  413. .ndo_change_mtu = nsim_change_mtu,
  414. .ndo_get_stats64 = nsim_get_stats64,
  415. .ndo_setup_tc = nsim_setup_tc,
  416. .ndo_set_features = nsim_set_features,
  417. };
  418. /* We don't have true per-queue stats, yet, so do some random fakery here.
  419. * Only report stuff for queue 0.
  420. */
  421. static void nsim_get_queue_stats_rx(struct net_device *dev, int idx,
  422. struct netdev_queue_stats_rx *stats)
  423. {
  424. struct rtnl_link_stats64 rtstats = {};
  425. if (!idx)
  426. nsim_get_stats64(dev, &rtstats);
  427. stats->packets = rtstats.rx_packets - !!rtstats.rx_packets;
  428. stats->bytes = rtstats.rx_bytes;
  429. }
  430. static void nsim_get_queue_stats_tx(struct net_device *dev, int idx,
  431. struct netdev_queue_stats_tx *stats)
  432. {
  433. struct rtnl_link_stats64 rtstats = {};
  434. if (!idx)
  435. nsim_get_stats64(dev, &rtstats);
  436. stats->packets = rtstats.tx_packets - !!rtstats.tx_packets;
  437. stats->bytes = rtstats.tx_bytes;
  438. }
  439. static void nsim_get_base_stats(struct net_device *dev,
  440. struct netdev_queue_stats_rx *rx,
  441. struct netdev_queue_stats_tx *tx)
  442. {
  443. struct rtnl_link_stats64 rtstats = {};
  444. nsim_get_stats64(dev, &rtstats);
  445. rx->packets = !!rtstats.rx_packets;
  446. rx->bytes = 0;
  447. tx->packets = !!rtstats.tx_packets;
  448. tx->bytes = 0;
  449. }
  450. static const struct netdev_stat_ops nsim_stat_ops = {
  451. .get_queue_stats_tx = nsim_get_queue_stats_tx,
  452. .get_queue_stats_rx = nsim_get_queue_stats_rx,
  453. .get_base_stats = nsim_get_base_stats,
  454. };
  455. static ssize_t
  456. nsim_pp_hold_read(struct file *file, char __user *data,
  457. size_t count, loff_t *ppos)
  458. {
  459. struct netdevsim *ns = file->private_data;
  460. char buf[3] = "n\n";
  461. if (ns->page)
  462. buf[0] = 'y';
  463. return simple_read_from_buffer(data, count, ppos, buf, 2);
  464. }
  465. static ssize_t
  466. nsim_pp_hold_write(struct file *file, const char __user *data,
  467. size_t count, loff_t *ppos)
  468. {
  469. struct netdevsim *ns = file->private_data;
  470. ssize_t ret;
  471. bool val;
  472. ret = kstrtobool_from_user(data, count, &val);
  473. if (ret)
  474. return ret;
  475. rtnl_lock();
  476. ret = count;
  477. if (val == !!ns->page)
  478. goto exit;
  479. if (!netif_running(ns->netdev) && val) {
  480. ret = -ENETDOWN;
  481. } else if (val) {
  482. ns->page = page_pool_dev_alloc_pages(ns->rq[0].page_pool);
  483. if (!ns->page)
  484. ret = -ENOMEM;
  485. } else {
  486. page_pool_put_full_page(ns->page->pp, ns->page, false);
  487. ns->page = NULL;
  488. }
  489. exit:
  490. rtnl_unlock();
  491. return ret;
  492. }
  493. static const struct file_operations nsim_pp_hold_fops = {
  494. .open = simple_open,
  495. .read = nsim_pp_hold_read,
  496. .write = nsim_pp_hold_write,
  497. .llseek = generic_file_llseek,
  498. .owner = THIS_MODULE,
  499. };
  500. static void nsim_setup(struct net_device *dev)
  501. {
  502. ether_setup(dev);
  503. eth_hw_addr_random(dev);
  504. dev->tx_queue_len = 0;
  505. dev->flags &= ~IFF_MULTICAST;
  506. dev->priv_flags |= IFF_LIVE_ADDR_CHANGE |
  507. IFF_NO_QUEUE;
  508. dev->features |= NETIF_F_HIGHDMA |
  509. NETIF_F_SG |
  510. NETIF_F_FRAGLIST |
  511. NETIF_F_HW_CSUM |
  512. NETIF_F_TSO;
  513. dev->hw_features |= NETIF_F_HW_TC;
  514. dev->max_mtu = ETH_MAX_MTU;
  515. dev->xdp_features = NETDEV_XDP_ACT_HW_OFFLOAD;
  516. }
  517. static int nsim_queue_init(struct netdevsim *ns)
  518. {
  519. struct net_device *dev = ns->netdev;
  520. int i;
  521. ns->rq = kvcalloc(dev->num_rx_queues, sizeof(*ns->rq),
  522. GFP_KERNEL_ACCOUNT | __GFP_RETRY_MAYFAIL);
  523. if (!ns->rq)
  524. return -ENOMEM;
  525. for (i = 0; i < dev->num_rx_queues; i++)
  526. skb_queue_head_init(&ns->rq[i].skb_queue);
  527. return 0;
  528. }
  529. static void nsim_queue_free(struct netdevsim *ns)
  530. {
  531. struct net_device *dev = ns->netdev;
  532. int i;
  533. for (i = 0; i < dev->num_rx_queues; i++)
  534. skb_queue_purge_reason(&ns->rq[i].skb_queue,
  535. SKB_DROP_REASON_QUEUE_PURGE);
  536. kvfree(ns->rq);
  537. ns->rq = NULL;
  538. }
  539. static int nsim_init_netdevsim(struct netdevsim *ns)
  540. {
  541. struct mock_phc *phc;
  542. int err;
  543. phc = mock_phc_create(&ns->nsim_bus_dev->dev);
  544. if (IS_ERR(phc))
  545. return PTR_ERR(phc);
  546. ns->phc = phc;
  547. ns->netdev->netdev_ops = &nsim_netdev_ops;
  548. ns->netdev->stat_ops = &nsim_stat_ops;
  549. err = nsim_udp_tunnels_info_create(ns->nsim_dev, ns->netdev);
  550. if (err)
  551. goto err_phc_destroy;
  552. rtnl_lock();
  553. err = nsim_queue_init(ns);
  554. if (err)
  555. goto err_utn_destroy;
  556. err = nsim_bpf_init(ns);
  557. if (err)
  558. goto err_rq_destroy;
  559. nsim_macsec_init(ns);
  560. nsim_ipsec_init(ns);
  561. err = register_netdevice(ns->netdev);
  562. if (err)
  563. goto err_ipsec_teardown;
  564. rtnl_unlock();
  565. return 0;
  566. err_ipsec_teardown:
  567. nsim_ipsec_teardown(ns);
  568. nsim_macsec_teardown(ns);
  569. nsim_bpf_uninit(ns);
  570. err_rq_destroy:
  571. nsim_queue_free(ns);
  572. err_utn_destroy:
  573. rtnl_unlock();
  574. nsim_udp_tunnels_info_destroy(ns->netdev);
  575. err_phc_destroy:
  576. mock_phc_destroy(ns->phc);
  577. return err;
  578. }
  579. static int nsim_init_netdevsim_vf(struct netdevsim *ns)
  580. {
  581. int err;
  582. ns->netdev->netdev_ops = &nsim_vf_netdev_ops;
  583. rtnl_lock();
  584. err = register_netdevice(ns->netdev);
  585. rtnl_unlock();
  586. return err;
  587. }
  588. static void nsim_exit_netdevsim(struct netdevsim *ns)
  589. {
  590. nsim_udp_tunnels_info_destroy(ns->netdev);
  591. mock_phc_destroy(ns->phc);
  592. }
  593. struct netdevsim *
  594. nsim_create(struct nsim_dev *nsim_dev, struct nsim_dev_port *nsim_dev_port)
  595. {
  596. struct net_device *dev;
  597. struct netdevsim *ns;
  598. int err;
  599. dev = alloc_netdev_mq(sizeof(*ns), "eth%d", NET_NAME_UNKNOWN, nsim_setup,
  600. nsim_dev->nsim_bus_dev->num_queues);
  601. if (!dev)
  602. return ERR_PTR(-ENOMEM);
  603. dev_net_set(dev, nsim_dev_net(nsim_dev));
  604. ns = netdev_priv(dev);
  605. ns->netdev = dev;
  606. u64_stats_init(&ns->syncp);
  607. ns->nsim_dev = nsim_dev;
  608. ns->nsim_dev_port = nsim_dev_port;
  609. ns->nsim_bus_dev = nsim_dev->nsim_bus_dev;
  610. SET_NETDEV_DEV(dev, &ns->nsim_bus_dev->dev);
  611. SET_NETDEV_DEVLINK_PORT(dev, &nsim_dev_port->devlink_port);
  612. nsim_ethtool_init(ns);
  613. if (nsim_dev_port_is_pf(nsim_dev_port))
  614. err = nsim_init_netdevsim(ns);
  615. else
  616. err = nsim_init_netdevsim_vf(ns);
  617. if (err)
  618. goto err_free_netdev;
  619. ns->pp_dfs = debugfs_create_file("pp_hold", 0600, nsim_dev_port->ddir,
  620. ns, &nsim_pp_hold_fops);
  621. return ns;
  622. err_free_netdev:
  623. free_netdev(dev);
  624. return ERR_PTR(err);
  625. }
  626. void nsim_destroy(struct netdevsim *ns)
  627. {
  628. struct net_device *dev = ns->netdev;
  629. struct netdevsim *peer;
  630. debugfs_remove(ns->pp_dfs);
  631. rtnl_lock();
  632. peer = rtnl_dereference(ns->peer);
  633. if (peer)
  634. RCU_INIT_POINTER(peer->peer, NULL);
  635. RCU_INIT_POINTER(ns->peer, NULL);
  636. unregister_netdevice(dev);
  637. if (nsim_dev_port_is_pf(ns->nsim_dev_port)) {
  638. nsim_macsec_teardown(ns);
  639. nsim_ipsec_teardown(ns);
  640. nsim_bpf_uninit(ns);
  641. nsim_queue_free(ns);
  642. }
  643. rtnl_unlock();
  644. if (nsim_dev_port_is_pf(ns->nsim_dev_port))
  645. nsim_exit_netdevsim(ns);
  646. /* Put this intentionally late to exercise the orphaning path */
  647. if (ns->page) {
  648. page_pool_put_full_page(ns->page->pp, ns->page, false);
  649. ns->page = NULL;
  650. }
  651. free_netdev(dev);
  652. }
  653. bool netdev_is_nsim(struct net_device *dev)
  654. {
  655. return dev->netdev_ops == &nsim_netdev_ops;
  656. }
  657. static int nsim_validate(struct nlattr *tb[], struct nlattr *data[],
  658. struct netlink_ext_ack *extack)
  659. {
  660. NL_SET_ERR_MSG_MOD(extack,
  661. "Please use: echo \"[ID] [PORT_COUNT] [NUM_QUEUES]\" > /sys/bus/netdevsim/new_device");
  662. return -EOPNOTSUPP;
  663. }
  664. static struct rtnl_link_ops nsim_link_ops __read_mostly = {
  665. .kind = DRV_NAME,
  666. .validate = nsim_validate,
  667. };
  668. static int __init nsim_module_init(void)
  669. {
  670. int err;
  671. err = nsim_dev_init();
  672. if (err)
  673. return err;
  674. err = nsim_bus_init();
  675. if (err)
  676. goto err_dev_exit;
  677. err = rtnl_link_register(&nsim_link_ops);
  678. if (err)
  679. goto err_bus_exit;
  680. return 0;
  681. err_bus_exit:
  682. nsim_bus_exit();
  683. err_dev_exit:
  684. nsim_dev_exit();
  685. return err;
  686. }
  687. static void __exit nsim_module_exit(void)
  688. {
  689. rtnl_link_unregister(&nsim_link_ops);
  690. nsim_bus_exit();
  691. nsim_dev_exit();
  692. }
  693. module_init(nsim_module_init);
  694. module_exit(nsim_module_exit);
  695. MODULE_LICENSE("GPL");
  696. MODULE_DESCRIPTION("Simulated networking device for testing");
  697. MODULE_ALIAS_RTNL_LINK(DRV_NAME);