Skip to content

Commit 84cc6ac

Browse files
Hariprasad Sdledford
authored andcommitted
iw_cxgb4: Add support for clip
Add support for ipv6 address handling clip api provided by lld Signed-off-by: Hariprasad Shenai <[email protected]> Acked-by: Steve Wise <[email protected]> Signed-off-by: Doug Ledford <[email protected]>
1 parent 6c26a77 commit 84cc6ac

File tree

1 file changed

+72
-4
lines changed
  • drivers/infiniband/hw/cxgb4

1 file changed

+72
-4
lines changed

drivers/infiniband/hw/cxgb4/cm.c

Lines changed: 72 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
#include <rdma/ib_addr.h>
5151

5252
#include "iw_cxgb4.h"
53+
#include "clip_tbl.h"
5354

5455
static char *states[] = {
5556
"idle",
@@ -298,6 +299,16 @@ void _c4iw_free_ep(struct kref *kref)
298299
if (test_bit(QP_REFERENCED, &ep->com.flags))
299300
deref_qp(ep);
300301
if (test_bit(RELEASE_RESOURCES, &ep->com.flags)) {
302+
if (ep->com.remote_addr.ss_family == AF_INET6) {
303+
struct sockaddr_in6 *sin6 =
304+
(struct sockaddr_in6 *)
305+
&ep->com.mapped_local_addr;
306+
307+
cxgb4_clip_release(
308+
ep->com.dev->rdev.lldi.ports[0],
309+
(const u32 *)&sin6->sin6_addr.s6_addr,
310+
1);
311+
}
301312
remove_handle(ep->com.dev, &ep->com.dev->hwtid_idr, ep->hwtid);
302313
cxgb4_remove_tid(ep->com.dev->rdev.lldi.tids, 0, ep->hwtid);
303314
dst_release(ep->dst);
@@ -442,6 +453,12 @@ static void act_open_req_arp_failure(void *handle, struct sk_buff *skb)
442453
kfree_skb(skb);
443454
connect_reply_upcall(ep, -EHOSTUNREACH);
444455
state_set(&ep->com, DEAD);
456+
if (ep->com.remote_addr.ss_family == AF_INET6) {
457+
struct sockaddr_in6 *sin6 =
458+
(struct sockaddr_in6 *)&ep->com.mapped_local_addr;
459+
cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0],
460+
(const u32 *)&sin6->sin6_addr.s6_addr, 1);
461+
}
445462
remove_handle(ep->com.dev, &ep->com.dev->atid_idr, ep->atid);
446463
cxgb4_free_atid(ep->com.dev->rdev.lldi.tids, ep->atid);
447464
dst_release(ep->dst);
@@ -640,6 +657,7 @@ static int send_connect(struct c4iw_ep *ep)
640657
struct sockaddr_in6 *ra6 = (struct sockaddr_in6 *)
641658
&ep->com.mapped_remote_addr;
642659
int win;
660+
int ret;
643661

644662
wrlen = (ep->com.remote_addr.ss_family == AF_INET) ?
645663
roundup(sizev4, 16) :
@@ -693,6 +711,11 @@ static int send_connect(struct c4iw_ep *ep)
693711
opt2 |= CONG_CNTRL_V(CONG_ALG_TAHOE);
694712
opt2 |= T5_ISS_F;
695713
}
714+
715+
if (ep->com.remote_addr.ss_family == AF_INET6)
716+
cxgb4_clip_get(ep->com.dev->rdev.lldi.ports[0],
717+
(const u32 *)&la6->sin6_addr.s6_addr, 1);
718+
696719
t4_set_arp_err_handler(skb, ep, act_open_req_arp_failure);
697720

698721
if (is_t4(ep->com.dev->rdev.lldi.adapter_type)) {
@@ -790,7 +813,11 @@ static int send_connect(struct c4iw_ep *ep)
790813
}
791814

792815
set_bit(ACT_OPEN_REQ, &ep->com.history);
793-
return c4iw_l2t_send(&ep->com.dev->rdev, skb, ep->l2t);
816+
ret = c4iw_l2t_send(&ep->com.dev->rdev, skb, ep->l2t);
817+
if (ret && ep->com.remote_addr.ss_family == AF_INET6)
818+
cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0],
819+
(const u32 *)&la6->sin6_addr.s6_addr, 1);
820+
return ret;
794821
}
795822

796823
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)
20912118
case CPL_ERR_CONN_EXIST:
20922119
if (ep->retry_count++ < ACT_OPEN_RETRY_COUNT) {
20932120
set_bit(ACT_RETRY_INUSE, &ep->com.history);
2121+
if (ep->com.remote_addr.ss_family == AF_INET6) {
2122+
struct sockaddr_in6 *sin6 =
2123+
(struct sockaddr_in6 *)
2124+
&ep->com.mapped_local_addr;
2125+
cxgb4_clip_release(
2126+
ep->com.dev->rdev.lldi.ports[0],
2127+
(const u32 *)
2128+
&sin6->sin6_addr.s6_addr, 1);
2129+
}
20942130
remove_handle(ep->com.dev, &ep->com.dev->atid_idr,
20952131
atid);
20962132
cxgb4_free_atid(t, atid);
@@ -2118,6 +2154,12 @@ static int act_open_rpl(struct c4iw_dev *dev, struct sk_buff *skb)
21182154
connect_reply_upcall(ep, status2errno(status));
21192155
state_set(&ep->com, DEAD);
21202156

2157+
if (ep->com.remote_addr.ss_family == AF_INET6) {
2158+
struct sockaddr_in6 *sin6 =
2159+
(struct sockaddr_in6 *)&ep->com.mapped_local_addr;
2160+
cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0],
2161+
(const u32 *)&sin6->sin6_addr.s6_addr, 1);
2162+
}
21212163
if (status && act_open_has_tid(status))
21222164
cxgb4_remove_tid(ep->com.dev->rdev.lldi.tids, 0, GET_TID(rpl));
21232165

