diff options
author | Steve Wise <swise@opengridcomputing.com> | 2013-07-04 06:40:44 -0400 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2013-08-12 15:32:31 -0400 |
commit | 24d44a391f1b5d56e9c7a4fc1edd085687864ff9 (patch) | |
tree | 3076b01a1b85d6b21d08f615a44a4b7c2f5b5acb /drivers/infiniband/hw/cxgb3 | |
parent | c095ba7224d8edc71dcef0d655911399a8bd4a3f (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.c | 46 |
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: | |||
1872 | static int is_loopback_dst(struct iw_cm_id *cm_id) | 1876 | static 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. |