RE: [PATCH for-4.3] iw_cxgb4: Add support for clip

2015-08-25 Thread Steve Wise
Acked-by: Steve Wise sw...@opengridcomputing.com


--
To unsubscribe from this list: send the line unsubscribe linux-rdma in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH for-4.3] iw_cxgb4: Add support for clip

2015-08-25 Thread Hariprasad Shenai
Add support for ipv6 address handling clip api provided by lld

Signed-off-by: Hariprasad Shenai haripra...@chelsio.com
---
 drivers/infiniband/hw/cxgb4/cm.c | 76 +---
 1 file changed, 72 insertions(+), 4 deletions(-)

diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c
index 3ad8dc7..d699719 100644
--- a/drivers/infiniband/hw/cxgb4/cm.c
+++ b/drivers/infiniband/hw/cxgb4/cm.c
@@ -50,6 +50,7 @@
 #include rdma/ib_addr.h
 
 #include iw_cxgb4.h
+#include clip_tbl.h
 
 static char *states[] = {
idle,
@@ -298,6 +299,16 @@ void _c4iw_free_ep(struct kref *kref)
if (test_bit(QP_REFERENCED, ep-com.flags))
deref_qp(ep);
if (test_bit(RELEASE_RESOURCES, ep-com.flags)) {
+   if (ep-com.remote_addr.ss_family == AF_INET6) {
+   struct sockaddr_in6 *sin6 =
+   (struct sockaddr_in6 *)
+   ep-com.mapped_local_addr;
+
+   cxgb4_clip_release(
+   ep-com.dev-rdev.lldi.ports[0],
+   (const u32 *)sin6-sin6_addr.s6_addr,
+   1);
+   }
remove_handle(ep-com.dev, ep-com.dev-hwtid_idr, ep-hwtid);
cxgb4_remove_tid(ep-com.dev-rdev.lldi.tids, 0, ep-hwtid);
dst_release(ep-dst);
@@ -442,6 +453,12 @@ static void act_open_req_arp_failure(void *handle, struct 
sk_buff *skb)
kfree_skb(skb);
connect_reply_upcall(ep, -EHOSTUNREACH);
state_set(ep-com, DEAD);
+   if (ep-com.remote_addr.ss_family == AF_INET6) {
+   struct sockaddr_in6 *sin6 =
+   (struct sockaddr_in6 *)ep-com.mapped_local_addr;
+   cxgb4_clip_release(ep-com.dev-rdev.lldi.ports[0],
+  (const u32 *)sin6-sin6_addr.s6_addr, 1);
+   }
remove_handle(ep-com.dev, ep-com.dev-atid_idr, ep-atid);
cxgb4_free_atid(ep-com.dev-rdev.lldi.tids, ep-atid);
dst_release(ep-dst);
@@ -640,6 +657,7 @@ static int send_connect(struct c4iw_ep *ep)
struct sockaddr_in6 *ra6 = (struct sockaddr_in6 *)
   ep-com.mapped_remote_addr;
int win;
+   int ret;
 
wrlen = (ep-com.remote_addr.ss_family == AF_INET) ?
roundup(sizev4, 16) :
@@ -693,6 +711,11 @@ static int send_connect(struct c4iw_ep *ep)
opt2 |= CONG_CNTRL_V(CONG_ALG_TAHOE);
opt2 |= T5_ISS_F;
}
+
+   if (ep-com.remote_addr.ss_family == AF_INET6)
+   cxgb4_clip_get(ep-com.dev-rdev.lldi.ports[0],
+  (const u32 *)la6-sin6_addr.s6_addr, 1);
+
t4_set_arp_err_handler(skb, ep, act_open_req_arp_failure);
 
if (is_t4(ep-com.dev-rdev.lldi.adapter_type)) {
@@ -790,7 +813,11 @@ static int send_connect(struct c4iw_ep *ep)
}
 
set_bit(ACT_OPEN_REQ, ep-com.history);
-   return c4iw_l2t_send(ep-com.dev-rdev, skb, ep-l2t);
+   ret = c4iw_l2t_send(ep-com.dev-rdev, skb, ep-l2t);
+   if (ret  ep-com.remote_addr.ss_family == AF_INET6)
+   cxgb4_clip_release(ep-com.dev-rdev.lldi.ports[0],
+  (const u32 *)la6-sin6_addr.s6_addr, 1);
+   return ret;
 }
 
 static void send_mpa_req(struct c4iw_ep *ep, struct sk_buff *skb,
@@ -2091,6 +2118,15 @@ static int act_open_rpl(struct c4iw_dev *dev, struct 
sk_buff *skb)
case CPL_ERR_CONN_EXIST:
if (ep-retry_count++  ACT_OPEN_RETRY_COUNT) {
set_bit(ACT_RETRY_INUSE, ep-com.history);
+   if (ep-com.remote_addr.ss_family == AF_INET6) {
+   struct sockaddr_in6 *sin6 =
+   (struct sockaddr_in6 *)
+   ep-com.mapped_local_addr;
+   cxgb4_clip_release(
+   ep-com.dev-rdev.lldi.ports[0],
+   (const u32 *)
+   sin6-sin6_addr.s6_addr, 1);
+   }
remove_handle(ep-com.dev, ep-com.dev-atid_idr,
atid);
cxgb4_free_atid(t, atid);
@@ -2118,6 +2154,12 @@ static int act_open_rpl(struct c4iw_dev *dev, struct 
sk_buff *skb)
connect_reply_upcall(ep, status2errno(status));
state_set(ep-com, DEAD);
 
+   if (ep-com.remote_addr.ss_family == AF_INET6) {
+   struct sockaddr_in6 *sin6 =
+   (struct sockaddr_in6 *)ep-com.mapped_local_addr;
+   cxgb4_clip_release(ep-com.dev-rdev.lldi.ports[0],
+  (const u32 *)sin6-sin6_addr.s6_addr, 1);
+   }
if (status