提交 24d44a39 编写于 作者: S Steve Wise 提交者: Roland Dreier

RDMA/cma: Add IPv6 support for iWARP

Modify the type of local_addr and remote_addr fields in struct
iw_cm_id from struct sockaddr_in to struct sockaddr_storage to hold
IPv6 and IPv4 addresses uniformly.

Change the references of local_addr and remote_addr in cxgb4, cxgb3,
nes and amso drivers to match this.  However to be able to actully run
traffic over IPv6, low-level drivers have to add code to support this.
Signed-off-by: NSteve Wise <swise@opengridcomputing.com>
Reviewed-by: NSean Hefty <sean.hefty@intel.com>

[ Fix unused variable warnings when INFINIBAND_NES_DEBUG not set.
  - Roland ]
Signed-off-by: NRoland Dreier <roland@purestorage.com>
上级 c095ba72
...@@ -1385,8 +1385,9 @@ static int cma_iw_handler(struct iw_cm_id *iw_id, struct iw_cm_event *iw_event) ...@@ -1385,8 +1385,9 @@ static int cma_iw_handler(struct iw_cm_id *iw_id, struct iw_cm_event *iw_event)
{ {
struct rdma_id_private *id_priv = iw_id->context; struct rdma_id_private *id_priv = iw_id->context;
struct rdma_cm_event event; struct rdma_cm_event event;
struct sockaddr_in *sin;
int ret = 0; int ret = 0;
struct sockaddr *laddr = (struct sockaddr *)&iw_event->local_addr;
struct sockaddr *raddr = (struct sockaddr *)&iw_event->remote_addr;
if (cma_disable_callback(id_priv, RDMA_CM_CONNECT)) if (cma_disable_callback(id_priv, RDMA_CM_CONNECT))
return 0; return 0;
...@@ -1397,10 +1398,10 @@ static int cma_iw_handler(struct iw_cm_id *iw_id, struct iw_cm_event *iw_event) ...@@ -1397,10 +1398,10 @@ static int cma_iw_handler(struct iw_cm_id *iw_id, struct iw_cm_event *iw_event)
event.event = RDMA_CM_EVENT_DISCONNECTED; event.event = RDMA_CM_EVENT_DISCONNECTED;
break; break;
case IW_CM_EVENT_CONNECT_REPLY: case IW_CM_EVENT_CONNECT_REPLY:
sin = (struct sockaddr_in *) cma_src_addr(id_priv); memcpy(cma_src_addr(id_priv), laddr,
*sin = iw_event->local_addr; rdma_addr_size(laddr));
sin = (struct sockaddr_in *) cma_dst_addr(id_priv); memcpy(cma_dst_addr(id_priv), raddr,
*sin = iw_event->remote_addr; rdma_addr_size(raddr));
switch (iw_event->status) { switch (iw_event->status) {
case 0: case 0:
event.event = RDMA_CM_EVENT_ESTABLISHED; event.event = RDMA_CM_EVENT_ESTABLISHED;
...@@ -1450,11 +1451,12 @@ static int iw_conn_req_handler(struct iw_cm_id *cm_id, ...@@ -1450,11 +1451,12 @@ static int iw_conn_req_handler(struct iw_cm_id *cm_id,
{ {
struct rdma_cm_id *new_cm_id; struct rdma_cm_id *new_cm_id;
struct rdma_id_private *listen_id, *conn_id; struct rdma_id_private *listen_id, *conn_id;
struct sockaddr_in *sin;
struct net_device *dev = NULL; struct net_device *dev = NULL;
struct rdma_cm_event event; struct rdma_cm_event event;
int ret; int ret;
struct ib_device_attr attr; struct ib_device_attr attr;
struct sockaddr *laddr = (struct sockaddr *)&iw_event->local_addr;
struct sockaddr *raddr = (struct sockaddr *)&iw_event->remote_addr;
listen_id = cm_id->context; listen_id = cm_id->context;
if (cma_disable_callback(listen_id, RDMA_CM_LISTEN)) if (cma_disable_callback(listen_id, RDMA_CM_LISTEN))
...@@ -1472,14 +1474,7 @@ static int iw_conn_req_handler(struct iw_cm_id *cm_id, ...@@ -1472,14 +1474,7 @@ static int iw_conn_req_handler(struct iw_cm_id *cm_id,
mutex_lock_nested(&conn_id->handler_mutex, SINGLE_DEPTH_NESTING); mutex_lock_nested(&conn_id->handler_mutex, SINGLE_DEPTH_NESTING);
conn_id->state = RDMA_CM_CONNECT; conn_id->state = RDMA_CM_CONNECT;
dev = ip_dev_find(&init_net, iw_event->local_addr.sin_addr.s_addr); ret = rdma_translate_ip(laddr, &conn_id->id.route.addr.dev_addr);
if (!dev) {
ret = -EADDRNOTAVAIL;
mutex_unlock(&conn_id->handler_mutex);
rdma_destroy_id(new_cm_id);
goto out;
}
ret = rdma_copy_addr(&conn_id->id.route.addr.dev_addr, dev, NULL);
if (ret) { if (ret) {
mutex_unlock(&conn_id->handler_mutex); mutex_unlock(&conn_id->handler_mutex);
rdma_destroy_id(new_cm_id); rdma_destroy_id(new_cm_id);
...@@ -1497,10 +1492,8 @@ static int iw_conn_req_handler(struct iw_cm_id *cm_id, ...@@ -1497,10 +1492,8 @@ static int iw_conn_req_handler(struct iw_cm_id *cm_id,
cm_id->context = conn_id; cm_id->context = conn_id;
cm_id->cm_handler = cma_iw_handler; cm_id->cm_handler = cma_iw_handler;
sin = (struct sockaddr_in *) cma_src_addr(conn_id); memcpy(cma_src_addr(conn_id), laddr, rdma_addr_size(laddr));
*sin = iw_event->local_addr; memcpy(cma_dst_addr(conn_id), raddr, rdma_addr_size(raddr));
sin = (struct sockaddr_in *) cma_dst_addr(conn_id);
*sin = iw_event->remote_addr;
ret = ib_query_device(conn_id->id.device, &attr); ret = ib_query_device(conn_id->id.device, &attr);
if (ret) { if (ret) {
...@@ -1576,7 +1569,6 @@ static int cma_ib_listen(struct rdma_id_private *id_priv) ...@@ -1576,7 +1569,6 @@ static int cma_ib_listen(struct rdma_id_private *id_priv)
static int cma_iw_listen(struct rdma_id_private *id_priv, int backlog) static int cma_iw_listen(struct rdma_id_private *id_priv, int backlog)
{ {
int ret; int ret;
struct sockaddr_in *sin;
struct iw_cm_id *id; struct iw_cm_id *id;
id = iw_create_cm_id(id_priv->id.device, id = iw_create_cm_id(id_priv->id.device,
...@@ -1587,8 +1579,8 @@ static int cma_iw_listen(struct rdma_id_private *id_priv, int backlog) ...@@ -1587,8 +1579,8 @@ static int cma_iw_listen(struct rdma_id_private *id_priv, int backlog)
id_priv->cm_id.iw = id; id_priv->cm_id.iw = id;
sin = (struct sockaddr_in *) cma_src_addr(id_priv); memcpy(&id_priv->cm_id.iw->local_addr, cma_src_addr(id_priv),
id_priv->cm_id.iw->local_addr = *sin; rdma_addr_size(cma_src_addr(id_priv)));
ret = iw_cm_listen(id_priv->cm_id.iw, backlog); ret = iw_cm_listen(id_priv->cm_id.iw, backlog);
...@@ -2803,7 +2795,6 @@ static int cma_connect_iw(struct rdma_id_private *id_priv, ...@@ -2803,7 +2795,6 @@ static int cma_connect_iw(struct rdma_id_private *id_priv,
struct rdma_conn_param *conn_param) struct rdma_conn_param *conn_param)
{ {
struct iw_cm_id *cm_id; struct iw_cm_id *cm_id;
struct sockaddr_in* sin;
int ret; int ret;
struct iw_cm_conn_param iw_param; struct iw_cm_conn_param iw_param;
...@@ -2813,11 +2804,10 @@ static int cma_connect_iw(struct rdma_id_private *id_priv, ...@@ -2813,11 +2804,10 @@ static int cma_connect_iw(struct rdma_id_private *id_priv,
id_priv->cm_id.iw = cm_id; id_priv->cm_id.iw = cm_id;
sin = (struct sockaddr_in *) cma_src_addr(id_priv); memcpy(&cm_id->local_addr, cma_src_addr(id_priv),
cm_id->local_addr = *sin; rdma_addr_size(cma_src_addr(id_priv)));
memcpy(&cm_id->remote_addr, cma_dst_addr(id_priv),
sin = (struct sockaddr_in *) cma_dst_addr(id_priv); rdma_addr_size(cma_dst_addr(id_priv)));
cm_id->remote_addr = *sin;
ret = cma_modify_qp_rtr(id_priv, conn_param); ret = cma_modify_qp_rtr(id_priv, conn_param);
if (ret) if (ret)
......
...@@ -155,6 +155,8 @@ void c2_ae_event(struct c2_dev *c2dev, u32 mq_index) ...@@ -155,6 +155,8 @@ void c2_ae_event(struct c2_dev *c2dev, u32 mq_index)
enum c2_event_id event_id; enum c2_event_id event_id;
unsigned long flags; unsigned long flags;
int status; int status;
struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_event.local_addr;
struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_event.remote_addr;
/* /*
* retrieve the message * retrieve the message
...@@ -206,10 +208,10 @@ void c2_ae_event(struct c2_dev *c2dev, u32 mq_index) ...@@ -206,10 +208,10 @@ void c2_ae_event(struct c2_dev *c2dev, u32 mq_index)
case CCAE_ACTIVE_CONNECT_RESULTS: case CCAE_ACTIVE_CONNECT_RESULTS:
res = &wr->ae.ae_active_connect_results; res = &wr->ae.ae_active_connect_results;
cm_event.event = IW_CM_EVENT_CONNECT_REPLY; cm_event.event = IW_CM_EVENT_CONNECT_REPLY;
cm_event.local_addr.sin_addr.s_addr = res->laddr; laddr->sin_addr.s_addr = res->laddr;
cm_event.remote_addr.sin_addr.s_addr = res->raddr; raddr->sin_addr.s_addr = res->raddr;
cm_event.local_addr.sin_port = res->lport; laddr->sin_port = res->lport;
cm_event.remote_addr.sin_port = res->rport; raddr->sin_port = res->rport;
if (status == 0) { if (status == 0) {
cm_event.private_data_len = cm_event.private_data_len =
be32_to_cpu(res->private_data_length); be32_to_cpu(res->private_data_length);
...@@ -281,10 +283,10 @@ void c2_ae_event(struct c2_dev *c2dev, u32 mq_index) ...@@ -281,10 +283,10 @@ void c2_ae_event(struct c2_dev *c2dev, u32 mq_index)
} }
cm_event.event = IW_CM_EVENT_CONNECT_REQUEST; cm_event.event = IW_CM_EVENT_CONNECT_REQUEST;
cm_event.provider_data = (void*)(unsigned long)req->cr_handle; cm_event.provider_data = (void*)(unsigned long)req->cr_handle;
cm_event.local_addr.sin_addr.s_addr = req->laddr; laddr->sin_addr.s_addr = req->laddr;
cm_event.remote_addr.sin_addr.s_addr = req->raddr; raddr->sin_addr.s_addr = req->raddr;
cm_event.local_addr.sin_port = req->lport; laddr->sin_port = req->lport;
cm_event.remote_addr.sin_port = req->rport; raddr->sin_port = req->rport;
cm_event.private_data_len = cm_event.private_data_len =
be32_to_cpu(req->private_data_length); be32_to_cpu(req->private_data_length);
cm_event.private_data = req->private_data; cm_event.private_data = req->private_data;
......
...@@ -46,6 +46,10 @@ int c2_llp_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *iw_param) ...@@ -46,6 +46,10 @@ int c2_llp_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *iw_param)
struct c2wr_qp_connect_req *wr; /* variable size needs a malloc. */ struct c2wr_qp_connect_req *wr; /* variable size needs a malloc. */
struct c2_vq_req *vq_req; struct c2_vq_req *vq_req;
int err; int err;
struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->remote_addr;
if (cm_id->remote_addr.ss_family != AF_INET)
return -ENOSYS;
ibqp = c2_get_qp(cm_id->device, iw_param->qpn); ibqp = c2_get_qp(cm_id->device, iw_param->qpn);
if (!ibqp) if (!ibqp)
...@@ -91,8 +95,8 @@ int c2_llp_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *iw_param) ...@@ -91,8 +95,8 @@ int c2_llp_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *iw_param)
wr->rnic_handle = c2dev->adapter_handle; wr->rnic_handle = c2dev->adapter_handle;
wr->qp_handle = qp->adapter_handle; wr->qp_handle = qp->adapter_handle;
wr->remote_addr = cm_id->remote_addr.sin_addr.s_addr; wr->remote_addr = raddr->sin_addr.s_addr;
wr->remote_port = cm_id->remote_addr.sin_port; wr->remote_port = raddr->sin_port;
/* /*
* Move any private data from the callers's buf into * Move any private data from the callers's buf into
...@@ -135,6 +139,10 @@ int c2_llp_service_create(struct iw_cm_id *cm_id, int backlog) ...@@ -135,6 +139,10 @@ int c2_llp_service_create(struct iw_cm_id *cm_id, int backlog)
struct c2wr_ep_listen_create_rep *reply; struct c2wr_ep_listen_create_rep *reply;
struct c2_vq_req *vq_req; struct c2_vq_req *vq_req;
int err; int err;
struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->local_addr;
if (cm_id->local_addr.ss_family != AF_INET)
return -ENOSYS;
c2dev = to_c2dev(cm_id->device); c2dev = to_c2dev(cm_id->device);
if (c2dev == NULL) if (c2dev == NULL)
...@@ -153,8 +161,8 @@ int c2_llp_service_create(struct iw_cm_id *cm_id, int backlog) ...@@ -153,8 +161,8 @@ int c2_llp_service_create(struct iw_cm_id *cm_id, int backlog)
c2_wr_set_id(&wr, CCWR_EP_LISTEN_CREATE); c2_wr_set_id(&wr, CCWR_EP_LISTEN_CREATE);
wr.hdr.context = (u64) (unsigned long) vq_req; wr.hdr.context = (u64) (unsigned long) vq_req;
wr.rnic_handle = c2dev->adapter_handle; wr.rnic_handle = c2dev->adapter_handle;
wr.local_addr = cm_id->local_addr.sin_addr.s_addr; wr.local_addr = laddr->sin_addr.s_addr;
wr.local_port = cm_id->local_addr.sin_port; wr.local_port = laddr->sin_port;
wr.backlog = cpu_to_be32(backlog); wr.backlog = cpu_to_be32(backlog);
wr.user_context = (u64) (unsigned long) cm_id; wr.user_context = (u64) (unsigned long) cm_id;
......
...@@ -721,8 +721,10 @@ static void connect_reply_upcall(struct iwch_ep *ep, int status) ...@@ -721,8 +721,10 @@ static void connect_reply_upcall(struct iwch_ep *ep, int status)
memset(&event, 0, sizeof(event)); memset(&event, 0, sizeof(event));
event.event = IW_CM_EVENT_CONNECT_REPLY; event.event = IW_CM_EVENT_CONNECT_REPLY;
event.status = status; event.status = status;
event.local_addr = ep->com.local_addr; memcpy(&event.local_addr, &ep->com.local_addr,
event.remote_addr = ep->com.remote_addr; sizeof(ep->com.local_addr));
memcpy(&event.remote_addr, &ep->com.remote_addr,
sizeof(ep->com.remote_addr));
if ((status == 0) || (status == -ECONNREFUSED)) { if ((status == 0) || (status == -ECONNREFUSED)) {
event.private_data_len = ep->plen; event.private_data_len = ep->plen;
...@@ -747,8 +749,10 @@ static void connect_request_upcall(struct iwch_ep *ep) ...@@ -747,8 +749,10 @@ static void connect_request_upcall(struct iwch_ep *ep)
PDBG("%s ep %p tid %d\n", __func__, ep, ep->hwtid); PDBG("%s ep %p tid %d\n", __func__, ep, ep->hwtid);
memset(&event, 0, sizeof(event)); memset(&event, 0, sizeof(event));
event.event = IW_CM_EVENT_CONNECT_REQUEST; event.event = IW_CM_EVENT_CONNECT_REQUEST;
event.local_addr = ep->com.local_addr; memcpy(&event.local_addr, &ep->com.local_addr,
event.remote_addr = ep->com.remote_addr; sizeof(ep->com.local_addr));
memcpy(&event.remote_addr, &ep->com.remote_addr,
sizeof(ep->com.local_addr));
event.private_data_len = ep->plen; event.private_data_len = ep->plen;
event.private_data = ep->mpa_pkt + sizeof(struct mpa_message); event.private_data = ep->mpa_pkt + sizeof(struct mpa_message);
event.provider_data = ep; event.provider_data = ep;
...@@ -1872,8 +1876,9 @@ int iwch_accept_cr(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -1872,8 +1876,9 @@ int iwch_accept_cr(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
static int is_loopback_dst(struct iw_cm_id *cm_id) static int is_loopback_dst(struct iw_cm_id *cm_id)
{ {
struct net_device *dev; struct net_device *dev;
struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->remote_addr;
dev = ip_dev_find(&init_net, cm_id->remote_addr.sin_addr.s_addr); dev = ip_dev_find(&init_net, raddr->sin_addr.s_addr);
if (!dev) if (!dev)
return 0; return 0;
dev_put(dev); dev_put(dev);
...@@ -1886,6 +1891,13 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -1886,6 +1891,13 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
struct iwch_ep *ep; struct iwch_ep *ep;
struct rtable *rt; struct rtable *rt;
int err = 0; int err = 0;
struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->local_addr;
struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->remote_addr;
if (cm_id->remote_addr.ss_family != PF_INET) {
err = -ENOSYS;
goto out;
}
if (is_loopback_dst(cm_id)) { if (is_loopback_dst(cm_id)) {
err = -ENOSYS; err = -ENOSYS;
...@@ -1929,11 +1941,9 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -1929,11 +1941,9 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
} }
/* find a route */ /* find a route */
rt = find_route(h->rdev.t3cdev_p, rt = find_route(h->rdev.t3cdev_p, laddr->sin_addr.s_addr,
cm_id->local_addr.sin_addr.s_addr, raddr->sin_addr.s_addr, laddr->sin_port,
cm_id->remote_addr.sin_addr.s_addr, raddr->sin_port, IPTOS_LOWDELAY);
cm_id->local_addr.sin_port,
cm_id->remote_addr.sin_port, IPTOS_LOWDELAY);
if (!rt) { if (!rt) {
printk(KERN_ERR MOD "%s - cannot find route.\n", __func__); printk(KERN_ERR MOD "%s - cannot find route.\n", __func__);
err = -EHOSTUNREACH; err = -EHOSTUNREACH;
...@@ -1941,7 +1951,7 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -1941,7 +1951,7 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
} }
ep->dst = &rt->dst; ep->dst = &rt->dst;
ep->l2t = t3_l2t_get(ep->com.tdev, ep->dst, NULL, ep->l2t = t3_l2t_get(ep->com.tdev, ep->dst, NULL,
&cm_id->remote_addr.sin_addr.s_addr); &raddr->sin_addr.s_addr);
if (!ep->l2t) { if (!ep->l2t) {
printk(KERN_ERR MOD "%s - cannot alloc l2e.\n", __func__); printk(KERN_ERR MOD "%s - cannot alloc l2e.\n", __func__);
err = -ENOMEM; err = -ENOMEM;
...@@ -1950,8 +1960,10 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -1950,8 +1960,10 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
state_set(&ep->com, CONNECTING); state_set(&ep->com, CONNECTING);
ep->tos = IPTOS_LOWDELAY; ep->tos = IPTOS_LOWDELAY;
ep->com.local_addr = cm_id->local_addr; memcpy(&ep->com.local_addr, &cm_id->local_addr,
ep->com.remote_addr = cm_id->remote_addr; sizeof(ep->com.local_addr));
memcpy(&ep->com.remote_addr, &cm_id->remote_addr,
sizeof(ep->com.remote_addr));
/* send connect request to rnic */ /* send connect request to rnic */
err = send_connect(ep); err = send_connect(ep);
...@@ -1979,6 +1991,11 @@ int iwch_create_listen(struct iw_cm_id *cm_id, int backlog) ...@@ -1979,6 +1991,11 @@ int iwch_create_listen(struct iw_cm_id *cm_id, int backlog)
might_sleep(); might_sleep();
if (cm_id->local_addr.ss_family != PF_INET) {
err = -ENOSYS;
goto fail1;
}
ep = alloc_ep(sizeof(*ep), GFP_KERNEL); ep = alloc_ep(sizeof(*ep), GFP_KERNEL);
if (!ep) { if (!ep) {
printk(KERN_ERR MOD "%s - cannot alloc ep.\n", __func__); printk(KERN_ERR MOD "%s - cannot alloc ep.\n", __func__);
...@@ -1990,7 +2007,8 @@ int iwch_create_listen(struct iw_cm_id *cm_id, int backlog) ...@@ -1990,7 +2007,8 @@ int iwch_create_listen(struct iw_cm_id *cm_id, int backlog)
cm_id->add_ref(cm_id); cm_id->add_ref(cm_id);
ep->com.cm_id = cm_id; ep->com.cm_id = cm_id;
ep->backlog = backlog; ep->backlog = backlog;
ep->com.local_addr = cm_id->local_addr; memcpy(&ep->com.local_addr, &cm_id->local_addr,
sizeof(ep->com.local_addr));
/* /*
* Allocate a server TID. * Allocate a server TID.
......
...@@ -952,8 +952,10 @@ static void connect_reply_upcall(struct c4iw_ep *ep, int status) ...@@ -952,8 +952,10 @@ static void connect_reply_upcall(struct c4iw_ep *ep, int status)
memset(&event, 0, sizeof(event)); memset(&event, 0, sizeof(event));
event.event = IW_CM_EVENT_CONNECT_REPLY; event.event = IW_CM_EVENT_CONNECT_REPLY;
event.status = status; event.status = status;
event.local_addr = ep->com.local_addr; memcpy(&event.local_addr, &ep->com.local_addr,
event.remote_addr = ep->com.remote_addr; sizeof(ep->com.local_addr));
memcpy(&event.remote_addr, &ep->com.remote_addr,
sizeof(ep->com.remote_addr));
if ((status == 0) || (status == -ECONNREFUSED)) { if ((status == 0) || (status == -ECONNREFUSED)) {
if (!ep->tried_with_mpa_v1) { if (!ep->tried_with_mpa_v1) {
...@@ -989,8 +991,10 @@ static void connect_request_upcall(struct c4iw_ep *ep) ...@@ -989,8 +991,10 @@ static void connect_request_upcall(struct c4iw_ep *ep)
PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid); PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid);
memset(&event, 0, sizeof(event)); memset(&event, 0, sizeof(event));
event.event = IW_CM_EVENT_CONNECT_REQUEST; event.event = IW_CM_EVENT_CONNECT_REQUEST;
event.local_addr = ep->com.local_addr; memcpy(&event.local_addr, &ep->com.local_addr,
event.remote_addr = ep->com.remote_addr; sizeof(ep->com.local_addr));
memcpy(&event.remote_addr, &ep->com.remote_addr,
sizeof(ep->com.remote_addr));
event.provider_data = ep; event.provider_data = ep;
if (!ep->tried_with_mpa_v1) { if (!ep->tried_with_mpa_v1) {
/* this means MPA_v2 is used */ /* this means MPA_v2 is used */
...@@ -1568,6 +1572,10 @@ static int c4iw_reconnect(struct c4iw_ep *ep) ...@@ -1568,6 +1572,10 @@ static int c4iw_reconnect(struct c4iw_ep *ep)
struct net_device *pdev; struct net_device *pdev;
int step; int step;
struct neighbour *neigh; struct neighbour *neigh;
struct sockaddr_in *laddr = (struct sockaddr_in *)
&ep->com.cm_id->local_addr;
struct sockaddr_in *raddr = (struct sockaddr_in *)
&ep->com.cm_id->remote_addr;
PDBG("%s qp %p cm_id %p\n", __func__, ep->com.qp, ep->com.cm_id); PDBG("%s qp %p cm_id %p\n", __func__, ep->com.qp, ep->com.cm_id);
init_timer(&ep->timer); init_timer(&ep->timer);
...@@ -1585,10 +1593,8 @@ static int c4iw_reconnect(struct c4iw_ep *ep) ...@@ -1585,10 +1593,8 @@ static int c4iw_reconnect(struct c4iw_ep *ep)
/* find a route */ /* find a route */
rt = find_route(ep->com.dev, rt = find_route(ep->com.dev,
ep->com.cm_id->local_addr.sin_addr.s_addr, laddr->sin_addr.s_addr, raddr->sin_addr.s_addr,
ep->com.cm_id->remote_addr.sin_addr.s_addr, laddr->sin_port, raddr->sin_port, 0);
ep->com.cm_id->local_addr.sin_port,
ep->com.cm_id->remote_addr.sin_port, 0);
if (!rt) { if (!rt) {
pr_err("%s - cannot find route.\n", __func__); pr_err("%s - cannot find route.\n", __func__);
err = -EHOSTUNREACH; err = -EHOSTUNREACH;
...@@ -1596,8 +1602,7 @@ static int c4iw_reconnect(struct c4iw_ep *ep) ...@@ -1596,8 +1602,7 @@ static int c4iw_reconnect(struct c4iw_ep *ep)
} }
ep->dst = &rt->dst; ep->dst = &rt->dst;
neigh = dst_neigh_lookup(ep->dst, neigh = dst_neigh_lookup(ep->dst, &raddr->sin_addr.s_addr);
&ep->com.cm_id->remote_addr.sin_addr.s_addr);
if (!neigh) { if (!neigh) {
pr_err("%s - cannot alloc neigh.\n", __func__); pr_err("%s - cannot alloc neigh.\n", __func__);
err = -ENOMEM; err = -ENOMEM;
...@@ -1607,8 +1612,7 @@ static int c4iw_reconnect(struct c4iw_ep *ep) ...@@ -1607,8 +1612,7 @@ static int c4iw_reconnect(struct c4iw_ep *ep)
/* get a l2t entry */ /* get a l2t entry */
if (neigh->dev->flags & IFF_LOOPBACK) { if (neigh->dev->flags & IFF_LOOPBACK) {
PDBG("%s LOOPBACK\n", __func__); PDBG("%s LOOPBACK\n", __func__);
pdev = ip_dev_find(&init_net, pdev = ip_dev_find(&init_net, raddr->sin_addr.s_addr);
ep->com.cm_id->remote_addr.sin_addr.s_addr);
ep->l2t = cxgb4_l2t_get(ep->com.dev->rdev.lldi.l2t, ep->l2t = cxgb4_l2t_get(ep->com.dev->rdev.lldi.l2t,
neigh, pdev, 0); neigh, pdev, 0);
pi = (struct port_info *)netdev_priv(pdev); pi = (struct port_info *)netdev_priv(pdev);
...@@ -2518,6 +2522,8 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -2518,6 +2522,8 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
struct c4iw_ep *ep; struct c4iw_ep *ep;
struct rtable *rt; struct rtable *rt;
int err = 0; int err = 0;
struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->local_addr;
struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->remote_addr;
if ((conn_param->ord > c4iw_max_read_depth) || if ((conn_param->ord > c4iw_max_read_depth) ||
(conn_param->ird > c4iw_max_read_depth)) { (conn_param->ird > c4iw_max_read_depth)) {
...@@ -2562,17 +2568,12 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -2562,17 +2568,12 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
insert_handle(dev, &dev->atid_idr, ep, ep->atid); insert_handle(dev, &dev->atid_idr, ep, ep->atid);
PDBG("%s saddr 0x%x sport 0x%x raddr 0x%x rport 0x%x\n", __func__, PDBG("%s saddr 0x%x sport 0x%x raddr 0x%x rport 0x%x\n", __func__,
ntohl(cm_id->local_addr.sin_addr.s_addr), ntohl(laddr->sin_addr.s_addr), ntohs(laddr->sin_port),
ntohs(cm_id->local_addr.sin_port), ntohl(raddr->sin_addr.s_addr), ntohs(raddr->sin_port));
ntohl(cm_id->remote_addr.sin_addr.s_addr),
ntohs(cm_id->remote_addr.sin_port));
/* find a route */ /* find a route */
rt = find_route(dev, rt = find_route(dev, laddr->sin_addr.s_addr, raddr->sin_addr.s_addr,
cm_id->local_addr.sin_addr.s_addr, laddr->sin_port, raddr->sin_port, 0);
cm_id->remote_addr.sin_addr.s_addr,
cm_id->local_addr.sin_port,
cm_id->remote_addr.sin_port, 0);
if (!rt) { if (!rt) {
printk(KERN_ERR MOD "%s - cannot find route.\n", __func__); printk(KERN_ERR MOD "%s - cannot find route.\n", __func__);
err = -EHOSTUNREACH; err = -EHOSTUNREACH;
...@@ -2580,8 +2581,7 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -2580,8 +2581,7 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
} }
ep->dst = &rt->dst; ep->dst = &rt->dst;
err = import_ep(ep, cm_id->remote_addr.sin_addr.s_addr, err = import_ep(ep, raddr->sin_addr.s_addr, ep->dst, ep->com.dev, true);
ep->dst, ep->com.dev, true);
if (err) { if (err) {
printk(KERN_ERR MOD "%s - cannot alloc l2e.\n", __func__); printk(KERN_ERR MOD "%s - cannot alloc l2e.\n", __func__);
goto fail4; goto fail4;
...@@ -2593,8 +2593,10 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -2593,8 +2593,10 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
state_set(&ep->com, CONNECTING); state_set(&ep->com, CONNECTING);
ep->tos = 0; ep->tos = 0;
ep->com.local_addr = cm_id->local_addr; memcpy(&ep->com.local_addr, &cm_id->local_addr,
ep->com.remote_addr = cm_id->remote_addr; sizeof(ep->com.local_addr));
memcpy(&ep->com.remote_addr, &cm_id->remote_addr,
sizeof(ep->com.remote_addr));
/* send connect request to rnic */ /* send connect request to rnic */
err = send_connect(ep); err = send_connect(ep);
...@@ -2633,7 +2635,8 @@ int c4iw_create_listen(struct iw_cm_id *cm_id, int backlog) ...@@ -2633,7 +2635,8 @@ int c4iw_create_listen(struct iw_cm_id *cm_id, int backlog)
ep->com.cm_id = cm_id; ep->com.cm_id = cm_id;
ep->com.dev = dev; ep->com.dev = dev;
ep->backlog = backlog; ep->backlog = backlog;
ep->com.local_addr = cm_id->local_addr; memcpy(&ep->com.local_addr, &cm_id->local_addr,
sizeof(ep->com.local_addr));
/* /*
* Allocate a server TID. * Allocate a server TID.
......
...@@ -2998,6 +2998,8 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -2998,6 +2998,8 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
u8 *start_ptr = &start_addr; u8 *start_ptr = &start_addr;
u8 **start_buff = &start_ptr; u8 **start_buff = &start_ptr;
u16 buff_len = 0; u16 buff_len = 0;
struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->local_addr;
struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->remote_addr;
ibqp = nes_get_qp(cm_id->device, conn_param->qpn); ibqp = nes_get_qp(cm_id->device, conn_param->qpn);
if (!ibqp) if (!ibqp)
...@@ -3062,8 +3064,7 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -3062,8 +3064,7 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
/* setup our first outgoing iWarp send WQE (the IETF frame response) */ /* setup our first outgoing iWarp send WQE (the IETF frame response) */
wqe = &nesqp->hwqp.sq_vbase[0]; wqe = &nesqp->hwqp.sq_vbase[0];
if (cm_id->remote_addr.sin_addr.s_addr != if (raddr->sin_addr.s_addr != laddr->sin_addr.s_addr) {
cm_id->local_addr.sin_addr.s_addr) {
u64temp = (unsigned long)nesqp; u64temp = (unsigned long)nesqp;
nesibdev = nesvnic->nesibdev; nesibdev = nesvnic->nesibdev;
nespd = nesqp->nespd; nespd = nesqp->nespd;
...@@ -3132,13 +3133,10 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -3132,13 +3133,10 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
nes_cm_init_tsa_conn(nesqp, cm_node); nes_cm_init_tsa_conn(nesqp, cm_node);
nesqp->nesqp_context->tcpPorts[0] = nesqp->nesqp_context->tcpPorts[0] = cpu_to_le16(ntohs(laddr->sin_port));
cpu_to_le16(ntohs(cm_id->local_addr.sin_port)); nesqp->nesqp_context->tcpPorts[1] = cpu_to_le16(ntohs(raddr->sin_port));
nesqp->nesqp_context->tcpPorts[1] =
cpu_to_le16(ntohs(cm_id->remote_addr.sin_port));
nesqp->nesqp_context->ip0 = nesqp->nesqp_context->ip0 = cpu_to_le32(ntohl(raddr->sin_addr.s_addr));
cpu_to_le32(ntohl(cm_id->remote_addr.sin_addr.s_addr));
nesqp->nesqp_context->misc2 |= cpu_to_le32( nesqp->nesqp_context->misc2 |= cpu_to_le32(
(u32)PCI_FUNC(nesdev->pcidev->devfn) << (u32)PCI_FUNC(nesdev->pcidev->devfn) <<
...@@ -3162,9 +3160,9 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -3162,9 +3160,9 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
memset(&nes_quad, 0, sizeof(nes_quad)); memset(&nes_quad, 0, sizeof(nes_quad));
nes_quad.DstIpAdrIndex = nes_quad.DstIpAdrIndex =
cpu_to_le32((u32)PCI_FUNC(nesdev->pcidev->devfn) << 24); cpu_to_le32((u32)PCI_FUNC(nesdev->pcidev->devfn) << 24);
nes_quad.SrcIpadr = cm_id->remote_addr.sin_addr.s_addr; nes_quad.SrcIpadr = raddr->sin_addr.s_addr;
nes_quad.TcpPorts[0] = cm_id->remote_addr.sin_port; nes_quad.TcpPorts[0] = raddr->sin_port;
nes_quad.TcpPorts[1] = cm_id->local_addr.sin_port; nes_quad.TcpPorts[1] = laddr->sin_port;
/* Produce hash key */ /* Produce hash key */
crc_value = get_crc_value(&nes_quad); crc_value = get_crc_value(&nes_quad);
...@@ -3180,10 +3178,8 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -3180,10 +3178,8 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
nes_debug(NES_DBG_CM, "QP%u, Destination IP = 0x%08X:0x%04X, local = " nes_debug(NES_DBG_CM, "QP%u, Destination IP = 0x%08X:0x%04X, local = "
"0x%08X:0x%04X, rcv_nxt=0x%08X, snd_nxt=0x%08X, mpa + " "0x%08X:0x%04X, rcv_nxt=0x%08X, snd_nxt=0x%08X, mpa + "
"private data length=%u.\n", nesqp->hwqp.qp_id, "private data length=%u.\n", nesqp->hwqp.qp_id,
ntohl(cm_id->remote_addr.sin_addr.s_addr), ntohl(raddr->sin_addr.s_addr), ntohs(raddr->sin_port),
ntohs(cm_id->remote_addr.sin_port), ntohl(laddr->sin_addr.s_addr), ntohs(laddr->sin_port),
ntohl(cm_id->local_addr.sin_addr.s_addr),
ntohs(cm_id->local_addr.sin_port),
le32_to_cpu(nesqp->nesqp_context->rcv_nxt), le32_to_cpu(nesqp->nesqp_context->rcv_nxt),
le32_to_cpu(nesqp->nesqp_context->snd_nxt), le32_to_cpu(nesqp->nesqp_context->snd_nxt),
buff_len); buff_len);
...@@ -3263,7 +3259,11 @@ int nes_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -3263,7 +3259,11 @@ int nes_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
struct nes_cm_node *cm_node; struct nes_cm_node *cm_node;
struct nes_cm_info cm_info; struct nes_cm_info cm_info;
int apbvt_set = 0; int apbvt_set = 0;
struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->local_addr;
struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->remote_addr;
if (cm_id->remote_addr.ss_family != AF_INET)
return -ENOSYS;
ibqp = nes_get_qp(cm_id->device, conn_param->qpn); ibqp = nes_get_qp(cm_id->device, conn_param->qpn);
if (!ibqp) if (!ibqp)
return -EINVAL; return -EINVAL;
...@@ -3277,16 +3277,14 @@ int nes_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -3277,16 +3277,14 @@ int nes_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
if (!nesdev) if (!nesdev)
return -EINVAL; return -EINVAL;
if (!(cm_id->local_addr.sin_port) || !(cm_id->remote_addr.sin_port)) if (!laddr->sin_port || !raddr->sin_port)
return -EINVAL; return -EINVAL;
nes_debug(NES_DBG_CM, "QP%u, current IP = 0x%08X, Destination IP = " nes_debug(NES_DBG_CM, "QP%u, current IP = 0x%08X, Destination IP = "
"0x%08X:0x%04X, local = 0x%08X:0x%04X.\n", nesqp->hwqp.qp_id, "0x%08X:0x%04X, local = 0x%08X:0x%04X.\n", nesqp->hwqp.qp_id,
ntohl(nesvnic->local_ipaddr), ntohl(nesvnic->local_ipaddr), ntohl(raddr->sin_addr.s_addr),
ntohl(cm_id->remote_addr.sin_addr.s_addr), ntohs(raddr->sin_port), ntohl(laddr->sin_addr.s_addr),
ntohs(cm_id->remote_addr.sin_port), ntohs(laddr->sin_port));
ntohl(cm_id->local_addr.sin_addr.s_addr),
ntohs(cm_id->local_addr.sin_port));
atomic_inc(&cm_connects); atomic_inc(&cm_connects);
nesqp->active_conn = 1; nesqp->active_conn = 1;
...@@ -3306,18 +3304,18 @@ int nes_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -3306,18 +3304,18 @@ int nes_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
nes_debug(NES_DBG_CM, "mpa private data len =%u\n", nes_debug(NES_DBG_CM, "mpa private data len =%u\n",
conn_param->private_data_len); conn_param->private_data_len);
if (cm_id->local_addr.sin_addr.s_addr != if (laddr->sin_addr.s_addr != raddr->sin_addr.s_addr) {
cm_id->remote_addr.sin_addr.s_addr) { nes_manage_apbvt(nesvnic, ntohs(laddr->sin_port),
nes_manage_apbvt(nesvnic, ntohs(cm_id->local_addr.sin_port), PCI_FUNC(nesdev->pcidev->devfn),
PCI_FUNC(nesdev->pcidev->devfn), NES_MANAGE_APBVT_ADD); NES_MANAGE_APBVT_ADD);
apbvt_set = 1; apbvt_set = 1;
} }
/* set up the connection params for the node */ /* set up the connection params for the node */
cm_info.loc_addr = htonl(cm_id->local_addr.sin_addr.s_addr); cm_info.loc_addr = htonl(laddr->sin_addr.s_addr);
cm_info.loc_port = htons(cm_id->local_addr.sin_port); cm_info.loc_port = htons(laddr->sin_port);
cm_info.rem_addr = htonl(cm_id->remote_addr.sin_addr.s_addr); cm_info.rem_addr = htonl(raddr->sin_addr.s_addr);
cm_info.rem_port = htons(cm_id->remote_addr.sin_port); cm_info.rem_port = htons(raddr->sin_port);
cm_info.cm_id = cm_id; cm_info.cm_id = cm_id;
cm_info.conn_type = NES_CM_IWARP_CONN_TYPE; cm_info.conn_type = NES_CM_IWARP_CONN_TYPE;
...@@ -3329,7 +3327,7 @@ int nes_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -3329,7 +3327,7 @@ int nes_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
&cm_info); &cm_info);
if (!cm_node) { if (!cm_node) {
if (apbvt_set) if (apbvt_set)
nes_manage_apbvt(nesvnic, ntohs(cm_id->local_addr.sin_port), nes_manage_apbvt(nesvnic, ntohs(laddr->sin_port),
PCI_FUNC(nesdev->pcidev->devfn), PCI_FUNC(nesdev->pcidev->devfn),
NES_MANAGE_APBVT_DEL); NES_MANAGE_APBVT_DEL);
...@@ -3355,10 +3353,13 @@ int nes_create_listen(struct iw_cm_id *cm_id, int backlog) ...@@ -3355,10 +3353,13 @@ int nes_create_listen(struct iw_cm_id *cm_id, int backlog)
struct nes_cm_listener *cm_node; struct nes_cm_listener *cm_node;
struct nes_cm_info cm_info; struct nes_cm_info cm_info;
int err; int err;
struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->local_addr;
nes_debug(NES_DBG_CM, "cm_id = %p, local port = 0x%04X.\n", nes_debug(NES_DBG_CM, "cm_id = %p, local port = 0x%04X.\n",
cm_id, ntohs(cm_id->local_addr.sin_port)); cm_id, ntohs(laddr->sin_port));
if (cm_id->local_addr.ss_family != AF_INET)
return -ENOSYS;
nesvnic = to_nesvnic(cm_id->device); nesvnic = to_nesvnic(cm_id->device);
if (!nesvnic) if (!nesvnic)
return -EINVAL; return -EINVAL;
...@@ -3367,11 +3368,11 @@ int nes_create_listen(struct iw_cm_id *cm_id, int backlog) ...@@ -3367,11 +3368,11 @@ int nes_create_listen(struct iw_cm_id *cm_id, int backlog)
nesvnic, nesvnic->netdev, nesvnic->netdev->name); nesvnic, nesvnic->netdev, nesvnic->netdev->name);
nes_debug(NES_DBG_CM, "nesvnic->local_ipaddr=0x%08x, sin_addr.s_addr=0x%08x\n", nes_debug(NES_DBG_CM, "nesvnic->local_ipaddr=0x%08x, sin_addr.s_addr=0x%08x\n",
nesvnic->local_ipaddr, cm_id->local_addr.sin_addr.s_addr); nesvnic->local_ipaddr, laddr->sin_addr.s_addr);
/* setup listen params in our api call struct */ /* setup listen params in our api call struct */
cm_info.loc_addr = nesvnic->local_ipaddr; cm_info.loc_addr = nesvnic->local_ipaddr;
cm_info.loc_port = cm_id->local_addr.sin_port; cm_info.loc_port = laddr->sin_port;
cm_info.backlog = backlog; cm_info.backlog = backlog;
cm_info.cm_id = cm_id; cm_info.cm_id = cm_id;
...@@ -3388,8 +3389,7 @@ int nes_create_listen(struct iw_cm_id *cm_id, int backlog) ...@@ -3388,8 +3389,7 @@ int nes_create_listen(struct iw_cm_id *cm_id, int backlog)
cm_id->provider_data = cm_node; cm_id->provider_data = cm_node;
if (!cm_node->reused_node) { if (!cm_node->reused_node) {
err = nes_manage_apbvt(nesvnic, err = nes_manage_apbvt(nesvnic, ntohs(laddr->sin_port),
ntohs(cm_id->local_addr.sin_port),
PCI_FUNC(nesvnic->nesdev->pcidev->devfn), PCI_FUNC(nesvnic->nesdev->pcidev->devfn),
NES_MANAGE_APBVT_ADD); NES_MANAGE_APBVT_ADD);
if (err) { if (err) {
...@@ -3487,6 +3487,9 @@ static void cm_event_connected(struct nes_cm_event *event) ...@@ -3487,6 +3487,9 @@ static void cm_event_connected(struct nes_cm_event *event)
struct nes_v4_quad nes_quad; struct nes_v4_quad nes_quad;
u32 crc_value; u32 crc_value;
int ret; int ret;
struct sockaddr_in *laddr;
struct sockaddr_in *raddr;
struct sockaddr_in *cm_event_laddr;
/* get all our handles */ /* get all our handles */
cm_node = event->cm_node; cm_node = event->cm_node;
...@@ -3496,27 +3499,24 @@ static void cm_event_connected(struct nes_cm_event *event) ...@@ -3496,27 +3499,24 @@ static void cm_event_connected(struct nes_cm_event *event)
nesvnic = to_nesvnic(nesqp->ibqp.device); nesvnic = to_nesvnic(nesqp->ibqp.device);
nesdev = nesvnic->nesdev; nesdev = nesvnic->nesdev;
nesadapter = nesdev->nesadapter; nesadapter = nesdev->nesadapter;
laddr = (struct sockaddr_in *)&cm_id->local_addr;
raddr = (struct sockaddr_in *)&cm_id->remote_addr;
cm_event_laddr = (struct sockaddr_in *)&cm_event.local_addr;
if (nesqp->destroyed) if (nesqp->destroyed)
return; return;
atomic_inc(&cm_connecteds); atomic_inc(&cm_connecteds);
nes_debug(NES_DBG_CM, "QP%u attempting to connect to 0x%08X:0x%04X on" nes_debug(NES_DBG_CM, "QP%u attempting to connect to 0x%08X:0x%04X on"
" local port 0x%04X. jiffies = %lu.\n", " local port 0x%04X. jiffies = %lu.\n",
nesqp->hwqp.qp_id, nesqp->hwqp.qp_id, ntohl(raddr->sin_addr.s_addr),
ntohl(cm_id->remote_addr.sin_addr.s_addr), ntohs(raddr->sin_port), ntohs(laddr->sin_port), jiffies);
ntohs(cm_id->remote_addr.sin_port),
ntohs(cm_id->local_addr.sin_port),
jiffies);
nes_cm_init_tsa_conn(nesqp, cm_node); nes_cm_init_tsa_conn(nesqp, cm_node);
/* set the QP tsa context */ /* set the QP tsa context */
nesqp->nesqp_context->tcpPorts[0] = nesqp->nesqp_context->tcpPorts[0] = cpu_to_le16(ntohs(laddr->sin_port));
cpu_to_le16(ntohs(cm_id->local_addr.sin_port)); nesqp->nesqp_context->tcpPorts[1] = cpu_to_le16(ntohs(raddr->sin_port));
nesqp->nesqp_context->tcpPorts[1] = nesqp->nesqp_context->ip0 = cpu_to_le32(ntohl(raddr->sin_addr.s_addr));
cpu_to_le16(ntohs(cm_id->remote_addr.sin_port));
nesqp->nesqp_context->ip0 =
cpu_to_le32(ntohl(cm_id->remote_addr.sin_addr.s_addr));
nesqp->nesqp_context->misc2 |= cpu_to_le32( nesqp->nesqp_context->misc2 |= cpu_to_le32(
(u32)PCI_FUNC(nesdev->pcidev->devfn) << (u32)PCI_FUNC(nesdev->pcidev->devfn) <<
...@@ -3544,9 +3544,9 @@ static void cm_event_connected(struct nes_cm_event *event) ...@@ -3544,9 +3544,9 @@ static void cm_event_connected(struct nes_cm_event *event)
nes_quad.DstIpAdrIndex = nes_quad.DstIpAdrIndex =
cpu_to_le32((u32)PCI_FUNC(nesdev->pcidev->devfn) << 24); cpu_to_le32((u32)PCI_FUNC(nesdev->pcidev->devfn) << 24);
nes_quad.SrcIpadr = cm_id->remote_addr.sin_addr.s_addr; nes_quad.SrcIpadr = raddr->sin_addr.s_addr;
nes_quad.TcpPorts[0] = cm_id->remote_addr.sin_port; nes_quad.TcpPorts[0] = raddr->sin_port;
nes_quad.TcpPorts[1] = cm_id->local_addr.sin_port; nes_quad.TcpPorts[1] = laddr->sin_port;
/* Produce hash key */ /* Produce hash key */
crc_value = get_crc_value(&nes_quad); crc_value = get_crc_value(&nes_quad);
...@@ -3565,8 +3565,8 @@ static void cm_event_connected(struct nes_cm_event *event) ...@@ -3565,8 +3565,8 @@ static void cm_event_connected(struct nes_cm_event *event)
cm_event.event = IW_CM_EVENT_CONNECT_REPLY; cm_event.event = IW_CM_EVENT_CONNECT_REPLY;
cm_event.status = 0; cm_event.status = 0;
cm_event.provider_data = cm_id->provider_data; cm_event.provider_data = cm_id->provider_data;
cm_event.local_addr.sin_family = AF_INET; cm_event_laddr->sin_family = AF_INET;
cm_event.local_addr.sin_port = cm_id->local_addr.sin_port; cm_event_laddr->sin_port = laddr->sin_port;
cm_event.remote_addr = cm_id->remote_addr; cm_event.remote_addr = cm_id->remote_addr;
cm_event.private_data = (void *)event->cm_node->mpa_frame_buf; cm_event.private_data = (void *)event->cm_node->mpa_frame_buf;
...@@ -3574,7 +3574,7 @@ static void cm_event_connected(struct nes_cm_event *event) ...@@ -3574,7 +3574,7 @@ static void cm_event_connected(struct nes_cm_event *event)
cm_event.ird = cm_node->ird_size; cm_event.ird = cm_node->ird_size;
cm_event.ord = cm_node->ord_size; cm_event.ord = cm_node->ord_size;
cm_event.local_addr.sin_addr.s_addr = event->cm_info.rem_addr; cm_event_laddr->sin_addr.s_addr = event->cm_info.rem_addr;
ret = cm_id->event_handler(cm_id, &cm_event); ret = cm_id->event_handler(cm_id, &cm_event);
nes_debug(NES_DBG_CM, "OFA CM event_handler returned, ret=%d\n", ret); nes_debug(NES_DBG_CM, "OFA CM event_handler returned, ret=%d\n", ret);
...@@ -3627,9 +3627,16 @@ static void cm_event_connect_error(struct nes_cm_event *event) ...@@ -3627,9 +3627,16 @@ static void cm_event_connect_error(struct nes_cm_event *event)
cm_event.private_data = NULL; cm_event.private_data = NULL;
cm_event.private_data_len = 0; cm_event.private_data_len = 0;
nes_debug(NES_DBG_CM, "call CM_EVENT REJECTED, local_addr=%08x, " #ifdef CONFIG_INFINIBAND_NES_DEBUG
"remove_addr=%08x\n", cm_event.local_addr.sin_addr.s_addr, {
cm_event.remote_addr.sin_addr.s_addr); struct sockaddr_in *cm_event_laddr = (struct sockaddr_in *)
&cm_event.local_addr;
struct sockaddr_in *cm_event_raddr = (struct sockaddr_in *)
&cm_event.remote_addr;
nes_debug(NES_DBG_CM, "call CM_EVENT REJECTED, local_addr=%08x, remote_addr=%08x\n",
cm_event_laddr->sin_addr.s_addr, cm_event_raddr->sin_addr.s_addr);
}
#endif
ret = cm_id->event_handler(cm_id, &cm_event); ret = cm_id->event_handler(cm_id, &cm_event);
nes_debug(NES_DBG_CM, "OFA CM event_handler returned, ret=%d\n", ret); nes_debug(NES_DBG_CM, "OFA CM event_handler returned, ret=%d\n", ret);
...@@ -3709,6 +3716,10 @@ static void cm_event_mpa_req(struct nes_cm_event *event) ...@@ -3709,6 +3716,10 @@ static void cm_event_mpa_req(struct nes_cm_event *event)
struct iw_cm_event cm_event; struct iw_cm_event cm_event;
int ret; int ret;
struct nes_cm_node *cm_node; struct nes_cm_node *cm_node;
struct sockaddr_in *cm_event_laddr = (struct sockaddr_in *)
&cm_event.local_addr;
struct sockaddr_in *cm_event_raddr = (struct sockaddr_in *)
&cm_event.remote_addr;
cm_node = event->cm_node; cm_node = event->cm_node;
if (!cm_node) if (!cm_node)
...@@ -3723,13 +3734,13 @@ static void cm_event_mpa_req(struct nes_cm_event *event) ...@@ -3723,13 +3734,13 @@ static void cm_event_mpa_req(struct nes_cm_event *event)
cm_event.status = 0; cm_event.status = 0;
cm_event.provider_data = (void *)cm_node; cm_event.provider_data = (void *)cm_node;
cm_event.local_addr.sin_family = AF_INET; cm_event_laddr->sin_family = AF_INET;
cm_event.local_addr.sin_port = htons(event->cm_info.loc_port); cm_event_laddr->sin_port = htons(event->cm_info.loc_port);
cm_event.local_addr.sin_addr.s_addr = htonl(event->cm_info.loc_addr); cm_event_laddr->sin_addr.s_addr = htonl(event->cm_info.loc_addr);
cm_event.remote_addr.sin_family = AF_INET; cm_event_raddr->sin_family = AF_INET;
cm_event.remote_addr.sin_port = htons(event->cm_info.rem_port); cm_event_raddr->sin_port = htons(event->cm_info.rem_port);
cm_event.remote_addr.sin_addr.s_addr = htonl(event->cm_info.rem_addr); cm_event_raddr->sin_addr.s_addr = htonl(event->cm_info.rem_addr);
cm_event.private_data = cm_node->mpa_frame_buf; cm_event.private_data = cm_node->mpa_frame_buf;
cm_event.private_data_len = (u8)cm_node->mpa_frame_size; cm_event.private_data_len = (u8)cm_node->mpa_frame_size;
cm_event.ird = cm_node->ird_size; cm_event.ird = cm_node->ird_size;
...@@ -3749,6 +3760,10 @@ static void cm_event_mpa_reject(struct nes_cm_event *event) ...@@ -3749,6 +3760,10 @@ static void cm_event_mpa_reject(struct nes_cm_event *event)
struct iw_cm_event cm_event; struct iw_cm_event cm_event;
struct nes_cm_node *cm_node; struct nes_cm_node *cm_node;
int ret; int ret;
struct sockaddr_in *cm_event_laddr = (struct sockaddr_in *)
&cm_event.local_addr;
struct sockaddr_in *cm_event_raddr = (struct sockaddr_in *)
&cm_event.remote_addr;
cm_node = event->cm_node; cm_node = event->cm_node;
if (!cm_node) if (!cm_node)
...@@ -3763,21 +3778,21 @@ static void cm_event_mpa_reject(struct nes_cm_event *event) ...@@ -3763,21 +3778,21 @@ static void cm_event_mpa_reject(struct nes_cm_event *event)
cm_event.status = -ECONNREFUSED; cm_event.status = -ECONNREFUSED;
cm_event.provider_data = cm_id->provider_data; cm_event.provider_data = cm_id->provider_data;
cm_event.local_addr.sin_family = AF_INET; cm_event_laddr->sin_family = AF_INET;
cm_event.local_addr.sin_port = htons(event->cm_info.loc_port); cm_event_laddr->sin_port = htons(event->cm_info.loc_port);
cm_event.local_addr.sin_addr.s_addr = htonl(event->cm_info.loc_addr); cm_event_laddr->sin_addr.s_addr = htonl(event->cm_info.loc_addr);
cm_event.remote_addr.sin_family = AF_INET; cm_event_raddr->sin_family = AF_INET;
cm_event.remote_addr.sin_port = htons(event->cm_info.rem_port); cm_event_raddr->sin_port = htons(event->cm_info.rem_port);
cm_event.remote_addr.sin_addr.s_addr = htonl(event->cm_info.rem_addr); cm_event_raddr->sin_addr.s_addr = htonl(event->cm_info.rem_addr);
cm_event.private_data = cm_node->mpa_frame_buf; cm_event.private_data = cm_node->mpa_frame_buf;
cm_event.private_data_len = (u8)cm_node->mpa_frame_size; cm_event.private_data_len = (u8)cm_node->mpa_frame_size;
nes_debug(NES_DBG_CM, "call CM_EVENT_MPA_REJECTED, local_addr=%08x, " nes_debug(NES_DBG_CM, "call CM_EVENT_MPA_REJECTED, local_addr=%08x, "
"remove_addr=%08x\n", "remove_addr=%08x\n",
cm_event.local_addr.sin_addr.s_addr, cm_event_laddr->sin_addr.s_addr,
cm_event.remote_addr.sin_addr.s_addr); cm_event_raddr->sin_addr.s_addr);
ret = cm_id->event_handler(cm_id, &cm_event); ret = cm_id->event_handler(cm_id, &cm_event);
if (ret) if (ret)
......
...@@ -49,8 +49,8 @@ enum iw_cm_event_type { ...@@ -49,8 +49,8 @@ enum iw_cm_event_type {
struct iw_cm_event { struct iw_cm_event {
enum iw_cm_event_type event; enum iw_cm_event_type event;
int status; int status;
struct sockaddr_in local_addr; struct sockaddr_storage local_addr;
struct sockaddr_in remote_addr; struct sockaddr_storage remote_addr;
void *private_data; void *private_data;
void *provider_data; void *provider_data;
u8 private_data_len; u8 private_data_len;
...@@ -83,8 +83,8 @@ struct iw_cm_id { ...@@ -83,8 +83,8 @@ struct iw_cm_id {
iw_cm_handler cm_handler; /* client callback function */ iw_cm_handler cm_handler; /* client callback function */
void *context; /* client cb context */ void *context; /* client cb context */
struct ib_device *device; struct ib_device *device;
struct sockaddr_in local_addr; struct sockaddr_storage local_addr;
struct sockaddr_in remote_addr; struct sockaddr_storage remote_addr;
void *provider_data; /* provider private data */ void *provider_data; /* provider private data */
iw_event_handler event_handler; /* cb for provider iw_event_handler event_handler; /* cb for provider
events */ events */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册