On Sat, Nov 29, 2014 at 09:42:51PM +0100, Mark Kettenis wrote:
> Recent Oracle SPARC machines have a USB gadget to talk to the Service
> Processor (ILOM).  This gadget supports both RNDIS and CDC Ethernet.
> The RNDIS bits uncovered a bug in urndis(4).  When urndis_ctrl_set()
> sets up the REMOTE_NDIS_SET_MSG command it sets up msg->rm_infobuflen,
> it subsequently overwrites its contents.  Apparently many RNDIS
> devices don't care, but this hardware sends a response back that
> indicates the command wasn't accepted.  Diff below fixes this problem.
> It matches what Linux does.
> 
> Unfortunately, this isn't enough to make the gadget work in RNDIS mode.
> 
> I'd appreciate it if people using urndis(4) could test this diff.
> 

Hi,

just found your mail, i think urndis(4) is not entirely written with
these in mind:
        defined(__STRICT_ALIGNMENT) || _BYTE_ORDER != _LITTLE_ENDIAN

did you ever try with a diff like below?

-Artturi


diff --git sys/dev/rndis.h sys/dev/rndis.h
index 140793990e9..7036d198d4e 100644
--- sys/dev/rndis.h
+++ sys/dev/rndis.h
@@ -98,7 +98,7 @@
 struct rndis_msghdr {
        uint32_t        rm_type;
        uint32_t        rm_len;
-};
+} __packed;
 
 /*
  * RNDIS data message
@@ -118,7 +118,7 @@ struct rndis_packet_msg {
        uint32_t        rm_pktinfolen;
        uint32_t        rm_vchandle;
        uint32_t        rm_reserved;
-};
+} __packed;
 
 /* Per-packet-info for RNDIS data message */
 struct rndis_pktinfo {
@@ -126,7 +126,7 @@ struct rndis_pktinfo {
        uint32_t        rm_type;                /* NDIS_PKTINFO_TYPE_ */
        uint32_t        rm_pktinfooffset;
        uint8_t         rm_data[0];
-};
+} __packed;
 
 #define NDIS_PKTINFO_TYPE_CSUM         0
 #define NDIS_PKTINFO_TYPE_IPSEC                1
@@ -149,7 +149,7 @@ struct rndis_comp_hdr {
        uint32_t        rm_len;
        uint32_t        rm_rid;
        uint32_t        rm_status;
-};
+} __packed;
 
 /* Initialize the device. */
 #define REMOTE_NDIS_INITIALIZE_MSG     0x00000002
@@ -162,7 +162,7 @@ struct rndis_init_req {
        uint32_t        rm_ver_major;
        uint32_t        rm_ver_minor;
        uint32_t        rm_max_xfersz;
-};
+} __packed;
 
 struct rndis_init_comp {
        uint32_t        rm_type;
@@ -178,7 +178,7 @@ struct rndis_init_comp {
        uint32_t        rm_align;
        uint32_t        rm_aflistoffset;
        uint32_t        rm_aflistsz;
-};
+} __packed;
 
 /* Halt the device.  No response sent. */
 #define REMOTE_NDIS_HALT_MSG           0x00000003
@@ -187,7 +187,7 @@ struct rndis_halt_req {
        uint32_t        rm_type;
        uint32_t        rm_len;
        uint32_t        rm_rid;
-};
+} __packed;
 
 /* Send a query object. */
 #define REMOTE_NDIS_QUERY_MSG          0x00000004
@@ -201,7 +201,7 @@ struct rndis_query_req {
        uint32_t        rm_infobuflen;
        uint32_t        rm_infobufoffset;
        uint32_t        rm_devicevchdl;
-};
+} __packed;
 
 struct rndis_query_comp {
        uint32_t        rm_type;
@@ -210,7 +210,7 @@ struct rndis_query_comp {
        uint32_t        rm_status;
        uint32_t        rm_infobuflen;
        uint32_t        rm_infobufoffset;
-};
+} __packed;
 
 /* Send a set object request. */
 #define REMOTE_NDIS_SET_MSG            0x00000005
@@ -224,14 +224,14 @@ struct rndis_set_req {
        uint32_t        rm_infobuflen;
        uint32_t        rm_infobufoffset;
        uint32_t        rm_devicevchdl;
-};
+} __packed;
 
 struct rndis_set_comp {
        uint32_t        rm_type;
        uint32_t        rm_len;
        uint32_t        rm_rid;
        uint32_t        rm_status;
-};
+} __packed;
 
 /* Parameter used by OID_GEN_RNDIS_CONFIG_PARAMETER. */
 #define REMOTE_NDIS_SET_PARAM_NUMERIC  0x00000000
@@ -243,7 +243,7 @@ struct rndis_set_parameter {
        uint32_t        rm_type;
        uint32_t        rm_valueoffset;
        uint32_t        rm_valuelen;
-};
+} __packed;
 
 /* Perform a soft reset on the device. */
 #define REMOTE_NDIS_RESET_MSG          0x00000006
@@ -253,14 +253,14 @@ struct rndis_reset_req {
        uint32_t        rm_type;
        uint32_t        rm_len;
        uint32_t        rm_rid;
-};
+} __packed;
 
 struct rndis_reset_comp {
        uint32_t        rm_type;
        uint32_t        rm_len;
        uint32_t        rm_status;
        uint32_t        rm_adrreset;
-};
+} __packed;
 
 /* 802.3 link-state or undefined message error.  Sent by device. */
 #define REMOTE_NDIS_INDICATE_STATUS_MSG        0x00000007
@@ -272,7 +272,7 @@ struct rndis_status_msg {
        uint32_t        rm_stbuflen;
        uint32_t        rm_stbufoffset;
        /* rndis_diag_info */
-};
+} __packed;
 
 /*
  * Immediately after rndis_status_msg.rm_stbufoffset, if a control
@@ -282,7 +282,7 @@ struct rndis_status_msg {
 struct rndis_diag_info {
        uint32_t        rm_diagstatus;
        uint32_t        rm_erroffset;
-};
+} __packed;
 
 /* Keepalive messsage.  May be sent by device. */
 #define REMOTE_NDIS_KEEPALIVE_MSG      0x00000008
@@ -292,14 +292,14 @@ struct rndis_keepalive_req {
        uint32_t        rm_type;
        uint32_t        rm_len;
        uint32_t        rm_rid;
-};
+} __packed;
 
 struct rndis_keepalive_comp {
        uint32_t        rm_type;
        uint32_t        rm_len;
        uint32_t        rm_rid;
        uint32_t        rm_status;
-};
+} __packed;
 
 /* packet filter bits used by OID_GEN_CURRENT_PACKET_FILTER */
 #define NDIS_PACKET_TYPE_DIRECTED              0x00000001

Reply via email to