@@ -2302,6 +2344,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)
23022344
struct dst_entry *dst;
23032345
__u8 local_ip[16], peer_ip[16];
23042346
__be16 local_port, peer_port;
2347+
struct sockaddr_in6 *sin6;
23052348
int err;
23062349
u16 peer_mss = ntohs(req->tcpopt.mss);
23072350
int iptype;
@@ -2400,9 +2443,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)
24002443
sin->sin_port = peer_port;
24012444
sin->sin_addr.s_addr = *(__be32 *)peer_ip;
24022445
} else {
2403-
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)
2404-
&child_ep->com.mapped_local_addr;
2405-
2446+
sin6 = (struct sockaddr_in6 *)&child_ep->com.mapped_local_addr;
24062447
sin6->sin6_family = PF_INET6;
24072448
sin6->sin6_port = local_port;
24082449
memcpy(sin6->sin6_addr.s6_addr, local_ip, 16);
@@ -2436,6 +2477,11 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)
24362477
insert_handle(dev, &dev->hwtid_idr, child_ep, child_ep->hwtid);
24372478
accept_cr(child_ep, skb, req);
24382479
set_bit(PASS_ACCEPT_REQ, &child_ep->com.history);
2480+
if (iptype == 6) {
2481+
sin6 = (struct sockaddr_in6 *)&child_ep->com.mapped_local_addr;
2482+
cxgb4_clip_get(child_ep->com.dev->rdev.lldi.ports[0],
2483+
(const u32 *)&sin6->sin6_addr.s6_addr, 1);
2484+
}
24392485
goto out;
24402486
reject:
24412487
reject_cr(dev, hwtid, skb);
@@ -2672,6 +2718,15 @@ static int peer_abort(struct c4iw_dev *dev, struct sk_buff *skb)
26722718
if (release)
26732719
release_ep_resources(ep);
26742720
else if (ep->retry_with_mpa_v1) {
2721+
if (ep->com.remote_addr.ss_family == AF_INET6) {
2722+
struct sockaddr_in6 *sin6 =
2723+
(struct sockaddr_in6 *)
2724+
&ep->com.mapped_local_addr;
2725+
cxgb4_clip_release(
2726+
ep->com.dev->rdev.lldi.ports[0],
2727+
(const u32 *)&sin6->sin6_addr.s6_addr,
2728+
1);
2729+
}
26752730
remove_handle(ep->com.dev, &ep->com.dev->hwtid_idr, ep->hwtid);
26762731
cxgb4_remove_tid(ep->com.dev->rdev.lldi.tids, 0, ep->hwtid);
26772732
dst_release(ep->dst);
@@ -3186,6 +3241,9 @@ static int create_server6(struct c4iw_dev *dev, struct c4iw_listen_ep *ep)
31863241
pr_err("cxgb4_create_server6/filter failed err %d stid %d laddr %pI6 lport %d\n",
31873242
err, ep->stid,
31883243
sin6->sin6_addr.s6_addr, ntohs(sin6->sin6_port));
3244+
else
3245+
cxgb4_clip_get(ep->com.dev->rdev.lldi.ports[0],
3246+
(const u32 *)&sin6->sin6_addr.s6_addr, 1);
31893247
return err;
31903248
}
31913249

@@ -3334,6 +3392,7 @@ int c4iw_destroy_listen(struct iw_cm_id *cm_id)
33343392
ep->com.dev->rdev.lldi.ports[0], ep->stid,
33353393
ep->com.dev->rdev.lldi.rxq_ids[0], 0);
33363394
} else {
3395+
struct sockaddr_in6 *sin6;
33373396
c4iw_init_wr_wait(&ep->com.wr_wait);
33383397
err = cxgb4_remove_server(
33393398
ep->com.dev->rdev.lldi.ports[0], ep->stid,
@@ -3342,6 +3401,9 @@ int c4iw_destroy_listen(struct iw_cm_id *cm_id)
33423401
goto done;
33433402
err = c4iw_wait_for_reply(&ep->com.dev->rdev, &ep->com.wr_wait,
33443403
0, 0, __func__);
3404+
sin6 = (struct sockaddr_in6 *)&ep->com.mapped_local_addr;
3405+
cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0],
3406+
(const u32 *)&sin6->sin6_addr.s6_addr, 1);
33453407
}
33463408
remove_handle(ep->com.dev, &ep->com.dev->stid_idr, ep->stid);
33473409
cxgb4_free_stid(ep->com.dev->rdev.lldi.tids, ep->stid,
@@ -3461,6 +3523,12 @@ static void active_ofld_conn_reply(struct c4iw_dev *dev, struct sk_buff *skb,
34613523
mutex_unlock(&dev->rdev.stats.lock);
34623524
connect_reply_upcall(ep, status2errno(req->retval));
34633525
state_set(&ep->com, DEAD);
3526+
if (ep->com.remote_addr.ss_family == AF_INET6) {
3527+
struct sockaddr_in6 *sin6 =
3528+
(struct sockaddr_in6 *)&ep->com.mapped_local_addr;
3529+
cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0],
3530+
(const u32 *)&sin6->sin6_addr.s6_addr, 1);
3531+
}
34643532
remove_handle(dev, &dev->atid_idr, atid);
34653533
cxgb4_free_atid(dev->rdev.lldi.tids, atid);
34663534
dst_release(ep->dst);

0 commit comments

Comments
 (0)