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