1 | /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ |
2 | /* |
3 | * Copyright (c) 2005 Network Appliance, Inc. All rights reserved. |
4 | * Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved. |
5 | */ |
6 | |
7 | #ifndef IW_CM_H |
8 | #define IW_CM_H |
9 | |
10 | #include <linux/in.h> |
11 | #include <rdma/ib_cm.h> |
12 | |
13 | struct iw_cm_id; |
14 | |
15 | enum iw_cm_event_type { |
16 | IW_CM_EVENT_CONNECT_REQUEST = 1, /* connect request received */ |
17 | IW_CM_EVENT_CONNECT_REPLY, /* reply from active connect request */ |
18 | IW_CM_EVENT_ESTABLISHED, /* passive side accept successful */ |
19 | IW_CM_EVENT_DISCONNECT, /* orderly shutdown */ |
20 | IW_CM_EVENT_CLOSE /* close complete */ |
21 | }; |
22 | |
23 | struct iw_cm_event { |
24 | enum iw_cm_event_type event; |
25 | int status; |
26 | struct sockaddr_storage local_addr; |
27 | struct sockaddr_storage remote_addr; |
28 | void *private_data; |
29 | void *provider_data; |
30 | u8 private_data_len; |
31 | u8 ord; |
32 | u8 ird; |
33 | }; |
34 | |
35 | /** |
36 | * iw_cm_handler - Function to be called by the IW CM when delivering events |
37 | * to the client. |
38 | * |
39 | * @cm_id: The IW CM identifier associated with the event. |
40 | * @event: Pointer to the event structure. |
41 | */ |
42 | typedef int (*iw_cm_handler)(struct iw_cm_id *cm_id, |
43 | struct iw_cm_event *event); |
44 | |
45 | /** |
46 | * iw_event_handler - Function called by the provider when delivering provider |
47 | * events to the IW CM. Returns either 0 indicating the event was processed |
48 | * or -errno if the event could not be processed. |
49 | * |
50 | * @cm_id: The IW CM identifier associated with the event. |
51 | * @event: Pointer to the event structure. |
52 | */ |
53 | typedef int (*iw_event_handler)(struct iw_cm_id *cm_id, |
54 | struct iw_cm_event *event); |
55 | |
56 | struct iw_cm_id { |
57 | iw_cm_handler cm_handler; /* client callback function */ |
58 | void *context; /* client cb context */ |
59 | struct ib_device *device; |
60 | struct sockaddr_storage local_addr; /* local addr */ |
61 | struct sockaddr_storage remote_addr; |
62 | struct sockaddr_storage m_local_addr; /* nmapped local addr */ |
63 | struct sockaddr_storage m_remote_addr; /* nmapped rem addr */ |
64 | void *provider_data; /* provider private data */ |
65 | iw_event_handler event_handler; /* cb for provider |
66 | events */ |
67 | /* Used by provider to add and remove refs on IW cm_id */ |
68 | void (*add_ref)(struct iw_cm_id *); |
69 | void (*rem_ref)(struct iw_cm_id *); |
70 | u8 tos; |
71 | bool tos_set:1; |
72 | bool mapped:1; |
73 | bool afonly:1; |
74 | }; |
75 | |
76 | struct iw_cm_conn_param { |
77 | const void *private_data; |
78 | u16 private_data_len; |
79 | u32 ord; |
80 | u32 ird; |
81 | u32 qpn; |
82 | }; |
83 | |
84 | enum iw_flags { |
85 | |
86 | /* |
87 | * This flag allows the iwcm and iwpmd to still advertise |
88 | * mappings but the real and mapped port numbers are the |
89 | * same. Further, iwpmd will not bind any user socket to |
90 | * reserve the port. This is required for soft iwarp |
91 | * to play in the port mapped iwarp space. |
92 | */ |
93 | IW_F_NO_PORT_MAP = (1 << 0), |
94 | }; |
95 | |
96 | /** |
97 | * iw_create_cm_id - Create an IW CM identifier. |
98 | * |
99 | * @device: The IB device on which to create the IW CM identier. |
100 | * @event_handler: User callback invoked to report events associated with the |
101 | * returned IW CM identifier. |
102 | * @context: User specified context associated with the id. |
103 | */ |
104 | struct iw_cm_id *iw_create_cm_id(struct ib_device *device, |
105 | iw_cm_handler cm_handler, void *context); |
106 | |
107 | /** |
108 | * iw_destroy_cm_id - Destroy an IW CM identifier. |
109 | * |
110 | * @cm_id: The previously created IW CM identifier to destroy. |
111 | * |
112 | * The client can assume that no events will be delivered for the CM ID after |
113 | * this function returns. |
114 | */ |
115 | void iw_destroy_cm_id(struct iw_cm_id *cm_id); |
116 | |
117 | /** |
118 | * iw_cm_listen - Listen for incoming connection requests on the |
119 | * specified IW CM id. |
120 | * |
121 | * @cm_id: The IW CM identifier. |
122 | * @backlog: The maximum number of outstanding un-accepted inbound listen |
123 | * requests to queue. |
124 | * |
125 | * The source address and port number are specified in the IW CM identifier |
126 | * structure. |
127 | */ |
128 | int iw_cm_listen(struct iw_cm_id *cm_id, int backlog); |
129 | |
130 | /** |
131 | * iw_cm_accept - Called to accept an incoming connect request. |
132 | * |
133 | * @cm_id: The IW CM identifier associated with the connection request. |
134 | * @iw_param: Pointer to a structure containing connection establishment |
135 | * parameters. |
136 | * |
137 | * The specified cm_id will have been provided in the event data for a |
138 | * CONNECT_REQUEST event. Subsequent events related to this connection will be |
139 | * delivered to the specified IW CM identifier prior and may occur prior to |
140 | * the return of this function. If this function returns a non-zero value, the |
141 | * client can assume that no events will be delivered to the specified IW CM |
142 | * identifier. |
143 | */ |
144 | int iw_cm_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *iw_param); |
145 | |
146 | /** |
147 | * iw_cm_reject - Reject an incoming connection request. |
148 | * |
149 | * @cm_id: Connection identifier associated with the request. |
150 | * @private_daa: Pointer to data to deliver to the remote peer as part of the |
151 | * reject message. |
152 | * @private_data_len: The number of bytes in the private_data parameter. |
153 | * |
154 | * The client can assume that no events will be delivered to the specified IW |
155 | * CM identifier following the return of this function. The private_data |
156 | * buffer is available for reuse when this function returns. |
157 | */ |
158 | int iw_cm_reject(struct iw_cm_id *cm_id, const void *private_data, |
159 | u8 private_data_len); |
160 | |
161 | /** |
162 | * iw_cm_connect - Called to request a connection to a remote peer. |
163 | * |
164 | * @cm_id: The IW CM identifier for the connection. |
165 | * @iw_param: Pointer to a structure containing connection establishment |
166 | * parameters. |
167 | * |
168 | * Events may be delivered to the specified IW CM identifier prior to the |
169 | * return of this function. If this function returns a non-zero value, the |
170 | * client can assume that no events will be delivered to the specified IW CM |
171 | * identifier. |
172 | */ |
173 | int iw_cm_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *iw_param); |
174 | |
175 | /** |
176 | * iw_cm_disconnect - Close the specified connection. |
177 | * |
178 | * @cm_id: The IW CM identifier to close. |
179 | * @abrupt: If 0, the connection will be closed gracefully, otherwise, the |
180 | * connection will be reset. |
181 | * |
182 | * The IW CM identifier is still active until the IW_CM_EVENT_CLOSE event is |
183 | * delivered. |
184 | */ |
185 | int iw_cm_disconnect(struct iw_cm_id *cm_id, int abrupt); |
186 | |
187 | /** |
188 | * iw_cm_init_qp_attr - Called to initialize the attributes of the QP |
189 | * associated with a IW CM identifier. |
190 | * |
191 | * @cm_id: The IW CM identifier associated with the QP |
192 | * @qp_attr: Pointer to the QP attributes structure. |
193 | * @qp_attr_mask: Pointer to a bit vector specifying which QP attributes are |
194 | * valid. |
195 | */ |
196 | int iw_cm_init_qp_attr(struct iw_cm_id *cm_id, struct ib_qp_attr *qp_attr, |
197 | int *qp_attr_mask); |
198 | |
199 | /** |
200 | * iwcm_reject_msg - return a pointer to a reject message string. |
201 | * @reason: Value returned in the REJECT event status field. |
202 | */ |
203 | const char *__attribute_const__ iwcm_reject_msg(int reason); |
204 | |
205 | #endif /* IW_CM_H */ |
206 | |