netdev.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260
  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/ethtool_netlink.h>
  18. #include <linux/kernel.h>
  19. #include <linux/module.h>
  20. #include <linux/netdevice.h>
  21. #include <linux/slab.h>
  22. #include <net/netdev_queues.h>
  23. #include <net/netdev_rx_queue.h>
  24. #include <net/page_pool/helpers.h>
  25. #include <net/netlink.h>
  26. #include <net/net_shaper.h>
  27. #include <net/netdev_lock.h>
  28. #include <net/pkt_cls.h>
  29. #include <net/rtnetlink.h>
  30. #include <net/udp_tunnel.h>
  31. #include <net/busy_poll.h>
  32. #include "netdevsim.h"
  33. MODULE_IMPORT_NS("NETDEV_INTERNAL");
  34. #define NSIM_RING_SIZE 256
  35. static void nsim_start_peer_tx_queue(struct net_device *dev, struct nsim_rq *rq)
  36. {
  37. struct netdevsim *ns = netdev_priv(dev);
  38. struct net_device *peer_dev;
  39. struct netdevsim *peer_ns;
  40. struct netdev_queue *txq;
  41. u16 idx;
  42. idx = rq->napi.index;
  43. rcu_read_lock();
  44. peer_ns = rcu_dereference(ns->peer);
  45. if (!peer_ns)
  46. goto out;
  47. /* TX device */
  48. peer_dev = peer_ns->netdev;
  49. if (dev->real_num_tx_queues != peer_dev->num_rx_queues)
  50. goto out;
  51. txq = netdev_get_tx_queue(peer_dev, idx);
  52. if (!netif_tx_queue_stopped(txq))
  53. goto out;
  54. netif_tx_wake_queue(txq);
  55. out:
  56. rcu_read_unlock();
  57. }
  58. static void nsim_stop_tx_queue(struct net_device *tx_dev,
  59. struct net_device *rx_dev,
  60. struct nsim_rq *rq,
  61. u16 idx)
  62. {
  63. /* If different queues size, do not stop, since it is not
  64. * easy to find which TX queue is mapped here
  65. */
  66. if (rx_dev->real_num_tx_queues != tx_dev->num_rx_queues)
  67. return;
  68. /* rq is the queue on the receive side */
  69. netif_subqueue_try_stop(tx_dev, idx,
  70. NSIM_RING_SIZE - skb_queue_len(&rq->skb_queue),
  71. NSIM_RING_SIZE / 2);
  72. }
  73. static int nsim_napi_rx(struct net_device *tx_dev, struct net_device *rx_dev,
  74. struct nsim_rq *rq, struct sk_buff *skb)
  75. {
  76. if (skb_queue_len(&rq->skb_queue) > NSIM_RING_SIZE) {
  77. dev_kfree_skb_any(skb);
  78. return NET_RX_DROP;
  79. }
  80. skb_queue_tail(&rq->skb_queue, skb);
  81. /* Stop the peer TX queue avoiding dropping packets later */
  82. if (skb_queue_len(&rq->skb_queue) >= NSIM_RING_SIZE)
  83. nsim_stop_tx_queue(tx_dev, rx_dev, rq,
  84. skb_get_queue_mapping(skb));
  85. return NET_RX_SUCCESS;
  86. }
  87. static int nsim_forward_skb(struct net_device *tx_dev,
  88. struct net_device *rx_dev,
  89. struct sk_buff *skb,
  90. struct nsim_rq *rq,
  91. struct skb_ext *psp_ext)
  92. {
  93. int ret;
  94. ret = __dev_forward_skb(rx_dev, skb);
  95. if (ret) {
  96. if (psp_ext)
  97. __skb_ext_put(psp_ext);
  98. return ret;
  99. }
  100. nsim_psp_handle_ext(skb, psp_ext);
  101. return nsim_napi_rx(tx_dev, rx_dev, rq, skb);
  102. }
  103. static netdev_tx_t nsim_start_xmit(struct sk_buff *skb, struct net_device *dev)
  104. {
  105. struct netdevsim *ns = netdev_priv(dev);
  106. struct skb_ext *psp_ext = NULL;
  107. struct net_device *peer_dev;
  108. unsigned int len = skb->len;
  109. struct netdevsim *peer_ns;
  110. struct netdev_config *cfg;
  111. struct nsim_rq *rq;
  112. int rxq;
  113. int dr;
  114. rcu_read_lock();
  115. if (!nsim_ipsec_tx(ns, skb))
  116. goto out_drop_any;
  117. /* Check if loopback mode is enabled */
  118. if (dev->features & NETIF_F_LOOPBACK) {
  119. peer_ns = ns;
  120. peer_dev = dev;
  121. } else {
  122. peer_ns = rcu_dereference(ns->peer);
  123. if (!peer_ns)
  124. goto out_drop_any;
  125. peer_dev = peer_ns->netdev;
  126. }
  127. dr = nsim_do_psp(skb, ns, peer_ns, &psp_ext);
  128. if (dr)
  129. goto out_drop_free;
  130. rxq = skb_get_queue_mapping(skb);
  131. if (rxq >= peer_dev->num_rx_queues)
  132. rxq = rxq % peer_dev->num_rx_queues;
  133. rq = peer_ns->rq[rxq];
  134. cfg = peer_dev->cfg;
  135. if (skb_is_nonlinear(skb) &&
  136. (cfg->hds_config != ETHTOOL_TCP_DATA_SPLIT_ENABLED ||
  137. (cfg->hds_config == ETHTOOL_TCP_DATA_SPLIT_ENABLED &&
  138. cfg->hds_thresh > len)))
  139. skb_linearize(skb);
  140. skb_tx_timestamp(skb);
  141. if (unlikely(nsim_forward_skb(dev, peer_dev,
  142. skb, rq, psp_ext) == NET_RX_DROP))
  143. goto out_drop_cnt;
  144. if (!hrtimer_active(&rq->napi_timer))
  145. hrtimer_start(&rq->napi_timer, us_to_ktime(5), HRTIMER_MODE_REL);
  146. rcu_read_unlock();
  147. dev_dstats_tx_add(dev, len);
  148. return NETDEV_TX_OK;
  149. out_drop_any:
  150. dr = SKB_DROP_REASON_NOT_SPECIFIED;
  151. out_drop_free:
  152. kfree_skb_reason(skb, dr);
  153. out_drop_cnt:
  154. rcu_read_unlock();
  155. dev_dstats_tx_dropped(dev);
  156. return NETDEV_TX_OK;
  157. }
  158. static void nsim_set_rx_mode(struct net_device *dev)
  159. {
  160. }
  161. static int nsim_change_mtu(struct net_device *dev, int new_mtu)
  162. {
  163. struct netdevsim *ns = netdev_priv(dev);
  164. if (ns->xdp.prog && !ns->xdp.prog->aux->xdp_has_frags &&
  165. new_mtu > NSIM_XDP_MAX_MTU)
  166. return -EBUSY;
  167. WRITE_ONCE(dev->mtu, new_mtu);
  168. return 0;
  169. }
  170. static int
  171. nsim_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_priv)
  172. {
  173. return nsim_bpf_setup_tc_block_cb(type, type_data, cb_priv);
  174. }
  175. static int nsim_set_vf_mac(struct net_device *dev, int vf, u8 *mac)
  176. {
  177. struct netdevsim *ns = netdev_priv(dev);
  178. struct nsim_dev *nsim_dev = ns->nsim_dev;
  179. /* Only refuse multicast addresses, zero address can mean unset/any. */
  180. if (vf >= nsim_dev_get_vfs(nsim_dev) || is_multicast_ether_addr(mac))
  181. return -EINVAL;
  182. memcpy(nsim_dev->vfconfigs[vf].vf_mac, mac, ETH_ALEN);
  183. return 0;
  184. }
  185. static int nsim_set_vf_vlan(struct net_device *dev, int vf,
  186. u16 vlan, u8 qos, __be16 vlan_proto)
  187. {
  188. struct netdevsim *ns = netdev_priv(dev);
  189. struct nsim_dev *nsim_dev = ns->nsim_dev;
  190. if (vf >= nsim_dev_get_vfs(nsim_dev) || vlan > 4095 || qos > 7)
  191. return -EINVAL;
  192. nsim_dev->vfconfigs[vf].vlan = vlan;
  193. nsim_dev->vfconfigs[vf].qos = qos;
  194. nsim_dev->vfconfigs[vf].vlan_proto = vlan_proto;
  195. return 0;
  196. }
  197. static int nsim_set_vf_rate(struct net_device *dev, int vf, int min, int max)
  198. {
  199. struct netdevsim *ns = netdev_priv(dev);
  200. struct nsim_dev *nsim_dev = ns->nsim_dev;
  201. if (nsim_esw_mode_is_switchdev(ns->nsim_dev)) {
  202. pr_err("Not supported in switchdev mode. Please use devlink API.\n");
  203. return -EOPNOTSUPP;
  204. }
  205. if (vf >= nsim_dev_get_vfs(nsim_dev))
  206. return -EINVAL;
  207. nsim_dev->vfconfigs[vf].min_tx_rate = min;
  208. nsim_dev->vfconfigs[vf].max_tx_rate = max;
  209. return 0;
  210. }
  211. static int nsim_set_vf_spoofchk(struct net_device *dev, int vf, bool val)
  212. {
  213. struct netdevsim *ns = netdev_priv(dev);
  214. struct nsim_dev *nsim_dev = ns->nsim_dev;
  215. if (vf >= nsim_dev_get_vfs(nsim_dev))
  216. return -EINVAL;
  217. nsim_dev->vfconfigs[vf].spoofchk_enabled = val;
  218. return 0;
  219. }
  220. static int nsim_set_vf_rss_query_en(struct net_device *dev, int vf, bool val)
  221. {
  222. struct netdevsim *ns = netdev_priv(dev);
  223. struct nsim_dev *nsim_dev = ns->nsim_dev;
  224. if (vf >= nsim_dev_get_vfs(nsim_dev))
  225. return -EINVAL;
  226. nsim_dev->vfconfigs[vf].rss_query_enabled = val;
  227. return 0;
  228. }
  229. static int nsim_set_vf_trust(struct net_device *dev, int vf, bool val)
  230. {
  231. struct netdevsim *ns = netdev_priv(dev);
  232. struct nsim_dev *nsim_dev = ns->nsim_dev;
  233. if (vf >= nsim_dev_get_vfs(nsim_dev))
  234. return -EINVAL;
  235. nsim_dev->vfconfigs[vf].trusted = val;
  236. return 0;
  237. }
  238. static int
  239. nsim_get_vf_config(struct net_device *dev, int vf, struct ifla_vf_info *ivi)
  240. {
  241. struct netdevsim *ns = netdev_priv(dev);
  242. struct nsim_dev *nsim_dev = ns->nsim_dev;
  243. if (vf >= nsim_dev_get_vfs(nsim_dev))
  244. return -EINVAL;
  245. ivi->vf = vf;
  246. ivi->linkstate = nsim_dev->vfconfigs[vf].link_state;
  247. ivi->min_tx_rate = nsim_dev->vfconfigs[vf].min_tx_rate;
  248. ivi->max_tx_rate = nsim_dev->vfconfigs[vf].max_tx_rate;
  249. ivi->vlan = nsim_dev->vfconfigs[vf].vlan;
  250. ivi->vlan_proto = nsim_dev->vfconfigs[vf].vlan_proto;
  251. ivi->qos = nsim_dev->vfconfigs[vf].qos;
  252. memcpy(&ivi->mac, nsim_dev->vfconfigs[vf].vf_mac, ETH_ALEN);
  253. ivi->spoofchk = nsim_dev->vfconfigs[vf].spoofchk_enabled;
  254. ivi->trusted = nsim_dev->vfconfigs[vf].trusted;
  255. ivi->rss_query_en = nsim_dev->vfconfigs[vf].rss_query_enabled;
  256. return 0;
  257. }
  258. static int nsim_set_vf_link_state(struct net_device *dev, int vf, int state)
  259. {
  260. struct netdevsim *ns = netdev_priv(dev);
  261. struct nsim_dev *nsim_dev = ns->nsim_dev;
  262. if (vf >= nsim_dev_get_vfs(nsim_dev))
  263. return -EINVAL;
  264. switch (state) {
  265. case IFLA_VF_LINK_STATE_AUTO:
  266. case IFLA_VF_LINK_STATE_ENABLE:
  267. case IFLA_VF_LINK_STATE_DISABLE:
  268. break;
  269. default:
  270. return -EINVAL;
  271. }
  272. nsim_dev->vfconfigs[vf].link_state = state;
  273. return 0;
  274. }
  275. static void nsim_taprio_stats(struct tc_taprio_qopt_stats *stats)
  276. {
  277. stats->window_drops = 0;
  278. stats->tx_overruns = 0;
  279. }
  280. static int nsim_setup_tc_taprio(struct net_device *dev,
  281. struct tc_taprio_qopt_offload *offload)
  282. {
  283. int err = 0;
  284. switch (offload->cmd) {
  285. case TAPRIO_CMD_REPLACE:
  286. case TAPRIO_CMD_DESTROY:
  287. break;
  288. case TAPRIO_CMD_STATS:
  289. nsim_taprio_stats(&offload->stats);
  290. break;
  291. default:
  292. err = -EOPNOTSUPP;
  293. }
  294. return err;
  295. }
  296. static LIST_HEAD(nsim_block_cb_list);
  297. static int
  298. nsim_setup_tc(struct net_device *dev, enum tc_setup_type type, void *type_data)
  299. {
  300. struct netdevsim *ns = netdev_priv(dev);
  301. switch (type) {
  302. case TC_SETUP_QDISC_TAPRIO:
  303. return nsim_setup_tc_taprio(dev, type_data);
  304. case TC_SETUP_BLOCK:
  305. return flow_block_cb_setup_simple(type_data,
  306. &nsim_block_cb_list,
  307. nsim_setup_tc_block_cb,
  308. ns, ns, true);
  309. default:
  310. return -EOPNOTSUPP;
  311. }
  312. }
  313. static int
  314. nsim_set_features(struct net_device *dev, netdev_features_t features)
  315. {
  316. struct netdevsim *ns = netdev_priv(dev);
  317. if ((dev->features & NETIF_F_HW_TC) > (features & NETIF_F_HW_TC))
  318. return nsim_bpf_disable_tc(ns);
  319. return 0;
  320. }
  321. static int nsim_get_iflink(const struct net_device *dev)
  322. {
  323. struct netdevsim *nsim, *peer;
  324. int iflink;
  325. nsim = netdev_priv(dev);
  326. rcu_read_lock();
  327. peer = rcu_dereference(nsim->peer);
  328. iflink = peer ? READ_ONCE(peer->netdev->ifindex) :
  329. READ_ONCE(dev->ifindex);
  330. rcu_read_unlock();
  331. return iflink;
  332. }
  333. static int nsim_rcv(struct nsim_rq *rq, int budget)
  334. {
  335. struct net_device *dev = rq->napi.dev;
  336. struct bpf_prog *xdp_prog;
  337. struct netdevsim *ns;
  338. struct sk_buff *skb;
  339. unsigned int skblen;
  340. int i, ret;
  341. ns = netdev_priv(dev);
  342. xdp_prog = READ_ONCE(ns->xdp.prog);
  343. for (i = 0; i < budget; i++) {
  344. if (skb_queue_empty(&rq->skb_queue))
  345. break;
  346. skb = skb_dequeue(&rq->skb_queue);
  347. if (xdp_prog) {
  348. /* skb might be freed directly by XDP, save the len */
  349. skblen = skb->len;
  350. if (skb->ip_summed == CHECKSUM_PARTIAL)
  351. skb_checksum_help(skb);
  352. ret = do_xdp_generic(xdp_prog, &skb);
  353. if (ret != XDP_PASS) {
  354. dev_dstats_rx_add(dev, skblen);
  355. continue;
  356. }
  357. }
  358. /* skb might be discard at netif_receive_skb, save the len */
  359. dev_dstats_rx_add(dev, skb->len);
  360. napi_gro_receive(&rq->napi, skb);
  361. }
  362. nsim_start_peer_tx_queue(dev, rq);
  363. return i;
  364. }
  365. static int nsim_poll(struct napi_struct *napi, int budget)
  366. {
  367. struct nsim_rq *rq = container_of(napi, struct nsim_rq, napi);
  368. int done;
  369. done = nsim_rcv(rq, budget);
  370. if (done < budget)
  371. napi_complete_done(napi, done);
  372. return done;
  373. }
  374. static int nsim_create_page_pool(struct page_pool **p, struct napi_struct *napi)
  375. {
  376. struct page_pool_params params = {
  377. .order = 0,
  378. .pool_size = NSIM_RING_SIZE,
  379. .nid = NUMA_NO_NODE,
  380. .dev = &napi->dev->dev,
  381. .napi = napi,
  382. .dma_dir = DMA_BIDIRECTIONAL,
  383. .netdev = napi->dev,
  384. };
  385. struct page_pool *pool;
  386. pool = page_pool_create(&params);
  387. if (IS_ERR(pool))
  388. return PTR_ERR(pool);
  389. *p = pool;
  390. return 0;
  391. }
  392. static int nsim_init_napi(struct netdevsim *ns)
  393. {
  394. struct net_device *dev = ns->netdev;
  395. struct nsim_rq *rq;
  396. int err, i;
  397. for (i = 0; i < dev->num_rx_queues; i++) {
  398. rq = ns->rq[i];
  399. netif_napi_add_config_locked(dev, &rq->napi, nsim_poll, i);
  400. }
  401. for (i = 0; i < dev->num_rx_queues; i++) {
  402. rq = ns->rq[i];
  403. err = nsim_create_page_pool(&rq->page_pool, &rq->napi);
  404. if (err)
  405. goto err_pp_destroy;
  406. }
  407. return 0;
  408. err_pp_destroy:
  409. while (i--) {
  410. page_pool_destroy(ns->rq[i]->page_pool);
  411. ns->rq[i]->page_pool = NULL;
  412. }
  413. for (i = 0; i < dev->num_rx_queues; i++)
  414. __netif_napi_del_locked(&ns->rq[i]->napi);
  415. return err;
  416. }
  417. static enum hrtimer_restart nsim_napi_schedule(struct hrtimer *timer)
  418. {
  419. struct nsim_rq *rq;
  420. rq = container_of(timer, struct nsim_rq, napi_timer);
  421. napi_schedule(&rq->napi);
  422. return HRTIMER_NORESTART;
  423. }
  424. static void nsim_rq_timer_init(struct nsim_rq *rq)
  425. {
  426. hrtimer_setup(&rq->napi_timer, nsim_napi_schedule, CLOCK_MONOTONIC,
  427. HRTIMER_MODE_REL);
  428. }
  429. static void nsim_enable_napi(struct netdevsim *ns)
  430. {
  431. struct net_device *dev = ns->netdev;
  432. int i;
  433. for (i = 0; i < dev->num_rx_queues; i++) {
  434. struct nsim_rq *rq = ns->rq[i];
  435. netif_queue_set_napi(dev, i, NETDEV_QUEUE_TYPE_RX, &rq->napi);
  436. napi_enable_locked(&rq->napi);
  437. }
  438. }
  439. static int nsim_open(struct net_device *dev)
  440. {
  441. struct netdevsim *ns = netdev_priv(dev);
  442. struct netdevsim *peer;
  443. int err;
  444. netdev_assert_locked(dev);
  445. err = nsim_init_napi(ns);
  446. if (err)
  447. return err;
  448. nsim_enable_napi(ns);
  449. peer = rtnl_dereference(ns->peer);
  450. if (peer && netif_running(peer->netdev)) {
  451. netif_carrier_on(dev);
  452. netif_carrier_on(peer->netdev);
  453. }
  454. return 0;
  455. }
  456. static void nsim_del_napi(struct netdevsim *ns)
  457. {
  458. struct net_device *dev = ns->netdev;
  459. int i;
  460. for (i = 0; i < dev->num_rx_queues; i++) {
  461. struct nsim_rq *rq = ns->rq[i];
  462. napi_disable_locked(&rq->napi);
  463. __netif_napi_del_locked(&rq->napi);
  464. }
  465. synchronize_net();
  466. for (i = 0; i < dev->num_rx_queues; i++) {
  467. page_pool_destroy(ns->rq[i]->page_pool);
  468. ns->rq[i]->page_pool = NULL;
  469. }
  470. }
  471. static int nsim_stop(struct net_device *dev)
  472. {
  473. struct netdevsim *ns = netdev_priv(dev);
  474. struct netdevsim *peer;
  475. netdev_assert_locked(dev);
  476. netif_carrier_off(dev);
  477. peer = rtnl_dereference(ns->peer);
  478. if (peer)
  479. netif_carrier_off(peer->netdev);
  480. nsim_del_napi(ns);
  481. return 0;
  482. }
  483. static int nsim_shaper_set(struct net_shaper_binding *binding,
  484. const struct net_shaper *shaper,
  485. struct netlink_ext_ack *extack)
  486. {
  487. return 0;
  488. }
  489. static int nsim_shaper_del(struct net_shaper_binding *binding,
  490. const struct net_shaper_handle *handle,
  491. struct netlink_ext_ack *extack)
  492. {
  493. return 0;
  494. }
  495. static int nsim_shaper_group(struct net_shaper_binding *binding,
  496. int leaves_count,
  497. const struct net_shaper *leaves,
  498. const struct net_shaper *root,
  499. struct netlink_ext_ack *extack)
  500. {
  501. return 0;
  502. }
  503. static void nsim_shaper_cap(struct net_shaper_binding *binding,
  504. enum net_shaper_scope scope,
  505. unsigned long *flags)
  506. {
  507. *flags = ULONG_MAX;
  508. }
  509. static const struct net_shaper_ops nsim_shaper_ops = {
  510. .set = nsim_shaper_set,
  511. .delete = nsim_shaper_del,
  512. .group = nsim_shaper_group,
  513. .capabilities = nsim_shaper_cap,
  514. };
  515. static const struct net_device_ops nsim_netdev_ops = {
  516. .ndo_start_xmit = nsim_start_xmit,
  517. .ndo_set_rx_mode = nsim_set_rx_mode,
  518. .ndo_set_mac_address = eth_mac_addr,
  519. .ndo_validate_addr = eth_validate_addr,
  520. .ndo_change_mtu = nsim_change_mtu,
  521. .ndo_set_vf_mac = nsim_set_vf_mac,
  522. .ndo_set_vf_vlan = nsim_set_vf_vlan,
  523. .ndo_set_vf_rate = nsim_set_vf_rate,
  524. .ndo_set_vf_spoofchk = nsim_set_vf_spoofchk,
  525. .ndo_set_vf_trust = nsim_set_vf_trust,
  526. .ndo_get_vf_config = nsim_get_vf_config,
  527. .ndo_set_vf_link_state = nsim_set_vf_link_state,
  528. .ndo_set_vf_rss_query_en = nsim_set_vf_rss_query_en,
  529. .ndo_setup_tc = nsim_setup_tc,
  530. .ndo_set_features = nsim_set_features,
  531. .ndo_get_iflink = nsim_get_iflink,
  532. .ndo_bpf = nsim_bpf,
  533. .ndo_open = nsim_open,
  534. .ndo_stop = nsim_stop,
  535. .net_shaper_ops = &nsim_shaper_ops,
  536. };
  537. static const struct net_device_ops nsim_vf_netdev_ops = {
  538. .ndo_start_xmit = nsim_start_xmit,
  539. .ndo_set_rx_mode = nsim_set_rx_mode,
  540. .ndo_set_mac_address = eth_mac_addr,
  541. .ndo_validate_addr = eth_validate_addr,
  542. .ndo_change_mtu = nsim_change_mtu,
  543. .ndo_setup_tc = nsim_setup_tc,
  544. .ndo_set_features = nsim_set_features,
  545. };
  546. /* We don't have true per-queue stats, yet, so do some random fakery here.
  547. * Only report stuff for queue 0.
  548. */
  549. static void nsim_get_queue_stats_rx(struct net_device *dev, int idx,
  550. struct netdev_queue_stats_rx *stats)
  551. {
  552. struct rtnl_link_stats64 rtstats = {};
  553. if (!idx)
  554. dev_get_stats(dev, &rtstats);
  555. stats->packets = rtstats.rx_packets - !!rtstats.rx_packets;
  556. stats->bytes = rtstats.rx_bytes;
  557. }
  558. static void nsim_get_queue_stats_tx(struct net_device *dev, int idx,
  559. struct netdev_queue_stats_tx *stats)
  560. {
  561. struct rtnl_link_stats64 rtstats = {};
  562. if (!idx)
  563. dev_get_stats(dev, &rtstats);
  564. stats->packets = rtstats.tx_packets - !!rtstats.tx_packets;
  565. stats->bytes = rtstats.tx_bytes;
  566. }
  567. static void nsim_get_base_stats(struct net_device *dev,
  568. struct netdev_queue_stats_rx *rx,
  569. struct netdev_queue_stats_tx *tx)
  570. {
  571. struct rtnl_link_stats64 rtstats = {};
  572. dev_get_stats(dev, &rtstats);
  573. rx->packets = !!rtstats.rx_packets;
  574. rx->bytes = 0;
  575. tx->packets = !!rtstats.tx_packets;
  576. tx->bytes = 0;
  577. }
  578. static const struct netdev_stat_ops nsim_stat_ops = {
  579. .get_queue_stats_tx = nsim_get_queue_stats_tx,
  580. .get_queue_stats_rx = nsim_get_queue_stats_rx,
  581. .get_base_stats = nsim_get_base_stats,
  582. };
  583. static struct nsim_rq *nsim_queue_alloc(void)
  584. {
  585. struct nsim_rq *rq;
  586. rq = kzalloc_obj(*rq, GFP_KERNEL_ACCOUNT);
  587. if (!rq)
  588. return NULL;
  589. skb_queue_head_init(&rq->skb_queue);
  590. nsim_rq_timer_init(rq);
  591. return rq;
  592. }
  593. static void nsim_queue_free(struct net_device *dev, struct nsim_rq *rq)
  594. {
  595. hrtimer_cancel(&rq->napi_timer);
  596. if (rq->skb_queue.qlen) {
  597. local_bh_disable();
  598. dev_dstats_rx_dropped_add(dev, rq->skb_queue.qlen);
  599. local_bh_enable();
  600. }
  601. skb_queue_purge_reason(&rq->skb_queue, SKB_DROP_REASON_QUEUE_PURGE);
  602. kfree(rq);
  603. }
  604. /* Queue reset mode is controlled by ns->rq_reset_mode.
  605. * - normal - new NAPI new pool (old NAPI enabled when new added)
  606. * - mode 1 - allocate new pool (NAPI is only disabled / enabled)
  607. * - mode 2 - new NAPI new pool (old NAPI removed before new added)
  608. * - mode 3 - new NAPI new pool (old NAPI disabled when new added)
  609. */
  610. struct nsim_queue_mem {
  611. struct nsim_rq *rq;
  612. struct page_pool *pp;
  613. };
  614. static int
  615. nsim_queue_mem_alloc(struct net_device *dev,
  616. struct netdev_queue_config *qcfg,
  617. void *per_queue_mem, int idx)
  618. {
  619. struct nsim_queue_mem *qmem = per_queue_mem;
  620. struct netdevsim *ns = netdev_priv(dev);
  621. int err;
  622. if (ns->rq_reset_mode > 3)
  623. return -EINVAL;
  624. if (ns->rq_reset_mode == 1) {
  625. if (!netif_running(ns->netdev))
  626. return -ENETDOWN;
  627. return nsim_create_page_pool(&qmem->pp, &ns->rq[idx]->napi);
  628. }
  629. qmem->rq = nsim_queue_alloc();
  630. if (!qmem->rq)
  631. return -ENOMEM;
  632. err = nsim_create_page_pool(&qmem->rq->page_pool, &qmem->rq->napi);
  633. if (err)
  634. goto err_free;
  635. if (!ns->rq_reset_mode)
  636. netif_napi_add_config_locked(dev, &qmem->rq->napi, nsim_poll,
  637. idx);
  638. return 0;
  639. err_free:
  640. nsim_queue_free(dev, qmem->rq);
  641. return err;
  642. }
  643. static void nsim_queue_mem_free(struct net_device *dev, void *per_queue_mem)
  644. {
  645. struct nsim_queue_mem *qmem = per_queue_mem;
  646. struct netdevsim *ns = netdev_priv(dev);
  647. page_pool_destroy(qmem->pp);
  648. if (qmem->rq) {
  649. if (!ns->rq_reset_mode)
  650. netif_napi_del_locked(&qmem->rq->napi);
  651. page_pool_destroy(qmem->rq->page_pool);
  652. nsim_queue_free(dev, qmem->rq);
  653. }
  654. }
  655. static int
  656. nsim_queue_start(struct net_device *dev, struct netdev_queue_config *qcfg,
  657. void *per_queue_mem, int idx)
  658. {
  659. struct nsim_queue_mem *qmem = per_queue_mem;
  660. struct netdevsim *ns = netdev_priv(dev);
  661. netdev_assert_locked(dev);
  662. if (ns->rq_reset_mode == 1) {
  663. ns->rq[idx]->page_pool = qmem->pp;
  664. napi_enable_locked(&ns->rq[idx]->napi);
  665. return 0;
  666. }
  667. /* netif_napi_add()/_del() should normally be called from alloc/free,
  668. * here we want to test various call orders.
  669. */
  670. if (ns->rq_reset_mode == 2) {
  671. netif_napi_del_locked(&ns->rq[idx]->napi);
  672. netif_napi_add_config_locked(dev, &qmem->rq->napi, nsim_poll,
  673. idx);
  674. } else if (ns->rq_reset_mode == 3) {
  675. netif_napi_add_config_locked(dev, &qmem->rq->napi, nsim_poll,
  676. idx);
  677. netif_napi_del_locked(&ns->rq[idx]->napi);
  678. }
  679. ns->rq[idx] = qmem->rq;
  680. napi_enable_locked(&ns->rq[idx]->napi);
  681. return 0;
  682. }
  683. static int nsim_queue_stop(struct net_device *dev, void *per_queue_mem, int idx)
  684. {
  685. struct nsim_queue_mem *qmem = per_queue_mem;
  686. struct netdevsim *ns = netdev_priv(dev);
  687. netdev_assert_locked(dev);
  688. napi_disable_locked(&ns->rq[idx]->napi);
  689. if (ns->rq_reset_mode == 1) {
  690. qmem->pp = ns->rq[idx]->page_pool;
  691. page_pool_disable_direct_recycling(qmem->pp);
  692. } else {
  693. qmem->rq = ns->rq[idx];
  694. }
  695. return 0;
  696. }
  697. static const struct netdev_queue_mgmt_ops nsim_queue_mgmt_ops = {
  698. .ndo_queue_mem_size = sizeof(struct nsim_queue_mem),
  699. .ndo_queue_mem_alloc = nsim_queue_mem_alloc,
  700. .ndo_queue_mem_free = nsim_queue_mem_free,
  701. .ndo_queue_start = nsim_queue_start,
  702. .ndo_queue_stop = nsim_queue_stop,
  703. };
  704. static ssize_t
  705. nsim_qreset_write(struct file *file, const char __user *data,
  706. size_t count, loff_t *ppos)
  707. {
  708. struct netdevsim *ns = file->private_data;
  709. unsigned int queue, mode;
  710. char buf[32];
  711. ssize_t ret;
  712. if (count >= sizeof(buf))
  713. return -EINVAL;
  714. if (copy_from_user(buf, data, count))
  715. return -EFAULT;
  716. buf[count] = '\0';
  717. ret = sscanf(buf, "%u %u", &queue, &mode);
  718. if (ret != 2)
  719. return -EINVAL;
  720. netdev_lock(ns->netdev);
  721. if (queue >= ns->netdev->real_num_rx_queues) {
  722. ret = -EINVAL;
  723. goto exit_unlock;
  724. }
  725. ns->rq_reset_mode = mode;
  726. ret = netdev_rx_queue_restart(ns->netdev, queue);
  727. ns->rq_reset_mode = 0;
  728. if (ret)
  729. goto exit_unlock;
  730. ret = count;
  731. exit_unlock:
  732. netdev_unlock(ns->netdev);
  733. return ret;
  734. }
  735. static const struct file_operations nsim_qreset_fops = {
  736. .open = simple_open,
  737. .write = nsim_qreset_write,
  738. .owner = THIS_MODULE,
  739. };
  740. static ssize_t
  741. nsim_pp_hold_read(struct file *file, char __user *data,
  742. size_t count, loff_t *ppos)
  743. {
  744. struct netdevsim *ns = file->private_data;
  745. char buf[3] = "n\n";
  746. if (ns->page)
  747. buf[0] = 'y';
  748. return simple_read_from_buffer(data, count, ppos, buf, 2);
  749. }
  750. static ssize_t
  751. nsim_pp_hold_write(struct file *file, const char __user *data,
  752. size_t count, loff_t *ppos)
  753. {
  754. struct netdevsim *ns = file->private_data;
  755. ssize_t ret;
  756. bool val;
  757. ret = kstrtobool_from_user(data, count, &val);
  758. if (ret)
  759. return ret;
  760. rtnl_lock();
  761. ret = count;
  762. if (val == !!ns->page)
  763. goto exit;
  764. if (!netif_running(ns->netdev) && val) {
  765. ret = -ENETDOWN;
  766. } else if (val) {
  767. ns->page = page_pool_dev_alloc_pages(ns->rq[0]->page_pool);
  768. if (!ns->page)
  769. ret = -ENOMEM;
  770. } else {
  771. page_pool_put_full_page(pp_page_to_nmdesc(ns->page)->pp,
  772. ns->page, false);
  773. ns->page = NULL;
  774. }
  775. exit:
  776. rtnl_unlock();
  777. return ret;
  778. }
  779. static const struct file_operations nsim_pp_hold_fops = {
  780. .open = simple_open,
  781. .read = nsim_pp_hold_read,
  782. .write = nsim_pp_hold_write,
  783. .llseek = generic_file_llseek,
  784. .owner = THIS_MODULE,
  785. };
  786. static void nsim_setup(struct net_device *dev)
  787. {
  788. ether_setup(dev);
  789. eth_hw_addr_random(dev);
  790. dev->flags &= ~IFF_MULTICAST;
  791. dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
  792. dev->features |= NETIF_F_HIGHDMA |
  793. NETIF_F_SG |
  794. NETIF_F_FRAGLIST |
  795. NETIF_F_HW_CSUM |
  796. NETIF_F_LRO |
  797. NETIF_F_TSO;
  798. dev->hw_features |= NETIF_F_HW_TC |
  799. NETIF_F_SG |
  800. NETIF_F_FRAGLIST |
  801. NETIF_F_HW_CSUM |
  802. NETIF_F_LRO |
  803. NETIF_F_TSO |
  804. NETIF_F_LOOPBACK;
  805. dev->pcpu_stat_type = NETDEV_PCPU_STAT_DSTATS;
  806. dev->max_mtu = ETH_MAX_MTU;
  807. dev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_HW_OFFLOAD;
  808. }
  809. static int nsim_queue_init(struct netdevsim *ns)
  810. {
  811. struct net_device *dev = ns->netdev;
  812. int i;
  813. ns->rq = kzalloc_objs(*ns->rq, dev->num_rx_queues, GFP_KERNEL_ACCOUNT);
  814. if (!ns->rq)
  815. return -ENOMEM;
  816. for (i = 0; i < dev->num_rx_queues; i++) {
  817. ns->rq[i] = nsim_queue_alloc();
  818. if (!ns->rq[i])
  819. goto err_free_prev;
  820. }
  821. return 0;
  822. err_free_prev:
  823. while (i--)
  824. kfree(ns->rq[i]);
  825. kfree(ns->rq);
  826. return -ENOMEM;
  827. }
  828. static void nsim_queue_uninit(struct netdevsim *ns)
  829. {
  830. struct net_device *dev = ns->netdev;
  831. int i;
  832. for (i = 0; i < dev->num_rx_queues; i++)
  833. nsim_queue_free(dev, ns->rq[i]);
  834. kfree(ns->rq);
  835. ns->rq = NULL;
  836. }
  837. static int nsim_init_netdevsim(struct netdevsim *ns)
  838. {
  839. struct netdevsim *peer;
  840. struct mock_phc *phc;
  841. int err;
  842. phc = mock_phc_create(&ns->nsim_bus_dev->dev);
  843. if (IS_ERR(phc))
  844. return PTR_ERR(phc);
  845. ns->phc = phc;
  846. ns->netdev->netdev_ops = &nsim_netdev_ops;
  847. ns->netdev->stat_ops = &nsim_stat_ops;
  848. ns->netdev->queue_mgmt_ops = &nsim_queue_mgmt_ops;
  849. netdev_lockdep_set_classes(ns->netdev);
  850. err = nsim_udp_tunnels_info_create(ns->nsim_dev, ns->netdev);
  851. if (err)
  852. goto err_phc_destroy;
  853. rtnl_lock();
  854. err = nsim_queue_init(ns);
  855. if (err)
  856. goto err_utn_destroy;
  857. err = nsim_bpf_init(ns);
  858. if (err)
  859. goto err_rq_destroy;
  860. nsim_macsec_init(ns);
  861. nsim_ipsec_init(ns);
  862. err = register_netdevice(ns->netdev);
  863. if (err)
  864. goto err_ipsec_teardown;
  865. rtnl_unlock();
  866. err = nsim_psp_init(ns);
  867. if (err)
  868. goto err_unregister_netdev;
  869. if (IS_ENABLED(CONFIG_DEBUG_NET)) {
  870. ns->nb.notifier_call = netdev_debug_event;
  871. if (register_netdevice_notifier_dev_net(ns->netdev, &ns->nb,
  872. &ns->nn))
  873. ns->nb.notifier_call = NULL;
  874. }
  875. return 0;
  876. err_unregister_netdev:
  877. rtnl_lock();
  878. peer = rtnl_dereference(ns->peer);
  879. if (peer)
  880. RCU_INIT_POINTER(peer->peer, NULL);
  881. RCU_INIT_POINTER(ns->peer, NULL);
  882. unregister_netdevice(ns->netdev);
  883. err_ipsec_teardown:
  884. nsim_ipsec_teardown(ns);
  885. nsim_macsec_teardown(ns);
  886. nsim_bpf_uninit(ns);
  887. err_rq_destroy:
  888. nsim_queue_uninit(ns);
  889. err_utn_destroy:
  890. rtnl_unlock();
  891. nsim_udp_tunnels_info_destroy(ns->netdev);
  892. err_phc_destroy:
  893. mock_phc_destroy(ns->phc);
  894. return err;
  895. }
  896. static int nsim_init_netdevsim_vf(struct netdevsim *ns)
  897. {
  898. int err;
  899. ns->netdev->netdev_ops = &nsim_vf_netdev_ops;
  900. rtnl_lock();
  901. err = register_netdevice(ns->netdev);
  902. rtnl_unlock();
  903. return err;
  904. }
  905. static void nsim_exit_netdevsim(struct netdevsim *ns)
  906. {
  907. nsim_udp_tunnels_info_destroy(ns->netdev);
  908. mock_phc_destroy(ns->phc);
  909. }
  910. struct netdevsim *nsim_create(struct nsim_dev *nsim_dev,
  911. struct nsim_dev_port *nsim_dev_port,
  912. u8 perm_addr[ETH_ALEN])
  913. {
  914. struct net_device *dev;
  915. struct netdevsim *ns;
  916. int err;
  917. dev = alloc_netdev_mq(sizeof(*ns), "eth%d", NET_NAME_UNKNOWN, nsim_setup,
  918. nsim_dev->nsim_bus_dev->num_queues);
  919. if (!dev)
  920. return ERR_PTR(-ENOMEM);
  921. if (perm_addr)
  922. memcpy(dev->perm_addr, perm_addr, ETH_ALEN);
  923. dev_net_set(dev, nsim_dev_net(nsim_dev));
  924. ns = netdev_priv(dev);
  925. ns->netdev = dev;
  926. ns->nsim_dev = nsim_dev;
  927. ns->nsim_dev_port = nsim_dev_port;
  928. ns->nsim_bus_dev = nsim_dev->nsim_bus_dev;
  929. SET_NETDEV_DEV(dev, &ns->nsim_bus_dev->dev);
  930. SET_NETDEV_DEVLINK_PORT(dev, &nsim_dev_port->devlink_port);
  931. nsim_ethtool_init(ns);
  932. if (nsim_dev_port_is_pf(nsim_dev_port))
  933. err = nsim_init_netdevsim(ns);
  934. else
  935. err = nsim_init_netdevsim_vf(ns);
  936. if (err)
  937. goto err_free_netdev;
  938. ns->pp_dfs = debugfs_create_file("pp_hold", 0600, nsim_dev_port->ddir,
  939. ns, &nsim_pp_hold_fops);
  940. ns->qr_dfs = debugfs_create_file("queue_reset", 0200,
  941. nsim_dev_port->ddir, ns,
  942. &nsim_qreset_fops);
  943. return ns;
  944. err_free_netdev:
  945. free_netdev(dev);
  946. return ERR_PTR(err);
  947. }
  948. void nsim_destroy(struct netdevsim *ns)
  949. {
  950. struct net_device *dev = ns->netdev;
  951. struct netdevsim *peer;
  952. debugfs_remove(ns->qr_dfs);
  953. debugfs_remove(ns->pp_dfs);
  954. if (ns->nb.notifier_call)
  955. unregister_netdevice_notifier_dev_net(ns->netdev, &ns->nb,
  956. &ns->nn);
  957. nsim_psp_uninit(ns);
  958. rtnl_lock();
  959. peer = rtnl_dereference(ns->peer);
  960. if (peer)
  961. RCU_INIT_POINTER(peer->peer, NULL);
  962. RCU_INIT_POINTER(ns->peer, NULL);
  963. unregister_netdevice(dev);
  964. if (nsim_dev_port_is_pf(ns->nsim_dev_port)) {
  965. nsim_macsec_teardown(ns);
  966. nsim_ipsec_teardown(ns);
  967. nsim_bpf_uninit(ns);
  968. nsim_queue_uninit(ns);
  969. }
  970. rtnl_unlock();
  971. if (nsim_dev_port_is_pf(ns->nsim_dev_port))
  972. nsim_exit_netdevsim(ns);
  973. /* Put this intentionally late to exercise the orphaning path */
  974. if (ns->page) {
  975. page_pool_put_full_page(pp_page_to_nmdesc(ns->page)->pp,
  976. ns->page, false);
  977. ns->page = NULL;
  978. }
  979. free_netdev(dev);
  980. }
  981. bool netdev_is_nsim(struct net_device *dev)
  982. {
  983. return dev->netdev_ops == &nsim_netdev_ops;
  984. }
  985. static int nsim_validate(struct nlattr *tb[], struct nlattr *data[],
  986. struct netlink_ext_ack *extack)
  987. {
  988. NL_SET_ERR_MSG_MOD(extack,
  989. "Please use: echo \"[ID] [PORT_COUNT] [NUM_QUEUES]\" > /sys/bus/netdevsim/new_device");
  990. return -EOPNOTSUPP;
  991. }
  992. static struct rtnl_link_ops nsim_link_ops __read_mostly = {
  993. .kind = DRV_NAME,
  994. .validate = nsim_validate,
  995. };
  996. static int __init nsim_module_init(void)
  997. {
  998. int err;
  999. err = nsim_dev_init();
  1000. if (err)
  1001. return err;
  1002. err = nsim_bus_init();
  1003. if (err)
  1004. goto err_dev_exit;
  1005. err = rtnl_link_register(&nsim_link_ops);
  1006. if (err)
  1007. goto err_bus_exit;
  1008. return 0;
  1009. err_bus_exit:
  1010. nsim_bus_exit();
  1011. err_dev_exit:
  1012. nsim_dev_exit();
  1013. return err;
  1014. }
  1015. static void __exit nsim_module_exit(void)
  1016. {
  1017. rtnl_link_unregister(&nsim_link_ops);
  1018. nsim_bus_exit();
  1019. nsim_dev_exit();
  1020. }
  1021. module_init(nsim_module_init);
  1022. module_exit(nsim_module_exit);
  1023. MODULE_LICENSE("GPL");
  1024. MODULE_DESCRIPTION("Simulated networking device for testing");
  1025. MODULE_ALIAS_RTNL_LINK(DRV_NAME);