1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-10-18 02:19:39 +00:00

Fix prio vs. nonprio tagged traffic in RDMACM

In current RDMACM implementation RDMACM server will not find a GID
index when the request was prio-tagged and the sever is non
prio-tagged and vise-versa.
According to 802.1Q-2014, VLAN tagged packets with VLAN id 0 should
be considered as untagged. Treat RDMACM request the same.

Reviewed by:    hselasky, kib
MFC after:      3 Days
Sponsored by:   Mellanox Technologies
This commit is contained in:
Slava Shwartsman 2019-06-04 06:21:31 +00:00
parent 0f6040f03e
commit bb43866c38
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=348601

View File

@ -414,18 +414,32 @@ struct find_gid_index_context {
enum ib_gid_type gid_type;
};
/*
* This function will return true only if a inspected GID index
* matches the request based on the GID type and VLAN configuration
*/
static bool find_gid_index(const union ib_gid *gid,
const struct ib_gid_attr *gid_attr,
void *context)
{
u16 vlan_diff;
struct find_gid_index_context *ctx =
(struct find_gid_index_context *)context;
if (ctx->gid_type != gid_attr->gid_type)
return false;
if (rdma_vlan_dev_vlan_id(gid_attr->ndev) != ctx->vlan_id)
return false;
return true;
/*
* The following will verify:
* 1. VLAN ID matching for VLAN tagged requests.
* 2. prio-tagged/untagged to prio-tagged/untagged matching.
*
* This XOR is valid, since 0x0 < vlan_id < 0x0FFF.
*/
vlan_diff = rdma_vlan_dev_vlan_id(gid_attr->ndev) ^ ctx->vlan_id;
return (vlan_diff == 0x0000 || vlan_diff == 0xFFFF);
}
static int get_sgid_index_from_eth(struct ib_device *device, u8 port_num,