]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/infiniband/core/cma.c
Merge branches 'pm-core', 'pm-qos', 'pm-domains' and 'pm-opp'
[linux.git] / drivers / infiniband / core / cma.c
index 2a6fc47a1dfbb578324ada2cd899ed22c4e1c8ad..3e70a9c5d79d5a50ba3be228cb4174d1f66c98d7 100644 (file)
@@ -101,6 +101,49 @@ const char *__attribute_const__ rdma_event_msg(enum rdma_cm_event_type event)
 }
 EXPORT_SYMBOL(rdma_event_msg);
 
+const char *__attribute_const__ rdma_reject_msg(struct rdma_cm_id *id,
+                                               int reason)
+{
+       if (rdma_ib_or_roce(id->device, id->port_num))
+               return ibcm_reject_msg(reason);
+
+       if (rdma_protocol_iwarp(id->device, id->port_num))
+               return iwcm_reject_msg(reason);
+
+       WARN_ON_ONCE(1);
+       return "unrecognized transport";
+}
+EXPORT_SYMBOL(rdma_reject_msg);
+
+bool rdma_is_consumer_reject(struct rdma_cm_id *id, int reason)
+{
+       if (rdma_ib_or_roce(id->device, id->port_num))
+               return reason == IB_CM_REJ_CONSUMER_DEFINED;
+
+       if (rdma_protocol_iwarp(id->device, id->port_num))
+               return reason == -ECONNREFUSED;
+
+       WARN_ON_ONCE(1);
+       return false;
+}
+EXPORT_SYMBOL(rdma_is_consumer_reject);
+
+const void *rdma_consumer_reject_data(struct rdma_cm_id *id,
+                                     struct rdma_cm_event *ev, u8 *data_len)
+{
+       const void *p;
+
+       if (rdma_is_consumer_reject(id, ev->status)) {
+               *data_len = ev->param.conn.private_data_len;
+               p = ev->param.conn.private_data;
+       } else {
+               *data_len = 0;
+               p = NULL;
+       }
+       return p;
+}
+EXPORT_SYMBOL(rdma_consumer_reject_data);
+
 static void cma_add_one(struct ib_device *device);
 static void cma_remove_one(struct ib_device *device, void *client_data);
 
@@ -116,7 +159,7 @@ static LIST_HEAD(dev_list);
 static LIST_HEAD(listen_any_list);
 static DEFINE_MUTEX(lock);
 static struct workqueue_struct *cma_wq;
-static int cma_pernet_id;
+static unsigned int cma_pernet_id;
 
 struct cma_pernet {
        struct idr tcp_ps;
@@ -2768,7 +2811,8 @@ static int cma_bind_addr(struct rdma_cm_id *id, struct sockaddr *src_addr,
        if (!src_addr || !src_addr->sa_family) {
                src_addr = (struct sockaddr *) &id->route.addr.src_addr;
                src_addr->sa_family = dst_addr->sa_family;
-               if (dst_addr->sa_family == AF_INET6) {
+               if (IS_ENABLED(CONFIG_IPV6) &&
+                   dst_addr->sa_family == AF_INET6) {
                        struct sockaddr_in6 *src_addr6 = (struct sockaddr_in6 *) src_addr;
                        struct sockaddr_in6 *dst_addr6 = (struct sockaddr_in6 *) dst_addr;
                        src_addr6->sin6_scope_id = dst_addr6->sin6_scope_id;