Skip to content

Commit

Permalink
[rndis] Send RNDIS_HALT_MSG
Browse files Browse the repository at this point in the history
The RNDIS specification requires that we send RNDIS_HALT_MSG.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Dec 19, 2014
1 parent 1d0ade4 commit 4de0e27
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/include/ipxe/rndis.h
Expand Up @@ -88,7 +88,7 @@ struct rndis_initialise_completion {
} __attribute__ (( packed ));

/** RNDIS halt message */
#define RNIS_HALT_MSG 0x00000003UL
#define RNDIS_HALT_MSG 0x00000003UL

/** RNDIS halt message */
struct rndis_halt_message {
Expand Down
58 changes: 58 additions & 0 deletions src/net/rndis.c
Expand Up @@ -367,6 +367,56 @@ static int rndis_initialise ( struct rndis_device *rndis ) {
return 0;
}

/**
* Transmit halt message
*
* @v rndis RNDIS device
* @ret rc Return status code
*/
static int rndis_tx_halt ( struct rndis_device *rndis ) {
struct io_buffer *iobuf;
struct rndis_halt_message *msg;
int rc;

/* Allocate I/O buffer */
iobuf = rndis_alloc_iob ( sizeof ( *msg ) );
if ( ! iobuf ) {
rc = -ENOMEM;
goto err_alloc;
}

/* Construct message */
msg = iob_put ( iobuf, sizeof ( *msg ) );
memset ( msg, 0, sizeof ( *msg ) );

/* Transmit message */
if ( ( rc = rndis_tx_message ( rndis, iobuf, RNDIS_HALT_MSG ) ) != 0 )
goto err_tx;

return 0;

err_tx:
free_iob ( iobuf );
err_alloc:
return rc;
}

/**
* Halt RNDIS
*
* @v rndis RNDIS device
* @ret rc Return status code
*/
static int rndis_halt ( struct rndis_device *rndis ) {
int rc;

/* Transmit halt message */
if ( ( rc = rndis_tx_halt ( rndis ) ) != 0 )
return rc;

return 0;
}

/**
* Transmit OID message
*
Expand Down Expand Up @@ -822,6 +872,7 @@ static int rndis_open ( struct net_device *netdev ) {

err_query_link:
err_set_filter:
rndis_halt ( rndis );
err_initialise:
rndis->op->close ( rndis );
err_open:
Expand All @@ -836,6 +887,9 @@ static int rndis_open ( struct net_device *netdev ) {
static void rndis_close ( struct net_device *netdev ) {
struct rndis_device *rndis = netdev->priv;

/* Halt RNDIS device */
rndis_halt ( rndis );

/* Close RNDIS device */
rndis->op->close ( rndis );
}
Expand Down Expand Up @@ -947,6 +1001,9 @@ int register_rndis ( struct rndis_device *rndis ) {
NULL, 0 ) ) != 0 )
goto err_query_link;

/* Halt RNDIS device */
rndis_halt ( rndis );

/* Close RNDIS device */
rndis->op->close ( rndis );

Expand All @@ -955,6 +1012,7 @@ int register_rndis ( struct rndis_device *rndis ) {
err_query_link:
err_query_current:
err_query_permanent:
rndis_halt ( rndis );
err_initialise:
rndis->op->close ( rndis );
err_open:
Expand Down

0 comments on commit 4de0e27

Please sign in to comment.