aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw/cxgb3
diff options
context:
space:
mode:
authorSteve Wise <swise@opengridcomputing.com>2013-07-04 06:40:44 -0400
committerRoland Dreier <roland@purestorage.com>2013-08-12 15:32:31 -0400
commit24d44a391f1b5d56e9c7a4fc1edd085687864ff9 (patch)
tree3076b01a1b85d6b21d08f615a44a4b7c2f5b5acb /drivers/infiniband/hw/cxgb3
parentc095ba7224d8edc71dcef0d655911399a8bd4a3f (diff)
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: Steve Wise <swise@opengridcomputing.com> Reviewed-by: Sean Hefty <sean.hefty@intel.com> [ Fix unused variable warnings when INFINIBAND_NES_DEBUG not set. - Roland ] Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband/hw/cxgb3')
-rw-r--r--drivers/infiniband/hw/cxgb3/iwch_cm.c46
1 files changed, 32 insertions, 14 deletions
diff --git a/drivers/infiniband/hw/cxgb3/iwch_cm.c b/drivers/infiniband/hw/cxgb3/iwch_cm.c
index 3e094cd6a0e3..095bb046e2c8 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_cm.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_cm.c
@@ -721,8 +721,10 @@ static void connect_reply_upcall(struct iwch_ep *ep, int status)
721 memset(&event, 0, sizeof(event)); 721 memset(&event, 0, sizeof(event));
722 event.event = IW_CM_EVENT_CONNECT_REPLY; 722 event.event = IW_CM_EVENT_CONNECT_REPLY;
723 event.status = status; 723 event.status = status;
724 event.local_addr = ep->com.local_addr; 724 memcpy(&event.local_addr, &ep->com.local_addr,
725 event.remote_addr = ep->com.remote_addr; 725 sizeof(ep->com.local_addr));
726 memcpy(&event.remote_addr, &ep->com.remote_addr,
727 sizeof(ep->com.remote_addr));
726 728
727 if ((status == 0) || (status == -ECONNREFUSED)) { 729 if ((status == 0) || (status == -ECONNREFUSED)) {
728 event.private_data_len = ep->plen; 730 event.private_data_len = ep->plen;
@@ -747,8 +749,10 @@ static void connect_request_upcall(struct iwch_ep *ep)
747 PDBG("%s ep %p tid %d\n", __func__, ep, ep->hwtid); 749 PDBG("%s ep %p tid %d\n", __func__, ep, ep->hwtid);
748 memset(&event, 0, sizeof(event)); 750 memset(&event, 0, sizeof(event));
749 event.event = IW_CM_EVENT_CONNECT_REQUEST; 751 event.event = IW_CM_EVENT_CONNECT_REQUEST;
750 event.local_addr = ep->com.local_addr; 752 memcpy(&event.local_addr, &ep->com.local_addr,
751 event.remote_addr = ep->com.remote_addr; 753 sizeof(ep->com.local_addr));
754 memcpy(&event.remote_addr, &ep->com.remote_addr,
755 sizeof(ep->com.local_addr));
752 event.private_data_len = ep->plen; 756 event.private_data_len = ep->plen;
753 event.private_data = ep->mpa_pkt + sizeof(struct mpa_message); 757 event.private_data = ep->mpa_pkt + sizeof(struct mpa_message);
754 event.provider_data = ep; 758 event.provider_data = ep;
@@ -1872,8 +1876,9 @@ err:
1872static int is_loopback_dst(struct iw_cm_id *cm_id) 1876static int is_loopback_dst(struct iw_cm_id *cm_id)
1873{ 1877{
1874 struct net_device *dev; 1878 struct net_device *dev;
1879 struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->remote_addr;
1875 1880
1876 dev = ip_dev_find(&init_net, cm_id->remote_addr.sin_addr.s_addr); 1881 dev = ip_dev_find(&init_net, raddr->sin_addr.s_addr);
1877 if (!dev) 1882 if (!dev)
1878 return 0; 1883 return 0;
1879 dev_put(dev); 1884 dev_put(dev);
@@ -1886,6 +1891,13 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
1886 struct iwch_ep *ep; 1891 struct iwch_ep *ep;
1887 struct rtable *rt; 1892 struct rtable *rt;
1888 int err = 0; 1893 int err = 0;
1894 struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->local_addr;
1895 struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->remote_addr;
1896
1897 if (cm_id->remote_addr.ss_family != PF_INET) {
1898 err = -ENOSYS;
1899 goto out;
1900 }
1889 1901
1890 if (is_loopback_dst(cm_id)) { 1902 if (is_loopback_dst(cm_id)) {
1891 err = -ENOSYS; 1903 err = -ENOSYS;
@@ -1929,11 +1941,9 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
1929 } 1941 }
1930 1942
1931 /* find a route */ 1943 /* find a route */
1932 rt = find_route(h->rdev.t3cdev_p, 1944 rt = find_route(h->rdev.t3cdev_p, laddr->sin_addr.s_addr,
1933 cm_id->local_addr.sin_addr.s_addr, 1945 raddr->sin_addr.s_addr, laddr->sin_port,
1934 cm_id->remote_addr.sin_addr.s_addr, 1946 raddr->sin_port, IPTOS_LOWDELAY);
1935 cm_id->local_addr.sin_port,
1936 cm_id->remote_addr.sin_port, IPTOS_LOWDELAY);
1937 if (!rt) { 1947 if (!rt) {
1938 printk(KERN_ERR MOD "%s - cannot find route.\n", __func__); 1948 printk(KERN_ERR MOD "%s - cannot find route.\n", __func__);
1939 err = -EHOSTUNREACH; 1949 err = -EHOSTUNREACH;
@@ -1941,7 +1951,7 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
1941 } 1951 }
1942 ep->dst = &rt->dst; 1952 ep->dst = &rt->dst;
1943 ep->l2t = t3_l2t_get(ep->com.tdev, ep->dst, NULL, 1953 ep->l2t = t3_l2t_get(ep->com.tdev, ep->dst, NULL,
1944 &cm_id->remote_addr.sin_addr.s_addr); 1954 &raddr->sin_addr.s_addr);
1945 if (!ep->l2t) { 1955 if (!ep->l2t) {
1946 printk(KERN_ERR MOD "%s - cannot alloc l2e.\n", __func__); 1956 printk(KERN_ERR MOD "%s - cannot alloc l2e.\n", __func__);
1947 err = -ENOMEM; 1957 err = -ENOMEM;
@@ -1950,8 +1960,10 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
1950 1960
1951 state_set(&ep->com, CONNECTING); 1961 state_set(&ep->com, CONNECTING);
1952 ep->tos = IPTOS_LOWDELAY; 1962 ep->tos = IPTOS_LOWDELAY;
1953 ep->com.local_addr = cm_id->local_addr; 1963 memcpy(&ep->com.local_addr, &cm_id->local_addr,
1954 ep->com.remote_addr = cm_id->remote_addr; 1964 sizeof(ep->com.local_addr));
1965 memcpy(&ep->com.remote_addr, &cm_id->remote_addr,
1966 sizeof(ep->com.remote_addr));
1955 1967
1956 /* send connect request to rnic */ 1968 /* send connect request to rnic */
1957 err = send_connect(ep); 1969 err = send_connect(ep);
@@ -1979,6 +1991,11 @@ int iwch_create_listen(struct iw_cm_id *cm_id, int backlog)
1979 1991
1980 might_sleep(); 1992 might_sleep();
1981 1993
1994 if (cm_id->local_addr.ss_family != PF_INET) {
1995 err = -ENOSYS;
1996 goto fail1;
1997 }
1998
1982 ep = alloc_ep(sizeof(*ep), GFP_KERNEL); 1999 ep = alloc_ep(sizeof(*ep), GFP_KERNEL);
1983 if (!ep) { 2000 if (!ep) {
1984 printk(KERN_ERR MOD "%s - cannot alloc ep.\n", __func__); 2001 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 cm_id->add_ref(cm_id); 2007 cm_id->add_ref(cm_id);
1991 ep->com.cm_id = cm_id; 2008 ep->com.cm_id = cm_id;
1992 ep->backlog = backlog; 2009 ep->backlog = backlog;
1993 ep->com.local_addr = cm_id->local_addr; 2010 memcpy(&ep->com.local_addr, &cm_id->local_addr,
2011 sizeof(ep->com.local_addr));
1994 2012
1995 /* 2013 /*
1996 * Allocate a server TID. 2014 * Allocate a server TID.