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 25KB

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