Skip to content

Commit 209cf2a

Browse files
Sean Heftyrolandd
authored andcommitted
RDMA/ucma: Allow user space to pass AF_IB into resolve
Allow user space applications to call resolve_addr using AF_IB. To support sockaddr_ib, we need to define a new structure capable of handling the larger address size. Signed-off-by: Sean Hefty <[email protected]> Signed-off-by: Roland Dreier <[email protected]>
1 parent eebe4c3 commit 209cf2a

File tree

2 files changed

+41
-2
lines changed

2 files changed

+41
-2
lines changed

drivers/infiniband/core/ucma.c

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,33 @@ static ssize_t ucma_resolve_ip(struct ucma_file *file,
577577
return ret;
578578
}
579579

580+
static ssize_t ucma_resolve_addr(struct ucma_file *file,
581+
const char __user *inbuf,
582+
int in_len, int out_len)
583+
{
584+
struct rdma_ucm_resolve_addr cmd;
585+
struct sockaddr *src, *dst;
586+
struct ucma_context *ctx;
587+
int ret;
588+
589+
if (copy_from_user(&cmd, inbuf, sizeof(cmd)))
590+
return -EFAULT;
591+
592+
src = (struct sockaddr *) &cmd.src_addr;
593+
dst = (struct sockaddr *) &cmd.dst_addr;
594+
if (cmd.reserved || (cmd.src_size && (cmd.src_size != rdma_addr_size(src))) ||
595+
!cmd.dst_size || (cmd.dst_size != rdma_addr_size(dst)))
596+
return -EINVAL;
597+
598+
ctx = ucma_get_ctx(file, cmd.id);
599+
if (IS_ERR(ctx))
600+
return PTR_ERR(ctx);
601+
602+
ret = rdma_resolve_addr(ctx->cm_id, src, dst, cmd.timeout_ms);
603+
ucma_put_ctx(ctx);
604+
return ret;
605+
}
606+
580607
static ssize_t ucma_resolve_route(struct ucma_file *file,
581608
const char __user *inbuf,
582609
int in_len, int out_len)
@@ -1423,7 +1450,8 @@ static ssize_t (*ucma_cmd_table[])(struct ucma_file *file,
14231450
[RDMA_USER_CM_CMD_LEAVE_MCAST] = ucma_leave_multicast,
14241451
[RDMA_USER_CM_CMD_MIGRATE_ID] = ucma_migrate_id,
14251452
[RDMA_USER_CM_CMD_QUERY] = ucma_query,
1426-
[RDMA_USER_CM_CMD_BIND] = ucma_bind
1453+
[RDMA_USER_CM_CMD_BIND] = ucma_bind,
1454+
[RDMA_USER_CM_CMD_RESOLVE_ADDR] = ucma_resolve_addr
14271455
};
14281456

14291457
static ssize_t ucma_write(struct file *filp, const char __user *buf,

include/uapi/rdma/rdma_user_cm.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ enum {
6363
RDMA_USER_CM_CMD_LEAVE_MCAST,
6464
RDMA_USER_CM_CMD_MIGRATE_ID,
6565
RDMA_USER_CM_CMD_QUERY,
66-
RDMA_USER_CM_CMD_BIND
66+
RDMA_USER_CM_CMD_BIND,
67+
RDMA_USER_CM_CMD_RESOLVE_ADDR
6768
};
6869

6970
/*
@@ -117,6 +118,16 @@ struct rdma_ucm_resolve_ip {
117118
__u32 timeout_ms;
118119
};
119120

121+
struct rdma_ucm_resolve_addr {
122+
__u32 id;
123+
__u32 timeout_ms;
124+
__u16 src_size;
125+
__u16 dst_size;
126+
__u32 reserved;
127+
struct sockaddr_storage src_addr;
128+
struct sockaddr_storage dst_addr;
129+
};
130+
120131
struct rdma_ucm_resolve_route {
121132
__u32 id;
122133
__u32 timeout_ms;

0 commit comments

Comments
 (0)