* [PATCH 1/1] uapi: cdc.h: cleanly provide for more interfaces and countries @ 2025-10-28 12:32 Oliver Neukum 2025-10-28 13:32 ` Greg KH 0 siblings, 1 reply; 5+ messages in thread From: Oliver Neukum @ 2025-10-28 12:32 UTC (permalink / raw) To: gregkh, linux-usb; +Cc: Oliver Neukum The spec requires at least one interface respectively country. It allows multiple ones. This needs to be clearly said in the UAPI. Signed-off-by: Oliver Neukum <oneukum@suse.com> --- include/uapi/linux/usb/cdc.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/uapi/linux/usb/cdc.h b/include/uapi/linux/usb/cdc.h index 1924cf665448..5fcbce0be133 100644 --- a/include/uapi/linux/usb/cdc.h +++ b/include/uapi/linux/usb/cdc.h @@ -105,7 +105,7 @@ struct usb_cdc_union_desc { __u8 bMasterInterface0; __u8 bSlaveInterface0; - /* ... and there could be other slave interfaces */ + __u8 bSlaveInterfaces[]; } __attribute__ ((packed)); /* "Country Selection Functional Descriptor" from CDC spec 5.2.3.9 */ @@ -116,7 +116,7 @@ struct usb_cdc_country_functional_desc { __u8 iCountryCodeRelDate; __le16 wCountyCode0; - /* ... and there can be a lot of country codes */ + __le16 wCountyCodes[]; } __attribute__ ((packed)); /* "Network Channel Terminal Functional Descriptor" from CDC spec 5.2.3.11 */ -- 2.51.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 1/1] uapi: cdc.h: cleanly provide for more interfaces and countries 2025-10-28 12:32 [PATCH 1/1] uapi: cdc.h: cleanly provide for more interfaces and countries Oliver Neukum @ 2025-10-28 13:32 ` Greg KH 2025-10-28 14:34 ` Oliver Neukum 0 siblings, 1 reply; 5+ messages in thread From: Greg KH @ 2025-10-28 13:32 UTC (permalink / raw) To: Oliver Neukum; +Cc: linux-usb On Tue, Oct 28, 2025 at 01:32:22PM +0100, Oliver Neukum wrote: > The spec requires at least one interface respectively country. > It allows multiple ones. This needs to be clearly said in the UAPI. > > Signed-off-by: Oliver Neukum <oneukum@suse.com> > --- > include/uapi/linux/usb/cdc.h | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/include/uapi/linux/usb/cdc.h b/include/uapi/linux/usb/cdc.h > index 1924cf665448..5fcbce0be133 100644 > --- a/include/uapi/linux/usb/cdc.h > +++ b/include/uapi/linux/usb/cdc.h > @@ -105,7 +105,7 @@ struct usb_cdc_union_desc { > > __u8 bMasterInterface0; > __u8 bSlaveInterface0; > - /* ... and there could be other slave interfaces */ > + __u8 bSlaveInterfaces[]; Can this be combined with bSlaveInterface0? Feels odd to have 0 and then "more". Also, what determines how many, the overall length? > } __attribute__ ((packed)); > > /* "Country Selection Functional Descriptor" from CDC spec 5.2.3.9 */ > @@ -116,7 +116,7 @@ struct usb_cdc_country_functional_desc { > > __u8 iCountryCodeRelDate; > __le16 wCountyCode0; > - /* ... and there can be a lot of country codes */ > + __le16 wCountyCodes[]; same here. thanks, greg k-h ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 1/1] uapi: cdc.h: cleanly provide for more interfaces and countries 2025-10-28 13:32 ` Greg KH @ 2025-10-28 14:34 ` Oliver Neukum 2025-10-28 14:40 ` Greg KH 0 siblings, 1 reply; 5+ messages in thread From: Oliver Neukum @ 2025-10-28 14:34 UTC (permalink / raw) To: Greg KH, Oliver Neukum; +Cc: linux-usb Hi, On 28.10.25 14:32, Greg KH wrote: > On Tue, Oct 28, 2025 at 01:32:22PM +0100, Oliver Neukum wrote: >> The spec requires at least one interface respectively country. >> It allows multiple ones. This needs to be clearly said in the UAPI. >> >> Signed-off-by: Oliver Neukum <oneukum@suse.com> >> --- >> include/uapi/linux/usb/cdc.h | 4 ++-- >> 1 file changed, 2 insertions(+), 2 deletions(-) >> >> diff --git a/include/uapi/linux/usb/cdc.h b/include/uapi/linux/usb/cdc.h >> index 1924cf665448..5fcbce0be133 100644 >> --- a/include/uapi/linux/usb/cdc.h >> +++ b/include/uapi/linux/usb/cdc.h >> @@ -105,7 +105,7 @@ struct usb_cdc_union_desc { >> >> __u8 bMasterInterface0; >> __u8 bSlaveInterface0; >> - /* ... and there could be other slave interfaces */ >> + __u8 bSlaveInterfaces[]; > > Can this be combined with bSlaveInterface0? Feels odd to have 0 and > then "more". I am afraid the C language does not allow you to specify that an array must have a minimum length other than zero. In this case bSlaveInterface0 must be present. I don't think using only an array would be the right choice. > Also, what determines how many, the overall length? bLength - 4 is the number of slave interfaces, which must at least be 1. We cannot use counted_by in UAPI, can we? Regards Oliver ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 1/1] uapi: cdc.h: cleanly provide for more interfaces and countries 2025-10-28 14:34 ` Oliver Neukum @ 2025-10-28 14:40 ` Greg KH 2025-10-28 16:43 ` Gustavo A. R. Silva 0 siblings, 1 reply; 5+ messages in thread From: Greg KH @ 2025-10-28 14:40 UTC (permalink / raw) To: Gustavo A. R. Silva, Oliver Neukum; +Cc: linux-usb On Tue, Oct 28, 2025 at 03:34:40PM +0100, Oliver Neukum wrote: > Hi, > > On 28.10.25 14:32, Greg KH wrote: > > On Tue, Oct 28, 2025 at 01:32:22PM +0100, Oliver Neukum wrote: > > > The spec requires at least one interface respectively country. > > > It allows multiple ones. This needs to be clearly said in the UAPI. > > > > > > Signed-off-by: Oliver Neukum <oneukum@suse.com> > > > --- > > > include/uapi/linux/usb/cdc.h | 4 ++-- > > > 1 file changed, 2 insertions(+), 2 deletions(-) > > > > > > diff --git a/include/uapi/linux/usb/cdc.h b/include/uapi/linux/usb/cdc.h > > > index 1924cf665448..5fcbce0be133 100644 > > > --- a/include/uapi/linux/usb/cdc.h > > > +++ b/include/uapi/linux/usb/cdc.h > > > @@ -105,7 +105,7 @@ struct usb_cdc_union_desc { > > > __u8 bMasterInterface0; > > > __u8 bSlaveInterface0; > > > - /* ... and there could be other slave interfaces */ > > > + __u8 bSlaveInterfaces[]; > > > > Can this be combined with bSlaveInterface0? Feels odd to have 0 and > > then "more". > > I am afraid the C language does not allow you to specify > that an array must have a minimum length other than zero. > In this case bSlaveInterface0 must be present. > I don't think using only an array would be the right choice. bSlaveInterface[1] ? I'll add Gustavo here, he's done lots of work in this area. > > Also, what determines how many, the overall length? > > bLength - 4 is the number of slave interfaces, which > must at least be 1. > We cannot use counted_by in UAPI, can we? I don't know, Gustavo? thanks, greg k-h ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 1/1] uapi: cdc.h: cleanly provide for more interfaces and countries 2025-10-28 14:40 ` Greg KH @ 2025-10-28 16:43 ` Gustavo A. R. Silva 0 siblings, 0 replies; 5+ messages in thread From: Gustavo A. R. Silva @ 2025-10-28 16:43 UTC (permalink / raw) To: Greg KH, Gustavo A. R. Silva, Oliver Neukum; +Cc: linux-usb On 10/28/25 14:40, Greg KH wrote: > On Tue, Oct 28, 2025 at 03:34:40PM +0100, Oliver Neukum wrote: >> Hi, >> >> On 28.10.25 14:32, Greg KH wrote: >>> On Tue, Oct 28, 2025 at 01:32:22PM +0100, Oliver Neukum wrote: >>>> The spec requires at least one interface respectively country. >>>> It allows multiple ones. This needs to be clearly said in the UAPI. >>>> >>>> Signed-off-by: Oliver Neukum <oneukum@suse.com> >>>> --- >>>> include/uapi/linux/usb/cdc.h | 4 ++-- >>>> 1 file changed, 2 insertions(+), 2 deletions(-) >>>> >>>> diff --git a/include/uapi/linux/usb/cdc.h b/include/uapi/linux/usb/cdc.h >>>> index 1924cf665448..5fcbce0be133 100644 >>>> --- a/include/uapi/linux/usb/cdc.h >>>> +++ b/include/uapi/linux/usb/cdc.h >>>> @@ -105,7 +105,7 @@ struct usb_cdc_union_desc { >>>> __u8 bMasterInterface0; >>>> __u8 bSlaveInterface0; >>>> - /* ... and there could be other slave interfaces */ >>>> + __u8 bSlaveInterfaces[]; >>> >>> Can this be combined with bSlaveInterface0? Feels odd to have 0 and >>> then "more". >> >> I am afraid the C language does not allow you to specify >> that an array must have a minimum length other than zero. >> In this case bSlaveInterface0 must be present. >> I don't think using only an array would be the right choice. You can do something like this: @@ -104,8 +104,10 @@ struct usb_cdc_union_desc { __u8 bDescriptorSubType; __u8 bMasterInterface0; - __u8 bSlaveInterface0; - /* ... and there could be other slave interfaces */ + union { + __u8 bSlaveInterface0; + DECLARE_FLEX_ARRAY(__u8, bSlaveInterfaces); + }; } __attribute__ ((packed)); Just adjust any related code to account for the fact that the "other slave interfaces" will start at bSlaveInterfaces[1]. Something like the following is preferable, but this syntax for flexible-array members in unions is only supported starting with GCC 15: --- a/include/uapi/linux/usb/cdc.h +++ b/include/uapi/linux/usb/cdc.h @@ -104,8 +104,10 @@ struct usb_cdc_union_desc { __u8 bDescriptorSubType; __u8 bMasterInterface0; - __u8 bSlaveInterface0; - /* ... and there could be other slave interfaces */ + union { + __u8 bSlaveInterface0; + __u8 bSlaveInterfaces[]; + }; } __attribute__ ((packed)); So, we'll have to wait until that becomes the minimum supported version before we can use the above code. > > bSlaveInterface[1] ? No, please. One-element arrays when used as flexible arrays are deprecated. It took us years to transform those into flexible-array members. > > I'll add Gustavo here, he's done lots of work in this area. > >>> Also, what determines how many, the overall length? >> >> bLength - 4 is the number of slave interfaces, which >> must at least be 1. >> We cannot use counted_by in UAPI, can we? Yes. We _can_ (and do) use __counted_by in UAPI. The problem is that currently GCC doesn't support expressions in __counted_by. So, something like the following is not possible: __counted_by(bLength - 4) -Gustavo > > I don't know, Gustavo? > > thanks, > > greg k-h ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-10-29 7:56 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-10-28 12:32 [PATCH 1/1] uapi: cdc.h: cleanly provide for more interfaces and countries Oliver Neukum 2025-10-28 13:32 ` Greg KH 2025-10-28 14:34 ` Oliver Neukum 2025-10-28 14:40 ` Greg KH 2025-10-28 16:43 ` Gustavo A. R. Silva
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox