|
@@ -138,6 +138,7 @@ struct rdma_id_private {
|
|
u32 qkey;
|
|
u32 qkey;
|
|
u32 qp_num;
|
|
u32 qp_num;
|
|
u8 srq;
|
|
u8 srq;
|
|
|
|
+ u8 tos;
|
|
};
|
|
};
|
|
|
|
|
|
struct cma_multicast {
|
|
struct cma_multicast {
|
|
@@ -1474,6 +1475,15 @@ err:
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(rdma_listen);
|
|
EXPORT_SYMBOL(rdma_listen);
|
|
|
|
|
|
|
|
+void rdma_set_service_type(struct rdma_cm_id *id, int tos)
|
|
|
|
+{
|
|
|
|
+ struct rdma_id_private *id_priv;
|
|
|
|
+
|
|
|
|
+ id_priv = container_of(id, struct rdma_id_private, id);
|
|
|
|
+ id_priv->tos = (u8) tos;
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL(rdma_set_service_type);
|
|
|
|
+
|
|
static void cma_query_handler(int status, struct ib_sa_path_rec *path_rec,
|
|
static void cma_query_handler(int status, struct ib_sa_path_rec *path_rec,
|
|
void *context)
|
|
void *context)
|
|
{
|
|
{
|
|
@@ -1498,23 +1508,37 @@ static void cma_query_handler(int status, struct ib_sa_path_rec *path_rec,
|
|
static int cma_query_ib_route(struct rdma_id_private *id_priv, int timeout_ms,
|
|
static int cma_query_ib_route(struct rdma_id_private *id_priv, int timeout_ms,
|
|
struct cma_work *work)
|
|
struct cma_work *work)
|
|
{
|
|
{
|
|
- struct rdma_dev_addr *addr = &id_priv->id.route.addr.dev_addr;
|
|
|
|
|
|
+ struct rdma_addr *addr = &id_priv->id.route.addr;
|
|
struct ib_sa_path_rec path_rec;
|
|
struct ib_sa_path_rec path_rec;
|
|
|
|
+ ib_sa_comp_mask comp_mask;
|
|
|
|
+ struct sockaddr_in6 *sin6;
|
|
|
|
|
|
memset(&path_rec, 0, sizeof path_rec);
|
|
memset(&path_rec, 0, sizeof path_rec);
|
|
- ib_addr_get_sgid(addr, &path_rec.sgid);
|
|
|
|
- ib_addr_get_dgid(addr, &path_rec.dgid);
|
|
|
|
- path_rec.pkey = cpu_to_be16(ib_addr_get_pkey(addr));
|
|
|
|
|
|
+ ib_addr_get_sgid(&addr->dev_addr, &path_rec.sgid);
|
|
|
|
+ ib_addr_get_dgid(&addr->dev_addr, &path_rec.dgid);
|
|
|
|
+ path_rec.pkey = cpu_to_be16(ib_addr_get_pkey(&addr->dev_addr));
|
|
path_rec.numb_path = 1;
|
|
path_rec.numb_path = 1;
|
|
path_rec.reversible = 1;
|
|
path_rec.reversible = 1;
|
|
|
|
+ path_rec.service_id = cma_get_service_id(id_priv->id.ps, &addr->dst_addr);
|
|
|
|
+
|
|
|
|
+ comp_mask = IB_SA_PATH_REC_DGID | IB_SA_PATH_REC_SGID |
|
|
|
|
+ IB_SA_PATH_REC_PKEY | IB_SA_PATH_REC_NUMB_PATH |
|
|
|
|
+ IB_SA_PATH_REC_REVERSIBLE | IB_SA_PATH_REC_SERVICE_ID;
|
|
|
|
+
|
|
|
|
+ if (addr->src_addr.sa_family == AF_INET) {
|
|
|
|
+ path_rec.qos_class = cpu_to_be16((u16) id_priv->tos);
|
|
|
|
+ comp_mask |= IB_SA_PATH_REC_QOS_CLASS;
|
|
|
|
+ } else {
|
|
|
|
+ sin6 = (struct sockaddr_in6 *) &addr->src_addr;
|
|
|
|
+ path_rec.traffic_class = (u8) (be32_to_cpu(sin6->sin6_flowinfo) >> 20);
|
|
|
|
+ comp_mask |= IB_SA_PATH_REC_TRAFFIC_CLASS;
|
|
|
|
+ }
|
|
|
|
|
|
id_priv->query_id = ib_sa_path_rec_get(&sa_client, id_priv->id.device,
|
|
id_priv->query_id = ib_sa_path_rec_get(&sa_client, id_priv->id.device,
|
|
- id_priv->id.port_num, &path_rec,
|
|
|
|
- IB_SA_PATH_REC_DGID | IB_SA_PATH_REC_SGID |
|
|
|
|
- IB_SA_PATH_REC_PKEY | IB_SA_PATH_REC_NUMB_PATH |
|
|
|
|
- IB_SA_PATH_REC_REVERSIBLE,
|
|
|
|
- timeout_ms, GFP_KERNEL,
|
|
|
|
- cma_query_handler, work, &id_priv->query);
|
|
|
|
|
|
+ id_priv->id.port_num, &path_rec,
|
|
|
|
+ comp_mask, timeout_ms,
|
|
|
|
+ GFP_KERNEL, cma_query_handler,
|
|
|
|
+ work, &id_priv->query);
|
|
|
|
|
|
return (id_priv->query_id < 0) ? id_priv->query_id : 0;
|
|
return (id_priv->query_id < 0) ? id_priv->query_id : 0;
|
|
}
|
|
}
|