erdma_cm.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  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. /* Greg Joyce <[email protected]> */
  7. /* Copyright (c) 2008-2019, IBM Corporation */
  8. /* Copyright (c) 2017, Open Grid Computing, Inc. */
  9. #ifndef __ERDMA_CM_H__
  10. #define __ERDMA_CM_H__
  11. #include <linux/tcp.h>
  12. #include <net/sock.h>
  13. #include <rdma/iw_cm.h>
  14. /* iWarp MPA protocol defs */
  15. #define MPA_REVISION_EXT_1 129
  16. #define MPA_MAX_PRIVDATA RDMA_MAX_PRIVATE_DATA
  17. #define MPA_KEY_REQ "MPA ID Req Frame"
  18. #define MPA_KEY_REP "MPA ID Rep Frame"
  19. #define MPA_KEY_SIZE 16
  20. #define MPA_DEFAULT_HDR_LEN 28
  21. struct mpa_rr_params {
  22. __be16 bits;
  23. __be16 pd_len;
  24. };
  25. /*
  26. * MPA request/response Hdr bits & fields
  27. */
  28. enum {
  29. MPA_RR_FLAG_MARKERS = __cpu_to_be16(0x8000),
  30. MPA_RR_FLAG_CRC = __cpu_to_be16(0x4000),
  31. MPA_RR_FLAG_REJECT = __cpu_to_be16(0x2000),
  32. MPA_RR_RESERVED = __cpu_to_be16(0x1f00),
  33. MPA_RR_MASK_REVISION = __cpu_to_be16(0x00ff)
  34. };
  35. /*
  36. * MPA request/reply header
  37. */
  38. struct mpa_rr {
  39. u8 key[16];
  40. struct mpa_rr_params params;
  41. };
  42. struct erdma_mpa_ext {
  43. __be32 cookie;
  44. __be32 bits;
  45. };
  46. enum {
  47. MPA_EXT_FLAG_CC = cpu_to_be32(0x0000000f),
  48. };
  49. struct erdma_mpa_info {
  50. struct mpa_rr hdr; /* peer mpa hdr in host byte order */
  51. struct erdma_mpa_ext ext_data;
  52. char *pdata;
  53. int bytes_rcvd;
  54. };
  55. struct erdma_sk_upcalls {
  56. void (*sk_state_change)(struct sock *sk);
  57. void (*sk_data_ready)(struct sock *sk, int bytes);
  58. void (*sk_error_report)(struct sock *sk);
  59. };
  60. struct erdma_dev;
  61. enum erdma_cep_state {
  62. ERDMA_EPSTATE_IDLE = 1,
  63. ERDMA_EPSTATE_LISTENING,
  64. ERDMA_EPSTATE_CONNECTING,
  65. ERDMA_EPSTATE_AWAIT_MPAREQ,
  66. ERDMA_EPSTATE_RECVD_MPAREQ,
  67. ERDMA_EPSTATE_AWAIT_MPAREP,
  68. ERDMA_EPSTATE_RDMA_MODE,
  69. ERDMA_EPSTATE_CLOSED
  70. };
  71. struct erdma_cep {
  72. struct iw_cm_id *cm_id;
  73. struct erdma_dev *dev;
  74. struct list_head devq;
  75. spinlock_t lock;
  76. struct kref ref;
  77. int in_use;
  78. wait_queue_head_t waitq;
  79. enum erdma_cep_state state;
  80. struct list_head listenq;
  81. struct erdma_cep *listen_cep;
  82. struct erdma_qp *qp;
  83. struct socket *sock;
  84. struct erdma_cm_work *mpa_timer;
  85. struct list_head work_freelist;
  86. struct erdma_mpa_info mpa;
  87. int ord;
  88. int ird;
  89. int pd_len;
  90. /* hold user's private data. */
  91. void *private_data;
  92. /* Saved upcalls of socket llp.sock */
  93. void (*sk_state_change)(struct sock *sk);
  94. void (*sk_data_ready)(struct sock *sk);
  95. void (*sk_error_report)(struct sock *sk);
  96. };
  97. #define MPAREQ_TIMEOUT (HZ * 20)
  98. #define MPAREP_TIMEOUT (HZ * 10)
  99. #define CONNECT_TIMEOUT (HZ * 10)
  100. enum erdma_work_type {
  101. ERDMA_CM_WORK_ACCEPT = 1,
  102. ERDMA_CM_WORK_READ_MPAHDR,
  103. ERDMA_CM_WORK_CLOSE_LLP, /* close socket */
  104. ERDMA_CM_WORK_PEER_CLOSE, /* socket indicated peer close */
  105. ERDMA_CM_WORK_MPATIMEOUT,
  106. ERDMA_CM_WORK_CONNECTED,
  107. ERDMA_CM_WORK_CONNECTTIMEOUT
  108. };
  109. struct erdma_cm_work {
  110. struct delayed_work work;
  111. struct list_head list;
  112. enum erdma_work_type type;
  113. struct erdma_cep *cep;
  114. };
  115. #define to_sockaddr_in(a) (*(struct sockaddr_in *)(&(a)))
  116. static inline int getname_peer(struct socket *s, struct sockaddr_storage *a)
  117. {
  118. return s->ops->getname(s, (struct sockaddr *)a, 1);
  119. }
  120. static inline int getname_local(struct socket *s, struct sockaddr_storage *a)
  121. {
  122. return s->ops->getname(s, (struct sockaddr *)a, 0);
  123. }
  124. int erdma_connect(struct iw_cm_id *id, struct iw_cm_conn_param *param);
  125. int erdma_accept(struct iw_cm_id *id, struct iw_cm_conn_param *param);
  126. int erdma_reject(struct iw_cm_id *id, const void *pdata, u8 plen);
  127. int erdma_create_listen(struct iw_cm_id *id, int backlog);
  128. int erdma_destroy_listen(struct iw_cm_id *id);
  129. void erdma_cep_get(struct erdma_cep *ceq);
  130. void erdma_cep_put(struct erdma_cep *ceq);
  131. int erdma_cm_queue_work(struct erdma_cep *ceq, enum erdma_work_type type);
  132. int erdma_cm_init(void);
  133. void erdma_cm_exit(void);
  134. #define sk_to_cep(sk) ((struct erdma_cep *)((sk)->sk_user_data))
  135. #endif