• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6/drivers/infiniband/hw/nes/
1/*
2 * Copyright (c) 2006 - 2009 Intel Corporation.  All rights reserved.
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 */
33
34#ifndef NES_CM_H
35#define NES_CM_H
36
37#define QUEUE_EVENTS
38
39#define NES_MANAGE_APBVT_DEL 0
40#define NES_MANAGE_APBVT_ADD 1
41
42#define NES_MPA_REQUEST_ACCEPT  1
43#define NES_MPA_REQUEST_REJECT  2
44
45/* IETF MPA -- defines, enums, structs */
46#define IEFT_MPA_KEY_REQ  "MPA ID Req Frame"
47#define IEFT_MPA_KEY_REP  "MPA ID Rep Frame"
48#define IETF_MPA_KEY_SIZE 16
49#define IETF_MPA_VERSION  1
50#define IETF_MAX_PRIV_DATA_LEN 512
51#define IETF_MPA_FRAME_SIZE     20
52
53enum ietf_mpa_flags {
54	IETF_MPA_FLAGS_MARKERS = 0x80,	/* receive Markers */
55	IETF_MPA_FLAGS_CRC     = 0x40,	/* receive Markers */
56	IETF_MPA_FLAGS_REJECT  = 0x20,	/* Reject */
57};
58
59struct ietf_mpa_frame {
60	u8 key[IETF_MPA_KEY_SIZE];
61	u8 flags;
62	u8 rev;
63	__be16 priv_data_len;
64	u8 priv_data[0];
65};
66
67#define ietf_mpa_req_resp_frame ietf_mpa_frame
68
69struct nes_v4_quad {
70	u32 rsvd0;
71	__le32 DstIpAdrIndex;	/* Only most significant 5 bits are valid */
72	__be32 SrcIpadr;
73	__be16 TcpPorts[2];		/* src is low, dest is high */
74};
75
76struct nes_cm_node;
77enum nes_timer_type {
78	NES_TIMER_TYPE_SEND,
79	NES_TIMER_TYPE_RECV,
80	NES_TIMER_NODE_CLEANUP,
81	NES_TIMER_TYPE_CLOSE,
82};
83
84#define NES_PASSIVE_STATE_INDICATED	0
85#define NES_DO_NOT_SEND_RESET_EVENT	1
86#define NES_SEND_RESET_EVENT		2
87
88#define MAX_NES_IFS 4
89
90#define SET_ACK 1
91#define SET_SYN 2
92#define SET_FIN 4
93#define SET_RST 8
94
95#define TCP_OPTIONS_PADDING	3
96
97struct option_base {
98	u8 optionnum;
99	u8 length;
100};
101
102enum option_numbers {
103	OPTION_NUMBER_END,
104	OPTION_NUMBER_NONE,
105	OPTION_NUMBER_MSS,
106	OPTION_NUMBER_WINDOW_SCALE,
107	OPTION_NUMBER_SACK_PERM,
108	OPTION_NUMBER_SACK,
109	OPTION_NUMBER_WRITE0 = 0xbc
110};
111
112struct option_mss {
113	u8 optionnum;
114	u8 length;
115	__be16 mss;
116};
117
118struct option_windowscale {
119	u8 optionnum;
120	u8 length;
121	u8 shiftcount;
122};
123
124union all_known_options {
125	char as_end;
126	struct option_base as_base;
127	struct option_mss as_mss;
128	struct option_windowscale as_windowscale;
129};
130
131struct nes_timer_entry {
132	struct list_head list;
133	unsigned long timetosend;	/* jiffies */
134	struct sk_buff *skb;
135	u32 type;
136	u32 retrycount;
137	u32 retranscount;
138	u32 context;
139	u32 seq_num;
140	u32 send_retrans;
141	int close_when_complete;
142	struct net_device *netdev;
143};
144
145#define NES_DEFAULT_RETRYS  64
146#define NES_DEFAULT_RETRANS 8
147#ifdef CONFIG_INFINIBAND_NES_DEBUG
148#define NES_RETRY_TIMEOUT   (1000*HZ/1000)
149#else
150#define NES_RETRY_TIMEOUT   (3000*HZ/1000)
151#endif
152#define NES_SHORT_TIME      (10)
153#define NES_LONG_TIME       (2000*HZ/1000)
154#define NES_MAX_TIMEOUT     ((unsigned long) (12*HZ))
155
156#define NES_CM_HASHTABLE_SIZE         1024
157#define NES_CM_TCP_TIMER_INTERVAL     3000
158#define NES_CM_DEFAULT_MTU            1540
159#define NES_CM_DEFAULT_FRAME_CNT      10
160#define NES_CM_THREAD_STACK_SIZE      256
161#define NES_CM_DEFAULT_RCV_WND        64240	// before we know that window scaling is allowed
162#define NES_CM_DEFAULT_RCV_WND_SCALED 256960  // after we know that window scaling is allowed
163#define NES_CM_DEFAULT_RCV_WND_SCALE  2
164#define NES_CM_DEFAULT_FREE_PKTS      0x000A
165#define NES_CM_FREE_PKT_LO_WATERMARK  2
166
167#define NES_CM_DEFAULT_MSS   536
168
169#define NES_CM_DEF_SEQ       0x159bf75f
170#define NES_CM_DEF_LOCAL_ID  0x3b47
171
172#define NES_CM_DEF_SEQ2      0x18ed5740
173#define NES_CM_DEF_LOCAL_ID2 0xb807
174#define	MAX_CM_BUFFER	(IETF_MPA_FRAME_SIZE + IETF_MAX_PRIV_DATA_LEN)
175
176
177typedef u32 nes_addr_t;
178
179#define nes_cm_tsa_context nes_qp_context
180
181struct nes_qp;
182
183/* cm node transition states */
184enum nes_cm_node_state {
185	NES_CM_STATE_UNKNOWN,
186	NES_CM_STATE_INITED,
187	NES_CM_STATE_LISTENING,
188	NES_CM_STATE_SYN_RCVD,
189	NES_CM_STATE_SYN_SENT,
190	NES_CM_STATE_ONE_SIDE_ESTABLISHED,
191	NES_CM_STATE_ESTABLISHED,
192	NES_CM_STATE_ACCEPTING,
193	NES_CM_STATE_MPAREQ_SENT,
194	NES_CM_STATE_MPAREQ_RCVD,
195	NES_CM_STATE_MPAREJ_RCVD,
196	NES_CM_STATE_TSA,
197	NES_CM_STATE_FIN_WAIT1,
198	NES_CM_STATE_FIN_WAIT2,
199	NES_CM_STATE_CLOSE_WAIT,
200	NES_CM_STATE_TIME_WAIT,
201	NES_CM_STATE_LAST_ACK,
202	NES_CM_STATE_CLOSING,
203	NES_CM_STATE_LISTENER_DESTROYED,
204	NES_CM_STATE_CLOSED
205};
206
207enum nes_tcpip_pkt_type {
208	NES_PKT_TYPE_UNKNOWN,
209	NES_PKT_TYPE_SYN,
210	NES_PKT_TYPE_SYNACK,
211	NES_PKT_TYPE_ACK,
212	NES_PKT_TYPE_FIN,
213	NES_PKT_TYPE_RST
214};
215
216
217/* type of nes connection */
218enum nes_cm_conn_type {
219	NES_CM_IWARP_CONN_TYPE,
220};
221
222/* CM context params */
223struct nes_cm_tcp_context {
224	u8  client;
225
226	u32 loc_seq_num;
227	u32 loc_ack_num;
228	u32 rem_ack_num;
229	u32 rcv_nxt;
230
231	u32 loc_id;
232	u32 rem_id;
233
234	u32 snd_wnd;
235	u32 max_snd_wnd;
236
237	u32 rcv_wnd;
238	u32 mss;
239	u8  snd_wscale;
240	u8  rcv_wscale;
241
242	struct nes_cm_tsa_context tsa_cntxt;
243	struct timeval            sent_ts;
244};
245
246
247enum nes_cm_listener_state {
248	NES_CM_LISTENER_PASSIVE_STATE=1,
249	NES_CM_LISTENER_ACTIVE_STATE=2,
250	NES_CM_LISTENER_EITHER_STATE=3
251};
252
253struct nes_cm_listener {
254	struct list_head           list;
255	struct nes_cm_core         *cm_core;
256	u8                         loc_mac[ETH_ALEN];
257	nes_addr_t                 loc_addr;
258	u16                        loc_port;
259	struct iw_cm_id            *cm_id;
260	enum nes_cm_conn_type      conn_type;
261	atomic_t                   ref_count;
262	struct nes_vnic            *nesvnic;
263	atomic_t                   pend_accepts_cnt;
264	int                        backlog;
265	enum nes_cm_listener_state listener_state;
266	u32                        reused_node;
267};
268
269/* per connection node and node state information */
270struct nes_cm_node {
271	nes_addr_t                loc_addr, rem_addr;
272	u16                       loc_port, rem_port;
273
274	u8                        loc_mac[ETH_ALEN];
275	u8                        rem_mac[ETH_ALEN];
276
277	enum nes_cm_node_state    state;
278	struct nes_cm_tcp_context tcp_cntxt;
279	struct nes_cm_core        *cm_core;
280	struct sk_buff_head       resend_list;
281	atomic_t                  ref_count;
282	struct net_device         *netdev;
283
284	struct nes_cm_node        *loopbackpartner;
285
286	struct nes_timer_entry	*send_entry;
287
288	spinlock_t                retrans_list_lock;
289	struct nes_timer_entry  *recv_entry;
290
291	int                       send_write0;
292	union {
293		struct ietf_mpa_frame mpa_frame;
294		u8                    mpa_frame_buf[MAX_CM_BUFFER];
295	};
296	u16                       mpa_frame_size;
297	struct iw_cm_id           *cm_id;
298	struct list_head          list;
299	int                       accelerated;
300	struct nes_cm_listener    *listener;
301	enum nes_cm_conn_type     conn_type;
302	struct nes_vnic           *nesvnic;
303	int                       apbvt_set;
304	int                       accept_pend;
305	struct list_head	timer_entry;
306	struct list_head	reset_entry;
307	struct nes_qp		*nesqp;
308	atomic_t 		passive_state;
309};
310
311/* structure for client or CM to fill when making CM api calls. */
312/*	- only need to set relevant data, based on op. */
313struct nes_cm_info {
314	union {
315		struct iw_cm_id   *cm_id;
316		struct net_device *netdev;
317	};
318
319	u16 loc_port;
320	u16 rem_port;
321	nes_addr_t loc_addr;
322	nes_addr_t rem_addr;
323
324	enum nes_cm_conn_type  conn_type;
325	int backlog;
326};
327
328/* CM event codes */
329enum  nes_cm_event_type {
330	NES_CM_EVENT_UNKNOWN,
331	NES_CM_EVENT_ESTABLISHED,
332	NES_CM_EVENT_MPA_REQ,
333	NES_CM_EVENT_MPA_CONNECT,
334	NES_CM_EVENT_MPA_ACCEPT,
335	NES_CM_EVENT_MPA_REJECT,
336	NES_CM_EVENT_MPA_ESTABLISHED,
337	NES_CM_EVENT_CONNECTED,
338	NES_CM_EVENT_CLOSED,
339	NES_CM_EVENT_RESET,
340	NES_CM_EVENT_DROPPED_PKT,
341	NES_CM_EVENT_CLOSE_IMMED,
342	NES_CM_EVENT_CLOSE_HARD,
343	NES_CM_EVENT_CLOSE_CLEAN,
344	NES_CM_EVENT_ABORTED,
345	NES_CM_EVENT_SEND_FIRST
346};
347
348/* event to post to CM event handler */
349struct nes_cm_event {
350	enum nes_cm_event_type type;
351
352	struct nes_cm_info cm_info;
353	struct work_struct event_work;
354	struct nes_cm_node *cm_node;
355};
356
357struct nes_cm_core {
358	enum nes_cm_node_state  state;
359
360	atomic_t                listen_node_cnt;
361	struct nes_cm_node      listen_list;
362	spinlock_t              listen_list_lock;
363
364	u32                     mtu;
365	u32                     free_tx_pkt_max;
366	u32                     rx_pkt_posted;
367	atomic_t                ht_node_cnt;
368	struct list_head        connected_nodes;
369	/* struct list_head hashtable[NES_CM_HASHTABLE_SIZE]; */
370	spinlock_t              ht_lock;
371
372	struct timer_list       tcp_timer;
373
374	struct nes_cm_ops       *api;
375
376	int (*post_event)(struct nes_cm_event *event);
377	atomic_t                events_posted;
378	struct workqueue_struct *event_wq;
379	struct workqueue_struct *disconn_wq;
380
381	atomic_t                node_cnt;
382	u64                     aborted_connects;
383	u32                     options;
384
385	struct nes_cm_node      *current_listen_node;
386};
387
388
389#define NES_CM_SET_PKT_SIZE        (1 << 1)
390#define NES_CM_SET_FREE_PKT_Q_SIZE (1 << 2)
391
392/* CM ops/API for client interface */
393struct nes_cm_ops {
394	int (*accelerated)(struct nes_cm_core *, struct nes_cm_node *);
395	struct nes_cm_listener * (*listen)(struct nes_cm_core *, struct nes_vnic *,
396			struct nes_cm_info *);
397	int (*stop_listener)(struct nes_cm_core *, struct nes_cm_listener *);
398	struct nes_cm_node * (*connect)(struct nes_cm_core *,
399			struct nes_vnic *, u16, void *,
400			struct nes_cm_info *);
401	int (*close)(struct nes_cm_core *, struct nes_cm_node *);
402	int (*accept)(struct nes_cm_core *, struct ietf_mpa_frame *,
403			struct nes_cm_node *);
404	int (*reject)(struct nes_cm_core *, struct ietf_mpa_frame *,
405			struct nes_cm_node *);
406	int (*recv_pkt)(struct nes_cm_core *, struct nes_vnic *,
407			struct sk_buff *);
408	int (*destroy_cm_core)(struct nes_cm_core *);
409	int (*get)(struct nes_cm_core *);
410	int (*set)(struct nes_cm_core *, u32, u32);
411};
412
413int schedule_nes_timer(struct nes_cm_node *, struct sk_buff *,
414		enum nes_timer_type, int, int);
415
416int nes_accept(struct iw_cm_id *, struct iw_cm_conn_param *);
417int nes_reject(struct iw_cm_id *, const void *, u8);
418int nes_connect(struct iw_cm_id *, struct iw_cm_conn_param *);
419int nes_create_listen(struct iw_cm_id *, int);
420int nes_destroy_listen(struct iw_cm_id *);
421
422int nes_cm_recv(struct sk_buff *, struct net_device *);
423int nes_cm_start(void);
424int nes_cm_stop(void);
425
426#endif			/* NES_CM_H */
427