qedr_iw_cm.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752
  1. /* QLogic qedr NIC Driver
  2. * Copyright (c) 2015-2017 QLogic Corporation
  3. *
  4. * This software is available to you under a choice of one of two
  5. * licenses. You may choose to be licensed under the terms of the GNU
  6. * General Public License (GPL) Version 2, available from the file
  7. * COPYING in the main directory of this source tree, or the
  8. * OpenIB.org BSD license below:
  9. *
  10. * Redistribution and use in source and binary forms, with or
  11. * without modification, are permitted provided that the following
  12. * conditions are met:
  13. *
  14. * - Redistributions of source code must retain the above
  15. * copyright notice, this list of conditions and the following
  16. * disclaimer.
  17. *
  18. * - Redistributions in binary form must reproduce the above
  19. * copyright notice, this list of conditions and the following
  20. * disclaimer in the documentation and /or other materials
  21. * provided with the distribution.
  22. *
  23. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  24. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  25. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  26. * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  27. * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  28. * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  29. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  30. * SOFTWARE.
  31. */
  32. #include <net/ip.h>
  33. #include <net/ipv6.h>
  34. #include <net/udp.h>
  35. #include <net/addrconf.h>
  36. #include <net/route.h>
  37. #include <net/ip6_route.h>
  38. #include <net/flow.h>
  39. #include "qedr.h"
  40. #include "qedr_iw_cm.h"
  41. static inline void
  42. qedr_fill_sockaddr4(const struct qed_iwarp_cm_info *cm_info,
  43. struct iw_cm_event *event)
  44. {
  45. struct sockaddr_in *laddr = (struct sockaddr_in *)&event->local_addr;
  46. struct sockaddr_in *raddr = (struct sockaddr_in *)&event->remote_addr;
  47. laddr->sin_family = AF_INET;
  48. raddr->sin_family = AF_INET;
  49. laddr->sin_port = htons(cm_info->local_port);
  50. raddr->sin_port = htons(cm_info->remote_port);
  51. laddr->sin_addr.s_addr = htonl(cm_info->local_ip[0]);
  52. raddr->sin_addr.s_addr = htonl(cm_info->remote_ip[0]);
  53. }
  54. static inline void
  55. qedr_fill_sockaddr6(const struct qed_iwarp_cm_info *cm_info,
  56. struct iw_cm_event *event)
  57. {
  58. struct sockaddr_in6 *laddr6 = (struct sockaddr_in6 *)&event->local_addr;
  59. struct sockaddr_in6 *raddr6 =
  60. (struct sockaddr_in6 *)&event->remote_addr;
  61. int i;
  62. laddr6->sin6_family = AF_INET6;
  63. raddr6->sin6_family = AF_INET6;
  64. laddr6->sin6_port = htons(cm_info->local_port);
  65. raddr6->sin6_port = htons(cm_info->remote_port);
  66. for (i = 0; i < 4; i++) {
  67. laddr6->sin6_addr.in6_u.u6_addr32[i] =
  68. htonl(cm_info->local_ip[i]);
  69. raddr6->sin6_addr.in6_u.u6_addr32[i] =
  70. htonl(cm_info->remote_ip[i]);
  71. }
  72. }
  73. static void
  74. qedr_iw_mpa_request(void *context, struct qed_iwarp_cm_event_params *params)
  75. {
  76. struct qedr_iw_listener *listener = (struct qedr_iw_listener *)context;
  77. struct qedr_dev *dev = listener->dev;
  78. struct iw_cm_event event;
  79. struct qedr_iw_ep *ep;
  80. ep = kzalloc(sizeof(*ep), GFP_ATOMIC);
  81. if (!ep)
  82. return;
  83. ep->dev = dev;
  84. ep->qed_context = params->ep_context;
  85. memset(&event, 0, sizeof(event));
  86. event.event = IW_CM_EVENT_CONNECT_REQUEST;
  87. event.status = params->status;
  88. if (!IS_ENABLED(CONFIG_IPV6) ||
  89. params->cm_info->ip_version == QED_TCP_IPV4)
  90. qedr_fill_sockaddr4(params->cm_info, &event);
  91. else
  92. qedr_fill_sockaddr6(params->cm_info, &event);
  93. event.provider_data = (void *)ep;
  94. event.private_data = (void *)params->cm_info->private_data;
  95. event.private_data_len = (u8)params->cm_info->private_data_len;
  96. event.ord = params->cm_info->ord;
  97. event.ird = params->cm_info->ird;
  98. listener->cm_id->event_handler(listener->cm_id, &event);
  99. }
  100. static void
  101. qedr_iw_issue_event(void *context,
  102. struct qed_iwarp_cm_event_params *params,
  103. enum iw_cm_event_type event_type)
  104. {
  105. struct qedr_iw_ep *ep = (struct qedr_iw_ep *)context;
  106. struct iw_cm_event event;
  107. memset(&event, 0, sizeof(event));
  108. event.status = params->status;
  109. event.event = event_type;
  110. if (params->cm_info) {
  111. event.ird = params->cm_info->ird;
  112. event.ord = params->cm_info->ord;
  113. event.private_data_len = params->cm_info->private_data_len;
  114. event.private_data = (void *)params->cm_info->private_data;
  115. }
  116. if (ep->cm_id)
  117. ep->cm_id->event_handler(ep->cm_id, &event);
  118. }
  119. static void
  120. qedr_iw_close_event(void *context, struct qed_iwarp_cm_event_params *params)
  121. {
  122. struct qedr_iw_ep *ep = (struct qedr_iw_ep *)context;
  123. if (ep->cm_id) {
  124. qedr_iw_issue_event(context, params, IW_CM_EVENT_CLOSE);
  125. ep->cm_id->rem_ref(ep->cm_id);
  126. ep->cm_id = NULL;
  127. }
  128. }
  129. static void
  130. qedr_iw_qp_event(void *context,
  131. struct qed_iwarp_cm_event_params *params,
  132. enum ib_event_type ib_event, char *str)
  133. {
  134. struct qedr_iw_ep *ep = (struct qedr_iw_ep *)context;
  135. struct qedr_dev *dev = ep->dev;
  136. struct ib_qp *ibqp = &ep->qp->ibqp;
  137. struct ib_event event;
  138. DP_NOTICE(dev, "QP error received: %s\n", str);
  139. if (ibqp->event_handler) {
  140. event.event = ib_event;
  141. event.device = ibqp->device;
  142. event.element.qp = ibqp;
  143. ibqp->event_handler(&event, ibqp->qp_context);
  144. }
  145. }
  146. struct qedr_discon_work {
  147. struct work_struct work;
  148. struct qedr_iw_ep *ep;
  149. enum qed_iwarp_event_type event;
  150. int status;
  151. };
  152. static void qedr_iw_disconnect_worker(struct work_struct *work)
  153. {
  154. struct qedr_discon_work *dwork =
  155. container_of(work, struct qedr_discon_work, work);
  156. struct qed_rdma_modify_qp_in_params qp_params = { 0 };
  157. struct qedr_iw_ep *ep = dwork->ep;
  158. struct qedr_dev *dev = ep->dev;
  159. struct qedr_qp *qp = ep->qp;
  160. struct iw_cm_event event;
  161. if (qp->destroyed) {
  162. kfree(dwork);
  163. qedr_iw_qp_rem_ref(&qp->ibqp);
  164. return;
  165. }
  166. memset(&event, 0, sizeof(event));
  167. event.status = dwork->status;
  168. event.event = IW_CM_EVENT_DISCONNECT;
  169. /* Success means graceful disconnect was requested. modifying
  170. * to SQD is translated to graceful disconnect. O/w reset is sent
  171. */
  172. if (dwork->status)
  173. qp_params.new_state = QED_ROCE_QP_STATE_ERR;
  174. else
  175. qp_params.new_state = QED_ROCE_QP_STATE_SQD;
  176. kfree(dwork);
  177. if (ep->cm_id)
  178. ep->cm_id->event_handler(ep->cm_id, &event);
  179. SET_FIELD(qp_params.modify_flags,
  180. QED_RDMA_MODIFY_QP_VALID_NEW_STATE, 1);
  181. dev->ops->rdma_modify_qp(dev->rdma_ctx, qp->qed_qp, &qp_params);
  182. qedr_iw_qp_rem_ref(&qp->ibqp);
  183. }
  184. static void
  185. qedr_iw_disconnect_event(void *context,
  186. struct qed_iwarp_cm_event_params *params)
  187. {
  188. struct qedr_discon_work *work;
  189. struct qedr_iw_ep *ep = (struct qedr_iw_ep *)context;
  190. struct qedr_dev *dev = ep->dev;
  191. struct qedr_qp *qp = ep->qp;
  192. work = kzalloc(sizeof(*work), GFP_ATOMIC);
  193. if (!work)
  194. return;
  195. qedr_iw_qp_add_ref(&qp->ibqp);
  196. work->ep = ep;
  197. work->event = params->event;
  198. work->status = params->status;
  199. INIT_WORK(&work->work, qedr_iw_disconnect_worker);
  200. queue_work(dev->iwarp_wq, &work->work);
  201. }
  202. static void
  203. qedr_iw_passive_complete(void *context,
  204. struct qed_iwarp_cm_event_params *params)
  205. {
  206. struct qedr_iw_ep *ep = (struct qedr_iw_ep *)context;
  207. struct qedr_dev *dev = ep->dev;
  208. /* We will only reach the following state if MPA_REJECT was called on
  209. * passive. In this case there will be no associated QP.
  210. */
  211. if ((params->status == -ECONNREFUSED) && (!ep->qp)) {
  212. DP_DEBUG(dev, QEDR_MSG_IWARP,
  213. "PASSIVE connection refused releasing ep...\n");
  214. kfree(ep);
  215. return;
  216. }
  217. qedr_iw_issue_event(context, params, IW_CM_EVENT_ESTABLISHED);
  218. if (params->status < 0)
  219. qedr_iw_close_event(context, params);
  220. }
  221. static int
  222. qedr_iw_mpa_reply(void *context, struct qed_iwarp_cm_event_params *params)
  223. {
  224. struct qedr_iw_ep *ep = (struct qedr_iw_ep *)context;
  225. struct qedr_dev *dev = ep->dev;
  226. struct qed_iwarp_send_rtr_in rtr_in;
  227. rtr_in.ep_context = params->ep_context;
  228. return dev->ops->iwarp_send_rtr(dev->rdma_ctx, &rtr_in);
  229. }
  230. static int
  231. qedr_iw_event_handler(void *context, struct qed_iwarp_cm_event_params *params)
  232. {
  233. struct qedr_iw_ep *ep = (struct qedr_iw_ep *)context;
  234. struct qedr_dev *dev = ep->dev;
  235. switch (params->event) {
  236. case QED_IWARP_EVENT_MPA_REQUEST:
  237. qedr_iw_mpa_request(context, params);
  238. break;
  239. case QED_IWARP_EVENT_ACTIVE_MPA_REPLY:
  240. qedr_iw_mpa_reply(context, params);
  241. break;
  242. case QED_IWARP_EVENT_PASSIVE_COMPLETE:
  243. ep->during_connect = 0;
  244. qedr_iw_passive_complete(context, params);
  245. break;
  246. case QED_IWARP_EVENT_ACTIVE_COMPLETE:
  247. ep->during_connect = 0;
  248. qedr_iw_issue_event(context,
  249. params,
  250. IW_CM_EVENT_CONNECT_REPLY);
  251. if (params->status < 0) {
  252. struct qedr_iw_ep *ep = (struct qedr_iw_ep *)context;
  253. ep->cm_id->rem_ref(ep->cm_id);
  254. ep->cm_id = NULL;
  255. }
  256. break;
  257. case QED_IWARP_EVENT_DISCONNECT:
  258. qedr_iw_disconnect_event(context, params);
  259. break;
  260. case QED_IWARP_EVENT_CLOSE:
  261. ep->during_connect = 0;
  262. qedr_iw_close_event(context, params);
  263. break;
  264. case QED_IWARP_EVENT_RQ_EMPTY:
  265. qedr_iw_qp_event(context, params, IB_EVENT_QP_FATAL,
  266. "QED_IWARP_EVENT_RQ_EMPTY");
  267. break;
  268. case QED_IWARP_EVENT_IRQ_FULL:
  269. qedr_iw_qp_event(context, params, IB_EVENT_QP_FATAL,
  270. "QED_IWARP_EVENT_IRQ_FULL");
  271. break;
  272. case QED_IWARP_EVENT_LLP_TIMEOUT:
  273. qedr_iw_qp_event(context, params, IB_EVENT_QP_FATAL,
  274. "QED_IWARP_EVENT_LLP_TIMEOUT");
  275. break;
  276. case QED_IWARP_EVENT_REMOTE_PROTECTION_ERROR:
  277. qedr_iw_qp_event(context, params, IB_EVENT_QP_ACCESS_ERR,
  278. "QED_IWARP_EVENT_REMOTE_PROTECTION_ERROR");
  279. break;
  280. case QED_IWARP_EVENT_CQ_OVERFLOW:
  281. qedr_iw_qp_event(context, params, IB_EVENT_QP_FATAL,
  282. "QED_IWARP_EVENT_CQ_OVERFLOW");
  283. break;
  284. case QED_IWARP_EVENT_QP_CATASTROPHIC:
  285. qedr_iw_qp_event(context, params, IB_EVENT_QP_FATAL,
  286. "QED_IWARP_EVENT_QP_CATASTROPHIC");
  287. break;
  288. case QED_IWARP_EVENT_LOCAL_ACCESS_ERROR:
  289. qedr_iw_qp_event(context, params, IB_EVENT_QP_ACCESS_ERR,
  290. "QED_IWARP_EVENT_LOCAL_ACCESS_ERROR");
  291. break;
  292. case QED_IWARP_EVENT_REMOTE_OPERATION_ERROR:
  293. qedr_iw_qp_event(context, params, IB_EVENT_QP_FATAL,
  294. "QED_IWARP_EVENT_REMOTE_OPERATION_ERROR");
  295. break;
  296. case QED_IWARP_EVENT_TERMINATE_RECEIVED:
  297. DP_NOTICE(dev, "Got terminate message\n");
  298. break;
  299. default:
  300. DP_NOTICE(dev, "Unknown event received %d\n", params->event);
  301. break;
  302. };
  303. return 0;
  304. }
  305. static u16 qedr_iw_get_vlan_ipv4(struct qedr_dev *dev, u32 *addr)
  306. {
  307. struct net_device *ndev;
  308. u16 vlan_id = 0;
  309. ndev = ip_dev_find(&init_net, htonl(addr[0]));
  310. if (ndev) {
  311. vlan_id = rdma_vlan_dev_vlan_id(ndev);
  312. dev_put(ndev);
  313. }
  314. if (vlan_id == 0xffff)
  315. vlan_id = 0;
  316. return vlan_id;
  317. }
  318. static u16 qedr_iw_get_vlan_ipv6(u32 *addr)
  319. {
  320. struct net_device *ndev = NULL;
  321. struct in6_addr laddr6;
  322. u16 vlan_id = 0;
  323. int i;
  324. if (!IS_ENABLED(CONFIG_IPV6))
  325. return vlan_id;
  326. for (i = 0; i < 4; i++)
  327. laddr6.in6_u.u6_addr32[i] = htonl(addr[i]);
  328. rcu_read_lock();
  329. for_each_netdev_rcu(&init_net, ndev) {
  330. if (ipv6_chk_addr(&init_net, &laddr6, ndev, 1)) {
  331. vlan_id = rdma_vlan_dev_vlan_id(ndev);
  332. break;
  333. }
  334. }
  335. rcu_read_unlock();
  336. if (vlan_id == 0xffff)
  337. vlan_id = 0;
  338. return vlan_id;
  339. }
  340. static int
  341. qedr_addr4_resolve(struct qedr_dev *dev,
  342. struct sockaddr_in *src_in,
  343. struct sockaddr_in *dst_in, u8 *dst_mac)
  344. {
  345. __be32 src_ip = src_in->sin_addr.s_addr;
  346. __be32 dst_ip = dst_in->sin_addr.s_addr;
  347. struct neighbour *neigh = NULL;
  348. struct rtable *rt = NULL;
  349. int rc = 0;
  350. rt = ip_route_output(&init_net, dst_ip, src_ip, 0, 0);
  351. if (IS_ERR(rt)) {
  352. DP_ERR(dev, "ip_route_output returned error\n");
  353. return -EINVAL;
  354. }
  355. neigh = dst_neigh_lookup(&rt->dst, &dst_ip);
  356. if (neigh) {
  357. rcu_read_lock();
  358. if (neigh->nud_state & NUD_VALID) {
  359. ether_addr_copy(dst_mac, neigh->ha);
  360. DP_DEBUG(dev, QEDR_MSG_QP, "mac_addr=[%pM]\n", dst_mac);
  361. } else {
  362. neigh_event_send(neigh, NULL);
  363. }
  364. rcu_read_unlock();
  365. neigh_release(neigh);
  366. }
  367. ip_rt_put(rt);
  368. return rc;
  369. }
  370. static int
  371. qedr_addr6_resolve(struct qedr_dev *dev,
  372. struct sockaddr_in6 *src_in,
  373. struct sockaddr_in6 *dst_in, u8 *dst_mac)
  374. {
  375. struct neighbour *neigh = NULL;
  376. struct dst_entry *dst;
  377. struct flowi6 fl6;
  378. int rc = 0;
  379. memset(&fl6, 0, sizeof(fl6));
  380. fl6.daddr = dst_in->sin6_addr;
  381. fl6.saddr = src_in->sin6_addr;
  382. dst = ip6_route_output(&init_net, NULL, &fl6);
  383. if ((!dst) || dst->error) {
  384. if (dst) {
  385. dst_release(dst);
  386. DP_ERR(dev,
  387. "ip6_route_output returned dst->error = %d\n",
  388. dst->error);
  389. }
  390. return -EINVAL;
  391. }
  392. neigh = dst_neigh_lookup(dst, &fl6.daddr);
  393. if (neigh) {
  394. rcu_read_lock();
  395. if (neigh->nud_state & NUD_VALID) {
  396. ether_addr_copy(dst_mac, neigh->ha);
  397. DP_DEBUG(dev, QEDR_MSG_QP, "mac_addr=[%pM]\n", dst_mac);
  398. } else {
  399. neigh_event_send(neigh, NULL);
  400. }
  401. rcu_read_unlock();
  402. neigh_release(neigh);
  403. }
  404. dst_release(dst);
  405. return rc;
  406. }
  407. int qedr_iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
  408. {
  409. struct qedr_dev *dev = get_qedr_dev(cm_id->device);
  410. struct qed_iwarp_connect_out out_params;
  411. struct qed_iwarp_connect_in in_params;
  412. struct qed_iwarp_cm_info *cm_info;
  413. struct sockaddr_in6 *laddr6;
  414. struct sockaddr_in6 *raddr6;
  415. struct sockaddr_in *laddr;
  416. struct sockaddr_in *raddr;
  417. struct qedr_iw_ep *ep;
  418. struct qedr_qp *qp;
  419. int rc = 0;
  420. int i;
  421. qp = idr_find(&dev->qpidr, conn_param->qpn);
  422. laddr = (struct sockaddr_in *)&cm_id->m_local_addr;
  423. raddr = (struct sockaddr_in *)&cm_id->m_remote_addr;
  424. laddr6 = (struct sockaddr_in6 *)&cm_id->m_local_addr;
  425. raddr6 = (struct sockaddr_in6 *)&cm_id->m_remote_addr;
  426. DP_DEBUG(dev, QEDR_MSG_IWARP, "MAPPED %d %d\n",
  427. ntohs(((struct sockaddr_in *)&cm_id->remote_addr)->sin_port),
  428. ntohs(raddr->sin_port));
  429. DP_DEBUG(dev, QEDR_MSG_IWARP,
  430. "Connect source address: %pISpc, remote address: %pISpc\n",
  431. &cm_id->local_addr, &cm_id->remote_addr);
  432. if (!laddr->sin_port || !raddr->sin_port)
  433. return -EINVAL;
  434. ep = kzalloc(sizeof(*ep), GFP_KERNEL);
  435. if (!ep)
  436. return -ENOMEM;
  437. ep->dev = dev;
  438. ep->qp = qp;
  439. qp->ep = ep;
  440. cm_id->add_ref(cm_id);
  441. ep->cm_id = cm_id;
  442. in_params.event_cb = qedr_iw_event_handler;
  443. in_params.cb_context = ep;
  444. cm_info = &in_params.cm_info;
  445. memset(cm_info->local_ip, 0, sizeof(cm_info->local_ip));
  446. memset(cm_info->remote_ip, 0, sizeof(cm_info->remote_ip));
  447. if (!IS_ENABLED(CONFIG_IPV6) ||
  448. cm_id->remote_addr.ss_family == AF_INET) {
  449. cm_info->ip_version = QED_TCP_IPV4;
  450. cm_info->remote_ip[0] = ntohl(raddr->sin_addr.s_addr);
  451. cm_info->local_ip[0] = ntohl(laddr->sin_addr.s_addr);
  452. cm_info->remote_port = ntohs(raddr->sin_port);
  453. cm_info->local_port = ntohs(laddr->sin_port);
  454. cm_info->vlan = qedr_iw_get_vlan_ipv4(dev, cm_info->local_ip);
  455. rc = qedr_addr4_resolve(dev, laddr, raddr,
  456. (u8 *)in_params.remote_mac_addr);
  457. in_params.mss = dev->iwarp_max_mtu -
  458. (sizeof(struct iphdr) + sizeof(struct tcphdr));
  459. } else {
  460. in_params.cm_info.ip_version = QED_TCP_IPV6;
  461. for (i = 0; i < 4; i++) {
  462. cm_info->remote_ip[i] =
  463. ntohl(raddr6->sin6_addr.in6_u.u6_addr32[i]);
  464. cm_info->local_ip[i] =
  465. ntohl(laddr6->sin6_addr.in6_u.u6_addr32[i]);
  466. }
  467. cm_info->local_port = ntohs(laddr6->sin6_port);
  468. cm_info->remote_port = ntohs(raddr6->sin6_port);
  469. in_params.mss = dev->iwarp_max_mtu -
  470. (sizeof(struct ipv6hdr) + sizeof(struct tcphdr));
  471. cm_info->vlan = qedr_iw_get_vlan_ipv6(cm_info->local_ip);
  472. rc = qedr_addr6_resolve(dev, laddr6, raddr6,
  473. (u8 *)in_params.remote_mac_addr);
  474. }
  475. if (rc)
  476. goto err;
  477. DP_DEBUG(dev, QEDR_MSG_IWARP,
  478. "ord = %d ird=%d private_data=%p private_data_len=%d rq_psn=%d\n",
  479. conn_param->ord, conn_param->ird, conn_param->private_data,
  480. conn_param->private_data_len, qp->rq_psn);
  481. cm_info->ord = conn_param->ord;
  482. cm_info->ird = conn_param->ird;
  483. cm_info->private_data = conn_param->private_data;
  484. cm_info->private_data_len = conn_param->private_data_len;
  485. in_params.qp = qp->qed_qp;
  486. memcpy(in_params.local_mac_addr, dev->ndev->dev_addr, ETH_ALEN);
  487. ep->during_connect = 1;
  488. rc = dev->ops->iwarp_connect(dev->rdma_ctx, &in_params, &out_params);
  489. if (rc)
  490. goto err;
  491. return rc;
  492. err:
  493. cm_id->rem_ref(cm_id);
  494. kfree(ep);
  495. return rc;
  496. }
  497. int qedr_iw_create_listen(struct iw_cm_id *cm_id, int backlog)
  498. {
  499. struct qedr_dev *dev = get_qedr_dev(cm_id->device);
  500. struct qedr_iw_listener *listener;
  501. struct qed_iwarp_listen_in iparams;
  502. struct qed_iwarp_listen_out oparams;
  503. struct sockaddr_in *laddr;
  504. struct sockaddr_in6 *laddr6;
  505. int rc;
  506. int i;
  507. laddr = (struct sockaddr_in *)&cm_id->m_local_addr;
  508. laddr6 = (struct sockaddr_in6 *)&cm_id->m_local_addr;
  509. DP_DEBUG(dev, QEDR_MSG_IWARP,
  510. "Create Listener address: %pISpc\n", &cm_id->local_addr);
  511. listener = kzalloc(sizeof(*listener), GFP_KERNEL);
  512. if (!listener)
  513. return -ENOMEM;
  514. listener->dev = dev;
  515. cm_id->add_ref(cm_id);
  516. listener->cm_id = cm_id;
  517. listener->backlog = backlog;
  518. iparams.cb_context = listener;
  519. iparams.event_cb = qedr_iw_event_handler;
  520. iparams.max_backlog = backlog;
  521. if (!IS_ENABLED(CONFIG_IPV6) ||
  522. cm_id->local_addr.ss_family == AF_INET) {
  523. iparams.ip_version = QED_TCP_IPV4;
  524. memset(iparams.ip_addr, 0, sizeof(iparams.ip_addr));
  525. iparams.ip_addr[0] = ntohl(laddr->sin_addr.s_addr);
  526. iparams.port = ntohs(laddr->sin_port);
  527. iparams.vlan = qedr_iw_get_vlan_ipv4(dev, iparams.ip_addr);
  528. } else {
  529. iparams.ip_version = QED_TCP_IPV6;
  530. for (i = 0; i < 4; i++) {
  531. iparams.ip_addr[i] =
  532. ntohl(laddr6->sin6_addr.in6_u.u6_addr32[i]);
  533. }
  534. iparams.port = ntohs(laddr6->sin6_port);
  535. iparams.vlan = qedr_iw_get_vlan_ipv6(iparams.ip_addr);
  536. }
  537. rc = dev->ops->iwarp_create_listen(dev->rdma_ctx, &iparams, &oparams);
  538. if (rc)
  539. goto err;
  540. listener->qed_handle = oparams.handle;
  541. cm_id->provider_data = listener;
  542. return rc;
  543. err:
  544. cm_id->rem_ref(cm_id);
  545. kfree(listener);
  546. return rc;
  547. }
  548. int qedr_iw_destroy_listen(struct iw_cm_id *cm_id)
  549. {
  550. struct qedr_iw_listener *listener = cm_id->provider_data;
  551. struct qedr_dev *dev = get_qedr_dev(cm_id->device);
  552. int rc = 0;
  553. if (listener->qed_handle)
  554. rc = dev->ops->iwarp_destroy_listen(dev->rdma_ctx,
  555. listener->qed_handle);
  556. cm_id->rem_ref(cm_id);
  557. return rc;
  558. }
  559. int qedr_iw_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
  560. {
  561. struct qedr_iw_ep *ep = (struct qedr_iw_ep *)cm_id->provider_data;
  562. struct qedr_dev *dev = ep->dev;
  563. struct qedr_qp *qp;
  564. struct qed_iwarp_accept_in params;
  565. int rc;
  566. DP_DEBUG(dev, QEDR_MSG_IWARP, "Accept on qpid=%d\n", conn_param->qpn);
  567. qp = idr_find(&dev->qpidr, conn_param->qpn);
  568. if (!qp) {
  569. DP_ERR(dev, "Invalid QP number %d\n", conn_param->qpn);
  570. return -EINVAL;
  571. }
  572. ep->qp = qp;
  573. qp->ep = ep;
  574. cm_id->add_ref(cm_id);
  575. ep->cm_id = cm_id;
  576. params.ep_context = ep->qed_context;
  577. params.cb_context = ep;
  578. params.qp = ep->qp->qed_qp;
  579. params.private_data = conn_param->private_data;
  580. params.private_data_len = conn_param->private_data_len;
  581. params.ird = conn_param->ird;
  582. params.ord = conn_param->ord;
  583. ep->during_connect = 1;
  584. rc = dev->ops->iwarp_accept(dev->rdma_ctx, &params);
  585. if (rc)
  586. goto err;
  587. return rc;
  588. err:
  589. ep->during_connect = 0;
  590. cm_id->rem_ref(cm_id);
  591. return rc;
  592. }
  593. int qedr_iw_reject(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len)
  594. {
  595. struct qedr_iw_ep *ep = (struct qedr_iw_ep *)cm_id->provider_data;
  596. struct qedr_dev *dev = ep->dev;
  597. struct qed_iwarp_reject_in params;
  598. params.ep_context = ep->qed_context;
  599. params.cb_context = ep;
  600. params.private_data = pdata;
  601. params.private_data_len = pdata_len;
  602. ep->qp = NULL;
  603. return dev->ops->iwarp_reject(dev->rdma_ctx, &params);
  604. }
  605. void qedr_iw_qp_add_ref(struct ib_qp *ibqp)
  606. {
  607. struct qedr_qp *qp = get_qedr_qp(ibqp);
  608. atomic_inc(&qp->refcnt);
  609. }
  610. void qedr_iw_qp_rem_ref(struct ib_qp *ibqp)
  611. {
  612. struct qedr_qp *qp = get_qedr_qp(ibqp);
  613. if (atomic_dec_and_test(&qp->refcnt)) {
  614. spin_lock_irq(&qp->dev->idr_lock);
  615. idr_remove(&qp->dev->qpidr, qp->qp_id);
  616. spin_unlock_irq(&qp->dev->idr_lock);
  617. kfree(qp);
  618. }
  619. }
  620. struct ib_qp *qedr_iw_get_qp(struct ib_device *ibdev, int qpn)
  621. {
  622. struct qedr_dev *dev = get_qedr_dev(ibdev);
  623. return idr_find(&dev->qpidr, qpn);
  624. }