On Mon, Dec 09, 2024 at 04:39:38PM -0800, Christopher Ferris wrote:
> By the way, there are some places where __struct_group is used in other
> uapi headers, the only difference is that the TAG field of the macro is
> left empty. That compiles fine when used in C++ code.

Does this fix the C++ inclusion for you?


diff --git a/include/uapi/linux/pkt_cls.h b/include/uapi/linux/pkt_cls.h
index 2c32080416b5..aeff841c528d 100644
--- a/include/uapi/linux/pkt_cls.h
+++ b/include/uapi/linux/pkt_cls.h
@@ -245,20 +245,27 @@ struct tc_u32_key {
        int             offmask;
 };
 
+#define tc_u32_sel_hdr_members                 \
+       unsigned char           flags;          \
+       unsigned char           offshift;       \
+       unsigned char           nkeys;          \
+       __be16                  offmask;        \
+       __u16                   off;            \
+       short                   offoff;         \
+       short                   hoff;
+
+struct tc_u32_sel_hdr {
+       tc_u32_sel_hdr_members
+};
+
 struct tc_u32_sel {
-       /* New members MUST be added within the __struct_group() macro below. */
-       __struct_group(tc_u32_sel_hdr, hdr, /* no attrs */,
-               unsigned char           flags;
-               unsigned char           offshift;
-               unsigned char           nkeys;
-
-               __be16                  offmask;
-               __u16                   off;
-               short                   offoff;
-
-               short                   hoff;
-               __be32                  hmask;
-       );
+       /* Open-coded struct_group() to avoid C++ errors. */
+       union {
+               struct tc_u32_sel_hdr hdr;
+               struct {
+                       tc_u32_sel_hdr_members
+               };
+       };
        struct tc_u32_key       keys[];
 };
 


-- 
Kees Cook

Reply via email to