Issue 37085: Expose additional socket constants for CAN_BCM flags (original) (raw)

When reading through the values exposed via the socket library, I noticed that currently, only the SocketCAN BCM opcode enums are exposed via the socket constants. These correspond to the following from the Linux headers:

    enum {
        TX_SETUP = 1,	/* create (cyclic) transmission task */
        TX_DELETE,	/* remove (cyclic) transmission task */
        TX_READ,	/* read properties of (cyclic) transmission task */
        TX_SEND,	/* send one CAN frame */
        RX_SETUP,	/* create RX content filter subscription */
        RX_DELETE,	/* remove RX content filter subscription */
        RX_READ,	/* read properties of RX content filter subscription */
        TX_STATUS,	/* reply to TX_READ request */
        TX_EXPIRED,	/* notification on performed transmissions (count=0) */
        RX_STATUS,	/* reply to RX_READ request */
        RX_TIMEOUT,	/* cyclic message is absent */
        RX_CHANGED	/* updated CAN frame (detected content change) */
    };

It would be nice to expose the BCM flags #defines as well.

    #define SETTIMER            0x0001
    #define STARTTIMER          0x0002
    #define TX_COUNTEVT         0x0004
    #define TX_ANNOUNCE         0x0008
    #define TX_CP_CAN_ID        0x0010
    #define RX_FILTER_ID        0x0020
    #define RX_CHECK_DLC        0x0040
    #define RX_NO_AUTOTIMER     0x0080
    #define RX_ANNOUNCE_RESUME  0x0100
    #define TX_RESET_MULTI_IDX  0x0200
    #define RX_RTR_FRAME        0x0400
    #define CAN_FD_FRAME        0x0800

These BCM flags are used as part of the BCM header that has the aforementioned opcodes. The flags are set on the bcm_msg_head struct:

    struct bcm_msg_head {
        __u32 opcode;
        __u32 flags;
        __u32 count;
        struct bcm_timeval ival1, ival2;
        canid_t can_id;
        __u32 nframes;
        struct can_frame frames[0];
    };

The existing documentation for the BCM constants (https://docs.python.org/3/library/socket.html#socket.CAN_BCM) seems to imply that these constants should already be included, but they are not.

See the Linux headers for more details: https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/can/bcm.h