You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

netfront.c 23KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852
  1. /*
  2. * Copyright (C) 2014 Michael Brown <mbrown@fensystems.co.uk>.
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License as
  6. * published by the Free Software Foundation; either version 2 of the
  7. * License, or (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful, but
  10. * WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the Free Software
  16. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  17. * 02110-1301, USA.
  18. */
  19. FILE_LICENCE ( GPL2_OR_LATER );
  20. #include <stdint.h>
  21. #include <stdlib.h>
  22. #include <errno.h>
  23. #include <ipxe/netdevice.h>
  24. #include <ipxe/ethernet.h>
  25. #include <ipxe/if_ether.h>
  26. #include <ipxe/malloc.h>
  27. #include <ipxe/base16.h>
  28. #include <ipxe/xen.h>
  29. #include <ipxe/xenstore.h>
  30. #include <ipxe/xenbus.h>
  31. #include <ipxe/xengrant.h>
  32. #include <ipxe/xenevent.h>
  33. #include "netfront.h"
  34. /** @file
  35. *
  36. * Xen netfront driver
  37. *
  38. */
  39. /* Disambiguate the various error causes */
  40. #define EIO_NETIF_RSP_ERROR \
  41. __einfo_error ( EINFO_EIO_NETIF_RSP_ERROR )
  42. #define EINFO_EIO_NETIF_RSP_ERROR \
  43. __einfo_uniqify ( EINFO_EIO, -NETIF_RSP_ERROR, \
  44. "Unspecified network error" )
  45. #define EIO_NETIF_RSP_DROPPED \
  46. __einfo_error ( EINFO_EIO_NETIF_RSP_DROPPED )
  47. #define EINFO_EIO_NETIF_RSP_DROPPED \
  48. __einfo_uniqify ( EINFO_EIO, -NETIF_RSP_DROPPED, \
  49. "Packet dropped" )
  50. #define EIO_NETIF_RSP( status ) \
  51. EUNIQ ( EINFO_EIO, -(status), \
  52. EIO_NETIF_RSP_ERROR, EIO_NETIF_RSP_DROPPED )
  53. /******************************************************************************
  54. *
  55. * XenStore interface
  56. *
  57. ******************************************************************************
  58. */
  59. /**
  60. * Fetch MAC address
  61. *
  62. * @v netfront Netfront device
  63. * @v hw_addr Hardware address to fill in
  64. * @ret rc Return status code
  65. */
  66. static int netfront_read_mac ( struct netfront_nic *netfront, void *hw_addr ) {
  67. struct xen_device *xendev = netfront->xendev;
  68. struct xen_hypervisor *xen = xendev->xen;
  69. char *mac;
  70. int len;
  71. int rc;
  72. /* Fetch MAC address */
  73. if ( ( rc = xenstore_read ( xen, &mac, xendev->key, "mac", NULL ) )!=0){
  74. DBGC ( netfront, "NETFRONT %s could not read MAC address: %s\n",
  75. xendev->key, strerror ( rc ) );
  76. goto err_xenstore_read;
  77. }
  78. DBGC2 ( netfront, "NETFRONT %s has MAC address \"%s\"\n",
  79. xendev->key, mac );
  80. /* Decode MAC address */
  81. len = hex_decode ( mac, ':', hw_addr, ETH_ALEN );
  82. if ( len < 0 ) {
  83. rc = len;
  84. DBGC ( netfront, "NETFRONT %s could not decode MAC address "
  85. "\"%s\": %s\n", xendev->key, mac, strerror ( rc ) );
  86. goto err_decode;
  87. }
  88. /* Success */
  89. rc = 0;
  90. err_decode:
  91. free ( mac );
  92. err_xenstore_read:
  93. return rc;
  94. }
  95. /**
  96. * Write XenStore numeric value
  97. *
  98. * @v netfront Netfront device
  99. * @v subkey Subkey
  100. * @v num Numeric value
  101. * @ret rc Return status code
  102. */
  103. static int netfront_write_num ( struct netfront_nic *netfront,
  104. const char *subkey, unsigned long num ) {
  105. struct xen_device *xendev = netfront->xendev;
  106. struct xen_hypervisor *xen = xendev->xen;
  107. int rc;
  108. /* Write value */
  109. if ( ( rc = xenstore_write_num ( xen, num, xendev->key, subkey,
  110. NULL ) ) != 0 ) {
  111. DBGC ( netfront, "NETFRONT %s could not set %s=\"%ld\": %s\n",
  112. xendev->key, subkey, num, strerror ( rc ) );
  113. return rc;
  114. }
  115. return 0;
  116. }
  117. /**
  118. * Write XenStore flag value
  119. *
  120. * @v netfront Netfront device
  121. * @v subkey Subkey
  122. * @v num Numeric value
  123. * @ret rc Return status code
  124. */
  125. static int netfront_write_flag ( struct netfront_nic *netfront,
  126. const char *subkey ) {
  127. return netfront_write_num ( netfront, subkey, 1 );
  128. }
  129. /**
  130. * Delete XenStore value
  131. *
  132. * @v netfront Netfront device
  133. * @v subkey Subkey
  134. * @ret rc Return status code
  135. */
  136. static int netfront_rm ( struct netfront_nic *netfront, const char *subkey ) {
  137. struct xen_device *xendev = netfront->xendev;
  138. struct xen_hypervisor *xen = xendev->xen;
  139. int rc;
  140. /* Remove value */
  141. if ( ( rc = xenstore_rm ( xen, xendev->key, subkey, NULL ) ) != 0 ) {
  142. DBGC ( netfront, "NETFRONT %s could not delete %s: %s\n",
  143. xendev->key, subkey, strerror ( rc ) );
  144. return rc;
  145. }
  146. return 0;
  147. }
  148. /******************************************************************************
  149. *
  150. * Events
  151. *
  152. ******************************************************************************
  153. */
  154. /**
  155. * Create event channel
  156. *
  157. * @v netfront Netfront device
  158. * @ret rc Return status code
  159. */
  160. static int netfront_create_event ( struct netfront_nic *netfront ) {
  161. struct xen_device *xendev = netfront->xendev;
  162. struct xen_hypervisor *xen = xendev->xen;
  163. struct evtchn_alloc_unbound alloc_unbound;
  164. struct evtchn_close close;
  165. int xenrc;
  166. int rc;
  167. /* Allocate event */
  168. alloc_unbound.dom = DOMID_SELF;
  169. alloc_unbound.remote_dom = xendev->backend_id;
  170. if ( ( xenrc = xenevent_alloc_unbound ( xen, &alloc_unbound ) ) != 0 ) {
  171. rc = -EXEN ( xenrc );
  172. DBGC ( netfront, "NETFRONT %s could not allocate event: %s\n",
  173. xendev->key, strerror ( rc ) );
  174. goto err_alloc_unbound;
  175. }
  176. netfront->event.port = alloc_unbound.port;
  177. /* Publish event channel */
  178. if ( ( rc = netfront_write_num ( netfront, "event-channel",
  179. netfront->event.port ) ) != 0 )
  180. goto err_write_num;
  181. DBGC ( netfront, "NETFRONT %s event-channel=\"%d\"\n",
  182. xendev->key, netfront->event.port );
  183. return 0;
  184. netfront_rm ( netfront, "event-channel" );
  185. err_write_num:
  186. close.port = netfront->event.port;
  187. xenevent_close ( xen, &close );
  188. err_alloc_unbound:
  189. return rc;
  190. }
  191. /**
  192. * Send event
  193. *
  194. * @v netfront Netfront device
  195. * @ret rc Return status code
  196. */
  197. static inline __attribute__ (( always_inline )) int
  198. netfront_send_event ( struct netfront_nic *netfront ) {
  199. struct xen_device *xendev = netfront->xendev;
  200. struct xen_hypervisor *xen = xendev->xen;
  201. int xenrc;
  202. int rc;
  203. /* Send event */
  204. if ( ( xenrc = xenevent_send ( xen, &netfront->event ) ) != 0 ) {
  205. rc = -EXEN ( xenrc );
  206. DBGC ( netfront, "NETFRONT %s could not send event: %s\n",
  207. xendev->key, strerror ( rc ) );
  208. return rc;
  209. }
  210. return 0;
  211. }
  212. /**
  213. * Destroy event channel
  214. *
  215. * @v netfront Netfront device
  216. */
  217. static void netfront_destroy_event ( struct netfront_nic *netfront ) {
  218. struct xen_device *xendev = netfront->xendev;
  219. struct xen_hypervisor *xen = xendev->xen;
  220. struct evtchn_close close;
  221. /* Unpublish event channel */
  222. netfront_rm ( netfront, "event-channel" );
  223. /* Close event channel */
  224. close.port = netfront->event.port;
  225. xenevent_close ( xen, &close );
  226. }
  227. /******************************************************************************
  228. *
  229. * Descriptor rings
  230. *
  231. ******************************************************************************
  232. */
  233. /**
  234. * Create descriptor ring
  235. *
  236. * @v netfront Netfront device
  237. * @v ring Descriptor ring
  238. * @ret rc Return status code
  239. */
  240. static int netfront_create_ring ( struct netfront_nic *netfront,
  241. struct netfront_ring *ring ) {
  242. struct xen_device *xendev = netfront->xendev;
  243. struct xen_hypervisor *xen = xendev->xen;
  244. unsigned int i;
  245. int rc;
  246. /* Initialise buffer ID ring */
  247. for ( i = 0 ; i < ring->count ; i++ ) {
  248. ring->ids[i] = i;
  249. assert ( ring->iobufs[i] == NULL );
  250. }
  251. ring->id_prod = 0;
  252. ring->id_cons = 0;
  253. /* Allocate and initialise shared ring */
  254. ring->sring.raw = malloc_dma ( PAGE_SIZE, PAGE_SIZE );
  255. if ( ! ring->sring.raw ) {
  256. rc = -ENOMEM;
  257. goto err_alloc;
  258. }
  259. /* Grant access to shared ring */
  260. xengrant_permit_access ( xen, ring->ref, xendev->backend_id, 0,
  261. ring->sring.raw );
  262. /* Publish shared ring reference */
  263. if ( ( rc = netfront_write_num ( netfront, ring->ref_key,
  264. ring->ref ) ) != 0 )
  265. goto err_write_num;
  266. DBGC ( netfront, "NETFRONT %s %s=\"%d\" [%08lx,%08lx)\n",
  267. xendev->key, ring->ref_key, ring->ref,
  268. virt_to_phys ( ring->sring.raw ),
  269. ( virt_to_phys ( ring->sring.raw ) + PAGE_SIZE ) );
  270. return 0;
  271. netfront_rm ( netfront, ring->ref_key );
  272. err_write_num:
  273. xengrant_invalidate ( xen, ring->ref );
  274. free_dma ( ring->sring.raw, PAGE_SIZE );
  275. err_alloc:
  276. return rc;
  277. }
  278. /**
  279. * Add buffer to descriptor ring
  280. *
  281. * @v netfront Netfront device
  282. * @v ring Descriptor ring
  283. * @v iobuf I/O buffer
  284. * @v ref Grant reference to fill in
  285. * @ret id Buffer ID
  286. *
  287. * The caller is responsible for ensuring that there is space in the
  288. * ring.
  289. */
  290. static unsigned int netfront_push ( struct netfront_nic *netfront,
  291. struct netfront_ring *ring,
  292. struct io_buffer *iobuf,
  293. grant_ref_t *ref ) {
  294. struct xen_device *xendev = netfront->xendev;
  295. struct xen_hypervisor *xen = xendev->xen;
  296. unsigned int id;
  297. /* Sanity check */
  298. assert ( ! netfront_ring_is_full ( ring ) );
  299. /* Allocate buffer ID */
  300. id = ring->ids[ ( ring->id_prod++ ) & ( ring->count - 1 ) ];
  301. /* Store I/O buffer */
  302. assert ( ring->iobufs[id] == NULL );
  303. ring->iobufs[id] = iobuf;
  304. /* Grant access to I/O buffer page. I/O buffers are naturally
  305. * aligned, so we never need to worry about crossing a page
  306. * boundary.
  307. */
  308. *ref = ring->refs[id];
  309. xengrant_permit_access ( xen, ring->refs[id], xendev->backend_id, 0,
  310. iobuf->data );
  311. return id;
  312. }
  313. /**
  314. * Remove buffer from descriptor ring
  315. *
  316. * @v netfront Netfront device
  317. * @v ring Descriptor ring
  318. * @v id Buffer ID
  319. * @ret iobuf I/O buffer
  320. */
  321. static struct io_buffer * netfront_pull ( struct netfront_nic *netfront,
  322. struct netfront_ring *ring,
  323. unsigned int id ) {
  324. struct xen_device *xendev = netfront->xendev;
  325. struct xen_hypervisor *xen = xendev->xen;
  326. struct io_buffer *iobuf;
  327. /* Sanity check */
  328. assert ( id < ring->count );
  329. /* Revoke access from I/O buffer page */
  330. xengrant_invalidate ( xen, ring->refs[id] );
  331. /* Retrieve I/O buffer */
  332. iobuf = ring->iobufs[id];
  333. assert ( iobuf != NULL );
  334. ring->iobufs[id] = NULL;
  335. /* Free buffer ID */
  336. ring->ids[ ( ring->id_cons++ ) & ( ring->count - 1 ) ] = id;
  337. return iobuf;
  338. }
  339. /**
  340. * Destroy descriptor ring
  341. *
  342. * @v netfront Netfront device
  343. * @v ring Descriptor ring
  344. * @v discard Method used to discard outstanding buffer, or NULL
  345. */
  346. static void netfront_destroy_ring ( struct netfront_nic *netfront,
  347. struct netfront_ring *ring,
  348. void ( * discard ) ( struct io_buffer * ) ){
  349. struct xen_device *xendev = netfront->xendev;
  350. struct xen_hypervisor *xen = xendev->xen;
  351. struct io_buffer *iobuf;
  352. unsigned int id;
  353. /* Flush any outstanding buffers */
  354. while ( ! netfront_ring_is_empty ( ring ) ) {
  355. id = ring->ids[ ring->id_cons & ( ring->count - 1 ) ];
  356. iobuf = netfront_pull ( netfront, ring, id );
  357. if ( discard )
  358. discard ( iobuf );
  359. }
  360. /* Unpublish shared ring reference */
  361. netfront_rm ( netfront, ring->ref_key );
  362. /* Revoke access from shared ring */
  363. xengrant_invalidate ( xen, ring->ref );
  364. /* Free page */
  365. free_dma ( ring->sring.raw, PAGE_SIZE );
  366. ring->sring.raw = NULL;
  367. }
  368. /******************************************************************************
  369. *
  370. * Network device interface
  371. *
  372. ******************************************************************************
  373. */
  374. /**
  375. * Refill receive descriptor ring
  376. *
  377. * @v netfront Netfront device
  378. */
  379. static void netfront_refill_rx ( struct netfront_nic *netfront ) {
  380. struct xen_device *xendev = netfront->xendev;
  381. struct io_buffer *iobuf;
  382. struct netif_rx_request *request;
  383. int notify;
  384. /* Do nothing if ring is already full */
  385. if ( netfront_ring_is_full ( &netfront->rx ) )
  386. return;
  387. /* Refill ring */
  388. do {
  389. /* Allocate I/O buffer */
  390. iobuf = alloc_iob ( PAGE_SIZE );
  391. if ( ! iobuf ) {
  392. /* Wait for next refill */
  393. break;
  394. }
  395. /* Add to descriptor ring */
  396. request = RING_GET_REQUEST ( &netfront->rx_fring,
  397. netfront->rx_fring.req_prod_pvt++);
  398. request->id = netfront_push ( netfront, &netfront->rx, iobuf,
  399. &request->gref );
  400. DBGC2 ( netfront, "NETFRONT %s RX id %d ref %d is %#08lx+%zx\n",
  401. xendev->key, request->id, request->gref,
  402. virt_to_phys ( iobuf->data ), iob_tailroom ( iobuf ) );
  403. } while ( ! netfront_ring_is_full ( &netfront->rx ) );
  404. /* Push new descriptors and notify backend if applicable */
  405. RING_PUSH_REQUESTS_AND_CHECK_NOTIFY ( &netfront->rx_fring, notify );
  406. if ( notify )
  407. netfront_send_event ( netfront );
  408. }
  409. /**
  410. * Open network device
  411. *
  412. * @v netdev Network device
  413. * @ret rc Return status code
  414. */
  415. static int netfront_open ( struct net_device *netdev ) {
  416. struct netfront_nic *netfront = netdev->priv;
  417. struct xen_device *xendev = netfront->xendev;
  418. int rc;
  419. /* Create transmit descriptor ring */
  420. if ( ( rc = netfront_create_ring ( netfront, &netfront->tx ) ) != 0 )
  421. goto err_create_tx;
  422. SHARED_RING_INIT ( netfront->tx_sring );
  423. FRONT_RING_INIT ( &netfront->tx_fring, netfront->tx_sring, PAGE_SIZE );
  424. assert ( RING_SIZE ( &netfront->tx_fring ) >= netfront->tx.count );
  425. /* Create receive descriptor ring */
  426. if ( ( rc = netfront_create_ring ( netfront, &netfront->rx ) ) != 0 )
  427. goto err_create_rx;
  428. SHARED_RING_INIT ( netfront->rx_sring );
  429. FRONT_RING_INIT ( &netfront->rx_fring, netfront->rx_sring, PAGE_SIZE );
  430. assert ( RING_SIZE ( &netfront->rx_fring ) >= netfront->rx.count );
  431. /* Create event channel */
  432. if ( ( rc = netfront_create_event ( netfront ) ) != 0 )
  433. goto err_create_event;
  434. /* "Request" the rx-copy feature. Current versions of
  435. * xen_netback.ko will fail silently if this parameter is not
  436. * present.
  437. */
  438. if ( ( rc = netfront_write_flag ( netfront, "request-rx-copy" ) ) != 0 )
  439. goto err_request_rx_copy;
  440. /* Disable checksum offload, since we will always do the work anyway */
  441. if ( ( rc = netfront_write_flag ( netfront,
  442. "feature-no-csum-offload" ) ) != 0 )
  443. goto err_feature_no_csum_offload;
  444. /* Set state to Connected */
  445. if ( ( rc = xenbus_set_state ( xendev, XenbusStateConnected ) ) != 0 ) {
  446. DBGC ( netfront, "NETFRONT %s could not set state=\"%d\": %s\n",
  447. xendev->key, XenbusStateConnected, strerror ( rc ) );
  448. goto err_set_state;
  449. }
  450. /* Wait for backend to connect */
  451. if ( ( rc = xenbus_backend_wait ( xendev, XenbusStateConnected ) ) !=0){
  452. DBGC ( netfront, "NETFRONT %s could not connect to backend: "
  453. "%s\n", xendev->key, strerror ( rc ) );
  454. goto err_backend_wait;
  455. }
  456. /* Refill receive descriptor ring */
  457. netfront_refill_rx ( netfront );
  458. /* Set link up */
  459. netdev_link_up ( netdev );
  460. return 0;
  461. err_backend_wait:
  462. xenbus_set_state ( xendev, XenbusStateInitialising );
  463. err_set_state:
  464. netfront_rm ( netfront, "feature-no-csum-offload" );
  465. err_feature_no_csum_offload:
  466. netfront_rm ( netfront, "request-rx-copy" );
  467. err_request_rx_copy:
  468. netfront_destroy_event ( netfront );
  469. err_create_event:
  470. netfront_destroy_ring ( netfront, &netfront->rx, NULL );
  471. err_create_rx:
  472. netfront_destroy_ring ( netfront, &netfront->tx, NULL );
  473. err_create_tx:
  474. return rc;
  475. }
  476. /**
  477. * Close network device
  478. *
  479. * @v netdev Network device
  480. */
  481. static void netfront_close ( struct net_device *netdev ) {
  482. struct netfront_nic *netfront = netdev->priv;
  483. struct xen_device *xendev = netfront->xendev;
  484. int rc;
  485. /* Set state to Closed */
  486. xenbus_set_state ( xendev, XenbusStateClosed );
  487. /* Wait for backend to close, thereby ensuring that grant
  488. * references are no longer in use, etc.
  489. */
  490. if ( ( rc = xenbus_backend_wait ( xendev, XenbusStateClosed ) ) != 0 ) {
  491. DBGC ( netfront, "NETFRONT %s could not disconnect from "
  492. "backend: %s\n", xendev->key, strerror ( rc ) );
  493. /* Things will probably go _very_ badly wrong if this
  494. * happens, since it means the backend may still write
  495. * to the outstanding RX buffers that we are about to
  496. * free. The best we can do is report the error via
  497. * the link status, but there's a good chance the
  498. * machine will crash soon.
  499. */
  500. netdev_link_err ( netdev, rc );
  501. } else {
  502. netdev_link_down ( netdev );
  503. }
  504. /* Reset state to Initialising */
  505. xenbus_set_state ( xendev, XenbusStateInitialising );
  506. /* Delete flags */
  507. netfront_rm ( netfront, "feature-no-csum-offload" );
  508. netfront_rm ( netfront, "request-rx-copy" );
  509. /* Destroy event channel */
  510. netfront_destroy_event ( netfront );
  511. /* Destroy receive descriptor ring, freeing any outstanding
  512. * I/O buffers.
  513. */
  514. netfront_destroy_ring ( netfront, &netfront->rx, free_iob );
  515. /* Destroy transmit descriptor ring. Leave any outstanding
  516. * I/O buffers to be freed by netdev_tx_flush().
  517. */
  518. netfront_destroy_ring ( netfront, &netfront->tx, NULL );
  519. }
  520. /**
  521. * Transmit packet
  522. *
  523. * @v netdev Network device
  524. * @v iobuf I/O buffer
  525. * @ret rc Return status code
  526. */
  527. static int netfront_transmit ( struct net_device *netdev,
  528. struct io_buffer *iobuf ) {
  529. struct netfront_nic *netfront = netdev->priv;
  530. struct xen_device *xendev = netfront->xendev;
  531. struct netif_tx_request *request;
  532. int notify;
  533. /* Check that we have space in the ring */
  534. if ( netfront_ring_is_full ( &netfront->tx ) ) {
  535. DBGC ( netfront, "NETFRONT %s out of transmit descriptors\n",
  536. xendev->key );
  537. return -ENOBUFS;
  538. }
  539. /* Add to descriptor ring */
  540. request = RING_GET_REQUEST ( &netfront->tx_fring,
  541. netfront->tx_fring.req_prod_pvt++ );
  542. request->id = netfront_push ( netfront, &netfront->tx, iobuf,
  543. &request->gref );
  544. request->offset = ( virt_to_phys ( iobuf->data ) & ( PAGE_SIZE - 1 ) );
  545. request->flags = NETTXF_data_validated;
  546. request->size = iob_len ( iobuf );
  547. DBGC2 ( netfront, "NETFRONT %s TX id %d ref %d is %#08lx+%zx\n",
  548. xendev->key, request->id, request->gref,
  549. virt_to_phys ( iobuf->data ), iob_len ( iobuf ) );
  550. /* Push new descriptor and notify backend if applicable */
  551. RING_PUSH_REQUESTS_AND_CHECK_NOTIFY ( &netfront->tx_fring, notify );
  552. if ( notify )
  553. netfront_send_event ( netfront );
  554. return 0;
  555. }
  556. /**
  557. * Poll for completed packets
  558. *
  559. * @v netdev Network device
  560. */
  561. static void netfront_poll_tx ( struct net_device *netdev ) {
  562. struct netfront_nic *netfront = netdev->priv;
  563. struct xen_device *xendev = netfront->xendev;
  564. struct netif_tx_response *response;
  565. struct io_buffer *iobuf;
  566. unsigned int status;
  567. int rc;
  568. /* Consume any unconsumed responses */
  569. while ( RING_HAS_UNCONSUMED_RESPONSES ( &netfront->tx_fring ) ) {
  570. /* Get next response */
  571. response = RING_GET_RESPONSE ( &netfront->tx_fring,
  572. netfront->tx_fring.rsp_cons++ );
  573. /* Retrieve from descriptor ring */
  574. iobuf = netfront_pull ( netfront, &netfront->tx, response->id );
  575. status = response->status;
  576. if ( status == NETIF_RSP_OKAY ) {
  577. DBGC2 ( netfront, "NETFRONT %s TX id %d complete\n",
  578. xendev->key, response->id );
  579. netdev_tx_complete ( netdev, iobuf );
  580. } else {
  581. rc = -EIO_NETIF_RSP ( status );
  582. DBGC2 ( netfront, "NETFRONT %s TX id %d error %d: %s\n",
  583. xendev->key, response->id, status,
  584. strerror ( rc ) );
  585. netdev_tx_complete_err ( netdev, iobuf, rc );
  586. }
  587. }
  588. }
  589. /**
  590. * Poll for received packets
  591. *
  592. * @v netdev Network device
  593. */
  594. static void netfront_poll_rx ( struct net_device *netdev ) {
  595. struct netfront_nic *netfront = netdev->priv;
  596. struct xen_device *xendev = netfront->xendev;
  597. struct netif_rx_response *response;
  598. struct io_buffer *iobuf;
  599. int status;
  600. size_t len;
  601. int rc;
  602. /* Consume any unconsumed responses */
  603. while ( RING_HAS_UNCONSUMED_RESPONSES ( &netfront->rx_fring ) ) {
  604. /* Get next response */
  605. response = RING_GET_RESPONSE ( &netfront->rx_fring,
  606. netfront->rx_fring.rsp_cons++ );
  607. /* Retrieve from descriptor ring */
  608. iobuf = netfront_pull ( netfront, &netfront->rx, response->id );
  609. status = response->status;
  610. if ( status >= 0 ) {
  611. len = status;
  612. iob_reserve ( iobuf, response->offset );
  613. iob_put ( iobuf, len );
  614. DBGC2 ( netfront, "NETFRONT %s RX id %d complete "
  615. "%#08lx+%zx\n", xendev->key, response->id,
  616. virt_to_phys ( iobuf->data ), len );
  617. netdev_rx ( netdev, iobuf );
  618. } else {
  619. rc = -EIO_NETIF_RSP ( status );
  620. DBGC2 ( netfront, "NETFRONT %s RX id %d error %d: %s\n",
  621. xendev->key, response->id, status,
  622. strerror ( rc ) );
  623. netdev_rx_err ( netdev, iobuf, rc );
  624. }
  625. }
  626. }
  627. /**
  628. * Poll for completed and received packets
  629. *
  630. * @v netdev Network device
  631. */
  632. static void netfront_poll ( struct net_device *netdev ) {
  633. struct netfront_nic *netfront = netdev->priv;
  634. /* Poll for TX completions */
  635. netfront_poll_tx ( netdev );
  636. /* Poll for RX completions */
  637. netfront_poll_rx ( netdev );
  638. /* Refill RX descriptor ring */
  639. netfront_refill_rx ( netfront );
  640. }
  641. /** Network device operations */
  642. static struct net_device_operations netfront_operations = {
  643. .open = netfront_open,
  644. .close = netfront_close,
  645. .transmit = netfront_transmit,
  646. .poll = netfront_poll,
  647. };
  648. /******************************************************************************
  649. *
  650. * Xen device bus interface
  651. *
  652. ******************************************************************************
  653. */
  654. /**
  655. * Probe Xen device
  656. *
  657. * @v xendev Xen device
  658. * @ret rc Return status code
  659. */
  660. static int netfront_probe ( struct xen_device *xendev ) {
  661. struct xen_hypervisor *xen = xendev->xen;
  662. struct net_device *netdev;
  663. struct netfront_nic *netfront;
  664. int rc;
  665. /* Allocate and initialise structure */
  666. netdev = alloc_etherdev ( sizeof ( *netfront ) );
  667. if ( ! netdev ) {
  668. rc = -ENOMEM;
  669. goto err_alloc;
  670. }
  671. netdev_init ( netdev, &netfront_operations );
  672. netdev->dev = &xendev->dev;
  673. netfront = netdev->priv;
  674. netfront->xendev = xendev;
  675. DBGC ( netfront, "NETFRONT %s backend=\"%s\" in domain %ld\n",
  676. xendev->key, xendev->backend, xendev->backend_id );
  677. /* Allocate grant references and initialise descriptor rings */
  678. if ( ( rc = xengrant_alloc ( xen, netfront->refs,
  679. NETFRONT_REF_COUNT ) ) != 0 ) {
  680. DBGC ( netfront, "NETFRONT %s could not allocate grant "
  681. "references: %s\n", xendev->key, strerror ( rc ) );
  682. goto err_grant_alloc;
  683. }
  684. netfront_init_ring ( &netfront->tx, "tx-ring-ref",
  685. netfront->refs[NETFRONT_REF_TX_RING],
  686. NETFRONT_NUM_TX_DESC, netfront->tx_iobufs,
  687. &netfront->refs[NETFRONT_REF_TX_BASE],
  688. netfront->tx_ids );
  689. netfront_init_ring ( &netfront->rx, "rx-ring-ref",
  690. netfront->refs[NETFRONT_REF_RX_RING],
  691. NETFRONT_NUM_RX_DESC, netfront->rx_iobufs,
  692. &netfront->refs[NETFRONT_REF_RX_BASE],
  693. netfront->rx_ids );
  694. /* Fetch MAC address */
  695. if ( ( rc = netfront_read_mac ( netfront, netdev->hw_addr ) ) != 0 )
  696. goto err_read_mac;
  697. /* Register network device */
  698. if ( ( rc = register_netdev ( netdev ) ) != 0 )
  699. goto err_register_netdev;
  700. /* Set initial link state */
  701. netdev_link_down ( netdev );
  702. xen_set_drvdata ( xendev, netdev );
  703. return 0;
  704. unregister_netdev ( netdev );
  705. err_register_netdev:
  706. err_read_mac:
  707. xengrant_free ( xen, netfront->refs, NETFRONT_REF_COUNT );
  708. err_grant_alloc:
  709. netdev_nullify ( netdev );
  710. netdev_put ( netdev );
  711. err_alloc:
  712. return rc;
  713. }
  714. /**
  715. * Remove Xen device
  716. *
  717. * @v xendev Xen device
  718. */
  719. static void netfront_remove ( struct xen_device *xendev ) {
  720. struct net_device *netdev = xen_get_drvdata ( xendev );
  721. struct netfront_nic *netfront = netdev->priv;
  722. struct xen_hypervisor *xen = xendev->xen;
  723. /* Unregister network device */
  724. unregister_netdev ( netdev );
  725. /* Free resources */
  726. xengrant_free ( xen, netfront->refs, NETFRONT_REF_COUNT );
  727. /* Free network device */
  728. netdev_nullify ( netdev );
  729. netdev_put ( netdev );
  730. }
  731. /** Xen netfront driver */
  732. struct xen_driver netfront_driver __xen_driver = {
  733. .name = "netfront",
  734. .type = "vif",
  735. .probe = netfront_probe,
  736. .remove = netfront_remove,
  737. };