erdma_cm.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422
  1. // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
  2. /* Authors: Cheng Xu <[email protected]> */
  3. /* Kai Shen <[email protected]> */
  4. /* Copyright (c) 2020-2022, Alibaba Group. */
  5. /* Authors: Bernard Metzler <[email protected]> */
  6. /* Fredy Neeser */
  7. /* Greg Joyce <[email protected]> */
  8. /* Copyright (c) 2008-2019, IBM Corporation */
  9. /* Copyright (c) 2017, Open Grid Computing, Inc. */
  10. #include <linux/workqueue.h>
  11. #include "erdma.h"
  12. #include "erdma_cm.h"
  13. #include "erdma_verbs.h"
  14. static struct workqueue_struct *erdma_cm_wq;
  15. static void erdma_cm_llp_state_change(struct sock *sk);
  16. static void erdma_cm_llp_data_ready(struct sock *sk);
  17. static void erdma_cm_llp_error_report(struct sock *sk);
  18. static void erdma_sk_assign_cm_upcalls(struct sock *sk)
  19. {
  20. write_lock_bh(&sk->sk_callback_lock);
  21. sk->sk_state_change = erdma_cm_llp_state_change;
  22. sk->sk_data_ready = erdma_cm_llp_data_ready;
  23. sk->sk_error_report = erdma_cm_llp_error_report;
  24. write_unlock_bh(&sk->sk_callback_lock);
  25. }
  26. static void erdma_sk_save_upcalls(struct sock *sk)
  27. {
  28. struct erdma_cep *cep = sk_to_cep(sk);
  29. write_lock_bh(&sk->sk_callback_lock);
  30. cep->sk_state_change = sk->sk_state_change;
  31. cep->sk_data_ready = sk->sk_data_ready;
  32. cep->sk_error_report = sk->sk_error_report;
  33. write_unlock_bh(&sk->sk_callback_lock);
  34. }
  35. static void erdma_sk_restore_upcalls(struct sock *sk, struct erdma_cep *cep)
  36. {
  37. sk->sk_state_change = cep->sk_state_change;
  38. sk->sk_data_ready = cep->sk_data_ready;
  39. sk->sk_error_report = cep->sk_error_report;
  40. sk->sk_user_data = NULL;
  41. }
  42. static void erdma_socket_disassoc(struct socket *s)
  43. {
  44. struct sock *sk = s->sk;
  45. struct erdma_cep *cep;
  46. if (sk) {
  47. write_lock_bh(&sk->sk_callback_lock);
  48. cep = sk_to_cep(sk);
  49. if (cep) {
  50. erdma_sk_restore_upcalls(sk, cep);
  51. erdma_cep_put(cep);
  52. } else {
  53. WARN_ON_ONCE(1);
  54. }
  55. write_unlock_bh(&sk->sk_callback_lock);
  56. } else {
  57. WARN_ON_ONCE(1);
  58. }
  59. }
  60. static void erdma_cep_socket_assoc(struct erdma_cep *cep, struct socket *s)
  61. {
  62. cep->sock = s;
  63. erdma_cep_get(cep);
  64. s->sk->sk_user_data = cep;
  65. erdma_sk_save_upcalls(s->sk);
  66. erdma_sk_assign_cm_upcalls(s->sk);
  67. }
  68. static void erdma_disassoc_listen_cep(struct erdma_cep *cep)
  69. {
  70. if (cep->listen_cep) {
  71. erdma_cep_put(cep->listen_cep);
  72. cep->listen_cep = NULL;
  73. }
  74. }
  75. static struct erdma_cep *erdma_cep_alloc(struct erdma_dev *dev)
  76. {
  77. struct erdma_cep *cep = kzalloc(sizeof(*cep), GFP_KERNEL);
  78. unsigned long flags;
  79. if (!cep)
  80. return NULL;
  81. INIT_LIST_HEAD(&cep->listenq);
  82. INIT_LIST_HEAD(&cep->devq);
  83. INIT_LIST_HEAD(&cep->work_freelist);
  84. kref_init(&cep->ref);
  85. cep->state = ERDMA_EPSTATE_IDLE;
  86. init_waitqueue_head(&cep->waitq);
  87. spin_lock_init(&cep->lock);
  88. cep->dev = dev;
  89. spin_lock_irqsave(&dev->lock, flags);
  90. list_add_tail(&cep->devq, &dev->cep_list);
  91. spin_unlock_irqrestore(&dev->lock, flags);
  92. return cep;
  93. }
  94. static void erdma_cm_free_work(struct erdma_cep *cep)
  95. {
  96. struct list_head *w, *tmp;
  97. struct erdma_cm_work *work;
  98. list_for_each_safe(w, tmp, &cep->work_freelist) {
  99. work = list_entry(w, struct erdma_cm_work, list);
  100. list_del(&work->list);
  101. kfree(work);
  102. }
  103. }
  104. static void erdma_cancel_mpatimer(struct erdma_cep *cep)
  105. {
  106. spin_lock_bh(&cep->lock);
  107. if (cep->mpa_timer) {
  108. if (cancel_delayed_work(&cep->mpa_timer->work)) {
  109. erdma_cep_put(cep);
  110. kfree(cep->mpa_timer);
  111. }
  112. cep->mpa_timer = NULL;
  113. }
  114. spin_unlock_bh(&cep->lock);
  115. }
  116. static void erdma_put_work(struct erdma_cm_work *work)
  117. {
  118. INIT_LIST_HEAD(&work->list);
  119. spin_lock_bh(&work->cep->lock);
  120. list_add(&work->list, &work->cep->work_freelist);
  121. spin_unlock_bh(&work->cep->lock);
  122. }
  123. static void erdma_cep_set_inuse(struct erdma_cep *cep)
  124. {
  125. unsigned long flags;
  126. spin_lock_irqsave(&cep->lock, flags);
  127. while (cep->in_use) {
  128. spin_unlock_irqrestore(&cep->lock, flags);
  129. wait_event_interruptible(cep->waitq, !cep->in_use);
  130. if (signal_pending(current))
  131. flush_signals(current);
  132. spin_lock_irqsave(&cep->lock, flags);
  133. }
  134. cep->in_use = 1;
  135. spin_unlock_irqrestore(&cep->lock, flags);
  136. }
  137. static void erdma_cep_set_free(struct erdma_cep *cep)
  138. {
  139. unsigned long flags;
  140. spin_lock_irqsave(&cep->lock, flags);
  141. cep->in_use = 0;
  142. spin_unlock_irqrestore(&cep->lock, flags);
  143. wake_up(&cep->waitq);
  144. }
  145. static void __erdma_cep_dealloc(struct kref *ref)
  146. {
  147. struct erdma_cep *cep = container_of(ref, struct erdma_cep, ref);
  148. struct erdma_dev *dev = cep->dev;
  149. unsigned long flags;
  150. WARN_ON(cep->listen_cep);
  151. kfree(cep->private_data);
  152. kfree(cep->mpa.pdata);
  153. spin_lock_bh(&cep->lock);
  154. if (!list_empty(&cep->work_freelist))
  155. erdma_cm_free_work(cep);
  156. spin_unlock_bh(&cep->lock);
  157. spin_lock_irqsave(&dev->lock, flags);
  158. list_del(&cep->devq);
  159. spin_unlock_irqrestore(&dev->lock, flags);
  160. kfree(cep);
  161. }
  162. static struct erdma_cm_work *erdma_get_work(struct erdma_cep *cep)
  163. {
  164. struct erdma_cm_work *work = NULL;
  165. spin_lock_bh(&cep->lock);
  166. if (!list_empty(&cep->work_freelist)) {
  167. work = list_entry(cep->work_freelist.next, struct erdma_cm_work,
  168. list);
  169. list_del_init(&work->list);
  170. }
  171. spin_unlock_bh(&cep->lock);
  172. return work;
  173. }
  174. static int erdma_cm_alloc_work(struct erdma_cep *cep, int num)
  175. {
  176. struct erdma_cm_work *work;
  177. while (num--) {
  178. work = kmalloc(sizeof(*work), GFP_KERNEL);
  179. if (!work) {
  180. if (!(list_empty(&cep->work_freelist)))
  181. erdma_cm_free_work(cep);
  182. return -ENOMEM;
  183. }
  184. work->cep = cep;
  185. INIT_LIST_HEAD(&work->list);
  186. list_add(&work->list, &cep->work_freelist);
  187. }
  188. return 0;
  189. }
  190. static int erdma_cm_upcall(struct erdma_cep *cep, enum iw_cm_event_type reason,
  191. int status)
  192. {
  193. struct iw_cm_event event;
  194. struct iw_cm_id *cm_id;
  195. memset(&event, 0, sizeof(event));
  196. event.status = status;
  197. event.event = reason;
  198. if (reason == IW_CM_EVENT_CONNECT_REQUEST) {
  199. event.provider_data = cep;
  200. cm_id = cep->listen_cep->cm_id;
  201. event.ird = cep->dev->attrs.max_ird;
  202. event.ord = cep->dev->attrs.max_ord;
  203. } else {
  204. cm_id = cep->cm_id;
  205. }
  206. if (reason == IW_CM_EVENT_CONNECT_REQUEST ||
  207. reason == IW_CM_EVENT_CONNECT_REPLY) {
  208. u16 pd_len = be16_to_cpu(cep->mpa.hdr.params.pd_len);
  209. if (pd_len && cep->mpa.pdata) {
  210. event.private_data_len = pd_len;
  211. event.private_data = cep->mpa.pdata;
  212. }
  213. getname_local(cep->sock, &event.local_addr);
  214. getname_peer(cep->sock, &event.remote_addr);
  215. }
  216. return cm_id->event_handler(cm_id, &event);
  217. }
  218. void erdma_qp_cm_drop(struct erdma_qp *qp)
  219. {
  220. struct erdma_cep *cep = qp->cep;
  221. if (!qp->cep)
  222. return;
  223. erdma_cep_set_inuse(cep);
  224. /* already closed. */
  225. if (cep->state == ERDMA_EPSTATE_CLOSED)
  226. goto out;
  227. if (cep->cm_id) {
  228. switch (cep->state) {
  229. case ERDMA_EPSTATE_AWAIT_MPAREP:
  230. erdma_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY,
  231. -EINVAL);
  232. break;
  233. case ERDMA_EPSTATE_RDMA_MODE:
  234. erdma_cm_upcall(cep, IW_CM_EVENT_CLOSE, 0);
  235. break;
  236. case ERDMA_EPSTATE_IDLE:
  237. case ERDMA_EPSTATE_LISTENING:
  238. case ERDMA_EPSTATE_CONNECTING:
  239. case ERDMA_EPSTATE_AWAIT_MPAREQ:
  240. case ERDMA_EPSTATE_RECVD_MPAREQ:
  241. case ERDMA_EPSTATE_CLOSED:
  242. default:
  243. break;
  244. }
  245. cep->cm_id->rem_ref(cep->cm_id);
  246. cep->cm_id = NULL;
  247. erdma_cep_put(cep);
  248. }
  249. cep->state = ERDMA_EPSTATE_CLOSED;
  250. if (cep->sock) {
  251. erdma_socket_disassoc(cep->sock);
  252. sock_release(cep->sock);
  253. cep->sock = NULL;
  254. }
  255. if (cep->qp) {
  256. cep->qp = NULL;
  257. erdma_qp_put(qp);
  258. }
  259. out:
  260. erdma_cep_set_free(cep);
  261. }
  262. void erdma_cep_put(struct erdma_cep *cep)
  263. {
  264. WARN_ON(kref_read(&cep->ref) < 1);
  265. kref_put(&cep->ref, __erdma_cep_dealloc);
  266. }
  267. void erdma_cep_get(struct erdma_cep *cep)
  268. {
  269. kref_get(&cep->ref);
  270. }
  271. static int erdma_send_mpareqrep(struct erdma_cep *cep, const void *pdata,
  272. u8 pd_len)
  273. {
  274. struct socket *s = cep->sock;
  275. struct mpa_rr *rr = &cep->mpa.hdr;
  276. struct kvec iov[3];
  277. struct msghdr msg;
  278. int iovec_num = 0;
  279. int ret;
  280. int mpa_len;
  281. memset(&msg, 0, sizeof(msg));
  282. rr->params.pd_len = cpu_to_be16(pd_len);
  283. iov[iovec_num].iov_base = rr;
  284. iov[iovec_num].iov_len = sizeof(*rr);
  285. iovec_num++;
  286. mpa_len = sizeof(*rr);
  287. iov[iovec_num].iov_base = &cep->mpa.ext_data;
  288. iov[iovec_num].iov_len = sizeof(cep->mpa.ext_data);
  289. iovec_num++;
  290. mpa_len += sizeof(cep->mpa.ext_data);
  291. if (pd_len) {
  292. iov[iovec_num].iov_base = (char *)pdata;
  293. iov[iovec_num].iov_len = pd_len;
  294. mpa_len += pd_len;
  295. iovec_num++;
  296. }
  297. ret = kernel_sendmsg(s, &msg, iov, iovec_num, mpa_len);
  298. return ret < 0 ? ret : 0;
  299. }
  300. static inline int ksock_recv(struct socket *sock, char *buf, size_t size,
  301. int flags)
  302. {
  303. struct kvec iov = { buf, size };
  304. struct msghdr msg = { .msg_name = NULL, .msg_flags = flags };
  305. return kernel_recvmsg(sock, &msg, &iov, 1, size, flags);
  306. }
  307. static int __recv_mpa_hdr(struct erdma_cep *cep, int hdr_rcvd, char *hdr,
  308. int hdr_size, int *rcvd_out)
  309. {
  310. struct socket *s = cep->sock;
  311. int rcvd;
  312. *rcvd_out = 0;
  313. if (hdr_rcvd < hdr_size) {
  314. rcvd = ksock_recv(s, hdr + hdr_rcvd, hdr_size - hdr_rcvd,
  315. MSG_DONTWAIT);
  316. if (rcvd == -EAGAIN)
  317. return -EAGAIN;
  318. if (rcvd <= 0)
  319. return -ECONNABORTED;
  320. hdr_rcvd += rcvd;
  321. *rcvd_out = rcvd;
  322. if (hdr_rcvd < hdr_size)
  323. return -EAGAIN;
  324. }
  325. return 0;
  326. }
  327. static void __mpa_rr_set_revision(__be16 *bits, u8 rev)
  328. {
  329. *bits = (*bits & ~MPA_RR_MASK_REVISION) |
  330. (cpu_to_be16(rev) & MPA_RR_MASK_REVISION);
  331. }
  332. static u8 __mpa_rr_revision(__be16 mpa_rr_bits)
  333. {
  334. __be16 rev = mpa_rr_bits & MPA_RR_MASK_REVISION;
  335. return (u8)be16_to_cpu(rev);
  336. }
  337. static void __mpa_ext_set_cc(__be32 *bits, u32 cc)
  338. {
  339. *bits = (*bits & ~MPA_EXT_FLAG_CC) |
  340. (cpu_to_be32(cc) & MPA_EXT_FLAG_CC);
  341. }
  342. static u8 __mpa_ext_cc(__be32 mpa_ext_bits)
  343. {
  344. __be32 cc = mpa_ext_bits & MPA_EXT_FLAG_CC;
  345. return (u8)be32_to_cpu(cc);
  346. }
  347. /*
  348. * Receive MPA Request/Reply header.
  349. *
  350. * Returns 0 if complete MPA Request/Reply haeder including
  351. * eventual private data was received. Returns -EAGAIN if
  352. * header was partially received or negative error code otherwise.
  353. *
  354. * Context: May be called in process context only
  355. */
  356. static int erdma_recv_mpa_rr(struct erdma_cep *cep)
  357. {
  358. struct mpa_rr *hdr = &cep->mpa.hdr;
  359. struct socket *s = cep->sock;
  360. u16 pd_len;
  361. int rcvd, to_rcv, ret, pd_rcvd;
  362. if (cep->mpa.bytes_rcvd < sizeof(struct mpa_rr)) {
  363. ret = __recv_mpa_hdr(cep, cep->mpa.bytes_rcvd,
  364. (char *)&cep->mpa.hdr,
  365. sizeof(struct mpa_rr), &rcvd);
  366. cep->mpa.bytes_rcvd += rcvd;
  367. if (ret)
  368. return ret;
  369. }
  370. if (be16_to_cpu(hdr->params.pd_len) > MPA_MAX_PRIVDATA ||
  371. __mpa_rr_revision(hdr->params.bits) != MPA_REVISION_EXT_1)
  372. return -EPROTO;
  373. if (cep->mpa.bytes_rcvd - sizeof(struct mpa_rr) <
  374. sizeof(struct erdma_mpa_ext)) {
  375. ret = __recv_mpa_hdr(
  376. cep, cep->mpa.bytes_rcvd - sizeof(struct mpa_rr),
  377. (char *)&cep->mpa.ext_data,
  378. sizeof(struct erdma_mpa_ext), &rcvd);
  379. cep->mpa.bytes_rcvd += rcvd;
  380. if (ret)
  381. return ret;
  382. }
  383. pd_len = be16_to_cpu(hdr->params.pd_len);
  384. pd_rcvd = cep->mpa.bytes_rcvd - sizeof(struct mpa_rr) -
  385. sizeof(struct erdma_mpa_ext);
  386. to_rcv = pd_len - pd_rcvd;
  387. if (!to_rcv) {
  388. /*
  389. * We have received the whole MPA Request/Reply message.
  390. * Check against peer protocol violation.
  391. */
  392. u32 word;
  393. ret = __recv_mpa_hdr(cep, 0, (char *)&word, sizeof(word),
  394. &rcvd);
  395. if (ret == -EAGAIN && rcvd == 0)
  396. return 0;
  397. if (ret)
  398. return ret;
  399. return -EPROTO;
  400. }
  401. /*
  402. * At this point, MPA header has been fully received, and pd_len != 0.
  403. * So, begin to receive private data.
  404. */
  405. if (!cep->mpa.pdata) {
  406. cep->mpa.pdata = kmalloc(pd_len + 4, GFP_KERNEL);
  407. if (!cep->mpa.pdata)
  408. return -ENOMEM;
  409. }
  410. rcvd = ksock_recv(s, cep->mpa.pdata + pd_rcvd, to_rcv + 4,
  411. MSG_DONTWAIT);
  412. if (rcvd < 0)
  413. return rcvd;
  414. if (rcvd > to_rcv)
  415. return -EPROTO;
  416. cep->mpa.bytes_rcvd += rcvd;
  417. if (to_rcv == rcvd)
  418. return 0;
  419. return -EAGAIN;
  420. }
  421. /*
  422. * erdma_proc_mpareq()
  423. *
  424. * Read MPA Request from socket and signal new connection to IWCM
  425. * if success. Caller must hold lock on corresponding listening CEP.
  426. */
  427. static int erdma_proc_mpareq(struct erdma_cep *cep)
  428. {
  429. struct mpa_rr *req;
  430. int ret;
  431. ret = erdma_recv_mpa_rr(cep);
  432. if (ret)
  433. return ret;
  434. req = &cep->mpa.hdr;
  435. if (memcmp(req->key, MPA_KEY_REQ, MPA_KEY_SIZE))
  436. return -EPROTO;
  437. memcpy(req->key, MPA_KEY_REP, MPA_KEY_SIZE);
  438. /* Currently does not support marker and crc. */
  439. if (req->params.bits & MPA_RR_FLAG_MARKERS ||
  440. req->params.bits & MPA_RR_FLAG_CRC)
  441. goto reject_conn;
  442. cep->state = ERDMA_EPSTATE_RECVD_MPAREQ;
  443. /* Keep reference until IWCM accepts/rejects */
  444. erdma_cep_get(cep);
  445. ret = erdma_cm_upcall(cep, IW_CM_EVENT_CONNECT_REQUEST, 0);
  446. if (ret)
  447. erdma_cep_put(cep);
  448. return ret;
  449. reject_conn:
  450. req->params.bits &= ~MPA_RR_FLAG_MARKERS;
  451. req->params.bits |= MPA_RR_FLAG_REJECT;
  452. req->params.bits &= ~MPA_RR_FLAG_CRC;
  453. kfree(cep->mpa.pdata);
  454. cep->mpa.pdata = NULL;
  455. erdma_send_mpareqrep(cep, NULL, 0);
  456. return -EOPNOTSUPP;
  457. }
  458. static int erdma_proc_mpareply(struct erdma_cep *cep)
  459. {
  460. struct erdma_qp_attrs qp_attrs;
  461. struct erdma_qp *qp = cep->qp;
  462. struct mpa_rr *rep;
  463. int ret;
  464. ret = erdma_recv_mpa_rr(cep);
  465. if (ret)
  466. goto out_err;
  467. erdma_cancel_mpatimer(cep);
  468. rep = &cep->mpa.hdr;
  469. if (memcmp(rep->key, MPA_KEY_REP, MPA_KEY_SIZE)) {
  470. ret = -EPROTO;
  471. goto out_err;
  472. }
  473. if (rep->params.bits & MPA_RR_FLAG_REJECT) {
  474. erdma_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY, -ECONNRESET);
  475. return -ECONNRESET;
  476. }
  477. /* Currently does not support marker and crc. */
  478. if ((rep->params.bits & MPA_RR_FLAG_MARKERS) ||
  479. (rep->params.bits & MPA_RR_FLAG_CRC)) {
  480. erdma_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY, -ECONNREFUSED);
  481. return -EINVAL;
  482. }
  483. memset(&qp_attrs, 0, sizeof(qp_attrs));
  484. qp_attrs.irq_size = cep->ird;
  485. qp_attrs.orq_size = cep->ord;
  486. qp_attrs.state = ERDMA_QP_STATE_RTS;
  487. down_write(&qp->state_lock);
  488. if (qp->attrs.state > ERDMA_QP_STATE_RTR) {
  489. ret = -EINVAL;
  490. up_write(&qp->state_lock);
  491. goto out_err;
  492. }
  493. qp->attrs.qp_type = ERDMA_QP_ACTIVE;
  494. if (__mpa_ext_cc(cep->mpa.ext_data.bits) != qp->attrs.cc)
  495. qp->attrs.cc = COMPROMISE_CC;
  496. ret = erdma_modify_qp_internal(qp, &qp_attrs,
  497. ERDMA_QP_ATTR_STATE |
  498. ERDMA_QP_ATTR_LLP_HANDLE |
  499. ERDMA_QP_ATTR_MPA);
  500. up_write(&qp->state_lock);
  501. if (!ret) {
  502. ret = erdma_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY, 0);
  503. if (!ret)
  504. cep->state = ERDMA_EPSTATE_RDMA_MODE;
  505. return 0;
  506. }
  507. out_err:
  508. if (ret != -EAGAIN)
  509. erdma_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY, -EINVAL);
  510. return ret;
  511. }
  512. static void erdma_accept_newconn(struct erdma_cep *cep)
  513. {
  514. struct socket *s = cep->sock;
  515. struct socket *new_s = NULL;
  516. struct erdma_cep *new_cep = NULL;
  517. int ret = 0;
  518. if (cep->state != ERDMA_EPSTATE_LISTENING)
  519. goto error;
  520. new_cep = erdma_cep_alloc(cep->dev);
  521. if (!new_cep)
  522. goto error;
  523. /*
  524. * 4: Allocate a sufficient number of work elements
  525. * to allow concurrent handling of local + peer close
  526. * events, MPA header processing + MPA timeout.
  527. */
  528. if (erdma_cm_alloc_work(new_cep, 4) != 0)
  529. goto error;
  530. /*
  531. * Copy saved socket callbacks from listening CEP
  532. * and assign new socket with new CEP
  533. */
  534. new_cep->sk_state_change = cep->sk_state_change;
  535. new_cep->sk_data_ready = cep->sk_data_ready;
  536. new_cep->sk_error_report = cep->sk_error_report;
  537. ret = kernel_accept(s, &new_s, O_NONBLOCK);
  538. if (ret != 0)
  539. goto error;
  540. new_cep->sock = new_s;
  541. erdma_cep_get(new_cep);
  542. new_s->sk->sk_user_data = new_cep;
  543. tcp_sock_set_nodelay(new_s->sk);
  544. new_cep->state = ERDMA_EPSTATE_AWAIT_MPAREQ;
  545. ret = erdma_cm_queue_work(new_cep, ERDMA_CM_WORK_MPATIMEOUT);
  546. if (ret)
  547. goto error;
  548. new_cep->listen_cep = cep;
  549. erdma_cep_get(cep);
  550. if (atomic_read(&new_s->sk->sk_rmem_alloc)) {
  551. /* MPA REQ already queued */
  552. erdma_cep_set_inuse(new_cep);
  553. ret = erdma_proc_mpareq(new_cep);
  554. if (ret != -EAGAIN) {
  555. erdma_cep_put(cep);
  556. new_cep->listen_cep = NULL;
  557. if (ret) {
  558. erdma_cep_set_free(new_cep);
  559. goto error;
  560. }
  561. }
  562. erdma_cep_set_free(new_cep);
  563. }
  564. return;
  565. error:
  566. if (new_cep) {
  567. new_cep->state = ERDMA_EPSTATE_CLOSED;
  568. erdma_cancel_mpatimer(new_cep);
  569. erdma_cep_put(new_cep);
  570. new_cep->sock = NULL;
  571. }
  572. if (new_s) {
  573. erdma_socket_disassoc(new_s);
  574. sock_release(new_s);
  575. }
  576. }
  577. static int erdma_newconn_connected(struct erdma_cep *cep)
  578. {
  579. int ret = 0;
  580. cep->mpa.hdr.params.bits = 0;
  581. __mpa_rr_set_revision(&cep->mpa.hdr.params.bits, MPA_REVISION_EXT_1);
  582. memcpy(cep->mpa.hdr.key, MPA_KEY_REQ, MPA_KEY_SIZE);
  583. cep->mpa.ext_data.cookie = cpu_to_be32(cep->qp->attrs.cookie);
  584. __mpa_ext_set_cc(&cep->mpa.ext_data.bits, cep->qp->attrs.cc);
  585. ret = erdma_send_mpareqrep(cep, cep->private_data, cep->pd_len);
  586. cep->state = ERDMA_EPSTATE_AWAIT_MPAREP;
  587. cep->mpa.hdr.params.pd_len = 0;
  588. if (ret >= 0)
  589. ret = erdma_cm_queue_work(cep, ERDMA_CM_WORK_MPATIMEOUT);
  590. return ret;
  591. }
  592. static void erdma_cm_work_handler(struct work_struct *w)
  593. {
  594. struct erdma_cm_work *work;
  595. struct erdma_cep *cep;
  596. int release_cep = 0, ret = 0;
  597. work = container_of(w, struct erdma_cm_work, work.work);
  598. cep = work->cep;
  599. erdma_cep_set_inuse(cep);
  600. switch (work->type) {
  601. case ERDMA_CM_WORK_CONNECTED:
  602. erdma_cancel_mpatimer(cep);
  603. if (cep->state == ERDMA_EPSTATE_CONNECTING) {
  604. ret = erdma_newconn_connected(cep);
  605. if (ret) {
  606. erdma_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY,
  607. -EIO);
  608. release_cep = 1;
  609. }
  610. }
  611. break;
  612. case ERDMA_CM_WORK_CONNECTTIMEOUT:
  613. if (cep->state == ERDMA_EPSTATE_CONNECTING) {
  614. cep->mpa_timer = NULL;
  615. erdma_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY,
  616. -ETIMEDOUT);
  617. release_cep = 1;
  618. }
  619. break;
  620. case ERDMA_CM_WORK_ACCEPT:
  621. erdma_accept_newconn(cep);
  622. break;
  623. case ERDMA_CM_WORK_READ_MPAHDR:
  624. if (cep->state == ERDMA_EPSTATE_AWAIT_MPAREQ) {
  625. if (cep->listen_cep) {
  626. erdma_cep_set_inuse(cep->listen_cep);
  627. if (cep->listen_cep->state ==
  628. ERDMA_EPSTATE_LISTENING)
  629. ret = erdma_proc_mpareq(cep);
  630. else
  631. ret = -EFAULT;
  632. erdma_cep_set_free(cep->listen_cep);
  633. if (ret != -EAGAIN) {
  634. erdma_cep_put(cep->listen_cep);
  635. cep->listen_cep = NULL;
  636. if (ret)
  637. erdma_cep_put(cep);
  638. }
  639. }
  640. } else if (cep->state == ERDMA_EPSTATE_AWAIT_MPAREP) {
  641. ret = erdma_proc_mpareply(cep);
  642. }
  643. if (ret && ret != -EAGAIN)
  644. release_cep = 1;
  645. break;
  646. case ERDMA_CM_WORK_CLOSE_LLP:
  647. if (cep->cm_id)
  648. erdma_cm_upcall(cep, IW_CM_EVENT_CLOSE, 0);
  649. release_cep = 1;
  650. break;
  651. case ERDMA_CM_WORK_PEER_CLOSE:
  652. if (cep->cm_id) {
  653. if (cep->state == ERDMA_EPSTATE_CONNECTING ||
  654. cep->state == ERDMA_EPSTATE_AWAIT_MPAREP) {
  655. /*
  656. * MPA reply not received, but connection drop
  657. */
  658. erdma_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY,
  659. -ECONNRESET);
  660. } else if (cep->state == ERDMA_EPSTATE_RDMA_MODE) {
  661. /*
  662. * NOTE: IW_CM_EVENT_DISCONNECT is given just
  663. * to transition IWCM into CLOSING.
  664. */
  665. erdma_cm_upcall(cep, IW_CM_EVENT_DISCONNECT, 0);
  666. erdma_cm_upcall(cep, IW_CM_EVENT_CLOSE, 0);
  667. }
  668. } else if (cep->state == ERDMA_EPSTATE_AWAIT_MPAREQ) {
  669. /* Socket close before MPA request received. */
  670. erdma_disassoc_listen_cep(cep);
  671. erdma_cep_put(cep);
  672. }
  673. release_cep = 1;
  674. break;
  675. case ERDMA_CM_WORK_MPATIMEOUT:
  676. cep->mpa_timer = NULL;
  677. if (cep->state == ERDMA_EPSTATE_AWAIT_MPAREP) {
  678. /*
  679. * MPA request timed out:
  680. * Hide any partially received private data and signal
  681. * timeout
  682. */
  683. cep->mpa.hdr.params.pd_len = 0;
  684. if (cep->cm_id)
  685. erdma_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY,
  686. -ETIMEDOUT);
  687. release_cep = 1;
  688. } else if (cep->state == ERDMA_EPSTATE_AWAIT_MPAREQ) {
  689. /* No MPA req received after peer TCP stream setup. */
  690. erdma_disassoc_listen_cep(cep);
  691. erdma_cep_put(cep);
  692. release_cep = 1;
  693. }
  694. break;
  695. default:
  696. WARN(1, "Undefined CM work type: %d\n", work->type);
  697. }
  698. if (release_cep) {
  699. erdma_cancel_mpatimer(cep);
  700. cep->state = ERDMA_EPSTATE_CLOSED;
  701. if (cep->qp) {
  702. struct erdma_qp *qp = cep->qp;
  703. /*
  704. * Serialize a potential race with application
  705. * closing the QP and calling erdma_qp_cm_drop()
  706. */
  707. erdma_qp_get(qp);
  708. erdma_cep_set_free(cep);
  709. erdma_qp_llp_close(qp);
  710. erdma_qp_put(qp);
  711. erdma_cep_set_inuse(cep);
  712. cep->qp = NULL;
  713. erdma_qp_put(qp);
  714. }
  715. if (cep->sock) {
  716. erdma_socket_disassoc(cep->sock);
  717. sock_release(cep->sock);
  718. cep->sock = NULL;
  719. }
  720. if (cep->cm_id) {
  721. cep->cm_id->rem_ref(cep->cm_id);
  722. cep->cm_id = NULL;
  723. if (cep->state != ERDMA_EPSTATE_LISTENING)
  724. erdma_cep_put(cep);
  725. }
  726. }
  727. erdma_cep_set_free(cep);
  728. erdma_put_work(work);
  729. erdma_cep_put(cep);
  730. }
  731. int erdma_cm_queue_work(struct erdma_cep *cep, enum erdma_work_type type)
  732. {
  733. struct erdma_cm_work *work = erdma_get_work(cep);
  734. unsigned long delay = 0;
  735. if (!work)
  736. return -ENOMEM;
  737. work->type = type;
  738. work->cep = cep;
  739. erdma_cep_get(cep);
  740. INIT_DELAYED_WORK(&work->work, erdma_cm_work_handler);
  741. if (type == ERDMA_CM_WORK_MPATIMEOUT) {
  742. cep->mpa_timer = work;
  743. if (cep->state == ERDMA_EPSTATE_AWAIT_MPAREP)
  744. delay = MPAREP_TIMEOUT;
  745. else
  746. delay = MPAREQ_TIMEOUT;
  747. } else if (type == ERDMA_CM_WORK_CONNECTTIMEOUT) {
  748. cep->mpa_timer = work;
  749. delay = CONNECT_TIMEOUT;
  750. }
  751. queue_delayed_work(erdma_cm_wq, &work->work, delay);
  752. return 0;
  753. }
  754. static void erdma_cm_llp_data_ready(struct sock *sk)
  755. {
  756. struct erdma_cep *cep;
  757. read_lock(&sk->sk_callback_lock);
  758. cep = sk_to_cep(sk);
  759. if (!cep)
  760. goto out;
  761. if (cep->state == ERDMA_EPSTATE_AWAIT_MPAREQ ||
  762. cep->state == ERDMA_EPSTATE_AWAIT_MPAREP)
  763. erdma_cm_queue_work(cep, ERDMA_CM_WORK_READ_MPAHDR);
  764. out:
  765. read_unlock(&sk->sk_callback_lock);
  766. }
  767. static void erdma_cm_llp_error_report(struct sock *sk)
  768. {
  769. struct erdma_cep *cep = sk_to_cep(sk);
  770. if (cep)
  771. cep->sk_error_report(sk);
  772. }
  773. static void erdma_cm_llp_state_change(struct sock *sk)
  774. {
  775. struct erdma_cep *cep;
  776. void (*orig_state_change)(struct sock *sk);
  777. read_lock(&sk->sk_callback_lock);
  778. cep = sk_to_cep(sk);
  779. if (!cep) {
  780. read_unlock(&sk->sk_callback_lock);
  781. return;
  782. }
  783. orig_state_change = cep->sk_state_change;
  784. switch (sk->sk_state) {
  785. case TCP_ESTABLISHED:
  786. if (cep->state == ERDMA_EPSTATE_CONNECTING)
  787. erdma_cm_queue_work(cep, ERDMA_CM_WORK_CONNECTED);
  788. else
  789. erdma_cm_queue_work(cep, ERDMA_CM_WORK_ACCEPT);
  790. break;
  791. case TCP_CLOSE:
  792. case TCP_CLOSE_WAIT:
  793. if (cep->state != ERDMA_EPSTATE_LISTENING)
  794. erdma_cm_queue_work(cep, ERDMA_CM_WORK_PEER_CLOSE);
  795. break;
  796. default:
  797. break;
  798. }
  799. read_unlock(&sk->sk_callback_lock);
  800. orig_state_change(sk);
  801. }
  802. static int kernel_bindconnect(struct socket *s, struct sockaddr *laddr,
  803. int laddrlen, struct sockaddr *raddr,
  804. int raddrlen, int flags)
  805. {
  806. int ret;
  807. sock_set_reuseaddr(s->sk);
  808. ret = s->ops->bind(s, laddr, laddrlen);
  809. if (ret)
  810. return ret;
  811. ret = s->ops->connect(s, raddr, raddrlen, flags);
  812. return ret < 0 ? ret : 0;
  813. }
  814. int erdma_connect(struct iw_cm_id *id, struct iw_cm_conn_param *params)
  815. {
  816. struct erdma_dev *dev = to_edev(id->device);
  817. struct erdma_qp *qp;
  818. struct erdma_cep *cep = NULL;
  819. struct socket *s = NULL;
  820. struct sockaddr *laddr = (struct sockaddr *)&id->m_local_addr;
  821. struct sockaddr *raddr = (struct sockaddr *)&id->m_remote_addr;
  822. u16 pd_len = params->private_data_len;
  823. int ret;
  824. if (pd_len > MPA_MAX_PRIVDATA)
  825. return -EINVAL;
  826. if (params->ird > dev->attrs.max_ird ||
  827. params->ord > dev->attrs.max_ord)
  828. return -EINVAL;
  829. if (laddr->sa_family != AF_INET || raddr->sa_family != AF_INET)
  830. return -EAFNOSUPPORT;
  831. qp = find_qp_by_qpn(dev, params->qpn);
  832. if (!qp)
  833. return -ENOENT;
  834. erdma_qp_get(qp);
  835. ret = sock_create(AF_INET, SOCK_STREAM, IPPROTO_TCP, &s);
  836. if (ret < 0)
  837. goto error_put_qp;
  838. cep = erdma_cep_alloc(dev);
  839. if (!cep) {
  840. ret = -ENOMEM;
  841. goto error_release_sock;
  842. }
  843. erdma_cep_set_inuse(cep);
  844. /* Associate QP with CEP */
  845. erdma_cep_get(cep);
  846. qp->cep = cep;
  847. cep->qp = qp;
  848. /* Associate cm_id with CEP */
  849. id->add_ref(id);
  850. cep->cm_id = id;
  851. /*
  852. * 6: Allocate a sufficient number of work elements
  853. * to allow concurrent handling of local + peer close
  854. * events, MPA header processing + MPA timeout, connected event
  855. * and connect timeout.
  856. */
  857. ret = erdma_cm_alloc_work(cep, 6);
  858. if (ret != 0) {
  859. ret = -ENOMEM;
  860. goto error_release_cep;
  861. }
  862. cep->ird = params->ird;
  863. cep->ord = params->ord;
  864. cep->state = ERDMA_EPSTATE_CONNECTING;
  865. erdma_cep_socket_assoc(cep, s);
  866. if (pd_len) {
  867. cep->pd_len = pd_len;
  868. cep->private_data = kmalloc(pd_len, GFP_KERNEL);
  869. if (!cep->private_data) {
  870. ret = -ENOMEM;
  871. goto error_disassoc;
  872. }
  873. memcpy(cep->private_data, params->private_data,
  874. params->private_data_len);
  875. }
  876. ret = kernel_bindconnect(s, laddr, sizeof(*laddr), raddr,
  877. sizeof(*raddr), O_NONBLOCK);
  878. if (ret != -EINPROGRESS && ret != 0) {
  879. goto error_disassoc;
  880. } else if (ret == 0) {
  881. ret = erdma_cm_queue_work(cep, ERDMA_CM_WORK_CONNECTED);
  882. if (ret)
  883. goto error_disassoc;
  884. } else {
  885. ret = erdma_cm_queue_work(cep, ERDMA_CM_WORK_CONNECTTIMEOUT);
  886. if (ret)
  887. goto error_disassoc;
  888. }
  889. erdma_cep_set_free(cep);
  890. return 0;
  891. error_disassoc:
  892. kfree(cep->private_data);
  893. cep->private_data = NULL;
  894. cep->pd_len = 0;
  895. erdma_socket_disassoc(s);
  896. error_release_cep:
  897. /* disassoc with cm_id */
  898. cep->cm_id = NULL;
  899. id->rem_ref(id);
  900. /* disassoc with qp */
  901. qp->cep = NULL;
  902. erdma_cep_put(cep);
  903. cep->qp = NULL;
  904. cep->state = ERDMA_EPSTATE_CLOSED;
  905. erdma_cep_set_free(cep);
  906. /* release the cep. */
  907. erdma_cep_put(cep);
  908. error_release_sock:
  909. if (s)
  910. sock_release(s);
  911. error_put_qp:
  912. erdma_qp_put(qp);
  913. return ret;
  914. }
  915. int erdma_accept(struct iw_cm_id *id, struct iw_cm_conn_param *params)
  916. {
  917. struct erdma_dev *dev = to_edev(id->device);
  918. struct erdma_cep *cep = (struct erdma_cep *)id->provider_data;
  919. struct erdma_qp *qp;
  920. struct erdma_qp_attrs qp_attrs;
  921. int ret;
  922. erdma_cep_set_inuse(cep);
  923. erdma_cep_put(cep);
  924. /* Free lingering inbound private data */
  925. if (cep->mpa.hdr.params.pd_len) {
  926. cep->mpa.hdr.params.pd_len = 0;
  927. kfree(cep->mpa.pdata);
  928. cep->mpa.pdata = NULL;
  929. }
  930. erdma_cancel_mpatimer(cep);
  931. if (cep->state != ERDMA_EPSTATE_RECVD_MPAREQ) {
  932. erdma_cep_set_free(cep);
  933. erdma_cep_put(cep);
  934. return -ECONNRESET;
  935. }
  936. qp = find_qp_by_qpn(dev, params->qpn);
  937. if (!qp)
  938. return -ENOENT;
  939. erdma_qp_get(qp);
  940. down_write(&qp->state_lock);
  941. if (qp->attrs.state > ERDMA_QP_STATE_RTR) {
  942. ret = -EINVAL;
  943. up_write(&qp->state_lock);
  944. goto error;
  945. }
  946. if (params->ord > dev->attrs.max_ord ||
  947. params->ird > dev->attrs.max_ord) {
  948. ret = -EINVAL;
  949. up_write(&qp->state_lock);
  950. goto error;
  951. }
  952. if (params->private_data_len > MPA_MAX_PRIVDATA) {
  953. ret = -EINVAL;
  954. up_write(&qp->state_lock);
  955. goto error;
  956. }
  957. cep->ird = params->ird;
  958. cep->ord = params->ord;
  959. cep->cm_id = id;
  960. id->add_ref(id);
  961. memset(&qp_attrs, 0, sizeof(qp_attrs));
  962. qp_attrs.orq_size = params->ord;
  963. qp_attrs.irq_size = params->ird;
  964. qp_attrs.state = ERDMA_QP_STATE_RTS;
  965. /* Associate QP with CEP */
  966. erdma_cep_get(cep);
  967. qp->cep = cep;
  968. cep->qp = qp;
  969. cep->state = ERDMA_EPSTATE_RDMA_MODE;
  970. qp->attrs.qp_type = ERDMA_QP_PASSIVE;
  971. qp->attrs.pd_len = params->private_data_len;
  972. if (qp->attrs.cc != __mpa_ext_cc(cep->mpa.ext_data.bits))
  973. qp->attrs.cc = COMPROMISE_CC;
  974. /* move to rts */
  975. ret = erdma_modify_qp_internal(qp, &qp_attrs,
  976. ERDMA_QP_ATTR_STATE |
  977. ERDMA_QP_ATTR_ORD |
  978. ERDMA_QP_ATTR_LLP_HANDLE |
  979. ERDMA_QP_ATTR_IRD |
  980. ERDMA_QP_ATTR_MPA);
  981. up_write(&qp->state_lock);
  982. if (ret)
  983. goto error;
  984. cep->mpa.ext_data.bits = 0;
  985. __mpa_ext_set_cc(&cep->mpa.ext_data.bits, qp->attrs.cc);
  986. cep->mpa.ext_data.cookie = cpu_to_be32(cep->qp->attrs.cookie);
  987. ret = erdma_send_mpareqrep(cep, params->private_data,
  988. params->private_data_len);
  989. if (!ret) {
  990. ret = erdma_cm_upcall(cep, IW_CM_EVENT_ESTABLISHED, 0);
  991. if (ret)
  992. goto error;
  993. erdma_cep_set_free(cep);
  994. return 0;
  995. }
  996. error:
  997. erdma_socket_disassoc(cep->sock);
  998. sock_release(cep->sock);
  999. cep->sock = NULL;
  1000. cep->state = ERDMA_EPSTATE_CLOSED;
  1001. if (cep->cm_id) {
  1002. cep->cm_id->rem_ref(id);
  1003. cep->cm_id = NULL;
  1004. }
  1005. if (qp->cep) {
  1006. erdma_cep_put(cep);
  1007. qp->cep = NULL;
  1008. }
  1009. cep->qp = NULL;
  1010. erdma_qp_put(qp);
  1011. erdma_cep_set_free(cep);
  1012. erdma_cep_put(cep);
  1013. return ret;
  1014. }
  1015. int erdma_reject(struct iw_cm_id *id, const void *pdata, u8 plen)
  1016. {
  1017. struct erdma_cep *cep = (struct erdma_cep *)id->provider_data;
  1018. erdma_cep_set_inuse(cep);
  1019. erdma_cep_put(cep);
  1020. erdma_cancel_mpatimer(cep);
  1021. if (cep->state != ERDMA_EPSTATE_RECVD_MPAREQ) {
  1022. erdma_cep_set_free(cep);
  1023. erdma_cep_put(cep);
  1024. return -ECONNRESET;
  1025. }
  1026. if (__mpa_rr_revision(cep->mpa.hdr.params.bits) == MPA_REVISION_EXT_1) {
  1027. cep->mpa.hdr.params.bits |= MPA_RR_FLAG_REJECT; /* reject */
  1028. erdma_send_mpareqrep(cep, pdata, plen);
  1029. }
  1030. erdma_socket_disassoc(cep->sock);
  1031. sock_release(cep->sock);
  1032. cep->sock = NULL;
  1033. cep->state = ERDMA_EPSTATE_CLOSED;
  1034. erdma_cep_set_free(cep);
  1035. erdma_cep_put(cep);
  1036. return 0;
  1037. }
  1038. int erdma_create_listen(struct iw_cm_id *id, int backlog)
  1039. {
  1040. struct socket *s;
  1041. struct erdma_cep *cep = NULL;
  1042. int ret = 0;
  1043. struct erdma_dev *dev = to_edev(id->device);
  1044. int addr_family = id->local_addr.ss_family;
  1045. struct sockaddr_in *laddr = &to_sockaddr_in(id->local_addr);
  1046. if (addr_family != AF_INET)
  1047. return -EAFNOSUPPORT;
  1048. ret = sock_create(addr_family, SOCK_STREAM, IPPROTO_TCP, &s);
  1049. if (ret < 0)
  1050. return ret;
  1051. sock_set_reuseaddr(s->sk);
  1052. /* For wildcard addr, limit binding to current device only */
  1053. if (ipv4_is_zeronet(laddr->sin_addr.s_addr))
  1054. s->sk->sk_bound_dev_if = dev->netdev->ifindex;
  1055. ret = s->ops->bind(s, (struct sockaddr *)laddr,
  1056. sizeof(struct sockaddr_in));
  1057. if (ret)
  1058. goto error;
  1059. cep = erdma_cep_alloc(dev);
  1060. if (!cep) {
  1061. ret = -ENOMEM;
  1062. goto error;
  1063. }
  1064. erdma_cep_socket_assoc(cep, s);
  1065. ret = erdma_cm_alloc_work(cep, backlog);
  1066. if (ret)
  1067. goto error;
  1068. ret = s->ops->listen(s, backlog);
  1069. if (ret)
  1070. goto error;
  1071. cep->cm_id = id;
  1072. id->add_ref(id);
  1073. if (!id->provider_data) {
  1074. id->provider_data =
  1075. kmalloc(sizeof(struct list_head), GFP_KERNEL);
  1076. if (!id->provider_data) {
  1077. ret = -ENOMEM;
  1078. goto error;
  1079. }
  1080. INIT_LIST_HEAD((struct list_head *)id->provider_data);
  1081. }
  1082. list_add_tail(&cep->listenq, (struct list_head *)id->provider_data);
  1083. cep->state = ERDMA_EPSTATE_LISTENING;
  1084. return 0;
  1085. error:
  1086. if (cep) {
  1087. erdma_cep_set_inuse(cep);
  1088. if (cep->cm_id) {
  1089. cep->cm_id->rem_ref(cep->cm_id);
  1090. cep->cm_id = NULL;
  1091. }
  1092. cep->sock = NULL;
  1093. erdma_socket_disassoc(s);
  1094. cep->state = ERDMA_EPSTATE_CLOSED;
  1095. erdma_cep_set_free(cep);
  1096. erdma_cep_put(cep);
  1097. }
  1098. sock_release(s);
  1099. return ret;
  1100. }
  1101. static void erdma_drop_listeners(struct iw_cm_id *id)
  1102. {
  1103. struct list_head *p, *tmp;
  1104. /*
  1105. * In case of a wildcard rdma_listen on a multi-homed device,
  1106. * a listener's IWCM id is associated with more than one listening CEP.
  1107. */
  1108. list_for_each_safe(p, tmp, (struct list_head *)id->provider_data) {
  1109. struct erdma_cep *cep =
  1110. list_entry(p, struct erdma_cep, listenq);
  1111. list_del(p);
  1112. erdma_cep_set_inuse(cep);
  1113. if (cep->cm_id) {
  1114. cep->cm_id->rem_ref(cep->cm_id);
  1115. cep->cm_id = NULL;
  1116. }
  1117. if (cep->sock) {
  1118. erdma_socket_disassoc(cep->sock);
  1119. sock_release(cep->sock);
  1120. cep->sock = NULL;
  1121. }
  1122. cep->state = ERDMA_EPSTATE_CLOSED;
  1123. erdma_cep_set_free(cep);
  1124. erdma_cep_put(cep);
  1125. }
  1126. }
  1127. int erdma_destroy_listen(struct iw_cm_id *id)
  1128. {
  1129. if (!id->provider_data)
  1130. return 0;
  1131. erdma_drop_listeners(id);
  1132. kfree(id->provider_data);
  1133. id->provider_data = NULL;
  1134. return 0;
  1135. }
  1136. int erdma_cm_init(void)
  1137. {
  1138. erdma_cm_wq = create_singlethread_workqueue("erdma_cm_wq");
  1139. if (!erdma_cm_wq)
  1140. return -ENOMEM;
  1141. return 0;
  1142. }
  1143. void erdma_cm_exit(void)
  1144. {
  1145. if (erdma_cm_wq)
  1146. destroy_workqueue(erdma_cm_wq);
  1147. }