]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[rndis] Send RNDIS_HALT_MSG
authorMichael Brown <mcb30@ipxe.org>
Fri, 19 Dec 2014 18:09:04 +0000 (18:09 +0000)
committerMichael Brown <mcb30@ipxe.org>
Fri, 19 Dec 2014 18:09:04 +0000 (18:09 +0000)
The RNDIS specification requires that we send RNDIS_HALT_MSG.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/include/ipxe/rndis.h
src/net/rndis.c

index 4e4ab7f8f36aa6bbd5b8d31331b31c0118c6bfd8..bd6793e46d90cf1b22b4ad4602d4fb4cb7264fd9 100644 (file)
@@ -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 {
index 0de3d3a669df9a16155529be35cbc73785276cbf..62a26ad585219eac279cc67c34d8432e880e9630 100644 (file)
@@ -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
  *
@@ -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:
@@ -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 );
 }
@@ -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 );
 
@@ -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: