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