#ifndef _OPA_VNIC_ENCAP_H #define _OPA_VNIC_ENCAP_H /* * Copyright(c) 2017 Intel Corporation. * * This file is provided under a dual BSD/GPLv2 license. When using or * redistributing this file, you may do so under either license. * * GPL LICENSE SUMMARY * * This program is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * BSD LICENSE * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * - Neither the name of Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * This file contains all OPA VNIC declaration required for encapsulation * and decapsulation of Ethernet packets */ #include <linux/types.h> #include <rdma/ib_mad.h> /* EMA class version */ #define OPA_EMA_CLASS_VERSION 0x80 /* * Define the Intel vendor management class for OPA * ETHERNET MANAGEMENT */ #define OPA_MGMT_CLASS_INTEL_EMA 0x34 /* EM attribute IDs */ #define OPA_EM_ATTR_CLASS_PORT_INFO 0x0001 #define OPA_EM_ATTR_VESWPORT_INFO 0x0011 #define OPA_EM_ATTR_VESWPORT_MAC_ENTRIES 0x0012 #define OPA_EM_ATTR_IFACE_UCAST_MACS 0x0013 #define OPA_EM_ATTR_IFACE_MCAST_MACS 0x0014 #define OPA_EM_ATTR_DELETE_VESW 0x0015 #define OPA_EM_ATTR_VESWPORT_SUMMARY_COUNTERS 0x0020 #define OPA_EM_ATTR_VESWPORT_ERROR_COUNTERS 0x0022 /* VNIC configured and operational state values */ #define OPA_VNIC_STATE_DROP_ALL 0x1 #define OPA_VNIC_STATE_FORWARDING 0x3 #define OPA_VESW_MAX_NUM_DEF_PORT 16 #define OPA_VNIC_MAX_NUM_PCP 8 #define OPA_VNIC_EMA_DATA (OPA_MGMT_MAD_SIZE - IB_MGMT_VENDOR_HDR) /* Defines for vendor specific notice(trap) attributes */ #define OPA_INTEL_EMA_NOTICE_TYPE_INFO 0x04 /* INTEL OUI */ #define INTEL_OUI_1 0x00 #define INTEL_OUI_2 0x06 #define INTEL_OUI_3 0x6a /* Trap opcodes sent from VNIC */ #define OPA_VESWPORT_TRAP_IFACE_UCAST_MAC_CHANGE 0x1 #define OPA_VESWPORT_TRAP_IFACE_MCAST_MAC_CHANGE 0x2 #define OPA_VESWPORT_TRAP_ETH_LINK_STATUS_CHANGE 0x3 #define OPA_VNIC_DLID_SD_IS_SRC_MAC(dlid_sd) (!!((dlid_sd) & 0x20)) #define OPA_VNIC_DLID_SD_GET_DLID(dlid_sd) ((dlid_sd) >> 8) /* VNIC Ethernet link status */ #define OPA_VNIC_ETH_LINK_UP 1 #define OPA_VNIC_ETH_LINK_DOWN 2 /* routing control */ #define OPA_VNIC_ENCAP_RC_DEFAULT 0 #define OPA_VNIC_ENCAP_RC_IPV4 4 #define OPA_VNIC_ENCAP_RC_IPV4_UDP 8 #define OPA_VNIC_ENCAP_RC_IPV4_TCP 12 #define OPA_VNIC_ENCAP_RC_IPV6 16 #define OPA_VNIC_ENCAP_RC_IPV6_TCP 20 #define OPA_VNIC_ENCAP_RC_IPV6_UDP 24 #define OPA_VNIC_ENCAP_RC_EXT(w, b) (((w) >> OPA_VNIC_ENCAP_RC_ ## b) & 0x7) /** * struct opa_vesw_info - OPA vnic switch information * @fabric_id: 10-bit fabric id * @vesw_id: 12-bit virtual ethernet switch id * @rsvd0: reserved bytes * @def_port_mask: bitmask of default ports * @rsvd1: reserved bytes * @pkey: partition key * @rsvd2: reserved bytes * @u_mcast_dlid: unknown multicast dlid * @u_ucast_dlid: array of unknown unicast dlids * @rsvd3: reserved bytes * @rc: routing control * @eth_mtu: Ethernet MTU * @rsvd4: reserved bytes */ struct opa_vesw_info { __be16 fabric_id; __be16 vesw_id; u8 rsvd0[6]; __be16 def_port_mask; u8 rsvd1[2]; __be16 pkey; u8 rsvd2[4]; __be32 u_mcast_dlid; __be32 u_ucast_dlid[OPA_VESW_MAX_NUM_DEF_PORT]; __be32 rc; u8 rsvd3[56]; __be16 eth_mtu; u8 rsvd4[2]; } __packed; /** * struct opa_per_veswport_info - OPA vnic per port information * @port_num: port number * @eth_link_status: current ethernet link state * @rsvd0: reserved bytes * @base_mac_addr: base mac address * @config_state: configured port state * @oper_state: operational port state * @max_mac_tbl_ent: max number of mac table entries * @max_smac_ent: max smac entries in mac table * @mac_tbl_digest: mac table digest * @rsvd1: reserved bytes * @encap_slid: base slid for the port * @pcp_to_sc_uc: sc by pcp index for unicast ethernet packets * @pcp_to_vl_uc: vl by pcp index for unicast ethernet packets * @pcp_to_sc_mc: sc by pcp index for multicast ethernet packets * @pcp_to_vl_mc: vl by pcp index for multicast ethernet packets * @non_vlan_sc_uc: sc for non-vlan unicast ethernet packets * @non_vlan_vl_uc: vl for non-vlan unicast ethernet packets * @non_vlan_sc_mc: sc for non-vlan multicast ethernet packets * @non_vlan_vl_mc: vl for non-vlan multicast ethernet packets * @rsvd2: reserved bytes * @uc_macs_gen_count: generation count for unicast macs list * @mc_macs_gen_count: generation count for multicast macs list * @rsvd3: reserved bytes */ struct opa_per_veswport_info { __be32 port_num; u8 eth_link_status; u8 rsvd0[3]; u8 base_mac_addr[ETH_ALEN]; u8 config_state; u8 oper_state; __be16 max_mac_tbl_ent; __be16 max_smac_ent; __be32 mac_tbl_digest; u8 rsvd1[4]; __be32 encap_slid; u8 pcp_to_sc_uc[OPA_VNIC_MAX_NUM_PCP]; u8 pcp_to_vl_uc[OPA_VNIC_MAX_NUM_PCP]; u8 pcp_to_sc_mc[OPA_VNIC_MAX_NUM_PCP]; u8 pcp_to_vl_mc[OPA_VNIC_MAX_NUM_PCP]; u8 non_vlan_sc_uc; u8 non_vlan_vl_uc; u8 non_vlan_sc_mc; u8 non_vlan_vl_mc; u8 rsvd2[48]; __be16 uc_macs_gen_count; __be16 mc_macs_gen_count; u8 rsvd3[8]; } __packed; /** * struct opa_veswport_info - OPA vnic port information * @vesw: OPA vnic switch information * @vport: OPA vnic per port information * * On host, each of the virtual ethernet ports belongs * to a different virtual ethernet switches. */ struct opa_veswport_info { struct opa_vesw_info vesw; struct opa_per_veswport_info vport; }; /** * struct opa_veswport_mactable_entry - single entry in the forwarding table * @mac_addr: MAC address * @mac_addr_mask: MAC address bit mask * @dlid_sd: Matching DLID and side data * * On the host each virtual ethernet port will have * a forwarding table. These tables are used to * map a MAC to a LID and other data. For more * details see struct opa_veswport_mactable_entries. * This is the structure of a single mactable entry */ struct opa_veswport_mactable_entry { u8 mac_addr[ETH_ALEN]; u8 mac_addr_mask[ETH_ALEN]; __be32 dlid_sd; } __packed; /** * struct opa_veswport_mactable - Forwarding table array * @offset: mac table starting offset * @num_entries: Number of entries to get or set * @mac_tbl_digest: mac table digest * @tbl_entries: Array of table entries * * The EM sends down this structure in a MAD indicating * the starting offset in the forwarding table that this * entry is to be loaded into and the number of entries * that that this MAD instance contains * The mac_tbl_digest has been added to this MAD structure. It will be set by * the EM and it will be used by the EM to check if there are any * discrepancies with this value and the value * maintained by the EM in the case of VNIC port being deleted or unloaded * A new instantiation of a VNIC will always have a value of zero. * This value is stored as part of the vnic adapter structure and will be * accessed by the GET and SET routines for both the mactable entries and the * veswport info. */ struct opa_veswport_mactable { __be16 offset; __be16 num_entries; __be32 mac_tbl_digest; struct opa_veswport_mactable_entry tbl_entries[]; } __packed; /** * struct opa_veswport_summary_counters - summary counters * @vp_instance: vport instance on the OPA port * @vesw_id: virtual ethernet switch id * @veswport_num: virtual ethernet switch port number * @tx_errors: transmit errors * @rx_errors: receive errors * @tx_packets: transmit packets * @rx_packets: receive packets * @tx_bytes: transmit bytes * @rx_bytes: receive bytes * @tx_unicast: unicast packets transmitted * @tx_mcastbcast: multicast/broadcast packets transmitted * @tx_untagged: non-vlan packets transmitted * @tx_vlan: vlan packets transmitted * @tx_64_size: transmit packet length is 64 bytes * @tx_65_127: transmit packet length is >=65 and < 127 bytes * @tx_128_255: transmit packet length is >=128 and < 255 bytes * @tx_256_511: transmit packet length is >=256 and < 511 bytes * @tx_512_1023: transmit packet length is >=512 and < 1023 bytes * @tx_1024_1518: transmit packet length is >=1024 and < 1518 bytes * @tx_1519_max: transmit packet length >= 1519 bytes * @rx_unicast: unicast packets received * @rx_mcastbcast: multicast/broadcast packets received * @rx_untagged: non-vlan packets received * @rx_vlan: vlan packets received * @rx_64_size: received packet length is 64 bytes * @rx_65_127: received packet length is >=65 and < 127 bytes * @rx_128_255: received packet length is >=128 and < 255 bytes * @rx_256_511: received packet length is >=256 and < 511 bytes * @rx_512_1023: received packet length is >=512 and < 1023 bytes * @rx_1024_1518: received packet length is >=1024 and < 1518 bytes * @rx_1519_max: received packet length >= 1519 bytes * @reserved: reserved bytes * * All the above are counters of corresponding conditions. */ struct opa_veswport_summary_counters { __be16 vp_instance; __be16 vesw_id; __be32 veswport_num; __be64 tx_errors; __be64 rx_errors; __be64 tx_packets; __be64 rx_packets; __be64 tx_bytes; __be64 rx_bytes; __be64 tx_unicast; __be64 tx_mcastbcast; __be64 tx_untagged; __be64 tx_vlan; __be64 tx_64_size; __be64 tx_65_127; __be64 tx_128_255; __be64 tx_256_511; __be64 tx_512_1023; __be64 tx_1024_1518; __be64 tx_1519_max; __be64 rx_unicast; __be64 rx_mcastbcast; __be64 rx_untagged; __be64 rx_vlan; __be64 rx_64_size; __be64 rx_65_127; __be64 rx_128_255; __be64 rx_256_511; __be64 rx_512_1023; __be64 rx_1024_1518; __be64 rx_1519_max; __be64 reserved[16]; } __packed; /** * struct opa_veswport_error_counters - error counters * @vp_instance: vport instance on the OPA port * @vesw_id: virtual ethernet switch id * @veswport_num: virtual ethernet switch port number * @tx_errors: transmit errors * @rx_errors: receive errors * @rsvd0: reserved bytes * @tx_smac_filt: smac filter errors * @rsvd1: reserved bytes * @rsvd2: reserved bytes * @rsvd3: reserved bytes * @tx_dlid_zero: transmit packets with invalid dlid * @rsvd4: reserved bytes * @tx_logic: other transmit errors * @rsvd5: reserved bytes * @tx_drop_state: packet tansmission in non-forward port state * @rx_bad_veswid: received packet with invalid vesw id * @rsvd6: reserved bytes * @rx_runt: received ethernet packet with length < 64 bytes * @rx_oversize: received ethernet packet with length > MTU size * @rsvd7: reserved bytes * @rx_eth_down: received packets when interface is down * @rx_drop_state: received packets in non-forwarding port state * @rx_logic: other receive errors * @rsvd8: reserved bytes * @rsvd9: reserved bytes * * All the above are counters of corresponding error conditions. */ struct opa_veswport_error_counters { __be16 vp_instance; __be16 vesw_id; __be32 veswport_num; __be64 tx_errors; __be64 rx_errors; __be64 rsvd0; __be64 tx_smac_filt; __be64 rsvd1; __be64 rsvd2; __be64 rsvd3; __be64 tx_dlid_zero; __be64 rsvd4; __be64 tx_logic; __be64 rsvd5; __be64 tx_drop_state; __be64 rx_bad_veswid; __be64 rsvd6; __be64 rx_runt; __be64 rx_oversize; __be64 rsvd7; __be64 rx_eth_down; __be64 rx_drop_state; __be64 rx_logic; __be64 rsvd8; __be64 rsvd9[16]; } __packed; /** * struct opa_veswport_trap - Trap message sent to EM by VNIC * @fabric_id: 10 bit fabric id * @veswid: 12 bit virtual ethernet switch id * @veswportnum: logical port number on the Virtual switch * @opaportnum: physical port num (redundant on host) * @veswportindex: switch port index on opa port 0 based * @opcode: operation * @reserved: 32 bit for alignment * * The VNIC will send trap messages to the Ethernet manager to * inform it about changes to the VNIC config, behaviour etc. * This is the format of the trap payload. */ struct opa_veswport_trap { __be16 fabric_id; __be16 veswid; __be32 veswportnum; __be16 opaportnum; u8 veswportindex; u8 opcode; __be32 reserved; } __packed; /** * struct opa_vnic_iface_mac_entry - single entry in the mac list * @mac_addr: MAC address */ struct opa_vnic_iface_mac_entry { u8 mac_addr[ETH_ALEN]; }; /** * struct opa_veswport_iface_macs - Msg to set globally administered MAC * @start_idx: position of first entry (0 based) * @num_macs_in_msg: number of MACs in this message * @tot_macs_in_lst: The total number of MACs the agent has * @gen_count: gen_count to indicate change * @entry: The mac list entry * * Same attribute IDS and attribute modifiers as in locally administered * addresses used to set globally administered addresses */ struct opa_veswport_iface_macs { __be16 start_idx; __be16 num_macs_in_msg; __be16 tot_macs_in_lst; __be16 gen_count; struct opa_vnic_iface_mac_entry entry[]; } __packed; /** * struct opa_vnic_vema_mad - Generic VEMA MAD * @mad_hdr: Generic MAD header * @rmpp_hdr: RMPP header for vendor specific MADs * @reserved: reserved bytes * @oui: Unique org identifier * @data: MAD data */ struct opa_vnic_vema_mad { struct ib_mad_hdr mad_hdr; struct ib_rmpp_hdr rmpp_hdr; u8 reserved; u8 oui[3]; u8 data[OPA_VNIC_EMA_DATA]; }; /** * struct opa_vnic_notice_attr - Generic Notice MAD * @gen_type: Generic/Specific bit and type of notice * @oui_1: Vendor ID byte 1 * @oui_2: Vendor ID byte 2 * @oui_3: Vendor ID byte 3 * @trap_num: Trap number * @toggle_count: Notice toggle bit and count value * @issuer_lid: Trap issuer's lid * @reserved: reserved bytes * @issuer_gid: Issuer GID (only if Report method) * @raw_data: Trap message body */ struct opa_vnic_notice_attr { u8 gen_type; u8 oui_1; u8 oui_2; u8 oui_3; __be16 trap_num; __be16 toggle_count; __be32 issuer_lid; __be32 reserved; u8 issuer_gid[16]; u8 raw_data[64]; } __packed; /** * struct opa_vnic_vema_mad_trap - Generic VEMA MAD Trap * @mad_hdr: Generic MAD header * @rmpp_hdr: RMPP header for vendor specific MADs * @reserved: reserved bytes * @oui: Unique org identifier * @notice: Notice structure */ struct opa_vnic_vema_mad_trap { struct ib_mad_hdr mad_hdr; struct ib_rmpp_hdr rmpp_hdr; u8 reserved; u8 oui[3]; struct opa_vnic_notice_attr notice; }; #endif /* _OPA_VNIC_ENCAP_H */