linux/drivers/scsi/qla2xxx/qla_edif_bsg.h
Gustavo A. R. Silva 5224f79096 treewide: Replace zero-length arrays with flexible-array members
There is a regular need in the kernel to provide a way to declare
having a dynamically sized set of trailing elements in a structure.
Kernel code should always use “flexible array members”[1] for these
cases. The older style of one-element or zero-length arrays should
no longer be used[2].

This code was transformed with the help of Coccinelle:
(next-20220214$ spatch --jobs $(getconf _NPROCESSORS_ONLN) --sp-file script.cocci --include-headers --dir . > output.patch)

@@
identifier S, member, array;
type T1, T2;
@@

struct S {
  ...
  T1 member;
  T2 array[
- 0
  ];
};

UAPI and wireless changes were intentionally excluded from this patch
and will be sent out separately.

[1] https://en.wikipedia.org/wiki/Flexible_array_member
[2] https://www.kernel.org/doc/html/v5.16/process/deprecated.html#zero-length-and-one-element-arrays

Link: https://github.com/KSPP/linux/issues/78
Reviewed-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
2022-02-17 07:00:39 -06:00

221 lines
4.8 KiB
C

/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Marvell Fibre Channel HBA Driver
* Copyright (C) 2018- Marvell
*
*/
#ifndef __QLA_EDIF_BSG_H
#define __QLA_EDIF_BSG_H
/* BSG Vendor specific commands */
#define ELS_MAX_PAYLOAD 2112
#ifndef WWN_SIZE
#define WWN_SIZE 8
#endif
#define VND_CMD_APP_RESERVED_SIZE 32
enum auth_els_sub_cmd {
SEND_ELS = 0,
SEND_ELS_REPLY,
PULL_ELS,
};
struct extra_auth_els {
enum auth_els_sub_cmd sub_cmd;
uint32_t extra_rx_xchg_address;
uint8_t extra_control_flags;
#define BSG_CTL_FLAG_INIT 0
#define BSG_CTL_FLAG_LS_ACC 1
#define BSG_CTL_FLAG_LS_RJT 2
#define BSG_CTL_FLAG_TRM 3
uint8_t extra_rsvd[3];
} __packed;
struct qla_bsg_auth_els_request {
struct fc_bsg_request r;
struct extra_auth_els e;
};
struct qla_bsg_auth_els_reply {
struct fc_bsg_reply r;
uint32_t rx_xchg_address;
};
struct app_id {
int app_vid;
uint8_t app_key[32];
} __packed;
struct app_start_reply {
uint32_t host_support_edif;
uint32_t edif_enode_active;
uint32_t edif_edb_active;
uint32_t reserved[VND_CMD_APP_RESERVED_SIZE];
} __packed;
struct app_start {
struct app_id app_info;
uint32_t prli_to;
uint32_t key_shred;
uint8_t app_start_flags;
uint8_t reserved[VND_CMD_APP_RESERVED_SIZE - 1];
} __packed;
struct app_stop {
struct app_id app_info;
char buf[16];
} __packed;
struct app_plogi_reply {
uint32_t prli_status;
uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
} __packed;
#define RECFG_TIME 1
#define RECFG_BYTES 2
struct app_rekey_cfg {
struct app_id app_info;
uint8_t rekey_mode;
port_id_t d_id;
uint8_t force;
union {
int64_t bytes;
int64_t time;
} rky_units;
uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
} __packed;
struct app_pinfo_req {
struct app_id app_info;
uint8_t num_ports;
port_id_t remote_pid;
uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
} __packed;
struct app_pinfo {
port_id_t remote_pid;
uint8_t remote_wwpn[WWN_SIZE];
uint8_t remote_type;
#define VND_CMD_RTYPE_UNKNOWN 0
#define VND_CMD_RTYPE_TARGET 1
#define VND_CMD_RTYPE_INITIATOR 2
uint8_t remote_state;
uint8_t auth_state;
uint8_t rekey_mode;
int64_t rekey_count;
int64_t rekey_config_value;
int64_t rekey_consumed_value;
uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
} __packed;
/* AUTH States */
#define VND_CMD_AUTH_STATE_UNDEF 0
#define VND_CMD_AUTH_STATE_SESSION_SHUTDOWN 1
#define VND_CMD_AUTH_STATE_NEEDED 2
#define VND_CMD_AUTH_STATE_ELS_RCVD 3
#define VND_CMD_AUTH_STATE_SAUPDATE_COMPL 4
struct app_pinfo_reply {
uint8_t port_count;
uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
struct app_pinfo ports[];
} __packed;
struct app_sinfo_req {
struct app_id app_info;
uint8_t num_ports;
uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
} __packed;
struct app_sinfo {
uint8_t remote_wwpn[WWN_SIZE];
int64_t rekey_count;
uint8_t rekey_mode;
int64_t tx_bytes;
int64_t rx_bytes;
} __packed;
struct app_stats_reply {
uint8_t elem_count;
struct app_sinfo elem[];
} __packed;
struct qla_sa_update_frame {
struct app_id app_info;
uint16_t flags;
#define SAU_FLG_INV 0x01 /* delete key */
#define SAU_FLG_TX 0x02 /* 1=tx, 0 = rx */
#define SAU_FLG_FORCE_DELETE 0x08
#define SAU_FLG_GMAC_MODE 0x20 /*
* GMAC mode is cleartext for the IO
* (i.e. NULL encryption)
*/
#define SAU_FLG_KEY128 0x40
#define SAU_FLG_KEY256 0x80
uint16_t fast_sa_index:10,
reserved:6;
uint32_t salt;
uint32_t spi;
uint8_t sa_key[32];
uint8_t node_name[WWN_SIZE];
uint8_t port_name[WWN_SIZE];
port_id_t port_id;
} __packed;
// used for edif mgmt bsg interface
#define QL_VND_SC_UNDEF 0
#define QL_VND_SC_SA_UPDATE 1
#define QL_VND_SC_APP_START 2
#define QL_VND_SC_APP_STOP 3
#define QL_VND_SC_AUTH_OK 4
#define QL_VND_SC_AUTH_FAIL 5
#define QL_VND_SC_REKEY_CONFIG 6
#define QL_VND_SC_GET_FCINFO 7
#define QL_VND_SC_GET_STATS 8
/* Application interface data structure for rtn data */
#define EXT_DEF_EVENT_DATA_SIZE 64
struct edif_app_dbell {
uint32_t event_code;
uint32_t event_data_size;
union {
port_id_t port_id;
uint8_t event_data[EXT_DEF_EVENT_DATA_SIZE];
};
} __packed;
struct edif_sa_update_aen {
port_id_t port_id;
uint32_t key_type; /* Tx (1) or RX (2) */
uint32_t status; /* 0 succes, 1 failed, 2 timeout , 3 error */
uint8_t reserved[16];
} __packed;
#define QL_VND_SA_STAT_SUCCESS 0
#define QL_VND_SA_STAT_FAILED 1
#define QL_VND_SA_STAT_TIMEOUT 2
#define QL_VND_SA_STAT_ERROR 3
#define QL_VND_RX_SA_KEY 1
#define QL_VND_TX_SA_KEY 2
/* App defines for plogi auth'd ok and plogi auth bad requests */
struct auth_complete_cmd {
struct app_id app_info;
#define PL_TYPE_WWPN 1
#define PL_TYPE_DID 2
uint32_t type;
union {
uint8_t wwpn[WWN_SIZE];
port_id_t d_id;
} u;
uint32_t reserved[VND_CMD_APP_RESERVED_SIZE];
} __packed;
#define RX_DELAY_DELETE_TIMEOUT 20
#endif /* QLA_EDIF_BSG_H */