50
50
#include <rdma/ib_addr.h>
51
51
52
52
#include "iw_cxgb4.h"
53
+ #include "clip_tbl.h"
53
54
54
55
static char * states [] = {
55
56
"idle" ,
@@ -298,6 +299,16 @@ void _c4iw_free_ep(struct kref *kref)
298
299
if (test_bit (QP_REFERENCED , & ep -> com .flags ))
299
300
deref_qp (ep );
300
301
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
+ }
301
312
remove_handle (ep -> com .dev , & ep -> com .dev -> hwtid_idr , ep -> hwtid );
302
313
cxgb4_remove_tid (ep -> com .dev -> rdev .lldi .tids , 0 , ep -> hwtid );
303
314
dst_release (ep -> dst );
@@ -442,6 +453,12 @@ static void act_open_req_arp_failure(void *handle, struct sk_buff *skb)
442
453
kfree_skb (skb );
443
454
connect_reply_upcall (ep , - EHOSTUNREACH );
444
455
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
+ }
445
462
remove_handle (ep -> com .dev , & ep -> com .dev -> atid_idr , ep -> atid );
446
463
cxgb4_free_atid (ep -> com .dev -> rdev .lldi .tids , ep -> atid );
447
464
dst_release (ep -> dst );
@@ -640,6 +657,7 @@ static int send_connect(struct c4iw_ep *ep)
640
657
struct sockaddr_in6 * ra6 = (struct sockaddr_in6 * )
641
658
& ep -> com .mapped_remote_addr ;
642
659
int win ;
660
+ int ret ;
643
661
644
662
wrlen = (ep -> com .remote_addr .ss_family == AF_INET ) ?
645
663
roundup (sizev4 , 16 ) :
@@ -693,6 +711,11 @@ static int send_connect(struct c4iw_ep *ep)
693
711
opt2 |= CONG_CNTRL_V (CONG_ALG_TAHOE );
694
712
opt2 |= T5_ISS_F ;
695
713
}
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
+
696
719
t4_set_arp_err_handler (skb , ep , act_open_req_arp_failure );
697
720
698
721
if (is_t4 (ep -> com .dev -> rdev .lldi .adapter_type )) {
@@ -790,7 +813,11 @@ static int send_connect(struct c4iw_ep *ep)
790
813
}
791
814
792
815
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 ;
794
821
}
795
822
796
823
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)
2091
2118
case CPL_ERR_CONN_EXIST :
2092
2119
if (ep -> retry_count ++ < ACT_OPEN_RETRY_COUNT ) {
2093
2120
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
+ }
2094
2130
remove_handle (ep -> com .dev , & ep -> com .dev -> atid_idr ,
2095
2131
atid );
2096
2132
cxgb4_free_atid (t , atid );
@@ -2118,6 +2154,12 @@ static int act_open_rpl(struct c4iw_dev *dev, struct sk_buff *skb)
2118
2154
connect_reply_upcall (ep , status2errno (status ));
2119
2155
state_set (& ep -> com , DEAD );
2120
2156
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
+ }
2121
2163
if (status && act_open_has_tid (status ))
2122
2164
cxgb4_remove_tid (ep -> com .dev -> rdev .lldi .tids , 0 , GET_TID (rpl ));
2123
2165
@@ -2302,6 +2344,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)
2302
2344
struct dst_entry * dst ;
2303
2345
__u8 local_ip [16 ], peer_ip [16 ];
2304
2346
__be16 local_port , peer_port ;
2347
+ struct sockaddr_in6 * sin6 ;
2305
2348
int err ;
2306
2349
u16 peer_mss = ntohs (req -> tcpopt .mss );
2307
2350
int iptype ;
@@ -2400,9 +2443,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)
2400
2443
sin -> sin_port = peer_port ;
2401
2444
sin -> sin_addr .s_addr = * (__be32 * )peer_ip ;
2402
2445
} 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 ;
2406
2447
sin6 -> sin6_family = PF_INET6 ;
2407
2448
sin6 -> sin6_port = local_port ;
2408
2449
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)
2436
2477
insert_handle (dev , & dev -> hwtid_idr , child_ep , child_ep -> hwtid );
2437
2478
accept_cr (child_ep , skb , req );
2438
2479
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
+ }
2439
2485
goto out ;
2440
2486
reject :
2441
2487
reject_cr (dev , hwtid , skb );
@@ -2672,6 +2718,15 @@ static int peer_abort(struct c4iw_dev *dev, struct sk_buff *skb)
2672
2718
if (release )
2673
2719
release_ep_resources (ep );
2674
2720
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
+ }
2675
2730
remove_handle (ep -> com .dev , & ep -> com .dev -> hwtid_idr , ep -> hwtid );
2676
2731
cxgb4_remove_tid (ep -> com .dev -> rdev .lldi .tids , 0 , ep -> hwtid );
2677
2732
dst_release (ep -> dst );
@@ -3186,6 +3241,9 @@ static int create_server6(struct c4iw_dev *dev, struct c4iw_listen_ep *ep)
3186
3241
pr_err ("cxgb4_create_server6/filter failed err %d stid %d laddr %pI6 lport %d\n" ,
3187
3242
err , ep -> stid ,
3188
3243
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 );
3189
3247
return err ;
3190
3248
}
3191
3249
@@ -3334,6 +3392,7 @@ int c4iw_destroy_listen(struct iw_cm_id *cm_id)
3334
3392
ep -> com .dev -> rdev .lldi .ports [0 ], ep -> stid ,
3335
3393
ep -> com .dev -> rdev .lldi .rxq_ids [0 ], 0 );
3336
3394
} else {
3395
+ struct sockaddr_in6 * sin6 ;
3337
3396
c4iw_init_wr_wait (& ep -> com .wr_wait );
3338
3397
err = cxgb4_remove_server (
3339
3398
ep -> com .dev -> rdev .lldi .ports [0 ], ep -> stid ,
@@ -3342,6 +3401,9 @@ int c4iw_destroy_listen(struct iw_cm_id *cm_id)
3342
3401
goto done ;
3343
3402
err = c4iw_wait_for_reply (& ep -> com .dev -> rdev , & ep -> com .wr_wait ,
3344
3403
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 );
3345
3407
}
3346
3408
remove_handle (ep -> com .dev , & ep -> com .dev -> stid_idr , ep -> stid );
3347
3409
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,
3461
3523
mutex_unlock (& dev -> rdev .stats .lock );
3462
3524
connect_reply_upcall (ep , status2errno (req -> retval ));
3463
3525
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
+ }
3464
3532
remove_handle (dev , & dev -> atid_idr , atid );
3465
3533
cxgb4_free_atid (dev -> rdev .lldi .tids , atid );
3466
3534
dst_release (ep -> dst );
0 commit comments