diff options
author | Maor Gottlieb <maorg@mellanox.com> | 2016-08-30 09:58:30 -0400 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2016-10-07 16:54:16 -0400 |
commit | 1f02a09c38043f1c003ddbd144b6da7f269d0ca1 (patch) | |
tree | 0e4e40f5e74909e0fc473bf26878cf7826413695 | |
parent | cc0e5d42351de1f9233738697718d0eed4396536 (diff) |
IB/mlx4: Add validation to flow specifications parsing
Add validation check that all set fields in flow specification
are supported by vendor.
Signed-off-by: Maor Gottlieb <maorg@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r-- | drivers/infiniband/hw/mlx4/main.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c index a96e78c2c75a..f617c23f0be7 100644 --- a/drivers/infiniband/hw/mlx4/main.c +++ b/drivers/infiniband/hw/mlx4/main.c | |||
@@ -1361,6 +1361,19 @@ struct mlx4_ib_steering { | |||
1361 | union ib_gid gid; | 1361 | union ib_gid gid; |
1362 | }; | 1362 | }; |
1363 | 1363 | ||
1364 | #define LAST_ETH_FIELD vlan_tag | ||
1365 | #define LAST_IB_FIELD sl | ||
1366 | #define LAST_IPV4_FIELD dst_ip | ||
1367 | #define LAST_TCP_UDP_FIELD src_port | ||
1368 | |||
1369 | /* Field is the last supported field */ | ||
1370 | #define FIELDS_NOT_SUPPORTED(filter, field)\ | ||
1371 | memchr_inv((void *)&filter.field +\ | ||
1372 | sizeof(filter.field), 0,\ | ||
1373 | sizeof(filter) -\ | ||
1374 | offsetof(typeof(filter), field) -\ | ||
1375 | sizeof(filter.field)) | ||
1376 | |||
1364 | static int parse_flow_attr(struct mlx4_dev *dev, | 1377 | static int parse_flow_attr(struct mlx4_dev *dev, |
1365 | u32 qp_num, | 1378 | u32 qp_num, |
1366 | union ib_flow_spec *ib_spec, | 1379 | union ib_flow_spec *ib_spec, |
@@ -1370,6 +1383,9 @@ static int parse_flow_attr(struct mlx4_dev *dev, | |||
1370 | 1383 | ||
1371 | switch (ib_spec->type) { | 1384 | switch (ib_spec->type) { |
1372 | case IB_FLOW_SPEC_ETH: | 1385 | case IB_FLOW_SPEC_ETH: |
1386 | if (FIELDS_NOT_SUPPORTED(ib_spec->eth.mask, LAST_ETH_FIELD)) | ||
1387 | return -ENOTSUPP; | ||
1388 | |||
1373 | type = MLX4_NET_TRANS_RULE_ID_ETH; | 1389 | type = MLX4_NET_TRANS_RULE_ID_ETH; |
1374 | memcpy(mlx4_spec->eth.dst_mac, ib_spec->eth.val.dst_mac, | 1390 | memcpy(mlx4_spec->eth.dst_mac, ib_spec->eth.val.dst_mac, |
1375 | ETH_ALEN); | 1391 | ETH_ALEN); |
@@ -1379,6 +1395,9 @@ static int parse_flow_attr(struct mlx4_dev *dev, | |||
1379 | mlx4_spec->eth.vlan_tag_msk = ib_spec->eth.mask.vlan_tag; | 1395 | mlx4_spec->eth.vlan_tag_msk = ib_spec->eth.mask.vlan_tag; |
1380 | break; | 1396 | break; |
1381 | case IB_FLOW_SPEC_IB: | 1397 | case IB_FLOW_SPEC_IB: |
1398 | if (FIELDS_NOT_SUPPORTED(ib_spec->ib.mask, LAST_IB_FIELD)) | ||
1399 | return -ENOTSUPP; | ||
1400 | |||
1382 | type = MLX4_NET_TRANS_RULE_ID_IB; | 1401 | type = MLX4_NET_TRANS_RULE_ID_IB; |
1383 | mlx4_spec->ib.l3_qpn = | 1402 | mlx4_spec->ib.l3_qpn = |
1384 | cpu_to_be32(qp_num); | 1403 | cpu_to_be32(qp_num); |
@@ -1388,6 +1407,9 @@ static int parse_flow_attr(struct mlx4_dev *dev, | |||
1388 | 1407 | ||
1389 | 1408 | ||
1390 | case IB_FLOW_SPEC_IPV4: | 1409 | case IB_FLOW_SPEC_IPV4: |
1410 | if (FIELDS_NOT_SUPPORTED(ib_spec->ipv4.mask, LAST_IPV4_FIELD)) | ||
1411 | return -ENOTSUPP; | ||
1412 | |||
1391 | type = MLX4_NET_TRANS_RULE_ID_IPV4; | 1413 | type = MLX4_NET_TRANS_RULE_ID_IPV4; |
1392 | mlx4_spec->ipv4.src_ip = ib_spec->ipv4.val.src_ip; | 1414 | mlx4_spec->ipv4.src_ip = ib_spec->ipv4.val.src_ip; |
1393 | mlx4_spec->ipv4.src_ip_msk = ib_spec->ipv4.mask.src_ip; | 1415 | mlx4_spec->ipv4.src_ip_msk = ib_spec->ipv4.mask.src_ip; |
@@ -1397,6 +1419,9 @@ static int parse_flow_attr(struct mlx4_dev *dev, | |||
1397 | 1419 | ||
1398 | case IB_FLOW_SPEC_TCP: | 1420 | case IB_FLOW_SPEC_TCP: |
1399 | case IB_FLOW_SPEC_UDP: | 1421 | case IB_FLOW_SPEC_UDP: |
1422 | if (FIELDS_NOT_SUPPORTED(ib_spec->tcp_udp.mask, LAST_TCP_UDP_FIELD)) | ||
1423 | return -ENOTSUPP; | ||
1424 | |||
1400 | type = ib_spec->type == IB_FLOW_SPEC_TCP ? | 1425 | type = ib_spec->type == IB_FLOW_SPEC_TCP ? |
1401 | MLX4_NET_TRANS_RULE_ID_TCP : | 1426 | MLX4_NET_TRANS_RULE_ID_TCP : |
1402 | MLX4_NET_TRANS_RULE_ID_UDP; | 1427 | MLX4_NET_TRANS_RULE_ID_UDP; |