summaryrefslogtreecommitdiffstats
path: root/src/net/rndis.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/rndis.c')
-rw-r--r--src/net/rndis.c63
1 files changed, 13 insertions, 50 deletions
diff --git a/src/net/rndis.c b/src/net/rndis.c
index e21dd195..dde4fcdd 100644
--- a/src/net/rndis.c
+++ b/src/net/rndis.c
@@ -759,67 +759,30 @@ static void rndis_rx_message ( struct rndis_device *rndis,
* Receive packet from underlying transport layer
*
* @v rndis RNDIS device
- * @v iobuf I/O buffer, or NULL if allocation failed
+ * @v iobuf I/O buffer
*/
void rndis_rx ( struct rndis_device *rndis, struct io_buffer *iobuf ) {
struct net_device *netdev = rndis->netdev;
struct rndis_header *header;
- struct io_buffer *msg;
- size_t len;
unsigned int type;
int rc;
- /* Record dropped packet if I/O buffer is missing */
- if ( ! iobuf ) {
- DBGC2 ( rndis, "RNDIS %s received dropped packet\n",
- rndis->name );
- rc = -ENOBUFS;
+ /* Sanity check */
+ if ( iob_len ( iobuf ) < sizeof ( *header ) ) {
+ DBGC ( rndis, "RNDIS %s received underlength packet:\n",
+ rndis->name );
+ DBGC_HDA ( rndis, 0, iobuf->data, iob_len ( iobuf ) );
+ rc = -EINVAL;
goto drop;
}
+ header = iobuf->data;
- /* Split packet into messages */
- while ( iobuf ) {
-
- /* Sanity check */
- if ( iob_len ( iobuf ) < sizeof ( *header ) ) {
- DBGC ( rndis, "RNDIS %s received underlength packet:\n",
- rndis->name );
- DBGC_HDA ( rndis, 0, iobuf->data, iob_len ( iobuf ) );
- rc = -EINVAL;
- goto drop;
- }
- header = iobuf->data;
-
- /* Parse and check header */
- type = le32_to_cpu ( header->type );
- len = le32_to_cpu ( header->len );
- if ( ( len < sizeof ( *header ) ) ||
- ( len > iob_len ( iobuf ) ) ) {
- DBGC ( rndis, "RNDIS %s received malformed packet:\n",
- rndis->name );
- DBGC_HDA ( rndis, 0, iobuf->data, iob_len ( iobuf ) );
- rc = -EINVAL;
- goto drop;
- }
-
- /* Split buffer if required */
- if ( len < iob_len ( iobuf ) ) {
- msg = iob_split ( iobuf, len );
- if ( ! msg ) {
- rc = -ENOMEM;
- goto drop;
- }
- } else {
- msg = iobuf;
- iobuf = NULL;
- }
-
- /* Strip header */
- iob_pull ( msg, sizeof ( *header ) );
+ /* Parse and strip header */
+ type = le32_to_cpu ( header->type );
+ iob_pull ( iobuf, sizeof ( *header ) );
- /* Handle message */
- rndis_rx_message ( rndis, iob_disown ( msg ), type );
- }
+ /* Handle message */
+ rndis_rx_message ( rndis, iob_disown ( iobuf ), type );
return;