1#ifndef _OPA_VNIC_ENCAP_H
2#define _OPA_VNIC_ENCAP_H
3/*
4 * Copyright(c) 2017 Intel Corporation.
5 *
6 * This file is provided under a dual BSD/GPLv2 license. When using or
7 * redistributing this file, you may do so under either license.
8 *
9 * GPL LICENSE SUMMARY
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of version 2 of the GNU General Public License as
13 * published by the Free Software Foundation.
14 *
15 * This program is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * General Public License for more details.
19 *
20 * BSD LICENSE
21 *
22 * Redistribution and use in source and binary forms, with or without
23 * modification, are permitted provided that the following conditions
24 * are met:
25 *
26 * - Redistributions of source code must retain the above copyright
27 * notice, this list of conditions and the following disclaimer.
28 * - Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in
30 * the documentation and/or other materials provided with the
31 * distribution.
32 * - Neither the name of Intel Corporation nor the names of its
33 * contributors may be used to endorse or promote products derived
34 * from this software without specific prior written permission.
35 *
36 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
37 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
38 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
39 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
40 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
42 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
43 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
44 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
45 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
46 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
47 *
48 */
49
50/*
51 * This file contains all OPA VNIC declaration required for encapsulation
52 * and decapsulation of Ethernet packets
53 */
54
55#include <linux/types.h>
56#include <rdma/ib_mad.h>
57
58/* EMA class version */
59#define OPA_EMA_CLASS_VERSION 0x80
60
61/*
62 * Define the Intel vendor management class for OPA
63 * ETHERNET MANAGEMENT
64 */
65#define OPA_MGMT_CLASS_INTEL_EMA 0x34
66
67/* EM attribute IDs */
68#define OPA_EM_ATTR_CLASS_PORT_INFO 0x0001
69#define OPA_EM_ATTR_VESWPORT_INFO 0x0011
70#define OPA_EM_ATTR_VESWPORT_MAC_ENTRIES 0x0012
71#define OPA_EM_ATTR_IFACE_UCAST_MACS 0x0013
72#define OPA_EM_ATTR_IFACE_MCAST_MACS 0x0014
73#define OPA_EM_ATTR_DELETE_VESW 0x0015
74#define OPA_EM_ATTR_VESWPORT_SUMMARY_COUNTERS 0x0020
75#define OPA_EM_ATTR_VESWPORT_ERROR_COUNTERS 0x0022
76
77/* VNIC configured and operational state values */
78#define OPA_VNIC_STATE_DROP_ALL 0x1
79#define OPA_VNIC_STATE_FORWARDING 0x3
80
81#define OPA_VESW_MAX_NUM_DEF_PORT 16
82#define OPA_VNIC_MAX_NUM_PCP 8
83
84#define OPA_VNIC_EMA_DATA (OPA_MGMT_MAD_SIZE - IB_MGMT_VENDOR_HDR)
85
86/* Defines for vendor specific notice(trap) attributes */
87#define OPA_INTEL_EMA_NOTICE_TYPE_INFO 0x04
88
89/* INTEL OUI */
90#define INTEL_OUI_1 0x00
91#define INTEL_OUI_2 0x06
92#define INTEL_OUI_3 0x6a
93
94/* Trap opcodes sent from VNIC */
95#define OPA_VESWPORT_TRAP_IFACE_UCAST_MAC_CHANGE 0x1
96#define OPA_VESWPORT_TRAP_IFACE_MCAST_MAC_CHANGE 0x2
97#define OPA_VESWPORT_TRAP_ETH_LINK_STATUS_CHANGE 0x3
98
99#define OPA_VNIC_DLID_SD_IS_SRC_MAC(dlid_sd) (!!((dlid_sd) & 0x20))
100#define OPA_VNIC_DLID_SD_GET_DLID(dlid_sd) ((dlid_sd) >> 8)
101
102/* VNIC Ethernet link status */
103#define OPA_VNIC_ETH_LINK_UP 1
104#define OPA_VNIC_ETH_LINK_DOWN 2
105
106/* routing control */
107#define OPA_VNIC_ENCAP_RC_DEFAULT 0
108#define OPA_VNIC_ENCAP_RC_IPV4 4
109#define OPA_VNIC_ENCAP_RC_IPV4_UDP 8
110#define OPA_VNIC_ENCAP_RC_IPV4_TCP 12
111#define OPA_VNIC_ENCAP_RC_IPV6 16
112#define OPA_VNIC_ENCAP_RC_IPV6_TCP 20
113#define OPA_VNIC_ENCAP_RC_IPV6_UDP 24
114
115#define OPA_VNIC_ENCAP_RC_EXT(w, b) (((w) >> OPA_VNIC_ENCAP_RC_ ## b) & 0x7)
116
117/**
118 * struct opa_vesw_info - OPA vnic switch information
119 * @fabric_id: 10-bit fabric id
120 * @vesw_id: 12-bit virtual ethernet switch id
121 * @rsvd0: reserved bytes
122 * @def_port_mask: bitmask of default ports
123 * @rsvd1: reserved bytes
124 * @pkey: partition key
125 * @rsvd2: reserved bytes
126 * @u_mcast_dlid: unknown multicast dlid
127 * @u_ucast_dlid: array of unknown unicast dlids
128 * @rsvd3: reserved bytes
129 * @rc: routing control
130 * @eth_mtu: Ethernet MTU
131 * @rsvd4: reserved bytes
132 */
133struct opa_vesw_info {
134 __be16 fabric_id;
135 __be16 vesw_id;
136
137 u8 rsvd0[6];
138 __be16 def_port_mask;
139
140 u8 rsvd1[2];
141 __be16 pkey;
142
143 u8 rsvd2[4];
144 __be32 u_mcast_dlid;
145 __be32 u_ucast_dlid[OPA_VESW_MAX_NUM_DEF_PORT];
146
147 __be32 rc;
148
149 u8 rsvd3[56];
150 __be16 eth_mtu;
151 u8 rsvd4[2];
152} __packed;
153
154/**
155 * struct opa_per_veswport_info - OPA vnic per port information
156 * @port_num: port number
157 * @eth_link_status: current ethernet link state
158 * @rsvd0: reserved bytes
159 * @base_mac_addr: base mac address
160 * @config_state: configured port state
161 * @oper_state: operational port state
162 * @max_mac_tbl_ent: max number of mac table entries
163 * @max_smac_ent: max smac entries in mac table
164 * @mac_tbl_digest: mac table digest
165 * @rsvd1: reserved bytes
166 * @encap_slid: base slid for the port
167 * @pcp_to_sc_uc: sc by pcp index for unicast ethernet packets
168 * @pcp_to_vl_uc: vl by pcp index for unicast ethernet packets
169 * @pcp_to_sc_mc: sc by pcp index for multicast ethernet packets
170 * @pcp_to_vl_mc: vl by pcp index for multicast ethernet packets
171 * @non_vlan_sc_uc: sc for non-vlan unicast ethernet packets
172 * @non_vlan_vl_uc: vl for non-vlan unicast ethernet packets
173 * @non_vlan_sc_mc: sc for non-vlan multicast ethernet packets
174 * @non_vlan_vl_mc: vl for non-vlan multicast ethernet packets
175 * @rsvd2: reserved bytes
176 * @uc_macs_gen_count: generation count for unicast macs list
177 * @mc_macs_gen_count: generation count for multicast macs list
178 * @rsvd3: reserved bytes
179 */
180struct opa_per_veswport_info {
181 __be32 port_num;
182
183 u8 eth_link_status;
184 u8 rsvd0[3];
185
186 u8 base_mac_addr[ETH_ALEN];
187 u8 config_state;
188 u8 oper_state;
189
190 __be16 max_mac_tbl_ent;
191 __be16 max_smac_ent;
192 __be32 mac_tbl_digest;
193 u8 rsvd1[4];
194
195 __be32 encap_slid;
196
197 u8 pcp_to_sc_uc[OPA_VNIC_MAX_NUM_PCP];
198 u8 pcp_to_vl_uc[OPA_VNIC_MAX_NUM_PCP];
199 u8 pcp_to_sc_mc[OPA_VNIC_MAX_NUM_PCP];
200 u8 pcp_to_vl_mc[OPA_VNIC_MAX_NUM_PCP];
201
202 u8 non_vlan_sc_uc;
203 u8 non_vlan_vl_uc;
204 u8 non_vlan_sc_mc;
205 u8 non_vlan_vl_mc;
206
207 u8 rsvd2[48];
208
209 __be16 uc_macs_gen_count;
210 __be16 mc_macs_gen_count;
211
212 u8 rsvd3[8];
213} __packed;
214
215/**
216 * struct opa_veswport_info - OPA vnic port information
217 * @vesw: OPA vnic switch information
218 * @vport: OPA vnic per port information
219 *
220 * On host, each of the virtual ethernet ports belongs
221 * to a different virtual ethernet switches.
222 */
223struct opa_veswport_info {
224 struct opa_vesw_info vesw;
225 struct opa_per_veswport_info vport;
226};
227
228/**
229 * struct opa_veswport_mactable_entry - single entry in the forwarding table
230 * @mac_addr: MAC address
231 * @mac_addr_mask: MAC address bit mask
232 * @dlid_sd: Matching DLID and side data
233 *
234 * On the host each virtual ethernet port will have
235 * a forwarding table. These tables are used to
236 * map a MAC to a LID and other data. For more
237 * details see struct opa_veswport_mactable_entries.
238 * This is the structure of a single mactable entry
239 */
240struct opa_veswport_mactable_entry {
241 u8 mac_addr[ETH_ALEN];
242 u8 mac_addr_mask[ETH_ALEN];
243 __be32 dlid_sd;
244} __packed;
245
246/**
247 * struct opa_veswport_mactable - Forwarding table array
248 * @offset: mac table starting offset
249 * @num_entries: Number of entries to get or set
250 * @mac_tbl_digest: mac table digest
251 * @tbl_entries: Array of table entries
252 *
253 * The EM sends down this structure in a MAD indicating
254 * the starting offset in the forwarding table that this
255 * entry is to be loaded into and the number of entries
256 * that that this MAD instance contains
257 * The mac_tbl_digest has been added to this MAD structure. It will be set by
258 * the EM and it will be used by the EM to check if there are any
259 * discrepancies with this value and the value
260 * maintained by the EM in the case of VNIC port being deleted or unloaded
261 * A new instantiation of a VNIC will always have a value of zero.
262 * This value is stored as part of the vnic adapter structure and will be
263 * accessed by the GET and SET routines for both the mactable entries and the
264 * veswport info.
265 */
266struct opa_veswport_mactable {
267 __be16 offset;
268 __be16 num_entries;
269 __be32 mac_tbl_digest;
270 struct opa_veswport_mactable_entry tbl_entries[];
271} __packed;
272
273/**
274 * struct opa_veswport_summary_counters - summary counters
275 * @vp_instance: vport instance on the OPA port
276 * @vesw_id: virtual ethernet switch id
277 * @veswport_num: virtual ethernet switch port number
278 * @tx_errors: transmit errors
279 * @rx_errors: receive errors
280 * @tx_packets: transmit packets
281 * @rx_packets: receive packets
282 * @tx_bytes: transmit bytes
283 * @rx_bytes: receive bytes
284 * @tx_unicast: unicast packets transmitted
285 * @tx_mcastbcast: multicast/broadcast packets transmitted
286 * @tx_untagged: non-vlan packets transmitted
287 * @tx_vlan: vlan packets transmitted
288 * @tx_64_size: transmit packet length is 64 bytes
289 * @tx_65_127: transmit packet length is >=65 and < 127 bytes
290 * @tx_128_255: transmit packet length is >=128 and < 255 bytes
291 * @tx_256_511: transmit packet length is >=256 and < 511 bytes
292 * @tx_512_1023: transmit packet length is >=512 and < 1023 bytes
293 * @tx_1024_1518: transmit packet length is >=1024 and < 1518 bytes
294 * @tx_1519_max: transmit packet length >= 1519 bytes
295 * @rx_unicast: unicast packets received
296 * @rx_mcastbcast: multicast/broadcast packets received
297 * @rx_untagged: non-vlan packets received
298 * @rx_vlan: vlan packets received
299 * @rx_64_size: received packet length is 64 bytes
300 * @rx_65_127: received packet length is >=65 and < 127 bytes
301 * @rx_128_255: received packet length is >=128 and < 255 bytes
302 * @rx_256_511: received packet length is >=256 and < 511 bytes
303 * @rx_512_1023: received packet length is >=512 and < 1023 bytes
304 * @rx_1024_1518: received packet length is >=1024 and < 1518 bytes
305 * @rx_1519_max: received packet length >= 1519 bytes
306 * @reserved: reserved bytes
307 *
308 * All the above are counters of corresponding conditions.
309 */
310struct opa_veswport_summary_counters {
311 __be16 vp_instance;
312 __be16 vesw_id;
313 __be32 veswport_num;
314
315 __be64 tx_errors;
316 __be64 rx_errors;
317 __be64 tx_packets;
318 __be64 rx_packets;
319 __be64 tx_bytes;
320 __be64 rx_bytes;
321
322 __be64 tx_unicast;
323 __be64 tx_mcastbcast;
324
325 __be64 tx_untagged;
326 __be64 tx_vlan;
327
328 __be64 tx_64_size;
329 __be64 tx_65_127;
330 __be64 tx_128_255;
331 __be64 tx_256_511;
332 __be64 tx_512_1023;
333 __be64 tx_1024_1518;
334 __be64 tx_1519_max;
335
336 __be64 rx_unicast;
337 __be64 rx_mcastbcast;
338
339 __be64 rx_untagged;
340 __be64 rx_vlan;
341
342 __be64 rx_64_size;
343 __be64 rx_65_127;
344 __be64 rx_128_255;
345 __be64 rx_256_511;
346 __be64 rx_512_1023;
347 __be64 rx_1024_1518;
348 __be64 rx_1519_max;
349
350 __be64 reserved[16];
351} __packed;
352
353/**
354 * struct opa_veswport_error_counters - error counters
355 * @vp_instance: vport instance on the OPA port
356 * @vesw_id: virtual ethernet switch id
357 * @veswport_num: virtual ethernet switch port number
358 * @tx_errors: transmit errors
359 * @rx_errors: receive errors
360 * @rsvd0: reserved bytes
361 * @tx_smac_filt: smac filter errors
362 * @rsvd1: reserved bytes
363 * @rsvd2: reserved bytes
364 * @rsvd3: reserved bytes
365 * @tx_dlid_zero: transmit packets with invalid dlid
366 * @rsvd4: reserved bytes
367 * @tx_logic: other transmit errors
368 * @rsvd5: reserved bytes
369 * @tx_drop_state: packet tansmission in non-forward port state
370 * @rx_bad_veswid: received packet with invalid vesw id
371 * @rsvd6: reserved bytes
372 * @rx_runt: received ethernet packet with length < 64 bytes
373 * @rx_oversize: received ethernet packet with length > MTU size
374 * @rsvd7: reserved bytes
375 * @rx_eth_down: received packets when interface is down
376 * @rx_drop_state: received packets in non-forwarding port state
377 * @rx_logic: other receive errors
378 * @rsvd8: reserved bytes
379 * @rsvd9: reserved bytes
380 *
381 * All the above are counters of corresponding error conditions.
382 */
383struct opa_veswport_error_counters {
384 __be16 vp_instance;
385 __be16 vesw_id;
386 __be32 veswport_num;
387
388 __be64 tx_errors;
389 __be64 rx_errors;
390
391 __be64 rsvd0;
392 __be64 tx_smac_filt;
393 __be64 rsvd1;
394 __be64 rsvd2;
395 __be64 rsvd3;
396 __be64 tx_dlid_zero;
397 __be64 rsvd4;
398 __be64 tx_logic;
399 __be64 rsvd5;
400 __be64 tx_drop_state;
401
402 __be64 rx_bad_veswid;
403 __be64 rsvd6;
404 __be64 rx_runt;
405 __be64 rx_oversize;
406 __be64 rsvd7;
407 __be64 rx_eth_down;
408 __be64 rx_drop_state;
409 __be64 rx_logic;
410 __be64 rsvd8;
411
412 __be64 rsvd9[16];
413} __packed;
414
415/**
416 * struct opa_veswport_trap - Trap message sent to EM by VNIC
417 * @fabric_id: 10 bit fabric id
418 * @veswid: 12 bit virtual ethernet switch id
419 * @veswportnum: logical port number on the Virtual switch
420 * @opaportnum: physical port num (redundant on host)
421 * @veswportindex: switch port index on opa port 0 based
422 * @opcode: operation
423 * @reserved: 32 bit for alignment
424 *
425 * The VNIC will send trap messages to the Ethernet manager to
426 * inform it about changes to the VNIC config, behaviour etc.
427 * This is the format of the trap payload.
428 */
429struct opa_veswport_trap {
430 __be16 fabric_id;
431 __be16 veswid;
432 __be32 veswportnum;
433 __be16 opaportnum;
434 u8 veswportindex;
435 u8 opcode;
436 __be32 reserved;
437} __packed;
438
439/**
440 * struct opa_vnic_iface_mac_entry - single entry in the mac list
441 * @mac_addr: MAC address
442 */
443struct opa_vnic_iface_mac_entry {
444 u8 mac_addr[ETH_ALEN];
445};
446
447/**
448 * struct opa_veswport_iface_macs - Msg to set globally administered MAC
449 * @start_idx: position of first entry (0 based)
450 * @num_macs_in_msg: number of MACs in this message
451 * @tot_macs_in_lst: The total number of MACs the agent has
452 * @gen_count: gen_count to indicate change
453 * @entry: The mac list entry
454 *
455 * Same attribute IDS and attribute modifiers as in locally administered
456 * addresses used to set globally administered addresses
457 */
458struct opa_veswport_iface_macs {
459 __be16 start_idx;
460 __be16 num_macs_in_msg;
461 __be16 tot_macs_in_lst;
462 __be16 gen_count;
463 struct opa_vnic_iface_mac_entry entry[];
464} __packed;
465
466/**
467 * struct opa_vnic_vema_mad - Generic VEMA MAD
468 * @mad_hdr: Generic MAD header
469 * @rmpp_hdr: RMPP header for vendor specific MADs
470 * @reserved: reserved bytes
471 * @oui: Unique org identifier
472 * @data: MAD data
473 */
474struct opa_vnic_vema_mad {
475 struct ib_mad_hdr mad_hdr;
476 struct ib_rmpp_hdr rmpp_hdr;
477 u8 reserved;
478 u8 oui[3];
479 u8 data[OPA_VNIC_EMA_DATA];
480};
481
482/**
483 * struct opa_vnic_notice_attr - Generic Notice MAD
484 * @gen_type: Generic/Specific bit and type of notice
485 * @oui_1: Vendor ID byte 1
486 * @oui_2: Vendor ID byte 2
487 * @oui_3: Vendor ID byte 3
488 * @trap_num: Trap number
489 * @toggle_count: Notice toggle bit and count value
490 * @issuer_lid: Trap issuer's lid
491 * @reserved: reserved bytes
492 * @issuer_gid: Issuer GID (only if Report method)
493 * @raw_data: Trap message body
494 */
495struct opa_vnic_notice_attr {
496 u8 gen_type;
497 u8 oui_1;
498 u8 oui_2;
499 u8 oui_3;
500 __be16 trap_num;
501 __be16 toggle_count;
502 __be32 issuer_lid;
503 __be32 reserved;
504 u8 issuer_gid[16];
505 u8 raw_data[64];
506} __packed;
507
508/**
509 * struct opa_vnic_vema_mad_trap - Generic VEMA MAD Trap
510 * @mad_hdr: Generic MAD header
511 * @rmpp_hdr: RMPP header for vendor specific MADs
512 * @reserved: reserved bytes
513 * @oui: Unique org identifier
514 * @notice: Notice structure
515 */
516struct opa_vnic_vema_mad_trap {
517 struct ib_mad_hdr mad_hdr;
518 struct ib_rmpp_hdr rmpp_hdr;
519 u8 reserved;
520 u8 oui[3];
521 struct opa_vnic_notice_attr notice;
522};
523
524#endif /* _OPA_VNIC_ENCAP_H */
525

source code of linux/drivers/infiniband/ulp/opa_vnic/opa_vnic_encap.h