aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaor Gottlieb <maorg@mellanox.com>2016-08-30 09:58:30 -0400
committerDoug Ledford <dledford@redhat.com>2016-10-07 16:54:16 -0400
commit1f02a09c38043f1c003ddbd144b6da7f269d0ca1 (patch)
tree0e4e40f5e74909e0fc473bf26878cf7826413695
parentcc0e5d42351de1f9233738697718d0eed4396536 (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.c25
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
1364static int parse_flow_attr(struct mlx4_dev *dev, 1377static 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;