0001
0002
0003
0004
0005
0006
0007
0008 #ifndef _SIW_CM_H
0009 #define _SIW_CM_H
0010
0011 #include <net/sock.h>
0012 #include <linux/tcp.h>
0013
0014 #include <rdma/iw_cm.h>
0015
0016 enum siw_cep_state {
0017 SIW_EPSTATE_IDLE = 1,
0018 SIW_EPSTATE_LISTENING,
0019 SIW_EPSTATE_CONNECTING,
0020 SIW_EPSTATE_AWAIT_MPAREQ,
0021 SIW_EPSTATE_RECVD_MPAREQ,
0022 SIW_EPSTATE_AWAIT_MPAREP,
0023 SIW_EPSTATE_RDMA_MODE,
0024 SIW_EPSTATE_CLOSED
0025 };
0026
0027 struct siw_mpa_info {
0028 struct mpa_rr hdr;
0029 struct mpa_v2_data v2_ctrl;
0030 struct mpa_v2_data v2_ctrl_req;
0031 char *pdata;
0032 int bytes_rcvd;
0033 };
0034
0035 struct siw_device;
0036
0037 struct siw_cep {
0038 struct iw_cm_id *cm_id;
0039 struct siw_device *sdev;
0040 struct list_head devq;
0041 spinlock_t lock;
0042 struct kref ref;
0043 int in_use;
0044 wait_queue_head_t waitq;
0045 enum siw_cep_state state;
0046
0047 struct list_head listenq;
0048 struct siw_cep *listen_cep;
0049
0050 struct siw_qp *qp;
0051 struct socket *sock;
0052
0053 struct siw_cm_work *mpa_timer;
0054 struct list_head work_freelist;
0055
0056 struct siw_mpa_info mpa;
0057 int ord;
0058 int ird;
0059 bool enhanced_rdma_conn_est;
0060
0061
0062 void (*sk_state_change)(struct sock *sk);
0063 void (*sk_data_ready)(struct sock *sk);
0064 void (*sk_write_space)(struct sock *sk);
0065 void (*sk_error_report)(struct sock *sk);
0066 };
0067
0068
0069
0070
0071
0072
0073
0074 #define MPAREQ_TIMEOUT (HZ * 10)
0075 #define MPAREP_TIMEOUT (HZ * 5)
0076
0077 enum siw_work_type {
0078 SIW_CM_WORK_ACCEPT = 1,
0079 SIW_CM_WORK_READ_MPAHDR,
0080 SIW_CM_WORK_CLOSE_LLP,
0081 SIW_CM_WORK_PEER_CLOSE,
0082 SIW_CM_WORK_MPATIMEOUT
0083 };
0084
0085 struct siw_cm_work {
0086 struct delayed_work work;
0087 struct list_head list;
0088 enum siw_work_type type;
0089 struct siw_cep *cep;
0090 };
0091
0092 #define to_sockaddr_in(a) (*(struct sockaddr_in *)(&(a)))
0093 #define to_sockaddr_in6(a) (*(struct sockaddr_in6 *)(&(a)))
0094
0095 static inline int getname_peer(struct socket *s, struct sockaddr_storage *a)
0096 {
0097 return s->ops->getname(s, (struct sockaddr *)a, 1);
0098 }
0099
0100 static inline int getname_local(struct socket *s, struct sockaddr_storage *a)
0101 {
0102 return s->ops->getname(s, (struct sockaddr *)a, 0);
0103 }
0104
0105 static inline int ksock_recv(struct socket *sock, char *buf, size_t size,
0106 int flags)
0107 {
0108 struct kvec iov = { buf, size };
0109 struct msghdr msg = { .msg_name = NULL, .msg_flags = flags };
0110
0111 return kernel_recvmsg(sock, &msg, &iov, 1, size, flags);
0112 }
0113
0114 int siw_connect(struct iw_cm_id *id, struct iw_cm_conn_param *parm);
0115 int siw_accept(struct iw_cm_id *id, struct iw_cm_conn_param *param);
0116 int siw_reject(struct iw_cm_id *id, const void *data, u8 len);
0117 int siw_create_listen(struct iw_cm_id *id, int backlog);
0118 int siw_destroy_listen(struct iw_cm_id *id);
0119
0120 void siw_cep_get(struct siw_cep *cep);
0121 void siw_cep_put(struct siw_cep *cep);
0122 int siw_cm_queue_work(struct siw_cep *cep, enum siw_work_type type);
0123
0124 int siw_cm_init(void);
0125 void siw_cm_exit(void);
0126
0127
0128
0129
0130 #define sk_to_qp(sk) (((struct siw_cep *)((sk)->sk_user_data))->qp)
0131 #define sk_to_cep(sk) ((struct siw_cep *)((sk)->sk_user_data))
0132
0133 #endif