On Fri, 2 Feb 2007 17:32:24 -0800, Inaky Perez-Gonzalez <[EMAIL PROTECTED]> wrote:
> usb: descriptor structures have to be packed > Many of the Wireless USB decriptors added to usb_ch9.h don't have the > __attribute__((packed)) tag, and thus, they don't reflect the wire > size. This patch fixes that. I am not cool with this. > +++ b/include/linux/usb_ch9.h Fri Feb 02 17:17:09 2007 -0800 > @@ -366,7 +366,7 @@ struct usb_debug_descriptor { > /* bulk endpoints with 8 byte maxpacket */ > __u8 bDebugInEndpoint; > __u8 bDebugOutEndpoint; > -}; > +} __attribute__((packed)); This is a 4-byte structure. The attribute is unnecessary. > @@ -395,7 +395,7 @@ struct usb_security_descriptor { > > __le16 wTotalLength; > __u8 bNumEncryptionTypes; > -}; > +} __attribute__((packed)); This size is odd, but see below. > @@ -409,7 +409,7 @@ struct usb_key_descriptor { > __u8 tTKID[3]; > __u8 bReserved; > __u8 bKeyData[0]; > -}; > +} __attribute__((packed)); This structure has no members larger than a byte, so the attribute is unnecessary. > @@ -425,7 +425,7 @@ struct usb_encryption_descriptor { > #define USB_ENC_TYPE_RSA_1 3 /* rsa3072/sha1 auth */ > __u8 bEncryptionValue; /* use in SET_ENCRYPTION */ > __u8 bAuthKeyIndex; > -}; > +} __attribute__((packed)); Ditto. > @@ -437,7 +437,7 @@ struct usb_bos_descriptor { > > __le16 wTotalLength; > __u8 bNumDeviceCaps; > -}; > +} __attribute__((packed)); This is the same as usb_security_descriptor. > @@ -446,7 +446,7 @@ struct usb_dev_cap_header { > __u8 bLength; > __u8 bDescriptorType; > __u8 bDevCapabilityType; > -}; > +} __attribute__((packed)); This one might need the attribute because it's smaller than 4 bytes. > @@ -474,7 +474,7 @@ struct usb_wireless_cap_descriptor { /* > __u8 bmFFITXPowerInfo; /* FFI power levels */ > __le16 bmBandGroup; > __u8 bReserved; > -}; > +} __attribute__((packed)); This is the same as usb_security_descriptor. > @@ -495,7 +495,7 @@ struct usb_wireless_ep_comp_descriptor { > #define USB_ENDPOINT_SWITCH_NO 0 > #define USB_ENDPOINT_SWITCH_SWITCH 1 > #define USB_ENDPOINT_SWITCH_SCALE 2 > -}; > +} __attribute__((packed)); This descriptor is naturally aligned, attribute is unnecessary. > @@ -511,7 +511,7 @@ struct usb_handshake { > __u8 CDID[16]; > __u8 nonce[16]; > __u8 MIC[8]; > -}; > +} __attribute__((packed)); Byte sized members only, attribute is unnecessary. > @@ -523,7 +523,7 @@ struct usb_connection_context { > __u8 CHID[16]; /* persistent host id */ > __u8 CDID[16]; /* device id (unique w/in host context) */ > __u8 CK[16]; /* connection key */ > -}; > +} __attribute__((packed)); Byte sized members only, attribute is unnecessary. So, this leaves usb_security_descriptor, usb_bos_descriptor, usb_wireless_cap_descriptor, and usb_dev_cap_header. IMHO, our original setup was the correct one. The code should have used sizes such as USB_DT_CONFIG_SIZE instead of sizeof(). It's elementary. The use of __attribute__((packed)) adds nontrivial costs... on some architectures. I think the funniest part of this is that the architecture which suffers most from the abuse of __attribute__((packed)) is ia64 (with sparc being the second). And yet, Inaky works for Intel. Do we have to take this as a sign that Intel is abandoning Itanium? Poor, poor SGI. ^_^ I am not going to raise a stink myself, but I would like to point out the obvious. The packed attributes were added by people who do not care about non-x86, because the cost of __attribute__((packed)) is miniscule there (although, not zero either). The matter went so far that even usb_config_descriptor has the attribute now, even though it always had a perfectly useable size define. -- Pete ------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier. Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel