]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/infiniband/hw/i40iw/i40iw_cm.c
i40iw: Add missing cleanup on device close
[karo-tx-linux.git] / drivers / infiniband / hw / i40iw / i40iw_cm.c
1 /*******************************************************************************
2 *
3 * Copyright (c) 2015-2016 Intel Corporation.  All rights reserved.
4 *
5 * This software is available to you under a choice of one of two
6 * licenses.  You may choose to be licensed under the terms of the GNU
7 * General Public License (GPL) Version 2, available from the file
8 * COPYING in the main directory of this source tree, or the
9 * OpenFabrics.org BSD license below:
10 *
11 *   Redistribution and use in source and binary forms, with or
12 *   without modification, are permitted provided that the following
13 *   conditions are met:
14 *
15 *    - Redistributions of source code must retain the above
16 *       copyright notice, this list of conditions and the following
17 *       disclaimer.
18 *
19 *    - Redistributions in binary form must reproduce the above
20 *       copyright notice, this list of conditions and the following
21 *       disclaimer in the documentation and/or other materials
22 *       provided with the distribution.
23 *
24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
28 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
29 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31 * SOFTWARE.
32 *
33 *******************************************************************************/
34
35 #include <linux/atomic.h>
36 #include <linux/ip.h>
37 #include <linux/tcp.h>
38 #include <linux/init.h>
39 #include <linux/if_arp.h>
40 #include <linux/if_vlan.h>
41 #include <linux/notifier.h>
42 #include <linux/net.h>
43 #include <linux/types.h>
44 #include <linux/timer.h>
45 #include <linux/time.h>
46 #include <linux/delay.h>
47 #include <linux/etherdevice.h>
48 #include <linux/netdevice.h>
49 #include <linux/random.h>
50 #include <linux/list.h>
51 #include <linux/threads.h>
52 #include <linux/highmem.h>
53 #include <net/arp.h>
54 #include <net/ndisc.h>
55 #include <net/neighbour.h>
56 #include <net/route.h>
57 #include <net/addrconf.h>
58 #include <net/ip6_route.h>
59 #include <net/ip_fib.h>
60 #include <net/tcp.h>
61 #include <asm/checksum.h>
62
63 #include "i40iw.h"
64
65 static void i40iw_rem_ref_cm_node(struct i40iw_cm_node *);
66 static void i40iw_cm_post_event(struct i40iw_cm_event *event);
67 static void i40iw_disconnect_worker(struct work_struct *work);
68
69 /**
70  * i40iw_free_sqbuf - put back puda buffer if refcount = 0
71  * @dev: FPK device
72  * @buf: puda buffer to free
73  */
74 void i40iw_free_sqbuf(struct i40iw_sc_dev *dev, void *bufp)
75 {
76         struct i40iw_puda_buf *buf = (struct i40iw_puda_buf *)bufp;
77         struct i40iw_puda_rsrc *ilq = dev->ilq;
78
79         if (!atomic_dec_return(&buf->refcount))
80                 i40iw_puda_ret_bufpool(ilq, buf);
81 }
82
83 /**
84  * i40iw_derive_hw_ird_setting - Calculate IRD
85  *
86  * @cm_ird: IRD of connection's node
87  *
88  * The ird from the connection is rounded to a supported HW
89  * setting (2,8,32,64) and then encoded for ird_size field of
90  * qp_ctx
91  */
92 static u8 i40iw_derive_hw_ird_setting(u16 cm_ird)
93 {
94         u8 encoded_ird_size;
95         u8 pof2_cm_ird = 1;
96
97         /* round-off to next powerof2 */
98         while (pof2_cm_ird < cm_ird)
99                 pof2_cm_ird *= 2;
100
101         /* ird_size field is encoded in qp_ctx */
102         switch (pof2_cm_ird) {
103         case I40IW_HW_IRD_SETTING_64:
104                 encoded_ird_size = 3;
105                 break;
106         case I40IW_HW_IRD_SETTING_32:
107         case I40IW_HW_IRD_SETTING_16:
108                 encoded_ird_size = 2;
109                 break;
110         case I40IW_HW_IRD_SETTING_8:
111         case I40IW_HW_IRD_SETTING_4:
112                 encoded_ird_size = 1;
113                 break;
114         case I40IW_HW_IRD_SETTING_2:
115         default:
116                 encoded_ird_size = 0;
117                 break;
118         }
119         return encoded_ird_size;
120 }
121
122 /**
123  * i40iw_record_ird_ord - Record IRD/ORD passed in
124  * @cm_node: connection's node
125  * @conn_ird: connection IRD
126  * @conn_ord: connection ORD
127  */
128 static void i40iw_record_ird_ord(struct i40iw_cm_node *cm_node, u16 conn_ird, u16 conn_ord)
129 {
130         if (conn_ird > I40IW_MAX_IRD_SIZE)
131                 conn_ird = I40IW_MAX_IRD_SIZE;
132
133         if (conn_ord > I40IW_MAX_ORD_SIZE)
134                 conn_ord = I40IW_MAX_ORD_SIZE;
135
136         cm_node->ird_size = conn_ird;
137         cm_node->ord_size = conn_ord;
138 }
139
140 /**
141  * i40iw_copy_ip_ntohl - change network to host ip
142  * @dst: host ip
143  * @src: big endian
144  */
145 void i40iw_copy_ip_ntohl(u32 *dst, __be32 *src)
146 {
147         *dst++ = ntohl(*src++);
148         *dst++ = ntohl(*src++);
149         *dst++ = ntohl(*src++);
150         *dst = ntohl(*src);
151 }
152
153 /**
154  * i40iw_copy_ip_htonl - change host addr to network ip
155  * @dst: host ip
156  * @src: little endian
157  */
158 static inline void i40iw_copy_ip_htonl(__be32 *dst, u32 *src)
159 {
160         *dst++ = htonl(*src++);
161         *dst++ = htonl(*src++);
162         *dst++ = htonl(*src++);
163         *dst = htonl(*src);
164 }
165
166 /**
167  * i40iw_fill_sockaddr4 - get addr info for passive connection
168  * @cm_node: connection's node
169  * @event: upper layer's cm event
170  */
171 static inline void i40iw_fill_sockaddr4(struct i40iw_cm_node *cm_node,
172                                         struct iw_cm_event *event)
173 {
174         struct sockaddr_in *laddr = (struct sockaddr_in *)&event->local_addr;
175         struct sockaddr_in *raddr = (struct sockaddr_in *)&event->remote_addr;
176
177         laddr->sin_family = AF_INET;
178         raddr->sin_family = AF_INET;
179
180         laddr->sin_port = htons(cm_node->loc_port);
181         raddr->sin_port = htons(cm_node->rem_port);
182
183         laddr->sin_addr.s_addr = htonl(cm_node->loc_addr[0]);
184         raddr->sin_addr.s_addr = htonl(cm_node->rem_addr[0]);
185 }
186
187 /**
188  * i40iw_fill_sockaddr6 - get ipv6 addr info for passive side
189  * @cm_node: connection's node
190  * @event: upper layer's cm event
191  */
192 static inline void i40iw_fill_sockaddr6(struct i40iw_cm_node *cm_node,
193                                         struct iw_cm_event *event)
194 {
195         struct sockaddr_in6 *laddr6 = (struct sockaddr_in6 *)&event->local_addr;
196         struct sockaddr_in6 *raddr6 = (struct sockaddr_in6 *)&event->remote_addr;
197
198         laddr6->sin6_family = AF_INET6;
199         raddr6->sin6_family = AF_INET6;
200
201         laddr6->sin6_port = htons(cm_node->loc_port);
202         raddr6->sin6_port = htons(cm_node->rem_port);
203
204         i40iw_copy_ip_htonl(laddr6->sin6_addr.in6_u.u6_addr32,
205                             cm_node->loc_addr);
206         i40iw_copy_ip_htonl(raddr6->sin6_addr.in6_u.u6_addr32,
207                             cm_node->rem_addr);
208 }
209
210 /**
211  * i40iw_get_addr_info
212  * @cm_node: contains ip/tcp info
213  * @cm_info: to get a copy of the cm_node ip/tcp info
214 */
215 static void i40iw_get_addr_info(struct i40iw_cm_node *cm_node,
216                                 struct i40iw_cm_info *cm_info)
217 {
218         cm_info->ipv4 = cm_node->ipv4;
219         cm_info->vlan_id = cm_node->vlan_id;
220         memcpy(cm_info->loc_addr, cm_node->loc_addr, sizeof(cm_info->loc_addr));
221         memcpy(cm_info->rem_addr, cm_node->rem_addr, sizeof(cm_info->rem_addr));
222         cm_info->loc_port = cm_node->loc_port;
223         cm_info->rem_port = cm_node->rem_port;
224         cm_info->user_pri = cm_node->user_pri;
225 }
226
227 /**
228  * i40iw_get_cmevent_info - for cm event upcall
229  * @cm_node: connection's node
230  * @cm_id: upper layers cm struct for the event
231  * @event: upper layer's cm event
232  */
233 static inline void i40iw_get_cmevent_info(struct i40iw_cm_node *cm_node,
234                                           struct iw_cm_id *cm_id,
235                                           struct iw_cm_event *event)
236 {
237         memcpy(&event->local_addr, &cm_id->m_local_addr,
238                sizeof(event->local_addr));
239         memcpy(&event->remote_addr, &cm_id->m_remote_addr,
240                sizeof(event->remote_addr));
241         if (cm_node) {
242                 event->private_data = (void *)cm_node->pdata_buf;
243                 event->private_data_len = (u8)cm_node->pdata.size;
244                 event->ird = cm_node->ird_size;
245                 event->ord = cm_node->ord_size;
246         }
247 }
248
249 /**
250  * i40iw_send_cm_event - upcall cm's event handler
251  * @cm_node: connection's node
252  * @cm_id: upper layer's cm info struct
253  * @type: Event type to indicate
254  * @status: status for the event type
255  */
256 static int i40iw_send_cm_event(struct i40iw_cm_node *cm_node,
257                                struct iw_cm_id *cm_id,
258                                enum iw_cm_event_type type,
259                                int status)
260 {
261         struct iw_cm_event event;
262
263         memset(&event, 0, sizeof(event));
264         event.event = type;
265         event.status = status;
266         switch (type) {
267         case IW_CM_EVENT_CONNECT_REQUEST:
268                 if (cm_node->ipv4)
269                         i40iw_fill_sockaddr4(cm_node, &event);
270                 else
271                         i40iw_fill_sockaddr6(cm_node, &event);
272                 event.provider_data = (void *)cm_node;
273                 event.private_data = (void *)cm_node->pdata_buf;
274                 event.private_data_len = (u8)cm_node->pdata.size;
275                 break;
276         case IW_CM_EVENT_CONNECT_REPLY:
277                 i40iw_get_cmevent_info(cm_node, cm_id, &event);
278                 break;
279         case IW_CM_EVENT_ESTABLISHED:
280                 event.ird = cm_node->ird_size;
281                 event.ord = cm_node->ord_size;
282                 break;
283         case IW_CM_EVENT_DISCONNECT:
284                 break;
285         case IW_CM_EVENT_CLOSE:
286                 break;
287         default:
288                 i40iw_pr_err("event type received type = %d\n", type);
289                 return -1;
290         }
291         return cm_id->event_handler(cm_id, &event);
292 }
293
294 /**
295  * i40iw_create_event - create cm event
296  * @cm_node: connection's node
297  * @type: Event type to generate
298  */
299 static struct i40iw_cm_event *i40iw_create_event(struct i40iw_cm_node *cm_node,
300                                                  enum i40iw_cm_event_type type)
301 {
302         struct i40iw_cm_event *event;
303
304         if (!cm_node->cm_id)
305                 return NULL;
306
307         event = kzalloc(sizeof(*event), GFP_ATOMIC);
308
309         if (!event)
310                 return NULL;
311
312         event->type = type;
313         event->cm_node = cm_node;
314         memcpy(event->cm_info.rem_addr, cm_node->rem_addr, sizeof(event->cm_info.rem_addr));
315         memcpy(event->cm_info.loc_addr, cm_node->loc_addr, sizeof(event->cm_info.loc_addr));
316         event->cm_info.rem_port = cm_node->rem_port;
317         event->cm_info.loc_port = cm_node->loc_port;
318         event->cm_info.cm_id = cm_node->cm_id;
319
320         i40iw_debug(cm_node->dev,
321                     I40IW_DEBUG_CM,
322                     "node=%p event=%p type=%u dst=%pI4 src=%pI4\n",
323                     cm_node,
324                     event,
325                     type,
326                     event->cm_info.loc_addr,
327                     event->cm_info.rem_addr);
328
329         i40iw_cm_post_event(event);
330         return event;
331 }
332
333 /**
334  * i40iw_free_retrans_entry - free send entry
335  * @cm_node: connection's node
336  */
337 static void i40iw_free_retrans_entry(struct i40iw_cm_node *cm_node)
338 {
339         struct i40iw_sc_dev *dev = cm_node->dev;
340         struct i40iw_timer_entry *send_entry;
341
342         send_entry = cm_node->send_entry;
343         if (send_entry) {
344                 cm_node->send_entry = NULL;
345                 i40iw_free_sqbuf(dev, (void *)send_entry->sqbuf);
346                 kfree(send_entry);
347                 atomic_dec(&cm_node->ref_count);
348         }
349 }
350
351 /**
352  * i40iw_cleanup_retrans_entry - free send entry with lock
353  * @cm_node: connection's node
354  */
355 static void i40iw_cleanup_retrans_entry(struct i40iw_cm_node *cm_node)
356 {
357         unsigned long flags;
358
359         spin_lock_irqsave(&cm_node->retrans_list_lock, flags);
360         i40iw_free_retrans_entry(cm_node);
361         spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);
362 }
363
364 /**
365  * i40iw_form_cm_frame - get a free packet and build frame
366  * @cm_node: connection's node ionfo to use in frame
367  * @options: pointer to options info
368  * @hdr: pointer mpa header
369  * @pdata: pointer to private data
370  * @flags:  indicates FIN or ACK
371  */
372 static struct i40iw_puda_buf *i40iw_form_cm_frame(struct i40iw_cm_node *cm_node,
373                                                   struct i40iw_kmem_info *options,
374                                                   struct i40iw_kmem_info *hdr,
375                                                   struct i40iw_kmem_info *pdata,
376                                                   u8 flags)
377 {
378         struct i40iw_puda_buf *sqbuf;
379         struct i40iw_sc_dev *dev = cm_node->dev;
380         u8 *buf;
381
382         struct tcphdr *tcph;
383         struct iphdr *iph;
384         struct ipv6hdr *ip6h;
385         struct ethhdr *ethh;
386         u16 packetsize;
387         u16 eth_hlen = ETH_HLEN;
388         u32 opts_len = 0;
389         u32 pd_len = 0;
390         u32 hdr_len = 0;
391         u16 vtag;
392
393         sqbuf = i40iw_puda_get_bufpool(dev->ilq);
394         if (!sqbuf)
395                 return NULL;
396         buf = sqbuf->mem.va;
397
398         if (options)
399                 opts_len = (u32)options->size;
400
401         if (hdr)
402                 hdr_len = hdr->size;
403
404         if (pdata)
405                 pd_len = pdata->size;
406
407         if (cm_node->vlan_id < VLAN_TAG_PRESENT)
408                 eth_hlen += 4;
409
410         if (cm_node->ipv4)
411                 packetsize = sizeof(*iph) + sizeof(*tcph);
412         else
413                 packetsize = sizeof(*ip6h) + sizeof(*tcph);
414         packetsize += opts_len + hdr_len + pd_len;
415
416         memset(buf, 0x00, eth_hlen + packetsize);
417
418         sqbuf->totallen = packetsize + eth_hlen;
419         sqbuf->maclen = eth_hlen;
420         sqbuf->tcphlen = sizeof(*tcph) + opts_len;
421         sqbuf->scratch = (void *)cm_node;
422
423         ethh = (struct ethhdr *)buf;
424         buf += eth_hlen;
425
426         if (cm_node->ipv4) {
427                 sqbuf->ipv4 = true;
428
429                 iph = (struct iphdr *)buf;
430                 buf += sizeof(*iph);
431                 tcph = (struct tcphdr *)buf;
432                 buf += sizeof(*tcph);
433
434                 ether_addr_copy(ethh->h_dest, cm_node->rem_mac);
435                 ether_addr_copy(ethh->h_source, cm_node->loc_mac);
436                 if (cm_node->vlan_id < VLAN_TAG_PRESENT) {
437                         ((struct vlan_ethhdr *)ethh)->h_vlan_proto = htons(ETH_P_8021Q);
438                         vtag = (cm_node->user_pri << VLAN_PRIO_SHIFT) | cm_node->vlan_id;
439                         ((struct vlan_ethhdr *)ethh)->h_vlan_TCI = htons(vtag);
440
441                         ((struct vlan_ethhdr *)ethh)->h_vlan_encapsulated_proto = htons(ETH_P_IP);
442                 } else {
443                         ethh->h_proto = htons(ETH_P_IP);
444                 }
445
446                 iph->version = IPVERSION;
447                 iph->ihl = 5;   /* 5 * 4Byte words, IP headr len */
448                 iph->tos = 0;
449                 iph->tot_len = htons(packetsize);
450                 iph->id = htons(++cm_node->tcp_cntxt.loc_id);
451
452                 iph->frag_off = htons(0x4000);
453                 iph->ttl = 0x40;
454                 iph->protocol = IPPROTO_TCP;
455                 iph->saddr = htonl(cm_node->loc_addr[0]);
456                 iph->daddr = htonl(cm_node->rem_addr[0]);
457         } else {
458                 sqbuf->ipv4 = false;
459                 ip6h = (struct ipv6hdr *)buf;
460                 buf += sizeof(*ip6h);
461                 tcph = (struct tcphdr *)buf;
462                 buf += sizeof(*tcph);
463
464                 ether_addr_copy(ethh->h_dest, cm_node->rem_mac);
465                 ether_addr_copy(ethh->h_source, cm_node->loc_mac);
466                 if (cm_node->vlan_id < VLAN_TAG_PRESENT) {
467                         ((struct vlan_ethhdr *)ethh)->h_vlan_proto = htons(ETH_P_8021Q);
468                         vtag = (cm_node->user_pri << VLAN_PRIO_SHIFT) | cm_node->vlan_id;
469                         ((struct vlan_ethhdr *)ethh)->h_vlan_TCI = htons(vtag);
470                         ((struct vlan_ethhdr *)ethh)->h_vlan_encapsulated_proto = htons(ETH_P_IPV6);
471                 } else {
472                         ethh->h_proto = htons(ETH_P_IPV6);
473                 }
474                 ip6h->version = 6;
475                 ip6h->flow_lbl[0] = 0;
476                 ip6h->flow_lbl[1] = 0;
477                 ip6h->flow_lbl[2] = 0;
478                 ip6h->payload_len = htons(packetsize - sizeof(*ip6h));
479                 ip6h->nexthdr = 6;
480                 ip6h->hop_limit = 128;
481                 i40iw_copy_ip_htonl(ip6h->saddr.in6_u.u6_addr32,
482                                     cm_node->loc_addr);
483                 i40iw_copy_ip_htonl(ip6h->daddr.in6_u.u6_addr32,
484                                     cm_node->rem_addr);
485         }
486
487         tcph->source = htons(cm_node->loc_port);
488         tcph->dest = htons(cm_node->rem_port);
489
490         tcph->seq = htonl(cm_node->tcp_cntxt.loc_seq_num);
491
492         if (flags & SET_ACK) {
493                 cm_node->tcp_cntxt.loc_ack_num = cm_node->tcp_cntxt.rcv_nxt;
494                 tcph->ack_seq = htonl(cm_node->tcp_cntxt.loc_ack_num);
495                 tcph->ack = 1;
496         } else {
497                 tcph->ack_seq = 0;
498         }
499
500         if (flags & SET_SYN) {
501                 cm_node->tcp_cntxt.loc_seq_num++;
502                 tcph->syn = 1;
503         } else {
504                 cm_node->tcp_cntxt.loc_seq_num += hdr_len + pd_len;
505         }
506
507         if (flags & SET_FIN) {
508                 cm_node->tcp_cntxt.loc_seq_num++;
509                 tcph->fin = 1;
510         }
511
512         if (flags & SET_RST)
513                 tcph->rst = 1;
514
515         tcph->doff = (u16)((sizeof(*tcph) + opts_len + 3) >> 2);
516         sqbuf->tcphlen = tcph->doff << 2;
517         tcph->window = htons(cm_node->tcp_cntxt.rcv_wnd);
518         tcph->urg_ptr = 0;
519
520         if (opts_len) {
521                 memcpy(buf, options->addr, opts_len);
522                 buf += opts_len;
523         }
524
525         if (hdr_len) {
526                 memcpy(buf, hdr->addr, hdr_len);
527                 buf += hdr_len;
528         }
529
530         if (pdata && pdata->addr)
531                 memcpy(buf, pdata->addr, pdata->size);
532
533         atomic_set(&sqbuf->refcount, 1);
534
535         return sqbuf;
536 }
537
538 /**
539  * i40iw_send_reset - Send RST packet
540  * @cm_node: connection's node
541  */
542 static int i40iw_send_reset(struct i40iw_cm_node *cm_node)
543 {
544         struct i40iw_puda_buf *sqbuf;
545         int flags = SET_RST | SET_ACK;
546
547         sqbuf = i40iw_form_cm_frame(cm_node, NULL, NULL, NULL, flags);
548         if (!sqbuf) {
549                 i40iw_pr_err("no sqbuf\n");
550                 return -1;
551         }
552
553         return i40iw_schedule_cm_timer(cm_node, sqbuf, I40IW_TIMER_TYPE_SEND, 0, 1);
554 }
555
556 /**
557  * i40iw_active_open_err - send event for active side cm error
558  * @cm_node: connection's node
559  * @reset: Flag to send reset or not
560  */
561 static void i40iw_active_open_err(struct i40iw_cm_node *cm_node, bool reset)
562 {
563         i40iw_cleanup_retrans_entry(cm_node);
564         cm_node->cm_core->stats_connect_errs++;
565         if (reset) {
566                 i40iw_debug(cm_node->dev,
567                             I40IW_DEBUG_CM,
568                             "%s cm_node=%p state=%d\n",
569                             __func__,
570                             cm_node,
571                             cm_node->state);
572                 atomic_inc(&cm_node->ref_count);
573                 i40iw_send_reset(cm_node);
574         }
575
576         cm_node->state = I40IW_CM_STATE_CLOSED;
577         i40iw_create_event(cm_node, I40IW_CM_EVENT_ABORTED);
578 }
579
580 /**
581  * i40iw_passive_open_err - handle passive side cm error
582  * @cm_node: connection's node
583  * @reset: send reset or just free cm_node
584  */
585 static void i40iw_passive_open_err(struct i40iw_cm_node *cm_node, bool reset)
586 {
587         i40iw_cleanup_retrans_entry(cm_node);
588         cm_node->cm_core->stats_passive_errs++;
589         cm_node->state = I40IW_CM_STATE_CLOSED;
590         i40iw_debug(cm_node->dev,
591                     I40IW_DEBUG_CM,
592                     "%s cm_node=%p state =%d\n",
593                     __func__,
594                     cm_node,
595                     cm_node->state);
596         if (reset)
597                 i40iw_send_reset(cm_node);
598         else
599                 i40iw_rem_ref_cm_node(cm_node);
600 }
601
602 /**
603  * i40iw_event_connect_error - to create connect error event
604  * @event: cm information for connect event
605  */
606 static void i40iw_event_connect_error(struct i40iw_cm_event *event)
607 {
608         struct i40iw_qp *iwqp;
609         struct iw_cm_id *cm_id;
610
611         cm_id = event->cm_node->cm_id;
612         if (!cm_id)
613                 return;
614
615         iwqp = cm_id->provider_data;
616
617         if (!iwqp || !iwqp->iwdev)
618                 return;
619
620         iwqp->cm_id = NULL;
621         cm_id->provider_data = NULL;
622         i40iw_send_cm_event(event->cm_node, cm_id,
623                             IW_CM_EVENT_CONNECT_REPLY,
624                             -ECONNRESET);
625         cm_id->rem_ref(cm_id);
626         i40iw_rem_ref_cm_node(event->cm_node);
627 }
628
629 /**
630  * i40iw_process_options
631  * @cm_node: connection's node
632  * @optionsloc: point to start of options
633  * @optionsize: size of all options
634  * @syn_packet: flag if syn packet
635  */
636 static int i40iw_process_options(struct i40iw_cm_node *cm_node,
637                                  u8 *optionsloc,
638                                  u32 optionsize,
639                                  u32 syn_packet)
640 {
641         u32 tmp;
642         u32 offset = 0;
643         union all_known_options *all_options;
644         char got_mss_option = 0;
645
646         while (offset < optionsize) {
647                 all_options = (union all_known_options *)(optionsloc + offset);
648                 switch (all_options->as_base.optionnum) {
649                 case OPTION_NUMBER_END:
650                         offset = optionsize;
651                         break;
652                 case OPTION_NUMBER_NONE:
653                         offset += 1;
654                         continue;
655                 case OPTION_NUMBER_MSS:
656                         i40iw_debug(cm_node->dev,
657                                     I40IW_DEBUG_CM,
658                                     "%s: MSS Length: %d Offset: %d Size: %d\n",
659                                     __func__,
660                                     all_options->as_mss.length,
661                                     offset,
662                                     optionsize);
663                         got_mss_option = 1;
664                         if (all_options->as_mss.length != 4)
665                                 return -1;
666                         tmp = ntohs(all_options->as_mss.mss);
667                         if (tmp > 0 && tmp < cm_node->tcp_cntxt.mss)
668                                 cm_node->tcp_cntxt.mss = tmp;
669                         break;
670                 case OPTION_NUMBER_WINDOW_SCALE:
671                         cm_node->tcp_cntxt.snd_wscale =
672                             all_options->as_windowscale.shiftcount;
673                         break;
674                 default:
675                         i40iw_debug(cm_node->dev,
676                                     I40IW_DEBUG_CM,
677                                     "TCP Option not understood: %x\n",
678                                     all_options->as_base.optionnum);
679                         break;
680                 }
681                 offset += all_options->as_base.length;
682         }
683         if (!got_mss_option && syn_packet)
684                 cm_node->tcp_cntxt.mss = I40IW_CM_DEFAULT_MSS;
685         return 0;
686 }
687
688 /**
689  * i40iw_handle_tcp_options -
690  * @cm_node: connection's node
691  * @tcph: pointer tcp header
692  * @optionsize: size of options rcvd
693  * @passive: active or passive flag
694  */
695 static int i40iw_handle_tcp_options(struct i40iw_cm_node *cm_node,
696                                     struct tcphdr *tcph,
697                                     int optionsize,
698                                     int passive)
699 {
700         u8 *optionsloc = (u8 *)&tcph[1];
701
702         if (optionsize) {
703                 if (i40iw_process_options(cm_node,
704                                           optionsloc,
705                                           optionsize,
706                                           (u32)tcph->syn)) {
707                         i40iw_debug(cm_node->dev,
708                                     I40IW_DEBUG_CM,
709                                     "%s: Node %p, Sending RESET\n",
710                                     __func__,
711                                     cm_node);
712                         if (passive)
713                                 i40iw_passive_open_err(cm_node, true);
714                         else
715                                 i40iw_active_open_err(cm_node, true);
716                         return -1;
717                 }
718         }
719
720         cm_node->tcp_cntxt.snd_wnd = ntohs(tcph->window) <<
721             cm_node->tcp_cntxt.snd_wscale;
722
723         if (cm_node->tcp_cntxt.snd_wnd > cm_node->tcp_cntxt.max_snd_wnd)
724                 cm_node->tcp_cntxt.max_snd_wnd = cm_node->tcp_cntxt.snd_wnd;
725         return 0;
726 }
727
728 /**
729  * i40iw_build_mpa_v1 - build a MPA V1 frame
730  * @cm_node: connection's node
731  * @mpa_key: to do read0 or write0
732  */
733 static void i40iw_build_mpa_v1(struct i40iw_cm_node *cm_node,
734                                void *start_addr,
735                                u8 mpa_key)
736 {
737         struct ietf_mpa_v1 *mpa_frame = (struct ietf_mpa_v1 *)start_addr;
738
739         switch (mpa_key) {
740         case MPA_KEY_REQUEST:
741                 memcpy(mpa_frame->key, IEFT_MPA_KEY_REQ, IETF_MPA_KEY_SIZE);
742                 break;
743         case MPA_KEY_REPLY:
744                 memcpy(mpa_frame->key, IEFT_MPA_KEY_REP, IETF_MPA_KEY_SIZE);
745                 break;
746         default:
747                 break;
748         }
749         mpa_frame->flags = IETF_MPA_FLAGS_CRC;
750         mpa_frame->rev = cm_node->mpa_frame_rev;
751         mpa_frame->priv_data_len = htons(cm_node->pdata.size);
752 }
753
754 /**
755  * i40iw_build_mpa_v2 - build a MPA V2 frame
756  * @cm_node: connection's node
757  * @start_addr: buffer start address
758  * @mpa_key: to do read0 or write0
759  */
760 static void i40iw_build_mpa_v2(struct i40iw_cm_node *cm_node,
761                                void *start_addr,
762                                u8 mpa_key)
763 {
764         struct ietf_mpa_v2 *mpa_frame = (struct ietf_mpa_v2 *)start_addr;
765         struct ietf_rtr_msg *rtr_msg = &mpa_frame->rtr_msg;
766         u16 ctrl_ird, ctrl_ord;
767
768         /* initialize the upper 5 bytes of the frame */
769         i40iw_build_mpa_v1(cm_node, start_addr, mpa_key);
770         mpa_frame->flags |= IETF_MPA_V2_FLAG;
771         mpa_frame->priv_data_len += htons(IETF_RTR_MSG_SIZE);
772
773         /* initialize RTR msg */
774         if (cm_node->mpav2_ird_ord == IETF_NO_IRD_ORD) {
775                 ctrl_ird = IETF_NO_IRD_ORD;
776                 ctrl_ord = IETF_NO_IRD_ORD;
777         } else {
778                 ctrl_ird = (cm_node->ird_size > IETF_NO_IRD_ORD) ?
779                         IETF_NO_IRD_ORD : cm_node->ird_size;
780                 ctrl_ord = (cm_node->ord_size > IETF_NO_IRD_ORD) ?
781                         IETF_NO_IRD_ORD : cm_node->ord_size;
782         }
783
784         ctrl_ird |= IETF_PEER_TO_PEER;
785         ctrl_ird |= IETF_FLPDU_ZERO_LEN;
786
787         switch (mpa_key) {
788         case MPA_KEY_REQUEST:
789                 ctrl_ord |= IETF_RDMA0_WRITE;
790                 ctrl_ord |= IETF_RDMA0_READ;
791                 break;
792         case MPA_KEY_REPLY:
793                 switch (cm_node->send_rdma0_op) {
794                 case SEND_RDMA_WRITE_ZERO:
795                         ctrl_ord |= IETF_RDMA0_WRITE;
796                         break;
797                 case SEND_RDMA_READ_ZERO:
798                         ctrl_ord |= IETF_RDMA0_READ;
799                         break;
800                 }
801                 break;
802         default:
803                 break;
804         }
805         rtr_msg->ctrl_ird = htons(ctrl_ird);
806         rtr_msg->ctrl_ord = htons(ctrl_ord);
807 }
808
809 /**
810  * i40iw_cm_build_mpa_frame - build mpa frame for mpa version 1 or version 2
811  * @cm_node: connection's node
812  * @mpa: mpa: data buffer
813  * @mpa_key: to do read0 or write0
814  */
815 static int i40iw_cm_build_mpa_frame(struct i40iw_cm_node *cm_node,
816                                     struct i40iw_kmem_info *mpa,
817                                     u8 mpa_key)
818 {
819         int hdr_len = 0;
820
821         switch (cm_node->mpa_frame_rev) {
822         case IETF_MPA_V1:
823                 hdr_len = sizeof(struct ietf_mpa_v1);
824                 i40iw_build_mpa_v1(cm_node, mpa->addr, mpa_key);
825                 break;
826         case IETF_MPA_V2:
827                 hdr_len = sizeof(struct ietf_mpa_v2);
828                 i40iw_build_mpa_v2(cm_node, mpa->addr, mpa_key);
829                 break;
830         default:
831                 break;
832         }
833
834         return hdr_len;
835 }
836
837 /**
838  * i40iw_send_mpa_request - active node send mpa request to passive node
839  * @cm_node: connection's node
840  */
841 static int i40iw_send_mpa_request(struct i40iw_cm_node *cm_node)
842 {
843         struct i40iw_puda_buf *sqbuf;
844
845         if (!cm_node) {
846                 i40iw_pr_err("cm_node == NULL\n");
847                 return -1;
848         }
849
850         cm_node->mpa_hdr.addr = &cm_node->mpa_frame;
851         cm_node->mpa_hdr.size = i40iw_cm_build_mpa_frame(cm_node,
852                                                          &cm_node->mpa_hdr,
853                                                          MPA_KEY_REQUEST);
854         if (!cm_node->mpa_hdr.size) {
855                 i40iw_pr_err("mpa size = %d\n", cm_node->mpa_hdr.size);
856                 return -1;
857         }
858
859         sqbuf = i40iw_form_cm_frame(cm_node,
860                                     NULL,
861                                     &cm_node->mpa_hdr,
862                                     &cm_node->pdata,
863                                     SET_ACK);
864         if (!sqbuf) {
865                 i40iw_pr_err("sq_buf == NULL\n");
866                 return -1;
867         }
868         return i40iw_schedule_cm_timer(cm_node, sqbuf, I40IW_TIMER_TYPE_SEND, 1, 0);
869 }
870
871 /**
872  * i40iw_send_mpa_reject -
873  * @cm_node: connection's node
874  * @pdata: reject data for connection
875  * @plen: length of reject data
876  */
877 static int i40iw_send_mpa_reject(struct i40iw_cm_node *cm_node,
878                                  const void *pdata,
879                                  u8 plen)
880 {
881         struct i40iw_puda_buf *sqbuf;
882         struct i40iw_kmem_info priv_info;
883
884         cm_node->mpa_hdr.addr = &cm_node->mpa_frame;
885         cm_node->mpa_hdr.size = i40iw_cm_build_mpa_frame(cm_node,
886                                                          &cm_node->mpa_hdr,
887                                                          MPA_KEY_REPLY);
888
889         cm_node->mpa_frame.flags |= IETF_MPA_FLAGS_REJECT;
890         priv_info.addr = (void *)pdata;
891         priv_info.size = plen;
892
893         sqbuf = i40iw_form_cm_frame(cm_node,
894                                     NULL,
895                                     &cm_node->mpa_hdr,
896                                     &priv_info,
897                                     SET_ACK | SET_FIN);
898         if (!sqbuf) {
899                 i40iw_pr_err("no sqbuf\n");
900                 return -ENOMEM;
901         }
902         cm_node->state = I40IW_CM_STATE_FIN_WAIT1;
903         return i40iw_schedule_cm_timer(cm_node, sqbuf, I40IW_TIMER_TYPE_SEND, 1, 0);
904 }
905
906 /**
907  * recv_mpa - process an IETF MPA frame
908  * @cm_node: connection's node
909  * @buffer: Data pointer
910  * @type: to return accept or reject
911  * @len: Len of mpa buffer
912  */
913 static int i40iw_parse_mpa(struct i40iw_cm_node *cm_node, u8 *buffer, u32 *type, u32 len)
914 {
915         struct ietf_mpa_v1 *mpa_frame;
916         struct ietf_mpa_v2 *mpa_v2_frame;
917         struct ietf_rtr_msg *rtr_msg;
918         int mpa_hdr_len;
919         int priv_data_len;
920
921         *type = I40IW_MPA_REQUEST_ACCEPT;
922
923         if (len < sizeof(struct ietf_mpa_v1)) {
924                 i40iw_pr_err("ietf buffer small (%x)\n", len);
925                 return -1;
926         }
927
928         mpa_frame = (struct ietf_mpa_v1 *)buffer;
929         mpa_hdr_len = sizeof(struct ietf_mpa_v1);
930         priv_data_len = ntohs(mpa_frame->priv_data_len);
931
932         if (priv_data_len > IETF_MAX_PRIV_DATA_LEN) {
933                 i40iw_pr_err("large pri_data %d\n", priv_data_len);
934                 return -1;
935         }
936         if (mpa_frame->rev != IETF_MPA_V1 && mpa_frame->rev != IETF_MPA_V2) {
937                 i40iw_pr_err("unsupported mpa rev = %d\n", mpa_frame->rev);
938                 return -1;
939         }
940         if (mpa_frame->rev > cm_node->mpa_frame_rev) {
941                 i40iw_pr_err("rev %d\n", mpa_frame->rev);
942                 return -1;
943         }
944         cm_node->mpa_frame_rev = mpa_frame->rev;
945
946         if (cm_node->state != I40IW_CM_STATE_MPAREQ_SENT) {
947                 if (memcmp(mpa_frame->key, IEFT_MPA_KEY_REQ, IETF_MPA_KEY_SIZE)) {
948                         i40iw_pr_err("Unexpected MPA Key received\n");
949                         return -1;
950                 }
951         } else {
952                 if (memcmp(mpa_frame->key, IEFT_MPA_KEY_REP, IETF_MPA_KEY_SIZE)) {
953                         i40iw_pr_err("Unexpected MPA Key received\n");
954                         return -1;
955                 }
956         }
957
958         if (priv_data_len + mpa_hdr_len > len) {
959                 i40iw_pr_err("ietf buffer len(%x + %x != %x)\n",
960                              priv_data_len, mpa_hdr_len, len);
961                 return -1;
962         }
963         if (len > MAX_CM_BUFFER) {
964                 i40iw_pr_err("ietf buffer large len = %d\n", len);
965                 return -1;
966         }
967
968         switch (mpa_frame->rev) {
969         case IETF_MPA_V2:{
970                         u16 ird_size;
971                         u16 ord_size;
972                         u16 ctrl_ord;
973                         u16 ctrl_ird;
974
975                         mpa_v2_frame = (struct ietf_mpa_v2 *)buffer;
976                         mpa_hdr_len += IETF_RTR_MSG_SIZE;
977                         rtr_msg = &mpa_v2_frame->rtr_msg;
978
979                         /* parse rtr message */
980                         ctrl_ord = ntohs(rtr_msg->ctrl_ord);
981                         ctrl_ird = ntohs(rtr_msg->ctrl_ird);
982                         ird_size = ctrl_ird & IETF_NO_IRD_ORD;
983                         ord_size = ctrl_ord & IETF_NO_IRD_ORD;
984
985                         if (!(ctrl_ird & IETF_PEER_TO_PEER))
986                                 return -1;
987
988                         if (ird_size == IETF_NO_IRD_ORD || ord_size == IETF_NO_IRD_ORD) {
989                                 cm_node->mpav2_ird_ord = IETF_NO_IRD_ORD;
990                                 goto negotiate_done;
991                         }
992
993                         if (cm_node->state != I40IW_CM_STATE_MPAREQ_SENT) {
994                                 /* responder */
995                                 if (!ord_size && (ctrl_ord & IETF_RDMA0_READ))
996                                         cm_node->ird_size = 1;
997                                 if (cm_node->ord_size > ird_size)
998                                         cm_node->ord_size = ird_size;
999                         } else {
1000                                 /* initiator */
1001                                 if (!ird_size && (ctrl_ord & IETF_RDMA0_READ))
1002                                         return -1;
1003                                 if (cm_node->ord_size > ird_size)
1004                                         cm_node->ord_size = ird_size;
1005
1006                                 if (cm_node->ird_size < ord_size)
1007                                         /* no resources available */
1008                                         return -1;
1009                         }
1010
1011 negotiate_done:
1012                         if (ctrl_ord & IETF_RDMA0_READ)
1013                                 cm_node->send_rdma0_op = SEND_RDMA_READ_ZERO;
1014                         else if (ctrl_ord & IETF_RDMA0_WRITE)
1015                                 cm_node->send_rdma0_op = SEND_RDMA_WRITE_ZERO;
1016                         else    /* Not supported RDMA0 operation */
1017                                 return -1;
1018                         i40iw_debug(cm_node->dev, I40IW_DEBUG_CM,
1019                                     "MPAV2: Negotiated ORD: %d, IRD: %d\n",
1020                                     cm_node->ord_size, cm_node->ird_size);
1021                         break;
1022                 }
1023                 break;
1024         case IETF_MPA_V1:
1025         default:
1026                 break;
1027         }
1028
1029         memcpy(cm_node->pdata_buf, buffer + mpa_hdr_len, priv_data_len);
1030         cm_node->pdata.size = priv_data_len;
1031
1032         if (mpa_frame->flags & IETF_MPA_FLAGS_REJECT)
1033                 *type = I40IW_MPA_REQUEST_REJECT;
1034
1035         if (mpa_frame->flags & IETF_MPA_FLAGS_MARKERS)
1036                 cm_node->snd_mark_en = true;
1037
1038         return 0;
1039 }
1040
1041 /**
1042  * i40iw_schedule_cm_timer
1043  * @@cm_node: connection's node
1044  * @sqbuf: buffer to send
1045  * @type: if it es send ot close
1046  * @send_retrans: if rexmits to be done
1047  * @close_when_complete: is cm_node to be removed
1048  *
1049  * note - cm_node needs to be protected before calling this. Encase in:
1050  *              i40iw_rem_ref_cm_node(cm_core, cm_node);
1051  *              i40iw_schedule_cm_timer(...)
1052  *              atomic_inc(&cm_node->ref_count);
1053  */
1054 int i40iw_schedule_cm_timer(struct i40iw_cm_node *cm_node,
1055                             struct i40iw_puda_buf *sqbuf,
1056                             enum i40iw_timer_type type,
1057                             int send_retrans,
1058                             int close_when_complete)
1059 {
1060         struct i40iw_sc_dev *dev = cm_node->dev;
1061         struct i40iw_cm_core *cm_core = cm_node->cm_core;
1062         struct i40iw_timer_entry *new_send;
1063         int ret = 0;
1064         u32 was_timer_set;
1065         unsigned long flags;
1066
1067         new_send = kzalloc(sizeof(*new_send), GFP_ATOMIC);
1068         if (!new_send) {
1069                 i40iw_free_sqbuf(cm_node->dev, (void *)sqbuf);
1070                 return -ENOMEM;
1071         }
1072         new_send->retrycount = I40IW_DEFAULT_RETRYS;
1073         new_send->retranscount = I40IW_DEFAULT_RETRANS;
1074         new_send->sqbuf = sqbuf;
1075         new_send->timetosend = jiffies;
1076         new_send->type = type;
1077         new_send->send_retrans = send_retrans;
1078         new_send->close_when_complete = close_when_complete;
1079
1080         if (type == I40IW_TIMER_TYPE_CLOSE) {
1081                 new_send->timetosend += (HZ / 10);
1082                 if (cm_node->close_entry) {
1083                         kfree(new_send);
1084                         i40iw_free_sqbuf(cm_node->dev, (void *)sqbuf);
1085                         i40iw_pr_err("already close entry\n");
1086                         return -EINVAL;
1087                 }
1088                 cm_node->close_entry = new_send;
1089         }
1090
1091         if (type == I40IW_TIMER_TYPE_SEND) {
1092                 spin_lock_irqsave(&cm_node->retrans_list_lock, flags);
1093                 cm_node->send_entry = new_send;
1094                 atomic_inc(&cm_node->ref_count);
1095                 spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);
1096                 new_send->timetosend = jiffies + I40IW_RETRY_TIMEOUT;
1097
1098                 atomic_inc(&sqbuf->refcount);
1099                 i40iw_puda_send_buf(dev->ilq, sqbuf);
1100                 if (!send_retrans) {
1101                         i40iw_cleanup_retrans_entry(cm_node);
1102                         if (close_when_complete)
1103                                 i40iw_rem_ref_cm_node(cm_node);
1104                         return ret;
1105                 }
1106         }
1107
1108         spin_lock_irqsave(&cm_core->ht_lock, flags);
1109         was_timer_set = timer_pending(&cm_core->tcp_timer);
1110
1111         if (!was_timer_set) {
1112                 cm_core->tcp_timer.expires = new_send->timetosend;
1113                 add_timer(&cm_core->tcp_timer);
1114         }
1115         spin_unlock_irqrestore(&cm_core->ht_lock, flags);
1116
1117         return ret;
1118 }
1119
1120 /**
1121  * i40iw_retrans_expired - Could not rexmit the packet
1122  * @cm_node: connection's node
1123  */
1124 static void i40iw_retrans_expired(struct i40iw_cm_node *cm_node)
1125 {
1126         struct iw_cm_id *cm_id = cm_node->cm_id;
1127         enum i40iw_cm_node_state state = cm_node->state;
1128
1129         cm_node->state = I40IW_CM_STATE_CLOSED;
1130         switch (state) {
1131         case I40IW_CM_STATE_SYN_RCVD:
1132         case I40IW_CM_STATE_CLOSING:
1133                 i40iw_rem_ref_cm_node(cm_node);
1134                 break;
1135         case I40IW_CM_STATE_FIN_WAIT1:
1136         case I40IW_CM_STATE_LAST_ACK:
1137                 if (cm_node->cm_id)
1138                         cm_id->rem_ref(cm_id);
1139                 i40iw_send_reset(cm_node);
1140                 break;
1141         default:
1142                 atomic_inc(&cm_node->ref_count);
1143                 i40iw_send_reset(cm_node);
1144                 i40iw_create_event(cm_node, I40IW_CM_EVENT_ABORTED);
1145                 break;
1146         }
1147 }
1148
1149 /**
1150  * i40iw_handle_close_entry - for handling retry/timeouts
1151  * @cm_node: connection's node
1152  * @rem_node: flag for remove cm_node
1153  */
1154 static void i40iw_handle_close_entry(struct i40iw_cm_node *cm_node, u32 rem_node)
1155 {
1156         struct i40iw_timer_entry *close_entry = cm_node->close_entry;
1157         struct iw_cm_id *cm_id = cm_node->cm_id;
1158         struct i40iw_qp *iwqp;
1159         unsigned long flags;
1160
1161         if (!close_entry)
1162                 return;
1163         iwqp = (struct i40iw_qp *)close_entry->sqbuf;
1164         if (iwqp) {
1165                 spin_lock_irqsave(&iwqp->lock, flags);
1166                 if (iwqp->cm_id) {
1167                         iwqp->hw_tcp_state = I40IW_TCP_STATE_CLOSED;
1168                         iwqp->hw_iwarp_state = I40IW_QP_STATE_ERROR;
1169                         iwqp->last_aeq = I40IW_AE_RESET_SENT;
1170                         iwqp->ibqp_state = IB_QPS_ERR;
1171                         spin_unlock_irqrestore(&iwqp->lock, flags);
1172                         i40iw_cm_disconn(iwqp);
1173                 } else {
1174                         spin_unlock_irqrestore(&iwqp->lock, flags);
1175                 }
1176         } else if (rem_node) {
1177                 /* TIME_WAIT state */
1178                 i40iw_rem_ref_cm_node(cm_node);
1179         }
1180         if (cm_id)
1181                 cm_id->rem_ref(cm_id);
1182         kfree(close_entry);
1183         cm_node->close_entry = NULL;
1184 }
1185
1186 /**
1187  * i40iw_cm_timer_tick - system's timer expired callback
1188  * @pass: Pointing to cm_core
1189  */
1190 static void i40iw_cm_timer_tick(unsigned long pass)
1191 {
1192         unsigned long nexttimeout = jiffies + I40IW_LONG_TIME;
1193         struct i40iw_cm_node *cm_node;
1194         struct i40iw_timer_entry *send_entry, *close_entry;
1195         struct list_head *list_core_temp;
1196         struct list_head *list_node;
1197         struct i40iw_cm_core *cm_core = (struct i40iw_cm_core *)pass;
1198         u32 settimer = 0;
1199         unsigned long timetosend;
1200         struct i40iw_sc_dev *dev;
1201         unsigned long flags;
1202
1203         struct list_head timer_list;
1204
1205         INIT_LIST_HEAD(&timer_list);
1206         spin_lock_irqsave(&cm_core->ht_lock, flags);
1207
1208         list_for_each_safe(list_node, list_core_temp, &cm_core->connected_nodes) {
1209                 cm_node = container_of(list_node, struct i40iw_cm_node, list);
1210                 if (cm_node->close_entry || cm_node->send_entry) {
1211                         atomic_inc(&cm_node->ref_count);
1212                         list_add(&cm_node->timer_entry, &timer_list);
1213                 }
1214         }
1215         spin_unlock_irqrestore(&cm_core->ht_lock, flags);
1216
1217         list_for_each_safe(list_node, list_core_temp, &timer_list) {
1218                 cm_node = container_of(list_node,
1219                                        struct i40iw_cm_node,
1220                                        timer_entry);
1221                 close_entry = cm_node->close_entry;
1222
1223                 if (close_entry) {
1224                         if (time_after(close_entry->timetosend, jiffies)) {
1225                                 if (nexttimeout > close_entry->timetosend ||
1226                                     !settimer) {
1227                                         nexttimeout = close_entry->timetosend;
1228                                         settimer = 1;
1229                                 }
1230                         } else {
1231                                 i40iw_handle_close_entry(cm_node, 1);
1232                         }
1233                 }
1234
1235                 spin_lock_irqsave(&cm_node->retrans_list_lock, flags);
1236
1237                 send_entry = cm_node->send_entry;
1238                 if (!send_entry)
1239                         goto done;
1240                 if (time_after(send_entry->timetosend, jiffies)) {
1241                         if (cm_node->state != I40IW_CM_STATE_OFFLOADED) {
1242                                 if ((nexttimeout > send_entry->timetosend) ||
1243                                     !settimer) {
1244                                         nexttimeout = send_entry->timetosend;
1245                                         settimer = 1;
1246                                 }
1247                         } else {
1248                                 i40iw_free_retrans_entry(cm_node);
1249                         }
1250                         goto done;
1251                 }
1252
1253                 if ((cm_node->state == I40IW_CM_STATE_OFFLOADED) ||
1254                     (cm_node->state == I40IW_CM_STATE_CLOSED)) {
1255                         i40iw_free_retrans_entry(cm_node);
1256                         goto done;
1257                 }
1258
1259                 if (!send_entry->retranscount || !send_entry->retrycount) {
1260                         i40iw_free_retrans_entry(cm_node);
1261
1262                         spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);
1263                         i40iw_retrans_expired(cm_node);
1264                         cm_node->state = I40IW_CM_STATE_CLOSED;
1265                         spin_lock_irqsave(&cm_node->retrans_list_lock, flags);
1266                         goto done;
1267                 }
1268                 cm_node->cm_core->stats_pkt_retrans++;
1269                 spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);
1270
1271                 dev = cm_node->dev;
1272                 atomic_inc(&send_entry->sqbuf->refcount);
1273                 i40iw_puda_send_buf(dev->ilq, send_entry->sqbuf);
1274                 spin_lock_irqsave(&cm_node->retrans_list_lock, flags);
1275                 if (send_entry->send_retrans) {
1276                         send_entry->retranscount--;
1277                         timetosend = (I40IW_RETRY_TIMEOUT <<
1278                                       (I40IW_DEFAULT_RETRANS -
1279                                        send_entry->retranscount));
1280
1281                         send_entry->timetosend = jiffies +
1282                             min(timetosend, I40IW_MAX_TIMEOUT);
1283                         if (nexttimeout > send_entry->timetosend || !settimer) {
1284                                 nexttimeout = send_entry->timetosend;
1285                                 settimer = 1;
1286                         }
1287                 } else {
1288                         int close_when_complete;
1289
1290                         close_when_complete = send_entry->close_when_complete;
1291                         i40iw_debug(cm_node->dev,
1292                                     I40IW_DEBUG_CM,
1293                                     "cm_node=%p state=%d\n",
1294                                     cm_node,
1295                                     cm_node->state);
1296                         i40iw_free_retrans_entry(cm_node);
1297                         if (close_when_complete)
1298                                 i40iw_rem_ref_cm_node(cm_node);
1299                 }
1300 done:
1301                 spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);
1302                 i40iw_rem_ref_cm_node(cm_node);
1303         }
1304
1305         if (settimer) {
1306                 spin_lock_irqsave(&cm_core->ht_lock, flags);
1307                 if (!timer_pending(&cm_core->tcp_timer)) {
1308                         cm_core->tcp_timer.expires = nexttimeout;
1309                         add_timer(&cm_core->tcp_timer);
1310                 }
1311                 spin_unlock_irqrestore(&cm_core->ht_lock, flags);
1312         }
1313 }
1314
1315 /**
1316  * i40iw_send_syn - send SYN packet
1317  * @cm_node: connection's node
1318  * @sendack: flag to set ACK bit or not
1319  */
1320 int i40iw_send_syn(struct i40iw_cm_node *cm_node, u32 sendack)
1321 {
1322         struct i40iw_puda_buf *sqbuf;
1323         int flags = SET_SYN;
1324         char optionsbuffer[sizeof(struct option_mss) +
1325                            sizeof(struct option_windowscale) +
1326                            sizeof(struct option_base) + TCP_OPTIONS_PADDING];
1327         struct i40iw_kmem_info opts;
1328
1329         int optionssize = 0;
1330         /* Sending MSS option */
1331         union all_known_options *options;
1332
1333         opts.addr = optionsbuffer;
1334         if (!cm_node) {
1335                 i40iw_pr_err("no cm_node\n");
1336                 return -EINVAL;
1337         }
1338
1339         options = (union all_known_options *)&optionsbuffer[optionssize];
1340         options->as_mss.optionnum = OPTION_NUMBER_MSS;
1341         options->as_mss.length = sizeof(struct option_mss);
1342         options->as_mss.mss = htons(cm_node->tcp_cntxt.mss);
1343         optionssize += sizeof(struct option_mss);
1344
1345         options = (union all_known_options *)&optionsbuffer[optionssize];
1346         options->as_windowscale.optionnum = OPTION_NUMBER_WINDOW_SCALE;
1347         options->as_windowscale.length = sizeof(struct option_windowscale);
1348         options->as_windowscale.shiftcount = cm_node->tcp_cntxt.rcv_wscale;
1349         optionssize += sizeof(struct option_windowscale);
1350         options = (union all_known_options *)&optionsbuffer[optionssize];
1351         options->as_end = OPTION_NUMBER_END;
1352         optionssize += 1;
1353
1354         if (sendack)
1355                 flags |= SET_ACK;
1356
1357         opts.size = optionssize;
1358
1359         sqbuf = i40iw_form_cm_frame(cm_node, &opts, NULL, NULL, flags);
1360         if (!sqbuf) {
1361                 i40iw_pr_err("no sqbuf\n");
1362                 return -1;
1363         }
1364         return i40iw_schedule_cm_timer(cm_node, sqbuf, I40IW_TIMER_TYPE_SEND, 1, 0);
1365 }
1366
1367 /**
1368  * i40iw_send_ack - Send ACK packet
1369  * @cm_node: connection's node
1370  */
1371 static void i40iw_send_ack(struct i40iw_cm_node *cm_node)
1372 {
1373         struct i40iw_puda_buf *sqbuf;
1374
1375         sqbuf = i40iw_form_cm_frame(cm_node, NULL, NULL, NULL, SET_ACK);
1376         if (sqbuf)
1377                 i40iw_puda_send_buf(cm_node->dev->ilq, sqbuf);
1378         else
1379                 i40iw_pr_err("no sqbuf\n");
1380 }
1381
1382 /**
1383  * i40iw_send_fin - Send FIN pkt
1384  * @cm_node: connection's node
1385  */
1386 static int i40iw_send_fin(struct i40iw_cm_node *cm_node)
1387 {
1388         struct i40iw_puda_buf *sqbuf;
1389
1390         sqbuf = i40iw_form_cm_frame(cm_node, NULL, NULL, NULL, SET_ACK | SET_FIN);
1391         if (!sqbuf) {
1392                 i40iw_pr_err("no sqbuf\n");
1393                 return -1;
1394         }
1395         return i40iw_schedule_cm_timer(cm_node, sqbuf, I40IW_TIMER_TYPE_SEND, 1, 0);
1396 }
1397
1398 /**
1399  * i40iw_find_node - find a cm node that matches the reference cm node
1400  * @cm_core: cm's core
1401  * @rem_port: remote tcp port num
1402  * @rem_addr: remote ip addr
1403  * @loc_port: local tcp port num
1404  * @loc_addr: loc ip addr
1405  * @add_refcnt: flag to increment refcount of cm_node
1406  */
1407 struct i40iw_cm_node *i40iw_find_node(struct i40iw_cm_core *cm_core,
1408                                       u16 rem_port,
1409                                       u32 *rem_addr,
1410                                       u16 loc_port,
1411                                       u32 *loc_addr,
1412                                       bool add_refcnt)
1413 {
1414         struct list_head *hte;
1415         struct i40iw_cm_node *cm_node;
1416         unsigned long flags;
1417
1418         hte = &cm_core->connected_nodes;
1419
1420         /* walk list and find cm_node associated with this session ID */
1421         spin_lock_irqsave(&cm_core->ht_lock, flags);
1422         list_for_each_entry(cm_node, hte, list) {
1423                 if (!memcmp(cm_node->loc_addr, loc_addr, sizeof(cm_node->loc_addr)) &&
1424                     (cm_node->loc_port == loc_port) &&
1425                     !memcmp(cm_node->rem_addr, rem_addr, sizeof(cm_node->rem_addr)) &&
1426                     (cm_node->rem_port == rem_port)) {
1427                         if (add_refcnt)
1428                                 atomic_inc(&cm_node->ref_count);
1429                         spin_unlock_irqrestore(&cm_core->ht_lock, flags);
1430                         return cm_node;
1431                 }
1432         }
1433         spin_unlock_irqrestore(&cm_core->ht_lock, flags);
1434
1435         /* no owner node */
1436         return NULL;
1437 }
1438
1439 /**
1440  * i40iw_find_listener - find a cm node listening on this addr-port pair
1441  * @cm_core: cm's core
1442  * @dst_port: listener tcp port num
1443  * @dst_addr: listener ip addr
1444  * @listener_state: state to match with listen node's
1445  */
1446 static struct i40iw_cm_listener *i40iw_find_listener(
1447                                                      struct i40iw_cm_core *cm_core,
1448                                                      u32 *dst_addr,
1449                                                      u16 dst_port,
1450                                                      u16 vlan_id,
1451                                                      enum i40iw_cm_listener_state
1452                                                      listener_state)
1453 {
1454         struct i40iw_cm_listener *listen_node;
1455         static const u32 ip_zero[4] = { 0, 0, 0, 0 };
1456         u32 listen_addr[4];
1457         u16 listen_port;
1458         unsigned long flags;
1459
1460         /* walk list and find cm_node associated with this session ID */
1461         spin_lock_irqsave(&cm_core->listen_list_lock, flags);
1462         list_for_each_entry(listen_node, &cm_core->listen_nodes, list) {
1463                 memcpy(listen_addr, listen_node->loc_addr, sizeof(listen_addr));
1464                 listen_port = listen_node->loc_port;
1465                 /* compare node pair, return node handle if a match */
1466                 if ((!memcmp(listen_addr, dst_addr, sizeof(listen_addr)) ||
1467                      !memcmp(listen_addr, ip_zero, sizeof(listen_addr))) &&
1468                      (listen_port == dst_port) &&
1469                      (listener_state & listen_node->listener_state)) {
1470                         atomic_inc(&listen_node->ref_count);
1471                         spin_unlock_irqrestore(&cm_core->listen_list_lock, flags);
1472                         return listen_node;
1473                 }
1474         }
1475         spin_unlock_irqrestore(&cm_core->listen_list_lock, flags);
1476         return NULL;
1477 }
1478
1479 /**
1480  * i40iw_add_hte_node - add a cm node to the hash table
1481  * @cm_core: cm's core
1482  * @cm_node: connection's node
1483  */
1484 static void i40iw_add_hte_node(struct i40iw_cm_core *cm_core,
1485                                struct i40iw_cm_node *cm_node)
1486 {
1487         struct list_head *hte;
1488         unsigned long flags;
1489
1490         if (!cm_node || !cm_core) {
1491                 i40iw_pr_err("cm_node or cm_core == NULL\n");
1492                 return;
1493         }
1494         spin_lock_irqsave(&cm_core->ht_lock, flags);
1495
1496         /* get a handle on the hash table element (list head for this slot) */
1497         hte = &cm_core->connected_nodes;
1498         list_add_tail(&cm_node->list, hte);
1499         spin_unlock_irqrestore(&cm_core->ht_lock, flags);
1500 }
1501
1502 /**
1503  * listen_port_in_use - determine if port is in use
1504  * @port: Listen port number
1505  */
1506 static bool i40iw_listen_port_in_use(struct i40iw_cm_core *cm_core, u16 port)
1507 {
1508         struct i40iw_cm_listener *listen_node;
1509         unsigned long flags;
1510         bool ret = false;
1511
1512         spin_lock_irqsave(&cm_core->listen_list_lock, flags);
1513         list_for_each_entry(listen_node, &cm_core->listen_nodes, list) {
1514                 if (listen_node->loc_port == port) {
1515                         ret = true;
1516                         break;
1517                 }
1518         }
1519         spin_unlock_irqrestore(&cm_core->listen_list_lock, flags);
1520         return ret;
1521 }
1522
1523 /**
1524  * i40iw_del_multiple_qhash - Remove qhash and child listens
1525  * @iwdev: iWarp device
1526  * @cm_info: CM info for parent listen node
1527  * @cm_parent_listen_node: The parent listen node
1528  */
1529 static enum i40iw_status_code i40iw_del_multiple_qhash(
1530                                                        struct i40iw_device *iwdev,
1531                                                        struct i40iw_cm_info *cm_info,
1532                                                        struct i40iw_cm_listener *cm_parent_listen_node)
1533 {
1534         struct i40iw_cm_listener *child_listen_node;
1535         enum i40iw_status_code ret = I40IW_ERR_CONFIG;
1536         struct list_head *pos, *tpos;
1537         unsigned long flags;
1538
1539         spin_lock_irqsave(&iwdev->cm_core.listen_list_lock, flags);
1540         list_for_each_safe(pos, tpos, &cm_parent_listen_node->child_listen_list) {
1541                 child_listen_node = list_entry(pos, struct i40iw_cm_listener, child_listen_list);
1542                 if (child_listen_node->ipv4)
1543                         i40iw_debug(&iwdev->sc_dev,
1544                                     I40IW_DEBUG_CM,
1545                                     "removing child listen for IP=%pI4, port=%d, vlan=%d\n",
1546                                     child_listen_node->loc_addr,
1547                                     child_listen_node->loc_port,
1548                                     child_listen_node->vlan_id);
1549                 else
1550                         i40iw_debug(&iwdev->sc_dev, I40IW_DEBUG_CM,
1551                                     "removing child listen for IP=%pI6, port=%d, vlan=%d\n",
1552                                     child_listen_node->loc_addr,
1553                                     child_listen_node->loc_port,
1554                                     child_listen_node->vlan_id);
1555                 list_del(pos);
1556                 memcpy(cm_info->loc_addr, child_listen_node->loc_addr,
1557                        sizeof(cm_info->loc_addr));
1558                 cm_info->vlan_id = child_listen_node->vlan_id;
1559                 ret = i40iw_manage_qhash(iwdev, cm_info,
1560                                          I40IW_QHASH_TYPE_TCP_SYN,
1561                                          I40IW_QHASH_MANAGE_TYPE_DELETE, NULL, false);
1562                 i40iw_debug(&iwdev->sc_dev,
1563                             I40IW_DEBUG_CM,
1564                             "freed pointer = %p\n",
1565                             child_listen_node);
1566                 kfree(child_listen_node);
1567                 cm_parent_listen_node->cm_core->stats_listen_nodes_destroyed++;
1568         }
1569         spin_unlock_irqrestore(&iwdev->cm_core.listen_list_lock, flags);
1570
1571         return ret;
1572 }
1573
1574 /**
1575  * i40iw_netdev_vlan_ipv6 - Gets the netdev and mac
1576  * @addr: local IPv6 address
1577  * @vlan_id: vlan id for the given IPv6 address
1578  * @mac: mac address for the given IPv6 address
1579  *
1580  * Returns the net_device of the IPv6 address and also sets the
1581  * vlan id and mac for that address.
1582  */
1583 static struct net_device *i40iw_netdev_vlan_ipv6(u32 *addr, u16 *vlan_id, u8 *mac)
1584 {
1585         struct net_device *ip_dev = NULL;
1586         struct in6_addr laddr6;
1587
1588         if (!IS_ENABLED(CONFIG_IPV6))
1589                 return NULL;
1590         i40iw_copy_ip_htonl(laddr6.in6_u.u6_addr32, addr);
1591         if (vlan_id)
1592                 *vlan_id = I40IW_NO_VLAN;
1593         if (mac)
1594                 eth_zero_addr(mac);
1595         rcu_read_lock();
1596         for_each_netdev_rcu(&init_net, ip_dev) {
1597                 if (ipv6_chk_addr(&init_net, &laddr6, ip_dev, 1)) {
1598                         if (vlan_id)
1599                                 *vlan_id = rdma_vlan_dev_vlan_id(ip_dev);
1600                         if (ip_dev->dev_addr && mac)
1601                                 ether_addr_copy(mac, ip_dev->dev_addr);
1602                         break;
1603                 }
1604         }
1605         rcu_read_unlock();
1606         return ip_dev;
1607 }
1608
1609 /**
1610  * i40iw_get_vlan_ipv4 - Returns the vlan_id for IPv4 address
1611  * @addr: local IPv4 address
1612  */
1613 static u16 i40iw_get_vlan_ipv4(u32 *addr)
1614 {
1615         struct net_device *netdev;
1616         u16 vlan_id = I40IW_NO_VLAN;
1617
1618         netdev = ip_dev_find(&init_net, htonl(addr[0]));
1619         if (netdev) {
1620                 vlan_id = rdma_vlan_dev_vlan_id(netdev);
1621                 dev_put(netdev);
1622         }
1623         return vlan_id;
1624 }
1625
1626 /**
1627  * i40iw_add_mqh_6 - Adds multiple qhashes for IPv6
1628  * @iwdev: iWarp device
1629  * @cm_info: CM info for parent listen node
1630  * @cm_parent_listen_node: The parent listen node
1631  *
1632  * Adds a qhash and a child listen node for every IPv6 address
1633  * on the adapter and adds the associated qhash filter
1634  */
1635 static enum i40iw_status_code i40iw_add_mqh_6(struct i40iw_device *iwdev,
1636                                               struct i40iw_cm_info *cm_info,
1637                                               struct i40iw_cm_listener *cm_parent_listen_node)
1638 {
1639         struct net_device *ip_dev;
1640         struct inet6_dev *idev;
1641         struct inet6_ifaddr *ifp;
1642         enum i40iw_status_code ret = 0;
1643         struct i40iw_cm_listener *child_listen_node;
1644         unsigned long flags;
1645
1646         rtnl_lock();
1647         for_each_netdev_rcu(&init_net, ip_dev) {
1648                 if ((((rdma_vlan_dev_vlan_id(ip_dev) < I40IW_NO_VLAN) &&
1649                       (rdma_vlan_dev_real_dev(ip_dev) == iwdev->netdev)) ||
1650                      (ip_dev == iwdev->netdev)) && (ip_dev->flags & IFF_UP)) {
1651                         idev = __in6_dev_get(ip_dev);
1652                         if (!idev) {
1653                                 i40iw_pr_err("idev == NULL\n");
1654                                 break;
1655                         }
1656                         list_for_each_entry(ifp, &idev->addr_list, if_list) {
1657                                 i40iw_debug(&iwdev->sc_dev,
1658                                             I40IW_DEBUG_CM,
1659                                             "IP=%pI6, vlan_id=%d, MAC=%pM\n",
1660                                             &ifp->addr,
1661                                             rdma_vlan_dev_vlan_id(ip_dev),
1662                                             ip_dev->dev_addr);
1663                                 child_listen_node =
1664                                         kzalloc(sizeof(*child_listen_node), GFP_ATOMIC);
1665                                 i40iw_debug(&iwdev->sc_dev,
1666                                             I40IW_DEBUG_CM,
1667                                             "Allocating child listener %p\n",
1668                                             child_listen_node);
1669                                 if (!child_listen_node) {
1670                                         i40iw_pr_err("listener memory allocation\n");
1671                                         ret = I40IW_ERR_NO_MEMORY;
1672                                         goto exit;
1673                                 }
1674                                 cm_info->vlan_id = rdma_vlan_dev_vlan_id(ip_dev);
1675                                 cm_parent_listen_node->vlan_id = cm_info->vlan_id;
1676
1677                                 memcpy(child_listen_node, cm_parent_listen_node,
1678                                        sizeof(*child_listen_node));
1679
1680                                 i40iw_copy_ip_ntohl(child_listen_node->loc_addr,
1681                                                     ifp->addr.in6_u.u6_addr32);
1682                                 memcpy(cm_info->loc_addr, child_listen_node->loc_addr,
1683                                        sizeof(cm_info->loc_addr));
1684
1685                                 ret = i40iw_manage_qhash(iwdev, cm_info,
1686                                                          I40IW_QHASH_TYPE_TCP_SYN,
1687                                                          I40IW_QHASH_MANAGE_TYPE_ADD,
1688                                                          NULL, true);
1689                                 if (!ret) {
1690                                         spin_lock_irqsave(&iwdev->cm_core.listen_list_lock, flags);
1691                                         list_add(&child_listen_node->child_listen_list,
1692                                                  &cm_parent_listen_node->child_listen_list);
1693                                         spin_unlock_irqrestore(&iwdev->cm_core.listen_list_lock, flags);
1694                                         cm_parent_listen_node->cm_core->stats_listen_nodes_created++;
1695                                 } else {
1696                                         kfree(child_listen_node);
1697                                 }
1698                         }
1699                 }
1700         }
1701 exit:
1702         rtnl_unlock();
1703         return ret;
1704 }
1705
1706 /**
1707  * i40iw_add_mqh_4 - Adds multiple qhashes for IPv4
1708  * @iwdev: iWarp device
1709  * @cm_info: CM info for parent listen node
1710  * @cm_parent_listen_node: The parent listen node
1711  *
1712  * Adds a qhash and a child listen node for every IPv4 address
1713  * on the adapter and adds the associated qhash filter
1714  */
1715 static enum i40iw_status_code i40iw_add_mqh_4(
1716                                 struct i40iw_device *iwdev,
1717                                 struct i40iw_cm_info *cm_info,
1718                                 struct i40iw_cm_listener *cm_parent_listen_node)
1719 {
1720         struct net_device *dev;
1721         struct in_device *idev;
1722         struct i40iw_cm_listener *child_listen_node;
1723         enum i40iw_status_code ret = 0;
1724         unsigned long flags;
1725
1726         rtnl_lock();
1727         for_each_netdev(&init_net, dev) {
1728                 if ((((rdma_vlan_dev_vlan_id(dev) < I40IW_NO_VLAN) &&
1729                       (rdma_vlan_dev_real_dev(dev) == iwdev->netdev)) ||
1730                     (dev == iwdev->netdev)) && (dev->flags & IFF_UP)) {
1731                         idev = in_dev_get(dev);
1732                         for_ifa(idev) {
1733                                 i40iw_debug(&iwdev->sc_dev,
1734                                             I40IW_DEBUG_CM,
1735                                             "Allocating child CM Listener forIP=%pI4, vlan_id=%d, MAC=%pM\n",
1736                                             &ifa->ifa_address,
1737                                             rdma_vlan_dev_vlan_id(dev),
1738                                             dev->dev_addr);
1739                                 child_listen_node = kzalloc(sizeof(*child_listen_node), GFP_ATOMIC);
1740                                 cm_parent_listen_node->cm_core->stats_listen_nodes_created++;
1741                                 i40iw_debug(&iwdev->sc_dev,
1742                                             I40IW_DEBUG_CM,
1743                                             "Allocating child listener %p\n",
1744                                             child_listen_node);
1745                                 if (!child_listen_node) {
1746                                         i40iw_pr_err("listener memory allocation\n");
1747                                         in_dev_put(idev);
1748                                         ret = I40IW_ERR_NO_MEMORY;
1749                                         goto exit;
1750                                 }
1751                                 cm_info->vlan_id = rdma_vlan_dev_vlan_id(dev);
1752                                 cm_parent_listen_node->vlan_id = cm_info->vlan_id;
1753                                 memcpy(child_listen_node,
1754                                        cm_parent_listen_node,
1755                                        sizeof(*child_listen_node));
1756
1757                                 child_listen_node->loc_addr[0] = ntohl(ifa->ifa_address);
1758                                 memcpy(cm_info->loc_addr, child_listen_node->loc_addr,
1759                                        sizeof(cm_info->loc_addr));
1760
1761                                 ret = i40iw_manage_qhash(iwdev,
1762                                                          cm_info,
1763                                                          I40IW_QHASH_TYPE_TCP_SYN,
1764                                                          I40IW_QHASH_MANAGE_TYPE_ADD,
1765                                                          NULL,
1766                                                          true);
1767                                 if (!ret) {
1768                                         spin_lock_irqsave(&iwdev->cm_core.listen_list_lock, flags);
1769                                         list_add(&child_listen_node->child_listen_list,
1770                                                  &cm_parent_listen_node->child_listen_list);
1771                                         spin_unlock_irqrestore(&iwdev->cm_core.listen_list_lock, flags);
1772                                 } else {
1773                                         kfree(child_listen_node);
1774                                         cm_parent_listen_node->cm_core->stats_listen_nodes_created--;
1775                                 }
1776                         }
1777                         endfor_ifa(idev);
1778                         in_dev_put(idev);
1779                 }
1780         }
1781 exit:
1782         rtnl_unlock();
1783         return ret;
1784 }
1785
1786 /**
1787  * i40iw_dec_refcnt_listen - delete listener and associated cm nodes
1788  * @cm_core: cm's core
1789  * @free_hanging_nodes: to free associated cm_nodes
1790  * @apbvt_del: flag to delete the apbvt
1791  */
1792 static int i40iw_dec_refcnt_listen(struct i40iw_cm_core *cm_core,
1793                                    struct i40iw_cm_listener *listener,
1794                                    int free_hanging_nodes, bool apbvt_del)
1795 {
1796         int ret = -EINVAL;
1797         int err = 0;
1798         struct list_head *list_pos;
1799         struct list_head *list_temp;
1800         struct i40iw_cm_node *cm_node;
1801         struct list_head reset_list;
1802         struct i40iw_cm_info nfo;
1803         struct i40iw_cm_node *loopback;
1804         enum i40iw_cm_node_state old_state;
1805         unsigned long flags;
1806
1807         /* free non-accelerated child nodes for this listener */
1808         INIT_LIST_HEAD(&reset_list);
1809         if (free_hanging_nodes) {
1810                 spin_lock_irqsave(&cm_core->ht_lock, flags);
1811                 list_for_each_safe(list_pos, list_temp, &cm_core->connected_nodes) {
1812                         cm_node = container_of(list_pos, struct i40iw_cm_node, list);
1813                         if ((cm_node->listener == listener) && !cm_node->accelerated) {
1814                                 atomic_inc(&cm_node->ref_count);
1815                                 list_add(&cm_node->reset_entry, &reset_list);
1816                         }
1817                 }
1818                 spin_unlock_irqrestore(&cm_core->ht_lock, flags);
1819         }
1820
1821         list_for_each_safe(list_pos, list_temp, &reset_list) {
1822                 cm_node = container_of(list_pos, struct i40iw_cm_node, reset_entry);
1823                 loopback = cm_node->loopbackpartner;
1824                 if (cm_node->state >= I40IW_CM_STATE_FIN_WAIT1) {
1825                         i40iw_rem_ref_cm_node(cm_node);
1826                 } else {
1827                         if (!loopback) {
1828                                 i40iw_cleanup_retrans_entry(cm_node);
1829                                 err = i40iw_send_reset(cm_node);
1830                                 if (err) {
1831                                         cm_node->state = I40IW_CM_STATE_CLOSED;
1832                                         i40iw_pr_err("send reset\n");
1833                                 } else {
1834                                         old_state = cm_node->state;
1835                                         cm_node->state = I40IW_CM_STATE_LISTENER_DESTROYED;
1836                                         if (old_state != I40IW_CM_STATE_MPAREQ_RCVD)
1837                                                 i40iw_rem_ref_cm_node(cm_node);
1838                                 }
1839                         } else {
1840                                 struct i40iw_cm_event event;
1841
1842                                 event.cm_node = loopback;
1843                                 memcpy(event.cm_info.rem_addr,
1844                                        loopback->rem_addr, sizeof(event.cm_info.rem_addr));
1845                                 memcpy(event.cm_info.loc_addr,
1846                                        loopback->loc_addr, sizeof(event.cm_info.loc_addr));
1847                                 event.cm_info.rem_port = loopback->rem_port;
1848                                 event.cm_info.loc_port = loopback->loc_port;
1849                                 event.cm_info.cm_id = loopback->cm_id;
1850                                 event.cm_info.ipv4 = loopback->ipv4;
1851                                 atomic_inc(&loopback->ref_count);
1852                                 loopback->state = I40IW_CM_STATE_CLOSED;
1853                                 i40iw_event_connect_error(&event);
1854                                 cm_node->state = I40IW_CM_STATE_LISTENER_DESTROYED;
1855                                 i40iw_rem_ref_cm_node(cm_node);
1856                         }
1857                 }
1858         }
1859
1860         if (!atomic_dec_return(&listener->ref_count)) {
1861                 spin_lock_irqsave(&cm_core->listen_list_lock, flags);
1862                 list_del(&listener->list);
1863                 spin_unlock_irqrestore(&cm_core->listen_list_lock, flags);
1864
1865                 if (listener->iwdev) {
1866                         if (apbvt_del && !i40iw_listen_port_in_use(cm_core, listener->loc_port))
1867                                 i40iw_manage_apbvt(listener->iwdev,
1868                                                    listener->loc_port,
1869                                                    I40IW_MANAGE_APBVT_DEL);
1870
1871                         memcpy(nfo.loc_addr, listener->loc_addr, sizeof(nfo.loc_addr));
1872                         nfo.loc_port = listener->loc_port;
1873                         nfo.ipv4 = listener->ipv4;
1874                         nfo.vlan_id = listener->vlan_id;
1875                         nfo.user_pri = listener->user_pri;
1876
1877                         if (!list_empty(&listener->child_listen_list)) {
1878                                 i40iw_del_multiple_qhash(listener->iwdev, &nfo, listener);
1879                         } else {
1880                                 if (listener->qhash_set)
1881                                         i40iw_manage_qhash(listener->iwdev,
1882                                                            &nfo,
1883                                                            I40IW_QHASH_TYPE_TCP_SYN,
1884                                                            I40IW_QHASH_MANAGE_TYPE_DELETE,
1885                                                            NULL,
1886                                                            false);
1887                         }
1888                 }
1889
1890                 cm_core->stats_listen_destroyed++;
1891                 kfree(listener);
1892                 cm_core->stats_listen_nodes_destroyed++;
1893                 listener = NULL;
1894                 ret = 0;
1895         }
1896
1897         if (listener) {
1898                 if (atomic_read(&listener->pend_accepts_cnt) > 0)
1899                         i40iw_debug(cm_core->dev,
1900                                     I40IW_DEBUG_CM,
1901                                     "%s: listener (%p) pending accepts=%u\n",
1902                                     __func__,
1903                                     listener,
1904                                     atomic_read(&listener->pend_accepts_cnt));
1905         }
1906
1907         return ret;
1908 }
1909
1910 /**
1911  * i40iw_cm_del_listen - delete a linstener
1912  * @cm_core: cm's core
1913   * @listener: passive connection's listener
1914  * @apbvt_del: flag to delete apbvt
1915  */
1916 static int i40iw_cm_del_listen(struct i40iw_cm_core *cm_core,
1917                                struct i40iw_cm_listener *listener,
1918                                bool apbvt_del)
1919 {
1920         listener->listener_state = I40IW_CM_LISTENER_PASSIVE_STATE;
1921         listener->cm_id = NULL; /* going to be destroyed pretty soon */
1922         return i40iw_dec_refcnt_listen(cm_core, listener, 1, apbvt_del);
1923 }
1924
1925 /**
1926  * i40iw_addr_resolve_neigh - resolve neighbor address
1927  * @iwdev: iwarp device structure
1928  * @src_ip: local ip address
1929  * @dst_ip: remote ip address
1930  * @arpindex: if there is an arp entry
1931  */
1932 static int i40iw_addr_resolve_neigh(struct i40iw_device *iwdev,
1933                                     u32 src_ip,
1934                                     u32 dst_ip,
1935                                     int arpindex)
1936 {
1937         struct rtable *rt;
1938         struct neighbour *neigh;
1939         int rc = arpindex;
1940         struct net_device *netdev = iwdev->netdev;
1941         __be32 dst_ipaddr = htonl(dst_ip);
1942         __be32 src_ipaddr = htonl(src_ip);
1943
1944         rt = ip_route_output(&init_net, dst_ipaddr, src_ipaddr, 0, 0);
1945         if (IS_ERR(rt)) {
1946                 i40iw_pr_err("ip_route_output\n");
1947                 return rc;
1948         }
1949
1950         if (netif_is_bond_slave(netdev))
1951                 netdev = netdev_master_upper_dev_get(netdev);
1952
1953         neigh = dst_neigh_lookup(&rt->dst, &dst_ipaddr);
1954
1955         rcu_read_lock();
1956         if (neigh) {
1957                 if (neigh->nud_state & NUD_VALID) {
1958                         if (arpindex >= 0) {
1959                                 if (ether_addr_equal(iwdev->arp_table[arpindex].mac_addr,
1960                                                      neigh->ha))
1961                                         /* Mac address same as arp table */
1962                                         goto resolve_neigh_exit;
1963                                 i40iw_manage_arp_cache(iwdev,
1964                                                        iwdev->arp_table[arpindex].mac_addr,
1965                                                        &dst_ip,
1966                                                        true,
1967                                                        I40IW_ARP_DELETE);
1968                         }
1969
1970                         i40iw_manage_arp_cache(iwdev, neigh->ha, &dst_ip, true, I40IW_ARP_ADD);
1971                         rc = i40iw_arp_table(iwdev, &dst_ip, true, NULL, I40IW_ARP_RESOLVE);
1972                 } else {
1973                         neigh_event_send(neigh, NULL);
1974                 }
1975         }
1976  resolve_neigh_exit:
1977
1978         rcu_read_unlock();
1979         if (neigh)
1980                 neigh_release(neigh);
1981
1982         ip_rt_put(rt);
1983         return rc;
1984 }
1985
1986 /**
1987  * i40iw_get_dst_ipv6
1988  */
1989 static struct dst_entry *i40iw_get_dst_ipv6(struct sockaddr_in6 *src_addr,
1990                                             struct sockaddr_in6 *dst_addr)
1991 {
1992         struct dst_entry *dst;
1993         struct flowi6 fl6;
1994
1995         memset(&fl6, 0, sizeof(fl6));
1996         fl6.daddr = dst_addr->sin6_addr;
1997         fl6.saddr = src_addr->sin6_addr;
1998         if (ipv6_addr_type(&fl6.daddr) & IPV6_ADDR_LINKLOCAL)
1999                 fl6.flowi6_oif = dst_addr->sin6_scope_id;
2000
2001         dst = ip6_route_output(&init_net, NULL, &fl6);
2002         return dst;
2003 }
2004
2005 /**
2006  * i40iw_addr_resolve_neigh_ipv6 - resolve neighbor ipv6 address
2007  * @iwdev: iwarp device structure
2008  * @dst_ip: remote ip address
2009  * @arpindex: if there is an arp entry
2010  */
2011 static int i40iw_addr_resolve_neigh_ipv6(struct i40iw_device *iwdev,
2012                                          u32 *src,
2013                                          u32 *dest,
2014                                          int arpindex)
2015 {
2016         struct neighbour *neigh;
2017         int rc = arpindex;
2018         struct net_device *netdev = iwdev->netdev;
2019         struct dst_entry *dst;
2020         struct sockaddr_in6 dst_addr;
2021         struct sockaddr_in6 src_addr;
2022
2023         memset(&dst_addr, 0, sizeof(dst_addr));
2024         dst_addr.sin6_family = AF_INET6;
2025         i40iw_copy_ip_htonl(dst_addr.sin6_addr.in6_u.u6_addr32, dest);
2026         memset(&src_addr, 0, sizeof(src_addr));
2027         src_addr.sin6_family = AF_INET6;
2028         i40iw_copy_ip_htonl(src_addr.sin6_addr.in6_u.u6_addr32, src);
2029         dst = i40iw_get_dst_ipv6(&src_addr, &dst_addr);
2030         if (!dst || dst->error) {
2031                 if (dst) {
2032                         dst_release(dst);
2033                         i40iw_pr_err("ip6_route_output returned dst->error = %d\n",
2034                                      dst->error);
2035                 }
2036                 return rc;
2037         }
2038
2039         if (netif_is_bond_slave(netdev))
2040                 netdev = netdev_master_upper_dev_get(netdev);
2041
2042         neigh = dst_neigh_lookup(dst, &dst_addr);
2043
2044         rcu_read_lock();
2045         if (neigh) {
2046                 i40iw_debug(&iwdev->sc_dev, I40IW_DEBUG_CM, "dst_neigh_lookup MAC=%pM\n", neigh->ha);
2047                 if (neigh->nud_state & NUD_VALID) {
2048                         if (arpindex >= 0) {
2049                                 if (ether_addr_equal
2050                                     (iwdev->arp_table[arpindex].mac_addr,
2051                                      neigh->ha)) {
2052                                         /* Mac address same as in arp table */
2053                                         goto resolve_neigh_exit6;
2054                                 }
2055                                 i40iw_manage_arp_cache(iwdev,
2056                                                        iwdev->arp_table[arpindex].mac_addr,
2057                                                        dest,
2058                                                        false,
2059                                                        I40IW_ARP_DELETE);
2060                         }
2061                         i40iw_manage_arp_cache(iwdev,
2062                                                neigh->ha,
2063                                                dest,
2064                                                false,
2065                                                I40IW_ARP_ADD);
2066                         rc = i40iw_arp_table(iwdev,
2067                                              dest,
2068                                              false,
2069                                              NULL,
2070                                              I40IW_ARP_RESOLVE);
2071                 } else {
2072                         neigh_event_send(neigh, NULL);
2073                 }
2074         }
2075
2076  resolve_neigh_exit6:
2077         rcu_read_unlock();
2078         if (neigh)
2079                 neigh_release(neigh);
2080         dst_release(dst);
2081         return rc;
2082 }
2083
2084 /**
2085  * i40iw_ipv4_is_loopback - check if loopback
2086  * @loc_addr: local addr to compare
2087  * @rem_addr: remote address
2088  */
2089 static bool i40iw_ipv4_is_loopback(u32 loc_addr, u32 rem_addr)
2090 {
2091         return ipv4_is_loopback(htonl(rem_addr)) || (loc_addr == rem_addr);
2092 }
2093
2094 /**
2095  * i40iw_ipv6_is_loopback - check if loopback
2096  * @loc_addr: local addr to compare
2097  * @rem_addr: remote address
2098  */
2099 static bool i40iw_ipv6_is_loopback(u32 *loc_addr, u32 *rem_addr)
2100 {
2101         struct in6_addr raddr6;
2102
2103         i40iw_copy_ip_htonl(raddr6.in6_u.u6_addr32, rem_addr);
2104         return !memcmp(loc_addr, rem_addr, 16) || ipv6_addr_loopback(&raddr6);
2105 }
2106
2107 /**
2108  * i40iw_make_cm_node - create a new instance of a cm node
2109  * @cm_core: cm's core
2110  * @iwdev: iwarp device structure
2111  * @cm_info: quad info for connection
2112  * @listener: passive connection's listener
2113  */
2114 static struct i40iw_cm_node *i40iw_make_cm_node(
2115                                    struct i40iw_cm_core *cm_core,
2116                                    struct i40iw_device *iwdev,
2117                                    struct i40iw_cm_info *cm_info,
2118                                    struct i40iw_cm_listener *listener)
2119 {
2120         struct i40iw_cm_node *cm_node;
2121         struct timespec ts;
2122         int oldarpindex;
2123         int arpindex;
2124         struct net_device *netdev = iwdev->netdev;
2125
2126         /* create an hte and cm_node for this instance */
2127         cm_node = kzalloc(sizeof(*cm_node), GFP_ATOMIC);
2128         if (!cm_node)
2129                 return NULL;
2130
2131         /* set our node specific transport info */
2132         cm_node->ipv4 = cm_info->ipv4;
2133         cm_node->vlan_id = cm_info->vlan_id;
2134         if ((cm_node->vlan_id == I40IW_NO_VLAN) && iwdev->dcb)
2135                 cm_node->vlan_id = 0;
2136         cm_node->user_pri = cm_info->user_pri;
2137         if (listener)
2138                 cm_node->user_pri = listener->user_pri;
2139         memcpy(cm_node->loc_addr, cm_info->loc_addr, sizeof(cm_node->loc_addr));
2140         memcpy(cm_node->rem_addr, cm_info->rem_addr, sizeof(cm_node->rem_addr));
2141         cm_node->loc_port = cm_info->loc_port;
2142         cm_node->rem_port = cm_info->rem_port;
2143
2144         cm_node->mpa_frame_rev = iwdev->mpa_version;
2145         cm_node->send_rdma0_op = SEND_RDMA_READ_ZERO;
2146         cm_node->ird_size = I40IW_MAX_IRD_SIZE;
2147         cm_node->ord_size = I40IW_MAX_ORD_SIZE;
2148
2149         cm_node->listener = listener;
2150         cm_node->cm_id = cm_info->cm_id;
2151         ether_addr_copy(cm_node->loc_mac, netdev->dev_addr);
2152         spin_lock_init(&cm_node->retrans_list_lock);
2153
2154         atomic_set(&cm_node->ref_count, 1);
2155         /* associate our parent CM core */
2156         cm_node->cm_core = cm_core;
2157         cm_node->tcp_cntxt.loc_id = I40IW_CM_DEF_LOCAL_ID;
2158         cm_node->tcp_cntxt.rcv_wscale = I40IW_CM_DEFAULT_RCV_WND_SCALE;
2159         cm_node->tcp_cntxt.rcv_wnd =
2160                         I40IW_CM_DEFAULT_RCV_WND_SCALED >> I40IW_CM_DEFAULT_RCV_WND_SCALE;
2161         ts = current_kernel_time();
2162         cm_node->tcp_cntxt.loc_seq_num = ts.tv_nsec;
2163         cm_node->tcp_cntxt.mss = iwdev->mss;
2164
2165         cm_node->iwdev = iwdev;
2166         cm_node->dev = &iwdev->sc_dev;
2167
2168         if ((cm_node->ipv4 &&
2169              i40iw_ipv4_is_loopback(cm_node->loc_addr[0], cm_node->rem_addr[0])) ||
2170              (!cm_node->ipv4 && i40iw_ipv6_is_loopback(cm_node->loc_addr,
2171                                                        cm_node->rem_addr))) {
2172                 arpindex = i40iw_arp_table(iwdev,
2173                                            cm_node->rem_addr,
2174                                            false,
2175                                            NULL,
2176                                            I40IW_ARP_RESOLVE);
2177         } else {
2178                 oldarpindex = i40iw_arp_table(iwdev,
2179                                               cm_node->rem_addr,
2180                                               false,
2181                                               NULL,
2182                                               I40IW_ARP_RESOLVE);
2183                 if (cm_node->ipv4)
2184                         arpindex = i40iw_addr_resolve_neigh(iwdev,
2185                                                             cm_info->loc_addr[0],
2186                                                             cm_info->rem_addr[0],
2187                                                             oldarpindex);
2188                 else if (IS_ENABLED(CONFIG_IPV6))
2189                         arpindex = i40iw_addr_resolve_neigh_ipv6(iwdev,
2190                                                                  cm_info->loc_addr,
2191                                                                  cm_info->rem_addr,
2192                                                                  oldarpindex);
2193                 else
2194                         arpindex = -EINVAL;
2195         }
2196         if (arpindex < 0) {
2197                 i40iw_pr_err("cm_node arpindex\n");
2198                 kfree(cm_node);
2199                 return NULL;
2200         }
2201         ether_addr_copy(cm_node->rem_mac, iwdev->arp_table[arpindex].mac_addr);
2202         i40iw_add_hte_node(cm_core, cm_node);
2203         cm_core->stats_nodes_created++;
2204         return cm_node;
2205 }
2206
2207 /**
2208  * i40iw_rem_ref_cm_node - destroy an instance of a cm node
2209  * @cm_node: connection's node
2210  */
2211 static void i40iw_rem_ref_cm_node(struct i40iw_cm_node *cm_node)
2212 {
2213         struct i40iw_cm_core *cm_core = cm_node->cm_core;
2214         struct i40iw_qp *iwqp;
2215         struct i40iw_cm_info nfo;
2216         unsigned long flags;
2217
2218         spin_lock_irqsave(&cm_node->cm_core->ht_lock, flags);
2219         if (atomic_dec_return(&cm_node->ref_count)) {
2220                 spin_unlock_irqrestore(&cm_node->cm_core->ht_lock, flags);
2221                 return;
2222         }
2223         list_del(&cm_node->list);
2224         spin_unlock_irqrestore(&cm_node->cm_core->ht_lock, flags);
2225
2226         /* if the node is destroyed before connection was accelerated */
2227         if (!cm_node->accelerated && cm_node->accept_pend) {
2228                 pr_err("node destroyed before established\n");
2229                 atomic_dec(&cm_node->listener->pend_accepts_cnt);
2230         }
2231         if (cm_node->close_entry)
2232                 i40iw_handle_close_entry(cm_node, 0);
2233         if (cm_node->listener) {
2234                 i40iw_dec_refcnt_listen(cm_core, cm_node->listener, 0, true);
2235         } else {
2236                 if (!i40iw_listen_port_in_use(cm_core, cm_node->loc_port) &&
2237                     cm_node->apbvt_set) {
2238                         i40iw_manage_apbvt(cm_node->iwdev,
2239                                            cm_node->loc_port,
2240                                            I40IW_MANAGE_APBVT_DEL);
2241                         i40iw_get_addr_info(cm_node, &nfo);
2242                         if (cm_node->qhash_set) {
2243                                 i40iw_manage_qhash(cm_node->iwdev,
2244                                                    &nfo,
2245                                                    I40IW_QHASH_TYPE_TCP_ESTABLISHED,
2246                                                    I40IW_QHASH_MANAGE_TYPE_DELETE,
2247                                                    NULL,
2248                                                    false);
2249                                 cm_node->qhash_set = 0;
2250                         }
2251                 }
2252         }
2253
2254         iwqp = cm_node->iwqp;
2255         if (iwqp) {
2256                 iwqp->cm_node = NULL;
2257                 i40iw_rem_ref(&iwqp->ibqp);
2258                 cm_node->iwqp = NULL;
2259         } else if (cm_node->qhash_set) {
2260                 i40iw_get_addr_info(cm_node, &nfo);
2261                 i40iw_manage_qhash(cm_node->iwdev,
2262                                    &nfo,
2263                                    I40IW_QHASH_TYPE_TCP_ESTABLISHED,
2264                                    I40IW_QHASH_MANAGE_TYPE_DELETE,
2265                                    NULL,
2266                                    false);
2267                 cm_node->qhash_set = 0;
2268         }
2269
2270         cm_node->cm_core->stats_nodes_destroyed++;
2271         kfree(cm_node);
2272 }
2273
2274 /**
2275  * i40iw_handle_fin_pkt - FIN packet received
2276  * @cm_node: connection's node
2277  */
2278 static void i40iw_handle_fin_pkt(struct i40iw_cm_node *cm_node)
2279 {
2280         u32 ret;
2281
2282         switch (cm_node->state) {
2283         case I40IW_CM_STATE_SYN_RCVD:
2284         case I40IW_CM_STATE_SYN_SENT:
2285         case I40IW_CM_STATE_ESTABLISHED:
2286         case I40IW_CM_STATE_MPAREJ_RCVD:
2287                 cm_node->tcp_cntxt.rcv_nxt++;
2288                 i40iw_cleanup_retrans_entry(cm_node);
2289                 cm_node->state = I40IW_CM_STATE_LAST_ACK;
2290                 i40iw_send_fin(cm_node);
2291                 break;
2292         case I40IW_CM_STATE_MPAREQ_SENT:
2293                 i40iw_create_event(cm_node, I40IW_CM_EVENT_ABORTED);
2294                 cm_node->tcp_cntxt.rcv_nxt++;
2295                 i40iw_cleanup_retrans_entry(cm_node);
2296                 cm_node->state = I40IW_CM_STATE_CLOSED;
2297                 atomic_inc(&cm_node->ref_count);
2298                 i40iw_send_reset(cm_node);
2299                 break;
2300         case I40IW_CM_STATE_FIN_WAIT1:
2301                 cm_node->tcp_cntxt.rcv_nxt++;
2302                 i40iw_cleanup_retrans_entry(cm_node);
2303                 cm_node->state = I40IW_CM_STATE_CLOSING;
2304                 i40iw_send_ack(cm_node);
2305                 /*
2306                  * Wait for ACK as this is simultaneous close.
2307                  * After we receive ACK, do not send anything.
2308                  * Just rm the node.
2309                  */
2310                 break;
2311         case I40IW_CM_STATE_FIN_WAIT2:
2312                 cm_node->tcp_cntxt.rcv_nxt++;
2313                 i40iw_cleanup_retrans_entry(cm_node);
2314                 cm_node->state = I40IW_CM_STATE_TIME_WAIT;
2315                 i40iw_send_ack(cm_node);
2316                 ret =
2317                     i40iw_schedule_cm_timer(cm_node, NULL, I40IW_TIMER_TYPE_CLOSE, 1, 0);
2318                 if (ret)
2319                         i40iw_pr_err("node %p state = %d\n", cm_node, cm_node->state);
2320                 break;
2321         case I40IW_CM_STATE_TIME_WAIT:
2322                 cm_node->tcp_cntxt.rcv_nxt++;
2323                 i40iw_cleanup_retrans_entry(cm_node);
2324                 cm_node->state = I40IW_CM_STATE_CLOSED;
2325                 i40iw_rem_ref_cm_node(cm_node);
2326                 break;
2327         case I40IW_CM_STATE_OFFLOADED:
2328         default:
2329                 i40iw_pr_err("bad state node %p state = %d\n", cm_node, cm_node->state);
2330                 break;
2331         }
2332 }
2333
2334 /**
2335  * i40iw_handle_rst_pkt - process received RST packet
2336  * @cm_node: connection's node
2337  * @rbuf: receive buffer
2338  */
2339 static void i40iw_handle_rst_pkt(struct i40iw_cm_node *cm_node,
2340                                  struct i40iw_puda_buf *rbuf)
2341 {
2342         i40iw_cleanup_retrans_entry(cm_node);
2343         switch (cm_node->state) {
2344         case I40IW_CM_STATE_SYN_SENT:
2345         case I40IW_CM_STATE_MPAREQ_SENT:
2346                 switch (cm_node->mpa_frame_rev) {
2347                 case IETF_MPA_V2:
2348                         cm_node->mpa_frame_rev = IETF_MPA_V1;
2349                         /* send a syn and goto syn sent state */
2350                         cm_node->state = I40IW_CM_STATE_SYN_SENT;
2351                         if (i40iw_send_syn(cm_node, 0))
2352                                 i40iw_active_open_err(cm_node, false);
2353                         break;
2354                 case IETF_MPA_V1:
2355                 default:
2356                         i40iw_active_open_err(cm_node, false);
2357                         break;
2358                 }
2359                 break;
2360         case I40IW_CM_STATE_MPAREQ_RCVD:
2361                 atomic_add_return(1, &cm_node->passive_state);
2362                 break;
2363         case I40IW_CM_STATE_ESTABLISHED:
2364         case I40IW_CM_STATE_SYN_RCVD:
2365         case I40IW_CM_STATE_LISTENING:
2366                 i40iw_pr_err("Bad state state = %d\n", cm_node->state);
2367                 i40iw_passive_open_err(cm_node, false);
2368                 break;
2369         case I40IW_CM_STATE_OFFLOADED:
2370                 i40iw_active_open_err(cm_node, false);
2371                 break;
2372         case I40IW_CM_STATE_CLOSED:
2373                 break;
2374         case I40IW_CM_STATE_FIN_WAIT2:
2375         case I40IW_CM_STATE_FIN_WAIT1:
2376         case I40IW_CM_STATE_LAST_ACK:
2377                 cm_node->cm_id->rem_ref(cm_node->cm_id);
2378         case I40IW_CM_STATE_TIME_WAIT:
2379                 cm_node->state = I40IW_CM_STATE_CLOSED;
2380                 i40iw_rem_ref_cm_node(cm_node);
2381                 break;
2382         default:
2383                 break;
2384         }
2385 }
2386
2387 /**
2388  * i40iw_handle_rcv_mpa - Process a recv'd mpa buffer
2389  * @cm_node: connection's node
2390  * @rbuf: receive buffer
2391  */
2392 static void i40iw_handle_rcv_mpa(struct i40iw_cm_node *cm_node,
2393                                  struct i40iw_puda_buf *rbuf)
2394 {
2395         int ret;
2396         int datasize = rbuf->datalen;
2397         u8 *dataloc = rbuf->data;
2398
2399         enum i40iw_cm_event_type type = I40IW_CM_EVENT_UNKNOWN;
2400         u32 res_type;
2401
2402         ret = i40iw_parse_mpa(cm_node, dataloc, &res_type, datasize);
2403         if (ret) {
2404                 if (cm_node->state == I40IW_CM_STATE_MPAREQ_SENT)
2405                         i40iw_active_open_err(cm_node, true);
2406                 else
2407                         i40iw_passive_open_err(cm_node, true);
2408                 return;
2409         }
2410
2411         switch (cm_node->state) {
2412         case I40IW_CM_STATE_ESTABLISHED:
2413                 if (res_type == I40IW_MPA_REQUEST_REJECT)
2414                         i40iw_pr_err("state for reject\n");
2415                 cm_node->state = I40IW_CM_STATE_MPAREQ_RCVD;
2416                 type = I40IW_CM_EVENT_MPA_REQ;
2417                 i40iw_send_ack(cm_node);        /* ACK received MPA request */
2418                 atomic_set(&cm_node->passive_state,
2419                            I40IW_PASSIVE_STATE_INDICATED);
2420                 break;
2421         case I40IW_CM_STATE_MPAREQ_SENT:
2422                 i40iw_cleanup_retrans_entry(cm_node);
2423                 if (res_type == I40IW_MPA_REQUEST_REJECT) {
2424                         type = I40IW_CM_EVENT_MPA_REJECT;
2425                         cm_node->state = I40IW_CM_STATE_MPAREJ_RCVD;
2426                 } else {
2427                         type = I40IW_CM_EVENT_CONNECTED;
2428                         cm_node->state = I40IW_CM_STATE_OFFLOADED;
2429                         i40iw_send_ack(cm_node);
2430                 }
2431                 break;
2432         default:
2433                 pr_err("%s wrong cm_node state =%d\n", __func__, cm_node->state);
2434                 break;
2435         }
2436         i40iw_create_event(cm_node, type);
2437 }
2438
2439 /**
2440  * i40iw_indicate_pkt_err - Send up err event to cm
2441  * @cm_node: connection's node
2442  */
2443 static void i40iw_indicate_pkt_err(struct i40iw_cm_node *cm_node)
2444 {
2445         switch (cm_node->state) {
2446         case I40IW_CM_STATE_SYN_SENT:
2447         case I40IW_CM_STATE_MPAREQ_SENT:
2448                 i40iw_active_open_err(cm_node, true);
2449                 break;
2450         case I40IW_CM_STATE_ESTABLISHED:
2451         case I40IW_CM_STATE_SYN_RCVD:
2452                 i40iw_passive_open_err(cm_node, true);
2453                 break;
2454         case I40IW_CM_STATE_OFFLOADED:
2455         default:
2456                 break;
2457         }
2458 }
2459
2460 /**
2461  * i40iw_check_syn - Check for error on received syn ack
2462  * @cm_node: connection's node
2463  * @tcph: pointer tcp header
2464  */
2465 static int i40iw_check_syn(struct i40iw_cm_node *cm_node, struct tcphdr *tcph)
2466 {
2467         int err = 0;
2468
2469         if (ntohl(tcph->ack_seq) != cm_node->tcp_cntxt.loc_seq_num) {
2470                 err = 1;
2471                 i40iw_active_open_err(cm_node, true);
2472         }
2473         return err;
2474 }
2475
2476 /**
2477  * i40iw_check_seq - check seq numbers if OK
2478  * @cm_node: connection's node
2479  * @tcph: pointer tcp header
2480  */
2481 static int i40iw_check_seq(struct i40iw_cm_node *cm_node, struct tcphdr *tcph)
2482 {
2483         int err = 0;
2484         u32 seq;
2485         u32 ack_seq;
2486         u32 loc_seq_num = cm_node->tcp_cntxt.loc_seq_num;
2487         u32 rcv_nxt = cm_node->tcp_cntxt.rcv_nxt;
2488         u32 rcv_wnd;
2489
2490         seq = ntohl(tcph->seq);
2491         ack_seq = ntohl(tcph->ack_seq);
2492         rcv_wnd = cm_node->tcp_cntxt.rcv_wnd;
2493         if (ack_seq != loc_seq_num)
2494                 err = -1;
2495         else if (!between(seq, rcv_nxt, (rcv_nxt + rcv_wnd)))
2496                 err = -1;
2497         if (err) {
2498                 i40iw_pr_err("seq number\n");
2499                 i40iw_indicate_pkt_err(cm_node);
2500         }
2501         return err;
2502 }
2503
2504 /**
2505  * i40iw_handle_syn_pkt - is for Passive node
2506  * @cm_node: connection's node
2507  * @rbuf: receive buffer
2508  */
2509 static void i40iw_handle_syn_pkt(struct i40iw_cm_node *cm_node,
2510                                  struct i40iw_puda_buf *rbuf)
2511 {
2512         struct tcphdr *tcph = (struct tcphdr *)rbuf->tcph;
2513         int ret;
2514         u32 inc_sequence;
2515         int optionsize;
2516         struct i40iw_cm_info nfo;
2517
2518         optionsize = (tcph->doff << 2) - sizeof(struct tcphdr);
2519         inc_sequence = ntohl(tcph->seq);
2520
2521         switch (cm_node->state) {
2522         case I40IW_CM_STATE_SYN_SENT:
2523         case I40IW_CM_STATE_MPAREQ_SENT:
2524                 /* Rcvd syn on active open connection */
2525                 i40iw_active_open_err(cm_node, 1);
2526                 break;
2527         case I40IW_CM_STATE_LISTENING:
2528                 /* Passive OPEN */
2529                 if (atomic_read(&cm_node->listener->pend_accepts_cnt) >
2530                     cm_node->listener->backlog) {
2531                         cm_node->cm_core->stats_backlog_drops++;
2532                         i40iw_passive_open_err(cm_node, false);
2533                         break;
2534                 }
2535                 ret = i40iw_handle_tcp_options(cm_node, tcph, optionsize, 1);
2536                 if (ret) {
2537                         i40iw_passive_open_err(cm_node, false);
2538                         /* drop pkt */
2539                         break;
2540                 }
2541                 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + 1;
2542                 cm_node->accept_pend = 1;
2543                 atomic_inc(&cm_node->listener->pend_accepts_cnt);
2544
2545                 cm_node->state = I40IW_CM_STATE_SYN_RCVD;
2546                 i40iw_get_addr_info(cm_node, &nfo);
2547                 ret = i40iw_manage_qhash(cm_node->iwdev,
2548                                          &nfo,
2549                                          I40IW_QHASH_TYPE_TCP_ESTABLISHED,
2550                                          I40IW_QHASH_MANAGE_TYPE_ADD,
2551                                          (void *)cm_node,
2552                                          false);
2553                 cm_node->qhash_set = true;
2554                 break;
2555         case I40IW_CM_STATE_CLOSED:
2556                 i40iw_cleanup_retrans_entry(cm_node);
2557                 atomic_inc(&cm_node->ref_count);
2558                 i40iw_send_reset(cm_node);
2559                 break;
2560         case I40IW_CM_STATE_OFFLOADED:
2561         case I40IW_CM_STATE_ESTABLISHED:
2562         case I40IW_CM_STATE_FIN_WAIT1:
2563         case I40IW_CM_STATE_FIN_WAIT2:
2564         case I40IW_CM_STATE_MPAREQ_RCVD:
2565         case I40IW_CM_STATE_LAST_ACK:
2566         case I40IW_CM_STATE_CLOSING:
2567         case I40IW_CM_STATE_UNKNOWN:
2568         default:
2569                 break;
2570         }
2571 }
2572
2573 /**
2574  * i40iw_handle_synack_pkt - Process SYN+ACK packet (active side)
2575  * @cm_node: connection's node
2576  * @rbuf: receive buffer
2577  */
2578 static void i40iw_handle_synack_pkt(struct i40iw_cm_node *cm_node,
2579                                     struct i40iw_puda_buf *rbuf)
2580 {
2581         struct tcphdr *tcph = (struct tcphdr *)rbuf->tcph;
2582         int ret;
2583         u32 inc_sequence;
2584         int optionsize;
2585
2586         optionsize = (tcph->doff << 2) - sizeof(struct tcphdr);
2587         inc_sequence = ntohl(tcph->seq);
2588         switch (cm_node->state) {
2589         case I40IW_CM_STATE_SYN_SENT:
2590                 i40iw_cleanup_retrans_entry(cm_node);
2591                 /* active open */
2592                 if (i40iw_check_syn(cm_node, tcph)) {
2593                         i40iw_pr_err("check syn fail\n");
2594                         return;
2595                 }
2596                 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq);
2597                 /* setup options */
2598                 ret = i40iw_handle_tcp_options(cm_node, tcph, optionsize, 0);
2599                 if (ret) {
2600                         i40iw_debug(cm_node->dev,
2601                                     I40IW_DEBUG_CM,
2602                                     "cm_node=%p tcp_options failed\n",
2603                                     cm_node);
2604                         break;
2605                 }
2606                 i40iw_cleanup_retrans_entry(cm_node);
2607                 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + 1;
2608                 i40iw_send_ack(cm_node);        /* ACK  for the syn_ack */
2609                 ret = i40iw_send_mpa_request(cm_node);
2610                 if (ret) {
2611                         i40iw_debug(cm_node->dev,
2612                                     I40IW_DEBUG_CM,
2613                                     "cm_node=%p i40iw_send_mpa_request failed\n",
2614                                     cm_node);
2615                         break;
2616                 }
2617                 cm_node->state = I40IW_CM_STATE_MPAREQ_SENT;
2618                 break;
2619         case I40IW_CM_STATE_MPAREQ_RCVD:
2620                 i40iw_passive_open_err(cm_node, true);
2621                 break;
2622         case I40IW_CM_STATE_LISTENING:
2623                 cm_node->tcp_cntxt.loc_seq_num = ntohl(tcph->ack_seq);
2624                 i40iw_cleanup_retrans_entry(cm_node);
2625                 cm_node->state = I40IW_CM_STATE_CLOSED;
2626                 i40iw_send_reset(cm_node);
2627                 break;
2628         case I40IW_CM_STATE_CLOSED:
2629                 cm_node->tcp_cntxt.loc_seq_num = ntohl(tcph->ack_seq);
2630                 i40iw_cleanup_retrans_entry(cm_node);
2631                 atomic_inc(&cm_node->ref_count);
2632                 i40iw_send_reset(cm_node);
2633                 break;
2634         case I40IW_CM_STATE_ESTABLISHED:
2635         case I40IW_CM_STATE_FIN_WAIT1:
2636         case I40IW_CM_STATE_FIN_WAIT2:
2637         case I40IW_CM_STATE_LAST_ACK:
2638         case I40IW_CM_STATE_OFFLOADED:
2639         case I40IW_CM_STATE_CLOSING:
2640         case I40IW_CM_STATE_UNKNOWN:
2641         case I40IW_CM_STATE_MPAREQ_SENT:
2642         default:
2643                 break;
2644         }
2645 }
2646
2647 /**
2648  * i40iw_handle_ack_pkt - process packet with ACK
2649  * @cm_node: connection's node
2650  * @rbuf: receive buffer
2651  */
2652 static int i40iw_handle_ack_pkt(struct i40iw_cm_node *cm_node,
2653                                 struct i40iw_puda_buf *rbuf)
2654 {
2655         struct tcphdr *tcph = (struct tcphdr *)rbuf->tcph;
2656         u32 inc_sequence;
2657         int ret = 0;
2658         int optionsize;
2659         u32 datasize = rbuf->datalen;
2660
2661         optionsize = (tcph->doff << 2) - sizeof(struct tcphdr);
2662
2663         if (i40iw_check_seq(cm_node, tcph))
2664                 return -EINVAL;
2665
2666         inc_sequence = ntohl(tcph->seq);
2667         switch (cm_node->state) {
2668         case I40IW_CM_STATE_SYN_RCVD:
2669                 i40iw_cleanup_retrans_entry(cm_node);
2670                 ret = i40iw_handle_tcp_options(cm_node, tcph, optionsize, 1);
2671                 if (ret)
2672                         break;
2673                 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq);
2674                 cm_node->state = I40IW_CM_STATE_ESTABLISHED;
2675                 if (datasize) {
2676                         cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize;
2677                         i40iw_handle_rcv_mpa(cm_node, rbuf);
2678                 }
2679                 break;
2680         case I40IW_CM_STATE_ESTABLISHED:
2681                 i40iw_cleanup_retrans_entry(cm_node);
2682                 if (datasize) {
2683                         cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize;
2684                         i40iw_handle_rcv_mpa(cm_node, rbuf);
2685                 }
2686                 break;
2687         case I40IW_CM_STATE_MPAREQ_SENT:
2688                 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq);
2689                 if (datasize) {
2690                         cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize;
2691                         i40iw_handle_rcv_mpa(cm_node, rbuf);
2692                 }
2693                 break;
2694         case I40IW_CM_STATE_LISTENING:
2695                 i40iw_cleanup_retrans_entry(cm_node);
2696                 cm_node->state = I40IW_CM_STATE_CLOSED;
2697                 i40iw_send_reset(cm_node);
2698                 break;
2699         case I40IW_CM_STATE_CLOSED:
2700                 i40iw_cleanup_retrans_entry(cm_node);
2701                 atomic_inc(&cm_node->ref_count);
2702                 i40iw_send_reset(cm_node);
2703                 break;
2704         case I40IW_CM_STATE_LAST_ACK:
2705         case I40IW_CM_STATE_CLOSING:
2706                 i40iw_cleanup_retrans_entry(cm_node);
2707                 cm_node->state = I40IW_CM_STATE_CLOSED;
2708                 if (!cm_node->accept_pend)
2709                         cm_node->cm_id->rem_ref(cm_node->cm_id);
2710                 i40iw_rem_ref_cm_node(cm_node);
2711                 break;
2712         case I40IW_CM_STATE_FIN_WAIT1:
2713                 i40iw_cleanup_retrans_entry(cm_node);
2714                 cm_node->state = I40IW_CM_STATE_FIN_WAIT2;
2715                 break;
2716         case I40IW_CM_STATE_SYN_SENT:
2717         case I40IW_CM_STATE_FIN_WAIT2:
2718         case I40IW_CM_STATE_OFFLOADED:
2719         case I40IW_CM_STATE_MPAREQ_RCVD:
2720         case I40IW_CM_STATE_UNKNOWN:
2721         default:
2722                 i40iw_cleanup_retrans_entry(cm_node);
2723                 break;
2724         }
2725         return ret;
2726 }
2727
2728 /**
2729  * i40iw_process_packet - process cm packet
2730  * @cm_node: connection's node
2731  * @rbuf: receive buffer
2732  */
2733 static void i40iw_process_packet(struct i40iw_cm_node *cm_node,
2734                                  struct i40iw_puda_buf *rbuf)
2735 {
2736         enum i40iw_tcpip_pkt_type pkt_type = I40IW_PKT_TYPE_UNKNOWN;
2737         struct tcphdr *tcph = (struct tcphdr *)rbuf->tcph;
2738         u32 fin_set = 0;
2739         int ret;
2740
2741         if (tcph->rst) {
2742                 pkt_type = I40IW_PKT_TYPE_RST;
2743         } else if (tcph->syn) {
2744                 pkt_type = I40IW_PKT_TYPE_SYN;
2745                 if (tcph->ack)
2746                         pkt_type = I40IW_PKT_TYPE_SYNACK;
2747         } else if (tcph->ack) {
2748                 pkt_type = I40IW_PKT_TYPE_ACK;
2749         }
2750         if (tcph->fin)
2751                 fin_set = 1;
2752
2753         switch (pkt_type) {
2754         case I40IW_PKT_TYPE_SYN:
2755                 i40iw_handle_syn_pkt(cm_node, rbuf);
2756                 break;
2757         case I40IW_PKT_TYPE_SYNACK:
2758                 i40iw_handle_synack_pkt(cm_node, rbuf);
2759                 break;
2760         case I40IW_PKT_TYPE_ACK:
2761                 ret = i40iw_handle_ack_pkt(cm_node, rbuf);
2762                 if (fin_set && !ret)
2763                         i40iw_handle_fin_pkt(cm_node);
2764                 break;
2765         case I40IW_PKT_TYPE_RST:
2766                 i40iw_handle_rst_pkt(cm_node, rbuf);
2767                 break;
2768         default:
2769                 if (fin_set &&
2770                     (!i40iw_check_seq(cm_node, (struct tcphdr *)rbuf->tcph)))
2771                         i40iw_handle_fin_pkt(cm_node);
2772                 break;
2773         }
2774 }
2775
2776 /**
2777  * i40iw_make_listen_node - create a listen node with params
2778  * @cm_core: cm's core
2779  * @iwdev: iwarp device structure
2780  * @cm_info: quad info for connection
2781  */
2782 static struct i40iw_cm_listener *i40iw_make_listen_node(
2783                                         struct i40iw_cm_core *cm_core,
2784                                         struct i40iw_device *iwdev,
2785                                         struct i40iw_cm_info *cm_info)
2786 {
2787         struct i40iw_cm_listener *listener;
2788         unsigned long flags;
2789
2790         /* cannot have multiple matching listeners */
2791         listener = i40iw_find_listener(cm_core, cm_info->loc_addr,
2792                                        cm_info->loc_port,
2793                                        cm_info->vlan_id,
2794                                        I40IW_CM_LISTENER_EITHER_STATE);
2795         if (listener &&
2796             (listener->listener_state == I40IW_CM_LISTENER_ACTIVE_STATE)) {
2797                 atomic_dec(&listener->ref_count);
2798                 i40iw_debug(cm_core->dev,
2799                             I40IW_DEBUG_CM,
2800                             "Not creating listener since it already exists\n");
2801                 return NULL;
2802         }
2803
2804         if (!listener) {
2805                 /* create a CM listen node (1/2 node to compare incoming traffic to) */
2806                 listener = kzalloc(sizeof(*listener), GFP_ATOMIC);
2807                 if (!listener)
2808                         return NULL;
2809                 cm_core->stats_listen_nodes_created++;
2810                 memcpy(listener->loc_addr, cm_info->loc_addr, sizeof(listener->loc_addr));
2811                 listener->loc_port = cm_info->loc_port;
2812
2813                 INIT_LIST_HEAD(&listener->child_listen_list);
2814
2815                 atomic_set(&listener->ref_count, 1);
2816         } else {
2817                 listener->reused_node = 1;
2818         }
2819
2820         listener->cm_id = cm_info->cm_id;
2821         listener->ipv4 = cm_info->ipv4;
2822         listener->vlan_id = cm_info->vlan_id;
2823         atomic_set(&listener->pend_accepts_cnt, 0);
2824         listener->cm_core = cm_core;
2825         listener->iwdev = iwdev;
2826
2827         listener->backlog = cm_info->backlog;
2828         listener->listener_state = I40IW_CM_LISTENER_ACTIVE_STATE;
2829
2830         if (!listener->reused_node) {
2831                 spin_lock_irqsave(&cm_core->listen_list_lock, flags);
2832                 list_add(&listener->list, &cm_core->listen_nodes);
2833                 spin_unlock_irqrestore(&cm_core->listen_list_lock, flags);
2834         }
2835
2836         return listener;
2837 }
2838
2839 /**
2840  * i40iw_create_cm_node - make a connection node with params
2841  * @cm_core: cm's core
2842  * @iwdev: iwarp device structure
2843  * @private_data_len: len to provate data for mpa request
2844  * @private_data: pointer to private data for connection
2845  * @cm_info: quad info for connection
2846  */
2847 static struct i40iw_cm_node *i40iw_create_cm_node(
2848                                         struct i40iw_cm_core *cm_core,
2849                                         struct i40iw_device *iwdev,
2850                                         u16 private_data_len,
2851                                         void *private_data,
2852                                         struct i40iw_cm_info *cm_info)
2853 {
2854         struct i40iw_cm_node *cm_node;
2855         struct i40iw_cm_listener *loopback_remotelistener;
2856         struct i40iw_cm_node *loopback_remotenode;
2857         struct i40iw_cm_info loopback_cm_info;
2858
2859         /* create a CM connection node */
2860         cm_node = i40iw_make_cm_node(cm_core, iwdev, cm_info, NULL);
2861         if (!cm_node)
2862                 return NULL;
2863         /* set our node side to client (active) side */
2864         cm_node->tcp_cntxt.client = 1;
2865         cm_node->tcp_cntxt.rcv_wscale = I40IW_CM_DEFAULT_RCV_WND_SCALE;
2866
2867         if (!memcmp(cm_info->loc_addr, cm_info->rem_addr, sizeof(cm_info->loc_addr))) {
2868                 loopback_remotelistener = i40iw_find_listener(
2869                                                 cm_core,
2870                                                 cm_info->rem_addr,
2871                                                 cm_node->rem_port,
2872                                                 cm_node->vlan_id,
2873                                                 I40IW_CM_LISTENER_ACTIVE_STATE);
2874                 if (!loopback_remotelistener) {
2875                         i40iw_create_event(cm_node, I40IW_CM_EVENT_ABORTED);
2876                 } else {
2877                         loopback_cm_info = *cm_info;
2878                         loopback_cm_info.loc_port = cm_info->rem_port;
2879                         loopback_cm_info.rem_port = cm_info->loc_port;
2880                         loopback_cm_info.cm_id = loopback_remotelistener->cm_id;
2881                         loopback_cm_info.ipv4 = cm_info->ipv4;
2882                         loopback_remotenode = i40iw_make_cm_node(cm_core,
2883                                                                  iwdev,
2884                                                                  &loopback_cm_info,
2885                                                                  loopback_remotelistener);
2886                         if (!loopback_remotenode) {
2887                                 i40iw_rem_ref_cm_node(cm_node);
2888                                 return NULL;
2889                         }
2890                         cm_core->stats_loopbacks++;
2891                         loopback_remotenode->loopbackpartner = cm_node;
2892                         loopback_remotenode->tcp_cntxt.rcv_wscale =
2893                                 I40IW_CM_DEFAULT_RCV_WND_SCALE;
2894                         cm_node->loopbackpartner = loopback_remotenode;
2895                         memcpy(loopback_remotenode->pdata_buf, private_data,
2896                                private_data_len);
2897                         loopback_remotenode->pdata.size = private_data_len;
2898
2899                         cm_node->state = I40IW_CM_STATE_OFFLOADED;
2900                         cm_node->tcp_cntxt.rcv_nxt =
2901                                 loopback_remotenode->tcp_cntxt.loc_seq_num;
2902                         loopback_remotenode->tcp_cntxt.rcv_nxt =
2903                                 cm_node->tcp_cntxt.loc_seq_num;
2904                         cm_node->tcp_cntxt.max_snd_wnd =
2905                                 loopback_remotenode->tcp_cntxt.rcv_wnd;
2906                         loopback_remotenode->tcp_cntxt.max_snd_wnd = cm_node->tcp_cntxt.rcv_wnd;
2907                         cm_node->tcp_cntxt.snd_wnd = loopback_remotenode->tcp_cntxt.rcv_wnd;
2908                         loopback_remotenode->tcp_cntxt.snd_wnd = cm_node->tcp_cntxt.rcv_wnd;
2909                         cm_node->tcp_cntxt.snd_wscale = loopback_remotenode->tcp_cntxt.rcv_wscale;
2910                         loopback_remotenode->tcp_cntxt.snd_wscale = cm_node->tcp_cntxt.rcv_wscale;
2911                         loopback_remotenode->state = I40IW_CM_STATE_MPAREQ_RCVD;
2912                         i40iw_create_event(loopback_remotenode, I40IW_CM_EVENT_MPA_REQ);
2913                 }
2914                 return cm_node;
2915         }
2916
2917         cm_node->pdata.size = private_data_len;
2918         cm_node->pdata.addr = cm_node->pdata_buf;
2919
2920         memcpy(cm_node->pdata_buf, private_data, private_data_len);
2921
2922         cm_node->state = I40IW_CM_STATE_SYN_SENT;
2923         return cm_node;
2924 }
2925
2926 /**
2927  * i40iw_cm_reject - reject and teardown a connection
2928  * @cm_node: connection's node
2929  * @pdate: ptr to private data for reject
2930  * @plen: size of private data
2931  */
2932 static int i40iw_cm_reject(struct i40iw_cm_node *cm_node, const void *pdata, u8 plen)
2933 {
2934         int ret = 0;
2935         int err;
2936         int passive_state;
2937         struct iw_cm_id *cm_id = cm_node->cm_id;
2938         struct i40iw_cm_node *loopback = cm_node->loopbackpartner;
2939
2940         if (cm_node->tcp_cntxt.client)
2941                 return ret;
2942         i40iw_cleanup_retrans_entry(cm_node);
2943
2944         if (!loopback) {
2945                 passive_state = atomic_add_return(1, &cm_node->passive_state);
2946                 if (passive_state == I40IW_SEND_RESET_EVENT) {
2947                         cm_node->state = I40IW_CM_STATE_CLOSED;
2948                         i40iw_rem_ref_cm_node(cm_node);
2949                 } else {
2950                         if (cm_node->state == I40IW_CM_STATE_LISTENER_DESTROYED) {
2951                                 i40iw_rem_ref_cm_node(cm_node);
2952                         } else {
2953                                 ret = i40iw_send_mpa_reject(cm_node, pdata, plen);
2954                                 if (ret) {
2955                                         cm_node->state = I40IW_CM_STATE_CLOSED;
2956                                         err = i40iw_send_reset(cm_node);
2957                                         if (err)
2958                                                 i40iw_pr_err("send reset failed\n");
2959                                 } else {
2960                                         cm_id->add_ref(cm_id);
2961                                 }
2962                         }
2963                 }
2964         } else {
2965                 cm_node->cm_id = NULL;
2966                 if (cm_node->state == I40IW_CM_STATE_LISTENER_DESTROYED) {
2967                         i40iw_rem_ref_cm_node(cm_node);
2968                         i40iw_rem_ref_cm_node(loopback);
2969                 } else {
2970                         ret = i40iw_send_cm_event(loopback,
2971                                                   loopback->cm_id,
2972                                                   IW_CM_EVENT_CONNECT_REPLY,
2973                                                   -ECONNREFUSED);
2974                         i40iw_rem_ref_cm_node(cm_node);
2975                         loopback->state = I40IW_CM_STATE_CLOSING;
2976
2977                         cm_id = loopback->cm_id;
2978                         i40iw_rem_ref_cm_node(loopback);
2979                         cm_id->rem_ref(cm_id);
2980                 }
2981         }
2982
2983         return ret;
2984 }
2985
2986 /**
2987  * i40iw_cm_close - close of cm connection
2988  * @cm_node: connection's node
2989  */
2990 static int i40iw_cm_close(struct i40iw_cm_node *cm_node)
2991 {
2992         int ret = 0;
2993
2994         if (!cm_node)
2995                 return -EINVAL;
2996
2997         switch (cm_node->state) {
2998         case I40IW_CM_STATE_SYN_RCVD:
2999         case I40IW_CM_STATE_SYN_SENT:
3000         case I40IW_CM_STATE_ONE_SIDE_ESTABLISHED:
3001         case I40IW_CM_STATE_ESTABLISHED:
3002         case I40IW_CM_STATE_ACCEPTING:
3003         case I40IW_CM_STATE_MPAREQ_SENT:
3004         case I40IW_CM_STATE_MPAREQ_RCVD:
3005                 i40iw_cleanup_retrans_entry(cm_node);
3006                 i40iw_send_reset(cm_node);
3007                 break;
3008         case I40IW_CM_STATE_CLOSE_WAIT:
3009                 cm_node->state = I40IW_CM_STATE_LAST_ACK;
3010                 i40iw_send_fin(cm_node);
3011                 break;
3012         case I40IW_CM_STATE_FIN_WAIT1:
3013         case I40IW_CM_STATE_FIN_WAIT2:
3014         case I40IW_CM_STATE_LAST_ACK:
3015         case I40IW_CM_STATE_TIME_WAIT:
3016         case I40IW_CM_STATE_CLOSING:
3017                 ret = -1;
3018                 break;
3019         case I40IW_CM_STATE_LISTENING:
3020                 i40iw_cleanup_retrans_entry(cm_node);
3021                 i40iw_send_reset(cm_node);
3022                 break;
3023         case I40IW_CM_STATE_MPAREJ_RCVD:
3024         case I40IW_CM_STATE_UNKNOWN:
3025         case I40IW_CM_STATE_INITED:
3026         case I40IW_CM_STATE_CLOSED:
3027         case I40IW_CM_STATE_LISTENER_DESTROYED:
3028                 i40iw_rem_ref_cm_node(cm_node);
3029                 break;
3030         case I40IW_CM_STATE_OFFLOADED:
3031                 if (cm_node->send_entry)
3032                         i40iw_pr_err("send_entry\n");
3033                 i40iw_rem_ref_cm_node(cm_node);
3034                 break;
3035         }
3036         return ret;
3037 }
3038
3039 /**
3040  * i40iw_receive_ilq - recv an ETHERNET packet, and process it
3041  * through CM
3042  * @dev: FPK dev struct
3043  * @rbuf: receive buffer
3044  */
3045 void i40iw_receive_ilq(struct i40iw_sc_dev *dev, struct i40iw_puda_buf *rbuf)
3046 {
3047         struct i40iw_cm_node *cm_node;
3048         struct i40iw_cm_listener *listener;
3049         struct iphdr *iph;
3050         struct ipv6hdr *ip6h;
3051         struct tcphdr *tcph;
3052         struct i40iw_cm_info cm_info;
3053         struct i40iw_device *iwdev = (struct i40iw_device *)dev->back_dev;
3054         struct i40iw_cm_core *cm_core = &iwdev->cm_core;
3055         struct vlan_ethhdr *ethh;
3056         u16 vtag;
3057
3058         /* if vlan, then maclen = 18 else 14 */
3059         iph = (struct iphdr *)rbuf->iph;
3060         memset(&cm_info, 0, sizeof(cm_info));
3061
3062         i40iw_debug_buf(dev,
3063                         I40IW_DEBUG_ILQ,
3064                         "RECEIVE ILQ BUFFER",
3065                         rbuf->mem.va,
3066                         rbuf->totallen);
3067         ethh = (struct vlan_ethhdr *)rbuf->mem.va;
3068
3069         if (ethh->h_vlan_proto == htons(ETH_P_8021Q)) {
3070                 vtag = ntohs(ethh->h_vlan_TCI);
3071                 cm_info.user_pri = (vtag & VLAN_PRIO_MASK) >> VLAN_PRIO_SHIFT;
3072                 cm_info.vlan_id = vtag & VLAN_VID_MASK;
3073                 i40iw_debug(cm_core->dev,
3074                             I40IW_DEBUG_CM,
3075                             "%s vlan_id=%d\n",
3076                             __func__,
3077                             cm_info.vlan_id);
3078         } else {
3079                 cm_info.vlan_id = I40IW_NO_VLAN;
3080         }
3081         tcph = (struct tcphdr *)rbuf->tcph;
3082
3083         if (rbuf->ipv4) {
3084                 cm_info.loc_addr[0] = ntohl(iph->daddr);
3085                 cm_info.rem_addr[0] = ntohl(iph->saddr);
3086                 cm_info.ipv4 = true;
3087         } else {
3088                 ip6h = (struct ipv6hdr *)rbuf->iph;
3089                 i40iw_copy_ip_ntohl(cm_info.loc_addr,
3090                                     ip6h->daddr.in6_u.u6_addr32);
3091                 i40iw_copy_ip_ntohl(cm_info.rem_addr,
3092                                     ip6h->saddr.in6_u.u6_addr32);
3093                 cm_info.ipv4 = false;
3094         }
3095         cm_info.loc_port = ntohs(tcph->dest);
3096         cm_info.rem_port = ntohs(tcph->source);
3097         cm_node = i40iw_find_node(cm_core,
3098                                   cm_info.rem_port,
3099                                   cm_info.rem_addr,
3100                                   cm_info.loc_port,
3101                                   cm_info.loc_addr,
3102                                   true);
3103
3104         if (!cm_node) {
3105                 /* Only type of packet accepted are for */
3106                 /* the PASSIVE open (syn only) */
3107                 if (!tcph->syn || tcph->ack)
3108                         return;
3109                 listener =
3110                     i40iw_find_listener(cm_core,
3111                                         cm_info.loc_addr,
3112                                         cm_info.loc_port,
3113                                         cm_info.vlan_id,
3114                                         I40IW_CM_LISTENER_ACTIVE_STATE);
3115                 if (!listener) {
3116                         cm_info.cm_id = NULL;
3117                         i40iw_debug(cm_core->dev,
3118                                     I40IW_DEBUG_CM,
3119                                     "%s no listener found\n",
3120                                     __func__);
3121                         return;
3122                 }
3123                 cm_info.cm_id = listener->cm_id;
3124                 cm_node = i40iw_make_cm_node(cm_core, iwdev, &cm_info, listener);
3125                 if (!cm_node) {
3126                         i40iw_debug(cm_core->dev,
3127                                     I40IW_DEBUG_CM,
3128                                     "%s allocate node failed\n",
3129                                     __func__);
3130                         atomic_dec(&listener->ref_count);
3131                         return;
3132                 }
3133                 if (!tcph->rst && !tcph->fin) {
3134                         cm_node->state = I40IW_CM_STATE_LISTENING;
3135                 } else {
3136                         i40iw_rem_ref_cm_node(cm_node);
3137                         return;
3138                 }
3139                 atomic_inc(&cm_node->ref_count);
3140         } else if (cm_node->state == I40IW_CM_STATE_OFFLOADED) {
3141                 i40iw_rem_ref_cm_node(cm_node);
3142                 return;
3143         }
3144         i40iw_process_packet(cm_node, rbuf);
3145         i40iw_rem_ref_cm_node(cm_node);
3146 }
3147
3148 /**
3149  * i40iw_setup_cm_core - allocate a top level instance of a cm
3150  * core
3151  * @iwdev: iwarp device structure
3152  */
3153 void i40iw_setup_cm_core(struct i40iw_device *iwdev)
3154 {
3155         struct i40iw_cm_core *cm_core = &iwdev->cm_core;
3156
3157         cm_core->iwdev = iwdev;
3158         cm_core->dev = &iwdev->sc_dev;
3159
3160         INIT_LIST_HEAD(&cm_core->connected_nodes);
3161         INIT_LIST_HEAD(&cm_core->listen_nodes);
3162
3163         init_timer(&cm_core->tcp_timer);
3164         cm_core->tcp_timer.function = i40iw_cm_timer_tick;
3165         cm_core->tcp_timer.data = (unsigned long)cm_core;
3166
3167         spin_lock_init(&cm_core->ht_lock);
3168         spin_lock_init(&cm_core->listen_list_lock);
3169
3170         cm_core->event_wq = alloc_ordered_workqueue("iwewq",
3171                                                     WQ_MEM_RECLAIM);
3172
3173         cm_core->disconn_wq = alloc_ordered_workqueue("iwdwq",
3174                                                       WQ_MEM_RECLAIM);
3175 }
3176
3177 /**
3178  * i40iw_cleanup_cm_core - deallocate a top level instance of a
3179  * cm core
3180  * @cm_core: cm's core
3181  */
3182 void i40iw_cleanup_cm_core(struct i40iw_cm_core *cm_core)
3183 {
3184         unsigned long flags;
3185
3186         if (!cm_core)
3187                 return;
3188
3189         spin_lock_irqsave(&cm_core->ht_lock, flags);
3190         if (timer_pending(&cm_core->tcp_timer))
3191                 del_timer_sync(&cm_core->tcp_timer);
3192         spin_unlock_irqrestore(&cm_core->ht_lock, flags);
3193
3194         destroy_workqueue(cm_core->event_wq);
3195         destroy_workqueue(cm_core->disconn_wq);
3196 }
3197
3198 /**
3199  * i40iw_init_tcp_ctx - setup qp context
3200  * @cm_node: connection's node
3201  * @tcp_info: offload info for tcp
3202  * @iwqp: associate qp for the connection
3203  */
3204 static void i40iw_init_tcp_ctx(struct i40iw_cm_node *cm_node,
3205                                struct i40iw_tcp_offload_info *tcp_info,
3206                                struct i40iw_qp *iwqp)
3207 {
3208         tcp_info->ipv4 = cm_node->ipv4;
3209         tcp_info->drop_ooo_seg = true;
3210         tcp_info->wscale = true;
3211         tcp_info->ignore_tcp_opt = true;
3212         tcp_info->ignore_tcp_uns_opt = true;
3213         tcp_info->no_nagle = false;
3214
3215         tcp_info->ttl = I40IW_DEFAULT_TTL;
3216         tcp_info->rtt_var = cpu_to_le32(I40IW_DEFAULT_RTT_VAR);
3217         tcp_info->ss_thresh = cpu_to_le32(I40IW_DEFAULT_SS_THRESH);
3218         tcp_info->rexmit_thresh = I40IW_DEFAULT_REXMIT_THRESH;
3219
3220         tcp_info->tcp_state = I40IW_TCP_STATE_ESTABLISHED;
3221         tcp_info->snd_wscale = cm_node->tcp_cntxt.snd_wscale;
3222         tcp_info->rcv_wscale = cm_node->tcp_cntxt.rcv_wscale;
3223
3224         tcp_info->snd_nxt = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num);
3225         tcp_info->snd_wnd = cpu_to_le32(cm_node->tcp_cntxt.snd_wnd);
3226         tcp_info->rcv_nxt = cpu_to_le32(cm_node->tcp_cntxt.rcv_nxt);
3227         tcp_info->snd_max = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num);
3228
3229         tcp_info->snd_una = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num);
3230         tcp_info->cwnd = cpu_to_le32(2 * cm_node->tcp_cntxt.mss);
3231         tcp_info->snd_wl1 = cpu_to_le32(cm_node->tcp_cntxt.rcv_nxt);
3232         tcp_info->snd_wl2 = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num);
3233         tcp_info->max_snd_window = cpu_to_le32(cm_node->tcp_cntxt.max_snd_wnd);
3234         tcp_info->rcv_wnd = cpu_to_le32(cm_node->tcp_cntxt.rcv_wnd <<
3235                                         cm_node->tcp_cntxt.rcv_wscale);
3236
3237         tcp_info->flow_label = 0;
3238         tcp_info->snd_mss = cpu_to_le32(((u32)cm_node->tcp_cntxt.mss));
3239         if (cm_node->vlan_id < VLAN_TAG_PRESENT) {
3240                 tcp_info->insert_vlan_tag = true;
3241                 tcp_info->vlan_tag = cpu_to_le16(cm_node->vlan_id);
3242         }
3243         if (cm_node->ipv4) {
3244                 tcp_info->src_port = cpu_to_le16(cm_node->loc_port);
3245                 tcp_info->dst_port = cpu_to_le16(cm_node->rem_port);
3246
3247                 tcp_info->dest_ip_addr3 = cpu_to_le32(cm_node->rem_addr[0]);
3248                 tcp_info->local_ipaddr3 = cpu_to_le32(cm_node->loc_addr[0]);
3249                 tcp_info->arp_idx =
3250                         cpu_to_le16((u16)i40iw_arp_table(
3251                                                          iwqp->iwdev,
3252                                                          &tcp_info->dest_ip_addr3,
3253                                                          true,
3254                                                          NULL,
3255                                                          I40IW_ARP_RESOLVE));
3256         } else {
3257                 tcp_info->src_port = cpu_to_le16(cm_node->loc_port);
3258                 tcp_info->dst_port = cpu_to_le16(cm_node->rem_port);
3259                 tcp_info->dest_ip_addr0 = cpu_to_le32(cm_node->rem_addr[0]);
3260                 tcp_info->dest_ip_addr1 = cpu_to_le32(cm_node->rem_addr[1]);
3261                 tcp_info->dest_ip_addr2 = cpu_to_le32(cm_node->rem_addr[2]);
3262                 tcp_info->dest_ip_addr3 = cpu_to_le32(cm_node->rem_addr[3]);
3263                 tcp_info->local_ipaddr0 = cpu_to_le32(cm_node->loc_addr[0]);
3264                 tcp_info->local_ipaddr1 = cpu_to_le32(cm_node->loc_addr[1]);
3265                 tcp_info->local_ipaddr2 = cpu_to_le32(cm_node->loc_addr[2]);
3266                 tcp_info->local_ipaddr3 = cpu_to_le32(cm_node->loc_addr[3]);
3267                 tcp_info->arp_idx =
3268                         cpu_to_le16((u16)i40iw_arp_table(
3269                                                          iwqp->iwdev,
3270                                                          &tcp_info->dest_ip_addr0,
3271                                                          false,
3272                                                          NULL,
3273                                                          I40IW_ARP_RESOLVE));
3274         }
3275 }
3276
3277 /**
3278  * i40iw_cm_init_tsa_conn - setup qp for RTS
3279  * @iwqp: associate qp for the connection
3280  * @cm_node: connection's node
3281  */
3282 static void i40iw_cm_init_tsa_conn(struct i40iw_qp *iwqp,
3283                                    struct i40iw_cm_node *cm_node)
3284 {
3285         struct i40iw_tcp_offload_info tcp_info;
3286         struct i40iwarp_offload_info *iwarp_info;
3287         struct i40iw_qp_host_ctx_info *ctx_info;
3288         struct i40iw_device *iwdev = iwqp->iwdev;
3289         struct i40iw_sc_dev *dev = &iwqp->iwdev->sc_dev;
3290
3291         memset(&tcp_info, 0x00, sizeof(struct i40iw_tcp_offload_info));
3292         iwarp_info = &iwqp->iwarp_info;
3293         ctx_info = &iwqp->ctx_info;
3294
3295         ctx_info->tcp_info = &tcp_info;
3296         ctx_info->send_cq_num = iwqp->iwscq->sc_cq.cq_uk.cq_id;
3297         ctx_info->rcv_cq_num = iwqp->iwrcq->sc_cq.cq_uk.cq_id;
3298
3299         iwarp_info->ord_size = cm_node->ord_size;
3300         iwarp_info->ird_size = i40iw_derive_hw_ird_setting(cm_node->ird_size);
3301
3302         if (iwarp_info->ord_size == 1)
3303                 iwarp_info->ord_size = 2;
3304
3305         iwarp_info->rd_enable = true;
3306         iwarp_info->rdmap_ver = 1;
3307         iwarp_info->ddp_ver = 1;
3308
3309         iwarp_info->pd_id = iwqp->iwpd->sc_pd.pd_id;
3310
3311         ctx_info->tcp_info_valid = true;
3312         ctx_info->iwarp_info_valid = true;
3313         ctx_info->add_to_qoslist = true;
3314         ctx_info->user_pri = cm_node->user_pri;
3315
3316         i40iw_init_tcp_ctx(cm_node, &tcp_info, iwqp);
3317         if (cm_node->snd_mark_en) {
3318                 iwarp_info->snd_mark_en = true;
3319                 iwarp_info->snd_mark_offset = (tcp_info.snd_nxt &
3320                                 SNDMARKER_SEQNMASK) + cm_node->lsmm_size;
3321         }
3322
3323         cm_node->state = I40IW_CM_STATE_OFFLOADED;
3324         tcp_info.tcp_state = I40IW_TCP_STATE_ESTABLISHED;
3325         tcp_info.src_mac_addr_idx = iwdev->mac_ip_table_idx;
3326
3327         dev->iw_priv_qp_ops->qp_setctx(&iwqp->sc_qp, (u64 *)(iwqp->host_ctx.va), ctx_info);
3328
3329         /* once tcp_info is set, no need to do it again */
3330         ctx_info->tcp_info_valid = false;
3331         ctx_info->iwarp_info_valid = false;
3332         ctx_info->add_to_qoslist = false;
3333 }
3334
3335 /**
3336  * i40iw_cm_disconn - when a connection is being closed
3337  * @iwqp: associate qp for the connection
3338  */
3339 int i40iw_cm_disconn(struct i40iw_qp *iwqp)
3340 {
3341         struct disconn_work *work;
3342         struct i40iw_device *iwdev = iwqp->iwdev;
3343         struct i40iw_cm_core *cm_core = &iwdev->cm_core;
3344
3345         work = kzalloc(sizeof(*work), GFP_ATOMIC);
3346         if (!work)
3347                 return -ENOMEM; /* Timer will clean up */
3348
3349         i40iw_add_ref(&iwqp->ibqp);
3350         work->iwqp = iwqp;
3351         INIT_WORK(&work->work, i40iw_disconnect_worker);
3352         queue_work(cm_core->disconn_wq, &work->work);
3353         return 0;
3354 }
3355
3356 /**
3357  * i40iw_qp_disconnect - free qp and close cm
3358  * @iwqp: associate qp for the connection
3359  */
3360 static void i40iw_qp_disconnect(struct i40iw_qp *iwqp)
3361 {
3362         struct i40iw_device *iwdev;
3363         struct i40iw_ib_device *iwibdev;
3364
3365         iwdev = to_iwdev(iwqp->ibqp.device);
3366         if (!iwdev) {
3367                 i40iw_pr_err("iwdev == NULL\n");
3368                 return;
3369         }
3370
3371         iwibdev = iwdev->iwibdev;
3372
3373         if (iwqp->active_conn) {
3374                 /* indicate this connection is NOT active */
3375                 iwqp->active_conn = 0;
3376         } else {
3377                 /* Need to free the Last Streaming Mode Message */
3378                 if (iwqp->ietf_mem.va) {
3379                         if (iwqp->lsmm_mr)
3380                                 iwibdev->ibdev.dereg_mr(iwqp->lsmm_mr);
3381                         i40iw_free_dma_mem(iwdev->sc_dev.hw, &iwqp->ietf_mem);
3382                 }
3383         }
3384
3385         /* close the CM node down if it is still active */
3386         if (iwqp->cm_node) {
3387                 i40iw_debug(&iwdev->sc_dev, I40IW_DEBUG_CM, "%s Call close API\n", __func__);
3388                 i40iw_cm_close(iwqp->cm_node);
3389         }
3390 }
3391
3392 /**
3393  * i40iw_cm_disconn_true - called by worker thread to disconnect qp
3394  * @iwqp: associate qp for the connection
3395  */
3396 static void i40iw_cm_disconn_true(struct i40iw_qp *iwqp)
3397 {
3398         struct iw_cm_id *cm_id;
3399         struct i40iw_device *iwdev;
3400         struct i40iw_sc_qp *qp = &iwqp->sc_qp;
3401         u16 last_ae;
3402         u8 original_hw_tcp_state;
3403         u8 original_ibqp_state;
3404         int disconn_status = 0;
3405         int issue_disconn = 0;
3406         int issue_close = 0;
3407         int issue_flush = 0;
3408         struct ib_event ibevent;
3409         unsigned long flags;
3410         int ret;
3411
3412         if (!iwqp) {
3413                 i40iw_pr_err("iwqp == NULL\n");
3414                 return;
3415         }
3416
3417         spin_lock_irqsave(&iwqp->lock, flags);
3418         cm_id = iwqp->cm_id;
3419         /* make sure we havent already closed this connection */
3420         if (!cm_id) {
3421                 spin_unlock_irqrestore(&iwqp->lock, flags);
3422                 return;
3423         }
3424
3425         iwdev = to_iwdev(iwqp->ibqp.device);
3426
3427         original_hw_tcp_state = iwqp->hw_tcp_state;
3428         original_ibqp_state = iwqp->ibqp_state;
3429         last_ae = iwqp->last_aeq;
3430
3431         if (qp->term_flags) {
3432                 issue_disconn = 1;
3433                 issue_close = 1;
3434                 iwqp->cm_id = NULL;
3435                 /*When term timer expires after cm_timer, don't want
3436                  *terminate-handler to issue cm_disconn which can re-free
3437                  *a QP even after its refcnt=0.
3438                  */
3439                 del_timer(&iwqp->terminate_timer);
3440                 if (!iwqp->flush_issued) {
3441                         iwqp->flush_issued = 1;
3442                         issue_flush = 1;
3443                 }
3444         } else if ((original_hw_tcp_state == I40IW_TCP_STATE_CLOSE_WAIT) ||
3445                    ((original_ibqp_state == IB_QPS_RTS) &&
3446                     (last_ae == I40IW_AE_LLP_CONNECTION_RESET))) {
3447                 issue_disconn = 1;
3448                 if (last_ae == I40IW_AE_LLP_CONNECTION_RESET)
3449                         disconn_status = -ECONNRESET;
3450         }
3451
3452         if (((original_hw_tcp_state == I40IW_TCP_STATE_CLOSED) ||
3453              (original_hw_tcp_state == I40IW_TCP_STATE_TIME_WAIT) ||
3454              (last_ae == I40IW_AE_RDMAP_ROE_BAD_LLP_CLOSE) ||
3455              (last_ae == I40IW_AE_LLP_CONNECTION_RESET))) {
3456                 issue_close = 1;
3457                 iwqp->cm_id = NULL;
3458                 if (!iwqp->flush_issued) {
3459                         iwqp->flush_issued = 1;
3460                         issue_flush = 1;
3461                 }
3462         }
3463
3464         spin_unlock_irqrestore(&iwqp->lock, flags);
3465         if (issue_flush && !iwqp->destroyed) {
3466                 /* Flush the queues */
3467                 i40iw_flush_wqes(iwdev, iwqp);
3468
3469                 if (qp->term_flags) {
3470                         ibevent.device = iwqp->ibqp.device;
3471                         ibevent.event = (qp->eventtype == TERM_EVENT_QP_FATAL) ?
3472                                         IB_EVENT_QP_FATAL : IB_EVENT_QP_ACCESS_ERR;
3473                         ibevent.element.qp = &iwqp->ibqp;
3474                         iwqp->ibqp.event_handler(&ibevent, iwqp->ibqp.qp_context);
3475                 }
3476         }
3477
3478         if (cm_id && cm_id->event_handler) {
3479                 if (issue_disconn) {
3480                         ret = i40iw_send_cm_event(NULL,
3481                                                   cm_id,
3482                                                   IW_CM_EVENT_DISCONNECT,
3483                                                   disconn_status);
3484
3485                         if (ret)
3486                                 i40iw_debug(&iwdev->sc_dev,
3487                                             I40IW_DEBUG_CM,
3488                                             "disconnect event failed %s: - cm_id = %p\n",
3489                                             __func__, cm_id);
3490                 }
3491                 if (issue_close) {
3492                         i40iw_qp_disconnect(iwqp);
3493                         cm_id->provider_data = iwqp;
3494                         ret = i40iw_send_cm_event(NULL, cm_id, IW_CM_EVENT_CLOSE, 0);
3495                         if (ret)
3496                                 i40iw_debug(&iwdev->sc_dev,
3497                                             I40IW_DEBUG_CM,
3498                                             "close event failed %s: - cm_id = %p\n",
3499                                             __func__, cm_id);
3500                         cm_id->rem_ref(cm_id);
3501                 }
3502         }
3503 }
3504
3505 /**
3506  * i40iw_disconnect_worker - worker for connection close
3507  * @work: points or disconn structure
3508  */
3509 static void i40iw_disconnect_worker(struct work_struct *work)
3510 {
3511         struct disconn_work *dwork = container_of(work, struct disconn_work, work);
3512         struct i40iw_qp *iwqp = dwork->iwqp;
3513
3514         kfree(dwork);
3515         i40iw_cm_disconn_true(iwqp);
3516         i40iw_rem_ref(&iwqp->ibqp);
3517 }
3518
3519 /**
3520  * i40iw_accept - registered call for connection to be accepted
3521  * @cm_id: cm information for passive connection
3522  * @conn_param: accpet parameters
3523  */
3524 int i40iw_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
3525 {
3526         struct ib_qp *ibqp;
3527         struct i40iw_qp *iwqp;
3528         struct i40iw_device *iwdev;
3529         struct i40iw_sc_dev *dev;
3530         struct i40iw_cm_node *cm_node;
3531         struct ib_qp_attr attr;
3532         int passive_state;
3533         struct ib_mr *ibmr;
3534         struct i40iw_pd *iwpd;
3535         u16 buf_len = 0;
3536         struct i40iw_kmem_info accept;
3537         enum i40iw_status_code status;
3538         u64 tagged_offset;
3539
3540         memset(&attr, 0, sizeof(attr));
3541         ibqp = i40iw_get_qp(cm_id->device, conn_param->qpn);
3542         if (!ibqp)
3543                 return -EINVAL;
3544
3545         iwqp = to_iwqp(ibqp);
3546         iwdev = iwqp->iwdev;
3547         dev = &iwdev->sc_dev;
3548         cm_node = (struct i40iw_cm_node *)cm_id->provider_data;
3549
3550         if (((struct sockaddr_in *)&cm_id->local_addr)->sin_family == AF_INET) {
3551                 cm_node->ipv4 = true;
3552                 cm_node->vlan_id = i40iw_get_vlan_ipv4(cm_node->loc_addr);
3553         } else {
3554                 cm_node->ipv4 = false;
3555                 i40iw_netdev_vlan_ipv6(cm_node->loc_addr, &cm_node->vlan_id, NULL);
3556         }
3557         i40iw_debug(cm_node->dev,
3558                     I40IW_DEBUG_CM,
3559                     "Accept vlan_id=%d\n",
3560                     cm_node->vlan_id);
3561         if (cm_node->state == I40IW_CM_STATE_LISTENER_DESTROYED) {
3562                 if (cm_node->loopbackpartner)
3563                         i40iw_rem_ref_cm_node(cm_node->loopbackpartner);
3564                 i40iw_rem_ref_cm_node(cm_node);
3565                 return -EINVAL;
3566         }
3567
3568         passive_state = atomic_add_return(1, &cm_node->passive_state);
3569         if (passive_state == I40IW_SEND_RESET_EVENT) {
3570                 i40iw_rem_ref_cm_node(cm_node);
3571                 return -ECONNRESET;
3572         }
3573
3574         cm_node->cm_core->stats_accepts++;
3575         iwqp->cm_node = (void *)cm_node;
3576         cm_node->iwqp = iwqp;
3577
3578         buf_len = conn_param->private_data_len + I40IW_MAX_IETF_SIZE;
3579
3580         status = i40iw_allocate_dma_mem(dev->hw, &iwqp->ietf_mem, buf_len, 1);
3581
3582         if (status)
3583                 return -ENOMEM;
3584         cm_node->pdata.size = conn_param->private_data_len;
3585         accept.addr = iwqp->ietf_mem.va;
3586         accept.size = i40iw_cm_build_mpa_frame(cm_node, &accept, MPA_KEY_REPLY);
3587         memcpy(accept.addr + accept.size, conn_param->private_data,
3588                conn_param->private_data_len);
3589
3590         /* setup our first outgoing iWarp send WQE (the IETF frame response) */
3591         if ((cm_node->ipv4 &&
3592              !i40iw_ipv4_is_loopback(cm_node->loc_addr[0], cm_node->rem_addr[0])) ||
3593             (!cm_node->ipv4 &&
3594              !i40iw_ipv6_is_loopback(cm_node->loc_addr, cm_node->rem_addr))) {
3595                 iwpd = iwqp->iwpd;
3596                 tagged_offset = (uintptr_t)iwqp->ietf_mem.va;
3597                 ibmr = i40iw_reg_phys_mr(&iwpd->ibpd,
3598                                          iwqp->ietf_mem.pa,
3599                                          buf_len,
3600                                          IB_ACCESS_LOCAL_WRITE,
3601                                          &tagged_offset);
3602                 if (IS_ERR(ibmr)) {
3603                         i40iw_free_dma_mem(dev->hw, &iwqp->ietf_mem);
3604                         return -ENOMEM;
3605                 }
3606
3607                 ibmr->pd = &iwpd->ibpd;
3608                 ibmr->device = iwpd->ibpd.device;
3609                 iwqp->lsmm_mr = ibmr;
3610                 if (iwqp->page)
3611                         iwqp->sc_qp.qp_uk.sq_base = kmap(iwqp->page);
3612                 dev->iw_priv_qp_ops->qp_send_lsmm(&iwqp->sc_qp,
3613                                                         iwqp->ietf_mem.va,
3614                                                         (accept.size + conn_param->private_data_len),
3615                                                         ibmr->lkey);
3616
3617         } else {
3618                 if (iwqp->page)
3619                         iwqp->sc_qp.qp_uk.sq_base = kmap(iwqp->page);
3620                 dev->iw_priv_qp_ops->qp_send_lsmm(&iwqp->sc_qp, NULL, 0, 0);
3621         }
3622
3623         if (iwqp->page)
3624                 kunmap(iwqp->page);
3625
3626         iwqp->cm_id = cm_id;
3627         cm_node->cm_id = cm_id;
3628
3629         cm_id->provider_data = (void *)iwqp;
3630         iwqp->active_conn = 0;
3631
3632         cm_node->lsmm_size = accept.size + conn_param->private_data_len;
3633         i40iw_cm_init_tsa_conn(iwqp, cm_node);
3634         cm_id->add_ref(cm_id);
3635         i40iw_add_ref(&iwqp->ibqp);
3636
3637         i40iw_send_cm_event(cm_node, cm_id, IW_CM_EVENT_ESTABLISHED, 0);
3638
3639         attr.qp_state = IB_QPS_RTS;
3640         cm_node->qhash_set = false;
3641         i40iw_modify_qp(&iwqp->ibqp, &attr, IB_QP_STATE, NULL);
3642         if (cm_node->loopbackpartner) {
3643                 cm_node->loopbackpartner->pdata.size = conn_param->private_data_len;
3644
3645                 /* copy entire MPA frame to our cm_node's frame */
3646                 memcpy(cm_node->loopbackpartner->pdata_buf,
3647                        conn_param->private_data,
3648                        conn_param->private_data_len);
3649                 i40iw_create_event(cm_node->loopbackpartner, I40IW_CM_EVENT_CONNECTED);
3650         }
3651
3652         cm_node->accelerated = 1;
3653         if (cm_node->accept_pend) {
3654                 if (!cm_node->listener)
3655                         i40iw_pr_err("cm_node->listener NULL for passive node\n");
3656                 atomic_dec(&cm_node->listener->pend_accepts_cnt);
3657                 cm_node->accept_pend = 0;
3658         }
3659         return 0;
3660 }
3661
3662 /**
3663  * i40iw_reject - registered call for connection to be rejected
3664  * @cm_id: cm information for passive connection
3665  * @pdata: private data to be sent
3666  * @pdata_len: private data length
3667  */
3668 int i40iw_reject(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len)
3669 {
3670         struct i40iw_device *iwdev;
3671         struct i40iw_cm_node *cm_node;
3672         struct i40iw_cm_node *loopback;
3673
3674         cm_node = (struct i40iw_cm_node *)cm_id->provider_data;
3675         loopback = cm_node->loopbackpartner;
3676         cm_node->cm_id = cm_id;
3677         cm_node->pdata.size = pdata_len;
3678
3679         iwdev = to_iwdev(cm_id->device);
3680         if (!iwdev)
3681                 return -EINVAL;
3682         cm_node->cm_core->stats_rejects++;
3683
3684         if (pdata_len + sizeof(struct ietf_mpa_v2) > MAX_CM_BUFFER)
3685                 return -EINVAL;
3686
3687         if (loopback) {
3688                 memcpy(&loopback->pdata_buf, pdata, pdata_len);
3689                 loopback->pdata.size = pdata_len;
3690         }
3691
3692         return i40iw_cm_reject(cm_node, pdata, pdata_len);
3693 }
3694
3695 /**
3696  * i40iw_connect - registered call for connection to be established
3697  * @cm_id: cm information for passive connection
3698  * @conn_param: Information about the connection
3699  */
3700 int i40iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
3701 {
3702         struct ib_qp *ibqp;
3703         struct i40iw_qp *iwqp;
3704         struct i40iw_device *iwdev;
3705         struct i40iw_cm_node *cm_node;
3706         struct i40iw_cm_info cm_info;
3707         struct sockaddr_in *laddr;
3708         struct sockaddr_in *raddr;
3709         struct sockaddr_in6 *laddr6;
3710         struct sockaddr_in6 *raddr6;
3711         bool qhash_set = false;
3712         int apbvt_set = 0;
3713         enum i40iw_status_code status;
3714
3715         ibqp = i40iw_get_qp(cm_id->device, conn_param->qpn);
3716         if (!ibqp)
3717                 return -EINVAL;
3718         iwqp = to_iwqp(ibqp);
3719         if (!iwqp)
3720                 return -EINVAL;
3721         iwdev = to_iwdev(iwqp->ibqp.device);
3722         if (!iwdev)
3723                 return -EINVAL;
3724
3725         laddr = (struct sockaddr_in *)&cm_id->m_local_addr;
3726         raddr = (struct sockaddr_in *)&cm_id->m_remote_addr;
3727         laddr6 = (struct sockaddr_in6 *)&cm_id->m_local_addr;
3728         raddr6 = (struct sockaddr_in6 *)&cm_id->m_remote_addr;
3729
3730         if (!(laddr->sin_port) || !(raddr->sin_port))
3731                 return -EINVAL;
3732
3733         iwqp->active_conn = 1;
3734         iwqp->cm_id = NULL;
3735         cm_id->provider_data = iwqp;
3736
3737         /* set up the connection params for the node */
3738         if (cm_id->remote_addr.ss_family == AF_INET) {
3739                 cm_info.ipv4 = true;
3740                 memset(cm_info.loc_addr, 0, sizeof(cm_info.loc_addr));
3741                 memset(cm_info.rem_addr, 0, sizeof(cm_info.rem_addr));
3742                 cm_info.loc_addr[0] = ntohl(laddr->sin_addr.s_addr);
3743                 cm_info.rem_addr[0] = ntohl(raddr->sin_addr.s_addr);
3744                 cm_info.loc_port = ntohs(laddr->sin_port);
3745                 cm_info.rem_port = ntohs(raddr->sin_port);
3746                 cm_info.vlan_id = i40iw_get_vlan_ipv4(cm_info.loc_addr);
3747         } else {
3748                 cm_info.ipv4 = false;
3749                 i40iw_copy_ip_ntohl(cm_info.loc_addr,
3750                                     laddr6->sin6_addr.in6_u.u6_addr32);
3751                 i40iw_copy_ip_ntohl(cm_info.rem_addr,
3752                                     raddr6->sin6_addr.in6_u.u6_addr32);
3753                 cm_info.loc_port = ntohs(laddr6->sin6_port);
3754                 cm_info.rem_port = ntohs(raddr6->sin6_port);
3755                 i40iw_netdev_vlan_ipv6(cm_info.loc_addr, &cm_info.vlan_id, NULL);
3756         }
3757         cm_info.cm_id = cm_id;
3758         cm_info.user_pri = rt_tos2priority(cm_id->tos);
3759         i40iw_debug(&iwdev->sc_dev, I40IW_DEBUG_DCB, "%s TOS:[%d] UP:[%d]\n",
3760                     __func__, cm_id->tos, cm_info.user_pri);
3761         if ((cm_info.ipv4 && (laddr->sin_addr.s_addr != raddr->sin_addr.s_addr)) ||
3762             (!cm_info.ipv4 && memcmp(laddr6->sin6_addr.in6_u.u6_addr32,
3763                                      raddr6->sin6_addr.in6_u.u6_addr32,
3764                                      sizeof(laddr6->sin6_addr.in6_u.u6_addr32)))) {
3765                 status = i40iw_manage_qhash(iwdev,
3766                                             &cm_info,
3767                                             I40IW_QHASH_TYPE_TCP_ESTABLISHED,
3768                                             I40IW_QHASH_MANAGE_TYPE_ADD,
3769                                             NULL,
3770                                             true);
3771                 if (status)
3772                         return -EINVAL;
3773                 qhash_set = true;
3774         }
3775         status = i40iw_manage_apbvt(iwdev, cm_info.loc_port, I40IW_MANAGE_APBVT_ADD);
3776         if (status) {
3777                 i40iw_manage_qhash(iwdev,
3778                                    &cm_info,
3779                                    I40IW_QHASH_TYPE_TCP_ESTABLISHED,
3780                                    I40IW_QHASH_MANAGE_TYPE_DELETE,
3781                                    NULL,
3782                                    false);
3783                 return -EINVAL;
3784         }
3785
3786         apbvt_set = 1;
3787         cm_id->add_ref(cm_id);
3788         cm_node = i40iw_create_cm_node(&iwdev->cm_core, iwdev,
3789                                        conn_param->private_data_len,
3790                                        (void *)conn_param->private_data,
3791                                        &cm_info);
3792         if (!cm_node)
3793                 goto err;
3794
3795         i40iw_record_ird_ord(cm_node, (u16)conn_param->ird, (u16)conn_param->ord);
3796         if (cm_node->send_rdma0_op == SEND_RDMA_READ_ZERO &&
3797             !cm_node->ord_size)
3798                 cm_node->ord_size = 1;
3799
3800         cm_node->apbvt_set = apbvt_set;
3801         cm_node->qhash_set = qhash_set;
3802         iwqp->cm_node = cm_node;
3803         cm_node->iwqp = iwqp;
3804         iwqp->cm_id = cm_id;
3805         i40iw_add_ref(&iwqp->ibqp);
3806
3807         if (cm_node->state == I40IW_CM_STATE_SYN_SENT) {
3808                 if (i40iw_send_syn(cm_node, 0)) {
3809                         i40iw_rem_ref_cm_node(cm_node);
3810                         goto err;
3811                 }
3812         }
3813
3814         i40iw_debug(cm_node->dev,
3815                     I40IW_DEBUG_CM,
3816                     "Api - connect(): port=0x%04x, cm_node=%p, cm_id = %p.\n",
3817                     cm_node->rem_port,
3818                     cm_node,
3819                     cm_node->cm_id);
3820         return 0;
3821
3822 err:
3823         if (cm_node) {
3824                 if (cm_node->ipv4)
3825                         i40iw_debug(cm_node->dev,
3826                                     I40IW_DEBUG_CM,
3827                                     "Api - connect() FAILED: dest addr=%pI4",
3828                                     cm_node->rem_addr);
3829                 else
3830                         i40iw_debug(cm_node->dev, I40IW_DEBUG_CM,
3831                                     "Api - connect() FAILED: dest addr=%pI6",
3832                                     cm_node->rem_addr);
3833         }
3834         i40iw_manage_qhash(iwdev,
3835                            &cm_info,
3836                            I40IW_QHASH_TYPE_TCP_ESTABLISHED,
3837                            I40IW_QHASH_MANAGE_TYPE_DELETE,
3838                            NULL,
3839                            false);
3840
3841         if (apbvt_set && !i40iw_listen_port_in_use(&iwdev->cm_core,
3842                                                    cm_info.loc_port))
3843                 i40iw_manage_apbvt(iwdev,
3844                                    cm_info.loc_port,
3845                                    I40IW_MANAGE_APBVT_DEL);
3846         cm_id->rem_ref(cm_id);
3847         iwdev->cm_core.stats_connect_errs++;
3848         return -ENOMEM;
3849 }
3850
3851 /**
3852  * i40iw_create_listen - registered call creating listener
3853  * @cm_id: cm information for passive connection
3854  * @backlog: to max accept pending count
3855  */
3856 int i40iw_create_listen(struct iw_cm_id *cm_id, int backlog)
3857 {
3858         struct i40iw_device *iwdev;
3859         struct i40iw_cm_listener *cm_listen_node;
3860         struct i40iw_cm_info cm_info;
3861         enum i40iw_status_code ret;
3862         struct sockaddr_in *laddr;
3863         struct sockaddr_in6 *laddr6;
3864         bool wildcard = false;
3865
3866         iwdev = to_iwdev(cm_id->device);
3867         if (!iwdev)
3868                 return -EINVAL;
3869
3870         laddr = (struct sockaddr_in *)&cm_id->m_local_addr;
3871         laddr6 = (struct sockaddr_in6 *)&cm_id->m_local_addr;
3872         memset(&cm_info, 0, sizeof(cm_info));
3873         if (laddr->sin_family == AF_INET) {
3874                 cm_info.ipv4 = true;
3875                 cm_info.loc_addr[0] = ntohl(laddr->sin_addr.s_addr);
3876                 cm_info.loc_port = ntohs(laddr->sin_port);
3877
3878                 if (laddr->sin_addr.s_addr != INADDR_ANY)
3879                         cm_info.vlan_id = i40iw_get_vlan_ipv4(cm_info.loc_addr);
3880                 else
3881                         wildcard = true;
3882
3883         } else {
3884                 cm_info.ipv4 = false;
3885                 i40iw_copy_ip_ntohl(cm_info.loc_addr,
3886                                     laddr6->sin6_addr.in6_u.u6_addr32);
3887                 cm_info.loc_port = ntohs(laddr6->sin6_port);
3888                 if (ipv6_addr_type(&laddr6->sin6_addr) != IPV6_ADDR_ANY)
3889                         i40iw_netdev_vlan_ipv6(cm_info.loc_addr,
3890                                                &cm_info.vlan_id,
3891                                                NULL);
3892                 else
3893                         wildcard = true;
3894         }
3895         cm_info.backlog = backlog;
3896         cm_info.cm_id = cm_id;
3897
3898         cm_listen_node = i40iw_make_listen_node(&iwdev->cm_core, iwdev, &cm_info);
3899         if (!cm_listen_node) {
3900                 i40iw_pr_err("cm_listen_node == NULL\n");
3901                 return -ENOMEM;
3902         }
3903
3904         cm_id->provider_data = cm_listen_node;
3905
3906         cm_listen_node->user_pri = rt_tos2priority(cm_id->tos);
3907         cm_info.user_pri = cm_listen_node->user_pri;
3908         i40iw_debug(&iwdev->sc_dev, I40IW_DEBUG_DCB, "%s TOS:[%d] UP:[%d]\n",
3909                     __func__, cm_id->tos, cm_listen_node->user_pri);
3910
3911         if (!cm_listen_node->reused_node) {
3912                 if (wildcard) {
3913                         if (cm_info.ipv4)
3914                                 ret = i40iw_add_mqh_4(iwdev,
3915                                                       &cm_info,
3916                                                       cm_listen_node);
3917                         else
3918                                 ret = i40iw_add_mqh_6(iwdev,
3919                                                       &cm_info,
3920                                                       cm_listen_node);
3921                         if (ret)
3922                                 goto error;
3923
3924                         ret = i40iw_manage_apbvt(iwdev,
3925                                                  cm_info.loc_port,
3926                                                  I40IW_MANAGE_APBVT_ADD);
3927
3928                         if (ret)
3929                                 goto error;
3930                 } else {
3931                         ret = i40iw_manage_qhash(iwdev,
3932                                                  &cm_info,
3933                                                  I40IW_QHASH_TYPE_TCP_SYN,
3934                                                  I40IW_QHASH_MANAGE_TYPE_ADD,
3935                                                  NULL,
3936                                                  true);
3937                         if (ret)
3938                                 goto error;
3939                         cm_listen_node->qhash_set = true;
3940                         ret = i40iw_manage_apbvt(iwdev,
3941                                                  cm_info.loc_port,
3942                                                  I40IW_MANAGE_APBVT_ADD);
3943                         if (ret)
3944                                 goto error;
3945                 }
3946         }
3947         cm_id->add_ref(cm_id);
3948         cm_listen_node->cm_core->stats_listen_created++;
3949         return 0;
3950  error:
3951         i40iw_cm_del_listen(&iwdev->cm_core, (void *)cm_listen_node, false);
3952         return -EINVAL;
3953 }
3954
3955 /**
3956  * i40iw_destroy_listen - registered call to destroy listener
3957  * @cm_id: cm information for passive connection
3958  */
3959 int i40iw_destroy_listen(struct iw_cm_id *cm_id)
3960 {
3961         struct i40iw_device *iwdev;
3962
3963         iwdev = to_iwdev(cm_id->device);
3964         if (cm_id->provider_data)
3965                 i40iw_cm_del_listen(&iwdev->cm_core, cm_id->provider_data, true);
3966         else
3967                 i40iw_pr_err("cm_id->provider_data was NULL\n");
3968
3969         cm_id->rem_ref(cm_id);
3970
3971         return 0;
3972 }
3973
3974 /**
3975  * i40iw_cm_event_connected - handle connected active node
3976  * @event: the info for cm_node of connection
3977  */
3978 static void i40iw_cm_event_connected(struct i40iw_cm_event *event)
3979 {
3980         struct i40iw_qp *iwqp;
3981         struct i40iw_device *iwdev;
3982         struct i40iw_cm_node *cm_node;
3983         struct i40iw_sc_dev *dev;
3984         struct ib_qp_attr attr;
3985         struct iw_cm_id *cm_id;
3986         int status;
3987         bool read0;
3988
3989         cm_node = event->cm_node;
3990         cm_id = cm_node->cm_id;
3991         iwqp = (struct i40iw_qp *)cm_id->provider_data;
3992         iwdev = to_iwdev(iwqp->ibqp.device);
3993         dev = &iwdev->sc_dev;
3994
3995         if (iwqp->destroyed) {
3996                 status = -ETIMEDOUT;
3997                 goto error;
3998         }
3999         i40iw_cm_init_tsa_conn(iwqp, cm_node);
4000         read0 = (cm_node->send_rdma0_op == SEND_RDMA_READ_ZERO);
4001         if (iwqp->page)
4002                 iwqp->sc_qp.qp_uk.sq_base = kmap(iwqp->page);
4003         dev->iw_priv_qp_ops->qp_send_rtt(&iwqp->sc_qp, read0);
4004         if (iwqp->page)
4005                 kunmap(iwqp->page);
4006         status = i40iw_send_cm_event(cm_node, cm_id, IW_CM_EVENT_CONNECT_REPLY, 0);
4007         if (status)
4008                 i40iw_pr_err("send cm event\n");
4009
4010         memset(&attr, 0, sizeof(attr));
4011         attr.qp_state = IB_QPS_RTS;
4012         cm_node->qhash_set = false;
4013         i40iw_modify_qp(&iwqp->ibqp, &attr, IB_QP_STATE, NULL);
4014
4015         cm_node->accelerated = 1;
4016         if (cm_node->accept_pend) {
4017                 if (!cm_node->listener)
4018                         i40iw_pr_err("listener is null for passive node\n");
4019                 atomic_dec(&cm_node->listener->pend_accepts_cnt);
4020                 cm_node->accept_pend = 0;
4021         }
4022         return;
4023
4024 error:
4025         iwqp->cm_id = NULL;
4026         cm_id->provider_data = NULL;
4027         i40iw_send_cm_event(event->cm_node,
4028                             cm_id,
4029                             IW_CM_EVENT_CONNECT_REPLY,
4030                             status);
4031         cm_id->rem_ref(cm_id);
4032         i40iw_rem_ref_cm_node(event->cm_node);
4033 }
4034
4035 /**
4036  * i40iw_cm_event_reset - handle reset
4037  * @event: the info for cm_node of connection
4038  */
4039 static void i40iw_cm_event_reset(struct i40iw_cm_event *event)
4040 {
4041         struct i40iw_cm_node *cm_node = event->cm_node;
4042         struct iw_cm_id   *cm_id = cm_node->cm_id;
4043         struct i40iw_qp *iwqp;
4044
4045         if (!cm_id)
4046                 return;
4047
4048         iwqp = cm_id->provider_data;
4049         if (!iwqp)
4050                 return;
4051
4052         i40iw_debug(cm_node->dev,
4053                     I40IW_DEBUG_CM,
4054                     "reset event %p - cm_id = %p\n",
4055                      event->cm_node, cm_id);
4056         iwqp->cm_id = NULL;
4057
4058         i40iw_send_cm_event(cm_node, cm_node->cm_id, IW_CM_EVENT_DISCONNECT, -ECONNRESET);
4059         i40iw_send_cm_event(cm_node, cm_node->cm_id, IW_CM_EVENT_CLOSE, 0);
4060 }
4061
4062 /**
4063  * i40iw_cm_event_handler - worker thread callback to send event to cm upper layer
4064  * @work: pointer of cm event info.
4065  */
4066 static void i40iw_cm_event_handler(struct work_struct *work)
4067 {
4068         struct i40iw_cm_event *event = container_of(work,
4069                                                     struct i40iw_cm_event,
4070                                                     event_work);
4071         struct i40iw_cm_node *cm_node;
4072
4073         if (!event || !event->cm_node || !event->cm_node->cm_core)
4074                 return;
4075
4076         cm_node = event->cm_node;
4077
4078         switch (event->type) {
4079         case I40IW_CM_EVENT_MPA_REQ:
4080                 i40iw_send_cm_event(cm_node,
4081                                     cm_node->cm_id,
4082                                     IW_CM_EVENT_CONNECT_REQUEST,
4083                                     0);
4084                 break;
4085         case I40IW_CM_EVENT_RESET:
4086                 i40iw_cm_event_reset(event);
4087                 break;
4088         case I40IW_CM_EVENT_CONNECTED:
4089                 if (!event->cm_node->cm_id ||
4090                     (event->cm_node->state != I40IW_CM_STATE_OFFLOADED))
4091                         break;
4092                 i40iw_cm_event_connected(event);
4093                 break;
4094         case I40IW_CM_EVENT_MPA_REJECT:
4095                 if (!event->cm_node->cm_id ||
4096                     (cm_node->state == I40IW_CM_STATE_OFFLOADED))
4097                         break;
4098                 i40iw_send_cm_event(cm_node,
4099                                     cm_node->cm_id,
4100                                     IW_CM_EVENT_CONNECT_REPLY,
4101                                     -ECONNREFUSED);
4102                 break;
4103         case I40IW_CM_EVENT_ABORTED:
4104                 if (!event->cm_node->cm_id ||
4105                     (event->cm_node->state == I40IW_CM_STATE_OFFLOADED))
4106                         break;
4107                 i40iw_event_connect_error(event);
4108                 break;
4109         default:
4110                 i40iw_pr_err("event type = %d\n", event->type);
4111                 break;
4112         }
4113
4114         event->cm_info.cm_id->rem_ref(event->cm_info.cm_id);
4115         i40iw_rem_ref_cm_node(event->cm_node);
4116         kfree(event);
4117 }
4118
4119 /**
4120  * i40iw_cm_post_event - queue event request for worker thread
4121  * @event: cm node's info for up event call
4122  */
4123 static void i40iw_cm_post_event(struct i40iw_cm_event *event)
4124 {
4125         atomic_inc(&event->cm_node->ref_count);
4126         event->cm_info.cm_id->add_ref(event->cm_info.cm_id);
4127         INIT_WORK(&event->event_work, i40iw_cm_event_handler);
4128
4129         queue_work(event->cm_node->cm_core->event_wq, &event->event_work);
4130 }
4131
4132 /**
4133  * i40iw_cm_disconnect_all - disconnect all connected qp's
4134  * @iwdev: device pointer
4135  */
4136 void i40iw_cm_disconnect_all(struct i40iw_device *iwdev)
4137 {
4138         struct i40iw_cm_core *cm_core = &iwdev->cm_core;
4139         struct list_head *list_core_temp;
4140         struct list_head *list_node;
4141         struct i40iw_cm_node *cm_node;
4142         unsigned long flags;
4143         struct list_head connected_list;
4144         struct ib_qp_attr attr;
4145
4146         INIT_LIST_HEAD(&connected_list);
4147         spin_lock_irqsave(&cm_core->ht_lock, flags);
4148         list_for_each_safe(list_node, list_core_temp, &cm_core->connected_nodes) {
4149                 cm_node = container_of(list_node, struct i40iw_cm_node, list);
4150                 atomic_inc(&cm_node->ref_count);
4151                 list_add(&cm_node->connected_entry, &connected_list);
4152         }
4153         spin_unlock_irqrestore(&cm_core->ht_lock, flags);
4154
4155         list_for_each_safe(list_node, list_core_temp, &connected_list) {
4156                 cm_node = container_of(list_node, struct i40iw_cm_node, connected_entry);
4157                 attr.qp_state = IB_QPS_ERR;
4158                 i40iw_modify_qp(&cm_node->iwqp->ibqp, &attr, IB_QP_STATE, NULL);
4159                 i40iw_rem_ref_cm_node(cm_node);
4160         }
4161 }